Zcash Operating Layer
ZOL lets any Solana program take shielded ZEC, run real-time sessions in a MagicBlock/SVM rollup, and pay the result back to Zcash. Apps get the speed and composability of the SVM; players keep Zcash privacy: no SOL, no Solana wallet, and nothing public that links their play to their Zcash wallet.
How it works
It sits in the app's shielded vault while a ledger on Solana records who is owed what. Play happens in a MagicBlock/SVM rollup, at rollup speed.
Scan a payment link with a Zcash wallet. The operators see the shielded note arrive and credit the player's balance on the ledger.
A key held by the player's passkey signs every move. No Solana wallet, no SOL: transactions in the rollup are free and land in milliseconds.
The balance is paid back, shielded, to the address given at the first deposit. The ledger fixes that address, and every operator checks it before signing.
Guarantees
No wrapped ZEC. ZEC stays in a shielded vault on Zcash; balances are ledger entries, not tokens. Nothing to bridge, nothing to depeg.
No value created. A pot returns exactly what went in; balances only move between a player, pots and exits.
Payouts go where the player said. The ledger fixes the payout address at the first deposit, as a commitment, and each operator checks a payout against it before signing.
Nobody is trapped. A pot that never comes back from the rollup is refunded after its session deadline plus 65 minutes, and a frozen app still returns pots and accepts exit requests.
Apps stay in their lane. An app can't add or swap a player, touch another app's money, or change a payout address.
Play and wallet stay apart in public. Solana sees session keys and commitments; Zcash sees shielded notes. Nothing public links the two; the operators can.
For developers
Write it in Anchor, like any Solana program. ZOL handles the money: shielded deposits, balances, exits and payouts. You write the rules: open a pot, seat players, let the rollup decide, and the ledger pays the seats when the pot comes home.
// Open a pot and seat a player (on Solana) zol_ledger::cpi::open_pot(ctx, pot_id, now + open_secs)?; zol_ledger::cpi::buy_in(ctx, stake * rounds)?; // In the rollup: your rules move value // between seats. VRF, prices, timers. zol_ledger::cpi::move_seat(ctx, from, to, stake)?; // Bring it home; the ledger pays every seat // back to the players' balances. zol_ledger::cpi::close_pot(ctx, Some(cash_out))?;
Live demo on testnet
Play them with testnet ZEC (TAZ). Each shows a different way to decide an outcome in the rollup.
Against the house, decided by verifiable randomness in the rollup. Many flips per table, about 0.001 TAZ each.
Will ZEC/USD be higher in 30 seconds? Settled on a live Pyth price inside the rollup. A right call pays 1.9×.
Commit a hidden bid, reveal it, highest bid wins. No trusted hardware: a hash, a salt and a penalty for not revealing.
Status
Everything works end to end today: shielded deposits on Zcash, play on Solana and MagicBlock's devnet rollup, payouts back to Zcash. Players use testnet ZEC (TAZ).