Twenty Nine · Roulette PvP game verifier
Offline game proof and receipt checker. Synthetic example only; no game-server calls. Verifier snapshot 2026-10-24.
HTML
<main class="verifier" aria-labelledby="title">
<header><span class="eyebrow">TWENTYNINE.IO / OPEN VERIFIER</span><span class="local">Runs in your browser</span><h1 id="title">Roulette PvP</h1><p class="lead">Verify the game. Inspect the evidence.</p><p>Both players’ recorded account seeds are combined in seat order. The checker reconstructs the starting player, loaded chamber and turns.</p></header>
<section class="instructions"><h2>Start with your proof</h2><ol><li>After the entire game ends, open its proof in History or Fairness on twentynine.io.</li><li>Download the proof JSON. Open it below or paste the JSON text. Add “my receipt” if you saved it.</li><li>Select Verify game. A matching calculation and a matching original receipt are reported separately.</li></ol><p>Use the seeds recorded in that game’s proof, even if you have since regenerated your account seed.</p></section>
<div class="inputs"><section><label for="proof">Game proof <span>Required · up to 0.25 MiB</span></label><input type="file" id="proof-file" accept=".json,application/json" aria-label="Open game proof JSON"><textarea id="proof" spellcheck="false" placeholder="Paste the downloaded proof JSON here…"></textarea></section><section><label for="receipt">Your saved receipt <span>Optional</span></label><input type="file" id="receipt-file" accept=".json,application/json" aria-label="Open saved receipt JSON"><textarea id="receipt" spellcheck="false" placeholder="Paste your separately saved receipt, if available…"></textarea></section></div>
<div class="actions"><button id="verify" type="button">Verify game</button><button id="example" class="secondary" type="button">Load example</button><button id="clear" class="secondary" type="button">Clear</button><button id="download" class="secondary" type="button" disabled>Download report</button></div>
<p id="notice" role="status">No game loaded. Your proof stays in this verifier; no request is sent to our game server.</p>
<section...
CSS
*{box-sizing:border-box}body{margin:0;background:#101318;color:#edf2f3;font:15px/1.6 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.verifier{max-width:1060px;margin:auto;padding:36px 24px 56px}header{border-bottom:1px solid #303942;padding-bottom:24px}.eyebrow{color:#9ee8d7;font-size:11px;font-weight:750;letter-spacing:.13em}.local{float:right;color:#9eaaaF;font-size:12px}h1{font-size:clamp(30px,6vw,48px);line-height:1.05;letter-spacing:-.04em;margin:22px 0 10px}h2{font-size:18px;margin:0 0 10px}h3{font-size:14px;margin:0}.lead{font-size:19px;color:#f2f7f5;margin:0 0 14px}p{color:#b3bfc5;margin:8px 0}.instructions{margin:24px 0;padding:20px;background:#1a2028;border:1px solid #303942;border-radius:12px}ol{padding-left:22px;margin:8px 0}.inputs{display:grid;grid-template-columns:1.25fr 1fr;gap:20px}label{display:block;font-weight:650;margin-bottom:10px}label span{display:block;color:#91a1aa;font-size:12px;font-weight:400}input[type=file]{display:block;font-size:12px;max-width:100%;margin:10px 0;color:#b3bfc5}input::file-selector-button{border:1px solid #435159;border-radius:6px;background:#202831;color:#e7f0ee;padding:7px 11px;margin-right:9px;cursor:pointer}textarea{resize:vertical;min-height:235px;width:100%;border:1px solid #435159;border-radius:9px;background:#0d1015;color:#dde9e7;padding:14px;font:12px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace}textarea:focus,button:focus-visible{outline:2px solid #99e8d4;outline-offset:3px}.actions{display:flex;flex-wrap:wrap;gap:10px;margin:20px 0 10px}button{background:#9de4d3;color:#0e2620;border:1px solid transparent;border-radius:8px;font:650 14px system-ui;padding:12px 18px;cursor:pointer}button.secondary{background:#202831;border-color:#39454e;color:#e3eeec}button:disabled{opacity:.5;cursor:wait}#notice{font-size:13px;min-height:23px}#result{margin-top:24px;padding:22px;background:#1a2028;border:1px solid...
JavaScript
// twentynine.io · Roulette PvP proof verifier · 2026-10-24
// Self-contained browser verification. No game-server calls; no real player data in this fiddle.
// Published source uses the deployed game rules; this is not an independent security audit.
// Inspect the complete calculation below. Current account seeds never replace recorded game seeds.
const VERIFIER = {"name":"Roulette PvP","max":0.25,"seeds":"Both players’ recorded account seeds are combined in seat order. The checker reconstructs the starting player, loaded chamber and turns.","id":"roulette-pvp"};
const EXAMPLE =...