HOW IT WORKS

1
Before You Bet
WE COMMIT
We generate a secret seed and show you its SHA-256 hash. This locks in our commitment — we can't change it later.
You see (hash): 8f2a1b3c4d5e6f7a...
2
Your Turn
YOU ADD ENTROPY
You provide your own seed (or use our generated one). This ensures we can't predict the final outcome either.
Your seed: my-custom-seed-2025
3
Game Result
COMBINED RNG
HMAC-SHA256 combines both seeds + a counter. The result is deterministic — same inputs always produce same output.
Result generated from: HMAC(server + client + nonce)
4
After Game
WE REVEAL
We show you the original server seed. Hash it yourself — if it matches what we showed before, the game was fair.
Verify: SHA256(seed) = original hash? ✓

INTERACTIVE DEMO

🔑
Seed Management
Server Seed Hash Public
Click "New Session" to start
Server Seed Secret
Hidden until revealed
Your Seed (Client) Editable
Nonce (Bet Counter)
0 Increments with each bet
🎲
Generate Results

Each click uses the current seeds + nonce to generate a provably fair random result.

Dice Roll (0-99.99)
--
Crash Point
--
Wheel (0-36)
--
Raw Float (0-1)
--
HMAC Output (First 32 chars)
--
📜
Bet History
0 bets
Nonce Type Result Raw Float
No bets yet

AVAILABLE IN ALL OUR GAMES

Every game in our library can be deployed with provably fair RNG. The same cryptographic verification system works across all game types.

THE ALGORITHM

Our provably fair system uses standard Web Crypto API for real SHA-256 and HMAC operations. Here's exactly how results are generated:

generateFloat() JavaScript
// Generate deterministic random float from seeds async function generateFloat(serverSeed, clientSeed, nonce, cursor = 0) { // Combine all entropy sources const input = `${clientSeed}:${nonce}:${cursor}`; // HMAC-SHA256 produces deterministic output const hash = await hmacSha256(serverSeed, input); // Use first 13 hex chars for high precision const hexSegment = hash.slice(0, 13); const decimal = parseInt(hexSegment, 16); const maxValue = parseInt('fffffffffffff', 16); // Return float between 0 and 1 return decimal / (maxValue + 1); }
verify() JavaScript
// Verify server seed matches commitment async function verifyServerSeed(serverSeed, serverSeedHash) { // Hash the revealed seed const computedHash = await sha256(serverSeed); // Must match what was shown before betting return computedHash === serverSeedHash; }