<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Blog | Reactive]]></title><description><![CDATA[On-chain if-this-then-that for smart contracts]]></description><link>https://blog.reactive.network/</link><image><url>https://blog.reactive.network/favicon.png</url><title>Blog | Reactive</title><link>https://blog.reactive.network/</link></image><generator>Ghost 5.82</generator><lastBuildDate>Wed, 14 Oct 2026 14:56:24 GMT</lastBuildDate><atom:link href="https://blog.reactive.network/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Reactive Staking: Season 10]]></title><description><![CDATA[<p><a href="https://blog.reactive.network/reactive-staking-season-9/"><u>Reactive Staking Season 9</u></a> closes at block <strong>7,196,129</strong> on Wednesday, October 14th, and its one-month pool expires with it. <strong>Season 10</strong> picks up on the very next block with a two-week pool that runs until the Omni upgrade goes live on Reactive mainnet on October 28th. It is</p>]]></description><link>https://blog.reactive.network/reactive-staking-season-10/</link><guid isPermaLink="false">6ace48bf8916b70064d9a071</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Tue, 13 Oct 2026 15:17:26 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/10/staking-10.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/10/staking-10.jpg" alt="Reactive Staking: Season 10"><p><a href="https://blog.reactive.network/reactive-staking-season-9/"><u>Reactive Staking Season 9</u></a> closes at block <strong>7,196,129</strong> on Wednesday, October 14th, and its one-month pool expires with it. <strong>Season 10</strong> picks up on the very next block with a two-week pool that runs until the Omni upgrade goes live on Reactive mainnet on October 28th. It is the last staking season: after that, seasons give way to <strong>delegation</strong> and <strong>validation</strong>.</p><p><strong>Short version for newcomers:</strong> staking locks up REACT for a fixed period and pays you for helping secure the network. Each season is a fresh round with its own pools and reward budget.</p><p>Season 9 ran a single pool against a budget of <strong>1,000,000 REACT</strong>. By the close, it held <strong>104,764,620 REACT</strong> from <strong>200 </strong>unique stakers, with APY settling at <strong>12.31% </strong>.</p><h1 id="token-portal-guide">Token Portal Guide</h1><p></p><h2 id="stake">Stake</h2><p></p><ol><li>Open the <a href="https://portal.reactive.network/stake?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// STAKE</strong> tab is selected.</li><li>Pick the 2-week pool, the only option in Season 10.</li><li>Enter the amount of REACT you want to stake.</li><li>Hit <strong>Stake</strong> and confirm in your wallet.</li><li>Watch the current block and reward block tick along if you want to track the countdown.</li><li>Distribution stats sit below: total staked, total reward, current APY, your stake, your rewards.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/10/data-src-image-2019d60f-d895-4134-affa-5f11a8fdeaab.png" class="kg-image" alt="Reactive Staking: Season 10" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/10/data-src-image-2019d60f-d895-4134-affa-5f11a8fdeaab.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/10/data-src-image-2019d60f-d895-4134-affa-5f11a8fdeaab.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/10/data-src-image-2019d60f-d895-4134-affa-5f11a8fdeaab.png 1600w, https://blog.reactive.network/content/images/2026/10/data-src-image-2019d60f-d895-4134-affa-5f11a8fdeaab.png 2048w" sizes="(min-width: 720px) 720px"></figure><p><strong>Disclaimer:</strong> Staking locks your funds until the Reward Distribution Block. Unstaking is unavailable until then, so stake only what you can leave alone for the full month.</p><h2 id="restake-withdraw">Restake &amp; Withdraw</h2><p></p><ol><li>Open the <a href="https://portal.reactive.network/withdraw?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// WITHDRAW</strong> tab is selected.</li><li>Pick the season you took part in.</li><li>Choose the pool holding your tokens. Seasons before 4 ran 30-day, 60-day and 90-day pools; from Season 4 onward, pools are counted in months.</li><li>Pick the pool you want to restake into.</li><li>Hit <strong>Restake</strong> and confirm in your wallet.</li><li>The <strong>Withdraw All</strong> button takes everything back to your address.</li><li>Distribution stats sit below, same as on the stake tab.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/10/data-src-image-7c1b9a3e-2bb1-4371-b1e9-ac860dc1b778.png" class="kg-image" alt="Reactive Staking: Season 10" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/10/data-src-image-7c1b9a3e-2bb1-4371-b1e9-ac860dc1b778.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/10/data-src-image-7c1b9a3e-2bb1-4371-b1e9-ac860dc1b778.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/10/data-src-image-7c1b9a3e-2bb1-4371-b1e9-ac860dc1b778.png 1600w, https://blog.reactive.network/content/images/2026/10/data-src-image-7c1b9a3e-2bb1-4371-b1e9-ac860dc1b778.png 2048w" sizes="(min-width: 720px) 720px"></figure><p><strong>Disclaimer:</strong> A withdrawal sends your staked tokens back to your address and can&#x2019;t be cancelled or reversed. Rewards stop accruing the moment you withdraw.</p><h2 id="swap">Swap</h2><p></p><p>Token Portal&apos;s bridge moves REACT freely between Reactive Network Mainnet, Ethereum Mainnet and Base.</p><ol><li>Open the <a href="https://portal.reactive.network/swap?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// SWAP</strong> tab is selected.</li><li>Choose the network you&apos;re sending from.</li><li>Choose the network you&apos;re sending to.</li><li>Enter the REACT amount.</li><li>Hit <strong>Swap</strong> and confirm the transaction (requires wallet confirmation).</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/10/data-src-image-857ec8d6-3b92-4517-87cb-83dab2af2a51.png" class="kg-image" alt="Reactive Staking: Season 10" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/10/data-src-image-857ec8d6-3b92-4517-87cb-83dab2af2a51.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/10/data-src-image-857ec8d6-3b92-4517-87cb-83dab2af2a51.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/10/data-src-image-857ec8d6-3b92-4517-87cb-83dab2af2a51.png 1600w, https://blog.reactive.network/content/images/2026/10/data-src-image-857ec8d6-3b92-4517-87cb-83dab2af2a51.png 2048w" sizes="(min-width: 720px) 720px"></figure><h1 id="blocks-to-watch">Blocks to Watch</h1><p></p><p>Season 9 closes at block <strong>7,196,129</strong> on Wednesday,&#xA0; October 14th. Rewards aren&apos;t distributed automatically, so be sure to claim yours through the <a href="https://portal.reactive.network/withdraw?ref=blog.reactive.network"><u>Reactive Token Portal</u></a>.</p><p>Season 10 launches on the very next block, <strong>7,196,130</strong>, with a fresh <strong>500,000 REACT</strong> budget, and closes at block <strong>7,371,294 </strong>, on Wednesday, October 28th.</p><p></p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain execution. Reactive contracts subscribe to event logs across EVM chains and run Solidity logic automatically when a matching event fires, issuing cross-chain callback transactions once their conditions are met. The upcoming Omni fork moves the network to CometBFT consensus, bringing instant finality and roughly one-second blocks while keeping full EVM compatibility.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Reactive x Robinhood: Chain Integration]]></title><description><![CDATA[<p><strong>Reactive</strong> integrates with <strong>Robinhood Chain</strong>, an Ethereum Layer-2 built for tokenized real-world assets, as both an origin and a destination chain within Reactive Network. Stock Tokens and the DeFi built around them already trade around the clock. With Reactive, the logic that manages them can run around the clock too,</p>]]></description><link>https://blog.reactive.network/reactivexrobinhood/</link><guid isPermaLink="false">6a9e8d2927c19300640bb364</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Mon, 12 Oct 2026 14:58:11 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/09/reactive-robinhood.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/09/reactive-robinhood.jpg" alt="Reactive x Robinhood: Chain Integration"><p><strong>Reactive</strong> integrates with <strong>Robinhood Chain</strong>, an Ethereum Layer-2 built for tokenized real-world assets, as both an origin and a destination chain within Reactive Network. Stock Tokens and the DeFi built around them already trade around the clock. With Reactive, the logic that manages them can run around the clock too, responding to on-chain conditions on Robinhood and on every other chain the position touches.</p><h1 id="automation-gap-in-tokenized-markets">Automation Gap In Tokenized Markets</h1><p></p><p>Tokenized equities break an assumption most financial plumbing was built on: that markets close. A share of NVIDIA stops trading at 4pm Eastern. A token that tracks NVIDIA does not.</p><p>That mismatch shows up downstream. Spreads widen after hours. Price feeds update less often than the token trades. A weekend headline can move a stock token long before the underlying market can reprice. Anything built on these tokens, collateral, index products, lending vaults, has to keep working through windows when nobody is watching.</p><p>The usual answer is a bot, a cron job, and someone on call. That works until it doesn&apos;t, and it puts a server in the middle of something that should settle on-chain.</p><h1 id="robinhood-chain-in-detail">Robinhood Chain In Detail</h1><p></p><p>Robinhood Chain went live on July 1, 2026. It runs on the Arbitrum Orbit stack and posts data back to Ethereum, so it inherits Ethereum&apos;s settlement guarantees. Anyone can deploy to it without approval, and existing Solidity works as is.</p><p>Stock Tokens launched with the chain in 120+ countries. They track US equities and give holders economic exposure rather than share ownership. The important part for builders is that they are ordinary ERC-20s: they can be supplied as liquidity, borrowed against, or bundled into index products, all without waiting for the NYSE to open.</p><p>Uniswap came in as the main AMM on day one and now handles roughly 99% of tokenized-stock trading on the chain, with v4 holding about 73%. Cumulative volume in those stock tokens passed $1 billion by mid-August, peaking near $130 million a day.</p><h1 id="reactive-in-action">Reactive In Action</h1><p></p><p>Reactive contracts subscribe to event logs on origin chains, run Solidity in response, and decide on their own whether to send a callback to a destination chain. No relayer, no keeper, no off-chain trigger.</p><p><em>Short version for newcomers: a normal smart contract waits for someone to call it. A reactive contract watches for something to happen and calls something else.</em></p><p>That fills a gap the current tooling leaves open. A Uniswap v4 hook, the main way to program custom logic into a pool, only runs when somebody trades, so it can&#x2019;t act on a price move that arrives between trades. We have covered that limit from several angles in the previous articles: <a href="https://blog.reactive.network/maestro-keeping-a-pools-liquidity-at-the-live-price/"><u>Maestro</u></a>,<a href="https://blog.reactive.network/lambda-keeping-a-hedge-in-sync-across-chains/"> <u>Lambda</u></a>,<a href="https://blog.reactive.network/trancheshield-managing-a-pools-risk-from-another-chain/"> <u>TrancheShield</u></a>, and<a href="https://blog.reactive.network/veritas-keeping-a-risk-score-true-as-copies-appear/"> <u>Veritas</u></a>.&#xA0;</p><p>With Robinhood Chain on both sides of that relationship, the pool no longer has to wait for a trader to wake it up. An oracle update, a transfer, or an event on any other chain becomes the trigger, and the callback can land right back on Robinhood Chain.</p><h1 id="use-cases-liquidity-collateral-and-agents">Use Cases: Liquidity, Collateral, And Agents</h1><p></p><p><strong>Weekend feed gaps.</strong> Tokenized stocks keep trading after the equity market closes, while the price feed behind them updates less often. A reactive contract can tighten borrowing limits or pause a vault the moment the feed goes quiet, instead of at Monday&apos;s open.</p><p><strong>Repositioning between trades.</strong> Pool logic only runs when somebody trades, so a range can sit at a stale price for hours. A reactive contract watching the reference price moves or retires that range when the price moves and no trade arrives.</p><p><strong>Agent limits.</strong> Robinhood has positioned the chain as somewhere AI agents transact against tokenized assets. Exposure caps and cooldowns enforced by a reactive contract hold whether or not the agent is behaving.</p><p>Tokenized assets inherit the speed of crypto and the complexity of finance at once. Now we shall observe what happens when the settlement layer never sleeps but the reference market still does.</p><h1 id="developer-setup-guide">Developer Setup Guide</h1><p></p><p>Connect to Robinhood Chain mainnet manually with this network information:</p><ul><li>RPC URL &#x2014;<a href="https://rpc.mainnet.chain.robinhood.com/?ref=blog.reactive.network"> </a>https://rpc.mainnet.chain.robinhood.com</li><li>Chain ID &#x2014; 4663</li><li>Gas Token &#x2014; ETH</li><li>Block Explorer &#x2014;<a href="https://robinhoodchain.blockscout.com/?ref=blog.reactive.network"> <u>Robinhood Chain Blockscout</u></a></li></ul><p><a href="https://docs.robinhood.com/chain/connecting/?ref=blog.reactive.network"><u>More details on connecting to Robinhood</u></a>.</p><p>Testnet remains available for development, with faucet tokens that carry no value. For more details, see the<a href="https://docs.robinhood.com/chain?ref=blog.reactive.network"> <u>Robinhood Chain Docs</u></a>.</p><hr><h2 id="about-reactive-network">About Reactive Network</h2><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts &#x2014; event-driven smart contracts for cross-chain execution. It runs on CometBFT consensus, providing deterministic finality with roughly one-second block times while maintaining full EVM compatibility. Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, issuing cross-chain callback transactions when their conditions are met.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere! Now on Robinhood Chain.</strong></p>]]></content:encoded></item><item><title><![CDATA[Lasna Testnet Completes Migration to Omni Fork]]></title><description><![CDATA[<p>Migration is complete. Lasna is now running on the Omni fork.</p><h1 id="whats-different">What&apos;s Different</h1><p></p><p>The biggest change is that the <strong>RVM is gone</strong>. Reactive contracts now deploy once, to a single environment, as standard Solidity targeting version 0.8.29, and dual deployment is a thing of the past.</p>]]></description><link>https://blog.reactive.network/lasna-testnet-completes-migration-to-omni-fork/</link><guid isPermaLink="false">6ac636398916b70064d9a05f</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Wed, 07 Oct 2026 14:56:10 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/10/Wednesday.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/10/Wednesday.jpg" alt="Lasna Testnet Completes Migration to Omni Fork"><p>Migration is complete. Lasna is now running on the Omni fork.</p><h1 id="whats-different">What&apos;s Different</h1><p></p><p>The biggest change is that the <strong>RVM is gone</strong>. Reactive contracts now deploy once, to a single environment, as standard Solidity targeting version 0.8.29, and dual deployment is a thing of the past. <strong>Standard tooling </strong>works out of the box too: Hardhat, Foundry, and Remix all work without workarounds, and most of the custom RPC methods have been dropped.&#xA0;</p><p><strong>Subscriptions </strong>keep the same signature, and a new system contract now handles them. Old-style callbacks still work, and new contracts can <strong>call a system contract method</strong> instead of emitting a raw event. <strong>Existing deployments</strong> keep working as before, since we support legacy functionality. Callback delivery, destination revert handling, and the gas model are unchanged too.&#xA0;</p><h1 id="time-to-break-things">Time to Break Things</h1><p></p><p>This is the best moment to put Lasna through its paces. Deploy contracts, set up subscriptions, fire callbacks, and push the faster blocks. Testnet is where surprises are cheap, and what you find now might shape what reaches the mainnet.</p><h1 id="what%E2%80%99s-next">What&#x2019;s Next?</h1><p></p><p>As always, no promises can be made, however our current plans are to launch the full mainnet Omni-Fork by the end of the month, pending stress-testing of Lasna testnet. If plans change we&#x2019;ll keep you updated.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p>Reactive Network is an EVM automation layer built around reactive contracts &#x2014; event-driven smart contracts for cross-chain execution. It runs on CometBFT consensus, providing deterministic finality with roughly one-second block times while maintaining full EVM compatibility. Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, issuing cross-chain callback transactions when their conditions are met.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Lasna Testnet Pauses for Migration]]></title><description><![CDATA[<p>Heads up: Lasna goes offline for migration on Wednesday, October 7th, at 12:00 UTC.</p><h1 id="why-pause">Why Pause?</h1><p></p><p>Back on May 26th, we announced the launch of a new version of Lasna testnet, running on our new CometBFT-based architecture. Now, in preparation for our mainnet migration, the original Lasna testnet, which</p>]]></description><link>https://blog.reactive.network/lasna-testnet-pauses-for-migration/</link><guid isPermaLink="false">6ac393968916b70064d9a04e</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Mon, 05 Oct 2026 15:09:16 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/10/Monday.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/10/Monday.jpg" alt="Lasna Testnet Pauses for Migration"><p>Heads up: Lasna goes offline for migration on Wednesday, October 7th, at 12:00 UTC.</p><h1 id="why-pause">Why Pause?</h1><p></p><p>Back on May 26th, we announced the launch of a new version of Lasna testnet, running on our new CometBFT-based architecture. Now, in preparation for our mainnet migration, the original Lasna testnet, which was based on the legacy Geth and Prysm stack, is also moving to CometBFT.<br><br>This is the same upgrade we&apos;re preparing for mainnet, which brings <strong>instant finality</strong>: once a block is validated, it&apos;s permanent, with no reorgs on the Reactive side. <strong>Blocks also get faster</strong>, at roughly 1 second instead of about 7, and Reactive contracts become easier to deploy with the removal of RVMs, in line with standard Solidity contracts and bringing improved tooling with it.</p><p>Running the upgrade on Lasna first gives all of us a chance to shake it out before it reaches mainnet.</p><h1 id="before-wednesday">Before Wednesday</h1><p></p><p>While the migration runs, Lasna won&apos;t process transactions, subscriptions, or callbacks. Anything sent its way during that window won&apos;t land, so wrap up or pause any tests that depend on it. We expect up to three hours of downtime.</p><p>Reactive Mainnet won&#x2019;t be affected. We&apos;ll post again as soon as Lasna is back up, along with what&apos;s changed for your contracts and what&#x2019;s next to come.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts &#x2014; event-driven smart contracts for cross-chain execution. It runs on CometBFT consensus, providing deterministic finality with roughly one-second block times while maintaining full EVM compatibility. Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, issuing cross-chain callback transactions when their conditions are met.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Finality Wars: Counting Validator Counts Wrong]]></title><description><![CDATA[<p>On August 12th, Solana came within four and a half percentage points of losing the ability to finalize blocks, and almost nobody noticed. The network kept producing blocks and processing transactions the entire time, the status page recorded nothing unusual, and for roughly half an hour the margin between business</p>]]></description><link>https://blog.reactive.network/finality-wars-counting-validators-counts-wrong/</link><guid isPermaLink="false">6aad11472022ac0063714dbb</guid><category><![CDATA[Fundamentals]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Fri, 18 Sep 2026 13:17:43 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/09/main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/09/main.jpg" alt="Finality Wars: Counting Validator Counts Wrong"><p>On August 12th, Solana came within four and a half percentage points of losing the ability to finalize blocks, and almost nobody noticed. The network kept producing blocks and processing transactions the entire time, the status page recorded nothing unusual, and for roughly half an hour the margin between business as usual and a network-wide stall was thinner than it has been in a long while.</p><p>It&apos;s curious that none of the consensus software misbehaved. The code responsible for deciding which blocks the network agrees on did exactly what it was designed to do, all the way through. The problem was that a hosting company sent out a misconfigured network route.</p><p>In <a href="https://blog.reactive.network/finality-wars-why-reactive-network-is-building-with-cometbft/"><u>Finality Wars: Why Reactive Network is building with CometBFT</u></a> we argued that fast finality is hard for Ethereum because Ethereum has over a million validators, and squeezing a million votes through the network every few seconds is a physical bottleneck that no amount of protocol elegance can talk its way around. We still think that is right. But August 12th points at something the validator-count framing quietly misses, and on reflection we think it may be the more important number.</p><h2 id="short-version-for-newcomers">Short Version For Newcomers</h2><p></p><p><strong>Validators</strong> are the independent machines that run a proof-of-stake network, Solana and Ethereum included. Each one&apos;s say in decisions is weighted not by machine count but by how much of the network&apos;s token is <strong>staked</strong> behind it, so a hundred small validators can matter less than one large one.</p><p><strong>Finality</strong> is the point at which a block is permanently settled and can&#x2019;t be undone. Reaching it requires validators holding more than two thirds of the stake to vote for the block. Turn that rule around and you get its shadow: if more than a third of the stake stops answering, whoever is left can no longer clear the two-thirds bar, and the chain stops declaring anything final at all.</p><p>That behaviour is a design decision rather than a flaw. Refusing to finalize is the safe way to fail, whereas the dangerous way is to declare a block settled and then have it reversed afterwards, which is roughly how exchanges get tricked and bridges get drained. A chain that stalls has decided it would rather say nothing than say something it might have to take back.</p><p>Which makes one third of the stake a line worth watching. In August, Solana walked right up to it.</p><h1 id="four-points-from-stopping">Four Points From Stopping&#xA0;</h1><p></p><p>For Solana that line sits at 33.34% of stake.<a href="https://marinade.finance/?ref=blog.reactive.network"> <u>Marinade Finance</u></a>, which published a detailed reconstruction of the incident, reported that the fault pushed 28.83% offline, leaving a margin of 4.51 percentage points, or roughly 19.9 million SOL.</p><p>The cause was thoroughly unglamorous. Routers across the internet spend their time telling each other which paths traffic should take, and one hosting provider sent out a malformed announcement that spread through its own network. Equipment at a dozen of its sites across Europe and Asia accepted the broken path in preference to the working one, leaving those sites with no usable route to the rest of the internet while the same provider&apos;s North American locations carried on unaffected. Connectivity returned after around 33 minutes.</p><p>Throughout all of it, 597 of the network&apos;s 699 staked validators kept voting. That figure is the one we want to dwell on.</p><h1 id="headcount-versus-stake">Headcount Versus Stake</h1><p></p><p>Count the validators that went offline and you get one number. Count the stake behind them and you get almost double. Stake is the number consensus actually measures.</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-1ba0cad3-742b-4a19-a8e3-626972469570.png" class="kg-image" alt="Finality Wars: Counting Validator Counts Wrong" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-1ba0cad3-742b-4a19-a8e3-626972469570.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-1ba0cad3-742b-4a19-a8e3-626972469570.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-1ba0cad3-742b-4a19-a8e3-626972469570.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-1ba0cad3-742b-4a19-a8e3-626972469570.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>Both figures are accurate, and the distance between them is not a rounding error. It is the difference between how decentralized a network looks on a dashboard and how it behaves when a router misfires somewhere in Amsterdam. Marinade reported that 27.34% of all network stake sat behind a single network operator, and that 94% of that stake went dark simultaneously.</p><p>So for the duration of the fault, the question that mattered was never &quot;<em>how many validators does Solana have?</em>&quot; It was &quot;<em>how many things here can fail independently of one another?</em>&quot; and the answer to the second question turned out to be a great deal smaller than the answer to the first.</p><p>None of this is a mark against Solana in particular. Validators pick hosting for latency and cost like everyone else, providers and jurisdictions cluster together for perfectly good engineering reasons, and we are not aware of any chain that is genuinely immune to this. Solana&apos;s own response has been unusually open about what happened and why. What the incident gives us is the cleanest real-world demonstration we have seen of a gap that most discussion of consensus papers over entirely.</p><h1 id="wrong-denominator">Wrong Denominator</h1><p></p><p>Here is where we have to complicate our own argument.</p><p>In <a href="https://blog.reactive.network/finality-wars-why-reactive-network-is-building-with-cometbft/"><u>Finality Wars: Why Reactive Network is building with CometBFT</u></a> we treated validator count as the thing that buys a network its decentralization and costs it its speed. Ethereum has over a million validators and pays for them in the delay it takes to bundle all those votes together, while chains built on CometBFT, the consensus engine we run, operate with somewhere between 50 and 175 and finalize in a second or two. More validators, more decentralization, slower finality.&#xA0;</p><p>August 12th suggests that count measures participation rather than independence. A validator set is a list of signing keys, whereas a failure domain is a building, a router, a network operator, a jurisdiction. The first number is published everywhere and quoted in every comparison, while the second is rarely measured at all and is the one that decides whether a chain keeps finalizing when something breaks. A million validators spread across three cloud providers is not a million failure domains, it is closer to three. Whether that beats a hundred validators across sixty providers is genuinely open, and not a question you settle by comparing counts.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-cd4f9f34-cfc0-4c33-9ad0-3eb8ca9bc023.png" class="kg-image" alt="Finality Wars: Counting Validator Counts Wrong" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-cd4f9f34-cfc0-4c33-9ad0-3eb8ca9bc023.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-cd4f9f34-cfc0-4c33-9ad0-3eb8ca9bc023.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-cd4f9f34-cfc0-4c33-9ad0-3eb8ca9bc023.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-cd4f9f34-cfc0-4c33-9ad0-3eb8ca9bc023.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>The implication cuts awkwardly toward compact validator sets, which is where we live. Small sets are obviously more concentrated and we have never pretended otherwise, but their concentration is at least legible: with a hundred validators you can enumerate the hosting and count the operators in an afternoon. With a million, nobody can hold that picture in their head, and the reassuring size of the number actively discourages anyone from trying. Which is the more honest position to be in, visible concentration or concentration hidden behind a big number?</p><h1 id="same-threshold-different-bets">Same Threshold, Different Bets</h1><p></p><p>Three ecosystems are answering the same question right now in three different ways.</p><p><strong>Solana is raising the tolerance.</strong> Its largest consensus overhaul since launch rebuilds how the network orders blocks and collects votes on them, targeting finality of around 150 milliseconds against today&apos;s roughly 12.8 seconds. Mainnet activation is scheduled to begin on September 28th, 2026, though two official sources give different timings, so the precise day is best treated as provisional. Asked about the August incident, one of the network&apos;s co-founders said the new design should keep finalizing with up to 40% of stake offline rather than a third. That was a remark on social media rather than a specification, but the direction of travel is unmistakable: the upgrade widens the very margin that a routing fault came close to consuming.</p><p><strong>Ethereum is rehearsing the failure.</strong> Its <a href="https://blog.reactive.network/glamsterdam-gives-ethereum-a-second-gas-meter/"><u>next major upgrade</u></a> has been running since August 20th on <a href="https://blog.ethereum.org/2026/08/17/plataberget-testnet?ref=blog.reactive.network"><u>a test network built for it</u></a>, and the plan is to stand up a second one designed specifically to simulate what happens when consensus struggles, before the code reaches the public testnets everyone uses. Deliberately building somewhere to practise not finalizing is a quietly impressive piece of engineering culture, and it follows from a design that would rather let finality lag behind than stop the chain.<br></p><p><strong>CometBFT accepts the halt.</strong> There is no third option and no graceful degradation: once more than a third of the voting power is offline, block production stops. We wrote in June that this is the opposite call from Ethereum&apos;s, and it is. What August 12th adds is that the threshold is not an abstraction in a paper, but a real line that a real network walked up to this year, for reasons that had nothing whatsoever to do with consensus.</p><h1 id="three-ways-to-stop">Three Ways to Stop</h1><p></p><p>Which brings us to our own exposure, because it would be a bit rich to write all this and not turn the lens around. Reactive Network will soon run on CometBFT, and we&#x2019;ve chosen it with our eyes open. <a href="https://blog.reactive.network/how-cometbft-consensus-works-and-what-it-means-for-reactive/"><u>Reactive finality</u></a> is permanent the moment a block is validated, with no reorganizations, no probabilistic waiting and roughly one second of latency. The bill for that is precisely the one-third line Solana brushed against in August.&#xA0;</p><p>We also have more than one surface on which things can stop, and this is the part that rarely shows up in discussions of finality:&#xA0;</p><ol><li><strong>Reactive finality</strong> depends on our own validator set staying above the two-thirds mark. Below it, we stop finalizing.</li><li><strong>Origin finality</strong> depends on chains we do not control. Our sequencer treats an event it has observed on an origin chain as canonical even if that chain later reorganizes, which is a deliberate choice and the thing that makes reactive contracts responsive, but it does mean another network&apos;s liveness becomes partly our concern.</li><li><strong>Callback delivery</strong> depends on destination chains being available to accept a transaction, since a callback that cannot land is a callback that has not happened.</li></ol><p>Any one of the three can stop without the other two noticing, and a user watching a cross-chain workflow stall has no way of telling which it was and little reason to care. This is the same borrowed-certainty problem we wrote about in&#xA0; <a href="https://blog.reactive.network/intents-solvers-and-borrowed-certainty/"><u>Intents, Solvers, and Borrowed Certainty</u></a>, approached from the opposite side: solvers absorb origin-chain reorganization risk on behalf of users, and we absorb it on behalf of contracts.</p><p>What August 12th changes for us is not the architecture but the measurement. Counting our validators tells us remarkably little about whether all three of those surfaces could fail at the same moment, and neither we nor anybody else routinely publishes the number that would.</p><h1 id="question-pointed-back">Question Pointed Back</h1><p></p><p>The obvious response to an article like this is to ask the author how concentrated their own infrastructure is, and that is a fair question to ask us. Sequencer decentralization sits in a later phase of our roadmap, which means today the honest answer involves a shorter list of failure domains than we would like. Saying so is not a confession. It is the thing we are arguing everyone should be able to say precisely, including about themselves.</p><p>What would it take for chains to publish failure-domain counts next to validator counts? Not a standard, not a committee, just the habit of treating &quot;how many separate things can break?&quot; as a number worth knowing. Marinade produced it for Solana in a few hours because an incident forced the question. It would be better to have it before.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain execution. Reactive contracts subscribe to event logs across EVM chains and run Solidity logic automatically when a matching event fires, issuing cross-chain callback transactions once their conditions are met. The upcoming Omni fork moves the network to CometBFT consensus, bringing instant finality and roughly one-second blocks while keeping full EVM compatibility.</p><p><strong>Build once, react everywhere!</strong></p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p>]]></content:encoded></item><item><title><![CDATA[Reactive Staking: Season 9]]></title><description><![CDATA[<p><strong>Reactive Staking Season 8</strong> closes at block <strong>6,816,896</strong> on Sunday, September 13th, and its one-month pool expires with it. <strong>Season 9</strong> picks up on the very next block, so stakers can roll straight into the next round with no gap in between.</p><p>The new round keeps the shape</p>]]></description><link>https://blog.reactive.network/reactive-staking-season-9/</link><guid isPermaLink="false">6aa3df0427c19300640bb375</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:23:08 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/09/staking-9-main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/09/staking-9-main.jpg" alt="Reactive Staking: Season 9"><p><strong>Reactive Staking Season 8</strong> closes at block <strong>6,816,896</strong> on Sunday, September 13th, and its one-month pool expires with it. <strong>Season 9</strong> picks up on the very next block, so stakers can roll straight into the next round with no gap in between.</p><p>The new round keeps the shape recent seasons settled into: one pool, one month, one reward budget. In the background, the new Reactive consensus is in final testing ahead of the move to Reactive Omni. Once that lands, the staking structure may change with it.</p><p><strong>Short version for newcomers:</strong> staking locks up REACT for a fixed period and pays you for helping secure the network. Each season is a fresh round with its own pools and reward budget.</p><p>Season 8 ran a single pool against a budget of <strong>1,000,000 REACT</strong>. By the close, it held <strong>108,308,917.99&#xA0; REACT </strong>from<strong> 194 stakers</strong>, with APY settling at <strong>11.88%</strong>.</p><h1 id="token-portal-guide">Token Portal Guide</h1><p></p><h2 id="stake">Stake</h2><p></p><ol><li>Open the <a href="https://portal.reactive.network/stake?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// STAKE</strong> tab is selected.</li><li>Pick the 1-month pool, the only option in Season 9.</li><li>Enter the amount of REACT you want to stake.</li><li>Hit <strong>Stake</strong> and confirm in your wallet.</li><li>Watch the current block and reward block tick along if you want to track the countdown.</li><li>Distribution stats sit below: total staked, total reward, current APY, your stake, your rewards.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-bc761504-a5ce-4635-bfeb-916b6cc210a9.png" class="kg-image" alt="Reactive Staking: Season 9" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-bc761504-a5ce-4635-bfeb-916b6cc210a9.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-bc761504-a5ce-4635-bfeb-916b6cc210a9.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-bc761504-a5ce-4635-bfeb-916b6cc210a9.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-bc761504-a5ce-4635-bfeb-916b6cc210a9.png 2048w" sizes="(min-width: 720px) 720px"></figure><p><strong>Disclaimer: </strong>Staking locks your funds until the Reward Distribution Block. Unstaking is unavailable until then, so stake only what you can leave alone for the full month.&#xA0;</p><h2 id="restake-withdraw">Restake &amp; Withdraw</h2><p></p><ol><li>Open the <a href="https://portal.reactive.network/withdraw?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// WITHDRAW</strong> tab is selected.</li><li>Pick the season you took part in.</li><li>Choose the pool holding your tokens. Seasons before 4 ran 30-day, 60-day and 90-day pools; from Season 4 onward, pools are counted in months.</li><li>Pick the pool you want to restake into.</li><li>Hit <strong>Restake</strong> and confirm in your wallet.</li><li>The <strong>Withdraw All</strong> button takes everything back to your address.&#xA0;</li><li>Distribution stats sit below, same as on the stake tab.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-7ed8eb41-08de-498b-bac8-7eec30594929.png" class="kg-image" alt="Reactive Staking: Season 9" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-7ed8eb41-08de-498b-bac8-7eec30594929.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-7ed8eb41-08de-498b-bac8-7eec30594929.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-7ed8eb41-08de-498b-bac8-7eec30594929.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-7ed8eb41-08de-498b-bac8-7eec30594929.png 2048w" sizes="(min-width: 720px) 720px"></figure><p><strong>Disclaimer: </strong>A withdrawal sends your staked tokens back to your address and can&#x2019;t be cancelled or reversed. Rewards stop accruing the moment you withdraw.&#xA0;</p><h2 id="swap">Swap</h2><p></p><p>Token Portal&apos;s bridge moves REACT freely between Reactive Network Mainnet, Ethereum Mainnet and Base.</p><ol><li>Open the <a href="https://portal.reactive.network/swap?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Make sure the <strong>// SWAP</strong> tab is selected.</li><li>Choose the network you&apos;re sending from.</li><li>Choose the network you&apos;re sending to.</li><li>Enter the REACT amount.</li><li>Hit <strong>Swap</strong> and confirm the transaction (requires wallet confirmation).</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-a17f06a0-76bc-422e-ab61-785c87878974.png" class="kg-image" alt="Reactive Staking: Season 9" loading="lazy" width="2000" height="1353" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-a17f06a0-76bc-422e-ab61-785c87878974.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-a17f06a0-76bc-422e-ab61-785c87878974.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-a17f06a0-76bc-422e-ab61-785c87878974.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-a17f06a0-76bc-422e-ab61-785c87878974.png 2048w" sizes="(min-width: 720px) 720px"></figure><h1 id="blocks-to-watch">Blocks to Watch</h1><p></p><p>Season 8 closes at block <strong>6,816,896</strong> on Sunday,&#xA0; September 13th. Rewards aren&apos;t distributed automatically, so be sure to claim yours through the <a href="https://portal.reactive.network/withdraw?ref=blog.reactive.network"><u>Reactive Token Portal</u></a>.</p><p>Season 9 launches on the very next block, <strong>6,816,897</strong>, with a fresh <strong>1,000,000 REACT </strong>budget, and closes at block <strong>7,196,129</strong>, on Wednesday, October 14th.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain execution. Reactive contracts subscribe to event logs across EVM chains and run Solidity logic automatically when a matching event fires, issuing cross-chain callback transactions once their conditions are met. The upcoming Omni fork moves the network to CometBFT consensus, bringing instant finality and roughly one-second blocks while keeping full EVM compatibility.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Intents, Solvers, and Borrowed Certainty]]></title><description><![CDATA[<p>A wallet that wanted to support five bridges used to integrate five SDKs. Five fee oracles, five sets of error codes, five ideas about what &quot;the transfer went through&quot; means. Multiply that by every wallet and every app, and you get the state of cross-chain UX for most</p>]]></description><link>https://blog.reactive.network/intents-solvers-and-borrowed-certainty/</link><guid isPermaLink="false">6a99388527c19300640bb34e</guid><category><![CDATA[Fundamentals]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Thu, 03 Sep 2026 13:00:37 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/09/intents-main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/09/intents-main.jpg" alt="Intents, Solvers, and Borrowed Certainty"><p>A wallet that wanted to support five bridges used to integrate five SDKs. Five fee oracles, five sets of error codes, five ideas about what &quot;the transfer went through&quot; means. Multiply that by every wallet and every app, and you get the state of cross-chain UX for most of the last five years: enormous duplicated effort spent on plumbing nobody wanted to think about.</p><p>Intents were the fix, and <a href="https://eips.ethereum.org/EIPS/eip-7683?ref=blog.reactive.network"><u>ERC-7683</u></a> is the standard that grew out of them. It is worth understanding what it did and did not solve, because the part it deliberately left alone is the part that decides whether your money arrives.</p><h2 id="short-version-for-newcomers"><strong>Short Version For Newcomers</strong></h2><p></p><p>An <strong>intent</strong> is a signed statement of what you want rather than how to get it. &quot;I have 10,000 USDC on Arbitrum, I want USDC on Base, expire in five minutes&quot;. You sign that sentence. You do not pick a bridge, a route, or a relayer.</p><p>A <strong>solver</strong> is whoever reads that statement and makes it true. Solvers are off-chain actors, usually market makers running bots, who deliver the assets on the destination chain out of their own inventory and then claim payment from the origin chain. Competition between them is what gets you a good price.</p><p>The important structural detail: the solver fronts the capital and gets paid afterwards. Every risk that used to sit with the user, waiting to see whether a bridge delivered, now sits with the solver. That relocation is what makes the UX feel instant, and it is also where all the interesting problems went.</p><h1 id="five-bridges-five-integrations">Five Bridges, Five Integrations</h1><p></p><p>The fragmentation was never only a wallet problem. It hit solvers harder.</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-3e0065e9-94a6-4fbb-bc89-c60b37178208.png" class="kg-image" alt="Intents, Solvers, and Borrowed Certainty" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-3e0065e9-94a6-4fbb-bc89-c60b37178208.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-3e0065e9-94a6-4fbb-bc89-c60b37178208.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-3e0065e9-94a6-4fbb-bc89-c60b37178208.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-3e0065e9-94a6-4fbb-bc89-c60b37178208.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>The standard&apos;s motivation section is blunt about the cost. Every solver has to integrate separately with each protocol&apos;s payload format, execution flow and payment semantics, and new protocols then struggle to attract competitive execution, because no existing solver can serve them without engineering work first.</p><p>So you get a market that looks competitive from the outside and is actually a set of walled gardens, each with its own small set of solvers, each quoting worse prices than it would if it could aggregate demand across all of them.</p><h1 id="standardizing-consumption-not-settlement">Standardizing Consumption, Not Settlement</h1><p></p><p>ERC-7683 is still marked Draft, so what follows is where the specification stands rather than a description of any one deployment.</p><p>A protocol keeps its own order encoding, whatever that is, and publishes a <strong>resolver</strong> contract on-chain. A solver calls `resolve` on that resolver off-chain, through `eth_call`, and gets back a general-purpose description of the order: a list of steps to execute, variables it gets to choose (where it wants to be paid, on which chain), the payments it will receive, and a list of named <strong>assumptions</strong> the resolver can&#x2019;t verify on its own.</p><p>Resolution happens off-chain, so the translation is not constrained by gas costs. A resolver can do rich, complicated decoding work that would be unaffordable inside a transaction.</p><p>The resolver is explicitly the point of trust. Solvers whitelist resolver addresses they have vetted through audits and time, and once vetted, they follow its instructions without needing to understand the protocol behind it. The standard&apos;s phrase for the goal is programmable solvers: add support for a new protocol by reviewing its resolver, not by writing an integration.</p><h1 id="whose-finality-are-you-trusting">Whose Finality Are You Trusting</h1><p></p><p>How does the origin chain learn that a fill happened on the destination chain? ERC-7683 does not say. Across uses an optimistic oracle. UniswapX uses off-chain attestations. You could use a validity proof. The standard is agnostic, which means the trust assumption behind any given transfer belongs to the settlement contract and the messaging layer underneath it, not to the standard. Two transfers can be equally ERC-7683-compliant and have nothing in common in terms of what could go wrong.</p><p>The security considerations are refreshingly direct about where that lands.</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/09/data-src-image-29f5898a-01e7-4884-8517-a28d956d686a.png" class="kg-image" alt="Intents, Solvers, and Borrowed Certainty" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/09/data-src-image-29f5898a-01e7-4884-8517-a28d956d686a.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/09/data-src-image-29f5898a-01e7-4884-8517-a28d956d686a.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/09/data-src-image-29f5898a-01e7-4884-8517-a28d956d686a.png 1600w, https://blog.reactive.network/content/images/2026/09/data-src-image-29f5898a-01e7-4884-8517-a28d956d686a.png 2000w" sizes="(min-width: 720px) 720px"></figure><p></p><p>Notice where the window starts. Not when the order appears, but when the solver spends its own money on the strength of it. The solver looks at an event on the origin chain, decides it is real, and delivers on the destination chain. If the origin chain reorgs that event away, the solver has handed over goods against a payment instruction that no longer exists. Nobody at the standards layer can fix this, because it is not a formatting problem. It is a question about which chain&apos;s version of history you are willing to act on before that history is settled.&#xA0;</p><p>The standard handles it the only honest way available: it makes the assumption explicit. Conditions a resolver cannot verify get surfaced as named assumptions that the solver must validate before filling. Payments carry an `estimatedDelaySeconds` field, so the expected wait until money is actually spendable is part of the order rather than folklore. That does not remove the risk. It writes it down, which is a real improvement over five SDKs with five undocumented opinions.</p><h1 id="same-trade-made-once">Same Trade, Made Once</h1><p></p><p>Reactive contracts react to events on other chains, which means our sequencer faces the solver&apos;s question on every single event it observes: act now on something that looks true, or wait for the origin chain to be certain. Our answer is a distinction we call origin finality. An event observed on an origin chain is treated as canonical for the purpose of triggering reactive logic, even if that origin chain later reorganises and unwinds it. That is a deliberate trade, made once at the protocol level and documented, rather than left to each application to rediscover.</p><p>A solver makes the same bet per order, priced into its spread and managed by its own risk model. We make it once, in the open, as a property of the network. Neither approach is obviously right.</p><p>The vocabulary is converging too. ERC-7683 gives solvers a way to read origin-chain logs, returning each one as a struct of emitter, topics, data, block number, transaction hash and log index. Anyone who has written a reactive contract will recognise that shape immediately, because it is nearly our own log record. When two designs converge on the same data structure without coordinating, it is usually because the underlying problem has only one sensible decomposition. Which raises the question worth sitting with: if everyone building across chains eventually needs a name for &quot;true enough to act on&quot;, should that be a per-protocol choice, or the next thing somebody tries to standardize?</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts &#x2014; event-driven smart contracts for cross-chain execution. It runs on CometBFT consensus, providing deterministic finality with roughly one-second block times while maintaining full EVM compatibility. Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, issuing cross-chain callback transactions when their conditions are met.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Glamsterdam Gives Ethereum a Second Gas Meter]]></title><description><![CDATA[<p>For as long as Ethereum has existed, sending ETH from one address to another has cost 21,000 gas. It is one of the very few numbers that survived every fork, every roadmap rewrite, and every philosophical argument the ecosystem has had since 2015. Wallets hardcode it. Fee estimators assume</p>]]></description><link>https://blog.reactive.network/glamsterdam-gives-ethereum-a-second-gas-meter/</link><guid isPermaLink="false">6a9050e927c19300640bb33b</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Thu, 27 Aug 2026 15:10:32 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/Glamsterdam-main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/Glamsterdam-main.jpg" alt="Glamsterdam Gives Ethereum a Second Gas Meter"><p>For as long as Ethereum has existed, sending ETH from one address to another has cost 21,000 gas. It is one of the very few numbers that survived every fork, every roadmap rewrite, and every philosophical argument the ecosystem has had since 2015. Wallets hardcode it. Fee estimators assume it. &quot;Send max&quot; buttons are built on it.</p><p><a href="https://blog.ethereum.org/2026/08/17/plataberget-testnet?ref=blog.reactive.network"><u>Glamsterdam</u></a>, Ethereum&apos;s next major upgrade, puts an asterisk on it. And the Ethereum Foundation has been unusually blunt about what that means: any tool that relies on a hardcapped maximum gas limit will break and needs updating. That is worth understanding even if you never touch Ethereum L1 directly, because the reasoning behind the change tells you something about where every high-throughput chain is heading.</p><h2 id="short-version-for-newcomers"><strong>Short Version For Newcomers</strong></h2><p></p><p><strong>Gas</strong> is Ethereum&apos;s unit for &quot;how much work did this transaction cause&quot;. Every operation has a price tag in gas, you pay for the total, and each block has a gas limit that caps how much work fits inside it. Think of it as a metered utility bill.</p><p><strong>State</strong> is the chain&apos;s permanent memory: every account balance, every deployed contract, every storage slot. The important thing about state is that it does not go away. A transaction takes a second to execute and then it&apos;s done, but the state it creates has to be stored by every node, forever, including nodes that sync ten years from now.</p><p>Ethereum has always priced those two things with one number. Glamsterdam splits them apart.</p><h1 id="paying-for-permanence">Paying For Permanence</h1><p></p><p>The change lives in <a href="https://eips.ethereum.org/EIPS/eip-8037?ref=blog.reactive.network"><u>EIP-8037</u></a>, and it comes down to one split: operations that create new permanent state get charged to a separate meter called <strong>state gas</strong>, while everything else stays on the familiar meter, now called <strong>execution gas</strong>.</p><p>Every new state byte gets a fixed price, `CPSB` (cost per state byte), currently set at 1,530 gas. Multiply that by how many bytes an operation actually writes to disk and you get its state-gas charge. A fresh account is 120 bytes on disk, so creating one costs 183,600. A storage slot, the 32-byte box that contracts use to remember things between transactions, takes 64 bytes once you count its key, so filling a fresh one costs 97,920. Slots are the most common way applications create permanent state, which is why that second number matters more than it looks.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-4fe0f09e-257d-4d4f-8af3-1a49759379be.png" class="kg-image" alt="Glamsterdam Gives Ethereum a Second Gas Meter" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-4fe0f09e-257d-4d4f-8af3-1a49759379be.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/08/data-src-image-4fe0f09e-257d-4d4f-8af3-1a49759379be.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/08/data-src-image-4fe0f09e-257d-4d4f-8af3-1a49759379be.png 1600w, https://blog.reactive.network/content/images/2026/08/data-src-image-4fe0f09e-257d-4d4f-8af3-1a49759379be.png 2048w" sizes="(min-width: 720px) 720px"></figure><p>And the headline case: sending ETH to an address that already exists still costs 21,000, but sending it to an address that has never appeared on-chain adds that 183,600 charge at runtime. Roughly 204,600 total, close to ten times the number your wallet has been quietly assuming for a decade.</p><p>This is a correction as much as an increase. Deploying bytecode currently costs about 200 gas per byte of new state, while filling a storage slot costs about 313. Same disk, same permanence, different price, purely for historical reasons. EIP-8037 picks one number and applies it everywhere.</p><h1 id="bigger-blocks-bigger-database">Bigger Blocks, Bigger Database&#xA0;</h1><p></p><p>The motivation is not revenue. Ethereum wants bigger blocks, and bigger blocks fill up the database faster.</p><p>Every full node keeps its own copy of the state, and Ethereum&apos;s security rests on ordinary people being able to run one on ordinary hardware. Once that database outgrows a consumer drive, running a node becomes a data-centre job, and the property that makes the chain worth trusting quietly erodes.</p><p>Today it sits around 390 GiB, most of a typical laptop SSD. When Ethereum last doubled block capacity, raising the gas limit from 30 million to 60 million, daily new state more than tripled, from roughly 105 MiB to 326 MiB. People did not simply use the extra room, they used it disproportionately for things that leave permanent data behind. Project that onto the 200 million gas limit Ethereum is aiming for and the EIP arrives at roughly 387 GiB per year, which crosses the 650 GiB mark where nodes noticeably slow down in under a year.</p><p>There is the trap: raise the limit in order to scale, and you price ordinary people out of running a node, which defeats the point of scaling. So the authors worked backwards. Decide how much state growth is tolerable, in this case 120 GiB per year, work out how much state a year of blocks could produce, and divide one by the other. Out falls 1,530 gas per byte, the number behind every figure in the table above.</p><h1 id="two-counters-one-block">Two Counters, One Block</h1><p></p><p>A block used to have one counter. Now it has two, one per dimension, and the block&apos;s reported `gas_used` is whichever counter is higher.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-7ea58c4e-5159-4489-87ee-4209040167f2.png" class="kg-image" alt="Glamsterdam Gives Ethereum a Second Gas Meter" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-7ea58c4e-5159-4489-87ee-4209040167f2.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/08/data-src-image-7ea58c4e-5159-4489-87ee-4209040167f2.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/08/data-src-image-7ea58c4e-5159-4489-87ee-4209040167f2.png 1600w, https://blog.reactive.network/content/images/2026/08/data-src-image-7ea58c4e-5159-4489-87ee-4209040167f2.png 2048w" sizes="(min-width: 720px) 720px"></figure><p>Two things follow from that. A block can be declared full while most of its execution capacity sits unused, as in the storage-heavy case above. And whichever dimension turns out to be the bottleneck is what drives the base fee, the price per unit of gas that everyone competing for that block has to pay.</p><p>Transactions get the same treatment. A transaction still carries one gas limit, but the protocol splits it into a normal budget and a reserve for state charges, which drain the reserve first and fall back to the budget once it runs dry. The useful consequence is that Ethereum&apos;s per-transaction gas cap now applies to execution gas only. Without that carve-out the new prices would have capped deployable contracts at around 7.4 KiB; instead Glamsterdam raises the contract size limit from 24 KiB to 64 KiB.</p><h1 id="what-actually-breaks">What Actually Breaks</h1><p></p><p>If you maintain anything that touches Ethereum transactions, here is the checklist. Everyone else can skip to the last two sections without missing the argument.</p><ul><li><strong>Anything hardcoding 21,000.</strong> Especially &quot;send max&quot; flows, which subtract an assumed fee from the balance. Send to a fresh address and the real cost is ten times that, so the transaction fails.</li><li><strong>Single-dimension gas estimation.</strong> `eth_estimateGas` has to return a limit covering both dimensions. One-number models will underprice anything that writes new state.</li><li><strong>Hardcoded maximum gas limits.</strong> Indexers and validators that reject blocks above a fixed ceiling will choke as the limit climbs.</li><li><strong>Metering with `gasleft()` deltas.</strong> The `GAS` opcode reports the normal budget only, so a before-and-after difference misses state gas entirely. ERC-4337 bundlers work exactly this way.</li><li><strong>Pre-signed deployment transactions.</strong> The deterministic deployer factories were signed with fixed limits, often 100,000, which no longer cover the cost. Existing chains are fine, but new networks starting from genesis need them regenerated.</li><li><strong>Contracts that write storage for users.</strong> Creating a struct, minting to a new holder, initialising a mapping entry: all new state, all now ~5&#xD7; more.</li></ul><h1 id="about-that-200-million">About That 200 Million</h1><p></p><p>The other number in the headlines is the 200M gas limit floor, up from roughly 60M today, and it is worth being precise about what that is. The fork does not set the gas limit. Validators do, through gas-vote signaling, and they will only step it up as nodes prove they can handle bigger blocks without falling behind on propagation. 200M is the design target the repricing unblocks, not a switch that flips on fork day. Expect a climb, not a jump.</p><p>Mainnet timing remains unconfirmed. Q4 2026 is the window most of the ecosystem is working toward, but the Foundation has consistently declined to name a date, and the honest read is that Sepolia and Hoodi activation are the signals to watch. EIP-8037 is also still in Review, so 1,530 is the current parameter rather than a promise.</p><h1 id="reactive-callbacks-on-ethereum">Reactive Callbacks On Ethereum&#xA0;</h1><p></p><p>Reactive Network is its own chain with its own gas model, so none of this changes how reactive contracts are metered. What it changes is the far end of the pipe. When one of our callbacks lands on Ethereum it executes as an ordinary Ethereum transaction under Ethereum&apos;s rules, with a gas limit the developer chose when requesting it, usually set once as a constant and then forgotten about. That is exactly the kind of assumption this upgrade is designed to expose.</p><p>So if you run a reactive contract with an Ethereum destination, ask whether your callback ever writes state that did not exist before: minting to a first-time recipient, initialising a slot, deploying through a factory. If it does, the `CALLBACK_GAS_LIMIT` that worked comfortably last year may not cover it after Glamsterdam, and a callback that runs out of gas is a callback that does not do its job.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p>Reactive Network is an EVM automation layer built around reactive contracts &#x2014; event-driven smart contracts for cross-chain execution. It runs on CometBFT consensus, providing deterministic finality with roughly one-second block times while maintaining full EVM compatibility. Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, issuing cross-chain callback transactions when their conditions are met.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Veritas: Keeping A Risk Score True As Copies Appear]]></title><description><![CDATA[<p>Veritas was the sixth and last of the projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it puts a reactive contract to a use none of the others needed: keeping a stored number true after the thing it measures has quietly changed. The full project lives<a href="https://github.com/scientivan/Veritas?ref=blog.reactive.network"> <u>on GitHub</u></a>, though</p>]]></description><link>https://blog.reactive.network/veritas-keeping-a-risk-score-true-as-copies-appear/</link><guid isPermaLink="false">6a8d8c6e27c19300640bb31e</guid><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Tue, 25 Aug 2026 13:06:23 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/main-2.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/main-2.jpg" alt="Veritas: Keeping A Risk Score True As Copies Appear"><p>Veritas was the sixth and last of the projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it puts a reactive contract to a use none of the others needed: keeping a stored number true after the thing it measures has quietly changed. The full project lives<a href="https://github.com/scientivan/Veritas?ref=blog.reactive.network"> <u>on GitHub</u></a>, though the repository is private, so you may need to request access from the owner. The project&apos;s website is<a href="https://veritas-drs.vercel.app/?ref=blog.reactive.network"> <u>here</u></a>.&#xA0;</p><p>Veritas is a Uniswap v4 hook for pools of tokenized content, a photo or some other piece of media that someone has registered on-chain and opened a pool around. It prices a risk that ordinary pools ignore. As copies and near-duplicates of that content spread, the original loses the scarcity its value rests on, and the liquidity providers in its pool (the people who deposit the two tokens so others can trade between them) are the ones left holding that loss. Veritas attaches a risk score to each asset and feeds it into the pool&apos;s swap fee, so a riskier asset charges more and its providers are paid more to hold it. The interesting part, and the reason Reactive is involved, is when that risk actually changes.</p><h1 id="a-risk-that-arrives-from-somewhere-else">A risk that arrives from somewhere else</h1><p></p><p>To an ordinary automated market maker, a pool holding a one-of-a-kind photo looks exactly like a pool holding one of ten thousand identical copies. It can&#x2019;t see scarcity, so it can&#x2019;t price the loss that comes when scarcity fades. As duplicates multiply, the content&apos;s price drifts, and providers eat the difference as impermanent loss, the gap that opens up for a liquidity provider when the price moves and they end up worse off than if they had simply held the two tokens. Veritas measures how diluted a piece of content is and folds that into a single risk score, which the pool&apos;s fee then tracks.</p><p>Here is the part a hook can&#x2019;t handle on its own. A piece of content&apos;s dilution does not change because of anything that content or its pool does. It changes when someone, somewhere else, registers a near-duplicate. Attest an original photo today (register it on-chain along with a fingerprint of the image) and its duplicate count is zero. Next week a near-copy of it gets attested, and the original is suddenly less unique than it was, through no event of its own. Nothing in its pool has traded, so its hook has not run, and no one has any reason to send a transaction that goes back and updates the original&apos;s record. The number that is supposed to stand for its risk is now quietly wrong.</p><h1 id="what-the-reactive-contract-watches">What the reactive contract watches</h1><p></p><p>Every new piece of content is recorded in a contract on Unichain, the registry, which emits a `NewAttestation` event when it happens. Veritas&apos;s reactive contract, `DilutionMonitorRC`, lives on Reactive&apos;s Lasna testnet and subscribes to that event, every one of them, because any new attestation might turn out to be a duplicate of something already on file.</p><p></p><pre><code class="language-solidity">// Watch every NewAttestation the registry emits on the origin chain.
service.subscribe(
&#xA0;&#xA0;&#xA0;&#xA0;originChainId, originRegistry, NEW_ATTESTATION_TOPIC_0,
&#xA0;&#xA0;&#xA0;&#xA0;REACTIVE_IGNORE, REACTIVE_IGNORE, REACTIVE_IGNORE
);</code></pre><p>Where the earlier projects in this series subscribed to events about a single pool, this one subscribes to the arrival of new content across the whole registry, because that is where the risk to the existing assets comes from.</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-3a846e09-10f9-4817-ab99-1b62fcb75bff.png" class="kg-image" alt="Veritas: Keeping A Risk Score True As Copies Appear" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-3a846e09-10f9-4817-ab99-1b62fcb75bff.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/08/data-src-image-3a846e09-10f9-4817-ab99-1b62fcb75bff.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/08/data-src-image-3a846e09-10f9-4817-ab99-1b62fcb75bff.png 1600w, https://blog.reactive.network/content/images/2026/08/data-src-image-3a846e09-10f9-4817-ab99-1b62fcb75bff.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>The score the diagram calls DRS is the pool&apos;s dilution risk score: a single number between 0 and 1 for how exposed a piece of content is to being copied, and the value the pool&apos;s fee tracks. The on-chain duplicate count is one of its inputs, so the more near-duplicates a piece of content picks up, the higher its count, the higher its DRS, and the more its pool charges to compensate the providers. Keeping that count current as new duplicates appear is the whole purpose of the loop: the registry emits an attestation event, the reactive contract on Lasna hears it and forwards the new attestation&apos;s id, and a callback back on Unichain finds the existing near-duplicates and raises their counts.</p><h1 id="from-a-new-attestation-to-a-repriced-pool">From a new attestation to a repriced pool</h1><p></p><p>When an attestation arrives, `react()` runs, and it does something deliberately small: it forwards the new attestation&apos;s id to a callback on the other chain, and nothing more. It does not go hunting for duplicates itself. A reactive contract runs in a constrained environment that can&#x2019;t cheaply read the destination chain&apos;s stored fingerprints, so the comparison is left to the side that can do it well.</p><p></p><pre><code class="language-solidity">function react(LogRecord calldata log) external vmOnly {
&#xA0;&#xA0;&#xA0;&#xA0;bytes32 attestationId = bytes32(log.topic_2); &#xA0; // the new attestation&apos;s id

