How Firth works
Robinhood Chain carries tokenized stocks: ERC-20 tokens, issued by Robinhood, that track shares of listed companies. They trade against USDG in Uniswap pools, and most of them trade in several at once: up to four Uniswap v3 fee tiers and a number of Uniswap v4 pools, each with its own fee and its own depth. At block 75,831,420 there were 227 usable pools across 45 stocks, and NVDA alone traded in 12.
Firth is a web page. It quotes every one of those pools for your order, splits the order where it fills best, and builds one transaction for Uniswap's own Universal Router. It deploys no contract, holds no tokens, runs no server that touches your order, and charges no fee.
How the split works
Each pool's output is a curve: the more you put in, the less each extra dollar buys. Firth asks Uniswap's quoters (QuoterV2 for v3, V4Quoter for v4) what each pool pays at a ladder of sizes: halvings from 1/128 of the order up to 1/8, then eighths up to the whole. Those points make every pool's curve.
Then it water-fills: the next piece of the order goes to whichever pool pays the most for it, piece after piece, until the order is placed. At the end, every pool that was used is filled to the same marginal price, which is what an optimal split means. The finest rungs matter: a small pool can often take the first few hundred dollars of a large order more cheaply than the deep one, and equal slices of a big order are too coarse to give it that.
The legs are then quoted again at exactly the amounts that will be sent. If the split does not beat the single best pool, Firth sends the single best pool. It never does worse than one pool.
The transaction
One call to UniversalRouter.execute(commands, inputs, deadline), with a deadline twenty minutes out:
- PERMIT2_PERMIT (only when needed): your signed Permit2 allowance letting the router pull exactly this order's input, expiring in one hour.
- V3_SWAP_EXACT_IN, once per v3 pool used: that leg's input, that leg's minimum output, paid from your wallet through Permit2, output sent to you.
- V4_SWAP, once, carrying every v4 leg: a
SWAP_EXACT_IN_SINGLEper pool, each with its own minimum, thenSETTLE_ALL(capped at the v4 legs' total input) andTAKE_ALL(at least the sum of their minimums) to you.
Each minimum is that leg's quote less your slippage limit (0.3%, 0.5% or 1%). If any pool would pay less, the router reverts everything: you keep your tokens and pay only gas. Before your wallet is asked, the page runs the exact transaction against the chain from your address with eth_estimateGas; a transaction that would fail is explained instead of sent.
What your wallet asks
The first time you trade a token, one approval lets Permit2 move it (Permit2 is Uniswap's allowance contract, the same one the Uniswap app uses). Each trade then needs one EIP-712 signature (token, exact amount, one-hour expiry, the router as spender) and one transaction. While an earlier signature still covers the order, only the transaction.
Which pools
- Every Uniswap v3 pool pairing the stock with USDG at the 0.01%, 0.05%, 0.3% and 1% tiers that has liquidity at the current price.
- Every Uniswap v4 pool pairing the stock with USDG that has no hook and a fee of 1% or less. Found from the PoolManager's
Initializeevents, filtered on both currencies.
Two kinds are left out on purpose. A v4 pool with a hook runs that hook's code during your swap; Firth has not read it, so it does not route through it. And some pools here charge fees of 50% to 90% and still quote happily; a fee cap keeps them out. A pool with no liquidity in range is dropped before quoting, since the quoter would walk its whole tick space.
What was measured
At block 75,831,420 (2026-09-29 17:21 UTC), for every stock and three order sizes, tools/scan.mjs ran the page's own split (the same js/route.js) against the chain and compared it with the single best pool, and with the best v3 pool alone. The table on the front page is that run. At $50,000 the split was used for 41 of 44 stocks; the median gain over the best single pool was 22.2 bp, and over the best v3 pool 22.7 bp.
At $50,000 the split beat the best single pool on 41 of 44 stocks. It barely matters on the deepest names, where one pool takes almost everything: NVDA, META, QQQ, GLD and 1 others gain under half a basis point. It matters most where the depth is spread across pools: 22 stocks gain 20 bp or more, led by MRNA (63.5%), NET (40.5%), JNJ (20.2%). On those, $50,000 is more than any one pool holds: the split stops the order draining a single pool dry, but the fill is still far from the listed price.
These are quotes, not fills: they are what Uniswap's quoters said the pools would pay at that block. The app re-quotes before every trade.
Tests
tools/test.mjs runs real trades against live Robinhood Chain state without broadcasting anything (eth_simulateV1 with a funded test wallet): buys and sells through the router exactly as the page builds them, split and unsplit, with and without a Permit2 signature. Result: 10/10 properties, 134 checks, at block 75,835,929. They check that each trade delivers at least its minimum, that the router keeps nothing, that the input spent is exactly the order, that every leg's floor really refuses a worse fill, and that the split matches an independent reference split that knows nothing of the page's maths.
tools/e2e.mjs drives the real page in a browser with a test wallet whose transactions execute the same way: 7/7.
Risks
- The tokens are Robinhood's. Robinhood can pause any stock token, block addresses, and burn balances. Their value depends on Robinhood and on the listed share.
- Pools are not the stock market. A thin pool's price can sit away from the listed share's price, and weekend or overnight quotes can drift. The app shows the Robinhood feed beside the pool price where a feed exists.
- Slippage. Your limit is per pool leg. A 1% limit allows each leg to fill up to 1% under its quote.
- Contracts. Firth relies on Uniswap's Universal Router, Permit2, v3 and v4 pools. They are audited and widely used, not risk-free.
- This page. A page can be changed. Read what your wallet shows before you sign: the spender of a Firth permit is always the Universal Router at
0x8876…0904, and every trade is a call to it. - Not financial advice. Nothing here recommends buying or selling anything.
Contracts
All of them are Uniswap's or Robinhood's, already on Robinhood Chain (chain id 4663). None is Firth's.
| Uniswap Universal Router (executes every trade) | 0x8876789976dEcBfCbBbe364623C63652db8C0904 |
| Permit2 (the one-hour allowance) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
| Uniswap v4 PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| Uniswap v4 Quoter | 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94 |
| Uniswap v4 StateView | 0xF3334192D15450CdD385c8B70e03f9A6bD9E673b |
| Uniswap v3 QuoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 |
| Uniswap v3 factory | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| USDG (the dollar side) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Multicall3 (reads) | 0xcA11bde05977b3631167028862bE2a173976CA11 |