{"version":3,"sources":["../src/compat.ts","../src/utils.ts","../src/keypair.ts","../src/utxo.ts","../src/addresses.ts","../src/abi.ts","../src/deposit.ts","../src/balance.ts","../src/merkle.ts","../src/prover.ts","../src/transaction.ts","../src/relay.ts","../src/withdraw.ts","../src/x402.ts","../src/transfer.ts","../src/subaccount.ts"],"names":["_ethSigUtil","_circomlib","Buffer","ethers","privateKeyToAccount","encodeFunctionData","parseEther","parseUnits","createPublicClient","base","http","formatUnits","MerkleTree","utils","groth16","keccak256","encodePacked","privateKeyToAddress","isAddress","toClientEvmSigner","client","x402Client","registerExactEvmScheme","x402HTTPClient","fetchCommitments","assertPrivateKey","formatEther"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * CJS/ESM interop for legacy dependencies that only ship CommonJS.\n *\n * eth-sig-util sets __esModule: true but has no default export — only named\n * exports. circomlib uses module.exports = { poseidon, ... }.\n *\n * Using namespace imports (import * as X) works reliably across both tsup's\n * CJS and ESM outputs, and browser bundlers (webpack/vite) handle them correctly.\n */\n\nimport * as _ethSigUtil from 'eth-sig-util';\nimport * as _circomlib from 'circomlib';\n\nfunction resolveInterop<T>(mod: T): T {\n  if (mod && typeof mod === 'object' && 'default' in (mod as object)) {\n    const defaultVal = (mod as unknown as { default: T }).default;\n    if (defaultVal != null) return defaultVal;\n  }\n  return mod;\n}\n\nexport const ethSigUtil = resolveInterop(_ethSigUtil);\nexport const circomlib = resolveInterop(_circomlib);\n","/**\n * Crypto utilities for Veil SDK\n * Poseidon hash, hex conversion, and random number generation\n */\n\nimport { ethers } from 'ethers';\nimport { Buffer } from 'buffer';\nimport { circomlib } from './compat.js';\n\nconst poseidon = circomlib.poseidon;\n\n/**\n * SNARK scalar field size\n */\nexport const FIELD_SIZE = BigInt(\n  '21888242871839275222246405745257275088548364400416034343698204186575808495617'\n);\n\n/**\n * Compute Poseidon hash of items\n * @param items - Array of values to hash (bigint, string, or number)\n * @returns Poseidon hash as bigint\n */\nexport const poseidonHash = (items: (bigint | string | number)[]): bigint => \n  BigInt(poseidon(items).toString());\n\n/**\n * Compute Poseidon hash of two items\n * @param a - First value\n * @param b - Second value\n * @returns Poseidon hash as bigint\n */\nexport const poseidonHash2 = (a: bigint | string | number, b: bigint | string | number): bigint => \n  poseidonHash([a, b]);\n\n/**\n * Generate random bigint of specified byte length\n * @param nbytes - Number of bytes (default: 31)\n * @returns Random bigint\n */\nexport const randomBN = (nbytes: number = 31): bigint => {\n  const cryptoApi = (globalThis as unknown as {\n    crypto?: { getRandomValues?: <T extends Uint8Array>(array: T) => T };\n  }).crypto;\n\n  if (!cryptoApi?.getRandomValues) {\n    throw new Error(\n      'Secure random number generation is unavailable. Provide globalThis.crypto.getRandomValues in this runtime.'\n    );\n  }\n\n  const bytes = cryptoApi.getRandomValues(new Uint8Array(nbytes));\n  let hex = '0x';\n  for (let i = 0; i < bytes.length; i++) {\n    hex += bytes[i].toString(16).padStart(2, '0');\n  }\n  return BigInt(hex);\n};\n\n/**\n * Convert bigint/string/number/Buffer to fixed-length hex string\n * @param number - Value to convert\n * @param length - Output byte length (default: 32)\n * @returns Hex string with 0x prefix\n */\nexport function toFixedHex(number: bigint | string | number | Buffer, length: number = 32): string {\n  let hexValue: string;\n  \n  if (number instanceof Buffer) {\n    hexValue = number.toString('hex');\n  } else {\n    let bigIntValue = BigInt(number as bigint | string | number);\n    \n    if (bigIntValue < 0n) {\n      // For negative numbers, use two's complement\n      const maxValue = 1n << BigInt(length * 8);\n      bigIntValue = maxValue + bigIntValue;\n    }\n    \n    hexValue = bigIntValue.toString(16);\n  }\n  \n  return '0x' + hexValue.padStart(length * 2, '0');\n}\n\n/**\n * Convert value to Buffer of specified byte length\n * @param value - Value to convert\n * @param length - Output byte length\n * @returns Buffer\n */\nexport const toBuffer = (value: bigint | string | number, length: number): Buffer => {\n  const bigIntValue = BigInt(value);\n  const hex = bigIntValue.toString(16).padStart(length * 2, '0');\n  return Buffer.from(hex, 'hex');\n};\n\n/**\n * External data input for hash calculation\n */\nexport interface ExtDataInput {\n  recipient: string | bigint;\n  extAmount: bigint;\n  relayer: string | bigint;\n  fee: bigint;\n  encryptedOutput1: string;\n  encryptedOutput2: string;\n}\n\n/**\n * Calculate hash of external data for ZK proof\n * Uses Solidity-compatible ABI encoding and keccak256 hash\n * \n * @param extData - External data to hash\n * @returns Hash as bigint (mod FIELD_SIZE)\n */\nexport function getExtDataHash(extData: ExtDataInput): bigint {\n  // Use ethers ABI encoder for Solidity-compatible encoding\n  const abi = ethers.AbiCoder.defaultAbiCoder();\n\n  // Encode the struct exactly as Solidity would\n  const encodedData = abi.encode(\n    ['tuple(address,int256,address,uint256,bytes,bytes)'],\n    [[\n      extData.recipient,\n      extData.extAmount,\n      extData.relayer, \n      extData.fee,\n      extData.encryptedOutput1,\n      extData.encryptedOutput2,\n    ]]\n  );\n  \n  const hash = ethers.keccak256(encodedData);\n  return BigInt(hash) % FIELD_SIZE;\n}\n\n/**\n * Shuffle an array using Fisher-Yates algorithm\n * Used to randomize input/output order for privacy\n * \n * @param array - Array to shuffle\n * @returns Shuffled array (mutates and returns same array)\n */\nexport function shuffle<T>(array: T[]): T[] {\n  let currentIndex = array.length;\n  let randomIndex: number;\n\n  // While there remain elements to shuffle...\n  while (currentIndex !== 0) {\n    // Pick a remaining element...\n    randomIndex = Math.floor(Math.random() * currentIndex);\n    currentIndex--;\n\n    // And swap it with the current element\n    [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\n  }\n\n  return array;\n}\n","/**\n * Veil Keypair class\n * Generates and manages keypairs for Veil deposits\n */\n\nimport { ethers } from 'ethers';\nimport { Buffer } from 'buffer';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { ethSigUtil } from './compat.js';\nimport { poseidonHash, toFixedHex } from './utils.js';\nimport type { EncryptedMessage } from './types.js';\n\n/**\n * Canonical message signed by a wallet to derive a Veil keypair.\n * Must match the frontend's SIGNED_MESSAGE in data/wallet/config.ts.\n */\nexport const VEIL_SIGNED_MESSAGE = \"Sign this message to create your Veil Wallet private key. This will be used to decrypt your balances. Ensure you are signing this message on the Veil Cash website.\";\n\n/**\n * Any async function that performs EIP-191 personal_sign and returns a 0x-prefixed signature.\n * Used with Keypair.fromSigner() to support external signing services.\n */\nexport type MessageSigner = (message: string) => Promise<string>;\n\n/**\n * Pack encrypted message into hex string\n */\nexport function packEncryptedMessage(encryptedMessage: EncryptedMessage): string {\n  const nonceBuf = Buffer.from(encryptedMessage.nonce, 'base64');\n  const ephemPublicKeyBuf = Buffer.from(encryptedMessage.ephemPublicKey, 'base64');\n  const ciphertextBuf = Buffer.from(encryptedMessage.ciphertext, 'base64');\n  const messageBuff = Buffer.concat([\n    Buffer.alloc(24 - nonceBuf.length),\n    nonceBuf,\n    Buffer.alloc(32 - ephemPublicKeyBuf.length),\n    ephemPublicKeyBuf,\n    ciphertextBuf,\n  ]);\n  return '0x' + messageBuff.toString('hex');\n}\n\n/**\n * Unpack hex string into encrypted message\n */\nexport function unpackEncryptedMessage(encryptedMessage: string): EncryptedMessage {\n  if (encryptedMessage.slice(0, 2) === '0x') {\n    encryptedMessage = encryptedMessage.slice(2);\n  }\n  const messageBuff = Buffer.from(encryptedMessage, 'hex');\n  const nonceBuf = messageBuff.slice(0, 24);\n  const ephemPublicKeyBuf = messageBuff.slice(24, 56);\n  const ciphertextBuf = messageBuff.slice(56);\n  return {\n    version: 'x25519-xsalsa20-poly1305',\n    nonce: nonceBuf.toString('base64'),\n    ephemPublicKey: ephemPublicKeyBuf.toString('base64'),\n    ciphertext: ciphertextBuf.toString('base64'),\n  };\n}\n\n/**\n * Veil Keypair for deposits\n * \n * A keypair consists of:\n * - Private key: Random 32-byte Ethereum-style key\n * - Public key: Poseidon hash of the private key\n * - Encryption key: x25519 public key for encrypted outputs\n * \n * The deposit key (used for registration) is: pubkey + encryptionKey\n * \n * @example\n * ```typescript\n * // Generate new keypair\n * const keypair = new Keypair();\n * console.log(keypair.depositKey()); // Register this on-chain\n * console.log(keypair.privkey);      // Store securely!\n * \n * // Restore from existing private key\n * const restored = new Keypair(savedPrivkey);\n * ```\n */\nexport class Keypair {\n  /** Private key (null if created from public deposit key only) */\n  public privkey: string | null;\n  \n  /** Public key (Poseidon hash of private key) */\n  public pubkey: bigint;\n  \n  /** x25519 encryption public key */\n  public encryptionKey: string;\n\n  /**\n   * Create a new Keypair\n   * @param privkey - Optional private key. If not provided, generates a random one.\n   */\n  constructor(privkey: string = ethers.Wallet.createRandom().privateKey) {\n    this.privkey = privkey;\n    this.pubkey = poseidonHash([this.privkey]);\n    this.encryptionKey = ethSigUtil.getEncryptionPublicKey(privkey.slice(2));\n  }\n\n  /**\n   * Get the deposit key for this keypair\n   * This is what you register on-chain\n   * @returns Deposit key as hex string (130 chars with 0x prefix)\n   */\n  toString(): string {\n    return toFixedHex(this.pubkey) + Buffer.from(this.encryptionKey, 'base64').toString('hex');\n  }\n\n  /**\n   * Alias for toString() - returns the deposit key\n   * @returns Deposit key as hex string\n   */\n  depositKey(): string {\n    return this.toString();\n  }\n\n  /**\n   * Create a Keypair from a public deposit key (without private key)\n   * Useful for sending transfers to other users\n   * @param str - Deposit key (128 or 130 hex chars)\n   * @returns Keypair instance (privkey will be null)\n   */\n  static fromString(str: string): Keypair {\n    if (str.length === 130) {\n      str = str.slice(2);\n    }\n    if (str.length !== 128) {\n      throw new Error('Invalid deposit key length. Expected 128 hex chars (or 130 with 0x prefix)');\n    }\n    return Object.assign(new Keypair(), {\n      privkey: null,\n      pubkey: BigInt('0x' + str.slice(0, 64)),\n      encryptionKey: Buffer.from(str.slice(64, 128), 'hex').toString('base64'),\n    });\n  }\n\n  /**\n   * Derive a Keypair from an EIP-191 personal_sign signature.\n   * The private key is keccak256(signature) -- matching the frontend derivation.\n   * \n   * @param signature - Raw ECDSA signature (0x-prefixed, 132 hex chars)\n   * @returns Keypair derived from the signature\n   * \n   * @example\n   * ```typescript\n   * const keypair = Keypair.fromSignature(signature);\n   * ```\n   */\n  static fromSignature(signature: string): Keypair {\n    const privkey = ethers.keccak256(signature);\n    return new Keypair(privkey);\n  }\n\n  /**\n   * Derive a Keypair from an Ethereum wallet private key.\n   * Signs VEIL_SIGNED_MESSAGE with the wallet, then derives via keccak256(signature).\n   * Produces the same keypair as the frontend for the same wallet.\n   * \n   * @param walletPrivateKey - Ethereum EOA private key (0x-prefixed)\n   * @returns Promise resolving to the derived Keypair\n   * \n   * @example\n   * ```typescript\n   * const keypair = await Keypair.fromWalletKey('0xYOUR_WALLET_PRIVATE_KEY');\n   * console.log(keypair.depositKey()); // Same as frontend login with this wallet\n   * ```\n   */\n  static async fromWalletKey(walletPrivateKey: `0x${string}`): Promise<Keypair> {\n    const account = privateKeyToAccount(walletPrivateKey);\n    const signature = await account.signMessage({ message: VEIL_SIGNED_MESSAGE });\n    return Keypair.fromSignature(signature);\n  }\n\n  /**\n   * Derive a Keypair using any external signer that supports personal_sign (EIP-191).\n   * The signer function receives VEIL_SIGNED_MESSAGE and must return a 0x-prefixed signature.\n   * Works with any signing backend: Bankr, MPC wallets, custodial services, hardware wallets, etc.\n   * \n   * @param signer - Async function that signs a message and returns a 0x-prefixed signature\n   * @returns Promise resolving to the derived Keypair\n   * \n   * @example\n   * ```typescript\n   * // With Bankr\n   * const keypair = await Keypair.fromSigner(async (message) => {\n   *   const res = await fetch('https://api.bankr.bot/agent/sign', {\n   *     method: 'POST',\n   *     headers: { 'X-API-Key': apiKey, 'Content-Type': 'application/json' },\n   *     body: JSON.stringify({ signatureType: 'personal_sign', message }),\n   *   });\n   *   return (await res.json()).signature;\n   * });\n   * \n   * // With any custom signer\n   * const keypair = await Keypair.fromSigner(async (msg) => myService.personalSign(msg));\n   * ```\n   */\n  static async fromSigner(signer: MessageSigner): Promise<Keypair> {\n    const signature = await signer(VEIL_SIGNED_MESSAGE);\n    return Keypair.fromSignature(signature);\n  }\n\n  /**\n   * Sign a message using the private key\n   * @param commitment - Commitment hash\n   * @param merklePath - Merkle path\n   * @returns Signature as bigint\n   */\n  sign(commitment: string | number | bigint, merklePath: string | number | bigint): bigint {\n    if (!this.privkey) {\n      throw new Error('Cannot sign without private key');\n    }\n    return poseidonHash([this.privkey, commitment, merklePath]);\n  }\n\n  /**\n   * Encrypt data using the encryption key\n   * @param bytes - Data to encrypt\n   * @returns Encrypted data as hex string\n   */\n  encrypt(bytes: Buffer): string {\n    return packEncryptedMessage(\n      ethSigUtil.encrypt(\n        this.encryptionKey, \n        { data: bytes.toString('base64') }, \n        'x25519-xsalsa20-poly1305'\n      )\n    );\n  }\n\n  /**\n   * Decrypt data using the private key\n   * @param data - Encrypted data as hex string\n   * @returns Decrypted data as Buffer\n   */\n  decrypt(data: string): Buffer {\n    if (!this.privkey) {\n      throw new Error('Cannot decrypt without private key');\n    }\n    return Buffer.from(\n      ethSigUtil.decrypt(unpackEncryptedMessage(data), this.privkey.slice(2)), \n      'base64'\n    );\n  }\n}\n","/**\n * UTXO (Unspent Transaction Output) class for Veil SDK\n * Represents a private balance entry that can be spent\n */\n\nimport { Buffer } from 'buffer';\nimport { Keypair } from './keypair.js';\nimport { poseidonHash, toBuffer, randomBN } from './utils.js';\n\nexport interface UtxoParams {\n  amount?: bigint | number | string;\n  keypair?: Keypair;\n  blinding?: bigint;\n  index?: number;\n}\n\n/**\n * UTXO class - represents a private balance entry\n * \n * A UTXO contains:\n * - amount: The value in wei\n * - blinding: Random value for privacy\n * - keypair: The owner's keypair\n * - index: Position in the merkle tree (needed for nullifier calculation)\n * \n * @example\n * ```typescript\n * // Decrypt an encrypted output\n * const utxo = Utxo.decrypt(encryptedOutput, keypair);\n * utxo.index = 5; // Set the merkle tree index\n * \n * // Check if spent\n * const nullifier = utxo.getNullifier();\n * const isSpent = await pool.isSpent(nullifier);\n * ```\n */\nexport class Utxo {\n  public amount: bigint;\n  public blinding: bigint;\n  public keypair: Keypair;\n  public index?: number;\n  private _commitment?: bigint;\n  private _nullifier?: bigint;\n\n  /**\n   * Create a new UTXO\n   * @param params - UTXO parameters\n   */\n  constructor(params: UtxoParams = {}) {\n    const { amount = 0, keypair = new Keypair(), blinding = randomBN(), index } = params;\n    this.amount = BigInt(amount);\n    this.blinding = BigInt(blinding);\n    this.keypair = keypair;\n    this.index = index;\n  }\n\n  /**\n   * Get the commitment for this UTXO\n   * commitment = poseidonHash([amount, pubkey, blinding])\n   * @returns Commitment as bigint\n   */\n  getCommitment(): bigint {\n    if (!this._commitment) {\n      this._commitment = poseidonHash([this.amount, this.keypair.pubkey, this.blinding]);\n    }\n    return this._commitment;\n  }\n\n  /**\n   * Get the nullifier for this UTXO\n   * Requires index and private key to be set\n   * nullifier = poseidonHash([commitment, index, signature])\n   * @returns Nullifier as bigint\n   */\n  getNullifier(): bigint {\n    if (!this._nullifier) {\n      if (\n        this.amount > 0n &&\n        (this.index === undefined || !this.keypair.privkey)\n      ) {\n        throw new Error('Cannot compute nullifier without UTXO index or private key');\n      }\n      const signature = this.keypair.privkey \n        ? this.keypair.sign(this.getCommitment(), this.index || 0) \n        : 0n;\n      this._nullifier = poseidonHash([this.getCommitment(), this.index || 0, signature]);\n    }\n    return this._nullifier;\n  }\n\n  /**\n   * Encrypt UTXO data using the keypair\n   * @returns Encrypted data as 0x-prefixed hex string\n   */\n  encrypt(): string {\n    const bytes = Buffer.concat([\n      toBuffer(this.amount, 31),\n      toBuffer(this.blinding, 31),\n    ]);\n    return this.keypair.encrypt(bytes);\n  }\n\n  /**\n   * Decrypt an encrypted output to create a UTXO\n   * Only succeeds if the keypair owns this UTXO\n   * \n   * @param data - Encrypted output as hex string\n   * @param keypair - Keypair to decrypt with\n   * @returns Decrypted UTXO\n   * @throws If decryption fails (wrong keypair)\n   */\n  static decrypt(data: string, keypair: Keypair): Utxo {\n    const buf = keypair.decrypt(data);\n    return new Utxo({\n      amount: BigInt('0x' + buf.slice(0, 31).toString('hex')),\n      blinding: BigInt('0x' + buf.slice(31, 62).toString('hex')),\n      keypair,\n    });\n  }\n}\n","/**\n * Contract addresses for Veil on Base\n */\n\nimport type { NetworkAddresses, RelayPool } from './types.js';\n\n/**\n * Contract addresses for Base mainnet\n */\nexport const ADDRESSES: NetworkAddresses = {\n  entry: '0xc2535c547B64b997A4BD9202E1663deaF11c78a5',\n  ethPool: '0x293dCda114533FF8f477271c5cA517209FFDEEe7',\n  ethQueue: '0xA4a926A2E7a22c38e8DFC6744A61a6aA8b06B230',\n  usdcPool: '0x5c50d58E49C59d112680c187De2Bf989d2a91242',\n  usdcQueue: '0x5530241b24504bF05C9a22e95A1F5458888e6a9B',\n  usdcToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n  forwarderFactory: '0x2848Fd62293A1ff3b4a897E9FcD0e5962dcc8101',\n  chainId: 8453,\n  relayUrl: 'https://veil-relay.up.railway.app',\n} as const;\n\n/**\n * Veil forwarder EIP-712 contract version\n */\nexport const FORWARDER_CONTRACT_VERSION = '1' as const;\n\n/**\n * Pool configuration (decimals, symbols, etc.)\n */\nexport const POOL_CONFIG = {\n  eth: {\n    decimals: 18,\n    displayDecimals: 4,\n    symbol: 'ETH',\n    name: 'Ethereum',\n  },\n  usdc: {\n    decimals: 6,\n    displayDecimals: 2,\n    symbol: 'USDC',\n    name: 'USD Coin',\n  },\n} as const;\n\n/**\n * Get contract addresses\n * @returns Contract addresses for Base mainnet\n */\nexport function getAddresses(): NetworkAddresses {\n  return ADDRESSES;\n}\n\n/**\n * Get the pool contract address for a given pool\n * @param pool - Pool identifier ('eth' or 'usdc')\n * @returns Pool contract address\n */\nexport function getPoolAddress(\n  pool: RelayPool\n): `0x${string}` {\n  const addresses = getAddresses();\n  switch (pool) {\n    case 'eth': return addresses.ethPool;\n    case 'usdc': return addresses.usdcPool;\n    default: throw new Error(`Unknown pool: ${pool}`);\n  }\n}\n\n/**\n * Get the queue contract address for a given pool\n * @param pool - Pool identifier ('eth' or 'usdc')\n * @returns Queue contract address\n */\nexport function getQueueAddress(\n  pool: RelayPool\n): `0x${string}` {\n  const addresses = getAddresses();\n  switch (pool) {\n    case 'eth': return addresses.ethQueue;\n    case 'usdc': return addresses.usdcQueue;\n    default: throw new Error(`Unknown pool: ${pool}`);\n  }\n}\n\n/**\n * Get the forwarder factory contract address\n * @returns Forwarder factory address for Base mainnet\n */\nexport function getForwarderFactoryAddress(): `0x${string}` {\n  return getAddresses().forwarderFactory;\n}\n\n/**\n * Get Relay URL\n * @returns Relay URL for Base mainnet\n */\nexport function getRelayUrl(): string {\n  return ADDRESSES.relayUrl;\n}\n","/**\n * Veil Entry Contract ABI\n */\n\nexport const ENTRY_ABI = [\n  // ============ ERRORS ============\n  { inputs: [], name: 'DepositsDisabled', type: 'error' },\n  { inputs: [], name: 'FeeTransferFailed', type: 'error' },\n  { inputs: [], name: 'InvalidDepositKey', type: 'error' },\n  { inputs: [], name: 'InvalidDepositKeyForUser', type: 'error' },\n  { inputs: [], name: 'InvalidInitialization', type: 'error' },\n  { inputs: [], name: 'MinimumDepositNotMet', type: 'error' },\n  { inputs: [], name: 'NotAllowedToDeposit', type: 'error' },\n  { inputs: [], name: 'NotInitializing', type: 'error' },\n  { inputs: [], name: 'OnlyOperatorAllowed', type: 'error' },\n  { inputs: [], name: 'OnlyOwnerCanRegister', type: 'error' },\n  { inputs: [], name: 'OnlyQueueContractAllowed', type: 'error' },\n  { inputs: [{ name: 'owner', type: 'address' }], name: 'OwnableInvalidOwner', type: 'error' },\n  { inputs: [{ name: 'account', type: 'address' }], name: 'OwnableUnauthorizedAccount', type: 'error' },\n  { inputs: [], name: 'ReentrancyGuardReentrantCall', type: 'error' },\n  { inputs: [], name: 'USDCTransferFailed', type: 'error' },\n  { inputs: [], name: 'UserAlreadyRegistered', type: 'error' },\n  { inputs: [], name: 'UserNotRegistered', type: 'error' },\n\n  // ============ EVENTS ============\n  {\n    anonymous: false,\n    inputs: [\n      { indexed: true, name: 'owner', type: 'address' },\n      { indexed: false, name: 'key', type: 'bytes' },\n    ],\n    name: 'DepositKey',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      { indexed: true, name: 'depositor', type: 'address' },\n      { indexed: false, name: 'amount', type: 'uint256' },\n    ],\n    name: 'DepositedETH',\n    type: 'event',\n  },\n\n  // ============ FUNCTIONS ============\n  \n  // Register deposit key\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'owner', type: 'address' },\n          { name: 'depositKey', type: 'bytes' },\n        ],\n        name: '_account',\n        type: 'tuple',\n      },\n    ],\n    name: 'register',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n\n  // Change deposit key (must already be registered)\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'owner', type: 'address' },\n          { name: 'depositKey', type: 'bytes' },\n        ],\n        name: '_account',\n        type: 'tuple',\n      },\n    ],\n    name: 'changeDepositKey',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n\n  // Queue ETH deposit\n  {\n    inputs: [{ name: '_depositKey', type: 'bytes' }],\n    name: 'queueETH',\n    outputs: [],\n    stateMutability: 'payable',\n    type: 'function',\n  },\n\n  // Queue USDC deposit\n  {\n    inputs: [\n      { name: '_amount', type: 'uint256' },\n      { name: '_depositKey', type: 'bytes' },\n    ],\n    name: 'queueUSDC',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n\n  // Read deposit keys\n  {\n    inputs: [{ name: '', type: 'address' }],\n    name: 'depositKeys',\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Check if deposits are enabled\n  {\n    inputs: [],\n    name: 'depositETHEnabled',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Get deposit fee\n  {\n    inputs: [],\n    name: 'depositFee',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Get minimum deposit\n  {\n    inputs: [],\n    name: 'minimumDeposit',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Calculate fee and net deposit\n  {\n    inputs: [{ name: '_totalAmount', type: 'uint256' }],\n    name: 'getFeeAndNetDeposit',\n    outputs: [\n      { name: 'netDeposit', type: 'uint256' },\n      { name: 'fee', type: 'uint256' },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Calculate deposit amount with fee\n  {\n    inputs: [{ name: '_netDepositAmount', type: 'uint256' }],\n    name: 'getDepositAmountWithFee',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n\n  // Check if user is allowed depositor\n  {\n    inputs: [{ name: '_depositor', type: 'address' }],\n    name: 'isAllowedDepositor',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\n/**\n * Queue Contract ABI (for balance queries)\n */\nexport const QUEUE_ABI = [\n  // Get all pending deposit nonces\n  {\n    inputs: [],\n    name: 'getPendingDeposits',\n    outputs: [{ name: 'nonces', type: 'uint256[]' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  // Get deposit details by nonce\n  {\n    inputs: [{ name: '_nonce', type: 'uint256' }],\n    name: 'getDeposit',\n    outputs: [\n      {\n        components: [\n          { name: 'fallbackReceiver', type: 'address' },\n          { name: 'amountIn', type: 'uint256' },\n          { name: 'fee', type: 'uint256' },\n          { name: 'shieldAmount', type: 'uint256' },\n          { name: 'timestamp', type: 'uint256' },\n          { name: 'status', type: 'uint8' },\n          { name: 'depositKey', type: 'bytes' },\n        ],\n        name: 'deposit',\n        type: 'tuple',\n      },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  // Get current nonce counter\n  {\n    inputs: [],\n    name: 'depositQueueNonce',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  // Get pending count\n  {\n    inputs: [],\n    name: 'getPendingCount',\n    outputs: [{ name: 'count', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\n/**\n * ETH Pool Contract ABI\n */\nexport const POOL_ABI = [\n  // ============ ERRORS ============\n  { inputs: [], name: 'CannotWithdrawToZeroAddress', type: 'error' },\n  { inputs: [], name: 'ETHTransferFailed', type: 'error' },\n  { inputs: [], name: 'IncorrectExternalDataHash', type: 'error' },\n  { inputs: [], name: 'InputAlreadySpent', type: 'error' },\n  { inputs: [], name: 'InvalidExtAmount', type: 'error' },\n  { inputs: [], name: 'InvalidFee', type: 'error' },\n  { inputs: [], name: 'InvalidMerkleRoot', type: 'error' },\n  { inputs: [], name: 'InvalidPublicAmount', type: 'error' },\n  { inputs: [], name: 'InvalidRange', type: 'error' },\n  { inputs: [], name: 'InvalidTransactionProof', type: 'error' },\n  { inputs: [], name: 'OnlyForDeposits', type: 'error' },\n  { inputs: [], name: 'OnlyForTransfers', type: 'error' },\n  { inputs: [], name: 'OnlyForWithdrawals', type: 'error' },\n  { inputs: [], name: 'OnlyValidatorContractAllowed', type: 'error' },\n  { inputs: [], name: 'OnlyWETHContractAllowed', type: 'error' },\n  { inputs: [{ name: 'owner', type: 'address' }], name: 'OwnableInvalidOwner', type: 'error' },\n  { inputs: [{ name: 'account', type: 'address' }], name: 'OwnableUnauthorizedAccount', type: 'error' },\n  { inputs: [], name: 'ProofAmountMismatch', type: 'error' },\n  { inputs: [], name: 'ReentrancyGuardReentrantCall', type: 'error' },\n  { inputs: [], name: 'UnsupportedInputCount', type: 'error' },\n  { inputs: [], name: 'WETHDepositFailed', type: 'error' },\n  { inputs: [], name: 'WETHUnwrapFailed', type: 'error' },\n\n  // ============ EVENTS ============\n  {\n    anonymous: false,\n    inputs: [\n      { indexed: false, name: 'commitment', type: 'bytes32' },\n      { indexed: false, name: 'index', type: 'uint256' },\n      { indexed: false, name: 'encryptedOutput', type: 'bytes' },\n    ],\n    name: 'NewCommitment',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [{ indexed: false, name: 'nullifier', type: 'bytes32' }],\n    name: 'NewNullifier',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [\n      { indexed: true, name: 'previousOwner', type: 'address' },\n      { indexed: true, name: 'newOwner', type: 'address' },\n    ],\n    name: 'OwnershipTransferred',\n    type: 'event',\n  },\n  {\n    anonymous: false,\n    inputs: [{ indexed: true, name: 'newValidatorContract', type: 'address' }],\n    name: 'ValidatorContractUpdated',\n    type: 'event',\n  },\n\n  // ============ VIEW FUNCTIONS ============\n  {\n    inputs: [],\n    name: 'FIELD_SIZE',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'ROOT_HISTORY_SIZE',\n    outputs: [{ name: '', type: 'uint32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'ZERO_VALUE',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '', type: 'uint256' }],\n    name: 'commitments',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'currentRootIndex',\n    outputs: [{ name: '', type: 'uint32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '', type: 'uint256' }],\n    name: 'encryptedOutputs',\n    outputs: [{ name: '', type: 'bytes' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '', type: 'uint256' }],\n    name: 'filledSubtrees',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { name: 'startIndex', type: 'uint256' },\n      { name: 'endIndex', type: 'uint256' },\n    ],\n    name: 'getCommitments',\n    outputs: [{ name: '', type: 'bytes32[]' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { name: 'startIndex', type: 'uint256' },\n      { name: 'endIndex', type: 'uint256' },\n    ],\n    name: 'getEncryptedOutputs',\n    outputs: [{ name: '', type: 'bytes[]' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'getLastRoot',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { name: '_left', type: 'bytes32' },\n      { name: '_right', type: 'bytes32' },\n    ],\n    name: 'hashLeftRight',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'hasher',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '_root', type: 'bytes32' }],\n    name: 'isKnownRoot',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '_nullifierHash', type: 'bytes32' }],\n    name: 'isSpent',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'levels',\n    outputs: [{ name: '', type: 'uint32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'nextIndex',\n    outputs: [{ name: '', type: 'uint32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '', type: 'bytes32' }],\n    name: 'nullifierHashes',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'owner',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '', type: 'uint256' }],\n    name: 'roots',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'validatorContract',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'verifier16',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'verifier2',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'weth',\n    outputs: [{ name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: 'i', type: 'uint256' }],\n    name: 'zeros',\n    outputs: [{ name: '', type: 'bytes32' }],\n    stateMutability: 'pure',\n    type: 'function',\n  },\n\n  // ============ PURE FUNCTIONS ============\n  {\n    inputs: [\n      { name: '_extAmount', type: 'int256' },\n      { name: '_fee', type: 'uint256' },\n    ],\n    name: 'calculatePublicAmount',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'pure',\n    type: 'function',\n  },\n\n  // ============ WRITE FUNCTIONS ============\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'proof', type: 'bytes' },\n          { name: 'root', type: 'bytes32' },\n          { name: 'inputNullifiers', type: 'bytes32[]' },\n          { name: 'outputCommitments', type: 'bytes32[2]' },\n          { name: 'publicAmount', type: 'uint256' },\n          { name: 'extDataHash', type: 'bytes32' },\n        ],\n        name: '_args',\n        type: 'tuple',\n      },\n      {\n        components: [\n          { name: 'recipient', type: 'address' },\n          { name: 'extAmount', type: 'int256' },\n          { name: 'relayer', type: 'address' },\n          { name: 'fee', type: 'uint256' },\n          { name: 'encryptedOutput1', type: 'bytes' },\n          { name: 'encryptedOutput2', type: 'bytes' },\n        ],\n        name: '_extData',\n        type: 'tuple',\n      },\n    ],\n    name: 'depositETH',\n    outputs: [],\n    stateMutability: 'payable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'proof', type: 'bytes' },\n          { name: 'root', type: 'bytes32' },\n          { name: 'inputNullifiers', type: 'bytes32[]' },\n          { name: 'outputCommitments', type: 'bytes32[2]' },\n          { name: 'publicAmount', type: 'uint256' },\n          { name: 'extDataHash', type: 'bytes32' },\n        ],\n        name: '_args',\n        type: 'tuple',\n      },\n      {\n        components: [\n          { name: 'recipient', type: 'address' },\n          { name: 'extAmount', type: 'int256' },\n          { name: 'relayer', type: 'address' },\n          { name: 'fee', type: 'uint256' },\n          { name: 'encryptedOutput1', type: 'bytes' },\n          { name: 'encryptedOutput2', type: 'bytes' },\n        ],\n        name: '_extData',\n        type: 'tuple',\n      },\n    ],\n    name: 'transactETH',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'proof', type: 'bytes' },\n          { name: 'root', type: 'bytes32' },\n          { name: 'inputNullifiers', type: 'bytes32[]' },\n          { name: 'outputCommitments', type: 'bytes32[2]' },\n          { name: 'publicAmount', type: 'uint256' },\n          { name: 'extDataHash', type: 'bytes32' },\n        ],\n        name: '_args',\n        type: 'tuple',\n      },\n      {\n        components: [\n          { name: 'recipient', type: 'address' },\n          { name: 'extAmount', type: 'int256' },\n          { name: 'relayer', type: 'address' },\n          { name: 'fee', type: 'uint256' },\n          { name: 'encryptedOutput1', type: 'bytes' },\n          { name: 'encryptedOutput2', type: 'bytes' },\n        ],\n        name: '_extData',\n        type: 'tuple',\n      },\n    ],\n    name: 'withdrawETH',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [\n      {\n        components: [\n          { name: 'proof', type: 'bytes' },\n          { name: 'root', type: 'bytes32' },\n          { name: 'inputNullifiers', type: 'bytes32[]' },\n          { name: 'outputCommitments', type: 'bytes32[2]' },\n          { name: 'publicAmount', type: 'uint256' },\n          { name: 'extDataHash', type: 'bytes32' },\n        ],\n        name: '_args',\n        type: 'tuple',\n      },\n    ],\n    name: 'verifyProof',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'renounceOwnership',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: 'newOwner', type: 'address' }],\n    name: 'transferOwnership',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: '_newValidator', type: 'address' }],\n    name: 'updateValidatorContract',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n\n  // ============ RECEIVE ============\n  { stateMutability: 'payable', type: 'receive' },\n] as const;\n\n/**\n * ERC20 ABI (for USDC approval)\n */\nexport const ERC20_ABI = [\n  {\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    name: 'approve',\n    outputs: [{ name: '', type: 'bool' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ name: 'account', type: 'address' }],\n    name: 'balanceOf',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { name: 'owner', type: 'address' },\n      { name: 'spender', type: 'address' },\n    ],\n    name: 'allowance',\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\n/**\n * Veil Forwarder Factory ABI\n */\nexport const FORWARDER_FACTORY_ABI = [\n  {\n    inputs: [],\n    name: 'CONTRACT_VERSION',\n    outputs: [{ internalType: 'string', name: '', type: 'string' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes32', name: '_salt', type: 'bytes32' },\n      { internalType: 'bytes', name: '_childDepositKey', type: 'bytes' },\n      { internalType: 'address', name: '_owner', type: 'address' },\n    ],\n    name: 'computeAddress',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'bytes32', name: '_salt', type: 'bytes32' },\n      { internalType: 'bytes', name: '_childDepositKey', type: 'bytes' },\n      { internalType: 'address', name: '_owner', type: 'address' },\n    ],\n    name: 'deploy',\n    outputs: [{ internalType: 'address', name: 'forwarder', type: 'address' }],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'relayer',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'veilEntry',\n    outputs: [{ internalType: 'address payable', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'usdc',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'owner',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const;\n\n/**\n * Veil Forwarder ABI\n */\nexport const FORWARDER_ABI = [\n  {\n    inputs: [],\n    name: 'CONTRACT_VERSION',\n    outputs: [{ internalType: 'string', name: '', type: 'string' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [\n      { internalType: 'address', name: '_token', type: 'address' },\n      { internalType: 'address', name: '_to', type: 'address' },\n      { internalType: 'uint256', name: '_amount', type: 'uint256' },\n      { internalType: 'uint256', name: '_nonce', type: 'uint256' },\n      { internalType: 'uint256', name: '_deadline', type: 'uint256' },\n      { internalType: 'bytes', name: '_signature', type: 'bytes' },\n    ],\n    name: 'withdraw',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n    name: 'usedNonces',\n    outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'owner',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'factory',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'childDepositKey',\n    outputs: [{ internalType: 'bytes', name: '', type: 'bytes' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'entry',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'usdc',\n    outputs: [{ internalType: 'address', name: '', type: 'address' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'sweepETH',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'sweepUSDC',\n    outputs: [],\n    stateMutability: 'nonpayable',\n    type: 'function',\n  },\n  {\n    inputs: [],\n    name: 'eip712Domain',\n    outputs: [\n      { internalType: 'bytes1', name: 'fields', type: 'bytes1' },\n      { internalType: 'string', name: 'name', type: 'string' },\n      { internalType: 'string', name: 'version', type: 'string' },\n      { internalType: 'uint256', name: 'chainId', type: 'uint256' },\n      { internalType: 'address', name: 'verifyingContract', type: 'address' },\n      { internalType: 'bytes32', name: 'salt', type: 'bytes32' },\n      { internalType: 'uint256[]', name: 'extensions', type: 'uint256[]' },\n    ],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  { type: 'error', name: 'ZeroAddress', inputs: [] },\n  { type: 'error', name: 'ZeroAmount', inputs: [] },\n  { type: 'error', name: 'InvalidDepositKey', inputs: [] },\n  { type: 'error', name: 'NotRelayer', inputs: [] },\n  { type: 'error', name: 'NoETHBalance', inputs: [] },\n  { type: 'error', name: 'NoTokenBalance', inputs: [] },\n  { type: 'error', name: 'TokenApproveFailed', inputs: [] },\n  { type: 'error', name: 'ETHTransferFailed', inputs: [] },\n  { type: 'error', name: 'NonceUsed', inputs: [] },\n  { type: 'error', name: 'Unauthorized', inputs: [] },\n  { type: 'error', name: 'DeadlineExpired', inputs: [] },\n] as const;\n","/**\n * Deposit functions for Veil SDK\n * Build transactions for registration and deposits\n */\n\nimport { encodeFunctionData, parseEther, parseUnits } from 'viem';\nimport { getAddresses, POOL_CONFIG } from './addresses.js';\nimport { ENTRY_ABI, ERC20_ABI } from './abi.js';\nimport type { \n  Token, \n  TransactionData, \n} from './types.js';\n\n/**\n * Build a transaction to register a deposit key\n * This is a one-time operation that links your address to your keypair\n * \n * @param depositKey - Deposit key from Keypair.depositKey()\n * @param ownerAddress - Address that will own this deposit key\n * @returns Transaction data to send\n * \n * @example\n * ```typescript\n * const keypair = new Keypair();\n * const tx = buildRegisterTx(keypair.depositKey(), '0x...');\n * // Send tx using your wallet (viem, ethers, etc.)\n * ```\n */\nexport function buildRegisterTx(\n  depositKey: string,\n  ownerAddress: `0x${string}`\n): TransactionData {\n  const addresses = getAddresses();\n  \n  const data = encodeFunctionData({\n    abi: ENTRY_ABI,\n    functionName: 'register',\n    args: [{\n      owner: ownerAddress,\n      depositKey: depositKey as `0x${string}`,\n    }],\n  });\n\n  return {\n    to: addresses.entry,\n    data,\n  };\n}\n\n/**\n * Build a transaction to change an existing deposit key\n * The caller must already be registered on-chain\n * \n * @param depositKey - New deposit key from Keypair.depositKey()\n * @param ownerAddress - Address that owns the current deposit key (must be msg.sender)\n * @returns Transaction data to send\n * \n * @example\n * ```typescript\n * const newKeypair = await Keypair.fromWalletKey('0x...');\n * const tx = buildChangeDepositKeyTx(newKeypair.depositKey(), '0x...');\n * // Send tx using your wallet\n * ```\n */\nexport function buildChangeDepositKeyTx(\n  depositKey: string,\n  ownerAddress: `0x${string}`\n): TransactionData {\n  const addresses = getAddresses();\n  \n  const data = encodeFunctionData({\n    abi: ENTRY_ABI,\n    functionName: 'changeDepositKey',\n    args: [{\n      owner: ownerAddress,\n      depositKey: depositKey as `0x${string}`,\n    }],\n  });\n\n  return {\n    to: addresses.entry,\n    data,\n  };\n}\n\n/**\n * Build a transaction to deposit ETH\n * \n * @param options - Deposit options\n * @param options.depositKey - Deposit key from Keypair.depositKey()\n * @param options.amount - Amount to deposit (human readable, e.g., '0.1')\n * @returns Transaction data including value to send\n * \n * @example\n * ```typescript\n * const tx = buildDepositETHTx({\n *   depositKey: keypair.depositKey(),\n *   amount: '0.1',\n * });\n * // Send tx with tx.value as the ETH amount\n * ```\n */\nexport function buildDepositETHTx(options: {\n  depositKey: string;\n  amount: string;\n}): TransactionData {\n  const { depositKey, amount } = options;\n  const addresses = getAddresses();\n  \n  const value = parseEther(amount);\n  \n  const data = encodeFunctionData({\n    abi: ENTRY_ABI,\n    functionName: 'queueETH',\n    args: [depositKey as `0x${string}`],\n  });\n\n  return {\n    to: addresses.entry,\n    data,\n    value,\n  };\n}\n\n/**\n * Build a transaction to approve USDC for deposit\n * Must be called before depositUSDC if allowance is insufficient\n * \n * @param options - Approval options\n * @param options.amount - Amount to approve (human readable, e.g., '100')\n * @returns Transaction data\n */\nexport function buildApproveUSDCTx(options: {\n  amount: string;\n}): TransactionData {\n  const { amount } = options;\n  const addresses = getAddresses();\n  \n  const amountWei = parseUnits(amount, POOL_CONFIG.usdc.decimals);\n  \n  const data = encodeFunctionData({\n    abi: ERC20_ABI,\n    functionName: 'approve',\n    args: [addresses.entry, amountWei],\n  });\n\n  return {\n    to: addresses.usdcToken,\n    data,\n  };\n}\n\n/**\n * Build a transaction to deposit USDC\n * Note: You must approve USDC first using buildApproveUSDCTx\n * \n * @param options - Deposit options\n * @param options.depositKey - Deposit key from Keypair.depositKey()\n * @param options.amount - Amount to deposit (human readable, e.g., '100')\n * @returns Transaction data\n */\nexport function buildDepositUSDCTx(options: {\n  depositKey: string;\n  amount: string;\n}): TransactionData {\n  const { depositKey, amount } = options;\n  const addresses = getAddresses();\n  \n  const amountWei = parseUnits(amount, POOL_CONFIG.usdc.decimals);\n  \n  const data = encodeFunctionData({\n    abi: ENTRY_ABI,\n    functionName: 'queueUSDC',\n    args: [amountWei, depositKey as `0x${string}`],\n  });\n\n  return {\n    to: addresses.entry,\n    data,\n  };\n}\n\n/**\n * Build a deposit transaction (ETH or USDC)\n * Convenience function that routes to the correct builder\n * \n * @param options - Deposit options\n * @returns Transaction data\n * \n * @example\n * ```typescript\n * // ETH deposit\n * const ethTx = buildDepositTx({\n *   depositKey: keypair.depositKey(),\n *   amount: '0.1',\n *   token: 'ETH',\n * });\n * \n * // USDC deposit (remember to approve first!)\n * const usdcTx = buildDepositTx({\n *   depositKey: keypair.depositKey(),\n *   amount: '100',\n *   token: 'USDC',\n * });\n * ```\n */\nexport function buildDepositTx(options: {\n  depositKey: string;\n  amount: string;\n  token?: Token;\n}): TransactionData {\n  const { token = 'ETH', ...rest } = options;\n  \n  if (token === 'USDC') {\n    return buildDepositUSDCTx(rest);\n  }\n  \n  return buildDepositETHTx(rest);\n}\n","/**\n * Balance functions for Veil SDK\n * Query queue and private balances directly from blockchain\n */\n\nimport { createPublicClient, http, formatUnits } from 'viem';\nimport { base } from 'viem/chains';\nimport { getPoolAddress, getQueueAddress, POOL_CONFIG } from './addresses.js';\nimport { QUEUE_ABI, POOL_ABI } from './abi.js';\nimport { Keypair } from './keypair.js';\nimport { Utxo } from './utxo.js';\nimport { toFixedHex } from './utils.js';\nimport type { \n  QueueBalanceResult, \n  PendingDeposit, \n  PrivateBalanceResult,\n  UtxoInfo,\n  RelayPool,\n} from './types.js';\n\n// Deposit status enum from Queue contract\nconst DEPOSIT_STATUS_MAP = {\n  0: 'pending',\n  1: 'accepted',\n  2: 'rejected',\n  3: 'refunded',\n} as const;\n\n/**\n * Progress callback type\n */\nexport type ProgressCallback = (stage: string, detail?: string) => void;\n\n/**\n * Get queue balance and pending deposits for an address\n * Queries the Queue contract directly (no API dependency)\n * \n * @param options - Query options\n * @param options.address - Address to check\n * @param options.rpcUrl - Optional RPC URL (uses default if not provided)\n * @param options.onProgress - Optional progress callback\n * @returns Queue balance and pending deposits\n * \n * @example\n * ```typescript\n * const result = await getQueueBalance({\n *   address: '0x...',\n *   pool: 'eth',\n *   onProgress: (stage, detail) => console.log(stage, detail),\n * });\n * \n * console.log(`Queue balance: ${result.queueBalance} ETH`);\n * console.log(`Pending deposits: ${result.pendingCount}`);\n * ```\n */\nexport async function getQueueBalance(options: {\n  address: `0x${string}`;\n  pool?: RelayPool;\n  rpcUrl?: string;\n  onProgress?: ProgressCallback;\n}): Promise<QueueBalanceResult> {\n  const { address, pool = 'eth', rpcUrl, onProgress } = options;\n  const queueAddress = getQueueAddress(pool);\n  const poolConfig = POOL_CONFIG[pool];\n\n  // Create public client\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  // Get all pending deposit nonces\n  onProgress?.('Fetching pending deposits...');\n  const pendingNonces = await publicClient.readContract({\n    address: queueAddress,\n    abi: QUEUE_ABI,\n    functionName: 'getPendingDeposits',\n  }) as bigint[];\n  onProgress?.('Queue status', `${pendingNonces.length} pending deposits in queue`);\n\n  // Fetch deposit details for each pending nonce\n  const pendingDeposits: PendingDeposit[] = [];\n  let totalQueueBalance = 0n;\n\n  for (let i = 0; i < pendingNonces.length; i++) {\n    const nonce = pendingNonces[i];\n    onProgress?.('Checking deposit', `${i + 1}/${pendingNonces.length}`);\n    \n    const deposit = await publicClient.readContract({\n      address: queueAddress,\n      abi: QUEUE_ABI,\n      functionName: 'getDeposit',\n      args: [nonce],\n    }) as {\n      fallbackReceiver: `0x${string}`;\n      amountIn: bigint;\n      fee: bigint;\n      shieldAmount: bigint;\n      timestamp: bigint;\n      status: number;\n      depositKey: `0x${string}`;\n    };\n\n    // Report the net shielded amount so queue totals match what will land in private balance.\n    if (deposit.fallbackReceiver.toLowerCase() === address.toLowerCase()) {\n      totalQueueBalance += deposit.shieldAmount;\n      pendingDeposits.push({\n        nonce: nonce.toString(),\n        status: DEPOSIT_STATUS_MAP[deposit.status as keyof typeof DEPOSIT_STATUS_MAP] || 'pending',\n        amount: formatUnits(deposit.shieldAmount, poolConfig.decimals),\n        amountWei: deposit.shieldAmount.toString(),\n        timestamp: new Date(Number(deposit.timestamp) * 1000).toISOString(),\n      });\n    }\n  }\n\n  if (pendingDeposits.length > 0) {\n    onProgress?.('Found', `${pendingDeposits.length} deposits for your address`);\n  }\n\n  return {\n    address,\n    queueBalance: formatUnits(totalQueueBalance, poolConfig.decimals),\n    queueBalanceWei: totalQueueBalance.toString(),\n    pendingDeposits,\n    pendingCount: pendingDeposits.length,\n  };\n}\n\n/**\n * Get private balance from the Pool contract\n * Decrypts all encrypted outputs, calculates nullifiers, and checks spent status\n * \n * @param options - Query options\n * @param options.keypair - Keypair to decrypt UTXOs with\n * @param options.rpcUrl - Optional RPC URL (uses default if not provided)\n * @param options.onProgress - Optional progress callback\n * @returns Private balance and UTXO details\n * \n * @example\n * ```typescript\n * const keypair = new Keypair(process.env.VEIL_KEY);\n * const result = await getPrivateBalance({ \n *   keypair,\n *   pool: 'eth',\n *   onProgress: (stage, detail) => console.log(stage, detail),\n * });\n * \n * console.log(`Private balance: ${result.privateBalance} ETH`);\n * console.log(`Unspent UTXOs: ${result.unspentCount}`);\n * ```\n */\nexport async function getPrivateBalance(options: {\n  keypair: Keypair;\n  pool?: RelayPool;\n  rpcUrl?: string;\n  onProgress?: ProgressCallback;\n}): Promise<PrivateBalanceResult> {\n  const { keypair, pool = 'eth', rpcUrl, onProgress } = options;\n  const poolAddress = getPoolAddress(pool);\n  const poolConfig = POOL_CONFIG[pool];\n\n  if (!keypair.privkey) {\n    throw new Error('Keypair must have a private key to calculate private balance');\n  }\n\n  // Create public client\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  // 1. Get total count of encrypted outputs\n  onProgress?.('Fetching pool index...');\n  const nextIndex = await publicClient.readContract({\n    address: poolAddress,\n    abi: POOL_ABI,\n    functionName: 'nextIndex',\n  }) as number;\n  onProgress?.('Pool index', `${nextIndex} commitments`);\n\n  if (nextIndex === 0) {\n    return {\n      privateBalance: '0',\n      privateBalanceWei: '0',\n      utxoCount: 0,\n      spentCount: 0,\n      unspentCount: 0,\n      utxos: [],\n    };\n  }\n\n  // 2. Fetch encrypted outputs in batches of 5000\n  const BATCH_SIZE = 5000;\n  const allEncryptedOutputs: string[] = [];\n  const totalBatches = Math.ceil(nextIndex / BATCH_SIZE);\n\n  for (let start = 0; start < nextIndex; start += BATCH_SIZE) {\n    const end = Math.min(start + BATCH_SIZE, nextIndex);\n    const batchNum = Math.floor(start / BATCH_SIZE) + 1;\n    onProgress?.('Fetching encrypted outputs', `batch ${batchNum}/${totalBatches} (${start}-${end})`);\n    \n    const batch = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getEncryptedOutputs',\n      args: [BigInt(start), BigInt(end)],\n    }) as string[];\n    allEncryptedOutputs.push(...batch);\n  }\n\n  // 3. Decrypt outputs - only user's UTXOs will decrypt successfully\n  onProgress?.('Decrypting outputs', `scanning ${allEncryptedOutputs.length} outputs...`);\n  const decryptedUtxos: { utxo: Utxo; index: number }[] = [];\n\n  for (let i = 0; i < allEncryptedOutputs.length; i++) {\n    try {\n      const utxo = Utxo.decrypt(allEncryptedOutputs[i], keypair);\n      utxo.index = i;\n      // Only include UTXOs with non-zero amounts\n      if (utxo.amount > 0n) {\n        decryptedUtxos.push({ utxo, index: i });\n      }\n    } catch {\n      // Not our UTXO - decryption fails, skip\n    }\n  }\n  onProgress?.('Found UTXOs', `${decryptedUtxos.length} belonging to you`);\n\n  // 4. Check spent status for each UTXO\n  const utxoInfos: UtxoInfo[] = [];\n  let totalBalance = 0n;\n  let spentCount = 0;\n  let unspentCount = 0;\n\n  for (let i = 0; i < decryptedUtxos.length; i++) {\n    const { utxo, index } = decryptedUtxos[i];\n    onProgress?.('Checking spent status', `UTXO ${i + 1}/${decryptedUtxos.length}`);\n    \n    const nullifier = utxo.getNullifier();\n    const nullifierHex = toFixedHex(nullifier) as `0x${string}`;\n\n    const isSpent = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'isSpent',\n      args: [nullifierHex],\n    }) as boolean;\n\n    utxoInfos.push({\n      index,\n      amount: formatUnits(utxo.amount, poolConfig.decimals),\n      amountWei: utxo.amount.toString(),\n      isSpent,\n    });\n\n    if (isSpent) {\n      spentCount++;\n    } else {\n      unspentCount++;\n      totalBalance += utxo.amount;\n    }\n  }\n\n  return {\n    privateBalance: formatUnits(totalBalance, poolConfig.decimals),\n    privateBalanceWei: totalBalance.toString(),\n    utxoCount: decryptedUtxos.length,\n    spentCount,\n    unspentCount,\n    utxos: utxoInfos,\n  };\n}\n","/**\n * Merkle tree utilities for Veil SDK\n * Build merkle trees from UTXO commitments for ZK proofs\n */\n\n// @ts-ignore - fixed-merkle-tree doesn't have TypeScript declarations\nimport MerkleTree from 'fixed-merkle-tree-legacy';\nimport { poseidonHash2, toFixedHex } from './utils.js';\n\n/**\n * Height of the merkle tree (matches on-chain contract)\n */\nexport const MERKLE_TREE_HEIGHT = 23;\n\n/**\n * Build a merkle tree from UTXO commitments\n * Uses Poseidon hash function compatible with on-chain verification\n * \n * @param commitments - Array of commitment hashes (hex strings or bigints)\n * @returns MerkleTree instance\n * \n * @example\n * ```typescript\n * const commitments = await poolContract.getCommitments(0, 1000);\n * const tree = await buildMerkleTree(commitments);\n * const root = tree.root();\n * ```\n */\nexport async function buildMerkleTree(commitments: (string | bigint)[]): Promise<MerkleTree> {\n  // Convert commitments to fixed hex format\n  const leaves = commitments.map((commitment) => toFixedHex(commitment));\n  \n  // Create hash function that uses Poseidon (matching on-chain)\n  const hashFunction = (left: string | bigint, right: string | bigint): string => {\n    const result = poseidonHash2(left, right);\n    return result.toString();\n  };\n  \n  const tree = new MerkleTree(MERKLE_TREE_HEIGHT, leaves, { hashFunction });\n  \n  return tree;\n}\n\n/**\n * Get merkle path for a commitment\n * \n * @param tree - Merkle tree instance\n * @param commitment - Commitment to get path for\n * @returns Path elements and indices\n */\nexport function getMerklePath(tree: MerkleTree, commitment: bigint | string): {\n  pathElements: bigint[];\n  pathIndices: number;\n} {\n  const commitmentHex = toFixedHex(commitment);\n  const index = tree.indexOf(commitmentHex);\n  \n  if (index < 0) {\n    throw new Error(`Commitment ${commitmentHex} not found in merkle tree`);\n  }\n  \n  const { pathElements } = tree.path(index);\n  \n  return {\n    pathElements: pathElements.map((el: string | number | bigint) => BigInt(el)),\n    pathIndices: index,\n  };\n}\n\n// Re-export MerkleTree type for consumers\nexport type { MerkleTree };\n","/**\n * ZK Proof generation for Veil SDK\n * Uses snarkjs groth16 to generate proofs for transactions\n */\n\nimport { groth16 } from 'snarkjs';\nimport { utils } from 'ffjavascript';\nimport { toFixedHex } from './utils.js';\n\n// Type definition for ffjavascript utils\ninterface FFJavascriptUtils {\n  stringifyBigInts: (obj: unknown) => unknown;\n  unstringifyBigInts: (obj: unknown) => unknown;\n}\n\nconst ffUtils = utils as FFJavascriptUtils;\n\n/**\n * Input data for ZK proof generation\n */\nexport interface ProofInput {\n  root: bigint;\n  inputNullifier: bigint[];\n  outputCommitment: bigint[];\n  publicAmount: string;\n  extDataHash: bigint;\n  \n  // Input UTXO data\n  inAmount: bigint[];\n  inPrivateKey: (string | null)[];\n  inBlinding: bigint[];\n  inPathIndices: number[];\n  inPathElements: (bigint | number)[][];\n  \n  // Output UTXO data\n  outAmount: bigint[];\n  outBlinding: bigint[];\n  outPubkey: bigint[];\n}\n\n/**\n * Raw snarkjs proof structure\n */\ninterface SnarkProof {\n  pi_a: [string, string];\n  pi_b: [[string, string], [string, string]];\n  pi_c: [string, string];\n}\n\ninterface ProveResult {\n  proof: SnarkProof;\n  publicSignals: string[];\n}\n\n/**\n * Directory/base URL where proving keys are hosted, or a resolver that returns\n * the circuit base path without the `.wasm` / `.zkey` extension.\n */\nexport type ProvingKeyPath = string | ((circuitName: string) => string);\n\nexport interface ProveOptions {\n  /**\n   * Proving key location.\n   *\n   * In Node this defaults to the package/source `keys` directory. In browsers\n   * this defaults to `/keys`, so apps can serve `/keys/transaction2.wasm` and\n   * `/keys/transaction2.zkey` from their own origin.\n   */\n  provingKeyPath?: ProvingKeyPath;\n  /** Force snarkjs single-threaded proving. Defaults to true. */\n  singleThread?: boolean;\n}\n\nfunction isBrowserRuntime(): boolean {\n  return !(typeof process !== 'undefined' && !!process.versions?.node);\n}\n\nfunction stripTrailingSlash(value: string): string {\n  return value.endsWith('/') ? value.slice(0, -1) : value;\n}\n\nfunction normalizeCircuitBasePath(provingKeyPath: ProvingKeyPath, circuitName: string): string {\n  const resolvedPath =\n    typeof provingKeyPath === 'function' ? provingKeyPath(circuitName) : provingKeyPath;\n\n  const withoutExtension = resolvedPath.replace(/\\.(wasm|zkey)$/i, '');\n  if (withoutExtension.endsWith(`/${circuitName}`) || withoutExtension.endsWith(`\\\\${circuitName}`)) {\n    return withoutExtension;\n  }\n\n  return `${stripTrailingSlash(withoutExtension)}/${circuitName}`;\n}\n\nfunction importNodeModule<T>(specifier: string): Promise<T> {\n  const dynamicImport = new Function('specifier', 'return import(specifier)') as (\n    specifier: string\n  ) => Promise<T>;\n  return dynamicImport(specifier);\n}\n\n/**\n * Find the keys directory containing circuit files\n * Works in both development and installed package scenarios\n */\nasync function findNodeKeysDirectory(): Promise<string> {\n  const [{ existsSync }, pathModule, { fileURLToPath }] = await Promise.all([\n    importNodeModule<typeof import('node:fs')>('node:fs'),\n    importNodeModule<typeof import('node:path')>('node:path'),\n    importNodeModule<typeof import('node:url')>('node:url'),\n  ]);\n  const path = pathModule;\n\n  // Try multiple possible locations\n  const possiblePaths = [\n    // When running from package (installed via npm)\n    path.resolve(process.cwd(), 'node_modules', '@veil-cash', 'sdk', 'keys'),\n    // When running from source\n    path.resolve(process.cwd(), 'keys'),\n  ];\n\n  // Try to get module directory for ESM\n  try {\n    const currentFilePath = fileURLToPath(import.meta.url);\n    const currentDir = path.dirname(currentFilePath);\n    possiblePaths.unshift(path.resolve(currentDir, '..', 'keys'));\n  } catch {\n    // Ignore non-file module URLs.\n  }\n\n  for (const p of possiblePaths) {\n    if (existsSync(p) && existsSync(path.join(p, 'transaction2.wasm'))) {\n      return p;\n    }\n  }\n\n  throw new Error(\n    'Circuit keys not found. Expected to find keys/ directory with transaction2.wasm and transaction2.zkey files.'\n  );\n}\n\nasync function resolveProvingKeyPaths(\n  circuitName: string,\n  provingKeyPath?: ProvingKeyPath,\n): Promise<{ wasmPath: string; zkeyPath: string }> {\n  if (provingKeyPath) {\n    const circuitBasePath = normalizeCircuitBasePath(provingKeyPath, circuitName);\n    return {\n      wasmPath: `${circuitBasePath}.wasm`,\n      zkeyPath: `${circuitBasePath}.zkey`,\n    };\n  }\n\n  if (isBrowserRuntime()) {\n    return {\n      wasmPath: `/keys/${circuitName}.wasm`,\n      zkeyPath: `/keys/${circuitName}.zkey`,\n    };\n  }\n\n  const keysDir = await findNodeKeysDirectory();\n  return {\n    wasmPath: `${keysDir}/${circuitName}.wasm`,\n    zkeyPath: `${keysDir}/${circuitName}.zkey`,\n  };\n}\n\nasync function assertNodeKeyFilesExist(wasmPath: string, zkeyPath: string): Promise<void> {\n  if (isBrowserRuntime() || wasmPath.startsWith('http://') || wasmPath.startsWith('https://')) {\n    return;\n  }\n\n  const { existsSync } = await importNodeModule<typeof import('node:fs')>('node:fs');\n  if (!existsSync(wasmPath)) {\n    throw new Error(`Circuit WASM file not found: ${wasmPath}`);\n  }\n  if (!existsSync(zkeyPath)) {\n    throw new Error(`Circuit zkey file not found: ${zkeyPath}`);\n  }\n}\n\n/**\n * Generate a ZK proof for a transaction\n * \n * @param input - Proof input data\n * @param circuitName - Circuit name (e.g., 'transaction2' or 'transaction16')\n * @returns Serialized proof as hex string\n * \n * @example\n * ```typescript\n * const proof = await prove(proofInput, 'transaction2');\n * // Returns: 0x1234...abcd (256 bytes hex)\n * ```\n */\nexport async function prove(\n  input: ProofInput,\n  circuitName: string,\n  options: ProveOptions = {},\n): Promise<string> {\n  const { wasmPath, zkeyPath } = await resolveProvingKeyPaths(circuitName, options.provingKeyPath);\n  await assertNodeKeyFilesExist(wasmPath, zkeyPath);\n\n  // Generate proof using snarkjs\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const result = await groth16.fullProve(\n    ffUtils.stringifyBigInts(input) as any,\n    wasmPath,\n    zkeyPath,\n    undefined,\n    undefined,\n    { singleThread: options.singleThread ?? true },\n  );\n  const proof = result.proof as unknown as SnarkProof;\n\n  // Serialize proof to hex string format expected by on-chain verifier\n  // Format: pi_a[0] + pi_a[1] + pi_b[0][1] + pi_b[0][0] + pi_b[1][1] + pi_b[1][0] + pi_c[0] + pi_c[1]\n  return (\n    '0x' +\n    toFixedHex(proof.pi_a[0]).slice(2) +\n    toFixedHex(proof.pi_a[1]).slice(2) +\n    toFixedHex(proof.pi_b[0][1]).slice(2) +\n    toFixedHex(proof.pi_b[0][0]).slice(2) +\n    toFixedHex(proof.pi_b[1][1]).slice(2) +\n    toFixedHex(proof.pi_b[1][0]).slice(2) +\n    toFixedHex(proof.pi_c[0]).slice(2) +\n    toFixedHex(proof.pi_c[1]).slice(2)\n  );\n}\n\n/**\n * Get the supported circuit names and their max input counts\n */\nexport const CIRCUIT_CONFIG = {\n  transaction2: { maxInputs: 2, maxOutputs: 2 },\n  transaction16: { maxInputs: 16, maxOutputs: 2 },\n} as const;\n\n/**\n * Select the appropriate circuit based on input count\n * \n * @param inputCount - Number of input UTXOs\n * @returns Circuit name to use\n */\nexport function selectCircuit(inputCount: number): string {\n  if (inputCount <= 2) {\n    return 'transaction2';\n  } else if (inputCount <= 16) {\n    return 'transaction16';\n  } else {\n    throw new Error(`Too many inputs: ${inputCount}. Maximum supported is 16.`);\n  }\n}\n","/**\n * Transaction preparation for Veil SDK\n * Core function to build ZK proofs for withdrawals and transfers\n */\n\nimport { buildMerkleTree, MERKLE_TREE_HEIGHT } from './merkle.js';\nimport { prove, selectCircuit, type ProofInput, type ProvingKeyPath } from './prover.js';\nimport { toFixedHex, getExtDataHash, shuffle, FIELD_SIZE } from './utils.js';\nimport { Utxo } from './utxo.js';\n\n/**\n * External data for a transaction (sent alongside proof)\n */\nexport interface ExtData {\n  recipient: string;\n  extAmount: string;\n  relayer: string;\n  fee: string;\n  encryptedOutput1: string;\n  encryptedOutput2: string;\n}\n\n/**\n * Proof arguments for on-chain verification\n */\nexport interface ProofArgs {\n  proof: string;\n  root: string;\n  inputNullifiers: string[];\n  outputCommitments: string[];\n  publicAmount: string;\n  extDataHash: string;\n}\n\n/**\n * Result of preparing a transaction\n */\nexport interface TransactionResult {\n  args: ProofArgs;\n  extData: ExtData;\n}\n\n/**\n * Parameters for preparing a transaction\n */\nexport interface PrepareTransactionParams {\n  /** All commitments from the merkle tree (from pool contract) */\n  commitments: (string | bigint)[];\n  /** Input UTXOs to spend */\n  inputs?: Utxo[];\n  /** Output UTXOs to create */\n  outputs?: Utxo[];\n  /** Transaction fee (usually 0 for relay) */\n  fee?: bigint | number;\n  /** Recipient address for withdrawals (0x0 for transfers) */\n  recipient?: string | bigint | number;\n  /** Relayer address (0x0 for now) */\n  relayer?: string | bigint | number;\n  /** Optional progress callback */\n  onProgress?: (stage: string, detail?: string) => void;\n  /** Optional proving key directory/base URL or circuit path resolver */\n  provingKeyPath?: ProvingKeyPath;\n}\n\n/**\n * Internal function to generate proof\n */\ninterface GetProofParams {\n  inputs: Utxo[];\n  outputs: Utxo[];\n  tree: ReturnType<typeof buildMerkleTree> extends Promise<infer T> ? T : never;\n  extAmount: bigint;\n  fee: bigint;\n  recipient: string | bigint;\n  relayer: string | bigint;\n  onProgress?: (stage: string, detail?: string) => void;\n  provingKeyPath?: ProvingKeyPath;\n}\n\nasync function getProof({\n  inputs,\n  outputs,\n  tree,\n  extAmount,\n  fee,\n  recipient,\n  relayer,\n  onProgress,\n  provingKeyPath,\n}: GetProofParams): Promise<TransactionResult> {\n  // Shuffle inputs and outputs for privacy\n  inputs = shuffle([...inputs]);\n  outputs = shuffle([...outputs]);\n\n  onProgress?.('Building merkle paths...');\n  \n  const inputMerklePathIndices: number[] = [];\n  const inputMerklePathElements: (bigint | number)[][] = [];\n\n  // Get merkle path for each input\n  for (const input of inputs) {\n    if (input.amount > 0n) {\n      const inputIndex = tree.indexOf(toFixedHex(input.getCommitment()));\n      if (inputIndex < 0) {\n        throw new Error(`Input commitment ${toFixedHex(input.getCommitment())} was not found in merkle tree`);\n      }\n      input.index = inputIndex;\n      inputMerklePathIndices.push(inputIndex);\n      inputMerklePathElements.push(\n        tree.path(inputIndex).pathElements.map((el: string | number | bigint) => BigInt(el))\n      );\n    } else {\n      // Empty input (padding) - use zero path\n      inputMerklePathIndices.push(0);\n      inputMerklePathElements.push(new Array(tree.levels).fill(0));\n    }\n  }\n\n  onProgress?.('Encrypting outputs...');\n\n  // Build external data\n  const extData: ExtData = {\n    recipient: toFixedHex(recipient, 20),\n    extAmount: extAmount.toString(),\n    relayer: toFixedHex(relayer, 20),\n    fee: fee.toString(),\n    encryptedOutput1: outputs[0].encrypt(),\n    encryptedOutput2: outputs[1].encrypt(),\n  };\n\n  // Calculate extDataHash using raw values\n  const extDataHashInput = {\n    recipient: recipient,\n    extAmount: extAmount,\n    relayer: relayer,\n    fee: fee,\n    encryptedOutput1: extData.encryptedOutput1,\n    encryptedOutput2: extData.encryptedOutput2,\n  };\n  const extDataHash = getExtDataHash(extDataHashInput);\n\n  // Build proof input\n  const proofInput: ProofInput = {\n    root: BigInt(tree.root()),\n    inputNullifier: inputs.map((x) => x.getNullifier()),\n    outputCommitment: outputs.map((x) => x.getCommitment()),\n    publicAmount: ((BigInt(extAmount) - BigInt(fee) + FIELD_SIZE) % FIELD_SIZE).toString(),\n    extDataHash,\n\n    // Input UTXO data\n    inAmount: inputs.map((x) => x.amount),\n    inPrivateKey: inputs.map((x) => x.keypair.privkey),\n    inBlinding: inputs.map((x) => x.blinding),\n    inPathIndices: inputMerklePathIndices,\n    inPathElements: inputMerklePathElements,\n\n    // Output UTXO data\n    outAmount: outputs.map((x) => x.amount),\n    outBlinding: outputs.map((x) => x.blinding),\n    outPubkey: outputs.map((x) => x.keypair.pubkey),\n  };\n\n  onProgress?.('Generating ZK proof...', `${inputs.length} inputs`);\n\n  // Select circuit based on input count and generate proof\n  const circuitName = selectCircuit(inputs.length);\n  const proof = await prove(proofInput, circuitName, { provingKeyPath });\n\n  // Build proof arguments for on-chain verification\n  const args: ProofArgs = {\n    proof,\n    root: toFixedHex(proofInput.root),\n    inputNullifiers: inputs.map((x) => toFixedHex(x.getNullifier())),\n    outputCommitments: outputs.map((x) => toFixedHex(x.getCommitment())),\n    publicAmount: toFixedHex(proofInput.publicAmount),\n    extDataHash: toFixedHex(extDataHash),\n  };\n\n  onProgress?.('Proof generated successfully');\n\n  return {\n    args,\n    extData,\n  };\n}\n\n/**\n * Prepare a transaction (withdrawal or transfer)\n * Builds the ZK proof and external data needed for on-chain execution\n * \n * @param params - Transaction parameters\n * @returns Proof arguments and external data\n * \n * @example\n * ```typescript\n * // Withdrawal: send funds to external address\n * const result = await prepareTransaction({\n *   commitments: poolCommitments,\n *   inputs: [utxo1, utxo2],\n *   outputs: [changeUtxo], // Just change\n *   recipient: '0x1234...', // Withdrawal address\n *   fee: 0,\n *   relayer: '0x0000...',\n * });\n * \n * // Transfer: move funds to another Veil user\n * const result = await prepareTransaction({\n *   commitments: poolCommitments,\n *   inputs: [utxo1],\n *   outputs: [recipientUtxo, changeUtxo],\n *   recipient: 0, // No external recipient\n *   fee: 0,\n *   relayer: '0x0000...',\n * });\n * ```\n */\nexport async function prepareTransaction({\n  commitments,\n  inputs = [],\n  outputs = [],\n  fee = 0,\n  recipient = 0,\n  relayer = 0,\n  onProgress,\n  provingKeyPath,\n}: PrepareTransactionParams): Promise<TransactionResult> {\n  // Validate input/output counts\n  if (inputs.length > 16 || outputs.length > 2) {\n    throw new Error('Incorrect inputs/outputs count. Maximum: 16 inputs, 2 outputs.');\n  }\n\n  // Pad inputs to 2 or 16 with empty UTXOs\n  while (inputs.length !== 2 && inputs.length < 16) {\n    inputs.push(new Utxo());\n  }\n\n  // Pad outputs to 2 with empty UTXOs\n  while (outputs.length < 2) {\n    outputs.push(new Utxo());\n  }\n\n  // Calculate external amount (fee + outputs - inputs)\n  // Positive = withdrawal, Negative = deposit\n  const extAmount = BigInt(fee) +\n    outputs.reduce((sum, x) => sum + x.amount, 0n) -\n    inputs.reduce((sum, x) => sum + x.amount, 0n);\n\n  onProgress?.('Building merkle tree...');\n\n  // Build merkle tree and generate proof\n  const tree = await buildMerkleTree(commitments);\n\n  const result = await getProof({\n    inputs,\n    outputs,\n    tree,\n    extAmount,\n    fee: BigInt(fee),\n    recipient: String(recipient),\n    relayer: String(relayer),\n    onProgress,\n    provingKeyPath,\n  });\n\n  return result;\n}\n","/**\n * Relay functions for submitting withdrawals and transfers\n * \n * The relay service handles transaction submission for privacy-preserving\n * withdrawals and transfers from Veil pools.\n * \n * Note: Public API is rate limited to 5 requests per minute per IP.\n * \n * @example\n * ```typescript\n * import { submitRelay } from '@veil-cash/sdk';\n * \n * const result = await submitRelay({\n *   type: 'withdraw',\n *   pool: 'eth',\n *   proofArgs: { ... },\n *   extData: { ... },\n *   metadata: { amount: '0.1' }\n * });\n * \n * console.log(result.transactionHash);\n * ```\n */\n\nimport { getRelayUrl } from './addresses.js';\nimport type {\n  RelayPool,\n  RelayResponse,\n  RelayErrorResponse,\n  SubmitRelayOptions,\n} from './types.js';\n\n/**\n * Error thrown when relay request fails\n */\nexport class RelayError extends Error {\n  /** HTTP status code */\n  statusCode: number;\n  /** Seconds until rate limit resets (only for 429 errors) */\n  retryAfter?: number;\n  /** Network the error occurred on */\n  network?: string;\n\n  constructor(message: string, statusCode: number, retryAfter?: number, network?: string) {\n    super(message);\n    this.name = 'RelayError';\n    this.statusCode = statusCode;\n    this.retryAfter = retryAfter;\n    this.network = network;\n  }\n}\n\nexport async function postRelayJson<T>(\n  endpoint: string,\n  body: unknown,\n  relayUrl?: string,\n): Promise<T> {\n  const url = relayUrl || getRelayUrl();\n  const response = await fetch(`${url}${endpoint}`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n\n  const text = await response.text();\n  let data: unknown;\n  try {\n    data = JSON.parse(text);\n  } catch {\n    throw new RelayError(\n      `Relay returned non-JSON response (HTTP ${response.status})`,\n      response.status,\n    );\n  }\n\n  if (!response.ok) {\n    const errorData = data as RelayErrorResponse;\n    throw new RelayError(\n      errorData.error || errorData.message || 'Relay request failed',\n      response.status,\n      errorData.retryAfter,\n      errorData.network,\n    );\n  }\n\n  return data as T;\n}\n\n/**\n * Submit a withdrawal or transfer to the relay service\n * \n * The relay service submits the transaction on behalf of the user,\n * allowing for privacy-preserving withdrawals and transfers.\n * \n * Rate limit: 5 requests per minute per IP (public API)\n * \n * @param options - Relay options including type, pool, proofArgs, extData\n * @returns Promise resolving to relay response with transaction hash\n * @throws RelayError if the request fails\n * \n * @example\n * ```typescript\n * // Withdraw ETH\n * const result = await submitRelay({\n *   type: 'withdraw',\n *   pool: 'eth',\n *   proofArgs: proofData.args,\n *   extData: proofData.extData,\n *   metadata: { amount: '0.1', recipient: '0x...' }\n * });\n * \n * // Transfer USDC\n * const result = await submitRelay({\n *   type: 'transfer',\n *   pool: 'usdc',\n *   proofArgs: proofData.args,\n *   extData: proofData.extData,\n *   metadata: { amount: '100' }\n * });\n * ```\n */\nexport async function submitRelay(options: SubmitRelayOptions): Promise<RelayResponse> {\n  const {\n    type,\n    pool = 'eth',\n    proofArgs,\n    extData,\n    metadata,\n    relayUrl: customRelayUrl,\n  } = options;\n\n  // Validate inputs\n  if (type !== 'withdraw' && type !== 'transfer') {\n    throw new RelayError('Invalid type. Must be \"withdraw\" or \"transfer\"', 400);\n  }\n\n  if (pool !== 'eth' && pool !== 'usdc') {\n    throw new RelayError('Invalid pool. Must be \"eth\" or \"usdc\"', 400);\n  }\n\n  if (!proofArgs || !extData) {\n    throw new RelayError('Missing proofArgs or extData', 400);\n  }\n\n  const relayUrl = customRelayUrl || getRelayUrl();\n  const endpoint = `/relay/${pool}`;\n  return postRelayJson<RelayResponse>(\n    endpoint,\n    {\n      type,\n      proofArgs,\n      extData,\n      metadata,\n    },\n    relayUrl,\n  );\n}\n\n/**\n * Check if relay service is healthy\n * \n * @param relayUrl - Optional custom relay URL\n * @returns Promise resolving to health status\n * \n * @example\n * ```typescript\n * const health = await checkRelayHealth();\n * console.log(health.status); // 'ok'\n * console.log(health.network); // 'base'\n * ```\n */\nexport async function checkRelayHealth(relayUrl?: string): Promise<{\n  status: string;\n  service: string;\n  network: string;\n  timestamp: string;\n}> {\n  const url = relayUrl || getRelayUrl();\n  const response = await fetch(`${url}/health`);\n\n  if (!response.ok) {\n    throw new RelayError('Relay service health check failed', response.status);\n  }\n\n  return response.json() as Promise<{\n    status: string;\n    service: string;\n    network: string;\n    timestamp: string;\n  }>;\n}\n\n/**\n * Get relay service info\n * \n * @param relayUrl - Optional custom relay URL\n * @returns Promise resolving to service info including rate limit config\n * \n * @example\n * ```typescript\n * const info = await getRelayInfo();\n * console.log(info.rateLimit.limit); // 5\n * console.log(info.rateLimit.windowMs); // 60000\n * ```\n */\nexport async function getRelayInfo(relayUrl?: string): Promise<{\n  service: string;\n  version: string;\n  network: string;\n  endpoints: Record<string, string>;\n  rateLimit: {\n    limit: number;\n    windowMs: number;\n    note: string;\n  };\n}> {\n  const url = relayUrl || getRelayUrl();\n  const response = await fetch(url);\n\n  if (!response.ok) {\n    throw new RelayError('Failed to get relay service info', response.status);\n  }\n\n  return response.json() as Promise<{\n    service: string;\n    version: string;\n    network: string;\n    endpoints: Record<string, string>;\n    rateLimit: {\n      limit: number;\n      windowMs: number;\n      note: string;\n    };\n  }>;\n}\n","/**\n * Withdrawal functions for Veil SDK\n * Build ZK proofs to withdraw funds from the pool to a public address\n */\n\nimport { createPublicClient, http, parseUnits, formatUnits } from 'viem';\nimport { base } from 'viem/chains';\nimport { getPoolAddress, POOL_CONFIG } from './addresses.js';\nimport { POOL_ABI } from './abi.js';\nimport { Keypair } from './keypair.js';\nimport { Utxo } from './utxo.js';\nimport { getPrivateBalance } from './balance.js';\nimport { prepareTransaction } from './transaction.js';\nimport { submitRelay } from './relay.js';\nimport type { \n  BuildWithdrawProofOptions, \n  ProofBuildResult, \n  WithdrawResult,\n  UtxoSelectionResult,\n} from './types.js';\n\n/**\n * Select UTXOs for withdrawal using largest-first algorithm\n * \n * @param utxos - Available unspent UTXOs\n * @param amount - Amount to withdraw (human readable)\n * @param decimals - Token decimals (default: 18 for ETH)\n * @returns Selected UTXOs and change amount\n */\nexport function selectUtxosForWithdraw(\n  utxos: Utxo[],\n  amount: string,\n  decimals: number = 18\n): UtxoSelectionResult {\n  const withdrawWei = parseUnits(amount, decimals);\n  \n  // Sort UTXOs by amount (largest first)\n  const sortedUtxos = [...utxos].sort((a, b) => Number(b.amount - a.amount));\n  \n  let totalSelected = 0n;\n  const selectedUtxos: Utxo[] = [];\n  \n  for (const utxo of sortedUtxos) {\n    selectedUtxos.push(utxo);\n    totalSelected += utxo.amount;\n    \n    if (totalSelected >= withdrawWei) {\n      break;\n    }\n  }\n  \n  if (totalSelected < withdrawWei) {\n    throw new Error(\n      `Insufficient balance. Need ${amount}, have ${formatUnits(totalSelected, decimals)}`\n    );\n  }\n  \n  const changeAmount = totalSelected - withdrawWei;\n  \n  return { selectedUtxos, totalSelected, changeAmount };\n}\n\n/**\n * Fetch all commitments from the pool contract\n * \n * @param rpcUrl - RPC URL\n * @param poolAddress - Pool contract address\n * @param onProgress - Progress callback\n * @returns Array of commitment hashes\n */\nasync function fetchCommitments(\n  rpcUrl: string | undefined,\n  poolAddress: `0x${string}`,\n  onProgress?: (stage: string, detail?: string) => void\n): Promise<string[]> {\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  // Get total count\n  onProgress?.('Fetching commitment count...');\n  const nextIndex = await publicClient.readContract({\n    address: poolAddress,\n    abi: POOL_ABI,\n    functionName: 'nextIndex',\n  }) as number;\n\n  if (nextIndex === 0) {\n    return [];\n  }\n\n  // Fetch commitments in batches\n  const BATCH_SIZE = 5000;\n  const commitments: string[] = [];\n  const totalBatches = Math.ceil(nextIndex / BATCH_SIZE);\n\n  for (let start = 0; start < nextIndex; start += BATCH_SIZE) {\n    const end = Math.min(start + BATCH_SIZE, nextIndex);\n    const batchNum = Math.floor(start / BATCH_SIZE) + 1;\n    onProgress?.('Fetching commitments', `batch ${batchNum}/${totalBatches}`);\n\n    const batch = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getCommitments',\n      args: [BigInt(start), BigInt(end)],\n    }) as `0x${string}`[];\n\n    commitments.push(...batch.map(c => c.toString()));\n  }\n\n  return commitments;\n}\n\n/**\n * Build a withdrawal proof\n * \n * This function:\n * 1. Fetches the user's unspent UTXOs\n * 2. Selects UTXOs to cover the withdrawal amount\n * 3. Fetches all commitments from the pool\n * 4. Builds the ZK proof\n * \n * @param options - Withdrawal options\n * @returns Proof data ready for relay submission\n * \n * @example\n * ```typescript\n * const keypair = new Keypair(process.env.VEIL_KEY);\n * const proof = await buildWithdrawProof({\n *   amount: '0.1',\n *   recipient: '0x1234...',\n *   keypair,\n *   onProgress: (stage, detail) => console.log(stage, detail),\n * });\n * ```\n */\nexport async function buildWithdrawProof(\n  options: BuildWithdrawProofOptions\n): Promise<ProofBuildResult> {\n  const {\n    amount,\n    recipient,\n    keypair,\n    pool = 'eth',\n    rpcUrl,\n    provingKeyPath,\n    onProgress,\n  } = options;\n\n  const poolConfig = POOL_CONFIG[pool];\n  const poolAddress = getPoolAddress(pool);\n\n  // 1. Get user's unspent UTXOs\n  onProgress?.('Fetching your UTXOs...');\n  const balanceResult = await getPrivateBalance({\n    keypair,\n    pool,\n    rpcUrl,\n    onProgress,\n  });\n\n  // Filter to only unspent UTXOs and recreate Utxo objects with keypair\n  const unspentUtxoInfos = balanceResult.utxos.filter(u => !u.isSpent);\n  if (unspentUtxoInfos.length === 0) {\n    throw new Error('No unspent UTXOs available for withdrawal');\n  }\n\n  // We need to re-decrypt the UTXOs to get full Utxo objects\n  // For now, we'll fetch encrypted outputs and decrypt again\n  onProgress?.('Preparing UTXOs...');\n  \n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  // Fetch encrypted outputs for our unspent UTXOs\n  const utxos: Utxo[] = [];\n  for (const utxoInfo of unspentUtxoInfos) {\n    const encryptedOutputs = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getEncryptedOutputs',\n      args: [BigInt(utxoInfo.index), BigInt(utxoInfo.index + 1)],\n    }) as string[];\n\n    if (encryptedOutputs.length > 0) {\n      try {\n        const utxo = Utxo.decrypt(encryptedOutputs[0], keypair);\n        utxo.index = utxoInfo.index;\n        utxos.push(utxo);\n      } catch {\n        // Skip if decryption fails\n      }\n    }\n  }\n\n  if (utxos.length === 0) {\n    throw new Error('Failed to decrypt UTXOs');\n  }\n\n  // 2. Select UTXOs for withdrawal\n  onProgress?.('Selecting UTXOs...');\n  const { selectedUtxos, changeAmount } = selectUtxosForWithdraw(\n    utxos,\n    amount,\n    poolConfig.decimals\n  );\n\n  // 3. Create output UTXOs (just change, since withdrawal goes to external address)\n  const outputs: Utxo[] = [];\n  if (changeAmount > 0n) {\n    const changeUtxo = new Utxo({\n      amount: changeAmount,\n      keypair: keypair,\n    });\n    outputs.push(changeUtxo);\n  }\n\n  // 4. Fetch all commitments from pool\n  const commitments = await fetchCommitments(rpcUrl, poolAddress, onProgress);\n\n  // 5. Build the ZK proof\n  onProgress?.('Building ZK proof...');\n  const result = await prepareTransaction({\n    commitments,\n    inputs: selectedUtxos,\n    outputs,\n    fee: 0,\n    recipient,\n    relayer: '0x0000000000000000000000000000000000000000',\n    onProgress,\n    provingKeyPath,\n  });\n\n  return {\n    proofArgs: {\n      proof: result.args.proof,\n      root: result.args.root,\n      inputNullifiers: result.args.inputNullifiers,\n      outputCommitments: result.args.outputCommitments as [string, string],\n      publicAmount: result.args.publicAmount,\n      extDataHash: result.args.extDataHash,\n    },\n    extData: result.extData,\n    inputCount: selectedUtxos.length,\n    outputCount: outputs.length,\n    amount,\n  };\n}\n\n/**\n * Execute a withdrawal by building proof and submitting to relay\n * \n * @param options - Withdrawal options\n * @returns Withdrawal result with transaction hash\n * \n * @example\n * ```typescript\n * const keypair = new Keypair(process.env.VEIL_KEY);\n * const result = await withdraw({\n *   amount: '0.1',\n *   recipient: '0x1234...',\n *   keypair,\n * });\n * \n * console.log(`Withdrawal tx: ${result.transactionHash}`);\n * ```\n */\nexport async function withdraw(\n  options: BuildWithdrawProofOptions\n): Promise<WithdrawResult> {\n  const { amount, recipient, pool = 'eth', onProgress, relayUrl } = options;\n\n  // Build the proof\n  const proof = await buildWithdrawProof(options);\n\n  // Submit to relay\n  onProgress?.('Submitting to relay...');\n  const relayResult = await submitRelay({\n    type: 'withdraw',\n    pool,\n    relayUrl,\n    proofArgs: proof.proofArgs,\n    extData: proof.extData,\n    metadata: {\n      amount,\n      recipient,\n      inputUtxoCount: proof.inputCount,\n      outputUtxoCount: proof.outputCount,\n    },\n  });\n\n  return {\n    success: relayResult.success,\n    transactionHash: relayResult.transactionHash,\n    blockNumber: relayResult.blockNumber,\n    amount,\n    recipient,\n  };\n}\n","import { x402Client, x402HTTPClient } from '@x402/core/client';\nimport type { PaymentRequired, PaymentRequirements, SettleResponse } from '@x402/core/types';\nimport { registerExactEvmScheme } from '@x402/evm/exact/client';\nimport { toClientEvmSigner } from '@x402/evm';\nimport {\n  createPublicClient,\n  encodePacked,\n  formatUnits,\n  http,\n  isAddress,\n  keccak256,\n  parseUnits,\n} from 'viem';\nimport { privateKeyToAccount, privateKeyToAddress } from 'viem/accounts';\nimport { base } from 'viem/chains';\nimport { ADDRESSES, POOL_CONFIG, getRelayUrl } from './addresses.js';\nimport { ERC20_ABI } from './abi.js';\nimport { Keypair } from './keypair.js';\nimport { submitRelay } from './relay.js';\nimport { buildWithdrawProof } from './withdraw.js';\nimport type { ProvingKeyPath } from './prover.js';\n\nconst X402_PAYER_DOMAIN = 'veil-x402-payer';\nconst BASE_NETWORK = `eip155:${ADDRESSES.chainId}` as const;\nconst USDC_DECIMALS = POOL_CONFIG.usdc.decimals;\n\n// The /x402 relay route enforces a minimum withdrawal (default 0.001 USDC =\n// 1000 atomic). A top-up shortfall below this floor is bumped up to it; the payer\n// then ends slightly above the price, leaving a sub-min residue drained next reuse.\nconst X402_MIN_WITHDRAW_ATOMIC = 1000n;\n\nexport interface PayX402ResourceOptions {\n  url: string;\n  rootPrivateKey: `0x${string}`;\n  payerIndex: bigint | number | string;\n  rpcUrl?: string;\n  relayUrl?: string;\n  /**\n   * Maximum USDC the caller will pay for this resource, as a human-readable\n   * decimal string (e.g. \"0.10\" or \"10\"). If the merchant's x402 requirement\n   * exceeds this cap, the payment is rejected before any proof is built or the\n   * payer EOA is funded. Prefer setting a tight per-request cap.\n   */\n  maxPayment?: string;\n  fetchImpl?: typeof fetch;\n  init?: RequestInit;\n  provingKeyPath?: ProvingKeyPath;\n  onProgress?: (stage: string, detail?: string) => void;\n  /**\n   * Fired immediately after the payer EOA is funded by the relay, before the\n   * x402 payment is signed and submitted. Lets callers persist a funded-state\n   * record so that funds are traceable even if a later step (signing, the second\n   * fetch, settle-header parse) fails. Best-effort: callback errors are ignored.\n   */\n  onPayerFunded?: (info: X402PayerFundedInfo) => void;\n  /**\n   * Controls funding when the derived payer EOA already holds USDC:\n   * - `true`: if the payer holds >= the required amount, skip the relay-funded\n   *   withdrawal and pay from that balance; throws if the balance is insufficient.\n   * - `'topup'`: reuse the payer, withdrawing only the shortfall (amount - balance)\n   *   when it holds less than the price. Drains stranded dust toward zero without a\n   *   fresh full withdrawal; if the payer already holds enough, funding is skipped.\n   * - `false`/undefined: always withdraw the full amount to the payer.\n   * Use reuse to retry a payment whose funding succeeded but whose delivery failed.\n   */\n  reuseExistingBalance?: boolean | 'topup';\n}\n\nexport interface X402PayerFundedInfo {\n  payerAddress: `0x${string}`;\n  payerIndex: string;\n  amount: string;\n  amountAtomic: string;\n  relayTransactionHash: string;\n  relayBlockNumber: string;\n}\n\nexport interface PayX402ResourceResult {\n  response: Response;\n  payerAddress: `0x${string}`;\n  payerIndex: string;\n  amount: string;\n  amountAtomic: string;\n  relayTransactionHash: string;\n  relayBlockNumber: string;\n  paymentResponse?: SettleResponse;\n  paymentTransactionHash?: string;\n}\n\nfunction assertPrivateKey(value: string, label: string): asserts value is `0x${string}` {\n  if (!/^0x[a-fA-F0-9]{64}$/.test(value)) {\n    throw new Error(`${label} must be a 0x-prefixed 32-byte hex string`);\n  }\n}\n\nfunction normalizePayerIndex(index: bigint | number | string): bigint {\n  const normalized =\n    typeof index === 'bigint'\n      ? index\n      : typeof index === 'number'\n        ? BigInt(index)\n        : BigInt(index);\n  if (normalized < 0n) {\n    throw new Error('payerIndex must be non-negative');\n  }\n  return normalized;\n}\n\nfunction normalizeAtomicAmount(amount: string): string {\n  if (!/^\\d+$/.test(amount)) {\n    throw new Error(`x402 amount must be an atomic integer string, received: ${amount}`);\n  }\n  if (BigInt(amount) <= 0n) {\n    throw new Error('x402 amount must be greater than 0');\n  }\n  return amount;\n}\n\nexport function usdcAtomicToDecimalString(amountAtomic: string | bigint): string {\n  const atomic = typeof amountAtomic === 'bigint' ? amountAtomic.toString() : normalizeAtomicAmount(amountAtomic);\n  return formatUnits(BigInt(atomic), USDC_DECIMALS);\n}\n\n/**\n * Convert a human-readable USDC amount (e.g. \"10\" or \"0.10\") to atomic units.\n */\nexport function usdcDecimalToAtomic(amount: string): bigint {\n  if (!/^\\d+(\\.\\d+)?$/.test(amount.trim())) {\n    throw new Error(`Invalid USDC amount: ${amount}`);\n  }\n  return parseUnits(amount.trim(), USDC_DECIMALS);\n}\n\nexport function deriveX402PayerKey(\n  rootPrivateKey: string,\n  index: bigint | number | string,\n): `0x${string}` {\n  assertPrivateKey(rootPrivateKey, 'rootPrivateKey');\n  const normalizedIndex = normalizePayerIndex(index);\n  return keccak256(\n    encodePacked(\n      ['bytes32', 'string', 'uint256'],\n      [rootPrivateKey, X402_PAYER_DOMAIN, normalizedIndex],\n    ),\n  );\n}\n\nexport function deriveX402PayerAddress(\n  rootPrivateKey: string,\n  index: bigint | number | string,\n): `0x${string}` {\n  return privateKeyToAddress(deriveX402PayerKey(rootPrivateKey, index));\n}\n\nexport function selectBaseUsdcExactRequirement(paymentRequired: PaymentRequired): PaymentRequirements {\n  if (paymentRequired.x402Version !== 2) {\n    throw new Error(`Unsupported x402 version ${paymentRequired.x402Version}; expected v2`);\n  }\n\n  const requirement = paymentRequired.accepts.find((candidate) =>\n    candidate.scheme === 'exact' &&\n    candidate.network === BASE_NETWORK &&\n    candidate.asset.toLowerCase() === ADDRESSES.usdcToken.toLowerCase()\n  );\n\n  if (!requirement) {\n    throw new Error('No supported x402 payment requirement found. Veil supports x402 v2 exact Base USDC only.');\n  }\n\n  if (!isAddress(requirement.payTo)) {\n    throw new Error('Selected x402 requirement has an invalid payTo address');\n  }\n  normalizeAtomicAmount(requirement.amount);\n  return requirement;\n}\n\nasync function parsePaymentRequired(response: Response, httpClient: x402HTTPClient): Promise<PaymentRequired> {\n  let body: unknown;\n  try {\n    body = await response.clone().json();\n  } catch {\n    body = undefined;\n  }\n\n  return httpClient.getPaymentRequiredResponse(\n    (name) => response.headers.get(name),\n    body,\n  );\n}\n\nexport async function payX402Resource(options: PayX402ResourceOptions): Promise<PayX402ResourceResult> {\n  const fetchImpl = options.fetchImpl ?? globalThis.fetch;\n  if (!fetchImpl) {\n    throw new Error('fetch is not available; pass fetchImpl');\n  }\n\n  const payerIndex = normalizePayerIndex(options.payerIndex);\n  const payerPrivateKey = deriveX402PayerKey(options.rootPrivateKey, payerIndex);\n  const payerAccount = privateKeyToAccount(payerPrivateKey);\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(options.rpcUrl),\n  });\n  const signer = toClientEvmSigner(payerAccount, publicClient);\n\n  const client = new x402Client((_version, requirements) =>\n    selectBaseUsdcExactRequirement({\n      x402Version: 2,\n      resource: { url: options.url },\n      accepts: requirements,\n    }),\n  );\n  registerExactEvmScheme(client, {\n    signer,\n    networks: [BASE_NETWORK],\n    schemeOptions: options.rpcUrl ? { rpcUrl: options.rpcUrl } : undefined,\n  });\n  const httpClient = new x402HTTPClient(client);\n\n  options.onProgress?.('Fetching x402 requirement...');\n  const initialResponse = await fetchImpl(options.url, options.init);\n  if (initialResponse.status !== 402) {\n    return {\n      response: initialResponse,\n      payerAddress: payerAccount.address,\n      payerIndex: payerIndex.toString(),\n      amount: '0',\n      amountAtomic: '0',\n      relayTransactionHash: '',\n      relayBlockNumber: '',\n    };\n  }\n\n  const paymentRequired = await parsePaymentRequired(initialResponse, httpClient);\n  const requirement = selectBaseUsdcExactRequirement(paymentRequired);\n  const amountAtomic = normalizeAtomicAmount(requirement.amount);\n  const amount = usdcAtomicToDecimalString(amountAtomic);\n\n  // Enforce the spend cap before building a proof or funding the payer EOA so a\n  // merchant cannot raise prices between calls and drain more than intended.\n  if (options.maxPayment !== undefined) {\n    const maxAtomic = usdcDecimalToAtomic(options.maxPayment);\n    if (BigInt(amountAtomic) > maxAtomic) {\n      throw new Error(\n        `x402 payment of ${amount} USDC exceeds maxPayment cap of ${usdcAtomicToDecimalString(maxAtomic)} USDC. Payment was not sent.`,\n      );\n    }\n  }\n\n  // Decide whether to fund a fresh withdrawal or reuse an existing payer balance.\n  // Reuse lets a caller retry a payment whose funding succeeded but whose delivery\n  // failed (the USDC is still sitting on the payer EOA) without a second withdrawal.\n  let relayTransactionHash = '';\n  let relayBlockNumber = '';\n  // How much USDC to actually withdraw to the payer. For a fresh payer this is the\n  // full amount; when reusing, it is only the shortfall ('topup') or zero (the payer\n  // already holds enough).\n  let fundAtomic = BigInt(amountAtomic);\n  if (options.reuseExistingBalance) {\n    const payerBalance = (await publicClient.readContract({\n      address: ADDRESSES.usdcToken,\n      abi: ERC20_ABI,\n      functionName: 'balanceOf',\n      args: [payerAccount.address],\n    })) as bigint;\n    if (payerBalance >= BigInt(amountAtomic)) {\n      fundAtomic = 0n;\n    } else if (options.reuseExistingBalance === 'topup') {\n      // Drain dust: withdraw only the shortfall so the payer lands at ~exactly the\n      // price after this payment, driving a stranded balance toward zero without a\n      // fresh full withdrawal.\n      fundAtomic = BigInt(amountAtomic) - payerBalance;\n    } else {\n      throw new Error(\n        `Cannot reuse payer index ${payerIndex.toString()}: holds ${formatUnits(payerBalance, USDC_DECIMALS)} USDC but the resource requires ${amount} USDC. Pass reuseExistingBalance: 'topup' to fund the shortfall.`,\n      );\n    }\n  }\n\n  if (fundAtomic === 0n) {\n    options.onProgress?.('Reusing funded x402 payer...', `${amount} USDC on ${payerAccount.address}`);\n  } else {\n    // Bump a sub-minimum shortfall up to the relay floor so the /x402 route accepts\n    // it; the payer ends slightly above the price (residue drained on next reuse).\n    if (fundAtomic < X402_MIN_WITHDRAW_ATOMIC) {\n      fundAtomic = X402_MIN_WITHDRAW_ATOMIC;\n    }\n    const fundAmount = usdcAtomicToDecimalString(fundAtomic);\n    options.onProgress?.('Funding x402 payer...', `${fundAmount} USDC to ${payerAccount.address}`);\n    const proof = await buildWithdrawProof({\n      amount: fundAmount,\n      recipient: payerAccount.address,\n      keypair: new Keypair(options.rootPrivateKey),\n      pool: 'usdc',\n      rpcUrl: options.rpcUrl,\n      provingKeyPath: options.provingKeyPath,\n      onProgress: options.onProgress,\n    });\n    const relayResult = await submitRelay({\n      type: 'withdraw',\n      pool: 'usdc',\n      // x402 funding must target the low-minimum /x402 relay route. Default to it\n      // so direct SDK consumers do not silently hit the main relay's 5 USDC floor.\n      relayUrl: options.relayUrl ?? `${getRelayUrl()}/x402`,\n      proofArgs: proof.proofArgs,\n      extData: proof.extData,\n      metadata: {\n        amount: fundAmount,\n        amountAtomic: fundAtomic.toString(),\n        recipient: payerAccount.address,\n        inputUtxoCount: proof.inputCount,\n        outputUtxoCount: proof.outputCount,\n        x402: true,\n        payerIndex: payerIndex.toString(),\n      },\n    });\n    relayTransactionHash = relayResult.transactionHash;\n    relayBlockNumber = relayResult.blockNumber;\n\n    // The payer is now funded. Notify the caller before signing so a funded-state\n    // record can be persisted even if a later step throws and strands funds.\n    if (options.onPayerFunded) {\n      try {\n        options.onPayerFunded({\n          payerAddress: payerAccount.address,\n          payerIndex: payerIndex.toString(),\n          amount,\n          amountAtomic,\n          relayTransactionHash,\n          relayBlockNumber,\n        });\n      } catch {\n        // Best-effort notification; never let a logging callback abort the payment.\n      }\n    }\n  }\n\n  options.onProgress?.('Signing x402 payment...');\n  const paymentPayload = await httpClient.createPaymentPayload({\n    ...paymentRequired,\n    accepts: [requirement],\n  });\n  const paymentHeaders = httpClient.encodePaymentSignatureHeader(paymentPayload);\n  const headers = new Headers(options.init?.headers);\n  for (const [key, value] of Object.entries(paymentHeaders)) {\n    headers.set(key, value);\n  }\n\n  options.onProgress?.('Requesting paid resource...');\n  const paidResponse = await fetchImpl(options.url, {\n    ...options.init,\n    headers,\n  });\n\n  let paymentResponse: SettleResponse | undefined;\n  try {\n    paymentResponse = httpClient.getPaymentSettleResponse((name) => paidResponse.headers.get(name));\n  } catch {\n    paymentResponse = undefined;\n  }\n\n  return {\n    response: paidResponse,\n    payerAddress: payerAccount.address,\n    payerIndex: payerIndex.toString(),\n    amount,\n    amountAtomic,\n    relayTransactionHash,\n    relayBlockNumber,\n    paymentResponse,\n    paymentTransactionHash: paymentResponse?.transaction,\n  };\n}\n\nexport interface QuoteX402ResourceOptions {\n  url: string;\n  rpcUrl?: string;\n  /**\n   * Optional USDC spend cap (decimal string). When set, the result reports\n   * whether the merchant's price exceeds it so a caller can refuse before paying.\n   */\n  maxPayment?: string;\n  fetchImpl?: typeof fetch;\n  init?: RequestInit;\n}\n\nexport interface QuoteX402ResourceResult {\n  /** True when the endpoint returned HTTP 402 (payment required). */\n  requiresPayment: boolean;\n  /** True when the 402 offers a Veil-supported exact Base USDC requirement. */\n  supported: boolean;\n  /** Initial HTTP status from the unpaid probe. */\n  status: number;\n  amount?: string;\n  amountAtomic?: string;\n  payTo?: string;\n  network?: string;\n  asset?: string;\n  /** Set when maxPayment was supplied: true if the price exceeds the cap. */\n  exceedsMax?: boolean;\n  maxPayment?: string;\n  /** Parsed response body for a non-402 probe, so the caller can see the error. */\n  body?: unknown;\n  /** Populated when a 402 was returned but no supported requirement could be parsed. */\n  error?: string;\n}\n\n/**\n * Probe an x402 resource WITHOUT funding a payer or signing a payment. Returns\n * the price/requirement for a supported 402, or the raw response for anything\n * else, so a caller can validate the request and confirm cost before committing\n * a withdrawal. Note: a merchant that only validates the request body after\n * payment will still return 402 here; this cannot catch post-payment errors.\n */\nexport async function quoteX402Resource(options: QuoteX402ResourceOptions): Promise<QuoteX402ResourceResult> {\n  const fetchImpl = options.fetchImpl ?? globalThis.fetch;\n  if (!fetchImpl) {\n    throw new Error('fetch is not available; pass fetchImpl');\n  }\n\n  // A selector-only client is enough to parse the 402; no signer/scheme needed\n  // because we never sign or settle in a quote.\n  const client = new x402Client((_version, requirements) =>\n    selectBaseUsdcExactRequirement({\n      x402Version: 2,\n      resource: { url: options.url },\n      accepts: requirements,\n    }),\n  );\n  const httpClient = new x402HTTPClient(client);\n\n  const initialResponse = await fetchImpl(options.url, options.init);\n  if (initialResponse.status !== 402) {\n    let body: unknown;\n    try {\n      body = await initialResponse.clone().json();\n    } catch {\n      try {\n        body = await initialResponse.clone().text();\n      } catch {\n        body = undefined;\n      }\n    }\n    return {\n      requiresPayment: false,\n      supported: false,\n      status: initialResponse.status,\n      body,\n    };\n  }\n\n  let requirement: PaymentRequirements;\n  try {\n    const paymentRequired = await parsePaymentRequired(initialResponse, httpClient);\n    requirement = selectBaseUsdcExactRequirement(paymentRequired);\n  } catch (error) {\n    return {\n      requiresPayment: true,\n      supported: false,\n      status: 402,\n      error: error instanceof Error ? error.message : 'Unsupported x402 requirement',\n    };\n  }\n\n  const amountAtomic = normalizeAtomicAmount(requirement.amount);\n  const amount = usdcAtomicToDecimalString(amountAtomic);\n  let exceedsMax: boolean | undefined;\n  if (options.maxPayment !== undefined) {\n    exceedsMax = BigInt(amountAtomic) > usdcDecimalToAtomic(options.maxPayment);\n  }\n\n  return {\n    requiresPayment: true,\n    supported: true,\n    status: 402,\n    amount,\n    amountAtomic,\n    payTo: requirement.payTo,\n    network: requirement.network,\n    asset: requirement.asset,\n    exceedsMax,\n    maxPayment: options.maxPayment,\n  };\n}\n\nexport interface X402PayerBalance {\n  payerIndex: string;\n  payerAddress: `0x${string}`;\n  usdc: string;\n  usdcAtomic: string;\n}\n\nexport interface GetX402PayerBalancesOptions {\n  rootPrivateKey: `0x${string}`;\n  startIndex?: bigint | number | string;\n  count?: number;\n  rpcUrl?: string;\n  /** When true, only return payers that currently hold a non-zero USDC balance. */\n  nonZeroOnly?: boolean;\n}\n\n/**\n * Inspect Base USDC balances held by deterministic x402 payer EOAs over an index\n * range. Useful for surfacing dust or funds left on a payer when a payment failed\n * after funding. This is read-only; it does not move funds or reuse payers.\n */\nexport async function getX402PayerBalances(\n  options: GetX402PayerBalancesOptions,\n): Promise<X402PayerBalance[]> {\n  assertPrivateKey(options.rootPrivateKey, 'rootPrivateKey');\n  const start = normalizePayerIndex(options.startIndex ?? 0n);\n  const count = options.count ?? 16;\n  if (!Number.isInteger(count) || count <= 0 || count > 256) {\n    throw new Error('count must be an integer between 1 and 256');\n  }\n\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(options.rpcUrl),\n  });\n\n  const results: X402PayerBalance[] = [];\n  for (let i = 0; i < count; i++) {\n    const index = start + BigInt(i);\n    const payerAddress = deriveX402PayerAddress(options.rootPrivateKey, index);\n    const balance = (await publicClient.readContract({\n      address: ADDRESSES.usdcToken,\n      abi: ERC20_ABI,\n      functionName: 'balanceOf',\n      args: [payerAddress],\n    })) as bigint;\n\n    if (options.nonZeroOnly && balance === 0n) {\n      continue;\n    }\n\n    results.push({\n      payerIndex: index.toString(),\n      payerAddress,\n      usdc: formatUnits(balance, USDC_DECIMALS),\n      usdcAtomic: balance.toString(),\n    });\n  }\n\n  return results;\n}\n","/**\n * Transfer functions for Veil SDK\n * Build ZK proofs to transfer funds privately within the pool\n */\n\nimport { createPublicClient, http, parseUnits } from 'viem';\nimport { base } from 'viem/chains';\nimport { getAddresses, getPoolAddress, POOL_CONFIG } from './addresses.js';\nimport { POOL_ABI, ENTRY_ABI } from './abi.js';\nimport { Keypair } from './keypair.js';\nimport { Utxo } from './utxo.js';\nimport { getPrivateBalance } from './balance.js';\nimport { prepareTransaction } from './transaction.js';\nimport { submitRelay } from './relay.js';\nimport { selectUtxosForWithdraw } from './withdraw.js';\nimport type { \n  BuildTransferProofOptions, \n  ProofBuildResult, \n  TransferResult,\n  RelayPool,\n} from './types.js';\n\n/**\n * Check if a recipient is registered and get their deposit key\n * \n * @param address - Address to check\n * @param rpcUrl - Optional RPC URL\n * @returns Whether registered and their deposit key if so\n * \n * @example\n * ```typescript\n * const { isRegistered, depositKey } = await checkRecipientRegistration('0x1234...');\n * if (!isRegistered) {\n *   console.log('Recipient needs to register first');\n * }\n * ```\n */\nexport async function checkRecipientRegistration(\n  address: `0x${string}`,\n  rpcUrl?: string\n): Promise<{ isRegistered: boolean; depositKey?: string }> {\n  const addresses = getAddresses();\n  \n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  const depositKey = await publicClient.readContract({\n    address: addresses.entry,\n    abi: ENTRY_ABI,\n    functionName: 'depositKeys',\n    args: [address],\n  }) as string;\n\n  // If depositKey exists and is not empty, recipient is registered\n  const isRegistered = !!(depositKey && depositKey !== '0x' && depositKey.length > 2);\n\n  return {\n    isRegistered,\n    depositKey: isRegistered ? depositKey : undefined,\n  };\n}\n\n/**\n * Fetch all commitments from the pool contract\n */\nasync function fetchCommitments(\n  rpcUrl: string | undefined,\n  poolAddress: `0x${string}`,\n  onProgress?: (stage: string, detail?: string) => void\n): Promise<string[]> {\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  onProgress?.('Fetching commitment count...');\n  const nextIndex = await publicClient.readContract({\n    address: poolAddress,\n    abi: POOL_ABI,\n    functionName: 'nextIndex',\n  }) as number;\n\n  if (nextIndex === 0) {\n    return [];\n  }\n\n  const BATCH_SIZE = 5000;\n  const commitments: string[] = [];\n  const totalBatches = Math.ceil(nextIndex / BATCH_SIZE);\n\n  for (let start = 0; start < nextIndex; start += BATCH_SIZE) {\n    const end = Math.min(start + BATCH_SIZE, nextIndex);\n    const batchNum = Math.floor(start / BATCH_SIZE) + 1;\n    onProgress?.('Fetching commitments', `batch ${batchNum}/${totalBatches}`);\n\n    const batch = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getCommitments',\n      args: [BigInt(start), BigInt(end)],\n    }) as `0x${string}`[];\n\n    commitments.push(...batch.map(c => c.toString()));\n  }\n\n  return commitments;\n}\n\n/**\n * Build a transfer proof\n * \n * This function:\n * 1. Verifies the recipient is registered\n * 2. Fetches the sender's unspent UTXOs\n * 3. Selects UTXOs to cover the transfer amount\n * 4. Creates output UTXOs for recipient and change\n * 5. Builds the ZK proof\n * \n * @param options - Transfer options\n * @returns Proof data ready for relay submission\n * \n * @example\n * ```typescript\n * const senderKeypair = new Keypair(process.env.VEIL_KEY);\n * const proof = await buildTransferProof({\n *   amount: '0.1',\n *   recipientAddress: '0x1234...',\n *   senderKeypair,\n * });\n * ```\n */\nexport async function buildTransferProof(\n  options: BuildTransferProofOptions\n): Promise<ProofBuildResult> {\n  const {\n    amount,\n    recipientAddress,\n    senderKeypair,\n    pool = 'eth',\n    rpcUrl,\n    provingKeyPath,\n    onProgress,\n  } = options;\n\n  const poolConfig = POOL_CONFIG[pool];\n  const poolAddress = getPoolAddress(pool);\n\n  // 1. Check recipient is registered and get their deposit key\n  onProgress?.('Checking recipient registration...');\n  const { isRegistered, depositKey } = await checkRecipientRegistration(\n    recipientAddress,\n    rpcUrl\n  );\n\n  if (!isRegistered || !depositKey) {\n    throw new Error(`Recipient ${recipientAddress} is not registered. They need to register first.`);\n  }\n\n  // 2. Get sender's unspent UTXOs\n  onProgress?.('Fetching your UTXOs...');\n  const balanceResult = await getPrivateBalance({\n    keypair: senderKeypair,\n    pool,\n    rpcUrl,\n    onProgress,\n  });\n\n  const unspentUtxoInfos = balanceResult.utxos.filter(u => !u.isSpent);\n  if (unspentUtxoInfos.length === 0) {\n    throw new Error('No unspent UTXOs available for transfer');\n  }\n\n  // Re-decrypt UTXOs to get full Utxo objects\n  onProgress?.('Preparing UTXOs...');\n  \n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  const utxos: Utxo[] = [];\n  for (const utxoInfo of unspentUtxoInfos) {\n    const encryptedOutputs = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getEncryptedOutputs',\n      args: [BigInt(utxoInfo.index), BigInt(utxoInfo.index + 1)],\n    }) as string[];\n\n    if (encryptedOutputs.length > 0) {\n      try {\n        const utxo = Utxo.decrypt(encryptedOutputs[0], senderKeypair);\n        utxo.index = utxoInfo.index;\n        utxos.push(utxo);\n      } catch {\n        // Skip if decryption fails\n      }\n    }\n  }\n\n  if (utxos.length === 0) {\n    throw new Error('Failed to decrypt UTXOs');\n  }\n\n  // 3. Select UTXOs for transfer\n  onProgress?.('Selecting UTXOs...');\n  const { selectedUtxos, changeAmount } = selectUtxosForWithdraw(\n    utxos,\n    amount,\n    poolConfig.decimals\n  );\n\n  // 4. Create output UTXOs\n  const outputs: Utxo[] = [];\n  const transferWei = parseUnits(amount, poolConfig.decimals);\n\n  // Create recipient UTXO using their deposit key\n  const recipientKeypair = Keypair.fromString(depositKey);\n  const recipientUtxo = new Utxo({\n    amount: transferWei,\n    keypair: recipientKeypair,\n  });\n  outputs.push(recipientUtxo);\n\n  // Create change UTXO for sender if needed\n  if (changeAmount > 0n) {\n    const changeUtxo = new Utxo({\n      amount: changeAmount,\n      keypair: senderKeypair,\n    });\n    outputs.push(changeUtxo);\n  }\n\n  // 5. Fetch all commitments from pool\n  const commitments = await fetchCommitments(rpcUrl, poolAddress, onProgress);\n\n  // 6. Build the ZK proof\n  // For transfers, recipient field is 0x0 (no external withdrawal)\n  onProgress?.('Building ZK proof...');\n  const result = await prepareTransaction({\n    commitments,\n    inputs: selectedUtxos,\n    outputs,\n    fee: 0,\n    recipient: '0x0000000000000000000000000000000000000000',\n    relayer: '0x0000000000000000000000000000000000000000',\n    onProgress,\n    provingKeyPath,\n  });\n\n  return {\n    proofArgs: {\n      proof: result.args.proof,\n      root: result.args.root,\n      inputNullifiers: result.args.inputNullifiers,\n      outputCommitments: result.args.outputCommitments as [string, string],\n      publicAmount: result.args.publicAmount,\n      extDataHash: result.args.extDataHash,\n    },\n    extData: result.extData,\n    inputCount: selectedUtxos.length,\n    outputCount: outputs.length,\n    amount,\n  };\n}\n\n/**\n * Execute a transfer by building proof and submitting to relay\n * \n * @param options - Transfer options\n * @returns Transfer result with transaction hash\n * \n * @example\n * ```typescript\n * const senderKeypair = new Keypair(process.env.VEIL_KEY);\n * const result = await transfer({\n *   amount: '0.1',\n *   recipientAddress: '0x1234...',\n *   senderKeypair,\n * });\n * \n * console.log(`Transfer tx: ${result.transactionHash}`);\n * ```\n */\nexport async function transfer(\n  options: BuildTransferProofOptions\n): Promise<TransferResult> {\n  const { amount, recipientAddress, pool = 'eth', onProgress } = options;\n\n  // Build the proof\n  const proof = await buildTransferProof(options);\n\n  // Submit to relay\n  onProgress?.('Submitting to relay...');\n  const relayResult = await submitRelay({\n    type: 'transfer',\n    pool,\n    proofArgs: proof.proofArgs,\n    extData: proof.extData,\n    metadata: {\n      amount,\n      recipient: recipientAddress,\n      inputUtxoCount: proof.inputCount,\n      outputUtxoCount: proof.outputCount,\n    },\n  });\n\n  return {\n    success: relayResult.success,\n    transactionHash: relayResult.transactionHash,\n    blockNumber: relayResult.blockNumber,\n    amount,\n    recipient: recipientAddress,\n  };\n}\n\n/**\n * Merge UTXOs by doing a self-transfer\n * This consolidates multiple small UTXOs into fewer larger ones\n * \n * Unlike regular transfers, merge doesn't need a recipient address - \n * it uses the sender's keypair directly to create the output UTXO.\n * \n * @param options - Merge options\n * @returns Transfer result\n * \n * @example\n * ```typescript\n * const keypair = new Keypair(process.env.VEIL_KEY);\n * const result = await mergeUtxos({\n *   amount: '0.5', // Total amount to consolidate\n *   keypair,\n * });\n * ```\n */\nexport async function mergeUtxos(options: {\n  amount: string;\n  keypair: Keypair;\n  pool?: RelayPool;\n  rpcUrl?: string;\n  provingKeyPath?: import('./prover.js').ProvingKeyPath;\n  onProgress?: (stage: string, detail?: string) => void;\n}): Promise<TransferResult> {\n  const { amount, keypair, pool = 'eth', rpcUrl, provingKeyPath, onProgress } = options;\n\n  const poolConfig = POOL_CONFIG[pool];\n  const poolAddress = getPoolAddress(pool);\n\n  // 1. Get sender's unspent UTXOs\n  onProgress?.('Fetching your UTXOs...');\n  const balanceResult = await getPrivateBalance({\n    keypair,\n    pool,\n    rpcUrl,\n    onProgress,\n  });\n\n  const unspentUtxoInfos = balanceResult.utxos.filter(u => !u.isSpent);\n  if (unspentUtxoInfos.length === 0) {\n    throw new Error('No unspent UTXOs available for merge');\n  }\n\n  // Re-decrypt UTXOs to get full Utxo objects\n  onProgress?.('Preparing UTXOs...');\n  \n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  const utxos: Utxo[] = [];\n  for (const utxoInfo of unspentUtxoInfos) {\n    const encryptedOutputs = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getEncryptedOutputs',\n      args: [BigInt(utxoInfo.index), BigInt(utxoInfo.index + 1)],\n    }) as string[];\n\n    if (encryptedOutputs.length > 0) {\n      try {\n        const utxo = Utxo.decrypt(encryptedOutputs[0], keypair);\n        utxo.index = utxoInfo.index;\n        utxos.push(utxo);\n      } catch {\n        // Skip if decryption fails\n      }\n    }\n  }\n\n  if (utxos.length === 0) {\n    throw new Error('Failed to decrypt UTXOs');\n  }\n\n  // 2. Select UTXOs for merge\n  onProgress?.('Selecting UTXOs...');\n  const { selectedUtxos, changeAmount } = selectUtxosForWithdraw(\n    utxos,\n    amount,\n    poolConfig.decimals\n  );\n\n  // 3. Create output UTXO - use sender's keypair directly (self-transfer)\n  const outputs: Utxo[] = [];\n  const mergeWei = parseUnits(amount, poolConfig.decimals);\n\n  // Create merged UTXO using own keypair\n  const mergedUtxo = new Utxo({\n    amount: mergeWei,\n    keypair: keypair,\n  });\n  outputs.push(mergedUtxo);\n\n  // Create change UTXO if needed\n  if (changeAmount > 0n) {\n    const changeUtxo = new Utxo({\n      amount: changeAmount,\n      keypair: keypair,\n    });\n    outputs.push(changeUtxo);\n  }\n\n  // 4. Fetch all commitments from pool\n  const commitments = await fetchCommitments(rpcUrl, poolAddress, onProgress);\n\n  // 5. Build the ZK proof (recipient = 0x0 for self-transfer)\n  onProgress?.('Building ZK proof...');\n  const result = await prepareTransaction({\n    commitments,\n    inputs: selectedUtxos,\n    outputs,\n    fee: 0,\n    recipient: '0x0000000000000000000000000000000000000000',\n    relayer: '0x0000000000000000000000000000000000000000',\n    onProgress,\n    provingKeyPath,\n  });\n\n  // 6. Submit to relay\n  onProgress?.('Submitting to relay...');\n  const relayResult = await submitRelay({\n    type: 'transfer',\n    pool,\n    proofArgs: {\n      proof: result.args.proof,\n      root: result.args.root,\n      inputNullifiers: result.args.inputNullifiers,\n      outputCommitments: result.args.outputCommitments as [string, string],\n      publicAmount: result.args.publicAmount,\n      extDataHash: result.args.extDataHash,\n    },\n    extData: result.extData,\n    metadata: {\n      amount,\n      inputUtxoCount: selectedUtxos.length,\n      outputUtxoCount: outputs.length,\n    },\n  });\n\n  return {\n    success: relayResult.success,\n    transactionHash: relayResult.transactionHash,\n    blockNumber: relayResult.blockNumber,\n    amount,\n    recipient: 'self',\n  };\n}\n","import {\n  createPublicClient,\n  encodeFunctionData,\n  encodePacked,\n  formatEther,\n  formatUnits,\n  http,\n  isAddress,\n  keccak256,\n  parseEther,\n  parseUnits,\n} from 'viem';\nimport { privateKeyToAccount, privateKeyToAddress } from 'viem/accounts';\nimport { base } from 'viem/chains';\nimport { FORWARDER_ABI, FORWARDER_FACTORY_ABI, ERC20_ABI, POOL_ABI } from './abi.js';\nimport { FORWARDER_CONTRACT_VERSION, getAddresses, getForwarderFactoryAddress, getPoolAddress, POOL_CONFIG } from './addresses.js';\nimport { getPrivateBalance, getQueueBalance } from './balance.js';\nimport { Keypair } from './keypair.js';\nimport { postRelayJson, submitRelay } from './relay.js';\nimport { prepareTransaction } from './transaction.js';\nimport { Utxo } from './utxo.js';\nimport { selectUtxosForWithdraw } from './withdraw.js';\nimport type {\n  SubaccountAsset,\n  SubaccountDeployRequest,\n  SubaccountMergeOptions,\n  SubaccountMergeResult,\n  PrivateBalanceResult,\n  SubaccountPrivateBalanceStatus,\n  SubaccountQueueStatus,\n  SubaccountRecoveryResult,\n  SubaccountRelayResult,\n  SubaccountSlot,\n  SubaccountStatusResult,\n  SubaccountSweepRequest,\n  SubaccountWithdrawTypedData,\n} from './types.js';\n\nconst SUBACCOUNT_CHILD_DOMAIN = 'veil-sua-child';\nconst SUBACCOUNT_SALT_DOMAIN = 'veil-sua-salt';\nconst ETH_ADDRESS = '0x0000000000000000000000000000000000000000' as const;\nconst DEFAULT_WITHDRAW_DEADLINE_SECONDS = 3600n;\nconst DEFAULT_MAX_NONCE_SCAN = 100n;\nexport const MAX_SUBACCOUNT_SLOTS = 3;\n\nfunction createBaseClient(rpcUrl?: string) {\n  return createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n}\n\nfunction assertPrivateKey(value: string, label: string): asserts value is `0x${string}` {\n  if (!/^0x[a-fA-F0-9]{64}$/.test(value)) {\n    throw new Error(`${label} must be a 0x-prefixed 32-byte hex string`);\n  }\n}\n\nfunction normalizeSlot(slot: number): number {\n  if (!Number.isInteger(slot) || slot < 0) {\n    throw new Error('slot must be a non-negative integer');\n  }\n  if (slot >= MAX_SUBACCOUNT_SLOTS) {\n    throw new Error(`slot must be less than ${MAX_SUBACCOUNT_SLOTS} (supported slots: 0-${MAX_SUBACCOUNT_SLOTS - 1})`);\n  }\n  return slot;\n}\n\nfunction normalizeAsset(asset: string): SubaccountAsset {\n  if (asset !== 'eth' && asset !== 'usdc') {\n    throw new Error('asset must be \"eth\" or \"usdc\"');\n  }\n  return asset;\n}\n\nfunction normalizeNonce(value: bigint | number): bigint {\n  const nonce = typeof value === 'bigint' ? value : BigInt(value);\n  if (nonce < 0n) {\n    throw new Error('nonce must be non-negative');\n  }\n  return nonce;\n}\n\nfunction normalizeDeadline(deadline?: bigint | number): bigint {\n  const nextDeadline =\n    deadline === undefined\n      ? BigInt(Math.floor(Date.now() / 1000)) + DEFAULT_WITHDRAW_DEADLINE_SECONDS\n      : typeof deadline === 'bigint'\n        ? deadline\n        : BigInt(deadline);\n\n  if (nextDeadline <= 0n) {\n    throw new Error('deadline must be greater than 0');\n  }\n\n  return nextDeadline;\n}\n\nexport function deriveSubaccountChildPrivateKey(\n  rootPrivateKey: string,\n  slot: number,\n): `0x${string}` {\n  assertPrivateKey(rootPrivateKey, 'rootPrivateKey');\n  const normalizedSlot = normalizeSlot(slot);\n  return keccak256(\n    encodePacked(\n      ['bytes32', 'string', 'uint256'],\n      [rootPrivateKey, SUBACCOUNT_CHILD_DOMAIN, BigInt(normalizedSlot)],\n    ),\n  );\n}\n\nexport function deriveSubaccountSalt(\n  rootPrivateKey: string,\n  slot: number,\n): `0x${string}` {\n  assertPrivateKey(rootPrivateKey, 'rootPrivateKey');\n  const normalizedSlot = normalizeSlot(slot);\n  return keccak256(\n    encodePacked(\n      ['bytes32', 'string', 'uint256'],\n      [rootPrivateKey, SUBACCOUNT_SALT_DOMAIN, BigInt(normalizedSlot)],\n    ),\n  );\n}\n\nexport function deriveSubaccountChildOwner(childPrivateKey: string): `0x${string}` {\n  assertPrivateKey(childPrivateKey, 'childPrivateKey');\n  return privateKeyToAddress(childPrivateKey);\n}\n\nexport function deriveSubaccountChildDepositKey(childPrivateKey: string): string {\n  assertPrivateKey(childPrivateKey, 'childPrivateKey');\n  return new Keypair(childPrivateKey).depositKey();\n}\n\nexport async function predictSubaccountForwarder(options: {\n  salt: `0x${string}`;\n  childDepositKey: string;\n  childOwner: `0x${string}`;\n  rpcUrl?: string;\n}): Promise<`0x${string}`> {\n  const publicClient = createBaseClient(options.rpcUrl);\n  const depositKeyBytes = options.childDepositKey.startsWith('0x')\n    ? options.childDepositKey\n    : `0x${options.childDepositKey}`;\n  return publicClient.readContract({\n    abi: FORWARDER_FACTORY_ABI,\n    address: getForwarderFactoryAddress(),\n    functionName: 'computeAddress',\n    args: [options.salt, depositKeyBytes as `0x${string}`, options.childOwner],\n  }) as Promise<`0x${string}`>;\n}\n\nexport async function deriveSubaccountSlot(options: {\n  rootPrivateKey: `0x${string}`;\n  slot: number;\n  rpcUrl?: string;\n}): Promise<SubaccountSlot> {\n  const normalizedSlot = normalizeSlot(options.slot);\n  const childPrivateKey = deriveSubaccountChildPrivateKey(options.rootPrivateKey, normalizedSlot);\n  const salt = deriveSubaccountSalt(options.rootPrivateKey, normalizedSlot);\n  const childOwner = deriveSubaccountChildOwner(childPrivateKey);\n  const childDepositKey = deriveSubaccountChildDepositKey(childPrivateKey);\n  const forwarderAddress = await predictSubaccountForwarder({\n    salt,\n    childDepositKey,\n    childOwner,\n    rpcUrl: options.rpcUrl,\n  });\n\n  return {\n    slot: normalizedSlot,\n    childOwner,\n    childDepositKey,\n    salt,\n    forwarderAddress,\n  };\n}\n\nexport async function isSubaccountForwarderDeployed(options: {\n  forwarderAddress: `0x${string}`;\n  rpcUrl?: string;\n}): Promise<boolean> {\n  if (!isAddress(options.forwarderAddress)) {\n    throw new Error('forwarderAddress must be a valid Ethereum address');\n  }\n\n  const publicClient = createBaseClient(options.rpcUrl);\n  const code = await publicClient.getCode({ address: options.forwarderAddress });\n  return !!code && code !== '0x';\n}\n\nexport async function deploySubaccountForwarder(\n  options: SubaccountDeployRequest,\n): Promise<SubaccountRelayResult & { slot: SubaccountSlot }> {\n  const slot = await deriveSubaccountSlot({\n    rootPrivateKey: options.rootPrivateKey,\n    slot: options.slot,\n    rpcUrl: options.rpcUrl,\n  });\n\n  const result = await postRelayJson<SubaccountRelayResult>(\n    '/stealth/deploy',\n    {\n      salt: slot.salt,\n      childDepositKey: slot.childDepositKey,\n      childOwner: slot.childOwner,\n      expectedForwarder: slot.forwarderAddress,\n    },\n    options.relayUrl,\n  );\n\n  return { ...result, slot };\n}\n\nexport async function sweepSubaccountForwarder(\n  options: SubaccountSweepRequest,\n): Promise<SubaccountRelayResult> {\n  const asset = normalizeAsset(options.asset);\n  if (!isAddress(options.forwarderAddress)) {\n    throw new Error('forwarderAddress must be a valid Ethereum address');\n  }\n\n  return postRelayJson<SubaccountRelayResult>(\n    '/stealth/sweep',\n    {\n      forwarder: options.forwarderAddress,\n      asset,\n    },\n    options.relayUrl,\n  );\n}\n\nfunction toQueueStatus(\n  asset: SubaccountAsset,\n  result: Awaited<ReturnType<typeof getQueueBalance>>,\n): SubaccountQueueStatus {\n  return {\n    asset,\n    queueBalance: result.queueBalance,\n    queueBalanceWei: result.queueBalanceWei,\n    pendingCount: result.pendingCount,\n    pendingDeposits: result.pendingDeposits,\n  };\n}\n\nfunction toPrivateBalanceStatus(result: PrivateBalanceResult): SubaccountPrivateBalanceStatus {\n  return {\n    privateBalance: result.privateBalance,\n    privateBalanceWei: result.privateBalanceWei,\n    utxoCount: result.utxoCount,\n    spentCount: result.spentCount,\n    unspentCount: result.unspentCount,\n  };\n}\n\nexport async function getSubaccountPrivateBalance(options: {\n  rootPrivateKey: `0x${string}`;\n  slot: number;\n  pool?: 'eth' | 'usdc';\n  rpcUrl?: string;\n  onProgress?: (stage: string, detail?: string) => void;\n}): Promise<PrivateBalanceResult> {\n  const normalizedSlot = normalizeSlot(options.slot);\n  assertPrivateKey(options.rootPrivateKey, 'rootPrivateKey');\n\n  const childPrivateKey = deriveSubaccountChildPrivateKey(options.rootPrivateKey, normalizedSlot);\n  const childKeypair = new Keypair(childPrivateKey);\n\n  return getPrivateBalance({\n    keypair: childKeypair,\n    pool: options.pool,\n    rpcUrl: options.rpcUrl,\n    onProgress: options.onProgress,\n  });\n}\n\nexport async function getSubaccountStatus(options: {\n  rootPrivateKey: `0x${string}`;\n  slot: number;\n  rpcUrl?: string;\n}): Promise<SubaccountStatusResult> {\n  const slot = await deriveSubaccountSlot(options);\n  const publicClient = createBaseClient(options.rpcUrl);\n  const addresses = getAddresses();\n\n  const [deployed, ethWei, usdcWei, ethQueue, usdcQueue, ethPrivate, usdcPrivate] = await Promise.all([\n    isSubaccountForwarderDeployed({\n      forwarderAddress: slot.forwarderAddress,\n      rpcUrl: options.rpcUrl,\n    }),\n    publicClient.getBalance({ address: slot.forwarderAddress }),\n    publicClient.readContract({\n      address: addresses.usdcToken,\n      abi: ERC20_ABI,\n      functionName: 'balanceOf',\n      args: [slot.forwarderAddress],\n    }) as Promise<bigint>,\n    getQueueBalance({\n      address: slot.forwarderAddress,\n      pool: 'eth',\n      rpcUrl: options.rpcUrl,\n    }),\n    getQueueBalance({\n      address: slot.forwarderAddress,\n      pool: 'usdc',\n      rpcUrl: options.rpcUrl,\n    }),\n    getSubaccountPrivateBalance({\n      rootPrivateKey: options.rootPrivateKey,\n      slot: options.slot,\n      pool: 'eth',\n      rpcUrl: options.rpcUrl,\n    }),\n    getSubaccountPrivateBalance({\n      rootPrivateKey: options.rootPrivateKey,\n      slot: options.slot,\n      pool: 'usdc',\n      rpcUrl: options.rpcUrl,\n    }),\n  ]);\n\n  return {\n    slot,\n    deployed,\n    balances: {\n      eth: {\n        balance: formatEther(ethWei),\n        balanceWei: ethWei.toString(),\n      },\n      usdc: {\n        balance: formatUnits(usdcWei, 6),\n        balanceWei: usdcWei.toString(),\n      },\n    },\n    privateBalances: {\n      eth: toPrivateBalanceStatus(ethPrivate),\n      usdc: toPrivateBalanceStatus(usdcPrivate),\n    },\n    queues: {\n      eth: toQueueStatus('eth', ethQueue),\n      usdc: toQueueStatus('usdc', usdcQueue),\n    },\n  };\n}\n\nconst WITHDRAW_TYPES: SubaccountWithdrawTypedData['types'] = {\n  Withdraw: [\n    { name: 'token', type: 'address' },\n    { name: 'to', type: 'address' },\n    { name: 'amount', type: 'uint256' },\n    { name: 'nonce', type: 'uint256' },\n    { name: 'deadline', type: 'uint256' },\n  ],\n};\n\nexport function buildSubaccountWithdrawTypedData(options: {\n  forwarderAddress: `0x${string}`;\n  token: `0x${string}`;\n  to: `0x${string}`;\n  amount: bigint;\n  nonce: bigint;\n  deadline: bigint;\n}): SubaccountWithdrawTypedData {\n  if (!isAddress(options.forwarderAddress)) {\n    throw new Error('forwarderAddress must be a valid Ethereum address');\n  }\n  if (!isAddress(options.token)) {\n    throw new Error('token must be a valid Ethereum address');\n  }\n  if (!isAddress(options.to)) {\n    throw new Error('to must be a valid Ethereum address');\n  }\n\n  return {\n    domain: {\n      name: 'VeilForwarder',\n      version: FORWARDER_CONTRACT_VERSION,\n      chainId: getAddresses().chainId,\n      verifyingContract: options.forwarderAddress,\n    },\n    types: WITHDRAW_TYPES,\n    primaryType: 'Withdraw',\n    message: {\n      token: options.token,\n      to: options.to,\n      amount: options.amount,\n      nonce: options.nonce,\n      deadline: options.deadline,\n    },\n  };\n}\n\nexport async function signSubaccountWithdraw(options: {\n  childPrivateKey: `0x${string}`;\n  typedData: SubaccountWithdrawTypedData;\n}): Promise<`0x${string}`> {\n  assertPrivateKey(options.childPrivateKey, 'childPrivateKey');\n  const account = privateKeyToAccount(options.childPrivateKey);\n  return account.signTypedData({\n    domain: options.typedData.domain,\n    types: options.typedData.types,\n    primaryType: options.typedData.primaryType,\n    message: options.typedData.message,\n  });\n}\n\nexport async function isSubaccountWithdrawNonceUsed(options: {\n  forwarderAddress: `0x${string}`;\n  nonce: bigint | number;\n  rpcUrl?: string;\n}): Promise<boolean> {\n  if (!isAddress(options.forwarderAddress)) {\n    throw new Error('forwarderAddress must be a valid Ethereum address');\n  }\n\n  const publicClient = createBaseClient(options.rpcUrl);\n  try {\n    return await publicClient.readContract({\n      abi: FORWARDER_ABI,\n      address: options.forwarderAddress,\n      functionName: 'usedNonces',\n      args: [normalizeNonce(options.nonce)],\n    }) as boolean;\n  } catch (error) {\n    if (String(error).includes('returned no data')) {\n      throw new Error('Subaccount forwarder is not deployed');\n    }\n    throw error;\n  }\n}\n\nexport async function findNextSubaccountWithdrawNonce(options: {\n  forwarderAddress: `0x${string}`;\n  startNonce?: bigint | number;\n  maxScan?: bigint | number;\n  rpcUrl?: string;\n}): Promise<bigint> {\n  const startNonce = normalizeNonce(options.startNonce ?? 0n);\n  const maxScan = normalizeNonce(options.maxScan ?? DEFAULT_MAX_NONCE_SCAN);\n  const limit = startNonce + maxScan;\n  let nonce = startNonce;\n\n  while (\n    await isSubaccountWithdrawNonceUsed({\n      forwarderAddress: options.forwarderAddress,\n      nonce,\n      rpcUrl: options.rpcUrl,\n    })\n  ) {\n    nonce += 1n;\n    if (nonce > limit) {\n      throw new Error('Unable to find an unused withdraw nonce within the scan limit');\n    }\n  }\n\n  return nonce;\n}\n\nexport async function buildSubaccountRecoveryTx(options: {\n  rootPrivateKey: `0x${string}`;\n  slot: number;\n  asset: SubaccountAsset;\n  to: `0x${string}`;\n  amount: string;\n  nonce?: bigint | number;\n  deadline?: bigint | number;\n  rpcUrl?: string;\n}): Promise<SubaccountRecoveryResult> {\n  if (!isAddress(options.to)) {\n    throw new Error('to must be a valid Ethereum address');\n  }\n\n  const asset = normalizeAsset(options.asset);\n  const slot = await deriveSubaccountSlot({\n    rootPrivateKey: options.rootPrivateKey,\n    slot: options.slot,\n    rpcUrl: options.rpcUrl,\n  });\n  const deployed = await isSubaccountForwarderDeployed({\n    forwarderAddress: slot.forwarderAddress,\n    rpcUrl: options.rpcUrl,\n  });\n  if (!deployed) {\n    throw new Error('Subaccount forwarder is not deployed');\n  }\n  const childPrivateKey = deriveSubaccountChildPrivateKey(options.rootPrivateKey, options.slot);\n  const tokenAddress =\n    asset === 'eth' ? ETH_ADDRESS : getAddresses().usdcToken;\n  const amountWei =\n    asset === 'eth'\n      ? parseEther(options.amount)\n      : parseUnits(options.amount, 6);\n  const nonce =\n    options.nonce === undefined\n      ? await findNextSubaccountWithdrawNonce({\n          forwarderAddress: slot.forwarderAddress,\n          rpcUrl: options.rpcUrl,\n        })\n      : normalizeNonce(options.nonce);\n  const deadline = normalizeDeadline(options.deadline);\n  const typedData = buildSubaccountWithdrawTypedData({\n    forwarderAddress: slot.forwarderAddress,\n    token: tokenAddress,\n    to: options.to,\n    amount: amountWei,\n    nonce,\n    deadline,\n  });\n  const signature = await signSubaccountWithdraw({\n    childPrivateKey,\n    typedData,\n  });\n\n  return {\n    transaction: {\n      to: slot.forwarderAddress,\n      data: encodeFunctionData({\n        abi: FORWARDER_ABI,\n        functionName: 'withdraw',\n        args: [tokenAddress, options.to, amountWei, nonce, deadline, signature],\n      }),\n    },\n    forwarderAddress: slot.forwarderAddress,\n    asset,\n    amount: options.amount,\n    amountWei: amountWei.toString(),\n    nonce: nonce.toString(),\n    deadline: deadline.toString(),\n    recipient: options.to,\n    tokenAddress,\n    signature,\n  };\n}\n\n/**\n * Merge a subaccount's entire private balance back to the main wallet.\n *\n * Builds a ZK transfer proof that moves every unspent UTXO belonging to the\n * child keypair into a new UTXO encrypted to the parent (root) keypair,\n * then submits it via the relay.\n *\n * @param options - Merge options\n * @returns Merge result with transaction hash and amount\n *\n * @example\n * ```typescript\n * const result = await mergeSubaccount({\n *   rootPrivateKey: process.env.VEIL_KEY as `0x${string}`,\n *   slot: 0,\n *   pool: 'eth',\n * });\n * console.log(`Merged ${result.amount} — tx: ${result.transactionHash}`);\n * ```\n */\nexport async function mergeSubaccount(\n  options: SubaccountMergeOptions,\n): Promise<SubaccountMergeResult> {\n  const {\n    rootPrivateKey,\n    slot,\n    pool = 'eth',\n    rpcUrl,\n    relayUrl,\n    provingKeyPath,\n    onProgress,\n  } = options;\n\n  const normalizedSlot = normalizeSlot(slot);\n  assertPrivateKey(rootPrivateKey, 'rootPrivateKey');\n\n  const poolConfig = POOL_CONFIG[pool];\n  const poolAddress = getPoolAddress(pool);\n\n  // Derive child and parent keypairs\n  const childPrivateKey = deriveSubaccountChildPrivateKey(rootPrivateKey, normalizedSlot);\n  const childKeypair = new Keypair(childPrivateKey);\n  const parentKeypair = new Keypair(rootPrivateKey);\n\n  // Fetch child's private balance\n  onProgress?.('Fetching subaccount balance...');\n  const balanceResult = await getPrivateBalance({\n    keypair: childKeypair,\n    pool,\n    rpcUrl,\n    onProgress,\n  });\n\n  const unspentUtxoInfos = balanceResult.utxos.filter(u => !u.isSpent);\n  if (unspentUtxoInfos.length === 0) {\n    throw new Error('Subaccount has no unspent UTXOs to merge');\n  }\n  if (unspentUtxoInfos.length > 16) {\n    throw new Error(\n      `Subaccount has ${unspentUtxoInfos.length} unspent UTXOs which exceeds the 16-input circuit limit. ` +\n      'Consolidate UTXOs on the subaccount first before merging.',\n    );\n  }\n\n  // Re-decrypt UTXOs to get full Utxo objects\n  onProgress?.('Preparing UTXOs...');\n  const publicClient = createPublicClient({\n    chain: base,\n    transport: http(rpcUrl),\n  });\n\n  const utxos: Utxo[] = [];\n  for (const utxoInfo of unspentUtxoInfos) {\n    const encryptedOutputs = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getEncryptedOutputs',\n      args: [BigInt(utxoInfo.index), BigInt(utxoInfo.index + 1)],\n    }) as string[];\n\n    if (encryptedOutputs.length > 0) {\n      try {\n        const utxo = Utxo.decrypt(encryptedOutputs[0], childKeypair);\n        utxo.index = utxoInfo.index;\n        utxos.push(utxo);\n      } catch {\n        // Skip if decryption fails\n      }\n    }\n  }\n\n  if (utxos.length === 0) {\n    throw new Error('Failed to decrypt subaccount UTXOs');\n  }\n\n  // Select all UTXOs — transfer the full balance\n  onProgress?.('Selecting UTXOs...');\n  const amount = balanceResult.privateBalance;\n  const { selectedUtxos, changeAmount } = selectUtxosForWithdraw(\n    utxos,\n    amount,\n    poolConfig.decimals,\n  );\n\n  // Create output UTXO encrypted to the parent keypair\n  const outputs: Utxo[] = [];\n  const mergeWei = parseUnits(amount, poolConfig.decimals);\n\n  outputs.push(new Utxo({ amount: mergeWei, keypair: parentKeypair }));\n\n  if (changeAmount > 0n) {\n    outputs.push(new Utxo({ amount: changeAmount, keypair: parentKeypair }));\n  }\n\n  // Fetch all commitments from pool\n  onProgress?.('Fetching commitments...');\n  const nextIndex = await publicClient.readContract({\n    address: poolAddress,\n    abi: POOL_ABI,\n    functionName: 'nextIndex',\n  }) as number;\n\n  const BATCH_SIZE = 5000;\n  const commitments: string[] = [];\n  const totalBatches = Math.ceil(nextIndex / BATCH_SIZE);\n\n  for (let start = 0; start < nextIndex; start += BATCH_SIZE) {\n    const end = Math.min(start + BATCH_SIZE, nextIndex);\n    const batchNum = Math.floor(start / BATCH_SIZE) + 1;\n    onProgress?.('Fetching commitments', `batch ${batchNum}/${totalBatches}`);\n\n    const batch = await publicClient.readContract({\n      address: poolAddress,\n      abi: POOL_ABI,\n      functionName: 'getCommitments',\n      args: [BigInt(start), BigInt(end)],\n    }) as `0x${string}`[];\n\n    commitments.push(...batch.map(c => c.toString()));\n  }\n\n  // Build ZK proof (recipient = 0x0 for in-pool transfer)\n  onProgress?.('Building ZK proof...');\n  const result = await prepareTransaction({\n    commitments,\n    inputs: selectedUtxos,\n    outputs,\n    fee: 0,\n    recipient: '0x0000000000000000000000000000000000000000',\n    relayer: '0x0000000000000000000000000000000000000000',\n    onProgress,\n    provingKeyPath,\n  });\n\n  // Submit to relay\n  onProgress?.('Submitting to relay...');\n  const relayResult = await submitRelay({\n    type: 'transfer',\n    pool,\n    relayUrl,\n    proofArgs: {\n      proof: result.args.proof,\n      root: result.args.root,\n      inputNullifiers: result.args.inputNullifiers,\n      outputCommitments: result.args.outputCommitments as [string, string],\n      publicAmount: result.args.publicAmount,\n      extDataHash: result.args.extDataHash,\n    },\n    extData: result.extData,\n    metadata: {\n      amount,\n      recipient: 'self',\n      inputUtxoCount: selectedUtxos.length,\n      outputUtxoCount: outputs.length,\n    },\n  });\n\n  return {\n    success: relayResult.success,\n    transactionHash: relayResult.transactionHash,\n    blockNumber: relayResult.blockNumber,\n    amount,\n    slot: normalizedSlot,\n    pool,\n  };\n}\n"]}