&#xA0;&#xA0;&#xA0;&#xA0;// Hand the id to the callback on the destination chain; let it run the search.
&#xA0;&#xA0;&#xA0;&#xA0;emit Callback(destinationChainId, callbackReceiver, CALLBACK_GAS_LIMIT,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;abi.encodeWithSignature(&quot;onDilution(address,bytes32)&quot;, address(0), attestationId));
}</code></pre><p></p><p>On the destination the callback does the real work. It reads the new content&apos;s fingerprint, asks the registry for everything already on file that looks close enough to count as a near-duplicate, and raises the dilution count on each of those existing records.</p><p></p><pre><code class="language-solidity">function onDilution(address /* rvmId */, bytes32 triggerAttestationId) external authorizedSenderOnly {

&#xA0;&#xA0;&#xA0;&#xA0;// read the new content&apos;s fingerprint, then find the near-duplicates already on-chain...
&#xA0;&#xA0;&#xA0;&#xA0;AttestationRecord memory rec = registry.getRecord(triggerAttestationId);
&#xA0;&#xA0;&#xA0;&#xA0;bytes32[] memory affected =
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;registry.getNearDuplicates(rec.pHashFingerprint, rec.blockhashFingerprint, HAMMING_TAU);

&#xA0;&#xA0;&#xA0;&#xA0;// ...and raise each affected asset&apos;s dilution count.
&#xA0;&#xA0;&#xA0;&#xA0;for (uint256 i = 0; i &lt; affected.length; i++) _tryIncrement(affected[i]);
}</code></pre><p>It listens only to Reactive&apos;s official callback proxy, and the registry in turn accepts these increments only from this callback, so the single contract allowed to raise an asset&apos;s risk is the one at the end of this exact chain of custody. Raising the count is what moves the score: a higher dilution count lifts the risk score, and the pool reads that new score and charges a higher fee on its very next swap. The provider who was quietly exposed to a copy that showed up last week is now, without anyone lifting a finger, paid more to carry it. Each increment is wrapped so that one frozen or disputed record can&#x2019;t block the rest of the batch.<br></p><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Reactive Staking: Season 8]]></title><description><![CDATA[<p>Season 7 is wrapping up. Our 1-month staking pool expires at block <strong>6,437,662</strong> (Thursday, August 13th), and with it we&apos;re opening the door to Season 8.</p><p>Season 8 repeats Season 7 in structure: a single 1-month pool. We&apos;re finalizing the final matters of the</p>]]></description><link>https://blog.reactive.network/reactive-staking-season-8/</link><guid isPermaLink="false">6a7c4e28b3b64f0064fd5f06</guid><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Wed, 12 Aug 2026 14:44:39 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/staking-8.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/staking-8.jpg" alt="Reactive Staking: Season 8"><p>Season 7 is wrapping up. Our 1-month staking pool expires at block <strong>6,437,662</strong> (Thursday, August 13th), and with it we&apos;re opening the door to Season 8.</p><p>Season 8 repeats Season 7 in structure: a single 1-month pool. We&apos;re finalizing the final matters of the Omni transition to Reactive mainnet, and once it&#x2019;s live, we might revisit our staking structure, likely returning to the familiar three-pool setup with 1-, 2-, and 3-month options.</p><p><strong>The short version for newcomers:</strong> staking lets you lock up REACT for a fixed period and earn rewards for helping secure the network. Each season is a fresh round with its own pools and reward budget.</p><h1 id="how-season-7-stacked-up">How Season 7 Stacked Up</h1><p></p><p>Season 7 ran a single pool with a reward budget of <strong>1,000,000 REACT</strong>. By the close, it had drawn <strong>192 stakers</strong> and <strong>101,802,464.85&#xA0; REACT</strong> staked, at an APY of <strong>12.69%</strong>.</p><h1 id="how-to-join">How to Join</h1><p></p><p><strong>If you staked in Season 7:</strong></p><ol><li>Open the <a href="https://portal.reactive.network/withdraw?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and confirm your REACT wallet is connected.</li><li>Select the pool you&apos;re currently in.</li><li>Hit <strong>Restake</strong> and confirm the transaction to roll into Season 8.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-c82c1d17-f6ba-4962-a5c6-ddd69214bc79.png" class="kg-image" alt="Reactive Staking: Season 8" loading="lazy" width="624" height="421" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-c82c1d17-f6ba-4962-a5c6-ddd69214bc79.png 600w, https://blog.reactive.network/content/images/2026/08/data-src-image-c82c1d17-f6ba-4962-a5c6-ddd69214bc79.png 624w"></figure><p><strong>If you&apos;re new:</strong></p><ol><li>Open the <a href="https://portal.reactive.network/stake?ref=blog.reactive.network"><u>Reactive Token Portal</u></a> and connect your REACT wallet.</li><li>Select the 1-month pool (the only one this season).</li><li>Enter the amount of REACT you&apos;d like to stake.</li><li>Hit <strong>Stake</strong> and confirm the transaction.</li></ol><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-ed0e9a0c-1b4d-47ea-a871-b89e05d36de8.png" class="kg-image" alt="Reactive Staking: Season 8" loading="lazy" width="624" height="421" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-ed0e9a0c-1b4d-47ea-a871-b89e05d36de8.png 600w, https://blog.reactive.network/content/images/2026/08/data-src-image-ed0e9a0c-1b4d-47ea-a871-b89e05d36de8.png 624w"></figure><p>Once staked, your REACT stays locked for the full duration of the pool. Principal and rewards unlock only when the pool concludes.</p><h1 id="key-dates-and-numbers">Key Dates and Numbers</h1><p></p><p>Season 7 closes at block <strong>6,437,662</strong> on Thursday,&#xA0; August 13th. Rewards aren&apos;t distributed automatically, so be sure to claim yours through the <a href="https://portal.reactive.network/?ref=blog.reactive.network"><u>Reactive Token Portal</u></a>.</p><p>Season 8 launches on the very next block, <strong>6,437,663</strong>, with a fresh reward pool of <strong>1,000,000 REACT</strong>, and closes at block <strong>6,816,896</strong>, around 12 pm UTC on Sunday, September 13th.</p><p>The Omni transition is in its final stretch, with testing on track and the remaining work focused on polish. We&#x2019;re not setting a firm date yet, but we&#x2019;re close and will share timing as we get nearer.&#xA0;</p><p>For technical details on Reactive Network: <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Reactive Docs</u></a>.</p><p>For more details on tokenomics: <a href="https://blog.reactive.network/react-tokenomics-staking-inflation-rewards-apy-explained/"><u>REACT Tokenomics &amp; Staking</u></a>.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Maestro: Keeping A Pool's Liquidity At The Live Price]]></title><description><![CDATA[<p>Maestro was the fifth of the six projects in our<a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"> <u>look at the UHI9 hookathon</u></a>, and it points a reactive contract at something none of the others touched: the real market price, sitting on a different chain. The full project is open <a href="https://github.com/RudraBhaskar9439/Maestro/blob/main/README.md?ref=blog.reactive.network"><u>here</u></a>.</p><p>Maestro is a Uniswap v4 hook whose</p>]]></description><link>https://blog.reactive.network/maestro-keeping-a-pools-liquidity-at-the-live-price/</link><guid isPermaLink="false">6a79caccb3b64f0064fd5eea</guid><category><![CDATA[Fundamentals]]></category><category><![CDATA[Bounties]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Mon, 10 Aug 2026 13:02:43 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/main-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/main-1.jpg" alt="Maestro: Keeping A Pool&apos;s Liquidity At The Live Price"><p>Maestro was the fifth of the six projects in our<a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"> <u>look at the UHI9 hookathon</u></a>, and it points a reactive contract at something none of the others touched: the real market price, sitting on a different chain. The full project is open <a href="https://github.com/RudraBhaskar9439/Maestro/blob/main/README.md?ref=blog.reactive.network"><u>here</u></a>.</p><p>Maestro is a Uniswap v4 hook whose pool has a manager. The manager&apos;s job is to keep the pool&apos;s liquidity concentrated around the live market price and to set the swap fee, and it pays rent to the liquidity providers (the people who deposit the two tokens so others can trade between them) for the privilege. The whole reason for Reactive to be involved is that this manager is not a person or a server. It is a reactive contract that watches a price feed on another chain and moves the pool&apos;s liquidity to match.</p><h1 id="a-pool-that-trades-a-step-behind">A pool that trades a step behind</h1><p></p><p>A normal automated market maker is passive. Its price only changes when someone trades against it, so it is always a little behind wherever the real market has already moved to. Traders who watch both notice the gap and trade against the stale pool price until it catches up, and the small, repeated profit they take comes straight out of the liquidity providers&apos; pockets. This has a name, loss-versus-rebalancing, and on a lively pair like ETH/USDC it is estimated to cost providers somewhere around 5 to 10 percent a year.</p><p>What would fix it is easy to say: keep the pool&apos;s liquidity sitting where the price actually is right now, instead of where it was at the last trade. But a hook can&#x2019;t do that on its own. It only runs inside a swap, so between trades it has no idea where the market has gone, and it certainly has no way to read a price feed living on another chain.</p><h1 id="a-manager-you-rent-not-a-bot-you-run">A manager you rent, not a bot you run</h1><p></p><p>Maestro&apos;s answer is to hand that job to a manager, and to sell the role in a continuous auction. Anyone can bid a per-block rent to become the manager. Each bid has to beat the last, and after a short delay the winner takes over and pays rent every block until someone outbids them or their deposit runs dry. That rent does not go to Maestro. It is shared out to the liquidity providers, who can claim their portion whenever they like. The party best placed to profit from steering the pool ends up paying the providers for the chance to do it.</p><p>While it holds the role, the manager does two things: it concentrates the pool&apos;s liquidity into a tight band around the live price, and it sets the fee. Doing that well is what makes the rent worth paying. And the manager doing it is a reactive contract.</p><h1 id="what-the-reactive-contract-watches">What the reactive contract watches</h1><p></p><p>Every earlier project in this series pointed its reactive contract at the pool&apos;s own activity: swaps, withdrawals, a clock. Maestro points it somewhere else entirely, at a price oracle.<a href="https://pyth.network/?ref=blog.reactive.network"> <u>Pyth</u></a> is a service that publishes real market prices on-chain, and Maestro&apos;s reactive contract, `MaestroManagerRC`, subscribes to Pyth&apos;s price-update event for the ETH/USD feed. It then does nothing at all until that price moves.</p><pre><code class="language-solidity">// Watch Pyth&apos;s PriceFeedUpdate event for one feed (ETH/USD) on the origin chain.
service.subscribe(
&#xA0;&#xA0;&#xA0;&#xA0;originChainId, originPyth, PRICE_FEED_UPDATE_TOPIC_0,
&#xA0;&#xA0;&#xA0;&#xA0;uint256(priceId),&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; // filter: only this one price feed
&#xA0;&#xA0;&#xA0;&#xA0;REACTIVE_IGNORE, REACTIVE_IGNORE
);</code></pre><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-79373e58-08ef-41cc-96a4-63969c17e0c9.png" class="kg-image" alt="Maestro: Keeping A Pool&apos;s Liquidity At The Live Price" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-79373e58-08ef-41cc-96a4-63969c17e0c9.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/08/data-src-image-79373e58-08ef-41cc-96a4-63969c17e0c9.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/08/data-src-image-79373e58-08ef-41cc-96a4-63969c17e0c9.png 1600w, https://blog.reactive.network/content/images/2026/08/data-src-image-79373e58-08ef-41cc-96a4-63969c17e0c9.png 2048w" sizes="(min-width: 720px) 720px"></figure><p>Laid out end to end, that is three chains in one line. Pyth publishes the ETH/USD price on Ethereum Sepolia and emits it as an event; `MaestroManagerRC` on Reactive Lasna testnet is subscribed to that event and forwards each new price across chains; and on Unichain the manager callback takes the delivered price and repositions the pool around it. Only the middle box is the reactive contract&apos;s own work, and it is worth looking at what that work amounts to when a price actually arrives.&#xA0;</p><h1 id="carrying-the-price-across">Carrying the price across</h1><p></p><p>When the Pyth price updates, `react()` runs. It pulls the new price out of the event and asks Reactive to deliver it to the pool&apos;s manager contract on the other chain. That is the whole of it. The reactive contract holds no state and makes no decision about where the band should go.</p><pre><code class="language-solidity">function react(LogRecord calldata log) external vmOnly {
&#xA0;&#xA0;&#xA0;&#xA0;// PriceFeedUpdate carries (publishTime, price, conf); we only want the price.
&#xA0;&#xA0;&#xA0;&#xA0;(, int64 price,) = abi.decode(log.data, (uint64, int64, uint64));

