How NBBO works
NBBO is a router for Robinhood stock tokens. It reads every pool a stock trades in, on three venues, shows the best bid and the best offer, and fills an order across the pools that pay most, in one transaction.
What it is
A stock token on Robinhood Chain does not have one price. It trades in several pools at once, on Uniswap v3, Ramses v3 and Uniswap v4, against USDG and against ETH, at different fee tiers. Each pool moves only when someone trades in it, so the pools drift apart. Some are deep, some hold a few dollars, and some are empty shells that still answer a quote with an absurd number.
A wallet picks one pool. NBBO asks all of them.
The name
In the US equity markets the National Best Bid and Offer is the best price available across every exchange, and brokers owe it to their clients. Nothing on a chain enforces that. This router is the same idea made of contracts: the best bid and offer across every pool, and a fill that respects them.
The pools
The list of pools is built by a script that asks the factories of all three venues for every pair of a stock with USDG and with ETH, and keeps the pools that hold liquidity. The result is a file the site reads, universe.json. On the day this was written it held:
A token enters the list by its address only. Its symbol and name are read from the token contract, and it stays only if it has pools with liquidity.
Quotes
The router carries its own quoter. quoteMany(routes) runs the real swap against each pool and stops it inside the pool's callback, before any token moves, returning what the pool was about to pay. The number includes the pool's fee and every tick the order would cross. It needs no funds and no approval, and it does not trust an oracle.
Until the router is deployed the site runs the same code with an eth_call state override, so the quotes on the page are the router's arithmetic either way.
The board quotes a 1,000 USDG buy through every USDG pool of every stock, then sells the shares the best pool gave back through every pool. That gives a best offer and a best bid that are both executable, and a spread that includes fees. A pool counts as live if it fills the order within 50% of the best; the rest are listed as not live.
The split
The order is cut into ten equal parts. Every route is quoted at one part and at the whole order; routes more than 3% behind the best at both sizes are dropped. The rest are quoted at every size in between. Then the parts are handed out one at a time, each to the route whose next part adds the most. Pools are concave curves, so this is the best split available on that grid.
A route is one pool, or two pools when the order has to cross between ETH and USDG first. Two routes that share a pool are never combined, because each was quoted alone.
Often one pool is simply the best at every size, and the order goes there whole. That is a correct answer, and it pays no fee.
The fee
The fee is a tenth of what the split saved, and the saving is measured by the router, not claimed by the site. Before filling a split, the router quotes every route in it for the whole order and keeps the best as the baseline. After filling, the fee is 10% of what was received above the baseline. An order through one route has no baseline and pays nothing. A split that saved nothing pays nothing.
Measured on a fork of Robinhood Chain mainnet on 2026-09-21: a 113,278 USDG buy of TSLA split over three routes on Uniswap v4 and Uniswap v3, one of them crossing through ETH, filled 309.111 TSLA against a baseline of 308.526, a saving of 0.586 TSLA and a fee of 0.059 TSLA, in 1.57 million gas. The suite is 92 checks.
Resting orders
The book is a second contract. An order escrows what it sells and names the least it will accept. Anyone may fill it through the router with any routes once the pools can pay that much. The filler keeps the tip the owner set, at most 1%; everything else, including anything above the limit, goes to the owner. The owner can cancel at any time. After expiry anyone can send the escrow back to the owner.
An order is filled whole or not at all. The book keeps nothing for itself and takes no fee of its own; the router's rule on measured savings still applies to the fill.
Receipts
Every sweep emits one Swept event with the baseline, the fee and the amount received, and one RouteFilled event per route. The page at /r/<transaction> decodes them from the transaction's own logs and shows which pools filled the order and what the split saved.
Contracts
The router holds nothing between transactions. Pools are named by the caller, so the router treats every pool as hostile: it answers a swap callback only from the pool it is swapping with at that moment, once, and never pays more than that swap was given; it measures what it received by its own balance, not by what a pool reports; and every pool must take its whole share or the transaction reverts. The test suite includes three fake pools that try to overcharge, to call back twice and to keep the money. All three get nothing. A quote may burn at most 3 million gas per hop, so an empty pool whose price sits thousands of ticks away reads as zero instead of failing the whole batch.
The guardian can do one thing: propose a new fee address, which takes effect after 48 hours. There is no function that changes the fee rate or takes funds out.
$NBBO
$NBBO is the router's coin on Pons. It has no rights over the router or the book.
Risks
- A quote is a reading of one block. Prices move before the fill. The minimum you sign is what protects you; the site sets it half a percent under the quote.
- The pool list is a snapshot. A new pool is invisible until the next scan, and a drained pool is simply skipped.
- Stock tokens are issued by a third party and can stop trading.
- The contracts have been tested on a fork, not audited by a third party.
FAQ
Why would I pay a fee at all?
You only do when the split beat the best single pool, and then you keep nine tenths of the difference.
Can I use it just to find the best pool?
Yes. The board and the bench are free to read, and a single-route order through the router costs nothing but gas.
Does it work with ETH?
Yes, native ETH in and out. The router wraps and unwraps as the pools need, and can cross between ETH and USDG on the way.
Who can fill a resting order?
Anyone. A keeper needs no permission, only the routes.
