← Back to lotto

Provably-fair proof

This page reproduces the winner computation from public inputs. You can recompute every step in your browser's DevTools — don't trust our math, verify it.

1. Pre-commit (server_seed_hash)

Published when the draw went live (2026-06-07T20:13:04.816Z).

e52e437cfa01bd52cc81241338297ec2e78ad7a578faf4d4d94e1c03efc98a52

2. Reveal (server_seed)

Revealed after draw (2026-06-07T20:38:41.166Z).

b308eb7bbbf053c12ff6f2920026c21f701165aa71c13cae0d9fe7201e1de637

Hash check: ✓ sha256(server_seed) === published hash

3. Client seed inputs (all sold eggs)

#WalletWinner?
1616Bvi...2NfJ
2u1J3KU...uKTr
33GpPG9...HUfU
4DmqkGf...RcmT🎉
55if4DQ...o8Py
69pLzZf...k6z5
761eXm2...i91V
8B1QTWc...dfQN
92Tr8qV...2EjT
103sYC2t...bJfX
11382pDt...NnjZ
12LCthZL...KxCk
13DEi9xf...ABUM
144bHzE7...qxxk
155ARbkq...rAtV
16DDJUL2...Zihm
1733c5jK...gk7d

4. Derived client_seed

client_seed = sha256(sorted by entry_number, joined as "N:wallet" with '|')

cdb615ea2d6022d14dde6606e8a3587be01aa2791ed668110409f3ab621deae3

5. External entropy (Bitcoin block)

Mixed into the HMAC input so the draw depends on a value the operator could not have known when the server seed was committed ( 2026-06-07T20:13:04.816Z). Any Bitcoin block mined after the commit works — we take the tip at draw time.

sourcemempool.spaceheight952,760hash00000000000000000000779cc4509d9e3ee4d3a2d0e72a0e6c99da521a13ac73block time2026-06-07T20:18:11.000Z

Cross-check on mempool.space or blockstream.info.

6. Winner computation

HMAC-SHA256(server_seed, "client_seed:lotto_id:source:height:hash"), first 16 hex chars, mod sold_count (17).

hmac = f205e75ff481f6568e8ee2901521c4076c240bdd0e96bb5afd3f7757eaf612bf

Computed index: 3 → winning egg: #4

7. Independent verification

Show JS snippet (paste into DevTools)
const seed = "b308eb7bbbf053c12ff6f2920026c21f701165aa71c13cae0d9fe7201e1de637";
const hashStr = "e52e437cfa01bd52cc81241338297ec2e78ad7a578faf4d4d94e1c03efc98a52";
const clientSeed = "cdb615ea2d6022d14dde6606e8a3587be01aa2791ed668110409f3ab621deae3";
const lottoId = "adc0e67b-57d2-4084-82a5-6f20a24a23fa";
const sold = 17;
const entropy = "mempool.space:952760:00000000000000000000779cc4509d9e3ee4d3a2d0e72a0e6c99da521a13ac73";

async function run() {
  const enc = new TextEncoder();
  const seedBytes = enc.encode(seed);
  const hashed = await crypto.subtle.digest("SHA-256", seedBytes);
  const recomputed = [...new Uint8Array(hashed)]
    .map((b) => b.toString(16).padStart(2, "0")).join("");
  console.log("hashOk:", recomputed === hashStr);

  const key = await crypto.subtle.importKey(
    "raw", seedBytes, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]
  );
  const message = entropy
    ? clientSeed + ":" + lottoId + ":" + entropy
    : clientSeed + ":" + lottoId;
  const sig = await crypto.subtle.sign("HMAC", key, enc.encode(message));
  const hex = [...new Uint8Array(sig)]
    .map((b) => b.toString(16).padStart(2, "0")).join("");
  const idx = Number(BigInt("0x" + hex.slice(0, 16)) % BigInt(sold));
  console.log("hmac:", hex);
  console.log("winnerIndex:", idx);
}
run();