Overview

SCRATCH is a scratch card whose prize is a real Robinhood Chain stock token. One free card per wallet per UTC day. The prize is picked and signed by a server before you see the card, and a vault contract pays it out against that signature. Nothing is minted: every fragment under a foil was bought and deposited into the vault first, and the vault's balances are on the proof page as live chain reads.

Three parts: a card server that checks who you are and deals a card, a vault contract that holds the stock and only releases it against a valid voucher, and the foil, which is a canvas you rub with your thumb.

A card, end to end

  • You connect a wallet on Robinhood Chain (chain id 4663).
  • The app asks the card server for today's card. The server checks that the wallet qualifies (below), that it has not claimed today (lastClaimDay on the vault), and rations per connection.
  • The server rolls the tier and the stock deterministically from a secret, your address and today's date, so the same wallet cannot re-request for a better card. It converts the card's face value into token units at Robinhood's ask, then checks the vault can pay that amount. If it cannot, the card falls to the next tier down. If nothing is payable, you get a demo card and it is labelled.
  • The server signs an EIP-712 voucher: to, token, amount, tier, cardId, deadline. The deadline is fifteen minutes.
  • You scratch. The reveal is the voucher's contents. It was fixed before the foil moved.
  • You claim. Your wallet calls claim(card, signature) on the vault. The contract verifies the signature, burns the card id, records the day, and transfers the stock token to card.to. Anyone can relay the transaction; the tokens always go to the wallet on the card.

The vault contract

ScratchVault.sol is deliberately small. It holds ERC-20 stock tokens and exposes one user function, claim, plus reads: canClaimToday(wallet), lastClaimDay(wallet), usedCard(id), totalClaims(), signer(), paused(), and payable_(token, amount), which is how many prizes of that size the vault can still pay.

struct Card { address to; address token; uint256 amount; uint8 tier; bytes32 cardId; uint256 deadline; }
function claim(Card calldata card, bytes calldata signature) external;
// reverts: Expired, CardUsed, AlreadyClaimedToday, BadSignature, EnforcedPause

Owner functions: setSigner, pause, unpause, withdraw. Withdraw exists so the prize table can be rotated or the thing can be shut down honestly; because the proof page reads balances every minute, a withdrawal is visible within a minute. Signatures use EIP-712 with domain Scratch / 1 / 4663 / vault address, so a voucher for one vault is worthless on any other.

Eight tests cover the signature, tampering, the day cap, expiry, an unpayable vault, the payable read, pausing, signer rotation and withdrawal. The source and tests are in the repository; the deployed address and the verified source will be linked from the proof page the moment they exist.

Who may scratch

  • The gate: a wallet with at least three transactions on Robinhood Chain. This is read with eth_getTransactionCount. Before the token exists it is the whole rule.
  • Your first card is free. The first card a wallet ever scratches is live for anyone who passes the gate, before and after the token exists. The vault knows (lastClaimDay is zero until you claim).
  • After the token exists, from the second card on: a live card needs a wallet holding at least 1,000 $SCRATCH. Held, never spent, read at the moment the card is dealt. Wallets that do not hold it are still dealt a card and see the reveal, as a labelled demo, so they know what they are missing. This is FAB's shape (one free run, then hold) and Touch Grass's number.
  • The Legendary (one whole NVIDIA share) is only ever dealt to a wallet holding 5,000 $SCRATCH, and only when the vault holds a whole share on top of what the other tiers need. When it is not in play, the odds table says so.
  • One card per wallet per UTC day, enforced by the contract, not by us.

The daily budget

The vault pays at most a fixed amount per UTC day, printed on the proof page. It starts at $50 a day in the seed phase and rises with the fee stream; every change is posted before it happens. Past the budget, cards are still dealt and revealed, as labelled demos that move nothing, and the app says "today's cards are gone". This is what stops five hundred wallets emptying a small vault by breakfast, and it is the honest version of "limited".

The odds

Per card, in basis points of 10,000: common 6,000 (face value $0.50, one of AAPL, COST, AMZN, GME), rare 3,000 ($2, one of NVDA, TSLA, GOOGL, META, MSFT), epic 990 ($10, any of the nine), legendary 10 (one NVIDIA share). The stock within a tier is chosen by the same deterministic roll.

