How raffle draws work
The seed is locked before the raffle, the ticket list is locked before the draw, and anyone can repeat the draw.
1. Commit before the challenge
Before publishing a raffle, the server creates a random 256-bit seed and publishes SHA-256 of its hexadecimal text. The seed is encrypted at rest and hidden until the draw.
2. Freeze the tickets
After the deadline for adding spins and the team's checks, the ticket list is sorted by entry ID. Each ticket contains entryId, userId and betId, in that order. The compact JSON digest is published with the frozen list.
3. Draw without bias
ARENA_HMAC_SHA256_V1 signs “ARENA_HMAC_SHA256_V1:manifestHash:counter” with the seed bytes. The counter starts at zero. Each digest’s first four bytes form an unsigned big-endian number. Rejection sampling removes modulo bias before selecting an index.
Selected tickets are removed. When multiple wins per player are disallowed, all tickets for that player are removed. The process continues until all positions are filled or the pool is exhausted.
4. Reveal and reproduce
The seed, canonical manifest and winner order are public after finalization. The verifier uses an independent Web Crypto implementation. You can also verify exported JSON with the command line tool in this project.
Check a draw
Load this raffle's proof or paste a proof file (JSON). The check runs in your browser.