Verify this draw
Win £50 Site Credit #2 was drawn on 11 Jul 2026. The winner was Joanne H. from Street with ticket #98.
Method
Verified auto-draw
Tickets in the draw
150
Winning ticket
#98
Winner's odds
1 in 5
In plain English
Before entries closed, we locked in a secret number and published a short code (its “fingerprint”) that proves we couldn’t change it later. After entries closed, that number, mixed with a public source of randomness that nobody controls, picked the winning ticket. So the result couldn’t be set up in advance or nudged afterwards. The steps further down let you re-run it and land on the same ticket yourself.
How this draw is provable
Before entries closed we published a commitment: a one-way fingerprint (SHA-256) of a secret random seed. After the draw we revealed the seed. Because the commitment was public before entries closed, the seed could not have been changed afterwards to draw a particular ticket.
The draw also folds in a public randomness beacon (drand, the League of Entropy) whose value is only published after entries close. Anyone can re-fetch the exact beacon round below and confirm the same value went into the draw.
- Commitment (published before entries closed)
10157ce126fb95dc33e540b0ce880e735bc91647a63abb9e0ca93754edfe3323- Revealed seed (published after the draw)
bf39bd983035fd09ac79f131aeef2f674264df444c11fa6afe2281ee0a999163- Beacon round (emitted after close) & its public value
- Round 6,278,907 on the drand chain
8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce 43fd2ffaf139a673b944f2812fa5f8e55f8e5f7cd121d469b8394c5c3bb0ed71- Re-fetch it:
curl https://api.drand.sh/8990e7a9aaed2ffed73dbd7092123d6f289930540d7651336225dc172e51b2ce/public/6278907
Check it yourself
1. The seed matches the commitment
Run SHA-256 on the revealed seed - it equals the commitment above. For example, in a terminal:
printf '%s' 'bf39bd983035fd09ac79f131aeef2f674264df444c11fa6afe2281ee0a999163' | sha256sum
2. The seed and the beacon draw the winning ticket number
Every one of the 150 tickets (numbered 1 to 150) went into this draw. The winner is drawn from the locked-in seed mixed with the post-close beacon value shown above - both are in the $msg below. Because the seed was fixed before entries closed and the beacon value didn't exist until after, the result was set in advance yet could not be steered. Recompute it and you'll get ticket #98:
$seed = 'bf39bd983035fd09ac79f131aeef2f674264df444c11fa6afe2281ee0a999163';
$total = 150; // tickets in the draw (numbers 1..150)
$msg = 'draw:019f37ec-e0b7-7007-8ceb-c40796563f92:'.$total.':43fd2ffaf139a673b944f2812fa5f8e55f8e5f7cd121d469b8394c5c3bb0ed71'; // note: the trailing value is the drand beacon above
$span = 1 << 60; // 60-bit space
$limit = intdiv($span, $total) * $total; // reject above this to remove bias
$i = 0;
do {
$n = (int) hexdec(substr(hash_hmac('sha256', $msg.':'.$i, $seed), 0, 15));
$i++;
} while ($n >= $limit);
echo ($n % $total) + 1; // => winning ticket #98
3. Ticket #98 belongs to the winner
That ticket number is held by exactly one entry - Joanne H. from Street. We publish a fingerprint of every ticket number in the draw, so the set of numbers can't be altered after the fact, and we hold the full list in our tamper-evident audit trail, available to the Advertising Standards Authority on request.
- Ticket-numbers fingerprint
616683d8c2ad2f5e8151d220825849e9d90135c8a0fae9992452f393c5776151
How ticket numbers are assigned
You don’t choose your ticket number (unless a competition lets you choose your own), and it isn’t simply the next number in order. When you buy, the system gives you a number using a secret shuffle that was set when the competition opened, before anyone had bought a ticket, and can’t be changed after.
Because that shuffle is secret and gives everyone a different number:
- Two people can never end up with the same number.
- Nobody, not you and not us, can guess which number a purchase will get. On this draw the number itself doesn’t decide anything anyway: the winner is picked by the draw above, which nobody can predict.
- Your number is fixed the instant you buy, and recorded straight away.
We keep the shuffle secret so no one can work out in advance which number a purchase will get, which is what stops anyone targeting a winning ticket. Every number that’s given out still appears in the competition’s entrants list, so the numbers in play are public and can’t be quietly changed later.
Prove the shuffle yourself
When the competition opened we published a fingerprint of the secret shuffle key, so it’s on record as fixed before anyone bought:
- Shuffle-key fingerprint (published at open)
47493fbd7adbe9cb87a662daf530091dce07eb8c37750ec6f9183280c8c5fca9- The shuffle key itself (revealed now the competition has ended)
JlgILZynIAv1ZmjeS2UO3Xb65f6qNjnTAjHdmEgQ
First check the key matches the fingerprint published at open, then re-run the shuffle for yourself: feed each position 1, 2, 3… through it and you get the 150 ticket numbers in the pool, each exactly once. If it matches the fingerprint and produces a clean set with no repeats, the numbers were genuine and untouched.
Show the recipe
// 1. the key matches the fingerprint published at open:
printf '%s' 'JlgILZynIAv1ZmjeS2UO3Xb65f6qNjnTAjHdmEgQ' | sha256sum // => 47493fbd7adbe9cb87a662daf530091dce07eb8c37750ec6f9183280c8c5fca9
// 2. re-run the shuffle: position -> ticket number
$seed = 'JlgILZynIAv1ZmjeS2UO3Xb65f6qNjnTAjHdmEgQ';
$domain = 150; // the pool the numbers are shuffled within
$prf = fn($v,$r) => (int) hexdec(substr(hash('sha256', "$seed:$r:$v"), 0, 8));
$permute = function(int $pos) use ($domain, $prf) {
$half = (int) ceil(((int) ceil(log($domain, 2))) / 2);
$mask = (1 << $half) - 1;
$x = $pos - 1;
do {
$l = ($x >> $half) & $mask; $r = $x & $mask;
for ($i = 0; $i < 4; $i++) { $n = $l ^ ($prf($r, $i) & $mask); $l = $r; $r = $n; }
$x = ($l << $half) | $r;
} while ($x >= $domain);
return $x + 1;
};
// $permute(1), $permute(2), ... are the ticket numbers, in the order they were issued.
See how all our draws work on our fairness & security page, or back to all winners.