PROVABLY FAIR
Games
Case Battles
Each player gets a ticket from 0 to 99,999 for each round. The item whose ticket range contains that number is awarded. The committed case configuration and locked player roster are included in the calculation.
// battle-hmac-sha256-v1 · roundIndex and slot start at 0
const message = JSON.stringify([
'battle-hmac-sha256-v1', battleId, configHash,
rosterHash, clientSeed, 'item', roundIndex, slot,
cursor, 0 // final value is the digest block index
]);
// HMAC-SHA256(serverSeed, message), with rejection sampling
const ticket = acceptedDigestValue % 100000n;Standard battles compare team item values; Crazy uses the lowest value, and Terminal counts only the final round. Ties use a separate seeded draw. Jackpot uses a weighted seeded draw; Crazy Jackpot reverses the weights. Shared modes divide the pool between players.
Paste a completed battle’s ID or link into the verifier to check every player’s ticket and item in every round. The saved seeds and battle details are loaded automatically. Final winner selection and payouts are not checked by this verifier.
Case Opening
Your server seed, client seed and play nonce generate a ticket from 0 to 99,999. The ticket selects the item from the case’s saved, inclusive ticket ranges. Use the case snapshot from that opening, since a case’s contents can change later.
// case-hmac-sha256-v1
const message = `case-v1:${clientSeed}:${nonce}:${cursor}`;
// First 4 digest bytes, interpreted as an unsigned big-endian integer.
// Reject values >= 4294900000 and retry with the next cursor.
const ticket = acceptedValue % 100000;Upgrader
Upgrader generates a roll from 0.00000000 to 99.99999999. You win if it falls within your selected range. The start is included and the end is excluded; a range can wrap past 100 back to zero.
// upgrader-hmac-sha256-v1
const message = JSON.stringify([
'upgrader-hmac-sha256-v1', clientSeed, nonce, cursor
]);
// Use the full HMAC-SHA256 digest, with rejection sampling.
const ticket = acceptedDigestValue % 10000000000n;
// Display ticket / 100000000 with exactly 8 decimal places.
const won = (ticket - rangeStartTicks + 10000000000n)
% 10000000000n < winTicks;Your wager, target value and the game configuration set the winning range’s width. Compare the reproduced roll with the winning range saved in your bet.
21 — Coming soon
The fairness explanation and verifier for 21 will be available when the game launches.

