The winner is decided by a commit-reveal scheme we can't game and you can fully reproduce. Below is the exact algorithm, a live in-browser verifier, and the limits of what we can and can't do.
01
Commit
Before the window opens we publish only the SHA-256 hash of a secret 256-bit server seed on-chain. We are locked in.
02
Snapshot
At close we read every eligible token account at the finalized slot, convert each balance to tickets (50,000 $PRIZED = 1 ticket, minimum 1 to enter), and publish a Merkle root over the entries.
03
Reveal
We publish the original seed. Anyone checks SHA-256(seed) equals the committed hash.
04
Roll
We HMAC the seed with the Solana slot hash (unknown at commit) and draw id, then map it across the ticket-weighted holders.
Live verifier
verified test vector
This runs the real roll function in your browser against a known test vector (draw #242). If our math is honest, the output matches the published roll exactly.
// roll = HMAC-SHA256(key = serverSeed, msg = slotHash || drawId)
function roll(serverSeedHex, slotHashHex, drawId) {
const mac = createHmac('sha256', Buffer.from(serverSeedHex, 'hex'))
mac.update(Buffer.from(slotHashHex, 'hex'))
mac.update(Buffer.from(String(drawId), 'utf8'))
return mac.digest('hex')
}
// map roll into [0, totalWeight) and walk the weighted prefix sum
function pickWinner(entries, rollHex) {
const total = entries.reduce((s, e) => s + e.weight, 0n)
const offset = BigInt('0x' + rollHex) % total
let acc = 0n
for (const e of entries) { acc += e.weight; if (offset < acc) return e.wallet }
}
What we can't do
Change the seed after committing — the hash is on-chain first.
Pick the winner — the slot hash isn't known at commit time.
Hide holders — the snapshot + Merkle root are public.
Fake a payout — every airdrop is a real on-chain transfer.
What still needs trust
The operator hot wallet custodies slabs until airdrop.
Snapshot timing depends on RPC finality.
Collector Crypt valuations are third-party.
This is a demo UI — not audited, not legal advice.