Next prize building
USDC
Tickets
sealed
Round
no round
Transparency

What's encrypted

Pool-wide aggregates are public by necessity — the money sits in a real yield venue and a real lottery, where its size is visible regardless. Every per-user quantity is not.

What's encrypted

Zama FHEVM

Pool-wide aggregates are public by necessity — the money sits in a real yield venue and a real lottery, where its size is visible anyway. Every per-user quantity is not.

QuantityOn-chainReadable by
Your deposit amounteuint64 ciphertextonly you
Your pool balanceeuint64 ciphertextonly you
Your odds (ticket range)two euint64 ciphertextsonly you
The winning ticketeuint64 ciphertextnobody
Who won, and how muchselect(hit, prize, 0)only you
Your withdrawal amounteuint64 ciphertextonly you
Pooled totals, prize sizeplaintexteveryone
Two things do leak, and both are bounded: closing a round reveals the pool's aggregate stake, and sweeping reveals whether a prize was claimed — never by whom.

The three moments something becomes public

Every plaintext this protocol ever produces, and the reason each one is unavoidable.

Closing a roundThe pool's total stake

A draw needs a plaintext modulus, and the principal sits in a public venue anyway. Deposits between two closes hide inside the batch.

Deploying to yieldThe batch aggregate awaiting deployment

The sum, never its composition.

Sweeping a roundWhether the prize was claimed

Never by whom. The anonymity set is everyone who claimed — which is why claiming is cheap and rational for all.

Never decrypted, by anyone

no key path exists

These handles receive FHE.allowThis and nothing else. The contract can compute on them homomorphically; no party — you, the keeper, governance, or Zama — can ever read them.

The winning ticketsealed
Every hit/miss boolean in a claimsealed
The live ticket cursorsealed
Who wonsealed

What still leaks

Amounts are hidden; participation and timing are not. That address X deposited, claimed or withdrew at time T is public. A pool with one depositor has no anonymity set at all, and correlation over time is a real attack on a thin pool. Claim gas also scales with how many ticket ranges you hold — never with whether you won.

Your Megapot allocation is public on purpose. Anyone can read that you chose 25%; nobody can read 25% of what. It has to be plaintext because the yield split is computed from the two tracks' public ticket totals, and that ratio is the only thing keeping the split fair between depositors who opted in and those who did not. It snaps to quarters so a choice lands in a bucket shared with other people rather than becoming a fingerprint — but if you are the only one who changes allocation between two round closes, the movement in the Megapot ticket total is yours, and the percentage is known, which narrows your balance. Change it in company, not in isolation.

The wrap boundary is public. Turning USDC into cUSDC, and back again, is an ordinary ERC-20 transfer of a visible size. Encryption protects the ledger between those two edges, not the edges themselves — so wrapping exactly what you deposit, or unwrapping a large amount shortly after a win, links the two.