On this page
Stonkers is a crayon-doodle PFP collection with an actual redemption path. You mint a businessman. The "secret stickers" on that businessman are a hand of memecoins. If you get bored, you burn the NFT and the tokens come back to your wallet.
That is the whole pitch. The interesting part is how the protocol actually funds, shuffles, and settles those stickers.

What it is
Each Stonker is an ERC-721 Hand NFT. The art is a crayon doodle. The economic object is the hand: a variable-length set of (memecoin, leverage) cards dealt from a shuffled multi-deck shoe.
The live meme pool on the site is:
CASHCAT, STONKBROKER, PONS, MANCER, MOTION, HALT, TENDIES, SNAT, SUSHICAT, FRONG, SWAPPY, HMM.
Cards are not equal. A card is 1×, 2×, or 3× leverage. The dealer keeps drawing until the leverages in the hand sum to 5. So you might get five 1× stickers, or 3× + 2×, or 3× + 1× + 1×. You do not always get five cards.
Mint price is 0.035 ETH, native ETH only, up to five hands per transaction. 25% (0.00875 ETH) is a protocol fee. The other 75% (0.02625 ETH) is the meme budget for that hand.
The protocol lives on Robinhood Chain. The product + protocol write-up is the living whitepaper.txt.
The shoe, not a loot box
Before anyone can mint, an operator builds a shoe.
The genesis template is a 52-card deck: 20 ones, 20 twos, 12 threes. Total weight 96. Every listed memecoin appears at least once at each leverage; extra 1×/2× copies pad the slot counts. Default is six decks shuffled together (312 cards). decksN is configurable.
The fairness sequence is commit → delay → open → deal → public audit:
commitShoe(keccak256(seed || salt))locks the future shuffle without publishing the seed.- Wait
revealDelaySecs(60s in the write-up; shorter on local Anvil). openShoe(seed, salt)checks the commitment, Fisher–Yates shuffles the template copies, and dealing starts. The seed is used on-chain to build the shoe, but it is not emitted and not stored asrevealedSeedduring the sale.- Users mint until the shoe cannot fill another hand.
revealShoe(seed, salt)is the public audit, and only after mint-out / exhaust. Anyone can re-derive the shuffle and match the original commitment. Reveal is blocked while the shoe can still deal, which is the anti-card-mining rule.
Dealing is sequential off the shuffled array. For each hand the shoe draws consecutive cards until sum(leverage) == 5, skipping a card only when adding it would overshoot. Users never pick cards. Randomness is fixed at open.
When remaining cards fall below the hand size / penetration floor, the shoe is exhausted and a new one has to be committed and opened.
There is a /verify page to recompute a shuffle from the commitment plus the later public reveal.
Mint is two blocks, on purpose
Mint itself is also commit/reveal, and it is a different seed from the shoe.
commitMint(quantity) (payable) takes the full mintPrice × quantity and reserves worst-case shoe cards (HAND_WEIGHT × qty, with a penetration floor) so the shoe cannot be overbooked. No cards are dealt yet. Quantity is 1–5. Value must be exact.
revealMint(commitId) must be a later block. Same-block commit+reveal reverts — that is the "no same-block sniping" line on the homepage. The buyer or the protocol operator can call it. Capacity was locked at commit, so reveals cannot overbook the shoe.
A reverting reveal does not refund the commit ETH. There is no protocol timeout; a keeper is expected to reveal pending commits.
On reveal, for each reserved hand:
- Deal until leverage sums to 5.
- Split the 0.02625 ETH meme budget by leverage. A 3× card gets 3/5 of the budget, a 1× card gets 1/5. The last card takes the remainder so the full budget is spent. A
3×+2×hand spends the same ETH as five 1× cards — it just weights the buys toward the higher-leverage stickers. - Each card's share is swapped via a BuyAdapter (Uniswap etc.) with a slippage cap against the quote (default 5%).
- Of the tokens actually received, ~90.9% is written onto the NFT as
handClaims[i]. The rest (~9.1%, described as a 10% buffer) stays in the vault as surplus. - The NFT is minted with
cards[]+claims[].
This is why two hands with the "same" stickers can redeem different token amounts. Claims are purchase-backed. A worse fill means a smaller claim for that mint. There is no global unitTokenAmount × leverage formula.
The vault only buys the names that landed on that hand. It does not buy a full 52-card basket on mint. Inventory is supposed to track claims; surplus comes from the per-buy buffer and from optional fee recycling.
Burn
StonkersController.burn(tokenId) — owner only.
The contract reads handClaims[], pays those exact memecoin amounts out of StockVault (redeemInKind), drops liabilities, and destroys the NFT. No cash settlement. You get the tokens themselves.
The vault invariant is balance >= liability per token. Surplus is balance − liability.
Secondary sales can fatten the same hand
Hand NFTs speak ERC-2981. Royalties (example: 5%) point at a FeeSink.
A royalty applier bot watches marketplace sales (e.g. Seaport). When royalty ETH lands in the sink, it calls FeeSink.applyToHand(tokenId, amount) for that sold hand:
- 25% of the royalty is the same mint-fee split
- 75% is spent on this hand's cards, leverage-weighted, same buy path as mint
- Claims on the NFT increase by the same ~90.9% of tokens bought
In plain terms: a secondary sale can buy more of the stickers already on that businessman, if the royalty is actually routed through applyToHand. A raw ERC-2981 transfer by itself does not boost claims. The apply is not instant — on the order of minutes, and it can queue/fail. /search shows the top-up table for a token (sale, assets bought, success / queued / failed, tx links).
Orphan dust in the sink can be swept into a full-template basket as vault surplus only. That path does not boost any particular hand.
Primary mint's 25% fee never sits in FeeSink. It goes straight to mintFeeRecipient at reveal.
Art is not the hand
Artwork is assigned off-chain from a server seed at tokenId. Hair, suit, rare flags, etc. come from that assignment. Pre-mint, images are not served. Post-mint, tokenURI / image go through /api/stonkers/{id}.
The crayon doodle and the on-chain cards are independent. You can have a pretty suit and a lousy fill, or the reverse.
Why this is a more interesting PFP than most
Most PFPs are a picture plus a royalty. Stonkers treats the NFT as a receipt for a specific on-chain purchase.
The crayon is the skin. The stickers are a hand. The vault holds the inventory. Burn unwraps it.
That still leaves operator trust (shoe commit/open), keeper liveness (reveals), and AMM fill quality. It does not pretend those away. If you mint one, the thing you actually own is handClaims[] — not a vibe, and not a promised basket size.