Docs

Everything, in the open.

One contract, Robinhood’s price feeds and USDG. Here is exactly what each does.

The rules

A pool is three things: a price feed, a lock instant and a close instant. Until the lock anyone may put USDG on UP (the feed’s price at the close will be above its price at the lock) or DOWN (below). At least 1 USDG; as many calls as you like, on either side.

  • UP or DOWN wins: every winner collects stake × whole pool ÷ winning side, rounded down to the unit (a millionth of a dollar).
  • Same price at both ends: everyone gets their stake back.
  • Nobody on one side: everyone gets their stake back, without the feed being read at all.
  • Nobody settles within seven days of the close: anyone can refund the pool.

The contract accepts any window from one hour to 90 days, locking up to 90 days ahead. The board offers two, so that everyone calling a stock lands in the same pool: the week (Friday 20:00 UTC to the next Friday 20:00) and the next trading day (one weekday’s 20:00 UTC to the next weekday’s).

The price feeds

Robinhood runs a Chainlink-style feed for each tokenized stock on Robinhood Chain. Vane lists the 25 stocks whose feed answers at 8 decimals and records its updates in time order (checked at block 80,163,058). They publish when the price moves by about half a percent: the median move between two updates is 54 basis points.

StockFeedUpdates / trading dayPools
MSTR Strategy0x2521a77F42098357e83bDea7fBb2A38745bf928056.6week + day
SNDK Sandisk0xd1016D9Da414B13D55abe02221A8A145eB89aA0D52.4week + day
CRCL Circle Internet Group0x025Ba3B3569Ca7d15Da7BFC1648F13F06A07285147.2week + day
INTC Intel0x127B1DeDeE6269E962a59E6C1295b4002c56c40345.7week + day
MU Micron Technology0x5b40F4E78FA58B60a4F59b8cc8cB8d2Fb069046744.3week + day
USO United States Oil Fund0x6D054DECb74Cf8ef3675B0Abc100e02921176EdF39.3week + day
USAR USA Rare Earth0x451B1295aA84FD6d6b58af1a5002eA1b1A1913A039.3week + day
DELL Dell0xe9B94828424a8Efe6e773c28AB5Fd486851867c829.5week + day
AMD AMD0xF6d57763DFa625F4A413485261Ab2E71Ff4304CF27.8week + day
GME GameStop0x42A4652D447A5B0bccF3B265bE8530b85A33b3A225.3week + day
SLV iShares Silver Trust0xdA81cD9c76F1D3Ea32655dfFc7408ef22BB0Ee2a19.7week + day
SPCX SpaceX0x42a95341ff361e81fd934F39943c5C98F699184418.2week + day
PLTR Palantir0x8cd1DFC0fc61fcA55FA77b37e008A90f13364Fce17.9week + day
TSLA Tesla0xE4479F01738B4e8C428CD8eB72D47AB9BC3c7de617.9week + day
ASML ASML Holding0x3eFBba343e2b1cF9ed4d4D5768e20B70307Aa8c914.8week + day
META Meta Platforms0x5cBC53D382E56cBb223f118CF8Eefb6c9c2759f514.4week + day
GOOGL Alphabet0xA04EE5c4c8827F17e82f93bE9e19DeA221A749a811.6week + day
NVDA NVIDIA0xCF169363636D73dbBf77733629CB38919d14232d11.4week + day
TSM TSMC0xB48D6D5729Ca032ca43729F4b605bBf9f257A84d9.4week + day
MSFT Microsoft0xaD6D88eab22aa4867Efe807a5311Ed64962f740D9.1week + day
AMZN Amazon0x9244830430bC7D9C9A48dd47603F24AD61f7c56e8week + day
AAPL Apple0x4bDbb3150014c6Ab2C6D9347B0779c49015a2f3f5.7week + day
GLD SPDR Gold Trust0x470A51258068043bd43dC0a56245625C9fE86eB04.6week + day
QQQ Invesco QQQ0x41ed2c58611790af0760e31e80Bb427e4e83D6034.1week + day
SPY SPDR S&P 500 ETF0xa68CA83408bE3f78d1c58a82081c619e9d21486d1.6week

SGOV, a Treasury fund, is left out: its feed moves about 1 basis point per update, nearly always upward, so “up” is not a call anyone could lose.

Settling: proving the price at a second

