Provably fair

Public verification of the giveaway

The short version, no fluff

Winners are picked 100% at random and the result is verifiable by anyone. You don't have to trust us: below we explain why we couldn't cheat even if we wanted to.

1 · Every ticket has its number

When you participate you get numbered tickets. Before the draw we publish the full list of numbers, like showing all the balls before spinning the drum.

2 · We don't provide the randomness

The "lucky number" is emitted by drand, a public random-number lottery of the internet (run by Cloudflare, universities and others). Nobody can predict or change it: not us, not you, nobody. Winners come from there.

3 · You can check it yourself

Everything is published forever. With one click, your own browser redoes the math and shows you the result is exactly what it had to be, without trusting our server.

See the technical details ↓

For nerds: the raw data

Target drand round, SHA-256 fingerprint of the snapshot, the exact formula, the complete k-sequence history, a WebCrypto verifier in your browser, a Python snippet and the public verification API.

Giveaway data

Prizes20x Minecraft Hosting(20 winners in total)
Entry deadlineSep 1, 2026, 2:59 AM UTC
Current tickets5714
Snapshot frozenSep 1, 2026, 3:47 AM UTC
Tickets in the snapshot (N)5714
drand round#31810416
Round emittedSep 1, 2026, 3:50 AM UTC
Key ruleOne prize per participant

01 · FROZEN LIST

Before the draw we publish the 5714 tickets, the prizes and their digital fingerprint (SHA-256). Nothing can be changed without being noticed.

02 · PUBLIC RANDOMNESS

The randomness comes from drand round #31810416, a public randomness beacon; nobody (including us) can predict or manipulate it.

03 · ONE SPOT PER ROLL

ids[sha256(hash:k) mod N] repeats with k=0,1,2… filling the 20 spots in tier order. Repeated ones are skipped and recorded.

Snapshot fingerprint: 2cad537c93a525a7efffcd4104a120b2494104b9a87a81609994b10d68e919d9

Number of round #31810416: 6e623e3b315a94f380b449578345cc6334c0c92060a3c78ab8124fb7e1103530

Roll sequence (20 iterations for 20 spots)

k=0#502051→ Minecraft Hosting · spot 1k=1#526368→ Minecraft Hosting · spot 2k=2#224394→ Minecraft Hosting · spot 3k=3#515548→ Minecraft Hosting · spot 4k=4#232901→ Minecraft Hosting · spot 5k=5#543524→ Minecraft Hosting · spot 6k=6#353533→ Minecraft Hosting · spot 7k=7#986645→ Minecraft Hosting · spot 8k=8…19·

Complete sequence history

kTicketResultPrizeReasonDate
0#502051
Winner
Minecraft Hosting · spot 1·Sep 1, 2026, 3:50 AM UTC
1#526368
Winner
Minecraft Hosting · spot 2·Sep 1, 2026, 3:50 AM UTC
2#224394
Winner
Minecraft Hosting · spot 3·Sep 1, 2026, 3:50 AM UTC
3#515548
Winner
Minecraft Hosting · spot 4·Sep 1, 2026, 3:50 AM UTC
4#232901
Winner
Minecraft Hosting · spot 5·Sep 1, 2026, 3:50 AM UTC
5#543524
Winner
Minecraft Hosting · spot 6·Sep 1, 2026, 3:50 AM UTC
6#353533
Winner
Minecraft Hosting · spot 7·Sep 1, 2026, 3:50 AM UTC
7#986645
Winner
Minecraft Hosting · spot 8·Sep 1, 2026, 3:50 AM UTC
8#588688
Winner
Minecraft Hosting · spot 9·Sep 1, 2026, 3:50 AM UTC
9#271381
Winner
Minecraft Hosting · spot 10·Sep 1, 2026, 3:50 AM UTC
10#971971
Winner
Minecraft Hosting · spot 11·Sep 1, 2026, 3:50 AM UTC
11#587556
Winner
Minecraft Hosting · spot 12·Sep 1, 2026, 3:50 AM UTC
12#476639
Winner
Minecraft Hosting · spot 13·Sep 1, 2026, 3:50 AM UTC
13#192323
Winner
Minecraft Hosting · spot 14·Sep 1, 2026, 3:50 AM UTC
14#437560
Winner
Minecraft Hosting · spot 15·Sep 1, 2026, 3:50 AM UTC
15#636935
Winner
Minecraft Hosting · spot 16·Sep 1, 2026, 3:50 AM UTC
16#969874
Winner
Minecraft Hosting · spot 17·Sep 1, 2026, 3:50 AM UTC
17#400436
Winner
Minecraft Hosting · spot 18·Sep 1, 2026, 3:50 AM UTC
18#184858
Winner
Minecraft Hosting · spot 19·Sep 1, 2026, 3:50 AM UTC
19#861740
Winner
Minecraft Hosting · spot 20·Sep 1, 2026, 3:50 AM UTC

