
Orbital
One pool for every stablecoin: a Uniswap v4 hook pricing N stables on the Orbital sphere curve
Demo
About
Orbital is a spherical AMM built as a Uniswap v4 hook, from Paradigm's Orbital paper (2025). USDC, USDT, DAI and FRAX all trade out of one shared book instead of six shallow pairs, LPs concentrate their capital in the price band they choose, and on Circle's Arc the same engine runs stablecoin FX between dollar and euro stablecoins at the Chainlink rate. The problem Stablecoins all target one dollar, yet they trade in pairs. Four coins need six pools, each with its own shallow depth, and every quote draws on a fraction of the capital. Curve holds many coins in one pool but spreads liquidity flat across prices a stablecoin never reaches. Uniswap v3 concentrates liquidity properly, then caps you at two tokens. And when one coin depegs, a flat pool passes the loss to every LP in it. The idea Orbital changes the shape of the curve. Uniswap prices two tokens on a hyperbola. Orbital prices any number of tokens on a sphere, where every coin in the pool trades against every other on one curved surface. - Sphere: the pool's reserves are a point on an N-dimensional sphere. At the peg every coin trades 1:1, and the curve only bends as the basket drifts off peg. - Ticks: each LP picks a slice of the sphere, bounded by a depeg price such as $0.99. That is the concentration: capital sits where stablecoins actually trade. - Torus: all ticks fold into one shape the pool tracks with a few running totals, so a swap costs the same however many coins or positions exist. What it gives you - More than two tokens in one pool. Four coins need one pool instead of six, and every pair draws on the same depth. Adding a fifth coin adds a dimension, not a new set of pairs. - Low slippage. Depth concentrates in the narrow band around $1 where stablecoins change hands. On a live $5M pool, a $1k swap costs 1.07 bps and a $100k swap 7.9 bps, fee included. - Capital efficiency. An LP deposits only the part of a position that can ever be traded, so each dollar does the work of many: up to ~154x the effective depth of a flat pool at five assets, per the paper. - Your own range. Each LP picks the depeg band their capital covers and earns fees on every pair at once. - Depeg isolation. When a coin breaks peg, only the positions that chose to cover that range take the move, and everyone else keeps trading at the peg. - Real stablecoins. 6-decimal USDC and USDT and 18-decimal DAI and FRAX share one pool, with every conversion rounding in the pool's favour. - Stablecoin FX. Dollar and euro stablecoins trade in one book at the Chainlink rate. - One hop to anything. Every stablecoin is a single hop from any other, which makes the pool cheap to fill against across chains. Where it runs - Circle's Arc: a four-stablecoin pool, and an FX pool that trades USDC and USDT against EURC and EURe at the Chainlink EUR / USD rate, with gas paid in USDC. - Unichain Sepolia and Arbitrum Sepolia: the stablecoin pool on canonical Uniswap v4, connected by cross-chain swaps through ERC-7683 orders. - The Graph: three subgraphs index the pools, and the orbital-mcp server lets Claude, Cursor or any MCP client ask about pool health and risk in plain language. The app - Swap: any stablecoin for any other, routed to the best pool that holds both, or across chains in one order. - Pools: every pool with its network, address, 24h volume and TVL. Each pool page shows reserves, liquidity depth by price and, for the FX pool, live oracle rates. - Add liquidity: pick a depeg band and an amount, and the deposit splits across every token at the pool's current ratio. - Positions: every position across all pools at its real value, to add to, withdraw from or collect fees. - Transactions: swaps, deposits, withdrawals and fee claims across every pool. Live today Four pools on three chains, each seeded with $5M of test liquidity across six bands whose depth tapers away from the peg plus a full-range position, with independent LPs, swaps, fee collection and withdrawals running on top.
How it's made
Orbital ports the full math of Paradigm's Orbital paper into a single Uniswap v4 hook that takes over pricing for a whole basket of stablecoins, while Uniswap v4 keeps doing custody and settlement. One hook, one book A v4 pool always has two tokens, so the four stablecoins are registered as six v4 pools, one per pair, and every PoolKey points at the same hook. Those pairs are only views: behind them the hook keeps one shared reserve vector, so a trade on USDC/USDT and a trade on DAI/FRAX move the same reserves and the same price. The PoolManager holds the tokens and the lock; the hook holds the curve, the positions and the fees, and settles through ERC-6909 claims. beforeInitialize accepts only pools made of the hook's registered assets. From the outside each pair is a normal v4 pool, so any v4 router and the V4Quoter work with it unchanged. The swap flow 1. The trader picks two stablecoins. The app quotes every pool that holds both through the V4Quoter and picks the best price. 2. The router asks the PoolManager to swap on that pair's pool, and the PoolManager calls the hook's beforeSwap. 3. The hook converts the input to its internal units, takes the fee, and prices the trade on the Orbital curve against the shared book of every asset. 4. If the trade moves prices past a position's band, the hook crosses that position, sets its liquidity aside, and prices the rest of the trade on the positions still in range. 5. On the FX pool, the hook also checks the new price against the live Chainlink EUR / USD rate. 6. The hook updates the shared reserves and returns a BeforeSwapDelta with the exact input and output. 7. The PoolManager settles that delta: the trader pays the input and receives the output, and every balance nets to zero before the transaction ends. v4's constant-product math never runs. The liquidity flow Native v4 liquidity is turned off with beforeAddLiquidity and beforeRemoveLiquidity, so every position is created by the hook itself. 1. The LP picks a pool, a depeg band (for example 0.99) and an amount in dollars. 2. The app asks the hook's depositAmounts for the exact deposit of each token at that band and sizes the position to the chosen amount. 3. The LP calls addLiquidity on the hook with the band, the size and a maximum for each token. 4. The hook unlocks the PoolManager on the LP's behalf and computes the position's share of the book, leaving out the virtual part below the band's floor. 5. It pulls each token from the LP into the PoolManager, confirms every amount arrived in full, and adds the position to the curve as its own tick. 6. It mints the LP an ERC-6909 share, and the position earns fees on every pair from that moment, tracked per position the same way as Uniswap v3. 7. Through the same hook, the LP can later collect fees, add to the position, or withdraw part or all of it. What happens inside - Bands and depeg isolation. Each position is a tick, active only while every coin trades above the depeg price its LP picked. As a swap moves prices, the hook walks it across tick boundaries one at a time; a tick whose band is crossed steps out and its liquidity is set aside, so a depeg is absorbed only by the positions that chose to cover it. The last active tick always stays in range, so the pool always keeps a live curve. - Virtual reserves. Inside a band, the reserves below its floor can never be traded out, so the curve prices on them but the LP never deposits them. The LP pays only for the part of the position that can move, and the narrower the band, the more depth each dollar buys. This is where the capital efficiency and the low slippage come from. - Running totals. Instead of looping over every position, the hook folds all ticks into a handful of running totals, so a swap costs the same whether the pool holds four coins or ten, and one position or a hundred. - Decimals. Every token is converted to the same internal units at the edge of the pool, so 6-decimal USDC and 18-decimal DAI share one curve, and every conversion rounds in the pool's favour. Stablecoin FX on Arc OrbitalFXHook reuses the whole engine and adds an oracle step. Each euro asset's value is set at the Chainlink EUR / USD rate when the pool is created, so dollars and euros share one stable-swap curve around that rate. On every swap the hook reads the live Chainlink rate through AggregatorV3 and accepts the trade only if the pool's new price stays within 50 bps of it and the rate is fresh; deposits and withdrawals never depend on the oracle. Its bands run from 0.5% to 10% around the rate. On Arc the hook deploys together with its own v4 core, and the same scripts target Arc mainnet's canonical v4 and Chainlink feed through environment variables. Cross-chain An ERC-7683 settler escrows the user's input on the origin chain. A filler pays the user on the destination chain, swapping through the local Orbital pool if they hold a different stablecoin, and a Hyperlane message from the destination settler releases the escrow to the filler once the origin verifies it came from its registered peer. Because every stablecoin shares one book, a filler needs inventory in only one asset per chain, and an unsettled order refunds after its deadline. Indexing and AI One subgraph manifest indexes all three chains. At every swap, deposit and withdrawal, the handlers read the pool's live state and store how far each position is from its band, its share of the pool, and each swap's realised cost, which makes the feed a leading indicator of the next crossing. The orbital-mcp server queries all three subgraphs together and turns that into answers: it scores each position by how close it is to its band times how much liquidity would leave with it, and tells an agent which pool is healthy, which position crosses first, and what trades really cost. How it compares Uniswap v3 concentrates liquidity but only for two tokens, so a basket of stablecoins splits into many shallow pairs. Curve and Balancer hold many coins but spread liquidity flat, and a depeg is shared by every LP in the pool. Orbital holds any number of coins in one book, concentrates depth at the peg, lets each LP choose their own depeg range, isolates a broken coin, and runs as a Uniswap v4 hook, so it plugs straight into v4's routers, quoters and settlement.