← 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-28T23:16:11.706Z).

64d52210459ca52b852b4a94c4ce2534d89066bbe217353229d4f1b507d245fb

2. Reveal (server_seed)

Revealed after draw (2026-05-31T23:15:15.491Z).

59a333470c93da10576fa3aa6249704ab30e9273495d44ce57670110c0ce631b

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

3. Client seed inputs (all sold eggs)

#WalletWinner?
1A3nRd6...Fbvt
2Ano4Dm...chSw
37MvYxZ...1dXP
471dfGd...SS6g
53TDBsG...ovyE
6AQmp7N...Eatz
7BsCuxX...F9UY
82ird6n...86mv
9kUS5Sy...dovw
10ARVJ9G...icGE
117Y8vNk...Ddyt
12did:pr...mmq2
13JBstPD...Zir9
14E1VVNK...Ba9E🎉
159UU1p3...teVt
164UVZsH...RXQH
173YBqQc...qsXu
182ABhMj...WC8a
19BeXDWz...ww2V
20Bao3UY...qPvx
21B9g8Cu...NiEn
223XuN7X...aiMT
23E5vC3a...XFPg
24EFwazu...HwWA
257f8q7a...W1mW
26Ghhwya...UsoP
27Es5494...p7bs
284ZbXXe...uNHz
293tf26E...YGoi
3026LURR...6wte
315CKeAq...mwcm
322wHMMg...HiGw
33HpwH4R...51xh
34CoVhCT...D6Cn
35D2mrbs...2VPQ
364CSfrx...w9TX
375DcAQv...r45E
38J17RXt...Wma5
39GbmNiL...xp1Y
40HnnL3K...zJUJ
41HqEtjN...yheB
42BEAq6S...fLtK
43FDA2E7...FPbJ
443Wsr1K...EMmZ
45EzfMVi...2QC6
46GNCYQN...uvhg
476X4AS1...nQww
48B5ywNJ...iHwX
499eXWfv...S3j8
51B5MHQQ...xyP3
528nRfsK...BicL
53CyLwMe...zQZ8
60ApeP8q...euwV
63BgecHp...Pk6P
67Eh5paK...jcm6
6998nEKr...vxCb
703JmzWh...J9vP
712jcazK...iEey
746JwQFt...s1Rg
77FHm4sR...gjWh
88FbDEGb...BY5V
98did:pr...ypmv
112GLZh4h...Vamj
135BGDKeT...iukC
1428x4sSX...Tt9Q
1989kw8KB...Jas6
20343y2Hn...8yuJ
21198c5iR...yeJv
237BYqn3m...WNE3
2504vdwQd...KDfW

4. Derived client_seed

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

bc12c403ec6033f816f94b0e28dff0c8a0e298fbeb45a7350a85041d11a4aede

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-28T23:16:11.706Z). Any Bitcoin block mined after the commit works — we take the tip at draw time.

sourcemempool.spaceheight951,909hash00000000000000000000efc192f4efd050945f391e9cde8845fc4139ce29b9f8block time2026-05-31T22:57:42.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 (70).

hmac = c0cf1f3a72194a1bfda75a2286bbd0337c10a569ea49a72aea16faa6eca9a74a

Computed index: 13 → winning egg: #14

7. Independent verification

Show JS snippet (paste into DevTools)
const seed = "59a333470c93da10576fa3aa6249704ab30e9273495d44ce57670110c0ce631b";
const hashStr = "64d52210459ca52b852b4a94c4ce2534d89066bbe217353229d4f1b507d245fb";
const clientSeed = "bc12c403ec6033f816f94b0e28dff0c8a0e298fbeb45a7350a85041d11a4aede";
const lottoId = "1c44903a-2c46-4745-9891-0bda998d898e";
const sold = 70;
const entropy = "mempool.space:951909:00000000000000000000efc192f4efd050945f391e9cde8845fc4139ce29b9f8";

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