Token amount = face value divided by Robinhood's ask at the moment the card is dealt, in the token's 18-decimal units. The vault must hold at least that amount or the tier is not dealt. The expected face value of a card when every tier is in play is about $2.29, which is arithmetic, not a forecast; what it is worth when you sell it is whatever the share is doing that day.

Nothing is random at the point of scratching. The roll is keccak(secret, address, day). Requesting again does not re-roll.

Farms

  • Fresh wallets do not qualify. A wallet has to have lived on the chain first, or hold the token.
  • One card per wallet per day is enforced on chain, so a leaked or replayed voucher cannot double up.
  • Per connection: forty cards a day per network address, best effort, in the server's memory. This is the weakest rule here and it says so; a durable store is on the roadmap.
  • Rejected requests deal nothing and burn nothing, so nobody can spend someone else's allowance.
  • If the signer key leaks, the owner rotates it with setSigner and pauses the vault. Every card dealt under the old key becomes worthless instantly.

What $SCRATCH does

$SCRATCH is launched on Pons V2 on Robinhood Chain, quoted in ETH, with a creator tax. Every fee the Pons escrow credits to the fee-recipient wallet is split, and the split is published before the token exists: 40% buys stock tokens for the vault, 30% buys $SCRATCH back and burns it, 30% funds the team. If the split changes, the change is posted before it happens.

Holding the token is one of the two ways to qualify for a daily card, and the only way to be dealt the Legendary. It is read, never taken. There is no staking, no yield and no promise that the token goes anywhere. It is a key and a funding source, in that order.

Failure modes, in advance

  • Vault empty. The tier falls back, then the card becomes a labelled demo. The proof page shows the empty balances. Nobody is told they won something the vault cannot pay.
  • Price feed down. No card can be priced, so no card is dealt. The app says the feed is down rather than guessing.
  • Signer key leaks. Rotate and pause, above.
  • Server down. Nothing can be dealt. Claims of already-dealt cards still work, because the contract does not need the server.
  • The team walks away. The vault keeps paying dealt cards until it is empty or paused, and the balances stay public. Nothing here can be quietly switched off; a switch-off is visible on the proof page.

Demo against live

Until the vault is deployed and funded, the card server runs in demo mode: every check runs for real, the card is dealt and revealed, and nothing is signed and nothing moves on chain. Demo cards are labelled on the card and in the feed, and they are never counted in any total. Live mode needs two things to exist: a signer key on the server and a funded vault address in the site's config. When both do, the nav badge on every page turns green.

Roadmap

Every line carries the state it is really in.

  • shippedVault contract with eight passing tests; site with home, scratch, proof and docs; card server in demo mode.
  • buildingDeploy the vault to Robinhood Chain, verify the source, fund it, switch the signer on.
  • buildingThe keeper: every ten minutes, buy whichever stock has fewer than 25 cards payable, with the vault's share of fees.
  • nextA durable per-connection store (the in-memory rationing is honest about being weak).
  • nextPost every reveal to X automatically, with the transaction hash.
  • openWhether the Legendary should be daily or weekly. A whole NVIDIA share a day is a real cost; the vault decides.
  • openSponsored cards: a brand funds cards in its own stock. Nobody has asked yet.
  • will not doPaid cards. A paid scratch card is a lottery, and a lottery is a licence. Cards stay free.
  • will not doYield, APY, staking, or a number on any page that was not read from a chain or an API.

SCRATCH is not affiliated with, endorsed by, or connected to Robinhood. Robinhood Chain stock tokens are issued by Robinhood and track the underlying share; they carry the share's full downside, and Robinhood does not offer them to US persons. Cards are free: there is no purchase, no entry fee and no consideration of any kind, which is why this is a promotion and not a lottery, and it will stay that way. $SCRATCH is a memecoin with a published fee split and no promise attached. Nothing on this site is investment advice. The contracts are unaudited beyond their own tests until the proof page says otherwise.