How every draw is proven
We commit to the result before you draw, and you can recompute every draw afterwards in your own browser. Nothing on this page needs to trust us.
Before you draw
Your account holds a secret server seed. We publish its SHA-256 fingerprint first, so the seed cannot be swapped later. You choose the client seed, and a counter (the nonce) goes up by one with every draw.
When you draw
The draw is HMAC-SHA256 of your client seed and nonce, keyed with the server seed. The first 52 bits pick a tier in proportion to its published weight; the next 52 bits pick one piece, with equal chances, from that tier's pieces in the pool. The exact pool is stored with the draw.
Afterwards
Open any draw and it is recomputed in your browser: the seed against the fingerprint we showed you, then the roll, then the piece. A seed still in use is revealed with one button, and a new one starts. If any number differs, the draw was not fair.
The exact computation
h = HMAC_SHA256(key = server_seed, message = client_seed + ":" + nonce) // hex, 64 chars
r1 = int(h[0:13], 16) // first 52 bits
r2 = int(h[13:26], 16) // next 52 bits
result = r1 / 2^52 // a number in [0, 1)
tier = first tier i where r1 * total_weight < cumulative_weight(i) * 2^52
item = floor(r2 * n / 2^52) // n = pieces still in that tier, ordered by id
pool = "v1|" + for each tier in pack order: tier_id ":" weight ":" item_ids (by id, comma separated), joined by ";"
pool_hash = SHA256(pool)The server seed is used as its 64-character hex string. All arithmetic is on whole numbers, so the result never depends on rounding. The same code runs in our database and on this page.
Check a draw
Open a draw and it is recomputed in this browser, with each check shown as it passes. Every draw on the site has the same page: yours, and anyone else’s.
Check a draw by hand
Paste the values from a draw’s page, or your own. Nothing is sent anywhere.
The result and each check appear here.
Your seeds
Change your client seed whenever you like. Doing so reveals your current server seed and starts a new pair at nonce 0.