Docs
Contents

FAQ, glossary and troubleshooting

FAQ

Does ZEC move to Solana? No. ZEC stays in the app's shielded vault on Zcash. The ledger on Solana records who is owed what; payouts are Zcash transactions from the vault.

Is there a wrapped ZEC token? No. Balances are non-transferable ledger entries.

Do players need SOL or a Solana wallet? No. They need a Zcash wallet and a session key (usually held by a passkey). Apps pay Solana fees; rollup transactions are free.

Can an app steal deposits? It can decide outcomes in its own pots (so a dishonest app can make players lose), but it cannot create value, pay anyone outside a pot's players, or change where withdrawals go. Players should trust an app's game logic as they would any game.

Why fixed deposit amounts? So deposits don't fingerprint players, and so the operators can credit a deposit whose wallet dropped the memo.

How long does a deposit take? On the testnet, usually 1–2 minutes (1 block) for an early credit, within the operators' float; larger or later credits wait for 60 blocks.

How long does a withdrawal take? A few minutes for the Zcash payout; the ledger marks it paid at payout depth (60 blocks).

Can my app call other Solana programs? In the rollup, programs that are delegated or cloned there (VRF, price oracle). On Solana, anything. The ledger never calls apps.

Can I run my own operators? Not yet: the testnet beta has one operator set for every app. Per-app signer sets are a later tier of the design.

Glossary

TermMeaning
AppA Solana program registered with the ledger; signs ledger calls with its ["zol-app"] PDA
AttestationAn Ed25519 signature by the operators' 2-of-3 key over a credit, void or paid statement
BalanceA player's per-app amount on the ledger, keyed by their session key
Buy-inMoving an amount from a balance into a pot seat (buy_in)
Cash-outPaying a returned pot's seats into the players' balances (cash_out)
Commitment (payout)A keyed hash of the player's payout address; the ledger stores it instead of the address
DelegationHanding a Solana account to a MagicBlock validator; it lives in the rollup until committed back
DenominationAn allowed deposit amount (0.01 or 0.1 TAZ on testnet)
GatewayAn operator's decision process: credits, attestations, relaying, guarding, the page API
GuardianAn operator role that reconciles the ledger with the vault and can freeze an app
Head noteThe vault note every payout must spend; it orders payouts on Zcash
IntentA signed deposit memo registered with the operators before paying
PotSeat amounts for one session, delegated to the rollup
ReceiptThe pot's player list and buy-ins, kept on Solana
Return actionAn app instruction the delegation program runs on Solana when a pot comes back
Session keyA player's Ed25519 key for one app
SettlementA numbered batch of exiting balances that the operators pay in one Zcash transaction
StakeThe amount a table moves per round
TAZTestnet ZEC
VaultAn app's shielded Zcash address, its spend key split among the operators

Troubleshooting

SymptomLikely causeWhat to do
A deposit never showsThe wallet is on the pre-NU7 testnet fork, or the amount isn't a denominationCheck the wallet's chain height; pay exactly 0.01 or 0.1 TAZ
app is pending, not activeThe app isn't activated yet, or is in its activation delayWait for activation (1 hour after)
Credited nothing for a new appIts deposit cap is still 0The admin sets it (set_cap)
BadStake on create_tableThe stake isn't a denomination's net value or a tenth of itRead the allowed stakes from the ledger config (allowedStakes)
MissingRequiredSignature from the magic programA PDA passed to a MagicBlock CPI isn't marked as a signerSet is_signer = true on the AccountInfo before building the intent
account required by the instruction is missing on a commitA delegated payer without the validator's fee vaultPass ["magic-fee-vault", validator] (delegation program)
InsufficientFundsForRent on a commitA delegated payer at exactly its rentKeep a lamport buffer in it
A return action says "pot not back"It was attached to an account that returns before the potAttach it to the pot (close_pot's action)
A price read is staleReading the oracle on SolanaRead it in the rollup
A scheduled task is rejectedIts instruction includes a signer accountSign with PDAs inside the instruction instead
process.env is empty in browser codeThe web app's Vite config blanks it for browser bundlesPass settings as VITE_* variables at build time (import.meta.env); scripts run with vite-node see the real environment