← All posts

Blog

Provably fair, explained with a real roll

How a committed server seed, your client seed and a nonce turn into the item you get — and how to check it yourself.

Updated 20 October 2026 · By the DragonDrop team

The problem it solves

When a website picks the result of a case on its own server, you normally have to trust it. Provably fair removes that trust: the site commits to its randomness before you play, and gives you everything you need to recompute every result afterwards.

The three ingredients

Server seed: a random 64-character secret generated by DragonDrop. Before you open anything, you are shown its SHA-256 hash. The hash locks the seed in: changing the seed later would change the hash, and you would notice.

Client seed: a value on your side. You can set it to anything on the Provably fair page, so the server can't pick a seed that happens to work against you.

Nonce: a counter that goes up by one with every case you open on the current seed pair. It makes every roll different even though the seeds stay the same.

From seeds to a ticket

For each case the server computes HMAC-SHA256 with the server seed as the key and "client_seed:nonce:0" as the message. The first 4 bytes of the result are read as a number and divided by 2³², which gives a value between 0 and 1. Multiplied by 100 000 and rounded down, it becomes your ticket.

Every item in a case owns a range of tickets. The case page lists those ranges: hover any item to see it. Your ticket lands in exactly one range, and that is your drop.

const hmac = crypto.createHmac("sha256", serverSeed)
  .update(clientSeed + ":" + nonce + ":0").digest();
const float = hmac.readUInt32BE(0) / 2 ** 32;   // 0 ≤ float < 1
const ticket = Math.floor(float * 100000);      // 0 … 99 999

Checking it yourself

Rotate your seed on the Provably fair page. The old server seed is revealed. Hash it with any SHA-256 tool and compare: it must match the hash you were shown before you played. Then run the snippet above for any nonce you played and compare the ticket with the item you got.

Case battles work the same way with a seed per battle, committed when the battle is created and revealed when it ends.