@veil-cash/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/transfer.ts"],"names":["crypto","ethers","encodeFunctionData","parseEther","parseUnits","createPublicClient","base","http","formatEther","MerkleTree","path","fileURLToPath","fs","groth16","formatUnits","fetchCommitments"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Crypto utilities for Veil SDK\n * Poseidon hash, hex conversion, and random number generation\n */\n\nimport * as crypto from 'crypto';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst circomlib = require('circomlib');\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 bytes = crypto.randomBytes(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 { ethers } = require('ethers');\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 { poseidonHash, toFixedHex } from './utils.js';\nimport type { EncryptedMessage } from './types.js';\n\n// eth-sig-util for x25519 encryption\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst ethSigUtil = require('eth-sig-util');\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 * 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 { 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 } 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 chainId: 8453,\n relayUrl: 'https://veil-relay.up.railway.app',\n} 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 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 // 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 * 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 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, formatEther } from 'viem';\nimport { base } from 'viem/chains';\nimport { getAddresses } 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} 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 * 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 rpcUrl?: string;\n onProgress?: ProgressCallback;\n}): Promise<QueueBalanceResult> {\n const { address, rpcUrl, onProgress } = options;\n const addresses = getAddresses();\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: addresses.ethQueue,\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: addresses.ethQueue,\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 // Check if this deposit belongs to the user\n if (deposit.fallbackReceiver.toLowerCase() === address.toLowerCase()) {\n totalQueueBalance += deposit.amountIn;\n pendingDeposits.push({\n nonce: nonce.toString(),\n status: DEPOSIT_STATUS_MAP[deposit.status as keyof typeof DEPOSIT_STATUS_MAP] || 'pending',\n amount: formatEther(deposit.amountIn),\n amountWei: deposit.amountIn.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: formatEther(totalQueueBalance),\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 * 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 rpcUrl?: string;\n onProgress?: ProgressCallback;\n}): Promise<PrivateBalanceResult> {\n const { keypair, rpcUrl, onProgress } = options;\n const addresses = getAddresses();\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: addresses.ethPool,\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: addresses.ethPool,\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: addresses.ethPool,\n abi: POOL_ABI,\n functionName: 'isSpent',\n args: [nullifierHex],\n }) as boolean;\n\n utxoInfos.push({\n index,\n amount: formatEther(utxo.amount),\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: formatEther(totalBalance),\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 { toFixedHex } from './utils.js';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { fileURLToPath } from 'url';\n\n// Type definition for ffjavascript utils\ninterface FFJavascriptUtils {\n stringifyBigInts: (obj: unknown) => unknown;\n unstringifyBigInts: (obj: unknown) => unknown;\n}\n\n// Dynamic import for ffjavascript\nlet utils: FFJavascriptUtils | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ffjavascript = require('ffjavascript');\n utils = ffjavascript.utils;\n} catch {\n console.warn('ffjavascript not found. Proof generation may not work.');\n}\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 * Find the keys directory containing circuit files\n * Works in both development and installed package scenarios\n */\nfunction findKeysDirectory(): string {\n // Try multiple possible locations\n const possiblePaths = [\n // When running from package (installed via npm)\n path.resolve(__dirname, '..', 'keys'),\n path.resolve(__dirname, '..', '..', 'keys'),\n // When running from source\n path.resolve(process.cwd(), 'keys'),\n // ESM module path\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 // Not ESM environment, use __dirname\n }\n\n for (const p of possiblePaths) {\n if (fs.existsSync(p) && fs.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\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(input: ProofInput, circuitName: string): Promise<string> {\n if (!utils) {\n throw new Error('ffjavascript is required for proof generation. Please install it: npm install ffjavascript');\n }\n\n const keysDir = findKeysDirectory();\n const wasmPath = path.join(keysDir, `${circuitName}.wasm`);\n const zkeyPath = path.join(keysDir, `${circuitName}.zkey`);\n\n // Verify files exist\n if (!fs.existsSync(wasmPath)) {\n throw new Error(`Circuit WASM file not found: ${wasmPath}`);\n }\n if (!fs.existsSync(zkeyPath)) {\n throw new Error(`Circuit zkey file not found: ${zkeyPath}`);\n }\n\n // Generate proof using snarkjs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await groth16.fullProve(\n utils.stringifyBigInts(input) as any,\n wasmPath,\n zkeyPath,\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 } 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}\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}\n\nasync function getProof({\n inputs,\n outputs,\n tree,\n extAmount,\n fee,\n recipient,\n relayer,\n onProgress,\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);\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}: 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 });\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\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 = `${relayUrl}/relay/${pool}`;\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type,\n proofArgs,\n extData,\n metadata,\n }),\n });\n\n const data = await response.json();\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 RelayResponse;\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 { getAddresses, 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 rpcUrl,\n onProgress,\n } = options;\n\n const addresses = getAddresses();\n const poolConfig = POOL_CONFIG.eth;\n const poolAddress = addresses.ethPool;\n\n // 1. Get user's unspent UTXOs\n onProgress?.('Fetching your UTXOs...');\n const balanceResult = await getPrivateBalance({\n keypair,\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 });\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, onProgress } = 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: 'eth',\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","/**\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, 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} 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 rpcUrl,\n onProgress,\n } = options;\n\n const addresses = getAddresses();\n const poolConfig = POOL_CONFIG.eth;\n const poolAddress = addresses.ethPool;\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 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 });\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, 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: 'eth',\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 rpcUrl?: string;\n onProgress?: (stage: string, detail?: string) => void;\n}): Promise<TransferResult> {\n const { amount, keypair, rpcUrl, onProgress } = options;\n\n const addresses = getAddresses();\n const poolConfig = POOL_CONFIG.eth;\n const poolAddress = addresses.ethPool;\n\n // 1. Get sender's unspent UTXOs\n onProgress?.('Fetching your UTXOs...');\n const balanceResult = await getPrivateBalance({\n keypair,\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 });\n\n // 6. Submit to relay\n onProgress?.('Submitting to relay...');\n const relayResult = await submitRelay({\n type: 'transfer',\n pool: 'eth',\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"]}