Provably fair

Trust is the luxury.

Every casino outcome on ShinyLuck is the keccak256 of values you can audit yourself · server seed, your client seed, a block hash and a nonce. The server seed's hash is committed on-chain before you bet and revealed after settlement. Recompute it here, straight from chain data.

01
Commit

The house pre-commits batches of server-seed hashes to the Vault. Each is keccak256 of a sealed seed · published before any bet binds to it, and the pool tops itself up so no game ever stalls for want of one.

pool · -
hash · -
02
Bet

Your browser generates a fresh 32-byte client seed for every bet. Stake + seed bind on-chain the moment your transaction confirms.

client · -
03
Draw

Randomness is derived fully on-chain and mixes in the hash of the block after yours, so at bet time neither side knows the outcome.

keccak256(seed ‖ client ‖ blockhash(commit+1) ‖ nonce)
04
Reveal & verify

The seed goes public at settlement. Re-hash it below · no other seed could have produced a different outcome.

tx · -
RECEIPT · latest settled bet -
loading latest receipt…
view on explorer ↗
Scope, stated plainly: the receipt above and the browser verifier read Dice and Plinko, the two games that settle in the Vault itself. VAULT.7, SUGAR.LAB, Mines, Crash and Roulette settle inside their own module contracts and keep the same seed commitment and the same formula, but re-deriving them in this tab is not built yet · their receipts, seeds and randomness are all on the explorer.

VERIFY IN BROWSER

STEP 1 · INPUTS
-
STEP 2 · RE-DERIVE LOCALLY
expected = keccak256(serverSeed ‖ clientSeed ‖ blockHash ‖ nonce)
-
STEP 3 · COMPARE WITH ON-CHAIN
-
-

Frequently asked, plainly answered.

How is randomness generated?

For each bet the contract derives keccak256(serverSeed ‖ clientSeed ‖ blockhash(commitBlock + 1) ‖ nonce). Everything happens on-chain; the settlement bot only reveals the pre-committed seed.

Can the operator cheat?

No · keccak256(serverSeed) is committed on-chain before any bet binds to that slot, and a different revealed seed hashes differently, which the contract rejects. The block hash is what stops the other direction: the house cannot pick which bets to settle, because at bet time it does not know the outcome either.

What if the seed is never revealed?

The blockhash window is 256 blocks. Past it the stake comes back, and anyone (including you) can trigger it: refundExpired(betId) on the Vault (Dice, Plinko) or on the slot module, refundRound(roundId) on Crash and Roulette, cancelPick(betId) on Mines.

Can I change my client seed?

Yes · every bet generates a fresh 32-byte client seed in your browser, and it is a plain argument to placeBet, so you can supply your own.

What about poker?

Poker does not use this scheme at all. Cards come from mental poker (zkShuffle v2): players jointly shuffle an encrypted deck in the browser, every shuffle carries a zero-knowledge proof and the contract verifies every decryption share. Watch it run in the ZK Lab.

Where's the source?

On GitHub. The sources are not submitted to Shannon Explorer yet, so the explorer shows bytecode. The browser verifier above re-implements deriveRandomness exactly as the contract does.

Every game module has its own address · the full list is in the docs.