Every feed update is a round with an id, an answer and updatedAt — the time of the block it landed in (measured: on these feeds updatedAt equals the block timestamp of the update). The price at instant t is the answer of the last round that landed at or before t.

Whoever settles names that round for the lock and for the close. The contract (priceAt) checks it: the round landed at or before t, and the round after it landed after t or does not exist yet. When a feed moves to a new aggregator (a new “phase”), the last round of the old phase stays in force until the first round of the new one — the contract checks that too. The app finds the rounds by bisecting the feed’s history; you never type one.

The contract

Vane.sol, Solidity 0.8.26, 5.8 KB of runtime code. It is deployed through Arachnid’s deterministic deployer, so its address is fixed by its code before anyone deploys it: 0x7632cCF9704B093362629592c4Be49503dff02ce. The first person to make a call sends that deployment; nobody holds a key to it afterwards.

  • predict(feed, lock, close, up, amount) — call a side before the lock. The first call opens the pool and checks the feed answers with a positive price.
  • settle(feed, lock, close, lockRound, closeRound) — anyone, after the close.
  • claim(key, who) — anyone; pays who.
  • abandon(feed, lock, close) — anyone, seven days after an unsettled close: everyone refunded.
  • permitUsdg and multicall — so a first call is one transaction (a USDG permit and the call), and collecting is one transaction (settle every pool, then claim each).

No owner, no fee, no upgrade, no pause, no other token. Read the source: Vane.sol (the exact file this site compiles), and its address on the explorer.

What was tested

The last run (01 Oct 2026): 16/16 properties and 9,738 checks. Each property installs this exact build at its published address and runs it with eth_simulateV1 against live Robinhood Chain state — the real USDG, the real feeds, the real deployer — from test wallets with real keys, so permits are real signatures. Prices the tests need to move come from a mock with the behaviour measured on Robinhood’s feeds; P9 and P16 use the real feeds. Nothing is broadcast.

#PropertyChecks
P1The page’s deploy transaction puts exactly this build at the published address6
P2UP wins: winners share the whole pool pro rata, to the unit; losers get nothing38
P3DOWN wins, including a caller on both sides27
P4A tie (same price at lock and close) gives everyone exactly their stake back26
P5A pool with nobody on one side refunds without reading the feed18
P6Settling names the round in force at each instant — no earlier, no later; a non-positive price is refused35
P7A feed that changes phase: the last round of the old phase is in force until the new phase’s first37
P8Every guard on calling and settling refuses at its edge and allows one unit inside it36
P9On Robinhood’s real feeds, priceAt agrees with the definition at(r) ≤ t < at(r+1)476
P10A first call needs no approval: a real USDG permit and the call go in one transaction11
P11Anyone may deliver a winner’s payout, and it always goes to the winner14
P12A pool nobody settles refunds after exactly seven days, and then cannot be settled19
P13Collect: one transaction settles, abandons and claims several pools for a wallet19
P14Random pools against the test’s own arithmetic: every payout pinned by two inequalities126
P15The page’s schedule, keys and payout arithmetic match the contract and the calendar8,834
P16A whole pool on a REAL Robinhood feed, settled with rounds the page found16

Then a sabotage sweep plants 38 bugs one at a time — in the contract (an inverted outcome, a payout one unit too large, a round accepted one second late, a claim that pays whoever delivers it) and in the page’s own code (a permit for the wrong spender, a lock at the wrong hour, settle rounds swapped) — and requires the property named for each to fail: 37/38 caught, 1 declared untestable with the reason written down.

The browser run: 8/8 journeys (38 checks) clicked through the real pages in Chrome — deploy, call with a permit, a second wallet on the other side, the week passing, collect — against a private copy of the live chain (02 Oct 2026).

Risks

  • Not audited. The contract is short and tested, but nobody independent has reviewed it.
  • The feed is the truth. If Robinhood’s feed reports a wrong price, pools settle on the wrong price. If it stops reporting, a pool may tie or, after seven days, refund.
  • Odds move until the lock. What a call pays depends on the final split, which later calls change.
  • You can lose everything you put on a call. Check that prediction pools are lawful where you live.

Addresses

Vane0x7632cCF9704B093362629592c4Be49503dff02ce
USDG (Global Dollar, Paxos)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Arachnid’s deterministic deployer0x4e59b44847b379578588920ca78fbf26c0b4956c
Multicall30xcA11bde05977b3631167028862bE2a173976CA11