Zcash Operating Layer

Programmable Zcash privacy on Solana SVM.

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.

Zcash: the shielded vault The shielded crossing Solana SVM: the ledger and the rollup

How it works

Deposit, play, withdraw. The ZEC never leaves Zcash.

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.

01

Deposit shielded ZEC

Scan a payment link with a Zcash wallet. The operators see the shielded note arrive and credit the player's balance on the ledger.

Credited after 1 block, usually 1–2 min
02

Play in the rollup

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.

A coin flip lands in about a second
03

Withdraw to Zcash

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.

Usually paid within a few minutes
On Zcash
Player's walletSends and receives shielded ZEC only
The app's vaultOne shielded address per app; its spend key is split among the operators
The crossing
Three operators, 2 of 3Attest credits to Solana, and co-sign payouts on Zcash (FROST). Each checks every payout against the ledger before signing.
On Solana
zol-ledgerBalances, pots and settlements for every app. It never calls apps
Your appA Solana (SVM) program, such as Anchor, that opens pots, seats players and decides outcomes
MagicBlock/SVM rollupWhere sessions run: verifiable randomness, live price feeds, scheduled tasks

Guarantees

What ZOL guarantees, and who enforces it.

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.

What you still trust

  • The operators (2 of 3) to stay live, sign only true credits, and not collude: a quorum holds the vault's spend key. Each honest operator pays only what the ledger settled, to the committed address. They also see which session key belongs to which Zcash address.
  • The rollup validator for outcomes while a pot is in the rollup. It can reorder or withhold; withholding turns into a refund.
  • The app's own logic for who wins. The ledger checks that seats add up, not that the right seat won.

For developers

Your app is a Solana program with Zcash privacy.

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.

  • Quickstart: a player key, a shielded deposit, coin flips and a withdrawal, from code, in about 15 minutes.
  • Build an app: the anatomy of a ZOL app, walked through on the coin flip.
  • Security model: who can do what, and a review checklist for your app.
  • Deploying: on the testnet, send the operators your program id and source; they register, activate and cap it.
// 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

Three games, one Solana program.

Play them with testnet ZEC (TAZ). Each shows a different way to decide an outcome in the rollup.

Status

A fully functional beta on testnet.

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).

Running now

Zcash
Testnet, NU7
Solana
Devnet
Rollup
MagicBlock devnet
Operators
Three, 2 of 3, on one host
Review
Internal only

Before mainnet

Review
An external audit of the ledger
Operators
Separate hosts and providers
Keys
A distributed key generation, not a dealer