&#xA0;&#xA0;&#xA0;&#xA0;// Deliver the live price to the manager callback on the destination chain.
&#xA0;&#xA0;&#xA0;&#xA0;emit Callback(destinationChainId, managerCallback, CALLBACK_GAS_LIMIT,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;abi.encodeWithSignature(&quot;repositionToPrice(address,int64)&quot;, address(0), price));
}</code></pre><p>The leading zero address is a placeholder that Reactive fills in with the caller&apos;s identity when the call lands, so the destination can check who sent it. The band math, turning that raw price into a tick range the pool can use, runs on the destination side where the Uniswap libraries live. The reactive contract&apos;s only job is to carry a price it observes on one chain over to another.</p><p>On the destination the call arrives at `ManagerCallback` on Unichain, which is strict about who it will listen to: it takes the price only from Reactive&apos;s official callback proxy, and only when the call carries the identity of the exact reactive contract it expects. Then it repositions the pool&apos;s liquidity around the delivered price.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Coinstancy x Reactive: Automating Portfolio Rebalancing On-Chain]]></title><description><![CDATA[<p><a href="https://coinstancy.com/?ref=blog.reactive.network"><u>Coinstancy</u></a> has taken on a practical challenge with Reactive Network: how to keep a portfolio aligned with its intended allocation when market prices are constantly moving.</p><p>Instead of relying on someone to continuously monitor positions and execute trades, the system responds automatically when a portfolio drifts too far from its</p>]]></description><link>https://blog.reactive.network/coinstancy-x-reactive-automating-portfolio-rebalancing-on-chain/</link><guid isPermaLink="false">6a73450db3b64f0064fd5ed5</guid><category><![CDATA[Fundamentals]]></category><category><![CDATA[Press]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Wed, 05 Aug 2026 15:55:50 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/Screenshot-2026-08-05-at-15.14.34.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/Screenshot-2026-08-05-at-15.14.34.png" alt="Coinstancy x Reactive: Automating Portfolio Rebalancing On-Chain"><p><a href="https://coinstancy.com/?ref=blog.reactive.network"><u>Coinstancy</u></a> has taken on a practical challenge with Reactive Network: how to keep a portfolio aligned with its intended allocation when market prices are constantly moving.</p><p>Instead of relying on someone to continuously monitor positions and execute trades, the system responds automatically when a portfolio drifts too far from its target allocation. The reactive contract is now live on Reactive Mainnet, and the integration has reached its second milestone, moving from a testnet proof of concept to a working part of Coinstancy&apos;s production stack.</p><h1 id="coinstancy-in-detail">Coinstancy in Detail</h1><p></p><p>Coinstancy allows users to deposit stablecoins, which are then allocated across a predefined<a href="https://coinstancy.com/products/crypto-baskets/?ref=blog.reactive.network"> <u>basket of crypto assets</u></a>. For example, a basket may include a combination of BTC, ETH, and other tokens.</p><p>That allocation does not remain fixed for long. As asset prices change, the weight of each position changes with them. A portfolio that starts out balanced can become noticeably skewed within a matter of days.</p><p>Traditionally, correcting this drift involves three steps: identifying that the<a href="https://coinstancy.com/solutions/diversify-portfolio/?ref=blog.reactive.network"> <u>portfolio</u></a> has moved away from its target, calculating which positions need to be adjusted, and executing the necessary trades, sometimes across several networks.</p><p>This process is manageable at a small scale, but it quickly becomes time-consuming, repetitive, and prone to execution errors.</p><h1 id="what-reactive-adds">What Reactive Adds</h1><p></p><p>Reactive provides a way for on-chain systems to respond directly to events rather than waiting for someone to intervene manually. A single reactive contract subscribes to Chainlink price feed updates for the assets held in active baskets. The baskets themselves currently live on Arbitrum, so that is the primary origin chain, but a few assets only have a feed on Ethereum mainnet.</p><p>Rather than standing up separate monitoring for each network, the reactive contract simply subscribes where the feed exists and aggregates the results in one place. Base and Ethereum are set to join as destination chains as new baskets are added.</p><p>When an update arrives and the basket has drifted past its target allocation, the contract emits a callback that records a rebalance request on the destination chain. Each request traces back to the price event that caused it, so when a user asks why their portfolio changed, there is an on-chain answer.</p><h1 id="where-execution-happens">Where Execution Happens</h1><p></p><p>One design decision here is worth calling out, because it runs against the assumption that reactive contracts have to do everything.</p><p>Coinstancy does not custody user funds on-chain directly; positions are held in managed wallets, and the trades themselves are routed through an external liquidity protocol. Rebalance execution therefore stays in Coinstancy&apos;s backend, which reads the rebalance requests recorded on the destination chain and acts on them.</p><p>The reactive contract handles what it is best suited for: watching several chains at once and deciding, on-chain and verifiably, that a rebalance is warranted. Pushing the swap logic and wallet operations on-chain as well would have meant rebuilding a large part of an existing, audited stack for little gain.</p><h1 id="what-stops-a-rebalance">What Stops a Rebalance</h1><p></p><p>Most price updates produce no action at all, and that is the intended behavior. A rebalance has to earn its way past a series of conditions first.</p><p>The contract discards feeds that look stale or implausible, ignores data from a Layer 2 for a grace period after a sequencer outage, and confirms that the basket has not been rebalanced too recently. Each request carries an identifier derived from the originating transaction, so one event can&#x2019;t produce two rebalances. On the destination side, the receiver accepts calls only from the official Reactive callback proxy, and only from Coinstancy&apos;s own contract.</p><p>The backend is equally cautious: events count as final only once enough confirmations have passed to make a reorg unlikely, already-processed ones are discarded, and signing runs through a hardware-backed key management service. If a rebalance is interrupted partway through, the backend works from a snapshot taken beforehand to unwind the swaps that completed, records any difference in value, and alerts the team. The request itself stays on-chain throughout, so the reason it was issued never has to be reconstructed.</p><h1 id="user-benefit">User Benefit</h1><p></p><p>From the user&apos;s perspective, portfolio management becomes more consistent and requires less manual intervention.</p><p>Portfolios remain closer to their intended allocation without users having to continuously track prices or decide when trades should be executed. The system applies the same predefined rules each time, which helps avoid emotional or inconsistent decision-making.</p><p>The result is a smoother experience in which the portfolio strategy is maintained in the background.</p><h1 id="closing-thought">Closing Thought</h1><p></p><p>Thanks to the Coinstancy team for seeing this through from a testnet demo to a live mainnet deployment. They pushed back on parts of the design along the way rather than taking the first version of it: where the drift logic belongs, what the contract should and should not own, how much to trust a price feed. Those are the right questions to ask, and the integration is better for them being asked.</p><p>What stands out about the result is how ordinary it is. A contract watches price feeds on a few chains, and every so often it decides something needs to change. No scheduler, no monitoring service, nothing to keep running. That is roughly where we hope reactive contracts end up: not the interesting part of the system, just the part that quietly works.</p><p>Follow their socials: <a href="https://coinstancy.com/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://x.com/Coinstancy?ref=blog.reactive.network"><u>X</u></a> | <a href="https://www.instagram.com/coinstancy?ref=blog.reactive.network"><u>Instagram</u></a> | <a href="https://www.linkedin.com/company/coinstancy?ref=blog.reactive.network"><u>LinkedIn</u></a></p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Lambda: Keeping A Hedge In Sync Across Chains]]></title><description><![CDATA[<p>Lambda was the fourth of the six projects in our<a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"> <u>look at the UHI9 hookathon</u></a>, and it puts a reactive contract to the use Reactive Network is most literally built for: turning an event on one chain into a transaction on another, with no server in between. The full project,</p>]]></description><link>https://blog.reactive.network/lambda-keeping-a-hedge-in-sync-across-chains/</link><guid isPermaLink="false">6a71d2f7b3b64f0064fd5ebf</guid><category><![CDATA[Fundamentals]]></category><category><![CDATA[Bounties]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Tue, 04 Aug 2026 12:33:09 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/08/main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/08/main.jpg" alt="Lambda: Keeping A Hedge In Sync Across Chains"><p>Lambda was the fourth of the six projects in our<a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"> <u>look at the UHI9 hookathon</u></a>, and it puts a reactive contract to the use Reactive Network is most literally built for: turning an event on one chain into a transaction on another, with no server in between. The full project, contracts and tests included, is open <a href="https://github.com/Hijanhv/lambda-protocol?ref=blog.reactive.network"><u>here</u></a>.</p><p>Lambda is a Uniswap v4 hook that tries to cancel the price risk a liquidity provider (an LP, someone who deposits two assets into a pool so others can trade between them) carries. It does that by holding a matching short position on a perpetual futures exchange, and it keeps that short the right size automatically, even though the pool and the exchange live on different chains.</p><h1 id="the-loss-that-is-also-an-income-stream">The loss that is also an income stream</h1><p></p><p>An LP slowly loses value to arbitrage. When the price moves, the pool sells the asset that is rising and buys the one that is falling, and traders on the other side pocket the difference. Researchers named and measured this (they call it loss-versus-rebalancing, the precise cousin of &quot;impermanent loss&quot;), and for a volatile pair it is not small.</p><p>The idea Lambda is built on is that this loss has a mirror. A short position on a perpetuals exchange collects a recurring fee, called funding, and over time that funding is roughly the same size as the loss the pool suffers, with the opposite sign. Both are paid by the same thing: people wanting exposure to a moving price. So Lambda holds the pool position and a matching short at once. The loss and the income meet in the middle, and the combined position barely cares which way the price goes. That last property has a name: delta-neutral.</p><p>The short is deliberately partial, sized at about 0.65 of the position&apos;s exposure rather than a full 1.0, because a full hedge is far more likely to get liquidated on a sharp move. Hedging most of the risk gives up little protection for a lot more safety.</p><h1 id="the-fix-lives-on-another-chain">The fix lives on another chain</h1><p></p><p>A Uniswap hook only runs when someone trades. Between trades it is blind, and it can&#x2019;t start anything on its own. Lambda&apos;s hook does what it can while a swap is passing through: it recomputes the position&apos;s exact exposure (its delta) and, if that has drifted too far from the last hedged level, emits a single event asking for the hedge to be resized.</p><p></p><pre><code class="language-solidity">// Every swap, recompute the live delta; if it has drifted past the band tau,
// emit one HedgeRequested carrying a strictly increasing per-pool nonce.
if (DeltaMath.shouldRehedge(ps.hedgedDelta, live, ps.tau)) {
&#xA0;&#xA0;&#xA0;&#xA0;ps.hedgedDelta = live;
&#xA0;&#xA0;&#xA0;&#xA0;uint64 nonce = ++ps.hedgeNonce;
&#xA0;&#xA0;&#xA0;&#xA0;emit HedgeRequested(id, nonce, DeltaMath.hedgeSize(live, ps.hedgeRatioWad), live, sqrtPriceX96, block.timestamp);
}</code></pre><p>But the thing that has to happen next, adjusting a real short, happens on a different chain and a different venue. The usual way to bridge that gap is an off-chain bot: a server watching for the event and signing the hedge transaction. That server is a trusted operator, a point of failure, and something that has to stay online. Lambda removes it. A reactive contract does the bridging instead, entirely on-chain.</p><h1 id="what-the-reactive-contract-does">What the reactive contract does</h1><p></p><p>The whole loop fits on two chains. On Unichain, the hook follows each swap, tracks the position&apos;s exact delta, and when that drifts too far it emits a single `HedgeRequested` event. Over on Reactive&apos;s Lasna testnet, `LambdaReactive` is subscribed to that event: it checks if the event is new, then routes a callback back across chains. On testnet that callback lands on a stand-in receiver on Unichain, which re-checks the sender and the nonce and records the hedge at 0.65 of the position&apos;s delta. On mainnet, the same callback would drive a real perp instead, which is the honest gap the diagram&apos;s &quot;testnet receiver&quot; label is pointing at.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/08/data-src-image-baf8e01f-a672-43f8-9705-6c1d6ffbb032.png" class="kg-image" alt="Lambda: Keeping A Hedge In Sync Across Chains" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/08/data-src-image-baf8e01f-a672-43f8-9705-6c1d6ffbb032.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/08/data-src-image-baf8e01f-a672-43f8-9705-6c1d6ffbb032.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/08/data-src-image-baf8e01f-a672-43f8-9705-6c1d6ffbb032.png 1600w, https://blog.reactive.network/content/images/2026/08/data-src-image-baf8e01f-a672-43f8-9705-6c1d6ffbb032.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>The reactive contract subscribes to the hook&apos;s event on the origin chain, and optionally to the network&apos;s periodic CRON tick for funding checkpoints:&#xA0;</p><p></p><pre><code class="language-solidity">// Watch the hook&apos;s HedgeRequested event over on the origin chain...
service.subscribe(originChainId, hook, HEDGE_TOPIC0, ...);

