Kruna

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

  1. 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.
  2. Open packs or play. Each result uses your seed pair and the next nonce: 0, 1, 2 and so on.
  3. 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.
  4. 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

verify.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

verify.py
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.

Where to next

Provably fairMystery pack odds, explainedIs KRUNA legit?

More guides