Private perpetuals,
explained.
How zPerps keeps collateral, positions and liquidations invisible while settling at exchange speed.
Overview
A perpetual futures protocol where the account layer is private by construction.
Collateral is held as Zcash Orchard notes. Positions are Pedersen commitments. Matching and settlement run on Solana. The protocol never learns a trader's balance, position size, entry price or liquidation level, it only verifies zero-knowledge proofs that each action is solvent.
Architecture
Three layers: a shielded vault, client-side proofs, and a public matcher that only sees aggregates.
A shielded address controlled by a threshold key. Deposits create notes the vault can spend only with a valid proof, and can never attribute to a trader.
No trusted setup. Three circuits, open, close and liquidate, each proving solvency without revealing amounts.
Verifies proofs, maintains the commitment tree and nullifier set, and runs price-time matching over blinded orders.
Positions & commitments
Every position looks identical on-chain.
C = Com(market, side, size, entry, lev, r)open(note, C, π):assert note ∈ OrchardTree // membershipassert nullifier(note) ∉ Spent // unspentassert note.value ≥ size / lev + feepublish C, nullifier // never size, side, entry
The program stores the commitment C and a nullifier derived from the funding note. Because all commitments look identical, an observer sees only the number of open positions per market and total open interest, never their distribution.
Liquidations
A liquidator proves a position is underwater without learning whose it is.
Maintenance margin mm = 0.5% is committed at open. Anyone holding a trader's outsourced viewing key, typically their own keeper, can generate a liquidate proof once the oracle price crosses the level. The proof reveals which commitment was closed, but not its size, side or owner.
- 01Oracle tickIndex crosses the committed level.
- 02ProofKeeper builds a liquidate proof against the commitment.
- 03SettleProgram burns the note; 40% of mm to liquidator, 60% to insurance.
Oracle & funding
Median of aggregated spot venues, published every 400ms.
Funding is paid every 8 hours between longs and shorts, based on the premium of the mark over the index and clamped to ±0.75%. Transfers are batched into a single Orchard transaction with per-position amounts encrypted to each owner's key.
Markets
Four perpetuals at launch, ZEC-collateralised.
| Market | Max leverage | Maint. margin | Taker | Maker |
|---|---|---|---|---|
| ZEC-PERP | 20× | 0.5% | 0.05% | 0.01% |
| SOL-PERP | 50× | 0.5% | 0.05% | 0.01% |
| BTC-PERP | 100× | 0.5% | 0.05% | 0.01% |
| ETH-PERP | 100× | 0.5% | 0.05% | 0.01% |
FAQ
Can the team see my positions?+
No. The vault key can spend notes only with a valid proof, and proofs do not reveal amounts.
What if I lose my viewing key?+
Your positions cannot be closed by anyone, including us. Back it up.
Why Zcash and not a mixer?+
Orchard is a production shielded pool with native encrypted value, Halo 2 proofs and no trusted setup. A mixer only breaks address links; it does not hide amounts inside an active position.
Why Solana for settlement?+
400ms slots and cheap proof verification. Zcash is the vault, not the matching engine.
