01How a round is derived
02How each game reads the stream
Each game starts at cursor 0 of its own domain. All amounts are integers in the smallest unit; multipliers are basis points and always include the stake.
- Keno
sampleUnique(10, [1..40]) - Ten unique numbers of 1–40, kept in draw order. Hits are your picks that appear in the draw; the paytable for your risk profile and pick count sets the multiplier.40 bytes · every (risk, picks) pays 98.5–99.1 % RTP
- Mines
sampleUnique(k, [0..24]) - The k mine positions on the 5×5 grid are fixed before your first pick. Each safe pick multiplies by the exact odds, less a 1 % edge, rounded down.4·k bytes · 99 % RTP at every cash-out point
- Moles
sampleUnique(n, [0..6]) per step - For each of the 8 steps the stream fixes n of the 7 holes — all at start, from the continuing stream. Only resolved steps are ever published.4·n·steps bytes · 0.99 per step taken
- Roulette
uniformInt(37) - One number 0–36 — the number itself, not a wheel index. Each bet class pays from the versioned paytable; zero loses every outside bet.4 bytes · 36/37 = 97.2973 % RTP with the v1 table
- Wheel
uniformInt(slices) - One slice index of the 10–50 on the wheel. The multiplier is read from the versioned paytable for your risk level; the wheel simply stops with that slice under the pointer.4 bytes · every (risk, slices) table pays exactly 97.00 % RTP
- Blackjack
shuffle([0..311]) - A Fisher–Yates shuffle of the 6-deck shoe. Card c: rank = (c mod 52) mod 13, suit = ⌊(c mod 52) / 13⌋. Dealt from index 0 — player, dealer up, player, dealer hole — then as your actions require; the verifier replays them.≈ 1 250 bytes · S17 · DAS · 3:2 · no insurance
Arena games have no per-player seed pair. The server still commits to a seed before anyone enters; the message binds the outcome to the participants instead of a nonce. House fee 5 %, the rest goes to the winner.
- Jackpot
betit/v1/jackpot:<roundId>:<salt>:<cursor> - The salt is the SHA-256 of the entry ids in ticket order, so the draw is bound to the final list of players. The winning ticket is uniform over the pot — 8-byte rejection sampling, since a pot can exceed 2³² units.
- Coinflip
betit/v1/coinflip:<matchId>:<creatorEntryId>:<opponentEntryId>:0 - The first byte of the block decides: even is heads, odd is tails. The opponent's entry id does not exist until they join, so nobody can know a seed's outcome in advance.
- Rock-paper-scissors
betit/v1/rps:<matchId>:<creatorEntryId>:<opponentEntryId>:<cursor> - Your picks decide. On a tie the stream draws a fresh pair for both players (uniformInt(3) each) until the match is decided; every reroll is recorded in the result.
03Verify it yourself
The exact message format, and a frozen test vector you can check with any HMAC-SHA256 tool.
block(cursor) = HMAC-SHA256( key = utf8(serverSeed), // the 64-char hex string itself, not its bytes msg = utf8("betit/v1/<game>:<clientSeed>:<nonce>:<cursor>") ) stream = block(0) ‖ block(1) ‖ block(2) ‖ … // 32 bytes each, cursor from 0 uniformInt(n): v = next 4 bytes as u32; limit = ⌊2³² / n⌋ · n; // v < limit ? v mod n : next 4 bytes
$ printf '%s' "0000000000000000000000000000000000000000000000000000000000000000" | shasum -a 256 60e05bd1b195af2f94112fa7197a5c88289058840ce7c6df9693756bc6250f55 $ printf '%s' "betit/v1/keno:betit:1:0" | openssl dgst -sha256 -hmac "0000000000000000000000000000000000000000000000000000000000000000" 8b0dc157a6cee2cc… // first 8 bytes of block 0 → keno draw 8 21 28 2 10 14 5 12 24 31
- serverSeed
- 4f5c1b2a9d8e7f60123456789abcdef0fedcba9876543210a1b2c3d4e5f60718
- SHA-256 (commitment)
- eea407868f1190ae6afb1ed569b7207fa6dbbd8eb9284f6a074f19d2846bd0ba
- clientSeed / nonce
- my-client-seed_01 / 7
- keno block 0, first 8 bytes
- b9ed7bc078ad365a
- keno draw
- 33 34 36 21 17 7 32 5 2 22
- mines, k = 3
- 8 0 7
- moles, n = 2, steps 1–3
- [0 4] [5 2] [2 4]
- blackjack shoe, first 10
- 34 6 9 90 105 28 188 102 45 305
Open vector 2 in the verifier — with picks 1 21 33 34 36 and a 1 000 000 stake it pays 16 500 000 (4 of 5 hits, 16.5000× on the classic table).
The verifier is the same code the server runs: packages/core/src/fairness.ts (commitment, stream, sampling) and packages/core/src/games/verify.ts (full-round replay), bundled into this site. The machine-readable spec with all three vectors is at /api/fairness/spec, and every settled round is public at /api/fairness/round/<id>.