A Partially Active AMM. In any block, arbitrageurs can reach only a fraction λ of the reserves. The rest stays frozen below the waterline, and earns yield in Morpho.
A normal AMM leaves the whole pool exposed.
Every time ETH moves, arbitrageurs trade the pool back to the market price, and their profit comes straight out of the LPs. In a real 24-hour replay, a plain Uniswap v4 pool lost $1.077 that way.
Every block, Iceberg freezes 1 − λ of the reserves.
On the first trade of a block the reserves split. Every trade in that block sees only λ·R, priced on a constant-product curve with a 5 bps fee. Quotes never write storage, so quote == swap.
The frozen part doesn't sit idle.
Passive reserves are parked in Morpho vaults (Steakhouse USDC, Moonwell ETH) and pulled back out inside the swap, the moment a trade needs them. LPs can always exit.
λ isn't a constant. It's chosen.
Every ~10 minutes a fee-aware keeper replays the last 6 hours of real ETH/USD at the pool's fee, simulates every λ down to the floor, and publishes the one that loses least to both venues.
The keeper's search, re-run in your browser on the real 21 Sep prices at 5 bps: λ 40% loses 19.1% less than fully active.
IcebergHook
A hook on OpenZeppelin's BaseCustomCurve that owns the reserves as ERC-6909 claims. Each block the passive part freezes; idle reserves are parked in Morpho and unparked inside the swap.
- Pricingx·y = k on the active reserves only
- Idle fundsparked in Morpho, never more than 1 − max λ
- Address0xe5a6…eA88
PAActiveReserves 0x92
A SwapVM instruction in a free opcode slot, followed by 1inch's stock FeeFlatIn and XYCSwap. The maker holds only Morpho vault shares; each fill withdraws exactly what it needs.
- ProgramSalt → guard → PAActiveReserves → FeeFlatIn → XYCSwap
- Shared liquiditythe same vault shares back a strategy on 1inch's official router
- Address0xE498…84b5