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 999Checking 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.