Verify a payout
You shouldn't have to take our word for any of this. Here's how to check the three things that matter: the money exists, the split follows the rules, and payouts really happened.
1. The money exists
The treasury address is on the Transparency page. Open it on Solscan and you'll see every fee coming in and every payout going out. The site's treasury balance is read live from the chain.
2. The split follows the rules
Every settled 5-minute round and day is published as an epoch with its inflow, its pool, every player's allocation and a sha256 commitment of that list. The commitment is fixed when the epoch settles, so the list can't be quietly edited later without the hash changing.
Recompute any commitment yourself:
// Paste into your browser console on any page of this site,
// replacing 42 with the epoch id you want to check.
const { epoch } = await (await fetch("/api/epochs/42")).json();
const rows = epoch.kind === "daily"
? [...epoch.allocations].sort((a, b) => a.rank - b.rank)
: [...epoch.allocations].sort((a, b) => Number(a.robloxUserId) - Number(b.robloxUserId));
const header = epoch.kind !== "daily"
? epoch.kind + ":" + epoch.startsAt
: "daily:" + epoch.startsAt.slice(0, 10);
const text = header + "\n" + rows.map(r => r.robloxUserId + ":" + r.amountLamports).join("\n");
const hash = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
const hex = [...new Uint8Array(hash)].map(b => b.toString(16).padStart(2, "0")).join("");
console.log(hex === epoch.commitment ? "✅ matches" : "❌ mismatch", hex);Then check the allocations against the published rules:
- Rounds: each amount ≈ pool × player's points ÷ total points (rounded down to the lamport).
- Daily: each amount = pot × the rank's share from the curve.
3. Payouts really happened
Every payout is a normal Solana transfer from the treasury, with a memo listing the payout numbers it covers (several players can share one transaction). The live payout feed links each one to Solscan, and the "Claimed on-chain" total on the Payout history page should match what you see leaving the treasury wallet.
The raw data
Everything is available as public JSON, no key needed:
GET /api/stats: treasury balance, totals, live round statsGET /api/epochs: recent settled epochsGET /api/epochs/:id: one epoch with its full allocation listGET /api/payouts: recent on-chain payouts with signaturesGET /api/leaderboard: today's live ranking