Provably Fair
Verify that every game outcome is fair and unmanipulated.
How to Verify in 3 Steps
What is Provably Fair?
Provably fair is a cryptographic system that ensures game outcomes cannot be manipulated by either the casino or the player. Before each round, a hash of the game result is published. After the round, you can verify that the result matches the hash.
How It Works
We use HMAC-SHA256 to generate game seeds. A server seed is hashed and published before bets are placed. Combined with a client seed and nonce, this generates the game result. After the round, the unhashed server seed is revealed for verification.
The Process
Server Seed Generation
Before the round begins, the server generates a random seed and publishes its SHA-256 hash. This commits the server to the outcome before any bets are placed.
Client Seed
Each player has a client seed (derived from their wallet address) that contributes to the final result. This ensures the server alone cannot determine the outcome.
Result Calculation
The game result is calculated by combining the server seed, client seed, and a nonce (round number) using HMAC-SHA256. The first 8 characters of the resulting hash determine the crash point.
Verification
After the round, the unhashed server seed is revealed. Anyone can verify the result by running the same HMAC-SHA256 calculation and confirming it matches the pre-published hash.
Verify a Game
Enter the game hash from any round to calculate its crash point.
Technical Details
Crash Game Formula
// Generate crash point from hash function getCrashPoint(hash) { const h = parseInt(hash.slice(0, 8), 16); const e = Math.pow(2, 32); const result = Math.max(1, Math.floor((0.97 * e) / (e - h) * 100) / 100); return result; }
Hash Chain
Game results are generated using a hash chain. Starting from a final hash, each previous hash is the SHA-256 of the next. This means all future results are pre-determined but cannot be predicted without knowing the unhashed seeds.
Verification Code
const crypto = require('crypto'); function verify(serverSeed, clientSeed, nonce) { const hmac = crypto.createHmac('sha256', serverSeed); hmac.update(clientSeed + ':' + nonce); const hash = hmac.digest('hex'); return getCrashPoint(hash); }
House Edge by Game
Every game has a mathematically defined house edge. This is how the casino sustains operations. We disclose these figures transparently so you can make informed decisions.
| Game | House Edge | RTP (Return to Player) | How It Works |
|---|---|---|---|
| Crash | 3% | 97% | The 0.97 multiplier in the formula ensures a 3% house edge on every round. |
| Coinflip | 2.34% | 97.66% | Win threshold is 125/256 (48.83% win chance) with 2x payout. |
| Dice | 3% | 97% | Payout multiplier = 97 / win_chance. The "3" missing from 100 is the edge. |
| Mines | 3% | 97% | Multipliers are based on true probability * 0.97, giving a 3% edge per revealed tile. |
| Blackjack | ~2-4% | ~96-98% | 3:2 natural, dealer stands on 17, no split/insurance. ~0.5% with perfect strategy, ~2-4% for average play. |
Game Algorithms
Crash
The crash game uses a hash chain where each round's hash is the SHA-256 of the previous round's hash, creating a pre-determined sequence that can be verified after the seed is revealed. The crash point is computed from the first 8 hex characters of the round hash:
- Parse the first 8 hex characters as a 32-bit unsigned integer
h - Compute:
crashPoint = max(1, floor(0.97 * 2^32 / (2^32 - h) * 100) / 100) - The 0.97 factor represents the 3% house edge
- Approximately 3% of rounds crash at exactly 1.00x (instant crash)
Coinflip
Each coinflip generates a fresh server seed and combines it with the client seed via HMAC-SHA256.
- Generate a 32-byte server seed using
crypto.randomBytes(32) - Compute HMAC-SHA256 of
clientSeed:noncewith the server seed as key - Take the first byte of the HMAC result (value 0-255)
- If the byte value is < 125 (48.83% probability), the player wins at 2x payout
- House edge: 1 - (125/256 * 2) = ~2.34%
Dice
Dice allows players to choose a target number and direction (over/under), with dynamic payouts based on win probability.
- Generate HMAC-SHA256 as with coinflip
- Read the first 4 bytes as a 32-bit unsigned integer
- Roll =
(value % 10000) / 100, yielding 0.00 to 99.99 - Win chance depends on the chosen target and direction
- Payout multiplier =
97 / winChance(the 3% gap from 100 is the house edge)
Mines
Mines uses a 25-tile grid with a configurable number of mines (1-24). Mine positions are determined before the game begins.
- Generate HMAC-SHA256 from server seed, client seed, and nonce
- Use 2-byte segments of the HMAC to determine mine positions on the 5x5 grid
- Each gem reveal increases the multiplier based on the formula:
product of (remaining / safe) for each revealed gem, times 0.97 - The 0.97 factor provides a 3% house edge
- All mine positions are committed before the first tile is revealed and can be verified after the round
Blackjack
Blackjack uses a standard 52-card deck shuffled with a cryptographically secure Fisher-Yates shuffle.
- A 52-card deck is created and shuffled using
crypto.randomBytes(4)for each swap in the Fisher-Yates algorithm - A seed hash is generated and stored with the session for later verification
- Standard blackjack rules: natural blackjack pays 3:2, dealer stands on all 17s
- Players can hit, stand, or double down (on initial two cards only)
- Up to 3 seats per session
- House edge is approximately 0.5% with optimal basic strategy
How to Independently Verify
You do not need to trust us. Every game result can be independently verified using standard cryptographic tools. Here is how:
- Get the game data: After each game, the server seed, client seed, nonce, and seed hash are available. The seed hash is published before the game starts (commitment), and the server seed is revealed after.
- Verify the commitment: Compute
SHA-256(server_seed)and confirm it matches the pre-published seed hash. This proves the seed was not changed after your bet. - Reproduce the result: Compute
HMAC-SHA256(server_seed, client_seed + ':' + nonce)and apply the game-specific formula to derive the outcome. - Compare: The result you compute should exactly match the game outcome you experienced.
You can use any programming language or online HMAC-SHA256 calculator. The crash verifier tool above implements this process for the crash game. For other games, the same HMAC-SHA256 approach is used with game-specific result extraction as documented in the algorithms section above.