Provably fair

Every match is verifiable

We publish a commitment before the first move and reveal the seed after the last one. Nothing about a result is decided by us in the moment — it is all determined by seeds you can inspect.

  • SHA-256 commitment
  • HMAC-SHA256 stream
  • Public server seed
  • Hash-chained rounds
  • Client seeds included
  • Open verification

Verify a match

By code

The code is shown on every match screen and in your account history.

How it works

ComponentMeaning
server_seed = base64(random(64 bytes)) A fresh 64-byte server seed is generated the moment the invite is created.
commitment = sha256(server_seed) Only the hash is published up front. It locks the seed in place — it cannot change later.
client_seed = 16 hex chars per player Each player contributes a seed when they join. Both are published with the match.
stream = HMAC_SHA256(server_seed, combined_clients + ":" + nonce + ":" + cursor) The resulting hex is cut into 32-bit chunks to produce a uniform stream of numbers.
first turn = stream number at cursor 0 (0 = creator starts) Tic Tac Toe uses it to decide who opens each board.
target = stream number at cursor 1, scaled to 1-100 Number Clash draws its target number straight from the stream, so it is reproducible too.
round_hash = sha256(prev_hash + "|" + round_no + "|" + state + "|" + result) Every round is chained to the previous one, so no past result can be altered.

Why this cannot be rigged. The server seed is fixed before you join, and its hash is already public. If we changed the seed after seeing your moves, the hash would no longer match — the check above would fail. If you changed your client seed, the same is true on your side. The stream is deterministic, so both players can reproduce every single round from the published data.

What you need to reproduce it. The server seed (revealed after the match), both client seeds, the round number, and the HMAC-SHA256 formula shown above. Anything that uses the stream — including who opens each Tic Tac Toe board — falls straight out of it.

Client seeds are yours. You never have to accept ours — the format is a plain hex string, and the combined key is simply creatorSeed-joinerSeed.