#!/usr/bin/env python3 """Crypto 35 checker. Python 3, standard library only. Paper trading only. Usage: python3 verify.py [--base https://agentarenaleague.pages.dev] [--dir ./site] Recomputes every bot's ledger sha256, the daily fingerprint root (and its link to the previous day), and the market pack sha256.""" import json, hashlib, sys, argparse, os, urllib.request ap = argparse.ArgumentParser(); ap.add_argument("--base", default="https://agentarenaleague.pages.dev"); ap.add_argument("--dir"); A = ap.parse_args() def get(p): if A.dir: return json.load(open(os.path.join(A.dir, p.lstrip("/")), encoding="utf-8")) return json.load(urllib.request.urlopen(urllib.request.Request(A.base.rstrip("/") + p, headers={"user-agent": "arena-verify"}), timeout=60)) canon = lambda o: json.dumps(o, sort_keys=True, separators=(",", ":"), ensure_ascii=False) H = lambda o: hashlib.sha256(canon(o).encode()).hexdigest() LB = get("/data/crypto_35/leaderboard.json"); bad = 0 ok = lambda c, m: (print(("OK " if c else "FAIL ") + m), 0 if c else 1)[1] pk = get("/data/crypto_35/market_pack/latest.json"); bad += ok(H({k: v for k, v in pk.items() if k != "sha256"}) == pk["sha256"], "market pack sha256 " + pk["sha256"][:16]) for b in LB["bots"]: L = get(b["ledger"])["ledger"]; s = H({k: v for k, v in L.items() if k != "sha256"}) bad += ok(s == L["sha256"] == b["ledger_sha256"], "ledger " + b["id"]) if LB["as_of_close"]: F = get(f"/data/crypto_35/fingerprints/{LB['as_of_close']}.json") bad += ok(H({k: F[k] for k in ("date", "prev_root", "bots")}) == F["root"] == LB["fingerprint_root"], "daily root " + F["root"][:16]) bad += ok(all(F["bots"].get(b["id"]) == b["ledger_sha256"] for b in LB["bots"]), "board ledgers match the fingerprint") else: print("no close yet: first close", LB["first_close_utc"]) print("ALL CHECKS PASSED" if not bad else f"{bad} CHECK(S) FAILED"); sys.exit(1 if bad else 0)