No card pulled yet. The first pull lands on the first full hour after $PULLDECK is live.
| card | stake | runs | odds |
|---|---|---|---|
| #01 | 40,000 | 0 – 39,999 | 40% |
| #02 | 25,000 | 40,000 – 64,999 | 25% |
| #03 | 10,000 | 65,000 – 74,999 | 10% |
| #04 | 25,000 | 75,000 – 99,999 | 25% |
The deck holds 100,000. The pull block's hash gives a roll of 61,204, which lands in card #02's run. Card #02 takes its 25,000 back plus the other 75,000, less 3% of that 75,000 (2,250): 97,750. The other three cards were, technically, generous.
roll = keccak256(abi.encodePacked(
blockhash(pullBlock), deckId, cards, total
)) % total
Every input is public: the pull block, the deck number, the card count and the deck total (in the coin's smallest units) are on the tape and in the contract's events, and the block hash is on the explorer. Walk the cards in order, adding stakes; the first card whose running total passes the roll is the pulled card. If the hash ever ages out before the pull, the deck is resealed to a fresh future block. Nobody, the keeper included, picks a card.