How each hand works
- 1Before betting opens, the server generates a secret seed and publishes its SHA-256 hash. You can see it at the table. The seed is now committed: changing it later would change the hash.
- 2Your bet carries your own client seed (set it at the table or below). Every player's seed is mixed into the shuffle. The server committed to its seed before seeing yours, so it could not have chosen the deck.
- 3The 8-deck shoe is shuffled deterministically from [server seed + all client seeds]. Cards are dealt strictly from the top.
- 4At showdown the server seed is revealed and stored with the hand forever. Anyone can re-hash it, re-run the shuffle and compare: in Tournament history press Verify on any hand, or do it manually below.
The exact algorithm
Published so verification never requires trusting this page. Any implementation of the following reproduces our decks byte for byte:
commitment = SHA256(server_seed) # shown before betting inputs = [server_seed, client_seed_1, …] # seeds as UTF-8 bytes for k in 0 .. 414: # one draw per shuffle step digest = SHA3-384(concat(inputs) ++ k as 4-byte big-endian) key = digest[0..31] # AES-256 key counter = digest[32..47] # initial CTR block block = AES-256-CTR(key, counter) keystream, 16 bytes acc = XOR of the four little-endian uint32 chunks of block r[k] = 0.5 + int32(acc) / 0xFFFFFFFF # float in [0, 1) deck = 8 standard decks, order "AC,KC,QC,…" # 416 cards for i = 415 down to 1: # Fisher–Yates j = trunc(r[k++] * (i + 1)); swap(deck[i], deck[j]) # deck now equals the hand's recorded final shuffle; # dealt cards are consumed from the top.
Your seed
Sent with every bet you place. Set it to anything: the server cannot predict it.
Up to 64 characters. Leave it empty to roll a fresh random one.
Manual verifier
Paste values from any hand (Tournament history, then Show hands, then seeds). Everything runs in your browser. Go to tournaments