{"version":3,"sources":["../src/payload.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Payload Encoding/Decoding Utilities\n */\n\nimport { ethers } from 'ethers';\nimport {\n  ACTION_TRANSFER,\n  ACTION_EXECUTE,\n  ACTION_CONFIG,\n  ACTION_BRIDGE,\n  PROTOCOL_VERSION,\n} from './constants.js';\nimport type { TransferAction, BridgeAction, ExecuteAction, ActionPayload } from './types.js';\n\n// ============================================================================\n// Action Encoding\n// ============================================================================\n\n/**\n * Encode a transfer action payload\n * Format: [actionType(1)] [token(32)] [recipient(32)] [amount(32)]\n */\nexport function encodeTransferAction(\n  token: string,\n  recipient: string,\n  amount: bigint\n): string {\n  const tokenPadded = padTo32Bytes(token);\n  const recipientPadded = padTo32Bytes(recipient);\n  const amountBytes = ethers.zeroPadValue(ethers.toBeHex(amount), 32);\n\n  return ethers.concat([\n    ethers.toBeHex(ACTION_TRANSFER, 1),\n    tokenPadded,\n    recipientPadded,\n    amountBytes,\n  ]);\n}\n\n/**\n * Encode a bridge action payload\n * Format: [actionType(1)] [token(32)] [amount(32)] [targetChain(2)] [recipient(32)]\n */\nexport function encodeBridgeAction(\n  token: string,\n  amount: bigint,\n  targetChain: number,\n  recipient: string\n): string {\n  const tokenPadded = padTo32Bytes(token);\n  const amountBytes = ethers.zeroPadValue(ethers.toBeHex(amount), 32);\n  const targetChainBytes = ethers.toBeHex(targetChain, 2);\n  const recipientPadded = padTo32Bytes(recipient);\n\n  return ethers.concat([\n    ethers.toBeHex(ACTION_BRIDGE, 1),\n    tokenPadded,\n    amountBytes,\n    targetChainBytes,\n    recipientPadded,\n  ]);\n}\n\n/**\n * Encode an execute action payload (arbitrary contract call)\n * Format: [actionType(1)] [target(32)] [value(32)] [dataLength(2)] [data(variable)]\n */\nexport function encodeExecuteAction(\n  target: string,\n  value: bigint,\n  data: string\n): string {\n  const targetPadded = padTo32Bytes(target);\n  const valueBytes = ethers.zeroPadValue(ethers.toBeHex(value), 32);\n  const dataBytes = ethers.getBytes(data);\n  const dataLengthBytes = ethers.toBeHex(dataBytes.length, 2);\n\n  return ethers.concat([\n    ethers.toBeHex(ACTION_EXECUTE, 1),\n    targetPadded,\n    valueBytes,\n    dataLengthBytes,\n    data,\n  ]);\n}\n\n/**\n * Encode a config action payload\n * Format: [actionType(1)] [configType(1)] [configData(variable)]\n */\nexport function encodeConfigAction(configType: number, configData: string): string {\n  return ethers.concat([\n    ethers.toBeHex(ACTION_CONFIG, 1),\n    ethers.toBeHex(configType, 1),\n    configData,\n  ]);\n}\n\n// ============================================================================\n// Veridex Payload Encoding\n// ============================================================================\n\n/**\n * Encode the full Veridex message payload that gets published via Wormhole\n * Format: [version(1)] [userKeyHash(32)] [targetChain(2)] [nonce(32)] [pubKeyX(32)] [pubKeyY(32)] [actionPayload]\n */\nexport function encodeVeridexPayload(\n  userKeyHash: string,\n  targetChain: number,\n  nonce: bigint,\n  publicKeyX: bigint,\n  publicKeyY: bigint,\n  actionPayload: string\n): string {\n  return ethers.concat([\n    ethers.toBeHex(PROTOCOL_VERSION, 1),\n    userKeyHash,\n    ethers.toBeHex(targetChain, 2),\n    ethers.zeroPadValue(ethers.toBeHex(nonce), 32),\n    ethers.zeroPadValue(ethers.toBeHex(publicKeyX), 32),\n    ethers.zeroPadValue(ethers.toBeHex(publicKeyY), 32),\n    actionPayload,\n  ]);\n}\n\n// ============================================================================\n// Action Decoding\n// ============================================================================\n\n/**\n * Decode an action payload to determine its type and contents\n */\nexport function decodeActionPayload(payload: string): ActionPayload {\n  const data = ethers.getBytes(payload);\n  const actionType = data[0];\n\n  switch (actionType) {\n    case ACTION_TRANSFER:\n      return decodeTransferAction(payload);\n    case ACTION_BRIDGE:\n      return decodeBridgeAction(payload);\n    case ACTION_EXECUTE:\n      return decodeExecuteAction(payload);\n    default:\n      return { type: `unknown_${actionType}`, raw: payload };\n  }\n}\n\n/**\n * Decode a transfer action payload\n */\nexport function decodeTransferAction(payload: string): TransferAction {\n  const data = ethers.getBytes(payload);\n\n  const tokenBytes = data.slice(1, 33);\n  const recipientBytes = data.slice(33, 65);\n  const amountBytes = data.slice(65, 97);\n\n  return {\n    type: 'transfer',\n    token: trimTo20Bytes(ethers.hexlify(tokenBytes)),\n    recipient: trimTo20Bytes(ethers.hexlify(recipientBytes)),\n    amount: BigInt(ethers.hexlify(amountBytes)),\n  };\n}\n\n/**\n * Decode a bridge action payload\n */\nexport function decodeBridgeAction(payload: string): BridgeAction {\n  const data = ethers.getBytes(payload);\n\n  const tokenBytes = data.slice(1, 33);\n  const amountBytes = data.slice(33, 65);\n  const targetChainByte0 = data[65];\n  const targetChainByte1 = data[66];\n  const recipientBytes = data.slice(67, 99);\n\n  const targetChain = ((targetChainByte0 ?? 0) << 8) | (targetChainByte1 ?? 0);\n\n  return {\n    type: 'bridge',\n    token: trimTo20Bytes(ethers.hexlify(tokenBytes)),\n    amount: BigInt(ethers.hexlify(amountBytes)),\n    targetChain,\n    recipient: ethers.hexlify(recipientBytes),\n  };\n}\n\n/**\n * Decode an execute action payload\n */\nexport function decodeExecuteAction(payload: string): ExecuteAction {\n  const data = ethers.getBytes(payload);\n\n  const targetBytes = data.slice(1, 33);\n  const valueBytes = data.slice(33, 65);\n  const dataLengthByte0 = data[65];\n  const dataLengthByte1 = data[66];\n  const dataLength = ((dataLengthByte0 ?? 0) << 8) | (dataLengthByte1 ?? 0);\n  const callData = data.slice(67, 67 + dataLength);\n\n  return {\n    type: 'execute',\n    target: trimTo20Bytes(ethers.hexlify(targetBytes)),\n    value: BigInt(ethers.hexlify(valueBytes)),\n    data: ethers.hexlify(callData),\n  };\n}\n\n// ============================================================================\n// Chain-Specific Encodings\n// ============================================================================\n\n/**\n * Encode a Solana-compatible transfer action\n * Solana uses: [actionType(1)] [amount(8 LE)] [recipient(32)]\n */\nexport function encodeSolanaTransferAction(\n  amount: bigint,\n  recipient: string\n): string {\n  const amountBytes = Buffer.alloc(8);\n  amountBytes.writeBigUInt64LE(amount);\n\n  const recipientBytes = ethers.getBytes(recipient);\n\n  return ethers.hexlify(\n    Buffer.concat([\n      Buffer.from([ACTION_TRANSFER]),\n      amountBytes,\n      Buffer.from(recipientBytes),\n    ])\n  );\n}\n\n/**\n * Encode an Aptos-compatible transfer action\n * Aptos uses: [actionType(1)] [amount(8 LE)] [recipient(32)]\n */\nexport function encodeAptosTransferAction(\n  amount: bigint,\n  recipient: string\n): string {\n  const amountBytes = Buffer.alloc(8);\n  amountBytes.writeBigUInt64LE(amount);\n\n  const recipientPadded = padTo32Bytes(recipient);\n\n  return ethers.hexlify(\n    Buffer.concat([\n      Buffer.from([ACTION_TRANSFER]),\n      amountBytes,\n      Buffer.from(ethers.getBytes(recipientPadded)),\n    ])\n  );\n}\n\n/**\n * Encode a Sui-compatible transfer action\n * Sui uses: [actionType(1)] [amount(8 LE)] [recipient(32)]\n */\nexport function encodeSuiTransferAction(\n  amount: bigint,\n  recipient: string\n): string {\n  const amountBytes = Buffer.alloc(8);\n  amountBytes.writeBigUInt64LE(amount);\n\n  const recipientPadded = padTo32Bytes(recipient);\n\n  return ethers.hexlify(\n    Buffer.concat([\n      Buffer.from([ACTION_TRANSFER]),\n      amountBytes,\n      Buffer.from(ethers.getBytes(recipientPadded)),\n    ])\n  );\n}\n\n// ============================================================================\n// Address Utilities\n// ============================================================================\n\n/**\n * Pad an address to 32 bytes (Wormhole standard)\n * Supports both EVM addresses (0x...) and Solana addresses (base58)\n */\nexport function padTo32Bytes(address: string): string {\n  // Handle native token - convert to zero address\n  if (address.toLowerCase() === 'native') {\n    return '0x' + '0'.repeat(64);\n  }\n  \n  // If it starts with 0x, treat as hex\n  if (address.startsWith('0x')) {\n    const hex = address.replace('0x', '');\n    // Validate that hex only contains valid hex characters\n    if (!/^[0-9a-fA-F]*$/.test(hex)) {\n      throw new Error(`Invalid address: ${address}. Expected hex string or 'native'.`);\n    }\n    return '0x' + hex.padStart(64, '0');\n  }\n  \n  // Otherwise, assume base58 Solana address and decode it\n  // Base58 character set (Bitcoin/Solana style - no 0, O, I, l)\n  const base58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  \n  // Validate base58 characters\n  for (const char of address) {\n    if (!base58Chars.includes(char)) {\n      throw new Error(`Invalid address: ${address}. Contains invalid base58 character '${char}'.`);\n    }\n  }\n  \n  // Decode base58 to bytes\n  let value = BigInt(0);\n  for (const char of address) {\n    value = value * 58n + BigInt(base58Chars.indexOf(char));\n  }\n  \n  // Convert to 32-byte hex\n  let hex = value.toString(16);\n  // Ensure it's not longer than 64 chars (32 bytes)\n  if (hex.length > 64) {\n    throw new Error(`Invalid address: ${address}. Decoded value too large for 32 bytes.`);\n  }\n  \n  return '0x' + hex.padStart(64, '0');\n}\n\n/**\n * Trim a 32-byte hex to a 20-byte EVM address\n */\nexport function trimTo20Bytes(hex32: string): string {\n  const clean = hex32.replace('0x', '');\n  return '0x' + clean.slice(-40);\n}\n\n/**\n * Convert a Solana public key (base58) to bytes32\n * @deprecated Use padTo32Bytes instead, which now handles both EVM and Solana addresses\n */\nexport function solanaAddressToBytes32(base58Address: string): string {\n  return padTo32Bytes(base58Address);\n}\n\n// ============================================================================\n// Amount Utilities\n// ============================================================================\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: bigint, decimals = 18): string {\n  const divisor = 10n ** BigInt(decimals);\n  const whole = amount / divisor;\n  const fraction = amount % divisor;\n\n  if (fraction === 0n) {\n    return whole.toString();\n  }\n\n  const fractionStr = fraction.toString().padStart(decimals, '0');\n  const trimmedFraction = fractionStr.replace(/0+$/, '');\n\n  return `${whole}.${trimmedFraction}`;\n}\n\n/**\n * Parse an amount string with decimals to bigint\n */\nexport function parseAmount(amountStr: string, decimals = 18): bigint {\n  const parts = amountStr.split('.');\n  const whole = BigInt(parts[0] ?? '0');\n\n  if (parts.length === 1 || !parts[1]) {\n    return whole * (10n ** BigInt(decimals));\n  }\n\n  const fractionStr = parts[1].slice(0, decimals).padEnd(decimals, '0');\n  const fraction = BigInt(fractionStr);\n\n  return whole * (10n ** BigInt(decimals)) + fraction;\n}\n\n// ============================================================================\n// Nonce Utilities\n// ============================================================================\n\n/**\n * Generate a unique nonce for a transaction\n */\nexport function generateNonce(): bigint {\n  const timestamp = BigInt(Date.now());\n  const random = BigInt(Math.floor(Math.random() * 1000000));\n  return (timestamp << 20n) | random;\n}\n\n/**\n * Create a message hash for signing (used in authenticateRawAndDispatch)\n */\nexport function createMessageHash(\n  targetChain: number,\n  actionPayload: string,\n  nonce: bigint\n): string {\n  return ethers.keccak256(\n    ethers.solidityPacked(\n      ['uint16', 'bytes', 'uint256'],\n      [targetChain, actionPayload, nonce]\n    )\n  );\n}\n\n/**\n * Create the challenge bytes for gasless dispatch (matches Hub's authenticateAndDispatch)\n * \n * The Hub contract passes raw packed bytes to WebAuthn.verify():\n * abi.encodePacked(targetChain, actionPayload, userNonce, hubChainId)\n * \n * The WebAuthn library then base64url-encodes these bytes to match against clientDataJSON.\n * We do NOT hash here - the challenge is the raw packed bytes.\n * \n * @param targetChain - Wormhole chain ID of the destination\n * @param actionPayload - The action payload (hex string)\n * @param nonce - User's current nonce\n * @param hubChainId - Wormhole chain ID of the Hub (e.g., 30 for Base)\n * @returns The packed bytes as hex string (NOT hashed)\n */\nexport function createGaslessMessageHash(\n  targetChain: number,\n  actionPayload: string,\n  nonce: bigint,\n  hubChainId: number\n): string {\n  // Return raw packed bytes - NO sha256 hash\n  // The contract passes these bytes directly to WebAuthn.verify()\n  return ethers.solidityPacked(\n    ['uint16', 'bytes', 'uint256', 'uint16'],\n    [targetChain, actionPayload, nonce, hubChainId]\n  );\n}\n\n/**\n * Build the challenge bytes for WebAuthn signing (gasless flow)\n * Returns raw packed bytes that match what the Hub contract expects\n * \n * @param targetChain - Wormhole chain ID of the destination\n * @param actionPayload - The action payload (hex string)\n * @param nonce - User's current nonce\n * @param hubChainId - Wormhole chain ID of the Hub\n * @returns Challenge bytes for WebAuthn signing (raw packed, not hashed)\n */\nexport function buildGaslessChallenge(\n  targetChain: number,\n  actionPayload: string,\n  nonce: bigint,\n  hubChainId: number\n): Uint8Array {\n  const packed = createGaslessMessageHash(targetChain, actionPayload, nonce, hubChainId);\n  return ethers.getBytes(packed);\n}\n\n/**\n * Build the challenge bytes for WebAuthn signing\n */\nexport function buildChallenge(\n  userKeyHash: string,\n  targetChain: number,\n  nonce: bigint,\n  actionPayload: string\n): Uint8Array {\n  const encoded = ethers.solidityPacked(\n    ['bytes32', 'uint16', 'uint256', 'bytes'],\n    [userKeyHash, targetChain, nonce, actionPayload]\n  );\n  return ethers.getBytes(ethers.keccak256(encoded));\n}\n"],"mappings":"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","names":["hex"]}