Superposition-Liquid is a meta-layer for 1inch Aqua — capital adapters and meta-opcodes that wrap any SwapVM curve. The maker's capital sits in yield protocols (Aave, Morpho, Euler, Pendle, Stargate, Uniswap v4) and cycles in and out atomically on every fill — you hold Yielding-ETH/Yielding-USDC, you quote on ETH/USDC.
Superposition is not a pricing curve — it wraps the one you ship. Each layer below is independent, and the pricing math at the bottom is never modified.
The adapter layer is the point: the strategy doesn't change — the maker points one config at a protocol and the position earns that protocol's yield. Adapters are chain-agnostic; click a protocol to see where it's live.
An adapter is also a source of capital: with MakerConfig.BorrowConfig (enabled, collateral, maxDebt) a maker can quote an asset they don't hold — borrowed against yield-bearing collateral, and the matching in-fill repays the debt first. The configured collateral + risk capacitor are the soft isolation. Configure it in the console →
Every fill is one atomic transaction where the maker's capital resurfaces, changes hands, and dives back in.
The maker ships an ETH/USDC position on Aqua, like any other liquidity provider. The difference is invisible to the taker: the capital doesn't sit in the wallet — it lives in a yield protocol. Routers and aggregators read it as a normal pool with normal balances.
Before the tokens move, a hook pulls the exact delivery amount out of the yield position — redeem, unwrap, unstake, depending on the protocol — and puts it in the maker's wallet. The default transfer then hands it to the taker. One transaction, fully atomic: the capital is only out of the protocol for the duration of the fill.
What the taker paid lands in the maker's wallet and is instantly re-deployed into the yield protocol — deposited, wrapped, staked. The wallet never holds an idle balance: the position never stops earning, even between fills.
interface ILendingAdapter { function name() external view returns (string memory); function exchangeRate(address underlying) external view returns (uint256); // the router executes this pull with its OWN allowance function pullPlan( address maker, address underlying, uint256 amount ) external view returns ( address token, uint256 count, address to ); function withdraw( address maker, address underlying, uint256 amount, uint256 yieldAmount, address recipient ) external; function deposit( address maker, address underlying, uint256 amount ) external;}Superposition also reaches into Uniswap v4. The SuperpositionUniAdapter turns a v4 concentrated-liquidity hook into a yield venue the Aqua router can back a position with — the same pull / withdraw / deposit surface, a different engine underneath.
Between swaps, 100% of the pooled tokens sit in ERC-4626 lending vaults — on Aave through its official waToken wrapper, created permissionlessly via the StataToken factory when one doesn't exist yet.
Every tick range is a bucket with its own ERC-1155 id. The maker holds the shares and approves the router as an operator; the router withdraws on the maker's behalf, one bucket per side.
A range fully below spot needs only token1, fully above only token0 — so a one-sided, out-of-range deposit is a real limit order, and it withdraws one-sided once the price crosses.
Exposed as an ILendingAdapter: the router JIT-withdraws the backing out of the hook to deliver a fill, then re-deposits the received revenue into the maker's buckets, all in one transaction.
The full source — router, opcodes, adapters, tests and the complete design decision log — is open.