Skip to content
Sign up free Join Browse competitions Browse
Provably fair

Check a draw yourself

You do not have to trust us. Before entries close we publish a locked-in secret, and we name a public random number that will not exist until after the draw. Afterwards we publish both. Anyone who has those numbers gets the same winner we did, every time.

No account needed, nothing to install. It runs in your browser, and it takes about a minute.

1 Pick the draw you want to check

No draw has run yet. The first is the free £500 launch draw, at 9pm on Friday 30 October 2026. As soon as it runs, its numbers are published on its own page and it appears here as a button that fills this page in for you.

In the meantime the page is loaded with an example, so you can watch the check work right now. The secret below is made-up and says so. The random number is real: it is genuine drand round 6,500,000, published on 26 September 2026 at 14:57, which is why step 2 can go and look it up for you.

2 Read the answer

Checking the example below

  1. Was the secret locked in before entries closed?

    Checking...

  2. Was the random number genuinely public?

    Checking...

So the winning ticket is ...

Not convinced the numbers are doing the work?

3 See the numbers it used

Each box is a number we publish, not something you have to work out. Edit any of them and the answer above updates as you type.

Why this means a draw cannot be fixed

  1. We cannot change the secret afterwards. Its fingerprint is published before entries close. Change so much as one character of the secret and the fingerprint no longer matches, which is what the button in step 2 shows you.
  2. We cannot choose the random number. It comes from drand, and we have to name which one we are using before entries close. At that moment the number does not exist yet, so there is nothing to pick and nothing to wait for.
  3. We cannot choose the winner. The ticket is worked out from those two numbers and the entry count, by a fixed sum with no decisions in it. Anyone running the same sum gets the same answer.

The draw runs automatically at 9pm on the closing date and the result is published here, so there is nothing to watch and nothing to take on faith. If you ever get a different answer from ours, tell us and we will publish what went wrong.

The maths, if you want it

This is the exact method every Grand Draws draw uses, worked through with the example values above. Run the same steps on any published draw and you will get its winning ticket.

  1. The secret, revealed after the draw: example-secret-not-a-real-draw
  2. The fingerprint, published before entries close, is the SHA-256 hash of the secret: 6bf93ca303087eadeeb2e52139fc90c917ce4980ba2a6a4dd7d78811d9333bad
  3. The random number is the randomness value of the drand round named in advance, written as drand:chain:round:randomness: drand:8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce:6500000:1d43ea5935608fa3eb7af9a7e2aa9b03e9b5e1e2d0ceb84ced6d2faf562ed7ba
  4. The message for winner 1 is that string followed by |1: drand:8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce:6500000:1d43ea5935608fa3eb7af9a7e2aa9b03e9b5e1e2d0ceb84ced6d2faf562ed7ba|1
  5. HMAC-SHA256, with the secret as the key and that message: 5f576b4e28e8b10eeda02c22c648278e93c969f8ef5bba660156032b68e7c6da
  6. The first 8 bytes of it (the first 16 hex characters) are 5f576b4e28e8b10e, which as a whole number is 6870077740014940430
  7. Divide by the number of entries (8,500) and keep the remainder: 5930
  8. Add 1 to get the winning ticket: #5,931

With more than one winner, winner 2 uses the message beacon|2, winner 3 uses beacon|3, and so on. Each one picks from the tickets not already drawn, so no ticket can win twice.

// The whole method, in JavaScript (the checker above runs this in your browser)
commitment = sha256hex(seed)
for p in 1..winners:
  h     = hmacSha256(key = seed, message = beacon + "|" + p)
  n     = first 8 bytes of h, as a big-endian unsigned integer
  index = n mod (entries - winnersAlreadyDrawn)
  ticket = index + 1, counted over the tickets not yet drawn

The drand chain we use is 8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce, a round every 30 seconds. Any round is permanently readable at api.drand.sh.

Sign in

New here?