How StockRip works
How it works
An onchain protocol where deposited stock positions, each backed by depositor ETH, become positions others acquire at random.
Stock Rip is an onchain, randomized acquisition protocol for tokenized stocks. Depositors wrap shares — fractional amounts included — into a single basket and pair it with committed ETH backing. That backing sets the position’s selection weight and funds an irrevocable standing bid from the depositor to reacquire the basket. Anyone can pay the pool-derived acquisition price to receive one randomly selected position.
- Acquire one randomly selected position from the pool. You’re far more likely to receive a lightly-backed one.
- After allocation, choose: take the underlying shares (or keep them wrapped as the NFT basket), or accept the depositor’s standing bid and sell back for most of its ETH backing — in ETH, or as $RIP. You can never keep both.
- Deposit shares plus ETH backing to provide liquidity and earn a share of every acquisition fee, plus $RIP rewards.
The protocol has three roles: depositors provide liquidity by pairing shares with ETH backing, purchasers pay the acquisition price to receive a randomly selected position that may be higher-backed than the price they paid, and the protocol earns bounded fees from the spread.
Deployments
Stock Rip runs on Robinhood Chain (chain id 4663), where the tokenized equities live.
The protocol is live on Robinhood Chain — every number on this site is read from the contracts below, and every action signs a real transaction. Basket art is generated fully on chain by the renderer, each basket is an ERC-721 whose token-bound account holds the actual shares, and the collection is indexed on OpenSea.
- Acquisition pool (core)0x32E8D5…b714CB
- $RIP token0xe4b872…86C532
- Basket NFT0xF0261F…522a75
- Rewards & emissions0x91D032…a647eF
- $RIP pool hook0xf29512…CFa444
- Randomness coordinator0xA1FD90…16d22D
- Randomness service0x5812bC…287dE3
- Deposit router0xC72759…6F20F4
- On-chain art renderer0x3C9197…ae3477
Positions & weighting
Selection weight is inversely proportional to backing.
A position’s selection weight is inversely proportional to its backing: lightly-backed positions are drawn often, whale positions are drawn rarely. Formally, weight = 1e36 / backing, and a position’s odds are its weight over the pool’s total weight.
Each position’s ETH is escrowed separately and only ever settles for that position, so every standing bid is fully funded by construction.
Rarity classes are presentation over those odds — they are draw-probability buckets, not a property of the underlying stock. A class label tells you how unlikely a position is to be drawn, nothing more.
Pricing & allocation
The price tracks the expected value of the draw.
An acquisition costs roughly the expected value of the draw — mathematically the harmonic mean of all backings, which tracks the cheap positions you usually receive — plus a 10% surcharge and a small randomness service fee.
Requests settle strictly in the order they were made, so callback timing cannot let a later request jump ahead or reshape an earlier request’s selection pool. Up to 5 draws batch into a single transaction.
Both ends of the price are bounded at request time. The fee is capped at 10% above the quote you saw; and the settlement-drift control — the cog beside the quantity — sets the maximum the pool’s expected value may fall while your purchase settles, 10% by default. Breach either bound and the contract refunds the draw instead of settling it.
Settlement
Winning allocates the position without transferring anything yet.
Winning allocates the basket without transferring anything yet. The winner then has four exits: take the underlying shares (the default), tick a box to keep them wrapped as the NFT basket, sell back to the depositor’s standing bid for 85% of its backing — in ETH or converted into $RIP — or relist the position at the same backing and become its depositor.
Two clocks guarantee nothing locks up: the winner holds a 24-hour exclusive window to choose, and after 7 days an unsettled draw can be finalized by anyone.
Fees & protocol revenue
Fees split across every active position.
Each acquisition fee, minus a bounded protocol cut and a 5% crown tithe, splits equally across all active positions. Fees accrue while a position rests in the pool, so the longer it sits, the more it earns.
Top deposit reward
One crowned deposit accrues the tithe pot.
The single top-backed deposit holds the crown and accrues the tithe pot. Challengers must beat the current backing by 10% to take it, which stops trivial flipping.
$RIP
$RIP bootstraps both sides of the market.
$RIP is the fixed-supply reward token that pays both sides for showing up early and ties protocol revenue to buy pressure. Supply is 1,000,000,000: half seeded one-sided into the Uniswap v4 pool (the ETH side fills only as buyers arrive), 30% funding the emission module, the rest held for operations.
Emissions on this deployment run for a fixed 15-day window: 10M $RIP per day streams to depositors pro-rata by the square root of backed value (claim any time), and 10M $RIP per day fills a daily pot split evenly among that day’s purchasers, claimable once the day closes and its draws settle.
The pool charges a 1% fee in both directions, and external buys stay gated while the market bootstraps — $RIP is earned, or bought through the protocol’s own paths. In steady state a config switch routes a share of protocol fees into rate-limited buybacks split 40% to depositors, 40% to purchaser pots, 20% burned; the switch is currently off. When the pool goes cold, part of the surcharge slides toward a $RIP allowance for the next purchaser.
Safety
What the protocol guarantees, and what it does not.
Backing is escrowed per position, so a standing bid can always be paid. Draw order is fixed at request time. Settlement windows guarantee liveness.
Randomness comes from a keeper-revealed hash chain: no draw’s result can change once requested, reveals are served strictly in order, every outcome is recomputable from the chain by anyone, and a listing about to be drawn cannot be withdrawn out from under the request.
How the randomness works
A reverse hash chain, mixed with a block that does not exist yet.
- 1Before you playThe deck gets sealed
A long stack of secret numbers is sealed in order. Only the top seal is published on-chain — every number inside stays hidden.
- 2You buyA future block is marked
Your draw is tied to a block five ahead — one nobody has produced yet, and a block that does not exist cannot be read. These are Ethereum blocks (~12s), not Robinhood's (~0.1s).
- 3~1 minute laterThe two halves meet
The block lands and the next seal is broken. Those two numbers, stirred together, decide which position you get.
- 4Forever afterAnyone can re-check it
Both halves are public once revealed, so the result can be recomputed by anyone — you included — straight from the chain.
The keeper generates a secret x₀ and hashes it forward a million times: xᵢ₊₁ = keccak256(xᵢ). Only the tip x_N is published on-chain. Each draw then consumes one preimage walking backward: a reveal is accepted only if it hashes to the stored head, and that preimage becomes the new head. The chain is a pre-committed sequence of one-time values served in strict FIFO — the keeper cannot skip a draw, reorder two, or substitute a value it likes better, because anything but the exact next preimage fails the hash check.
A committed sequence alone would still be known to the keeper, so each word also mixes in entropy that exists for nobody at purchase time: when a draw is requested, the coordinator pins seedBlock = block.number + 5 — a block five ahead. Its hash cannot be known when the purchase is signed, and it is fixed at request, so the keeper cannot shop for a favorable one by timing its reveal. Revealing before that block exists simply reverts.
Which five blocks, though? Robinhood is an Arbitrum-style L2 and it has two different block numbers, which is the single easiest thing to misread here. The chain’s own blocks land about every 0.1 seconds. But inside a contract, Solidity’s block.number is not that number — it reports the parent Ethereum block, which advances roughly every 12 seconds. Measured live on this chain: about 125 Robinhood blocks per one block.number.
blockhash can only index that space — so +5 is five ~12-second ticks, not five 0.1-second ones. A draw therefore takes about a minute (~60–75s) to reveal, not half a second. Everything else — the deadline your purchase must settle within, the deposit and listing windows — counts in real Robinhood blocks read from the chain itself, which is why the acquisition deadline is 3600 blocks yet only ~6 minutes long.That is also the honest reason a draw is not instant. Any scheme that answers immediately is one whose answer was knowable in advance; the wait is the guarantee, and it is priced in Ethereum blocks because that is the only clock blockhash can read.
word = keccak256(preimage, userSeed, requestId)
The pool consumes the word as word % totalWeight, then walks a weighted segment tree to the position it lands on — odds exactly proportional to each position’s inverse-backing weight. Every reveal emits requestId, the word, seedBlock and its hash, so anyone can recompute both keccaks from public data and audit every draw ever made from calldata alone. Nothing about fairness is taken on trust.
Liveness has two backstops. A draw whose seed ages out of the readable window (a keeper outage) can be skipped past by anyone, and the purchase refunds on the protocol’s own deadline — no stuck draw wedges the queue. And the coordinator carries an optional keeper bond field: ETH that, when posted, makes a deliberately withheld reveal slashable in favor of the affected purchaser. The coordinator itself speaks the Chainlink VRF v2.5 interface, so if a canonical VRF ever deploys on this chain, swapping to it is a single, publicly time-locked address change.
Parameters
The knobs, and their bounds.
Surcharge 10%, standing-bid payout 85% of backing, crown tithe 5%, crown overtake threshold 110%, swap fee 1% (hardcoded), batch cap 5 draws per transaction, minimum backing 0.001 ETH, winner’s exclusive window 24 hours, finalization after 7 days. The purchaser-set accepted drop defaults to 10% and dials from 10% to 100%. Each contract parameter is bounded so no operator action can push it outside the published range.
Randomness: seed pinned 5 Ethereum blocks after the request (~12s each, so about a minute to reveal); optional keeper bond, slashable after 30 unrevealed Ethereum blocks (~6 min), 3-day exit notice.
Block counts on this page name their clock, because Robinhood has two. Windows measured in Robinhood blocks (~0.1s): acquisition deadline 3600 (~6 min). Windows measured in Ethereum blocks (~12s, what Solidity’s block.number reports here): the randomness seed delay and its slash grace.