The rule is fixed before the qubits are measured. Neither the qubits nor the drand round can be chosen by us, so the winner can't be either. Prizes come from creator fees.
Each day's job becomes an account on Solana: the backend, the job id, the raw counts, the measured S, the drand round that sealed it and the final value. Any program can read it.
Every input is published. Recompute the value from the raw counts and the drand round, compare it with the oracle, then recompute the winner from the snapshot.
// 1. the day's published run: backend, job id, raw outcomes in shot order const run = await fetch("/runs/2026-10-10.json").then(r => r.json()) const raw = run.settings.map(k => k + ":" + run.raw_outcomes[k].join("")).join(";") // settings order, not object key order // 2. the commit stored on Solana BEFORE the drand round existed must match the raw outcomes const rec = await oracle.account.dailyRecord.fetch(recordPda(run.day)) assert(hex(sha256(raw)) === hex(rec.commit)) // 3. the drand quicknet round that sealed it (nobody controls drand) const QUICKNET = "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971" const beacon = await fetch(`https://api.drand.sh/${QUICKNET}/public/${rec.drandRound}`).then(r => r.json()) // 4. value = SHA-256(raw outcomes ‖ drand randomness bytes), must match the oracle assert(hex(sha256(concat(utf8(raw), fromHex(beacon.randomness)))) === hex(rec.value)) // 5. the winner from the published snapshot (rejection sampling keeps every entry equal) const winner = pickUniform(rec.value, snapshot.holders)