Provably Fair

Every casino round is decided by a seed we commit to before the round starts and reveal after it ends. Nothing about the outcome can be changed in between, and you can check that yourself below, in your own browser, without trusting our server.

1

Commit

Before you bet we commit to a secret server seed by publishing only its SHA-256 hash. Solo games pair it with your own client seed and a nonce that counts your bets; shared rounds use the round ID.

2

Reveal

When you cycle your seed pair (or a shared round settles) the server seed is revealed. Hash it and it must equal the hash you saw before. That is the proof it was never swapped.

3

Verify

Recompute HMAC-SHA256(serverSeed, publicSeed:nonce). Its first 8 hex characters ÷ 0xFFFFFFFF is a number from 0 to 1: the roll. Each game turns that roll into its outcome in a fixed way, spelled out per game below.

How a Degen’s Dice round is derived

Open the standalone verifier on CodePen ↗

One roll decides the number. Classic dice is a solo game and draws from your seed pair; LIVE dice is a shared round that every player at the table sees, so it uses the round id as its public seed instead.

  1. 1Take the roll for nonce 0 (the public seed already carries your pair nonce, so the HMAC nonce is 0).
  2. 2Number = floor(roll × 100) + 1, so 1 to 100.
  3. 3Over wins when the number is strictly above your target; Under wins when it is strictly below.
  4. 4Win chance is 100 − target for Over and target − 1 for Under (clamped to 1–99). The multiplier is (100 ÷ win chance) × 0.995, which is the 0.5% edge.
verify.js · run with node
const crypto = require('crypto');

// One HMAC roll → a uniform number in [0, 1]
const roll = (serverSeed, publicSeed, nonce) => {
  const h = crypto.createHmac('sha256', serverSeed).update(`${publicSeed}:${nonce}`).digest('hex');
  return parseInt(h.slice(0, 8), 16) / 0xffffffff;
};

const serverSeed = 'PASTE_SERVER_SEED';   // revealed when you cycle (solo) or when the round settles (shared)
const publicSeed = 'PASTE_PUBLIC_SEED';   // solo: clientSeed:nonce   shared: the round id
console.log('hash =', crypto.createHash('sha256').update(serverSeed).digest('hex')); // must equal the hash shown before the bet

const target = 50, direction = 'over';       // your bet
const r = roll(serverSeed, publicSeed, 0);
const number = Math.floor(r * 100) + 1;      // 1..100
const won = direction === 'over' ? number > target : number < target;
console.log({ number, won });

Recent Dice rounds

newest first

For dice, roll = ⌊r × 100⌋ + 1, giving 1–100.

No settled rounds yet.

    Verify a dice round

    Pick a round on the left or paste seeds from your own bet history. You can also try any seeds you like. The outcome is deterministic. How dice is derived ↑ · Verify on CodePen ↗