// ...and, optionally, the network&apos;s periodic CRON tick.
if (cronTopic != 0)
&#xA0;&#xA0;&#xA0;&#xA0;service.subscribe(block.chainid, address(service), cronTopic, ...);</code></pre><p>When the event arrives, `react()` runs. Its job is small and careful: check the event is genuinely newer than the last one it acted on, then ask Reactive to deliver a call to the hedger on the other chain.</p><p></p><pre><code class="language-solidity">function react(LogRecord calldata log) external vmOnly {
&#xA0;&#xA0;&#xA0;&#xA0;bytes32 poolId = bytes32(log.topic_1);
&#xA0;&#xA0;&#xA0;&#xA0;uint64&#xA0; nonce&#xA0; = uint64(log.topic_2);

&#xA0;&#xA0;&#xA0;&#xA0;if (nonce &lt;= lastNonce[poolId]) { emit HedgeDropped(poolId, nonce, lastNonce[poolId]); return; }
&#xA0;&#xA0;&#xA0;&#xA0;lastNonce[poolId] = nonce; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; // drop replays and out-of-order events

&#xA0;&#xA0;&#xA0;&#xA0;// Ask Reactive Network to deliver a call to the hedger on the destination chain.
&#xA0;&#xA0;&#xA0;&#xA0;emit Callback(destinationChainId, hedger, callbackGasLimit,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;abi.encodeWithSignature(&quot;applyHedge(address,bytes32,uint64,uint256,uint160)&quot;,
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;address(0), poolId, nonce, targetSize, sqrtPriceX96));
}</code></pre><p>Emitting that `Callback` is the whole cross-chain step. Reactive Network&apos;s relayer picks it up and turns it into a real transaction on the destination chain, filling in the leading zero-address placeholder with the caller&apos;s identity as it goes. The reactive contract itself moves no money and trusts nothing in the event beyond what it can verify: it forwards, and it keeps a per-pool nonce so a repeated or stale signal goes nowhere.</p><h1 id="where-the-callback-lands-and-who-is-allowed-to-send-it">Where the callback lands, and who is allowed to send it</h1><p></p><p>The call arrives at a small contract on the destination chain, and that contract is strict about who it listens to. It accepts the call only from Reactive&apos;s official callback proxy, and it re-checks the nonce itself rather than trusting the payload it was handed.</p><p></p><pre><code class="language-solidity">function applyHedge(address, bytes32 poolId, uint64 nonce, uint256 targetSize, uint160 sqrtPriceX96)
&#xA0;&#xA0;&#xA0;&#xA0;external
&#xA0;&#xA0;&#xA0;&#xA0;authorizedSenderOnly // only the official Reactive callback proxy
{
&#xA0;&#xA0;&#xA0;&#xA0;if (nonce &lt;= lastNonce[poolId]) revert StaleNonce();&#xA0; // re-check; never trust the payload
&#xA0;&#xA0;&#xA0;&#xA0;lastNonce[poolId] = nonce;
&#xA0;&#xA0;&#xA0;&#xA0;// ...size and place the short...
}</code></pre><p>On mainnet that contract is the real hedger on HyperEVM, and the last step is a genuine order placed on Hyperliquid&apos;s perpetuals exchange through its on-chain `CoreWriter` system contract. The short is opened or resized to match `0.65 x delta`.</p><p>There is an honest wrinkle worth stating plainly. Reactive&apos;s testnet does not route callbacks to HyperEVM&apos;s testnet, so the live testnet demo can&#x2019;t place a real perp there. Instead the callback is routed back to Unichain Sepolia, where a stand-in receiver applies the exact same two checks (authorized sender, then nonce) and records the hedge it was asked to make, without sending an order. The perp leg itself is written and tested against real HyperEVM state on a fork, but it is not running live. What is proven live is the part this article is about: the cross-chain automation, firing with no bot.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[TrancheShield: Managing A Pool's Risk From Another Chain]]></title><description><![CDATA[<p>TrancheShield was the third of the six projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it takes yet another angle on the same limit: a Uniswap hook only runs when someone trades, but a pool&apos;s risk does not sit still between trades. Here is how it deals</p>]]></description><link>https://blog.reactive.network/trancheshield-managing-a-pools-risk-from-another-chain/</link><guid isPermaLink="false">6a69f918b3b64f0064fd5e92</guid><category><![CDATA[Fundamentals]]></category><category><![CDATA[Bounties]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Thu, 30 Jul 2026 13:11:59 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/07/main-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/07/main-1.jpg" alt="TrancheShield: Managing A Pool&apos;s Risk From Another Chain"><p>TrancheShield was the third of the six projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it takes yet another angle on the same limit: a Uniswap hook only runs when someone trades, but a pool&apos;s risk does not sit still between trades. Here is how it deals with that. The full project is open <a href="https://github.com/AhmetTahirYildiz/TrancheShield?ref=blog.reactive.network"><u>here</u></a> if you want to see how the pieces fit together.</p><p>TrancheShield is a Uniswap v4 hook that protects the senior side of a pool against impermanent loss, the gap that opens up for liquidity providers when the price moves and they end up worse off than if they had simply held the two tokens. That protection is partial, capped at a coverage level, and paid for out of a reserve. To keep the whole thing solvent, the pool has a few settings it can turn: the swap fee, how much of the loss it currently promises to cover, and whether new money is allowed into the senior side at all.</p><p>The catch is that the right values for those settings depend on what is happening in and around the pool, and most of that has nothing to do with any single trade. Volatility climbs. The reserve gets thin. Holders start trying to pull their money out. A hook can&#x2019;t keep up with any of this on its own, because it only wakes up inside a swap. It has no way to keep a running measure of volatility across many swaps, no way to notice the reserve draining or a wave of withdrawals building, and no way to calm back down during a quiet stretch when, by definition, nothing is calling it.</p><p>TrancheShield hands all of that to a reactive contract on Reactive Lasna testnet. It watches the pool from the outside, keeps its own running state, and adjusts those settings as conditions change. It is, in effect, a risk manager for the pool that never needs anyone to trade in order to do its job.</p><h1 id="what-it-watches">What it watches</h1><p></p><p>The reactive contract subscribes to three kinds of event coming off Unichain Sepolia, plus one optional signal from Reactive Network itself:</p><pre><code class="language-solidity">// On Unichain Sepolia: every swap, every reserve-ratio update, every Senior withdrawal.
service.subscribe(UNICHAIN_SEPOLIA_CHAIN_ID, hook,&#xA0; &#xA0; swapTopic0, &#xA0; &#xA0; ...);
service.subscribe(UNICHAIN_SEPOLIA_CHAIN_ID, reserve, reserveTopic0,&#xA0; ...);
service.subscribe(UNICHAIN_SEPOLIA_CHAIN_ID, hook,&#xA0; &#xA0; withdrawTopic0, ...);

// Optional: a periodic tick on Reactive Network, used to let things settle down.
if (cronTopic0 != 0)
&#xA0;&#xA0;&#xA0;&#xA0;service.subscribe(REACTIVE_CHAIN_ID, SERVICE_ADDR, cronTopic0, ...);</code></pre><p>Each of the three tells it something different. Swaps say how sharply the price is moving and in which direction. Reserve-ratio updates say how healthy the backing is. Withdrawal events say how many senior holders are trying to leave. When any of them arrives, a single entry point sorts it by type and updates the pool it belongs to:</p><pre><code class="language-solidity">function react(LogRecord calldata log) external vmOnly {
&#xA0;&#xA0;&#xA0;&#xA0;bytes32 poolId = bytes32(log.topic_1);
&#xA0;&#xA0;&#xA0;&#xA0;if&#xA0; &#xA0; &#xA0; (log.topic_0 == swapTopic0) &#xA0; &#xA0; _onSwap(poolId, log);
&#xA0;&#xA0;&#xA0;&#xA0;else if (log.topic_0 == reserveTopic0)&#xA0; _onReserveRatio(poolId, log);
&#xA0;&#xA0;&#xA0;&#xA0;else if (log.topic_0 == withdrawTopic0) _onSeniorWithdrawal(poolId, log);
&#xA0;&#xA0;&#xA0;&#xA0;else if (log.topic_0 == cronTopic0) &#xA0; &#xA0; _onCron(poolId);
}</code></pre><p>Everything is tracked per pool. Each pool gets its own volatility history, its own risk level, its own counters. A volatility spike in one pool can&#x2019;t pull another pool along with it, and a brand-new pool always starts calm.</p><h1 id="keeping-a-running-read-on-volatility">Keeping a running read on volatility</h1><p></p><p>Here is something a hook genuinely can&#x2019;t do well: remember. The reactive contract holds state, so with every swap it folds the new price move into a running estimate of the pool&apos;s volatility. It does this without storing the full history. It keeps only a few running totals (a count, a sum, and a sum of squares) and derives a standard-deviation-style score from them, using a well-known online method for exactly this, Welford&apos;s algorithm. The cost of updating stays the same whether the pool has seen ten swaps or ten million.</p><p>That volatility score maps onto four risk levels, and each level sets the swap fee:</p><pre><code class="language-solidity">if&#xA0; &#xA0; &#xA0; (score &gt;= volCrisisThreshold) { mode = CRISIS; mult = 25_000; } // 2.50x fee
else if (score &gt;= volHighThreshold) &#xA0; { mode = HIGH; &#xA0; mult = 17_500; } // 1.75x
else if (score &gt;= volMediumThreshold) { mode = MEDIUM; mult = 12_500; } // 1.25x
else&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; { mode = LOW;&#xA0; &#xA0; mult = 10_000; } // 1.00x</code></pre><p>The more sharply the price is moving, the more it costs to trade against the pool&apos;s liquidity, so the fee goes up to compensate the people providing it. If several swaps in a row push the price the same way, that is a sign of one-directional flow that is especially costly to serve, so the contract adds a surcharge on top, capped at a hard ceiling of 3.00x:</p><pre><code class="language-solidity">// 3+ swaps pushing the same direction in a row: add a surcharge.
if (consecutiveDirectional[poolId] &gt;= 3) mult += 2_500; // +0.25x, never above 3.00x</code></pre><h1 id="reserve-health-and-a-wave-of-withdrawals">Reserve health, and a wave of withdrawals</h1><p></p><p>The other two signals are about solvency rather than price. When a reserve-ratio update comes in, the contract compares the reserve against what it owes the senior side and sets coverage accordingly: a healthy reserve keeps coverage near its cap, a thin reserve steps it down, and a critically low reserve drops it to a floor, pushes the pool into its highest risk level, and switches off new senior deposits.</p><p>The withdrawal signal is the one with a story in it. The contract keeps a small ring buffer of the timestamps of recent senior-withdrawal requests. Each new request goes in, and it counts how many landed in the last hour. If that count crosses a threshold, it reads the situation as a run on the pool and acts at once:</p><pre><code class="language-solidity">function _onSeniorWithdrawal(bytes32 poolId, LogRecord calldata log) internal {
&#xA0;&#xA0;&#xA0;&#xA0;// record this request&apos;s time, then count how many happened in the last hour
&#xA0;&#xA0;&#xA0;&#xA0;uint256 inWindow = _countWithdrawalsInWindow(poolId, timestamp);
&#xA0;&#xA0;&#xA0;&#xA0;if (inWindow &gt;= bankRunThreshold) {&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; // 5 within an hour
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_callback(setRiskMode(poolId, CRISIS));
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_callback(updateCoverageRatio(poolId, 1_500)); &#xA0; &#xA0; // pull coverage down to 15%
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_callback(setSeniorDepositStatus(poolId, false));&#xA0; // stop new deposits
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>Notice what it does and does not do. It does not try to stop people leaving. It tightens the pool&apos;s stance so the holders who remain are not left relying on a promise the reserve can no longer keep, and it stops new deposits from entering a pool that is visibly under stress.</p><h1 id="letting-a-pool-re-evaluate-when-it-is-quiet">Letting a pool re-evaluate when it is quiet</h1><p></p><p>The optional periodic tick fills a real gap. Risk levels rise during active trading, but if trading simply stops, a hook never runs again, and the pool could stay pinned in a high-fee, low-coverage stance long after the pressure has eased. The tick gives the reactive contract a scheduled chance to recompute a quiet pool&apos;s risk and, if the numbers no longer support a cautious stance, step it back down, without waiting for a trade that may never come.</p><h1 id="crossing-the-chain-within-limits">Crossing the chain, within limits</h1><p></p><p>When any of this changes a setting, the reactive contract does what the others in this series do: it emits a callback, and Reactive Network delivers it as a real transaction on Unichain Sepolia, to a receiver contract that applies the update to the pool.</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/07/data-src-image-f3493d0c-d6e9-4b9b-a1f8-d0be043207c1.png" class="kg-image" alt="TrancheShield: Managing A Pool&apos;s Risk From Another Chain" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/07/data-src-image-f3493d0c-d6e9-4b9b-a1f8-d0be043207c1.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/07/data-src-image-f3493d0c-d6e9-4b9b-a1f8-d0be043207c1.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/07/data-src-image-f3493d0c-d6e9-4b9b-a1f8-d0be043207c1.png 1600w, https://blog.reactive.network/content/images/2026/07/data-src-image-f3493d0c-d6e9-4b9b-a1f8-d0be043207c1.png 2000w" sizes="(min-width: 720px) 720px"></figure><p>The receiver is deliberately strict. Every value it accepts is clamped to a safe range before it touches the pool. The fee multiplier is held between 1.00x and 3.00x, coverage can never exceed 50%, and the risk level has to be one of the four valid values:</p><pre><code class="language-solidity">function updateFeeMultiplier(address rvmId, bytes32 poolId, uint256 newBps)
&#xA0;&#xA0;&#xA0;&#xA0;external rvmIdOnly(rvmId)
{
&#xA0;&#xA0;&#xA0;&#xA0;if (newBps &lt; 10_000 || newBps &gt; 30_000) revert FeeMultiplierOutOfBounds(newBps);
&#xA0;&#xA0;&#xA0;&#xA0;hook.updateFeeMultiplier(PoolId.wrap(poolId), newBps);
}</code></pre><p>This matters. The reactive contract is doing real work and pushing real changes, but it is not trusted with unbounded power over the pool. The worst it could do, even if something went badly wrong, is move a handful of settings within ranges fixed in advance, on one pool at a time. Coverage tops out at half by design, so the protection is always partial and the pool never promises more than it can plausibly back. The receiver also checks that each callback carries the identity of the exact reactive contract it expects, so a stray call from anywhere else goes nowhere.</p><p>There is a small engineering story worth sharing, because it is the kind of thing you only learn by running the system. The callback travels through two hops before it reaches the pool, the delivery proxy and then the receiver, and Ethereum passes on only part of the remaining gas at each hop. A gas budget that looked generous kept running out partway through, and the fix was to send far more than seemed necessary. It is a reminder that a cross-chain call is not one call but a short chain of them, each consuming part of what is left.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item><item><title><![CDATA[Unistrata: When Settlement Can’t Wait For The Next Trade]]></title><description><![CDATA[<p>Unistrata was the second of the six projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it draws a different lesson from the same limit: a Uniswap hook only runs when someone trades, but some decisions can&#x2019;t wait for the next trade. Here is how it handles that.</p>]]></description><link>https://blog.reactive.network/unistrata-when-settlement-cant-wait-for-the-next-trade/</link><guid isPermaLink="false">6a672878b3b64f0064fd5e7c</guid><category><![CDATA[Fundamentals]]></category><category><![CDATA[Bounties]]></category><dc:creator><![CDATA[Reactive Network]]></dc:creator><pubDate>Mon, 27 Jul 2026 13:35:22 GMT</pubDate><media:content url="https://blog.reactive.network/content/images/2026/07/main.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.reactive.network/content/images/2026/07/main.jpg" alt="Unistrata: When Settlement Can&#x2019;t Wait For The Next Trade"><p>Unistrata was the second of the six projects in our <a href="https://blog.reactive.network/reactive-contracts-uniswap-hooks-the-first-wave-from-the-uhi9-hookathon/"><u>look at the UHI9 hookathon</u></a>, and it draws a different lesson from the same limit: a Uniswap hook only runs when someone trades, but some decisions can&#x2019;t wait for the next trade. Here is how it handles that. The full project, contracts and tests included, is open <a href="https://github.com/dadadave80/unistrata?ref=blog.reactive.network"><u>here</u></a>.</p><p>Unistrata treats a single liquidity pool the way finance treats a bond. It splits the pool into two tranches, senior and junior. The senior tranche (called Bedrock) has protected principal and earns a fixed return priced from the pool&apos;s own volatility. The junior tranche (Sediment) absorbs losses first and is paid only from what remains after the senior&apos;s protected amount, and in exchange it keeps the extra trading fees. At the end of each epoch (a fixed settlement period), the pool settles: it works out what everything is worth and pays the senior tranche its protected amount first, then the junior gets the remainder. That ordering is called the waterfall.</p><p>Two things are worth noting. First, it uses no price oracle: the pool measures its own volatility directly from its trading activity and prices the senior return from that. Second, settlement has to happen at the right moment, and the hook can&#x2019;t start it on its own. It only runs when someone trades.</p><p>There are two moments when settlement matters, and they are very different. One is routine: the epoch ends, and it is time to settle. The other is urgent: the price is falling right now, and you want to settle immediately, while the pool still holds enough to cover the senior tranche&apos;s protected amount. Settle in time and the loss falls on the junior tranche, which signed up to absorb it; wait too long and the shortfall starts eating into senior principal. That urgent moment is the one you can&#x2019;t afford to wait on, and the one a fixed schedule would miss. Unistrata&apos;s reactive contract handles both.</p><h1 id="two-things-to-watch">Two things to watch</h1><p></p><p>The reactive contract lives on Reactive Lasna testnet and does nothing but watch and act. It subscribes to two very different signals:</p><ul><li>a periodic CRON event on Reactive, so it can settle on a regular schedule, and</li><li>the pool&apos;s volatility reading, published on the origin chain whenever trading moves the price, so it can settle as soon as volatility jumps.</li></ul><p>That second subscription is the useful part. The pool already measures its own volatility (it needs to, in order to price the senior return) and emits that number on-chain, and the reactive contract listens for it.&#xA0;</p><pre><code class="language-solidity">// The network&apos;s cron event, on the Reactive chain...
service.subscribe(block.chainid, address(service), cronTopic, ...);

// ...and the pool&apos;s own volatility readings, over on the origin chain.
service.subscribe(originChainId, unistrataHook, UNISTRATA_OBSERVATION_TOPIC, ...);</code></pre><p>One subscription is a timer; the other reads the pool&apos;s volatility.</p><h1 id="settling-on-schedule">Settling on schedule</h1><p></p><p>After a set number of CRON ticks, the contract treats an epoch as elapsed and asks the pool to settle:</p><pre><code class="language-solidity">function _onHeartbeat() internal {
&#xA0;&#xA0;&#xA0;&#xA0;if (++cronTicks &gt;= ticksPerEpoch) { &#xA0; // a full epoch&apos;s worth of ticks
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;cronTicks = 0;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_emitCallback(&quot;settleEpoch(address)&quot;);
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>Even in a quiet market where nobody trades for a long stretch, the books still close on time.&#xA0;</p><h1 id="settling-early-on-a-volatility-spike">Settling early on a volatility spike</h1><p></p><p>This is the more interesting case. Every time the pool emits a new volatility reading, the contract checks how much volatility has built up since the last settlement. If that increase crosses a threshold, the contract does not wait for the epoch to end; it settles immediately:&#xA0;</p><pre><code class="language-solidity">function _onObservation(bytes memory data) internal {
&#xA0;&#xA0;&#xA0;&#xA0;(, uint256 varAcc) = abi.decode(data, (int24, uint256));
&#xA0;&#xA0;&#xA0;&#xA0;latestVarAcc = varAcc;
&#xA0;&#xA0;&#xA0;&#xA0;if (varAcc - lastSpikeVarAcc &gt;= spikeThreshold) { &#xA0; // volatility just spiked
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;lastSpikeVarAcc = varAcc;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;_emitCallback(&quot;emergencySettle(address)&quot;);&#xA0; &#xA0; &#xA0; &#xA0; // settle now, do not wait
&#xA0;&#xA0;&#xA0;&#xA0;}
}</code></pre><p>Settling early matters because of what a fall does to the two tranches. Settle while the pool still holds enough to cover the senior tranche&apos;s protected amount, and the loss falls on the junior. Wait too long, and there may not be enough left, so the senior principal, the part meant to be protected, starts taking losses instead. The threshold triggers an early settlement precisely to avoid that.</p><p>One detail is worth noting. The threshold measures volatility since the last settlement, not since the pool launched. After every settlement, routine or early, the baseline resets, so the trigger responds to a fresh jump in volatility rather than to volatility that accumulated over the pool&apos;s whole history.</p><h1 id="crossing-the-chain-and-who-is-allowed-to-settle">Crossing the chain, and who is allowed to settle</h1><p></p><p>A reactive contract can&#x2019;t reach the origin chain on its own. As with the other projects in this series, it emits a `Callback`, and Reactive Network&apos;s callback proxy delivers it as a real transaction on the origin chain, paying the gas and calling the pool as an authorized sender.&#xA0;</p><figure class="kg-card kg-image-card"><img src="https://blog.reactive.network/content/images/2026/07/data-src-image-4a2f1358-d9cd-44a0-9fd7-384e52bad80c.png" class="kg-image" alt="Unistrata: When Settlement Can&#x2019;t Wait For The Next Trade" loading="lazy" width="2000" height="1125" srcset="https://blog.reactive.network/content/images/size/w600/2026/07/data-src-image-4a2f1358-d9cd-44a0-9fd7-384e52bad80c.png 600w, https://blog.reactive.network/content/images/size/w1000/2026/07/data-src-image-4a2f1358-d9cd-44a0-9fd7-384e52bad80c.png 1000w, https://blog.reactive.network/content/images/size/w1600/2026/07/data-src-image-4a2f1358-d9cd-44a0-9fd7-384e52bad80c.png 1600w, https://blog.reactive.network/content/images/2026/07/data-src-image-4a2f1358-d9cd-44a0-9fd7-384e52bad80c.png 2048w" sizes="(min-width: 720px) 720px"></figure><p>The pool does not accept that call from just anyone. Both settlement entry points are gated two ways: the caller must be the official callback proxy, and the request must carry the identity of the exact reactive contract registered at setup.</p><pre><code class="language-solidity">function emergencySettle(address rvm_id)
&#xA0;&#xA0;&#xA0;&#xA0;external
&#xA0;&#xA0;&#xA0;&#xA0;nonReentrant
&#xA0;&#xA0;&#xA0;&#xA0;authorizedSenderOnly&#xA0; &#xA0; &#xA0; // must come through the official proxy
&#xA0;&#xA0;&#xA0;&#xA0;rvmIdOnly(rvm_id) &#xA0; &#xA0; &#xA0; &#xA0; // and carry our registered controller&apos;s identity
{ ... }</code></pre><p>And because an automated system that fails silently is worse than none at all, there is a manual fallback: a permissionless settlement that anyone can call, but only after the epoch has ended and a grace period has passed. If a callback is ever missed, the pool can&#x2019;t get stuck; someone can always settle it directly.</p><hr><h1 id="about-reactive-network">About Reactive Network</h1><p></p><p>Reactive Network is an EVM automation layer built around reactive contracts, event-driven smart contracts for cross-chain, on-chain automation. It runs on CometBFT consensus, providing instant finality and roughly 1-second block times while maintaining full EVM compatibility.</p><p>Reactive contracts subscribe to event logs across EVM chains and execute Solidity logic automatically when matching events occur, deciding autonomously when to send cross-chain callback transactions. This model supports conditional cross-chain state changes and continuous cross-chain workflows.</p><p><a href="https://reactive.network/?ref=blog.reactive.network"><u>Website</u></a> | <a href="https://blog.reactive.network/"><u>Blog</u></a> | <a href="https://x.com/0xreactive?ref=blog.reactive.network"><u>X</u></a> | <a href="https://t.me/Reactive_Network?ref=blog.reactive.network"><u>Telegram</u></a> | <a href="https://discord.com/invite/SaZAfkgZhj?ref=blog.reactive.network"><u>Discord</u></a> | <a href="https://dev.reactive.network/?ref=blog.reactive.network"><u>Docs</u></a></p><p><strong>Build once &#x2014; react everywhere!</strong></p>]]></content:encoded></item></channel></rss>