How to verify a provably fair open
Updated 27 October 2026
Provably fair means you do not have to trust the site's word for a result. Before you play, the site commits to a secret; after you play, it hands the secret over; and anyone can recompute every result from it. This guide does that end to end.

- Method
- HMAC-SHA256
- Inputs
- 3
- server seed, client seed, nonce
- Steps on site
- 4
- Code needed
- 5 lines
On the site, in four steps
- Open Provably fair (the shield icon on any pack or game) and go to Seeds. Note the server seed's fingerprint (its SHA-256 hash). Set your own client seed if you like.
- Open packs or play. Each result uses your seed pair and the next nonce: 0, 1, 2 and so on.
- Back in Seeds, press New pair. The old server seed is revealed in full. Check that its SHA-256 matches the fingerprint you noted: if it does, the secret was fixed before you played.
- Go to Verify, pick the pack and the nonce, and the panel recomputes the roll and shows the item it lands on. House-game rounds are under the Games tab.
The maths
roll = first 8 hex characters of HMAC-SHA256(key = server seed, message = client seed + ":" + nonce), read as a number and divided by 0xFFFFFFFF. That gives a number from 0 to 1.
The pack's items are lined up in their roll order, each taking a share of 0 to 1 equal to its chance. The roll lands in exactly one share, and that item is the result.
Do it yourself: Node.js
const crypto = require("crypto");
const serverSeed = "6b72756e612d6578616d706c652d7365727665722d736565642d303030303031";
const clientSeed = "my-own-seed";
const nonce = 1;
// 1. The fingerprint you were shown before opening
console.log(crypto.createHash("sha256").update(serverSeed).digest("hex"));
// 2. The roll
const hmac = crypto.createHmac("sha256", serverSeed).update(`${clientSeed}:${nonce}`).digest("hex");
const roll = parseInt(hmac.slice(0, 8), 16) / 0xffffffff;
console.log(roll);With these example seeds the roll is 0.7665680842. In Finance Bro that roll lands on Unvested RSUs.
Do it yourself: Python
import hashlib, hmac
server_seed = "6b72756e612d6578616d706c652d7365727665722d736565642d303030303031"
client_seed = "my-own-seed"
nonce = 1
print(hashlib.sha256(server_seed.encode()).hexdigest()) # the fingerprint shown before you played
digest = hmac.new(server_seed.encode(), f"{client_seed}:{nonce}".encode(), hashlib.sha256).hexdigest()
roll = int(digest[:8], 16) / 0xFFFFFFFF
print(roll)House games
Plinko, Mines, Coinflip and Crash use the same seed pair and nonce. The first number is the same roll as above; a game that needs more numbers (a Plinko path, a Mines board) draws them from a second key, SHA-256(server seed + ":games-stream"), so your choice of client seed can never be used to read ahead.
Seeds cannot be rotated while a game round is open, because revealing the server seed would show the mines.
Questions
- Can the site change the result after I bet?
- No. The server seed is fixed and its fingerprint shown before you play; change it and the fingerprint would no longer match the revealed seed.
- Why do I need to rotate seeds to check?
- The server seed in use must stay secret, or anyone could compute the next results. Rotating retires it and reveals it.
- Does my client seed matter?
- It makes sure the site could not have picked a server seed to suit you. Change it whenever you like; it applies from the next open.






