{"version":3,"sources":["../../src/constants.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Token program addresses for SPL Token and Token-2022\n * These addresses are the same across all Solana networks (mainnet, devnet, testnet)\n */\nexport const TOKEN_PROGRAM_ADDRESS = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\";\nexport const TOKEN_2022_PROGRAM_ADDRESS = \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\";\nexport const COMPUTE_BUDGET_PROGRAM_ADDRESS = \"ComputeBudget111111111111111111111111111111\";\nexport const MEMO_PROGRAM_ADDRESS = \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\";\n\n/**\n * Swig smart wallet program address and instruction discriminators.\n * Swig wraps inner instructions (e.g. SPL transferChecked) inside a SignV2\n * instruction and executes them via CPI using the Swig PDA as authority.\n * See: https://github.com/anagram-xyz/swig\n */\nexport const SWIG_PROGRAM_ADDRESS = \"swigypWHEksbC64pWKwah1WTeh9JXwx8H1rJHLdbQMB\";\nexport const SWIG_SIGN_V2_DISCRIMINATOR = 11; // U16 LE\n\n/**\n * Secp256r1 precompile program address (used by Swig passkey wallets)\n * Swig transactions may include secp256r1 signature verification instructions\n * before the SignV2 instruction. These are filtered out during transaction flattening.\n */\nexport const SECP256R1_PRECOMPILE_ADDRESS = \"Secp256r1SigVerify1111111111111111111111111\";\n\n/**\n * Phantom/Solflare Lighthouse program address\n * Phantom and Solflare wallets inject Lighthouse instructions for user protection on mainnet transactions.\n * - Phantom adds 1 Lighthouse instruction (4th instruction)\n * - Solflare adds 2 Lighthouse instructions (4th and 5th instructions)\n * We allow these as optional instructions to support these wallets.\n * See: https://github.com/x402-foundation/x402/issues/828\n */\nexport const LIGHTHOUSE_PROGRAM_ADDRESS = \"L2TExMFKdjpN9kozasaurPirfHy9P8sbXoAN1qA3S95\";\n\n/**\n * Default RPC URLs for Solana networks\n */\nexport const DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nexport const TESTNET_RPC_URL = \"https://api.testnet.solana.com\";\nexport const MAINNET_RPC_URL = \"https://api.mainnet-beta.solana.com\";\nexport const DEVNET_WS_URL = \"wss://api.devnet.solana.com\";\nexport const TESTNET_WS_URL = \"wss://api.testnet.solana.com\";\nexport const MAINNET_WS_URL = \"wss://api.mainnet-beta.solana.com\";\n\n/**\n * USDC token mint addresses (default stablecoin)\n */\nexport const USDC_MAINNET_ADDRESS = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nexport const USDC_DEVNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\";\nexport const USDC_TESTNET_ADDRESS = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\"; // Same as devnet\n\n/**\n * Compute budget configuration\n * All prices are in microlamports (1 lamport = 1,000,000 microlamports)\n */\nexport const DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\nexport const DEFAULT_COMPUTE_UNIT_LIMIT = 20_000;\nexport const MAX_MEMO_BYTES = 256;\n\n/**\n * Security limits to prevent fee amplification / DoS attacks.\n * These limits protect the facilitator from malicious payloads that attempt\n * to inflate gas costs while the facilitator pays fees.\n */\n\n/**\n * Maximum compute unit price in microlamports.\n * Kept intentionally low to prevent bots from inflating priority fees\n * at the facilitator's expense (the facilitator pays gas).\n * Default: 5 microlamports. Override via MAX_SVM_COMPUTE_UNIT_PRICE_MICROLAMPORTS environment variable.\n */\nexport const MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS = process.env\n  .MAX_SVM_COMPUTE_UNIT_PRICE_MICROLAMPORTS\n  ? parseInt(process.env.MAX_SVM_COMPUTE_UNIT_PRICE_MICROLAMPORTS, 10)\n  : 5;\n\n/**\n * Maximum compute unit limit.\n * SPL token transfer with memo uses ~20k CU. 60k provides 3x safety margin.\n * Wallets like Solflare add ~40k CU buffer, so we need headroom.\n * Prevents attackers from inflating CU budget at facilitator's expense.\n * Override via MAX_SVM_COMPUTE_UNIT_LIMIT environment variable.\n */\nexport const MAX_COMPUTE_UNIT_LIMIT = process.env.MAX_SVM_COMPUTE_UNIT_LIMIT\n  ? parseInt(process.env.MAX_SVM_COMPUTE_UNIT_LIMIT, 10)\n  : 60_000;\n\n/**\n * Maximum allowed required signatures.\n * Typical x402 flow: payer + fee payer = 2 signatures.\n * Higher values indicate multi-sig spam attempts.\n */\nexport const MAX_REQUIRED_SIGNATURES = 2;\n\n/**\n * How long a transaction is held in the duplicate settlement cache (ms).\n * Covers the Solana blockhash lifetime (~60-90s) with margin.\n */\nexport const SETTLEMENT_TTL_MS = 120_000;\n\n/**\n * Solana address validation regex (base58, 32-44 characters)\n */\nexport const SVM_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/**\n * CAIP-2 network identifiers for Solana (V2)\n */\nexport const SOLANA_MAINNET_CAIP2 = \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\";\nexport const SOLANA_DEVNET_CAIP2 = \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\";\nexport const SOLANA_TESTNET_CAIP2 = \"solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z\";\n\n/**\n * V1 to V2 network identifier mappings (for backwards compatibility)\n * V1 used simple names like solana, V2 uses CAIP-2\n */\nexport const V1_TO_V2_NETWORK_MAP: Record<string, string> = {\n  solana: SOLANA_MAINNET_CAIP2,\n  \"solana-devnet\": SOLANA_DEVNET_CAIP2,\n  \"solana-testnet\": SOLANA_TESTNET_CAIP2,\n};\n","import { createHash } from \"node:crypto\";\nimport {\n  getBase64Encoder,\n  getTransactionDecoder,\n  getCompiledTransactionMessageDecoder,\n  getProgramDerivedAddress,\n  getAddressEncoder,\n  type Transaction,\n  type Address,\n  type Instruction,\n  createSolanaRpc,\n  devnet,\n  testnet,\n  mainnet,\n  type RpcDevnet,\n  type SolanaRpcApiDevnet,\n  type RpcTestnet,\n  type SolanaRpcApiTestnet,\n  type RpcMainnet,\n  type SolanaRpcApiMainnet,\n} from \"@solana/kit\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"@solana-program/token\";\nimport { TOKEN_2022_PROGRAM_ADDRESS } from \"@solana-program/token-2022\";\nimport type { Network } from \"@payai/x402/types\";\nimport {\n  SVM_ADDRESS_REGEX,\n  DEVNET_RPC_URL,\n  TESTNET_RPC_URL,\n  MAINNET_RPC_URL,\n  USDC_MAINNET_ADDRESS,\n  USDC_DEVNET_ADDRESS,\n  USDC_TESTNET_ADDRESS,\n  SOLANA_MAINNET_CAIP2,\n  SOLANA_DEVNET_CAIP2,\n  SOLANA_TESTNET_CAIP2,\n  V1_TO_V2_NETWORK_MAP,\n  COMPUTE_BUDGET_PROGRAM_ADDRESS,\n  SWIG_PROGRAM_ADDRESS,\n  SWIG_SIGN_V2_DISCRIMINATOR,\n  SECP256R1_PRECOMPILE_ADDRESS,\n} from \"./constants\";\nimport type { ExactSvmPayloadV1 } from \"./types\";\n\n/**\n * Normalize network identifier to CAIP-2 format\n * Handles both V1 names (solana, solana-devnet) and V2 CAIP-2 format\n *\n * @param network - Network identifier (V1 or V2 format)\n * @returns CAIP-2 network identifier\n */\nexport function normalizeNetwork(network: Network): string {\n  // If it's already CAIP-2 format (contains \":\"), validate it's supported\n  if (network.includes(\":\")) {\n    const supported = [SOLANA_MAINNET_CAIP2, SOLANA_DEVNET_CAIP2, SOLANA_TESTNET_CAIP2];\n    if (!supported.includes(network)) {\n      throw new Error(`Unsupported SVM network: ${network}`);\n    }\n    return network;\n  }\n\n  // Otherwise, it's a V1 network name, convert to CAIP-2\n  const caip2Network = V1_TO_V2_NETWORK_MAP[network];\n  if (!caip2Network) {\n    throw new Error(`Unsupported SVM network: ${network}`);\n  }\n  return caip2Network;\n}\n\n/**\n * Validate Solana address format\n *\n * @param address - Base58 encoded address string\n * @returns true if address is valid, false otherwise\n */\nexport function validateSvmAddress(address: string): boolean {\n  return SVM_ADDRESS_REGEX.test(address);\n}\n\n/**\n * Compute a stable, immutable cache key for a decoded transaction by hashing its\n * message bytes. The fee-payer signature (slot 0) is overwritten by the facilitator\n * before broadcast, so an attacker can randomize those bytes to bypass a wire-bytes\n * cache key. The message is what every signer commits to, making its hash a reliable\n * payment identity.\n *\n * @param transaction - Decoded transaction whose message bytes to hash\n * @returns Base64-encoded SHA-256 hash of the transaction message bytes\n */\nexport function transactionMessageHash(transaction: Transaction): string {\n  return createHash(\"sha256\").update(Buffer.from(transaction.messageBytes)).digest(\"base64\");\n}\n\n/**\n * Decode a base64 encoded transaction from an SVM payload\n *\n * @param svmPayload - The SVM payload containing a base64 encoded transaction\n * @returns Decoded Transaction object\n */\nexport function decodeTransactionFromPayload(svmPayload: ExactSvmPayloadV1): Transaction {\n  try {\n    const base64Encoder = getBase64Encoder();\n    const transactionBytes = base64Encoder.encode(svmPayload.transaction);\n    const transactionDecoder = getTransactionDecoder();\n    return transactionDecoder.decode(transactionBytes);\n  } catch (error) {\n    console.error(\"Error decoding transaction:\", error);\n    throw new Error(\"invalid_exact_svm_payload_transaction\");\n  }\n}\n\n/**\n * Extract the token sender (owner of the source token account) from a TransferChecked instruction\n *\n * @param transaction - The decoded transaction\n * @returns The token payer address as a base58 string\n */\nexport function getTokenPayerFromTransaction(transaction: Transaction): string {\n  const compiled = getCompiledTransactionMessageDecoder().decode(transaction.messageBytes);\n  const staticAccounts = compiled.staticAccounts ?? [];\n  const instructions = compiled.instructions ?? [];\n\n  for (const ix of instructions) {\n    const programIndex = ix.programAddressIndex;\n    const programAddress = staticAccounts[programIndex].toString();\n\n    // Check if this is a token program instruction\n    if (\n      programAddress === TOKEN_PROGRAM_ADDRESS.toString() ||\n      programAddress === TOKEN_2022_PROGRAM_ADDRESS.toString()\n    ) {\n      const accountIndices: number[] = ix.accountIndices ?? [];\n      // TransferChecked account order: [source, mint, destination, owner, ...]\n      if (accountIndices.length >= 4) {\n        const ownerIndex = accountIndices[3];\n        const ownerAddress = staticAccounts[ownerIndex].toString();\n        if (ownerAddress) return ownerAddress;\n      }\n    }\n  }\n\n  return \"\";\n}\n\n/**\n * Create an RPC client for the specified network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @param customRpcUrl - Optional custom RPC URL\n * @returns RPC client for the specified network\n */\nexport function createRpcClient(\n  network: Network,\n  customRpcUrl?: string,\n):\n  | RpcDevnet<SolanaRpcApiDevnet>\n  | RpcTestnet<SolanaRpcApiTestnet>\n  | RpcMainnet<SolanaRpcApiMainnet> {\n  const caip2Network = normalizeNetwork(network);\n\n  switch (caip2Network) {\n    case SOLANA_DEVNET_CAIP2: {\n      const url = customRpcUrl || DEVNET_RPC_URL;\n      return createSolanaRpc(devnet(url)) as RpcDevnet<SolanaRpcApiDevnet>;\n    }\n    case SOLANA_TESTNET_CAIP2: {\n      const url = customRpcUrl || TESTNET_RPC_URL;\n      return createSolanaRpc(testnet(url)) as RpcTestnet<SolanaRpcApiTestnet>;\n    }\n    case SOLANA_MAINNET_CAIP2: {\n      const url = customRpcUrl || MAINNET_RPC_URL;\n      return createSolanaRpc(mainnet(url)) as RpcMainnet<SolanaRpcApiMainnet>;\n    }\n    default:\n      throw new Error(`Unsupported network: ${network}`);\n  }\n}\n\n/**\n * Get the default USDC mint address for a network\n *\n * @param network - Network identifier (CAIP-2 or V1 format)\n * @returns USDC mint address for the network\n */\nexport function getUsdcAddress(network: Network): string {\n  const caip2Network = normalizeNetwork(network);\n\n  switch (caip2Network) {\n    case SOLANA_MAINNET_CAIP2:\n      return USDC_MAINNET_ADDRESS;\n    case SOLANA_DEVNET_CAIP2:\n      return USDC_DEVNET_ADDRESS;\n    case SOLANA_TESTNET_CAIP2:\n      return USDC_TESTNET_ADDRESS;\n    default:\n      throw new Error(`No USDC address configured for network: ${network}`);\n  }\n}\n\n// Re-export from core for backward compatibility (single implementation in @payai/x402)\nexport { convertToTokenAmount, numberToDecimalString } from \"@payai/x402/utils\";\n\n// ─── Swig wallet support ──────────────────────────────────────────────────────\n\n/**\n * A decoded compact instruction extracted from a Swig SignV2 payload.\n * Indices reference the SignV2 instruction's own account list, not the outer\n * transaction's static account keys.\n */\nexport interface SwigCompactInstruction {\n  programIdIndex: number;\n  accounts: number[];\n  data: Uint8Array;\n}\n\n/**\n * Returns true when the transaction has a Swig layout:\n *   - Every instruction is one of: compute budget, secp256r1 precompile, or Swig SignV2\n *   - At least one Swig SignV2 instruction is present\n *\n * @param instructions - Decompiled instruction array\n * @returns True when the instruction list matches the Swig transaction shape.\n */\nexport function isSwigTransaction(instructions: ReadonlyArray<Instruction>): boolean {\n  if (instructions.length === 0) return false;\n\n  let hasSignV2 = false;\n  for (const ix of instructions) {\n    const addr = ix.programAddress.toString();\n    if (addr === COMPUTE_BUDGET_PROGRAM_ADDRESS || addr === SECP256R1_PRECOMPILE_ADDRESS) continue;\n    if (addr === SWIG_PROGRAM_ADDRESS) {\n      const data = ix.data;\n      if (!data || data.length < 2) return false;\n      const discriminator = data[0] | (data[1] << 8); // U16 LE\n      if (discriminator !== SWIG_SIGN_V2_DISCRIMINATOR) return false;\n      hasSignV2 = true;\n      continue;\n    }\n    return false; // unrecognized instruction\n  }\n  return hasSignV2;\n}\n\n/**\n * Flatten a Swig transaction into the same instruction layout as a regular one.\n * Collects non-precompile, non-SignV2 outer instructions (compute budgets) and\n * resolves the compact instructions embedded in each SignV2 instruction.\n *\n * A transaction may contain multiple SignV2 instructions. All must reference\n * the same Swig PDA (accounts[0]).\n *\n * @param instructions  - Decompiled instruction array (from a Swig transaction)\n * @param _ - Ordered account list from the compiled transaction message. Swig parsing\n *   currently resolves accounts from the SignV2 instruction payload instead.\n * @returns Object with flattened `instructions` array and `swigPda` address\n */\nexport async function parseSwigTransaction(\n  instructions: ReadonlyArray<Instruction>,\n  _: ReadonlyArray<Address>,\n): Promise<{\n  instructions: Array<{\n    programAddress: Address;\n    accounts: Array<{ address: Address; role: number }>;\n    data: Uint8Array;\n  }>;\n  swigPda: string;\n}> {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const result: any[] = [];\n  const signV2Instructions: Instruction[] = [];\n\n  // 1. Single pass: separate SignV2 instructions from the rest\n  for (const ix of instructions) {\n    const addr = ix.programAddress.toString();\n    if (addr === SECP256R1_PRECOMPILE_ADDRESS) continue; // skip precompile\n    if (addr === SWIG_PROGRAM_ADDRESS) {\n      signV2Instructions.push(ix);\n    } else {\n      result.push(ix); // compute budget and other non-precompile instructions\n    }\n  }\n\n  // Sort compute budget instructions so SetComputeUnitLimit (disc=2) precedes\n  // SetComputeUnitPrice (disc=3), matching the order the facilitator expects.\n  result.sort((a, b) => {\n    const aIsCB = a.programAddress.toString() === COMPUTE_BUDGET_PROGRAM_ADDRESS;\n    const bIsCB = b.programAddress.toString() === COMPUTE_BUDGET_PROGRAM_ADDRESS;\n    if (aIsCB && bIsCB && a.data?.length > 0 && b.data?.length > 0) {\n      return a.data[0] - b.data[0];\n    }\n    return 0;\n  });\n\n  if (signV2Instructions.length === 0) {\n    throw new Error(\"invalid_exact_svm_payload_no_transfer_instruction\");\n  }\n\n  // 2. Process each SignV2 instruction\n  let swigPda = \"\";\n  const addressEncoder = getAddressEncoder();\n\n  for (const signV2Ix of signV2Instructions) {\n    // Extract Swig PDA from SignV2's first account\n    const pda = signV2Ix.accounts?.[0]?.address?.toString() ?? \"\";\n    if (!pda) throw new Error(\"invalid_exact_svm_payload_no_transfer_instruction\");\n\n    // Enforce all SignV2 instructions share the same PDA\n    if (swigPda === \"\") {\n      swigPda = pda;\n    } else if (pda !== swigPda) {\n      throw new Error(\n        \"swig_pda_mismatch: all SignV2 instructions must reference the same Swig PDA\",\n      );\n    }\n\n    // Validate Swig wallet address derivation (cross-check accounts[0] and accounts[1])\n    const swigWalletAddress = signV2Ix.accounts?.[1]?.address?.toString() ?? \"\";\n    if (!swigWalletAddress) throw new Error(\"invalid_swig_wallet_address_derivation\");\n\n    const [expectedWalletAddress] = await getProgramDerivedAddress({\n      programAddress: SWIG_PROGRAM_ADDRESS as Address,\n      seeds: [\n        new TextEncoder().encode(\"swig-wallet-address\"),\n        addressEncoder.encode(pda as Address),\n      ],\n    });\n\n    if (swigWalletAddress !== expectedWalletAddress.toString()) {\n      throw new Error(\"invalid_swig_wallet_address_derivation\");\n    }\n\n    // Decode compact instructions from SignV2 data\n    const rawData = signV2Ix.data ? new Uint8Array(signV2Ix.data) : new Uint8Array(0);\n    const compactInstructions = decodeSwigCompactInstructions(rawData);\n\n    // Resolve compact instruction indices through signV2's account list\n    const signV2Accounts = signV2Ix.accounts ?? [];\n    for (const ci of compactInstructions) {\n      if (ci.programIdIndex >= signV2Accounts.length) {\n        throw new Error(\n          `compact instruction programIdIndex ${ci.programIdIndex} out of range (signV2 has ${signV2Accounts.length} accounts)`,\n        );\n      }\n      result.push({\n        programAddress: signV2Accounts[ci.programIdIndex].address as Address,\n        accounts: ci.accounts.map(idx => {\n          if (idx >= signV2Accounts.length) {\n            throw new Error(\n              `compact instruction account index ${idx} out of range (signV2 has ${signV2Accounts.length} accounts)`,\n            );\n          }\n          return { address: signV2Accounts[idx].address as Address, role: 1 };\n        }),\n        data: ci.data,\n      });\n    }\n  }\n\n  return { instructions: result, swigPda };\n}\n\n/**\n * Decode the compact instructions embedded inside a Swig SignV2 instruction.\n *\n * Layout of the outer instruction data:\n *   [0..1]  discriminator         U16 LE\n *   [2..3]  instructionPayloadLen U16 LE (byte count of compact instructions)\n *   [4..7]  roleId                U32 LE\n *   [8..]   compact instructions  (instructionPayloadLen bytes)\n *\n * Compact instructions payload:\n *   [0]       numInstructions U8\n *   [1..]     compact instruction entries...\n *\n * Each CompactInstruction:\n *   [0]       programIdIndex U8\n *   [1]       numAccounts    U8\n *   [2..N+1]  accounts       U8[numAccounts]\n *   [N+2..N+3] dataLen       U16 LE\n *   [N+4..]   data           raw bytes\n *\n * @param data - The full instruction data bytes of the outer Swig instruction\n * @returns Array of decoded compact instructions (may be empty if data is malformed)\n */\nexport function decodeSwigCompactInstructions(data: Uint8Array): SwigCompactInstruction[] {\n  if (data.length < 4) {\n    throw new Error(`swig instruction data too short: need ≥4 bytes, got ${data.length}`);\n  }\n\n  // instructionPayloadLen at bytes 2-3 (U16 LE)\n  const instructionPayloadLen = data[2] | (data[3] << 8);\n\n  // Compact instructions start at byte 8 (after discriminator + payloadLen + roleId)\n  const startOffset = 8;\n  if (data.length < startOffset + instructionPayloadLen) {\n    throw new Error(\n      `swig instruction data truncated: payload needs ${instructionPayloadLen} bytes but only ${data.length - startOffset} available after offset ${startOffset}`,\n    );\n  }\n\n  const results: SwigCompactInstruction[] = [];\n  let offset = startOffset + 1; // skip numInstructions count byte\n  const endOffset = startOffset + instructionPayloadLen;\n\n  while (offset < endOffset) {\n    if (offset >= data.length) break;\n\n    // programIdIndex: U8\n    const programIdIndex = data[offset];\n    offset += 1;\n\n    // numAccounts: U8\n    if (offset >= endOffset) break;\n    const numAccounts = data[offset];\n    offset += 1;\n\n    // accounts: U8[numAccounts]\n    if (offset + numAccounts > endOffset) break;\n    const accounts = Array.from(data.slice(offset, offset + numAccounts));\n    offset += numAccounts;\n\n    // dataLen: U16 LE\n    if (offset + 2 > endOffset) break;\n    const dataLen = data[offset] | (data[offset + 1] << 8);\n    offset += 2;\n\n    // instruction data\n    if (offset + dataLen > endOffset) break;\n    const instrData = new Uint8Array(data.slice(offset, offset + dataLen));\n    offset += dataLen;\n\n    results.push({ programIdIndex, accounts, data: instrData });\n  }\n\n  return results;\n}\n"],"mappings":"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","names":["TOKEN_PROGRAM_ADDRESS","TOKEN_2022_PROGRAM_ADDRESS","TOKEN_PROGRAM_ADDRESS","TOKEN_2022_PROGRAM_ADDRESS"]}