← 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-05-31T20:08:58.518Z).

005e2c45f7f29960a12492dc08fe5a3a82f714f2811afebd6de7439003fbc753

2. Reveal (server_seed)

Revealed after draw (2026-06-07T18:57:39.398Z).

1f9f66b775884f8b51e00c9fc1adf05b389021b094b3342f9c050cb00f3f152a

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

3. Client seed inputs (all sold eggs)

#WalletWinner?
1Ano4Dm...chSw
2AMEQq4...cvwL
3HaLgyS...MkHA
4GNCYQN...uvhg
5CyLwMe...zQZ8
69UU1p3...teVt
79eXWfv...S3j8
8FbDEGb...BY5V
96rgm97...jVTD
102ABhMj...WC8a
116JwQFt...s1Rg
12Es5494...p7bs
13FDA2E7...FPbJ
1477KYS5...Y2vM
15Ghhwya...UsoP
16GLZh4h...Vamj
178nRfsK...BicL
1833RcNv...mNKB
19FXUyLQ...zhKe
204vdwQd...KDfW
21AQmp7N...Eatz
22J17RXt...Wma5
232ird6n...86mv
24HqEtjN...yheB
25GbmNiL...xp1Y
26DrUKju...cZKt
275CKeAq...mwcm
287QGAeb...6NJs
296Gsgrt...CxUi
30B5MHQQ...xyP3
316W5g8Q...P3AD
325DcAQv...r45E
33E1VVNK...Ba9E
34EzfMVi...2QC6
35AJrFv5...wZAc
369hj7jn...p66e
37BGDKeT...iukC
3891JaeS...TupZ
39i3A7TA...TRxr
407Y8vNk...Ddyt
4143y2Hn...8yuJ
42nRjJ6h...Ln6s
43EeYGZ1...rMPf
44BYqn3m...WNE3
459hg9p8...Fi91
46B1Essa...sMC1
47Hrtv5Q...1iHP
48F4JqCb...fNhK
49Eh5paK...jcm6
50CoVhCT...D6Cn🎉

4. Derived client_seed

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

347e9cb5b1c49d3ee0159f8890657210dfe72cd95ccf6cf060b0275bde91fc6b

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-05-31T20:08:58.518Z). Any Bitcoin block mined after the commit works — we take the tip at draw time.

sourcemempool.spaceheight952,751hash00000000000000000000e7e516f4265b0d2842d3f3f4aa07c5d7d058fe98ecdablock time2026-06-07T18:53:14.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 (50).

hmac = fba7898e0eb81df5c515bef136239b853aeb4037ada6d3e1a3c2b9c8796779a9

Computed index: 49 → winning egg: #50

7. Independent verification

Show JS snippet (paste into DevTools)
const seed = "1f9f66b775884f8b51e00c9fc1adf05b389021b094b3342f9c050cb00f3f152a";
const hashStr = "005e2c45f7f29960a12492dc08fe5a3a82f714f2811afebd6de7439003fbc753";
const clientSeed = "347e9cb5b1c49d3ee0159f8890657210dfe72cd95ccf6cf060b0275bde91fc6b";
const lottoId = "4888b617-8c86-492a-958e-4b380f2f3869";
const sold = 50;
const entropy = "mempool.space:952751:00000000000000000000e7e516f4265b0d2842d3f3f4aa07c5d7d058fe98ecda";

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();