Docs

How Wake works

Wake copies a stock portfolio from one Robinhood Chain wallet into another. It reads the stocks any wallet holds, turns them into weights, and asks your wallet to sign one transaction to Uniswap's router that buys the same mix. Wake has no contract, no account, no fee and no server that sees your keys. It is a page that builds transactions for contracts already on chain.

There are two ways to copy. Add dollars puts the USDG you choose into their proportions and leaves everything you already hold alone. Mirror makes your whole stock portfolio match theirs: it sells what they don't hold, trims or tops up what they do, and can add dollars on top.

Reading a wallet

A Robinhood stock token is an ERC-20, so a wallet's portfolio is its balanceOf in each of the 42 stock tokens that have a USDG pool on Uniswap v3. Wake asks for all of them in one call to Multicall3, then prices each at its deepest pool's current price (slot0). A raw balance becomes shares through the token's own uiMultiplier(), the way Robinhood's balanceOfUI does, so share counts match what the token reports.

Reads go through a small relay on this site (/api/rpc) that forwards read-only calls to Robinhood Chain's public node. It cannot sign or send anything; transactions go from your browser straight to your wallet.

From holdings to weights

  • Every position is valued at its pool price and sorted largest first.
  • Positions under 0.5% of the portfolio are left out; so is anything past the 12 largest, which is what fits in one transaction alongside a mirror's sales. The page names each one it leaves out and why.
  • The rest become integer basis points that sum to exactly 10,000, by largest remainder, so no copy is ever 99.99% of something.

Your match with a wallet is one minus half the sum of the differences between your weights and theirs: 100% means the same mix at any size, 0% means nothing in common. Cash is not a position.

The transaction

Every trade of a copy is an exactInputSingle on Uniswap's SwapRouter02, and all of them go into one multicall(deadline, [...]): sales first, paid to your wallet, then buys, paid for from it. Each carries its own amountOutMinimum, which is Uniswap's QuoterV2 quote less the price move you accept (0.5% unless you choose 0.3% or 1%). If any single trade would pay less than its minimum, or ten minutes pass before it is included, the router reverts and nothing moves.

The buys spend exactly what you put in plus what the sales are guaranteed to return (their minimums), never the rest of your wallet. Whatever the sales return above their minimums lands back in your wallet as USDG.

Before the trade, the router is approved for exactly the amount each token spends — not an unlimited allowance — so nothing is left standing when the copy lands.

What protects you

  • Robinhood's own price. 26 stocks have a Robinhood price feed on chain. Before you sign, each trade's price is compared with it; one more than 3% worse is left out of the copy and named. When the feed is old (the market is shut), the trade is allowed with a warning, because an old price proves nothing.
  • A simulation from your own address. The exact transaction is estimated against the chain before your wallet is asked, so a trade that would fail is explained instead of sent.
  • Fresh quotes. Quotes older than 20 seconds are asked again before sending.

Where the board comes from

Each Robinhood stock token logs about one transfer a second, mostly bots cycling between pools, so a list of every holder since launch is out of reach of a public node. What is cheap is the set of wallets that bought: when a Uniswap pool pays a stock out, the Transfer log's sender is the pool.

Wake read every such log in all 82 stock/USDG pools over the last 7 days — 308,112 buys by 5,650 addresses — then each buyer's balances. Addresses with contract code (pools, routers, bots) and anything with more than 1,500 buys a week are left out; what remains is ranked by the value of its stocks. The list is refreshed when the site is rebuilt (block 75,809,612, 29 Sep 2026); every value on it is read live when you look.

Every address

Wake deploys nothing. These are the contracts it reads and the one it asks your wallet to call, all on Robinhood Chain (chain id 4663).

Uniswap SwapRouter02 — the only contract you send to0xCaf681a66D020601342297493863E78C959E5cb2
Uniswap QuoterV2 — prices every trade0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7
Uniswap v3 factory — the stock/USDG pools0x1f7d7550B1b028f7571E69A784071F0205FD2EfA
USDG (Global Dollar, Paxos)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Multicall3 — batches the reads0xcA11bde05977b3631167028862bE2a173976CA11

Every stock token, its pool and its Robinhood feed are in markets.json, re-read from the chain each time the site is built.

How it is tested

The code that builds your transaction (js/follow.js and js/plan.js, the same files this page runs) is executed against live Robinhood Chain state with eth_simulateV1: test wallets are funded by state override, and each copy is sent to the real router and the real pools, then checked against balances and Transfer logs the test reads for itself — never by asking the code under test.

The last run: 9/9 properties and 33,372 checks passed against live state at block 75,827,197 (29 Sep 2026).

Then a sabotage sweep plants 20 bugs, one at a time, in copies of those two files — a price read upside down, an approval one leg short, weights that sum to 9,999, a mirror that ignores what you hold — and requires the property named for each one to fail. 20/20 were caught.

add$1,000 into their 4 stocks in one transaction, each within 0.00 points of their weight; the TSLA already held untouched13
mirrorsold TSLA to zero, rebalanced NVDA, bought AAPL/SPY/GLD: their weights within 0.10 points, cost 0.30%9
real$2,000 copy of 0xeD85…3D3A (5 positions) landed; within 0.01 points of its weights5
exact2 approvals, each exactly the amount spent; zero allowance left after the copy8
atomicone of 4 legs asking 1% more than its quote undid all 4; nothing moved6
guardNVDA 5% dearer than a fresh Robinhood price: left out and named; against a two-day-old price: warned, not refused8
wide16 trades (4 sales, 12 buys) in one transaction: 1,901,197 gas10
weights1,500 random portfolios: weights sum to exactly 10,000 bps, each within 1 bp of its exact share; overlap matches an independent formula28,811
arith1,500 random copies: buys add up to their budget to the unit; no leg without a minimum4,502

Risks

  • A wallet is not a strategy. Its balances say what it owns now, not why, for how long, or what it holds elsewhere. It may sell tomorrow; Wake will not follow it automatically.
  • Prices move. A copy fills at the pools' prices within the limit you chose, and a thin pool costs more to trade in size. The cost of every copy is shown before you sign.
  • Tokenized stocks are issued by Robinhood, which can pause or block them. Wake is not affiliated with Robinhood or Uniswap.
  • Nothing here is investment advice.