CUTOFF
A stock pool on Robinhood Chain where every order fills at the next Chainlink print. Nobody trades on a price the pool has already seen, so the trade that drains ordinary stock pools cannot be made here.
What it is
Robinhood Chain carries real tokenized stocks, and each one has a Chainlink feed that publishes a new price whenever the market moves about half a percent. On an ordinary pool, that publication is the moment a faster trader buys at the old price and sells at the new one. The pool pays for the difference.
CUTOFF removes the moment. An order is locked when it is placed and priced at the first print published after it. Waiting orders on opposite sides are then matched against each other at that price, so most volume never touches anyone's inventory at all.
The rule
- Orders fill at the next print. The settlement round must be the first one published after the order; the round before it is checked too, so a later, more convenient price cannot be picked.
- Orders cannot be cancelled. A cancellable order is a free option on the next price, which is the same leak by another name.
- Orders fill each other first. A plain order is matched only against other orders. The pool becomes a counterparty only if the order asked for it.
- What is left rolls. The unmatched part stays open and takes the print after that.
How a fill happens
Anyone can settle. The caller passes the waiting buys, the waiting sells and the round to settle at:
settleBatch([buyIds], [sellIds], roundId)
Both sides are valued at that print. Whatever the two sides have in common is exchanged directly: the buyers' USDG goes to the sellers, the sellers' stock goes to the buyers. The pool's own reserves do not move, they only collect the fee. The remainder of the larger side stays open.
The first one, on chain
A buy and a sell were placed on Robinhood Chain and left to wait. The next print came 118 minutes later at 229.11705, and this is what the settlement did:
| Side | Paid | Received | Effective price |
|---|---|---|---|
| Buy | 1.247092 USDG | 0.005440315332272303 NVDA | 229.2316, the print plus 5 bps |
| Sell | 0.005443036850697651 NVDA | 1.246469 USDG | 229.0025, the print minus 5 bps |
The pool held 1.250845 USDG and 0.005443040065119613 NVDA before the settlement, and 1.251344 USDG and 0.005445217279859892 NVDA after it. It gained 0.000499 USDG and 0.000002177214740279 NVDA, which is the fee and nothing else. No inventory was lent to either side, because the two traders were each other's counterparty. The unfilled remainder, 0.003751 USDG on the buy, was not returned and not cancelled: it stayed open for the print after that.
Settlement 0xf9a7a411, the buy 0xa5a00706, the sell 0x237f1a47.
What we measured
Three days of real swaps on Robinhood Chain, bucketed into thirty minute windows, the same rhythm as the feed:
| Pool | Windows with both sides | Volume that nets out |
|---|---|---|
| NVDA / USDG | 100% | 86.5% |
| SPY / WETH | 100% | 85.6% |
| GLD / USDG (thin) | 13% | 45.7% |
So on the liquid names, most flow can be filled without a market maker taking the other side. A replay of thirty prints with buyers and sellers in every window ended with the provider's balances higher on both sides, the increase being the fee.
Fees and the bounty
Each fill takes 0.05% of the input. Four fifths stays with the pool, which is what a liquidity provider earns. One fifth goes to whoever sent the settling transaction, which is what pays for someone to press the button. There is no protocol fee and no owner.
Using it
Trading
- Open the app and connect a wallet on Robinhood Chain.
- Choose a side, enter an amount, place the order. The input leaves your wallet immediately and is held by the contract.
- At the next print, an opposite order or a keeper settles it. Your fill appears in the table with the round it used.
Providing liquidity
- Deposit both sides in the pool's current ratio. Shares are pro rata and can be withdrawn at any time.
- You earn the fee on every fill that touches the pool, and on the fee kept from matched orders.
versusHolding(address)returns your position's value and the value of simply holding what you deposited, so the comparison is on chain rather than in a brochure.
Contract reference
One contract, no owner, no upgrade path. Source: Cutoff.sol.
| Function | What it does |
|---|---|
submit(bool usdgIn, uint256 amountIn) | Places an order that fills only against other orders. |
submitTo(bool usdgIn, uint256 amountIn, bool poolMayFill) | Same, but may also be filled by the pool when nobody takes the other side. |
settleBatch(uint256[] buys, uint256[] sells, uint80 roundId) | Matches the two sides at that print. Pays the caller a fifth of the fee. |
settle(uint256 id, uint80 roundId) | Fills one order from the pool's reserves. Reverts with OrdersOnly() unless the order allowed it. |
addLiquidity(uint256 usdg, uint256 stock, uint256 minShares) | Deposits both sides and mints shares. |
removeLiquidity(uint256 shares, uint256 minUsdg, uint256 minStock) | Burns shares and returns the pro rata reserves. |
versusHolding(address) | Position value and the value of holding the same deposit, both in USD with 18 decimals. |
orders(uint256) | owner, usdgIn, poolMayFill, amountIn, submittedAt, closed, roundId, amountOut, filledIn. |
Errors
NotFirstPrintAfterSubmission()the round is not the first print after the order.NothingToMatch()the two sides have nothing in common at that print.OrdersOnly()the order did not allow the pool to fill it.AlreadyClosed(),BadOrder()the order is finished or the side is wrong.
Running a matcher
Settling is open to anyone and pays a fifth of the fee. The repository ships a small one that reads the chain with plain JSON-RPC and sends with cast:
RPC_URL=https://rpc.mainnet.chain.robinhood.com \
POOL=<pool address> KEEPER_KEY=<private key> node keeper.mjs
It groups the open orders into buys and sells, calls settleBatch at the latest print, and then fills anything left over that opted into the pool.
Limits and risks
- Inventory still drifts. Filling at the print removes the stale-price loss completely. It does not remove ordinary market making risk: when flow is one sided the pool ends up holding more of one token, and a replay of one rising month left a provider 725 USD behind simply holding, on a 42,627 USD position. Zero pick-off is not zero risk.
- Thin books. On names where only one side shows up, matching does little and orders sit.
- The stock tokens are Robinhood's. They can be paused, and balances can be burned by the issuer. That power sits outside this contract.
- The feed is Chainlink's. If it stops publishing, orders wait. Prices freeze outside market hours.
- No cancels. Once placed, an order is committed until it fills.
Verify it yourself
forge testruns the suite, including the netting tests and the replay that checks a provider's balances after thirty prints.- The fork test settles against the real NVDA token, USDG and the real feed on Robinhood Chain.
- The netting measurement is a small script over real swap logs; the numbers in this page come from it.
- Every fill emits
Settled(id, roundId, price, amountOut, fee, settler), so any claim here can be checked against the chain. - The pool is live on Robinhood Chain at
0xbfdA9d13ca8d8Eb73491cD36BDfA42411C2bD6FD, with the source verified on the explorer. The code you read there is the code that holds the money.
CUTOFF