How the draw works
Every round is a commit/reveal draw. The operator publishes a commitment before the round starts and reveals the secret afterwards, and the second half of the randomness comes from a Solana blockhash nobody controls. That combination means the outcome cannot be chosen after the fact, nor computed in advance.
The round opens with a sealed commitment
The keeper derives a 32-byte serverSeed for the round and publishes only sha256(serverSeed). That hash is written to the round record before a single entry exists, and you can see it on any live round's page. It is impossible to work backwards from the hash to the seed, and impossible to find a different seed producing the same hash, so the operator is locked in.
5 minutes of trading fill the pot
Buys and sells of $GACHA each pay a trading fee that accrues in SOL inside the bonding-curve pool. At the end of the round the keeper claims those fees. A small gas reserve is held back so the keeper can always pay for the buy and the payout; everything else becomes the pot.
Eligible holders are snapshotted
Every wallet holding at least 10.0K $GACHA at that instant is entered. There is nothing to deposit and nothing to claim, eligibility is read straight off the chain. Each token is one ticket, so odds scale with your balance. The full snapshot, including every wallet's ticket range, is frozen and published on the round's page.
The client seed arrives from the chain
Only now does the keeper fetch the latest confirmed Solana blockhash and use it as the clientSeed. It did not exist when the commitment was published minutes earlier, so neither party could have known the outcome in advance.
The stock and the winner are derived
The two draws come from the same seed pair, with different labels:
stockIndex = sha256(serverSeed:clientSeed:"stock:0") mod eligibleStocks winningTicket = sha256(serverSeed:clientSeed:"ticket:0") mod totalTickets
Both use rejection sampling rather than a plain modulo, so the mapping onto the range is exactly uniform instead of very slightly favouring low values. The winner is the wallet whose half-open ticket range [start, end) contains the winning ticket.
The pot buys the stock, and it is sent
The whole pot is market-bought through Jupiter, and the exact amount received, after slippage, is transferred to the winner. The winner's token account is created and paid for by the keeper, so they never need to have touched the stock token before. Both transactions are linked from the round page.
The seed is revealed
On settlement the serverSeed is published. Hash it and check it against the commitment from step 1; re-run the formulas from step 5 and check they reproduce the winning ticket. The round page does both automatically and shows you the result, but the point is that you do not have to trust it, every input is published.
Things worth knowing
- The stock pool is liquidity-filtered. Each round draws from the subset of the 17catalogue names that can absorb that round's pot with under 3% price impact. A big pot draws from fewer, deeper names. That filter depends on live routing at draw time, so it is the one input that cannot be replayed exactly from stored data, the winner selection, which is what matters, is fully reproducible.
- Rounds can void. If the pot is too small, no wallet is eligible, or a swap fails, the round settles as void and its SOL rolls into the next round rather than being lost.
- The prizes have an issuer. xStocks are Token-2022 mints with a permanent delegate held by Backed Finance, which means the issuer can move them. That is a property of tokenized equities generally, not of this game.
Open any settled round to see all of this for a real draw.