$10,000 of USDG is split across 2,287 winning cases, from $1 up to a single $1,000. The other 17,713 cases win nothing. Which case holds which prize is fixed before minting opens, but nobody — not even a holder — can read it early. The contract stores only a Merkle root over keccak256(tokenId, rewardAmount, salt), with a fresh 32-byte random salt per token, so the commitment reveals nothing about its contents. To open a case you submit the amount, the salt and a proof; the contract checks them against the root and pays out only if they match. Three properties fall out of that: The map cannot change. setRewardMerkleRoot reverts once reveal is open, so the tree everyone's proofs were built against is frozen — the owner cannot swap it, and neither can a stolen owner key. Reveal cannot start unfunded. startReveal() requires the contract to already hold the full reward pool, so the money is on-chain before the first case opens. Token ids are drawn at random. Minting pulls an unused id out of the pool rather than counting up, so the first buyer does not automatically get #00001. Unclaimed rewards can be recovered by the owner, but only 15 days after reveal opens — UNCLAIMED_SWEEP_DELAY. Mint proceeds and the reward vault are separate balances.
Trading is not open yet. Everything you see on this page is read straight from Robinhood Chain and will keep working unchanged once the market contract is live.