Server commits a secret seed
Before each bet the server generates a random server seed and gives you its SHA-256 hash up front. The seed itself stays secret until the bet is settled — so it can't be changed to affect your result.
You provide your client seed
Your client seed (random by default, editable in each game) is mixed in, so neither you nor the server can predict the outcome alone.
Result is derived deterministically
The outcome comes from HMAC-SHA256(server_seed, "client_seed:nonce") — a one-way function. The same inputs always produce the same result, and it can't be reversed or nudged.
Server reveals the seed
After the bet the original server seed is revealed in your bet history. Hash it yourself: if SHA-256(seed) matches the hash you were shown before the bet, the game was fair.
Verify the seed commitment
Paste the revealed server seed and the server hash shown before the bet (both are in your bet history). We compute SHA-256 in your browser — nothing is sent to us.
The formula
// result
result = HMAC-SHA256(server_seed, "client_seed:nonce")
// commitment shown before the bet
server_hash = SHA-256(server_seed)
// verification after the bet
SHA-256(revealed_seed) === server_hash
Per-game implementation
Dice
roll = Float(server, client, nonce) × 100 → compared to your target
Limbo
multiplier = (1 − edge) / (1 − Float(...)) → beat your target to win
Mines
Fisher–Yates shuffle from sequential Float() calls → mine positions
Plinko
each row: Float(…, nonce+i) ≥ .5 → right else left → bucket index
Roulette
number = ⌊Float(...) × 37⌋ → 0–36 (single-zero wheel)
Gates of Lays
HMAC stream (server, client:nonce:counter) drives every reel & cascade