Provably fair

The result of a round is fixed before you play, and we publish a lock on it up front. The lock is public: anyone can see it before the round, and it cannot be swapped afterwards. After the round we hand over the key, and you can check that the key fits the lock. If it does, the result was not changed after your bet. The lock is a hash, a fingerprint of a secret value: the same input always gives the same output, and the output cannot be turned back into the input.

Every provably fair system runs the same loop: the operator locks in a secret and publishes its fingerprint before the round, the player's input joins the round, the secret is revealed afterwards, and anyone can recompute the fingerprint to check it matches the one published first.

Different games do this with different inputs. The three cards below are the three methods in use here. The first mixes a seed you control into every roll; a seed is a text string the random number is computed from. The second ties the result to a block on the public EOS blockchain, chosen by number before it exists. The third reads every crash multiplier from one long list of hashes built before the first round. Find your game on a card and open it for the full walkthrough. Every term is defined in the glossary, and your own seeds and round history are under Reference.

Your seeds at a glance

The exact values every demo on this page plays with. Rotate or change them here and the whole page follows — see them in action in the .

Sandbox

Local only — nothing here leaves your browser.

Server seed hash

SHA-256

e5299018156cf7c8a1d8e812b7b07989b36658f579319d1765d6682e74198bb5

Client seed

Nonce

1

Counts up by one every round, so no two rounds share an outcome.

History

Every round leaves a row you can check later. Sandbox rounds land here the moment you play one in the walkthrough.

Sandbox

Rounds played in the walkthrough demos

No rounds yet — open the to play one.

The game modes

Every game settles through one of three schemes. Same promise each time — the outcome is fixed before you play, and checkable after.

Client seed + server seed

Your client seed, the server's seed and a nonce are hashed together to seed the outcome.

Deals

Your roll is a combination of your client seed and the server's seed.

Cases

The case opening system uses the same provably fair mechanism as deals.

Mines

The mines game uses a provably fair system based on your client seed and the server's seed.

Keno

The keno game uses a provably fair system based on your client seed and the server's seed.

Daily Case

Your daily case draws a single number from your client seed, the server seed and a nonce, hashed together with SHA-256.

EOS block hash

A key and salt are committed up front; the outcome is sealed once the EOS block they reference is mined.

Battles

Before a game starts, we combine the key, salt, and block hash to create a SHA-256 hash, which is then used to seed a random number generator.

Jackpot

Jackpot is a battle mode: the battle's rolls are generated exactly like any other battle.

Coinflip

Before a game starts, we combine the key, salt, and block hash to create a SHA-256 hash, which is then used to seed a random number generator.

Hash chain

The outcome is read directly off a pre-committed chain of hashes, walked one link per round.

Crash

The crash multiplier comes straight from the round's revealed hash — no client seed involved.

Verify it off-site

Don't take this page's word for it. These checks run in any JavaScript console — browser or node — with none of our code involved.

Client & server seeds

Recompute the outcome hash from your seeds and nonce.

Example Code
// Any browser console or node 18+ — no library, none of our code.
// Recompute a round's outcome hash and compare it to the one we showed. const clientSeed = "your-client-seed"; const serverSeed = "the-revealed-server-seed"; const nonce = 1234; const data = new TextEncoder().encode(`${clientSeed}:${serverSeed}:${nonce}`); crypto.subtle.digest("SHA-256", data).then((buf) => { const hash = Array.from(new Uint8Array(buf)) .map((b) => b.toString(16).padStart(2, "0")) .join(""); console.log("outcome hash:", hash); }); // A matching hash proves the round came from these exact inputs. // The roll derived from it needs the seedrandom package (not built into // consoles), so that half runs in node: // npm i seedrandom // node -e "console.log(require('seedrandom')('PASTE_OUTCOME_HASH')())"

EOS battles

Recompute the commitment and the outcome hash from key, salt and block hash.

Example Code
// Any browser console or node 18+ — no library, none of our code.
const key = "the-revealed-key";
const salt = "the-revealed-salt";
const blockHash = "the-eos-block-hash";

const sha256hex = async (text) => {
const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
return Array.from(new Uint8Array(buf))
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
};

// The commitment shown during the countdown:
sha256hex(`${key}:${salt}`).then((h) => console.log("commitment:", h));
// The outcome hash the battle's rolls are seeded from: sha256hex(`${key}:${salt}:${blockHash}`).then((h) => console.log("outcome:", h)); // The rolls themselves need seedrandom (node): // npm i seedrandom // node -e "const r=require('seedrandom')('PASTE_OUTCOME_HASH'); for (let i=0;i<5;i++) console.log(r())"

Hash chain (Crash)

Walk the chain back one link, and read the multiplier straight off the hash.

Example Code
// Any browser console or node 18+ — no library at all for this one.
// Hashing THIS round's revealed hash must reproduce the hash that was // already published for the round BEFORE it — one link of the chain. const roundHash = "this-rounds-revealed-hash"; crypto.subtle.digest("SHA-256", new TextEncoder().encode(roundHash)).then((buf) => { const prev = Array.from(new Uint8Array(buf)) .map((b) => b.toString(16).padStart(2, "0")) .join(""); console.log("previous round's hash:", prev); }); // The multiplier is pure arithmetic on the hash — also no library: // const max = 2n ** 52n; // const n = (BigInt("0x" + roundHash) % max) + 1n; // console.log("multiplier:", Number((100n * max) / n) / 100);

Glossary

Every term these pages use, in one place.

Server seed

Our half of a round's input. You get its SHA-256 hash up front; the seed itself is revealed when you rotate it.

Client seed

Your half of the input. Any string you like — we can't predict it, and you can change it at any time.

Nonce

A counter that rises by one every round, so the same seed pair never produces the same result twice.

Commitment

A hash published before the round that fixes our input without showing it. The input is revealed afterwards and must hash to it.

Rotate

Retiring the active server seed. The old seed is revealed so its rounds can be checked; a new seed with a new published hash takes over.

Key

The secret a battle, jackpot or coinflip round is built from. Committed before the round, revealed once it has settled.

Salt

A second random value hashed together with the key in the commitment; both are revealed after the round.

EOS block

A batch of transactions on the public EOS blockchain, produced every half second with its own id. A round names a future block by number.

Block hash

The id of the EOS block a round is sealed to. Produced by the blockchain, chosen by neither side.

Hash (SHA-256)

A one-way fingerprint: easy to compute from its input, impossible to run backwards, and any change to the input changes it.

Hash chain

A list of hashes where each one is the hash of the one before it. Crash reads its rounds off one such chain, built before the first round.

Roll

The 0-1 number a round's hash is turned into. It is the only randomness any game consumes.

What this proves — and what it doesn't

Provable fairness is a precise claim. Here is exactly where it ends.

It proves the roll, not the odds

The math proves your roll was fixed before you played and untouched after. What that roll pays is a separate question: every game's payout table sets the odds and the house edge, published on the game itself.

The demo chain is local

The EOS figure on this page simulates its block hash locally so you can play with the mechanism. Real battles read the real EOS chain, and every settled round shows the actual block it was sealed to.

If a round ever fails to verify

Keep your inputs — the seeds and nonce, or the key, salt and block hash — and the result you computed, and bring them to support. Every round is traceable from its inputs, so this is a show-us-the-numbers conversation, not a dispute.

Chat is frozen! (0 queued)

live rain

0 min Ago

$0.00

Chat is locked

Sign in

rules