Robinhood's stock tokens never move a balance on a corporate action. A global uiMultiplier() moves instead. Every AMM on the chain prices from balanceOf(). So the pool's value changes and the pool's math never notices.
Parity is the hook that notices.
Two rebases, zero balance movement, both announced ahead of time via effectiveAt(). Neither was guarded by any venue on the chain.
Nobody wakes up wanting corporate-action defence. You want it for the same reason there is a smoke detector in a kitchen that has never caught fire: because the day it matters, you will not be given notice, and by then the decision is already made for you.
There are 52 tokenized equities on this chain. Every one of them can pay a dividend or split, on a calendar set by a company in New York that has never heard of your pool. You cannot opt out of that schedule, and you are not consulted before the multiplier moves.
Two multiplier events in the last 2M blocks. Both arrived without a transaction from you.
A dividend costs an LP $6 on a $125k pool, which is genuinely nothing. A 4-for-1 split costs $124,248 of the same pool in a single transaction. There is no middle. Watching every day is not about the dividends; it is about not being asleep on the one day that isn't a dividend.
Loss scales with the square of the multiplier jump.
The chain announces it: effectiveAt() is a public timestamp, visible before the action lands. Someone has to actually look, every day, at all 52. That is tedious, it is unpaid, and it is exactly the kind of job a human quietly stops doing in week three.
The board below does that read live. It is the boring half of the product.
If you provide liquidity to a tokenized equity pool, this runs in the background and you should expect to forget it exists. On the roughly forty to a hundred days a year when an action lands, it charges the arbitrageur instead of you. On every other day it should cost you nothing and say nothing. A guard that charges when there is nothing to defend is just a tax.
ERC-8056 publishes effectiveAt() and newUIMultiplier() ahead of the step. That is a scheduled, publicly visible discontinuity, the easiest thing in the world to defend against, and nobody does. This board watches all 35 tokens for the next one.
A dividend lands. Raw balances are byte-identical, value is not. The curve keeps quoting yesterday's price until someone takes the difference.
CCL, block 50,955,407. Real, but small in LP terms: the arber only captures the rebalancing divergence, not the dividend.
Same mechanism, different magnitude. Loss scales with the square of the multiplier jump, so a 4-for-1 is not 20× a dividend, it is four orders of magnitude worse.
$124,624 extracted from a $125,000 pool in one transaction. On Pons v2, where graduated liquidity is locked permanently, the LP cannot step aside.
Issuers expose oraclePaused() during corporate actions. Robinhood's own docs state the flag is advisory and not enforced on-chain. A paused feed still returns a price, and every venue keeps trading on it.
Widest feed-versus-spot divergence currently on the chain, unguarded.
Four callbacks. The pool is never made un-arbable. The arb is made to pay the LP for the privilege.
The idea was to sell the right to rebalance the pool at base fee instead of the surcharge, denominated in a token, with the winning bid paid to LPs. It sounds right. Run it through the same simulator that produced the table above and it fails in every scenario, including the one it was designed for. Move the slider and watch it fail.
·
The surcharge is levied on the arber's flow, every token that crosses the curve while the budget is outstanding. The auction can only ever extract their profit, because nobody rationally bids more than they expect to make. Profit is a fraction of flow, so the auction sells the same right for strictly less. On the 4-for-1 split the surcharge collects roughly 2× the most any bidder would offer.
·
The surcharge cannot reach one thing: whether anyone notices effectiveAt() before it lands. Every number on this page assumes the pre-rebase window fired. If no keeper is watching, the guard is inert and the LP eats the full unguarded loss.
That is the gap a token can actually price. A keeper posts a bond, and is slashed to the LPs of any pool where it missed an announced window. The bond has to exceed what the window is worth, or missing it is profitable:
All figures computed live from the same simulation set as the proof table: pool 5,000 stock / $125,000 quote, base fee 30 bps, surcharge ceiling 20%. No token exists; this is mechanism design shown failing and being replaced.
On-chain multiplier state, the Chainlink feed, and the real equity price. The invariant that must hold is feed = spot × uiMultiplier. Every break is a live mispricing flowing into any vault or lending market reading that feed.
Constant-product arbitrage solved by bisection to the true post-rebase price with real fee arithmetic, no closed-form shortcuts. Then the hook itself compiled against Uniswap v4-core and executed on an Ethereum mainnet fork, against the canonical PoolManager, with genuine unlock/callback accounting and hook-address flag validation.
| Scenario | Surcharge | Arb, unguarded | Arb, guarded | LP net, unguarded | LP net, guarded |
|---|
Pool 5,000 stock / $125,000 quote · base fee 30 bps · surcharge ceiling 20% · solc 0.8.26, optimizer 200 runs · fork test 6/6 passing against PoolManager 0x0000…8A90 at mainnet block 25,887,057
Our first read of the CCL event was that it drained the LPs. The simulation says otherwise: the arber nets $10.26 on a $125k pool, 0.8 bps. Guarded, that same trade loses $18.84 and the LP finishes +$51.96. Real, repeatable, not a scandal.
At a 4-for-1 the surcharge clamps at its 20% ceiling and recovers 45%. Stated plainly because it matters: split defence rests entirely on the pre-rebase window firing. The surcharge is the backstop for actions that arrive unannounced.
Every one of these is a reason to distrust the pitch. They are here because a defence you cannot audit is a defence you should not use.
The 20% fee ceiling is a deliberate safety valve; uncapped, it would brick the pool on a large action. If an action lands unannounced, the guard degrades to partial recovery.
The scan resolves 35. The rest have nothing to cross-check against, so the three-leg invariant cannot be evaluated at all. Those should not be curve collateral until they have one.
No tokenized-equity token exists on Ethereum mainnet, so the fork proves the hook against real v4 semantics with a faithful mock, not against a real Robinhood token. Chain 4663 has the tokens but no v4 deployment. Both halves are real; they are not yet real in the same place.
Compiles clean, passes its fork tests, models the economics exactly. That is not an audit, and the hook address still needs salt-mining so its low bits encode the permission flags.
Parity defends against the accounting discontinuity. It does nothing about the underlying going down.
The only venue on the chain that doesn't leak on ex-div.