Skip to content
KAKALOT

KAKALOT Originals fairness: verify every round yourself

Every KAKALOT Originals game is built so you can check that each result was fixed before you played and was not changed afterwards. This page explains the idea and the steps, so you do not have to take the site's word for it.

The idea: lock first, reveal later

Before you play, the system creates a secret value called the server seed and shows you only its commitment (the SHA-256 of the server seed). The commitment works like a sealed envelope: the site cannot change the secret later without the hash no longer matching.

Each result is computed from the server seed, the client seed (your side's value) and the round number (nonce) with HMAC-SHA256. When you press "Rotate seed", the old server seed is revealed, so you can recompute every round played with it yourself.

How to verify a round

  1. Before playing, note the commitment of the current seed (server seed hash), the client seed and the nonce.
  2. Play as usual. Every round has a round ID and appears in your bet history.
  3. Press "Rotate seed and reveal the old one". The server seed of the previous pair is shown.
  4. Check that the SHA-256 of the revealed server seed equals the commitment you saw before playing. If it matches, the site did not change the value after you started.
  5. Compute HMAC-SHA256 with the server seed as the key and the message format of that game (table below), and compare it with the result of the round.
  6. Or press "Verify" on the game page: your browser recomputes everything for you, without trusting the server's result.

Message formats used by each game

The examples use the client seed clientSeed and nonce 7; your real values are shown on the game page. Games that use several digests count them from 0.

HMAC-SHA256 message format of each game
GameMessage
HEADS OR TAILSclientSeed:7
DRAGON'S VAULTclientSeed:7:vault:0 , clientSeed:7:vault:1
DROP CHAINclientSeed:7:drop:0 , clientSeed:7:drop:1 , ...
COIN FOXclientSeed:7:reels:0 , clientSeed:7:reels:1 , ...
ROYAL INGOTSclientSeed:7:ingot:0 , clientSeed:7:ingot:1 , ...
GOLDEN KICKclientSeed:7:kick:0 , ... , clientSeed:7:kick:3
FOXBALLclientSeed:7:fb:0 , ... , clientSeed:7:fb:7

Royal Jackpot draws use an extra message. For HEADS OR TAILS it is clientSeed:7:jackpot, and the first 6 bytes of the result are the number that decides the jackpot.

The HMAC key is the bytes of the server seed (hexadecimal: base 16, 64 characters). Each game has its own rule for turning the result into coins, cards or a board; see each game guide for details.

Sample code: verify HEADS OR TAILS

The code below runs in your browser console. It checks the commitment and the coin flip of one round (message clientSeed:nonce).

const hex = (s) => Uint8Array.from(s.match(/../g).map((h) => parseInt(h, 16)));
const toHex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');
async function verifyCoin(serverSeed, serverHash, clientSeed, nonce, coins) {
  const seed = hex(serverSeed);
  const hashOk = toHex(await crypto.subtle.digest('SHA-256', seed)) === serverHash;
  const key = await crypto.subtle.importKey('raw', seed, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
  const digest = new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(clientSeed + ':' + nonce)));
  let result = '';
  for (let i = 0; i < coins; i++) result += digest[i] & 1 ? 'T' : 'H';
  return { hashOk, result };
}

Round IDs and the hash chain

Every round has a unique sequential round ID, such as RI-0000001 for real-money ROYAL INGOTS and DI- for demo. Each game has its own prefix, and the round ID shows on the game page and in your bet history.

The database keeps a hash chain of consecutive rounds: the hash of each round includes the hash of the previous round, the round ID, the seed commitment, the client seed, the nonce and the result. If a round were changed or inserted afterwards, the chain would break and stop matching every later round.

ROYAL BACCARAT: every card locked

Baccarat locks the whole shoe. When a shoe opens, its 416 cards (8 decks) are shuffled and each card is locked with a SHA-512 commitment of the text "position:card:salt". When a card is dealt, its salt is revealed so you can check that the dealt card matches what was locked before the first hand. When the shoe ends, its seed is revealed so the whole shuffle can be checked. Details are in the ROYAL BACCARAT guide.

Limits worth knowing

This kind of check proves that results were not changed after you started and were computed by the published rules. It does not make the next round predictable and does not improve your chances: every round is still random.

The demo that visitors play without signing up creates its seed and computes results in your own browser, with the same engine and tables as the real game. It is practice with free points: no money account and no jackpot.

Frequently asked questions

What is Provably Fair?

A way for players to check that each result was decided by values locked before play: the site shows a commitment of its secret first, then reveals the secret later so the result can be recomputed.

Do I need to write code to verify?

No. Press "Verify" on the game page and your browser does the work. If you want to check it yourself, use the steps and the sample code on this page.

Why do I have to rotate the seed before verifying?

The server seed is a secret. If it were revealed while still in use, anyone could know the next results in advance, so it is revealed only when you rotate to a new pair.