Zcash deposits are live. Bitcoin and Dogecoin deposits are coming when those chains join the NEXUS execution layer.
Overview
Deposit ZEC into a NEXUS vault to get vZEC on NEXUS. Use vZEC in WASM smart contracts, AMMs, and DeFi. Your ZEC remains on Zcash — 1:1 backed, publicly auditable.
Your wallet must be mnemonic-based. Vault creation requires a renewal key derived from your mnemonic (BIP-32 path m/86'/133'/0'/1/0). Without it, getVaultAddress() will throw. Always generate your wallet with Wallet.generateMnemonic() and back up the phrase.
Step 1: Get Your Vault Address
import { NexusClient, Wallet } from '@yattacorp/nexus-sdk';
// Must be mnemonic-based — renewal key is derived from it
const wallet = Wallet.fromMnemonic(
process.env.MNEMONIC!,
'mainnet', // 'mainnet' | 'regtest'
undefined, // use default BIP-32 path
'zcash'
);
const client = new NexusClient(
{ rpcUrl: 'https://api.yattacorp.xyz', network: 'mainnet', chain: 'zcash' },
wallet
);
// Returns: { vaultAddress, l2Address, redeemScriptHex, protocolKey, timelock }
// Internally calls nexus_deriveVaultFromPubkey with your pubkey + renewal key pair
const vault = await client.getVaultAddress(); // default: 16,128-block timelock (~2 weeks)
console.log('Deposit ZEC to:', vault.vaultAddress);
// regtest → "tmXxx..." mainnet → "t1xxx..."
console.log('Your NEXUS address:', vault.l2Address);
Step 2: Send ZEC to Your Vault
# regtest / local testing
zcash-cli sendtoaddress "<VAULT_ADDRESS>" 1.0
# mainnet: use any Zcash-compatible wallet (ZecWallet, Nighthawk, zcashd)
Your vault address is a standard Zcash transparent address (t-addr). Any Zcash wallet can send to it.
Step 3: Wait for Confirmations
| Chain | Confirmations | Block Time | Wait |
|---|
| Zcash ✅ | 10 | 75 sec | ~12.5 min |
| Bitcoin 🔄 | 6 | 10 min | ~60 min |
| Dogecoin 🔄 | 3 | 1 min | ~3 min |
For deposits ≥ 1,000 ZEC, 15 confirmations are required (~18.75 min).
Step 4: Check Your vZEC Balance
// Returns zatoshi as number (1 ZEC = 100,000,000 zatoshi)
const balance = await client.getBalance();
console.log('vZEC balance (zatoshi):', balance);
console.log('vZEC balance (ZEC):', balance / 1e8);
Vault Security
Every vault has three spending paths:
Your Vault (Zcash P2SH t-addr)
├── Path 1 (Normal): you + NEXUS co-sign — used for instant withdrawals
├── Path 2 (Renewal): renewal key + NEXUS — for key rotation
└── Path 3 (Escape): you alone, after 16,128 blocks (~2 weeks)
→ Broadcast your pre-signed exit tx — no permission required
Your ZEC on Zcash always equals your vZEC on NEXUS — 1:1, verifiable by anyone.
Withdrawal
// Withdraw vZEC back to a Zcash transparent address
// Returns: { success, txid, status, path, confirmed? }
const result = await client.withdrawFunds(
't1abc...', // destination Zcash t-address (mainnet) or 'tm...' (regtest)
10_000_000, // amount in zatoshi (0.1 ZEC)
{ waitForConfirmation: true }
);
console.log('Withdrawal txid:', result.txid);
console.log('Status:', result.status); // 'AwaitingUserSignature' | 'Broadcast' | 'Queued'
Withdrawals are processed via co-signing (Path 1) or autonomous batch (Path 2). vZEC is burned immediately; ZEC arrives after the transaction is confirmed on Zcash.
See Vaults for the full vault architecture and security model.