Rounds and sealed bets
About a minute to seal bets, six seconds to open them, then the result.
The game balance
You deposit once, from the ghost wallet into a game balance held by the program. Bets draw from that balance, so placing one moves no SOL and leaks no amount. The app tops the balance up when funds arrive, never when you bet. You can withdraw from it to any address at any time; withdrawals are never paused.
Sealing a bet
A bet is a set of squares and one amount that goes on each of them. Before anything is sent, the app saves {round, amount, squares, salt} in your browser. Then it sends only a hash:
hash = sha256("ghost-bet" ‖ round ‖ player ‖ amount ‖ squares ‖ salt)The hash is bound to the round and to your ghost wallet, so it cannot be replayed or copied. The first seal of a round holds a 0.001 SOL bond from your balance. Sealing again in the same window replaces the bet. While betting is open the chain shows only how many sealed bets exist; the board's totals are zero.
Opening a bet
When the commit window ends, the app sends reveal(amount, squares, salt) on its own and resends it every couple of seconds until it lands, so keep the tab open until your bet opens. The program checks the hash, returns the bond and stakes amount × squares from your balance. Totals roll up from zero as bets open. A bet that is never opened simply doesn't play, and its bond goes to the jackpot. You cannot see the result before deciding whether to open: it does not exist yet.
Resolve and the result
After the reveal window the crank reveals its seed and the program picks the square (how). Rounds settle in aggregate; your own credit lands the next time you act (Settlement). The result plays on the frozen board during the intermission, then the next round opens.
Timing
| Window | Slots | About |
|---|---|---|
| Sealed bets | 280 | 60 s |
| Opening bets | 30 | 6.5 s |
| Intermission (the result) | 140 | 30 s |
A round is 450 slots, about 97 s. The clock is fixed when the program is initialized: rounds start every 450 slots. A resolve must land before the intermission ends; a round that misses it is refunded and the next round waits for the first start after the refund. A slot is about 0.22 s and varies, so the timer in the app follows slot numbers, not the clock (Numbers).