{"version":3,"sources":["../src/wormhole.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Wormhole Utilities\n * \n * Functions for fetching VAAs, parsing messages, and interacting with Wormhole\n * \n * This module integrates with the official @wormhole-foundation/sdk patterns for\n * better chain abstraction and reliability, while providing Veridex-specific\n * utilities for payload handling and VAA management.\n */\n\nimport { ethers } from 'ethers';\nimport type { VAA, VAASignature, VeridexPayload } from './types.js';\nimport { WORMHOLE_API } from './constants.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Wormhole Consistency Levels\n * @see https://docs.wormhole.com/wormhole/reference/glossary#consistency-level\n */\nexport const CONSISTENCY_LEVELS = {\n  /** Finalized - Wait for block finality (most secure) */\n  FINALIZED: 200,\n  /** Instant - No wait for finality (fastest, less secure) */\n  INSTANT: 201,\n  /** Safe - Standard finality (deprecated, use FINALIZED) */\n  SAFE: 200,\n} as const;\n\n/**\n * Guardian network configuration\n */\nexport const GUARDIAN_CONFIG = {\n  /** Total number of guardians in mainnet */\n  MAINNET_GUARDIAN_COUNT: 19,\n  /** Required signatures for mainnet quorum (13/19) */\n  MAINNET_QUORUM: 13,\n  /** Total number of guardians in testnet */\n  TESTNET_GUARDIAN_COUNT: 1,\n  /** Required signatures for testnet quorum */\n  TESTNET_QUORUM: 1,\n} as const;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FetchVAAOptions {\n  testnet?: boolean;\n  maxRetries?: number;\n  retryDelayMs?: number;\n  onRetry?: (attempt: number, maxRetries: number) => void;\n}\n\nexport interface WaitForSignaturesOptions {\n  testnet?: boolean;\n  requiredSignatures?: number;\n  maxWaitMs?: number;\n  checkIntervalMs?: number;\n  onProgress?: (currentSignatures: number, required: number) => void;\n}\n\n// ============================================================================\n// VAA Fetching\n// ============================================================================\n\n/**\n * Fetch a VAA from Wormhole guardians by sequence number\n * \n * @example\n * ```ts\n * const vaa = await fetchVAA(\n *   WORMHOLE_CHAIN_IDS.TESTNET.BASE_SEPOLIA,\n *   '0x000...hubAddress',\n *   97n,\n *   { testnet: true }\n * );\n * ```\n */\nexport async function fetchVAA(\n  emitterChain: number,\n  emitterAddress: string,\n  sequence: bigint,\n  options: FetchVAAOptions = {}\n): Promise<string> {\n  const {\n    testnet = true,\n    maxRetries = 30,\n    retryDelayMs = 2000,\n    onRetry,\n  } = options;\n\n  const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n  const normalizedEmitter = normalizeEmitterAddress(emitterAddress);\n  const url = `${apiBase}/api/v1/vaas/${emitterChain}/${normalizedEmitter}/${sequence.toString()}`;\n\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      const response = await fetch(url);\n\n      if (response.ok) {\n        const data = await response.json() as { data?: { vaa?: string } };\n        if (data.data?.vaa) {\n          return data.data.vaa;\n        }\n      }\n\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    } catch {\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    }\n  }\n\n  throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n/**\n * Fetch VAA by transaction hash using operations API\n * This is more reliable than the transactions API when sequence numbers don't match\n */\nexport async function fetchVAAByTxHash(\n  txHash: string,\n  options: {\n    testnet?: boolean;\n    maxRetries?: number;\n    retryDelayMs?: number;\n    onRetry?: (attempt: number, maxRetries: number) => void;\n  } = {}\n): Promise<string> {\n  const {\n    testnet = true,\n    maxRetries = 60,\n    retryDelayMs = 3000,\n    onRetry,\n  } = options;\n\n  const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n  // Remove 0x prefix if present for the API\n  const cleanTxHash = txHash.replace(/^0x/, '');\n  const url = `${apiBase}/api/v1/operations?txHash=${cleanTxHash}`;\n\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      const response = await fetch(url);\n\n      if (response.ok) {\n        const data = await response.json() as { \n          operations?: Array<{ \n            vaa?: { raw?: string }; \n            sequence?: string;\n          }>;\n        };\n        if (data.operations && data.operations.length > 0) {\n          const operation = data.operations[0];\n          if (operation.vaa?.raw) {\n            return operation.vaa.raw;\n          }\n        }\n      }\n\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    } catch {\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    }\n  }\n\n  throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n/**\n * Fetch VAA by transaction hash using transactions API (fallback)\n */\nexport async function fetchVAAByTxHashFallback(\n  txHash: string,\n  options: {\n    testnet?: boolean;\n    maxRetries?: number;\n    retryDelayMs?: number;\n    onRetry?: (attempt: number, maxRetries: number) => void;\n  } = {}\n): Promise<string> {\n  const {\n    testnet = true,\n    maxRetries = 30,\n    retryDelayMs = 2000,\n    onRetry,\n  } = options;\n\n  const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n  const url = `${apiBase}/api/v1/transactions/${txHash}`;\n\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      const response = await fetch(url);\n\n      if (response.ok) {\n        const data = await response.json() as { data?: { globalTx?: { originTx?: { vaaId?: string } } } };\n        if (data.data?.globalTx?.originTx?.vaaId) {\n          const vaaId = data.data.globalTx.originTx.vaaId;\n          const vaaUrl = `${apiBase}/api/v1/vaas/${vaaId}`;\n          const vaaResponse = await fetch(vaaUrl);\n\n          if (vaaResponse.ok) {\n            const vaaData = await vaaResponse.json() as { data?: { vaa?: string } };\n            if (vaaData.data?.vaa) {\n              return vaaData.data.vaa;\n            }\n          }\n        }\n      }\n\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    } catch {\n      if (i < maxRetries - 1) {\n        onRetry?.(i + 1, maxRetries);\n        await sleep(retryDelayMs);\n      }\n    }\n  }\n\n  throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n// ============================================================================\n// VAA Parsing\n// ============================================================================\n\n/**\n * Parse a base64-encoded VAA into its components\n */\nexport function parseVAA(vaaBase64: string): VAA {\n  const vaaBytes = Buffer.from(vaaBase64, 'base64');\n  return parseVAABytes(vaaBytes);\n}\n\n/**\n * Parse raw VAA bytes into its components\n */\nexport function parseVAABytes(vaaBytes: Buffer): VAA {\n  let offset = 0;\n\n  // Version (1 byte)\n  const version = vaaBytes.readUInt8(offset);\n  offset += 1;\n\n  // Guardian set index (4 bytes)\n  const guardianSetIndex = vaaBytes.readUInt32BE(offset);\n  offset += 4;\n\n  // Number of signatures (1 byte)\n  const numSignatures = vaaBytes.readUInt8(offset);\n  offset += 1;\n\n  // Parse signatures (66 bytes each: 1 guardian index + 65 signature)\n  const signatures: VAASignature[] = [];\n  for (let i = 0; i < numSignatures; i++) {\n    const guardianIndex = vaaBytes.readUInt8(offset);\n    offset += 1;\n    const signature = '0x' + vaaBytes.subarray(offset, offset + 65).toString('hex');\n    offset += 65;\n    signatures.push({ guardianIndex, signature });\n  }\n\n  // Mark the start of the body (for hash calculation)\n  const bodyOffset = offset;\n\n  // Timestamp (4 bytes)\n  const timestamp = vaaBytes.readUInt32BE(offset);\n  offset += 4;\n\n  // Nonce (4 bytes)\n  const nonce = vaaBytes.readUInt32BE(offset);\n  offset += 4;\n\n  // Emitter chain (2 bytes)\n  const emitterChain = vaaBytes.readUInt16BE(offset);\n  offset += 2;\n\n  // Emitter address (32 bytes)\n  const emitterAddress = '0x' + vaaBytes.subarray(offset, offset + 32).toString('hex');\n  offset += 32;\n\n  // Sequence (8 bytes)\n  const sequence = vaaBytes.readBigUInt64BE(offset);\n  offset += 8;\n\n  // Consistency level (1 byte)\n  const consistencyLevel = vaaBytes.readUInt8(offset);\n  offset += 1;\n\n  // Payload (remaining bytes)\n  const payload = '0x' + vaaBytes.subarray(offset).toString('hex');\n\n  // Calculate VAA body hash (used for verification on destination chains)\n  const body = vaaBytes.subarray(bodyOffset);\n  const hash = ethers.keccak256(ethers.keccak256(body));\n\n  return {\n    version,\n    guardianSetIndex,\n    signatures,\n    timestamp,\n    nonce,\n    emitterChain,\n    emitterAddress,\n    sequence,\n    consistencyLevel,\n    payload,\n    hash,\n  };\n}\n\n/**\n * Parse a Veridex-specific payload from a VAA\n */\nexport function parseVeridexPayload(payloadHex: string): VeridexPayload {\n  const payload = Buffer.from(payloadHex.replace('0x', ''), 'hex');\n  let offset = 0;\n\n  // Version (1 byte)\n  const version = payload.readUInt8(offset);\n  offset += 1;\n\n  // User key hash (32 bytes)\n  const userKeyHash = '0x' + payload.subarray(offset, offset + 32).toString('hex');\n  offset += 32;\n\n  // Target chain (2 bytes)\n  const targetChain = payload.readUInt16BE(offset);\n  offset += 2;\n\n  // Nonce (32 bytes)\n  const nonce = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n  offset += 32;\n\n  // Public key X (32 bytes)\n  const publicKeyX = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n  offset += 32;\n\n  // Public key Y (32 bytes)\n  const publicKeyY = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n  offset += 32;\n\n  // Action payload (remaining bytes)\n  const actionPayload = '0x' + payload.subarray(offset).toString('hex');\n\n  return {\n    version,\n    userKeyHash,\n    targetChain,\n    nonce,\n    publicKeyX,\n    publicKeyY,\n    actionPayload,\n  };\n}\n\n// ============================================================================\n// VAA Encoding\n// ============================================================================\n\n/**\n * Encode a VAA back to bytes for on-chain submission\n */\nexport function encodeVAAToBytes(vaaBase64: string): string {\n  const vaaBytes = Buffer.from(vaaBase64, 'base64');\n  return '0x' + vaaBytes.toString('hex');\n}\n\n/**\n * Encode VAA to bytes for Solana (returns Uint8Array)\n */\nexport function encodeVAAForSolana(vaaBase64: string): Uint8Array {\n  return new Uint8Array(Buffer.from(vaaBase64, 'base64'));\n}\n\n// ============================================================================\n// Address Utilities\n// ============================================================================\n\n/**\n * Normalize an address to a 32-byte Wormhole emitter address format\n */\nexport function normalizeEmitterAddress(address: string): string {\n  let hex = address.replace('0x', '');\n  while (hex.length < 64) {\n    hex = '0' + hex;\n  }\n  return hex;\n}\n\n/**\n * Convert a 32-byte emitter address back to a 20-byte EVM address\n */\nexport function emitterToEvmAddress(emitterHex: string): string {\n  const hex = emitterHex.replace('0x', '');\n  return '0x' + hex.slice(-40);\n}\n\n// ============================================================================\n// Transaction Utilities\n// ============================================================================\n\n/**\n * Extract the VAA sequence from a transaction receipt\n */\nexport async function getSequenceFromTxReceipt(\n  provider: ethers.Provider,\n  txHash: string,\n  wormholeCoreBridge: string\n): Promise<bigint> {\n  const receipt = await provider.getTransactionReceipt(txHash);\n  if (!receipt) {\n    throw new Error(`Transaction receipt not found: ${txHash}`);\n  }\n\n  const LOG_MESSAGE_PUBLISHED_TOPIC = ethers.id(\n    'LogMessagePublished(address,uint64,uint32,bytes,uint8)'\n  );\n\n  for (const log of receipt.logs) {\n    if (log.address.toLowerCase() === wormholeCoreBridge.toLowerCase()) {\n      if (log.topics[0] === LOG_MESSAGE_PUBLISHED_TOPIC && log.topics[1]) {\n        const sequence = BigInt(log.topics[1]);\n        return sequence;\n      }\n    }\n  }\n\n  throw new Error('LogMessagePublished event not found in transaction');\n}\n\n/**\n * Wait for a Wormhole message to be signed by guardians\n * \n * @example\n * ```ts\n * const vaa = await waitForGuardianSignatures(\n *   WORMHOLE_CHAIN_IDS.TESTNET.BASE_SEPOLIA,\n *   hubEmitter,\n *   97n,\n *   {\n *     testnet: true,\n *     onProgress: (current, required) => console.log(`${current}/${required} signatures`)\n *   }\n * );\n * ```\n */\nexport async function waitForGuardianSignatures(\n  emitterChain: number,\n  emitterAddress: string,\n  sequence: bigint,\n  options: WaitForSignaturesOptions = {}\n): Promise<VAA> {\n  const {\n    testnet = true,\n    requiredSignatures = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM,\n    maxWaitMs = 120000,\n    checkIntervalMs = 5000,\n    onProgress,\n  } = options;\n\n  const startTime = Date.now();\n\n  while (Date.now() - startTime < maxWaitMs) {\n    try {\n      const vaaBase64 = await fetchVAA(emitterChain, emitterAddress, sequence, {\n        testnet,\n        maxRetries: 1,\n        retryDelayMs: 0,\n      });\n      const vaa = parseVAA(vaaBase64);\n\n      onProgress?.(vaa.signatures.length, requiredSignatures);\n\n      if (vaa.signatures.length >= requiredSignatures) {\n        return vaa;\n      }\n    } catch {\n      // VAA not available yet, continue waiting\n    }\n\n    await sleep(checkIntervalMs);\n  }\n\n  throw new Error(`Timeout waiting for guardian signatures after ${maxWaitMs / 1000}s`);\n}\n\n// ============================================================================\n// Wormhole Core Bridge Addresses\n// ============================================================================\n\n/**\n * Get the Wormhole Core Bridge contract address for a chain\n */\nexport function getWormholeCoreBridge(wormholeChainId: number, testnet = true): string {\n  const testnetBridges: Record<number, string> = {\n    10004: '0x79A1027a6A159502049F10906D333EC57E95F083', // Base Sepolia\n    10005: '0x31377888146f3253211EFEf5c676D41ECe7D58Fe', // Optimism Sepolia\n    10003: '0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35', // Arbitrum Sepolia\n    1: '3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5',   // Solana Devnet\n    22: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625', // Aptos Testnet\n    21: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790', // Sui Testnet\n  };\n\n  const mainnetBridges: Record<number, string> = {\n    2: '0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B',  // Ethereum\n    30: '0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6', // Base\n    24: '0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722', // Optimism\n    23: '0xa5f208e072434bC67592E4C49C1B991BA79BCA46', // Arbitrum\n    5: '0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7',  // Polygon\n    1: 'worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth',  // Solana\n    22: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625', // Aptos\n    21: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c', // Sui\n  };\n\n  const bridges = testnet ? testnetBridges : mainnetBridges;\n  return bridges[wormholeChainId] ?? '';\n}\n\n/**\n * Get the Wormhole Token Bridge contract address for a chain\n */\nexport function getWormholeTokenBridge(wormholeChainId: number, testnet = true): string {\n  const testnetBridges: Record<number, string> = {\n    10004: '0x86F55A04690fd7815A3D802bD587e83eA888B239', // Base Sepolia\n    10005: '0x99737Ec4B815d816c49A385943baf0380e75c0Ac', // Optimism Sepolia\n    10003: '0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e', // Arbitrum Sepolia\n  };\n\n  const mainnetBridges: Record<number, string> = {\n    2: '0x3ee18B2214AFF97000D974cf647E7C347E8fa585',  // Ethereum\n    30: '0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627', // Base\n    24: '0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b', // Optimism\n    23: '0x0b2402144Bb366A632D14B83F244D2e0e21bD39c', // Arbitrum\n    5: '0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE',  // Polygon\n  };\n\n  const bridges = testnet ? testnetBridges : mainnetBridges;\n  return bridges[wormholeChainId] ?? '';\n}\n\n/**\n * Get the Wormhole Relayer contract address for a chain\n */\nexport function getWormholeRelayer(wormholeChainId: number, testnet = true): string {\n  const testnetRelayers: Record<number, string> = {\n    10004: '0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE', // Base Sepolia\n    10005: '0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE', // Optimism Sepolia\n    10003: '0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470', // Arbitrum Sepolia\n  };\n\n  const mainnetRelayers: Record<number, string> = {\n    2: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911',  // Ethereum\n    30: '0x706F82e9bb5b0813501714Ab5974216704980e31', // Base\n    24: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Optimism\n    23: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Arbitrum\n    5: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911',  // Polygon\n  };\n\n  const relayers = testnet ? testnetRelayers : mainnetRelayers;\n  return relayers[wormholeChainId] ?? '';\n}\n\n/**\n * Check if a chain supports Wormhole Relayer\n */\nexport function supportsRelayer(wormholeChainId: number, testnet = true): boolean {\n  return getWormholeRelayer(wormholeChainId, testnet) !== '';\n}\n\n/**\n * Get chain name from Wormhole chain ID\n */\nexport function getChainName(wormholeChainId: number): string {\n  const names: Record<number, string> = {\n    1: 'Solana',\n    2: 'Ethereum',\n    4: 'BSC',\n    5: 'Polygon',\n    6: 'Avalanche',\n    10: 'Fantom',\n    21: 'Sui',\n    22: 'Aptos',\n    23: 'Arbitrum',\n    24: 'Optimism',\n    30: 'Base',\n    10002: 'Sepolia',\n    10003: 'Arbitrum Sepolia',\n    10004: 'Base Sepolia',\n    10005: 'Optimism Sepolia',\n  };\n  return names[wormholeChainId] ?? `Chain ${wormholeChainId}`;\n}\n\n// ============================================================================\n// VAA Validation\n// ============================================================================\n\n/**\n * Validate that a VAA has sufficient signatures for the given network\n */\nexport function hasQuorum(vaa: VAA, testnet = true): boolean {\n  const required = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM;\n  return vaa.signatures.length >= required;\n}\n\n/**\n * Validate VAA emitter matches expected source\n */\nexport function validateEmitter(\n  vaa: VAA,\n  expectedChain: number,\n  expectedAddress: string\n): boolean {\n  const normalizedExpected = '0x' + normalizeEmitterAddress(expectedAddress);\n  return (\n    vaa.emitterChain === expectedChain &&\n    vaa.emitterAddress.toLowerCase() === normalizedExpected.toLowerCase()\n  );\n}\n\n/**\n * Convert an EVM address to bytes32 format (for Wormhole)\n */\nexport function evmAddressToBytes32(address: string): string {\n  const hex = address.replace('0x', '').toLowerCase();\n  return '0x' + hex.padStart(64, '0');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":"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","names":[]}