Robinhood Chain · Uniswap v3 and v4

One order,
every pool.

A tokenized stock here does not trade in one place. NVIDIA trades in 21 separate Uniswap pools, and every one of them is shallow on its own. Braid works out how to divide your order across all of them at once, and sends it as a single transaction.

Open the app How it works

Braid deploys no contract of its own. Every order is one call to Uniswap's own Universal Router, signed by you, from your wallet.

A $250,000 order for NVDA

measuring…

Reading the chain…

The problem

The liquidity is real. It is just not in one place.

Uniswap runs two versions on this chain, each with several fee tiers, and anyone can open another pool at any time. The result is that one share has many markets, none of them deep.

Stocks listed
each with a Morpho market against the real dollar and a Uniswap pool holding liquidity
Pools behind them
across Uniswap v3 and v4
Most pools for one stock

Send the whole order to the deepest pool and you pay for depth that is not there: the price walks away from you while the liquidity sitting in the other pools goes untouched. The bigger the order, the worse the difference.

How it works

Push every pool to the same marginal price.

Money should keep going into a pool only while that pool is still the best home for the next dollar. At the best split, the next dollar would buy the same number of shares wherever it went.

1

Read the pools

Braid reads each pool's price, liquidity and tick data straight from the chain — v3 pools directly, v4 pools through Uniswap's StateView — pinned to one block, so every pool is priced at the same instant.

2

Solve the split

Uniswap's swap arithmetic runs locally, exactly — the same tick walk the pool itself does. That makes pricing a candidate split free, so Braid searches for the finishing marginal price that spends the order exactly, and reads the division off it.

3

Send it once

One Permit2 signature, one transaction. The order is pulled into the Universal Router once, each leg swaps from there, and a final sweep pays you — reverting unless the total clears your minimum.

The minimum is on the total, not on a leg

Every leg is sent with a floor of zero and the only floor is the last command. That is the right shape for a split, not just a convenient one: with per-leg minimums, one pool drifting between quote and mine would fail the whole order even when the other legs had already made the difference up. You are protected by exactly the promise you were shown — this many shares, or nothing.

It knows the edge of what it knows

Braid reads a window of tick data around each pool's price. An order that would walk past the last tick it read is not guessed at — that pool is dropped from the split and said so. A simulator that quietly treats the edge of its data as the end of the liquidity reports a deep pool as a shallow one.

Checked, not asserted

The arithmetic agrees with Uniswap's own, to the wei.

Against the real quoters

Every pool Braid lists is quoted through Uniswap's own QuoterV2 and V4Quoter and compared against the local simulation, at sizes that cross many ticks, in pools of both orientations. Equality is required exactly — not to a tolerance.

Being close is not good enough here. Stepping to the next initialized tick instead of to the next bitmap word — which is what the pool really does — was wrong by 38,343 units on a $50,000 order. Small enough to look like rounding, big enough to pick the wrong split.

And where it has no data, it says so

Braid reads enough of each pool to cover a 50% move in its price. A swap that would walk past that is not answered at all — the pool is dropped from the split and the page says why.

In the last run quotes were refused on those grounds. A simulator that treated the edge of its data as the end of the liquidity would have answered every one of them, confidently and wrongly.

Simulator vs Uniswap's quoters
comparisons that matched exactly
Checks on those comparisons
both pair orderings, both Uniswap versions, ticks crossed

These come from data/sim-tests.json, written by the run itself, against the live chain at one pinned block. A dash means no completed run has been recorded — not a zero, and not a number nobody measured.

Not done yet, and so not claimed

Three things are missing. A fork run that executes the calldata against the real Universal Router and compares the tokens that arrive with the tokens that were promised — the suite exists (tools/test-route.mjs) and has passed, but no run completed cleanly on the day this was published: Robinhood's node serves a block's state for only minutes, a fork fetches it lazily, and the runs died of that rather than of anything Braid did. A sabotage sweep, which breaks the builder in known ways and requires the suite to notice. And a click-through driving this page in a real browser. Until they are recorded there is nothing honest to put in their place, so there is nothing in their place.

What Braid does not do

Plainly

It does not custody anything, and it cannot: there is no Braid contract. It cannot protect you from a pool moving between the moment you sign and the moment your transaction lands — that is what the minimum is for. It routes only through pools with no hook attached, because a hooked pool can change what a swap does at swap time and the arithmetic here would no longer be the whole truth.

It is also not a price oracle. Braid shows what the pools will actually pay you for the size you are trading, which is often not the number a price feed shows.