Provable Fairness
In most online poker rooms, you simply have to trust that the site shuffled honestly and didn't change the cards once bets were in. At Llamabet you don't have to trust us — every hand is locked onto the Sui blockchain before a single chip is bet, then opened up afterwards so anyone can check it. Here's how it works, in plain English.
How every hand is dealt
- 1Shuffle — the moment a hand starts, the deck is shuffled into a specific secret order.
- 2Lock it on Sui (before any betting) — a fingerprint of that shuffled deck is signed by our dealer and published to the Sui blockchain — committed in advance, so it can never be changed once you've bet.
- 3Deal & play — hole cards and community cards come off that exact locked deck. Nothing is decided on the fly.
- 4Reveal — when the hand finishes, the deck's secret is published on-chain so the fingerprint can be re-checked.
- 5Anyone can verify — you (or anyone) can recompute the deck from the revealed secret and confirm it matches what was locked in step 2. Try the verifier →
The four things that make it fair
What this guarantees
In plain terms, provable fairness locks in three things:
- Guaranteed: the deck for a hand is fixed and published before betting, so the house cannot change your cards or the outcome after you've bet.
- Guaranteed: every deal is publicly recorded on Sui and can be independently recomputed and verified by anyone, at any time.
- Guaranteed: the shuffle is genuinely random and can't be quietly reordered across a session.
Where to see it while you play
At the table, tap the "Provably fair" badge to open the fairness panel. It shows the deck's fingerprint that was committed before the hand, the secret revealed after it, and a direct link to the Sui blockchain explorer so you can see the on-chain record for yourself.
🔧 Technical details — the exact algorithm
For developers and curious players: here is precisely how a deck is derived. The server and the in-browser verifier run byte-for-byte identical code, so you can reproduce any deal yourself.
1. The only source of randomness
Each hand begins with 256 fresh bits from the operating system's cryptographic RNG. This is the only randomness in the system — everything after it is deterministic, which is exactly what makes a hand reproducible.
serverSeed = randomBytes(32) // 256-bit OS CSPRNG, one per hand
2. Commit → chain → shuffle → reveal
seedHash = SHA-256(serverSeed) // committed + ed25519-signed on-chain BEFORE bets deckSeed = SHA-256(serverSeed | prevRevealedSeed) // chains in the previous hand deck = FisherYates(52, HMAC-SHA256(deckSeed, counter)) // after the hand: reveal serverSeed → anyone checks SHA-256(serverSeed) == seedHash
Mixing in prevRevealedSeed — the previous hand's revealed seed, or genesis for a table's first hand — chains every deck to the one before it, so hands can't be secretly reordered or replayed.
3. The shuffle
- Random stream: HMAC-SHA256, keyed by the seed, over an incrementing counter (0, 1, 2, …) yields an endless stream of bytes, read 4 at a time as a 32-bit number. It's a standard, well-studied way to stretch one seed into unlimited unpredictable output (the HMAC-DRBG family).
- No bias: to pick a card position in [0, n) we use rejection sampling — discarding the small numeric tail that would otherwise slightly favour low positions — so every one of the 52! possible orderings is exactly equally likely.
- Fisher–Yates: the classic unbiased shuffle — walk the deck from the last card to the first, swapping each with a uniformly-chosen earlier card.
4. How the deck becomes cards
Cards are dealt from the end of the shuffled deck, with no burn cards:
- Hole cards: two per seat, in dealer order starting at the small blind.
- Community cards: the flop (3), turn (1), and river (1), in that order.