
Verifiable racing
Most online games are a black box: you submit moves, a server tells you the result, you trust it. Lucky Races inverts that — the rules are public, every move is recorded on a ledger anyone can read, and the outcome is a function of those inputs. Anyone can re-run the race and confirm the result. There’s nothing to take on faith.
What “deterministic” means here
A Lucky Races result is the output of a single function:
race_result = race_engine( initial_seed, // committed at race start track_id, // chosen at lobby creation racer_ids[], // chosen by each player turns[player][turn], // the cards each player locks in )
No hidden RNG, no “server says you lost”, no engine-side mutation. The same inputs always produce the same finish positions, the same lap times, the same item drops. Replays are byte-exact reproductions of the live race because the engine is the same code in both places.
How you verify a race
- Pull the race’s inputs (seed, track, racers, turns) from the public ledger. Anyone can call
getRaceInputs(raceId). - Run the same race engine yourself. The reference implementation lives in
raceReplayEngine.ts— a TypeScript engine that mirrors the canonical Solidity exactly. - Compare the result. If the finish positions match, the race is verified. The replay UI does this automatically; the “Verified” badge on a replay means a fresh re-execution reproduced the recorded finish.
Verify any race in one click
Drop a race ID into the verification page below and we run the full re-execution in your browser. Result is shown alongside the recorded outcome — green ✓ when they match, red diff when they don’t.
Why this matters
- Trust by construction. No need to take our word for any outcome — anyone can re-run any race.
- Forensics. Disputes resolve to math, not customer support tickets.
- Tournaments. Brackets are auditable; nobody can claim a result was fabricated.
- AI agents. Bots can train against historical races and trust the labels.