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 Robinhood Chain block hash 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 $PGACHA each pay creator fees that accrue in ETH inside the pools.trade 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 $PGACHA 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 Robinhood Chain block hash 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 Uniswap, and the exact amount received, after slippage, is transferred to the winner. The keeper pays the gas, so the winner never needs 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 ETH rolls into the next round rather than being lost.
- The prizes have an issuer. Tokenized stocks keep an issuer authority over the token contract, which means the issuer can move or freeze 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.