Loading
Getting things ready for you…
Getting things ready for you…
Every game is decided before your first move, and nothing here asks you to take our word for it. To check one game, open it from your profile — this page explains what is being checked.
Every game is decided before you make your first move, and you can prove it afterwards without taking our word for anything. Open any finished game from your profile and it will be checked in front of you, in your browser.
It comes from a public blockchain value that had not been decided when you pressed play, combined with a per-game secret of ours. We publish a hash of that secret first, so we cannot swap it afterwards.
Before your game starts we publish a hash of the seed and the board it produces. It is on screen from the first round, and it cannot be changed afterwards.
The seed stays sealed while the game is live — revealing it would tell you exactly where the losing tiles are.
When the game ends the seed is published. Hash it and you get the value we committed to at the start. If we had changed anything, it wouldn't match.
The same seed rebuilds every round's losing tiles. This page does it in your browser — no request is made, and you can run the same few lines yourself.
The half a commitment can't prove on its own
Drawn from a blockchain — a randomness beacon whose value was not decided when the game was created. We cannot choose it, and neither can you, which is what stops either side picking a seed that suits them.
Combined with the public value so the result is not predictable from the chain alone. We publish its hash before the game starts, so it is fixed from that moment — we can reveal it afterwards but we cannot change it.
Which one ran depends on how many tiles a round could lose on
index = SHA256(`{seed}-row-{round}`).slice(0, 8) % tilesInRow
The seed and the round number are hashed together, the first four bytes are read as a number, and the remainder against the row's width is the losing position. One hash, one tile, no loop — so a round with five tiles has exactly one way to lose.
How to tell: The link carries no crashTilesPerRow.
index = SHA256(`{seed}-crash-{round}-{nonce}`).slice(0, 8) % tilesInRow
The same hash, with a nonce that counts up. Each pass proposes one position; a position already drawn for that round is discarded and the nonce advances, until the round has as many distinct losing tiles as it is meant to. That rejection step is what keeps a two-crash round from silently becoming a one-crash round when the hash repeats itself.
How to tell: The link carries crashTilesPerRow — one count per round.
One derivation, a different meaning in every game
Tile position in the row, counting from the left and starting at 0. Rows are independent — nothing carries over between them.
The commitment and the derivation below apply to this game exactly as they do to the others. Its per-round rule — what the number picks out on screen — is not carried by this build, so it is not printed here rather than guessed at.
Each candle is one draw, not a board. How many outcomes it has is the risk mode you picked — six on Safe, three on Degen.
Nobody chooses here. You hold or you sell; you never pick a position. Each candle your browser draws a number and the candle rugs only if it matches the one the seed fixed before the game started.
How the client-side draw worksA position among the slots that still hold a prize — so it shifts left every time you take one.
Re-indexed after every grab. By the fifth grab four slots have been won, so index 3 is the fourth slot still holding a prize, not cabinet position 3. Reading the raw number straight off the machine points at the wrong slot. The replay above prints each round's index under the slot it actually meant.
Not applicable — this game is not decided by picking a tile, so no per-round index is derived for it.
Not applicable — this game is not decided by picking a tile, so no per-round index is derived for it.
A face, not a position — there is no board here to point at.
Easy to misread. A bare 1 looks like a position. It is the side the coin landed on — heads. This is the only game where the number names a thing rather than a place.
A position in the pool of lines still standing — and the axis alternates, so even rounds burn a row and odd rounds burn a column.
The pool shrinks and the axis flips. Every round you survive removes its line from the grid, so later indices count fewer options. Index 3 on a column round is the fourth column still standing, which may be column 7 on screen.
A zone across the goal, left to right, five per kick.
Not a lane you pick — each road is one hop, and its tile count is just the odds. You cross; a number decides whether you make it.
Nobody chooses here. Your browser draws its own number when you hop, using `Math.floor(Math.random() * n)` on your machine. The seed's number was fixed before the game began. A road only kills you when the two happen to match — and the tile count is the difficulty, so a 3-lane road is 1-in-3 and a 15-lane road is 1-in-15.
How the client-side draw worksNot a lane you pick — each road is one hop, and its tile count is just the odds. You cross; a number decides whether you make it.
Nobody chooses here. Your browser draws its own number when you hop, using `Math.floor(Math.random() * n)` on your machine. The seed's number was fixed before the game began. A road only kills you when the two happen to match — and the tile count is the difficulty, so a 3-lane road is 1-in-3 and a 15-lane road is 1-in-15.
How the client-side draw worksA wire, in fixed colour order. It never moves between rounds, so the number always means the same wire.
The commitment and the derivation below apply to this game exactly as they do to the others. Its per-round rule — what the number picks out on screen — is not carried by this build, so it is not printed here rather than guessed at.