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 to | 0xCaf681a66D020601342297493863E78C959E5cb2 |
| Uniswap QuoterV2 — prices every trade | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 |
| Uniswap v3 factory — the stock/USDG pools | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| USDG (Global Dollar, Paxos) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Multicall3 — batches the reads | 0xcA11bde05977b3631167028862bE2a173976CA11 |
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 untouched | 13 |
| mirror | sold 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 weights | 5 |
| exact | 2 approvals, each exactly the amount spent; zero allowance left after the copy | 8 |
| atomic | one of 4 legs asking 1% more than its quote undid all 4; nothing moved | 6 |
| guard | NVDA 5% dearer than a fresh Robinhood price: left out and named; against a two-day-old price: warned, not refused | 8 |
| wide | 16 trades (4 sales, 12 buys) in one transaction: 1,901,197 gas | 10 |
| weights | 1,500 random portfolios: weights sum to exactly 10,000 bps, each within 1 bp of its exact share; overlap matches an independent formula | 28,811 |
| arith | 1,500 random copies: buys add up to their budget to the unit; no leg without a minimum | 4,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.