Fairness
Every result can be checked by anyone
Before betting opens we publish a hash of the round's secret seed. After the draw we reveal the seed. The balls follow from it.
Committed before betsThe seed hash is on screen while players bet, so the result cannot change after they choose.
Server-authoritativeThe animation only shows the result. Balls are guided onto the server's cards, never the other way round.
Durable settlementWins, losses and refunds are queued and retried until your wallet confirms them. Nothing is lost if your server blinks.
Idempotent everywhereEvery callback carries an idempotency key, so a retry never pays twice.
// Verify a Drop Ball round (Node.js)
const { createHash, createHmac } = require('crypto');
function ball(seed, roundId, n, cards) {
for (let i = 0; ; i++) {
const v = createHmac('sha256', seed)
.update(`${roundId}:${n}:${i}`)
.digest().readUInt32BE(0);
if (v < 4294967292) return cards[v % 6];
}
}
// seed_hash must equal sha256(server_seed)
createHash('sha256').update(seed).digest('hex');
[1, 2, 3].map((n) => ball(seed, roundId, n, cards));