How StockRip works
How it works
An onchain protocol where deposited stock positions, each backed by depositor ETH, become positions others acquire at random.
StockRip is an onchain, randomized acquisition protocol for tokenized stocks. Depositors wrap shares — fractional amounts included — into a single basket and pair it with a committed ETH grade. That grade 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 grade — in ETH, or as $RIP. You can never keep both.
- Deposit shares plus an ETH grade 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 an ETH grade, 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
StockRip 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 coordinator0xaf9b58…0e2250
- Randomness service0x5812bC…287dE3
- Deposit router0xC72759…6F20F4
- On-chain art renderer0x3C9197…ae3477
- Stockrip NFT (vault card)0xbFBBd2…67d4De
- Card staking hub0x42Ab8F…cDd315
- Card zap router (buy legs with ETH)0xa1c28C…74Dd17
Positions & weighting
Selection weight is inversely proportional to grade.
A position’s selection weight is inversely proportional to its grade: lightly-graded positions are drawn often, whale positions are drawn rarely. Formally, weight = 1e36 / grade, 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 grades, which tracks the cheap positions you usually receive — plus an owner-set surcharge (currently 5.5%; the quote you see always includes it) 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 25 draws batch into a single transaction.
Both ends of the price are bounded. 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, 40% by default, tightenable to 10%. Breach a bound at request time and the transaction reverts unspent; breach the drift bound while settling 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 — bounded 80–95% of grade on chain, currently 95%, in ETH or converted into $RIP — or relist the position under a grade you choose (the ETH you send becomes its fresh 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.
Stockrip NFTs
Wrap an NFT you own into a card that lives in the same draw pool.
A Stockrip NFT locks an NFT from an allow-listed collection inside a new card, together with the ETH grade you give it and any equity legs you deposit into it. The card lists into the same pool as the baskets — the same weighting, the same pricing, the same draw.
The card’s face is your NFT’s artwork, frozen on chain at mint. The mint only accepts artwork carrying the protocol’s attestation signature over a canonical copy of the source image, and the contract verifies that signature before anything mints — so the card you preview on the Create page is byte-for-byte the card that exists forever after.
- Create: pick an NFT from your wallet — the allow-listed collections are read live from the chain — grade it with ETH, add legs if you like, and mint.
- Custody: the source NFT lives inside the card. Burning the card hands it back; until then, the card is the position.
- Stake $RIP on your card and it earns ETH for as long as it sits there. The stake belongs to the card, not your wallet — see Staking & card rewards next for what it pays and how to take it out.
- Winning one settles like any other position — keep the card, the NFT, the legs, and any staked $RIP it carries, or take the depositor’s standing bid.
Staking & card rewards
$RIP locked inside a Stockrip NFT is staked, and earns ETH while it sits there.
This is what a Stockrip NFT earns while you hold it. Lock $RIP into the card alongside your NFT and that $RIP is staked automatically — there is no second transaction, no separate staking screen, and nothing to opt into. From the moment the card is minted it is earning.
Rewards are paid in ETH. They come from the protocol’s own revenue: the fees the pool takes on draws and settlements, and the 1% the $RIP pool charges on each swap. That revenue is paid into the staking hub and streams out second by second over the following day, so your balance climbs continuously rather than jumping once a day.
Your share is your share of the total staked. Two cards holding the same amount of $RIP earn the same, whether they were minted this morning or last month. Nothing is locked up — the $RIP comes back out whenever you decide to take it.
Getting your ETH out
Claim takes the ETH your card has earned and leaves everything else untouched — the card, its $RIP, its other assets. You can claim whenever you like; nothing expires and nothing is forfeited by waiting. Exit unstakes the $RIP and pays out the earnings together.
The maths
A day’s pot is spread evenly across the seconds in the day. Writing for the pot and for the payout window in seconds, the stream releases
- the stream rate — wei released each second
- the pot for the day, in wei
- the payout window in seconds (86,400 for a day)
Each second is split between the cards staked at that moment. With your stake and everything staked, your slice of that second is — and both move as people stake and leave. Your earnings are that slice added up over every second you held:
- the ETH your card earns over the interval
- the stretch of time your card was staked across
- your card’s stake — the $RIP locked inside it
- everything staked at that instant, which moves as others stake and leave
- the stream rate, as above
That integral is the point. Rewards are time-weighted: you earn for the seconds you actually held, so a card staked at noon earns half what a card staked at midnight earns that day, and staking just before a top-up to leave just after earns almost nothing.
Worked through with round numbers — a pot of 0.64 ETH against 166,000,000 $RIP staked, holding 1,000,000 $RIP for the whole day:
Listed cards keep earning
Putting a card into the acquisition pool does not stop it. While the pool holds your card it carries on accruing, and when someone rips it the ETH it earned in the meantime comes out with everything else. A card is never idle just because it is on the market.
What to expect
The rate is not fixed and is not promised. It moves with two things: how much revenue the protocol made that day, and how much $RIP is staked across every card. A busy day with few stakers pays well; a quiet day with many stakers pays little. Some days may pay nothing at all, because the pool only ever hands out what it actually earned.
- Vault card collection0xbFBBd2…67d4De
- Staking hub0x42Ab8F…cDd315
Fees & protocol revenue
Fees split across every active position.
Each acquisition fee — after the cold-pool $RIP slice, a bounded protocol cut and a 1% 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 grade 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 across that day’s draws — ten rips earn ten shares — claimable once the day closes and its draws settle.
The pool charges a 1% fee in both directions, and external buys are open — $RIP is earned through the protocol or bought on the open market. Beyond trading, $RIP has a working role: stake it on a Stockrip NFT and the card earns from the vault’s ETH reward stream, pro-rata by stake. 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.
The grade 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 + 2 — a block two 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 two 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 +2 is two ~12-second ticks, not two 0.1-second ones. A draw therefore takes about half a minute (~24–36s) 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-grade 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 owner-set (currently 5.5%), standing-bid payout 80–95% of grade (currently 95%), crown tithe 1%, crown overtake threshold 110%, swap fee 1% (hardcoded), batch cap 25 draws per transaction, minimum grade currently 0.01 ETH (operator-set — the deposit page reads the live floor from chain), winner’s exclusive window 24 hours, finalization after 7 days. The purchaser-set accepted drop defaults to 40% and dials from 10% to 100%. The settlement knobs are bounded on chain (standing bid 80–95%, owner settlement fee ≤5%, every basis-point cut capped at 100%); the surcharge and the minimum grade are operator-set without a hard ceiling.
Randomness: seed pinned 2 Ethereum blocks after the request (~12s each, so about half 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.