Provably Fair

Every result is independently verifiable

1

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.

2

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.

3

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.

4

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

Fair

Dice

roll = Float(server, client, nonce) × 100 → compared to your target

Fair

Limbo

multiplier = (1 − edge) / (1 − Float(...)) → beat your target to win

Fair

Mines

Fisher–Yates shuffle from sequential Float() calls → mine positions

Fair

Plinko

each row: Float(…, nonce+i) ≥ .5 → right else left → bucket index

Fair

Roulette

number = ⌊Float(...) × 37⌋ → 0–36 (single-zero wheel)

Fair

Gates of Lays

HMAC stream (server, client:nonce:counter) drives every reel & cascade