how it works
swaps go in. 1% stays. stocks come out.
$POP trades against ETH in one Uniswap v4 pool on Robinhood Chain. A hook, the cap, takes 2% of every swap inside the pool, buys and sells alike. The crate is the holders' pool of ETH: anyone can pour ETH into it. The crate credits that ETH to every holder in proportion to their $POP balance. Each holder picks a ticker. When they pop, their accrued ETH is swapped into that stock token and sent to their wallet.
| term | meaning |
|---|---|
| sealed | pre-launch. the pool does not exist yet. |
| the cap | the v4 hook, PopCapHook |
| fizz | fees accrued to you, not yet popped |
| the crate | fee accounting and distribution, Crate |
| pop | convert your fizz into your chosen stock |
| flavor | your chosen ticker |
| the shelf | the list of available tickers |
the cap
The cap is a Uniswap v4 hook attached to the single POP/ETH pool. It uses four permissions and nothing else: beforeSwap, afterSwap, and the two return-delta flags that let it change the swap amounts.
- The cut is a constant: 2% buy / 2% sell. No schedule, no setter, no owner.
- The fee is always taken in ETH. When ETH is the input, it is taken before the swap and the pool sees 99%. When ETH is the output, it is taken after the swap from what comes out.
- Exact-output swaps revert for now. Every router uses exact-input by default, so this does not affect normal trading.
- The cut is taken on the output leg (POP on a buy, ETH on a sell) and paid inside the swap to a fixed wallet. The hook never holds a token.
- There is no seal flag: before the launch the pool simply does not exist. Creating it records
launchedAt. - The hook only serves its registered pool. Any other pool key reverts.
// beforeSwap, ETH in
uint256 cut = swapAmount * taxBps / 10_000; // taxBps: 200 (buy) / 200 (sell)
poolManager.take(ETH, address(crate), fee);
// the pool swaps the remaining 99%
the crate
The crate is a dividend contract paid in ETH and withdrawn as stock. It uses the magnified-dividend-per-share pattern: one global ethPerShare counter goes up every time fees arrive, and each holder keeps a correction so transfers never move accrued fizz.
fizzOf(holder)is your accrued ETH, not yet popped.setFlavor(tickerId)picks your ticker. Free, instant, changeable any time. New holders default to the first ticker on the shelf.pop(minOut)swaps your fizz into your flavor and sends the stock token to you.minOutcomes from a quote made right before you send.popFor(holders, minOuts)lets anyone pop on behalf of others. It always pays the holder, never the caller.- Ticker 0 is ETH. If a stock route is paused, or you choose ETH, a pop pays plain ETH.
- If a swap fails, the pop reverts and your fizz stays where it was. Fizz is never lost.
- Excluded from fizz, set once at deploy: the PoolManager, the cap, the crate, and the burn address.
ethPerShare += msg.value * MAGNITUDE / eligibleSupply;
fizz = (balance * ethPerShare + correction) / MAGNITUDE - withdrawn;
the shelf
The shelf is the list of tickers you can pick. Each entry has an id, a symbol, the stock token address, and a route contract that knows how to turn ETH into that token.
- Maximum eight tickers.
- A ticker can be paused. Holders on a paused ticker are paid in ETH when they pop. Tickers are never deleted.
- Each route is an adapter. Today they are all Uniswap v4 routes: NVDA has a direct ETH pool, the others go ETH to USDG to stock.
- Stock tokens on Robinhood Chain are standard ERC-20s with 18 decimals and a
uiMultiplierthat adjusts for splits and dividends. Your raw balance never changes.
Launch shelf, pending sign-off:
| id | symbol | route |
|---|---|---|
| 0 | ETH | direct payout |
| 1 | NVDA | ETH / NVDA 0.05% |
| 2 | TSLA | ETH / USDG 0.01%, then TSLA / USDG 0.3% |
| 3 | AAPL | ETH / USDG 0.01%, then USDG / AAPL 0.3% |
| 4 | MSFT | ETH / USDG 0.01%, then USDG / MSFT 0.3% |
| 5 | SPY | ETH / USDG 0.01%, then SPY / USDG 0.3% |
contracts and addresses
Chain: Robinhood Chain, id 4663, an Arbitrum Orbit L2 that settles to Ethereum. Public RPC https://rpc.mainnet.chain.robinhood.com. Explorer robinhoodchain.blockscout.com.
Protocol contracts are listed in the footer of the landing page once deployed. Until then the site is sealed.
Verified third-party addresses:
| contract | address |
|---|---|
| Uniswap v4 PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| Uniswap v4 StateView | 0xF3334192D15450CdD385c8B70e03f9A6bD9E673b |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| NVDA | 0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC |
| TSLA | 0x322F0929c4625eD5bAd873c95208D54E1c003b2d |
| AAPL | 0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9 |
| MSFT | 0xe93237C50D904957Cf27E7B1133b510C669c2e74 |
| SPY | 0x117cc2133c37B721F49dE2A7a74833232B3B4C0C |
A token with a matching ticker but a different address is not a Robinhood stock token.
risks
- Stock tokens are not shares. They may not be available in every jurisdiction and are not available to US persons.
- Smart contracts can fail. The hook, the crate and the routes are new code. Fork tests against Robinhood Chain and an external review are planned before mainnet.
- Routes depend on third-party liquidity. If a pool is thin, a pop can get a bad price. Your slippage setting is the guard. If a pool disappears, the ticker is paused and pops pay ETH.
- Off-hours prices in stock token pools can drift from the market. Pools trade around the clock.
- The token, the crate and the cap have no owner. The shelf keeper (add or pause a ticker) is a single EOA during the proof of concept.
- Nothing here is investment advice.