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.
Before the round, we seal a secret and publish its hash. It cannot be swapped later. Signed in, yours is the hashed server seed under Your seeds.
You play. Your input joins the round, mixed with a secret that was locked before you did anything.
After the round, the sealed secret is opened for everyone to see.
Hash the opened secret yourself. It must equal the hash published at the start.
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 .
Local only — nothing here leaves your browser.
Server seed hash
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.
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.
// 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.
// 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.
// 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
rules