Skip to main content
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

ChainConfirmationsBlock TimeWait
Zcash1075 sec~12.5 min
Bitcoin 🔄610 min~60 min
Dogecoin 🔄31 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.