Current winners: Minecraft Hosting · spot 1 → #502051 (d***@g***.com) · Minecraft Hosting · spot 2 → #526368 (s***@h***.com) · Minecraft Hosting · spot 3 → #224394 (l***@g***.com) · Minecraft Hosting · spot 4 → #515548 (l***@h***.com) · Minecraft Hosting · spot 5 → #232901 (r***@g***.com) · Minecraft Hosting · spot 6 → #543524 (t***@g***.com) · Minecraft Hosting · spot 7 → #353533 (s***@g***.com) · Minecraft Hosting · spot 8 → #986645 (j***@g***.com) · Minecraft Hosting · spot 9 → #588688 (c***@g***.com) · Minecraft Hosting · spot 10 → #271381 (r***@g***.com) · Minecraft Hosting · spot 11 → #971971 (d***@g***.com) · Minecraft Hosting · spot 12 → #587556 (m***@g***.com) · Minecraft Hosting · spot 13 → #476639 (l***@g***.com) · Minecraft Hosting · spot 14 → #192323 (m***@g***.com) · Minecraft Hosting · spot 15 → #437560 (i***@g***.com) · Minecraft Hosting · spot 16 → #636935 (r***@g***.com) · Minecraft Hosting · spot 17 → #969874 (j***@g***.com) · Minecraft Hosting · spot 18 → #400436 (y***@g***.com) · Minecraft Hosting · spot 19 → #184858 (v***@g***.com) · Minecraft Hosting · spot 20 → #861740 (j***@g***.com)

Or by hand, with Python

It verifies the snapshot checksum, that the number used is EXACTLY the one published by the drand beacon, and that EVERY published iteration k comes from that number. Skips (already-awarded participant) are declared with their reason in the same API.

import hashlib, json, urllib.request

data = json.load(urllib.request.urlopen("https://sorteos.holy.gg/api/public/verificacion"))
ids  = data["snapshot"]["entryIds"]
seed = data["giveaway"]["drandRandomness"]   # numero aleatorio publico de drand

# 1) checksum == sha256(snapshot)
canon = json.dumps(ids, separators=(",", ":")).encode()
assert hashlib.sha256(canon).hexdigest() == data["snapshot"]["checksumSha256"]

# 2) el numero es EXACTAMENTE el que publico el faro drand (no lo pusimos nosotros)
chain = data["giveaway"]["drandChain"]
rnd   = data["giveaway"]["drandRound"]
beacon = json.load(urllib.request.urlopen(f"https://api.drand.sh/{chain}/public/{rnd}"))
assert beacon["randomness"] == seed, "el seed no coincide con drand"

# 3) k -> ids[sha256(seed:k) mod N]
for r in data["rolls"]:
    d = hashlib.sha256(f"{seed}:{r['k']}".encode()).hexdigest()
    assert ids[int(d, 16) % len(ids)] == r["entryId"], f"k={r['k']} mismatch"

print("OK")
for r in data["rolls"]:
    lot = r.get("prizeLot") or {}
    seat = f"{lot.get('label')} · lugar {r['seatIndex']}" if r.get("seatIndex") else ""
    print(r["k"], r["entryId"], r["status"], seat, r.get("reason") or "")

Questions about the process? Write to us on the Discord · Back to the giveaway