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.

termmeaning
sealedpre-launch. the pool does not exist yet.
the capthe v4 hook, PopCapHook
fizzfees accrued to you, not yet popped
the cratefee accounting and distribution, Crate
popconvert your fizz into your chosen stock
flavoryour chosen ticker
the shelfthe 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. minOut comes 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 uiMultiplier that adjusts for splits and dividends. Your raw balance never changes.

Launch shelf, pending sign-off:

idsymbolroute
0ETHdirect payout
1NVDAETH / NVDA 0.05%
2TSLAETH / USDG 0.01%, then TSLA / USDG 0.3%
3AAPLETH / USDG 0.01%, then USDG / AAPL 0.3%
4MSFTETH / USDG 0.01%, then USDG / MSFT 0.3%
5SPYETH / 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:

contractaddress
Uniswap v4 PoolManager0x8366a39CC670B4001A1121B8F6A443A643e40951
Uniswap v4 StateView0xF3334192D15450CdD385c8B70e03f9A6bD9E673b
WETH0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73
USDG0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
NVDA0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC
TSLA0x322F0929c4625eD5bAd873c95208D54E1c003b2d
AAPL0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9
MSFT0xe93237C50D904957Cf27E7B1133b510C669c2e74
SPY0x117cc2133c37B721F49dE2A7a74833232B3B4C0C

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.

stock tokens are not shares and may not be available in every jurisdiction. not available to us persons. smart contracts can fail. nothing here is investment advice.