{"version":3,"sources":["../../../../src/exact/facilitator/scheme.ts","../../../../src/exact/facilitator/register.ts"],"sourcesContent":["import {\n  COMPUTE_BUDGET_PROGRAM_ADDRESS,\n  parseSetComputeUnitLimitInstruction,\n  parseSetComputeUnitPriceInstruction,\n} from \"@solana-program/compute-budget\";\nimport {\n  parseTransferCheckedInstruction as parseTransferCheckedInstructionToken,\n  TOKEN_PROGRAM_ADDRESS,\n} from \"@solana-program/token\";\nimport {\n  findAssociatedTokenPda,\n  parseTransferCheckedInstruction as parseTransferCheckedInstruction2022,\n  TOKEN_2022_PROGRAM_ADDRESS,\n} from \"@solana-program/token-2022\";\nimport {\n  decompileTransactionMessage,\n  getCompiledTransactionMessageDecoder,\n  type Address,\n} from \"@solana/kit\";\nimport type {\n  PaymentPayload,\n  PaymentRequirements,\n  SchemeNetworkFacilitator,\n  SettleResponse,\n  VerifyResponse,\n} from \"@payai/x402/types\";\nimport {\n  LIGHTHOUSE_PROGRAM_ADDRESS,\n  MAX_COMPUTE_UNIT_LIMIT,\n  MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n  MAX_REQUIRED_SIGNATURES,\n  MEMO_PROGRAM_ADDRESS,\n} from \"../../constants\";\nimport { SettlementCache } from \"../../settlement-cache\";\nimport type { FacilitatorSvmSigner } from \"../../signer\";\nimport type { ExactSvmPayloadV2 } from \"../../types\";\nimport {\n  decodeTransactionFromPayload,\n  transactionMessageHash,\n} from \"../../utils\";\nimport { normalizeTransaction, type NormalizedTransaction } from \"../../normalizer\";\n\n/**\n * SVM facilitator implementation for the Exact payment scheme.\n */\nexport class ExactSvmScheme implements SchemeNetworkFacilitator {\n  readonly scheme = \"exact\";\n  readonly caipFamily = \"solana:*\";\n\n  private readonly settlementCache: SettlementCache;\n\n  /**\n   * Creates a new ExactSvmFacilitator instance.\n   *\n   * @param signer - The SVM RPC client for facilitator operations\n   * @param settlementCache - Optional shared settlement cache (one is created if omitted)\n   * @returns ExactSvmFacilitator instance\n   */\n  constructor(\n    private readonly signer: FacilitatorSvmSigner,\n    settlementCache?: SettlementCache,\n  ) {\n    this.settlementCache = settlementCache ?? new SettlementCache();\n  }\n\n  /**\n   * Get mechanism-specific extra data for the supported kinds endpoint.\n   * For SVM, this includes a randomly selected fee payer address.\n   * Random selection distributes load across multiple signers.\n   *\n   * @param _ - The network identifier (unused for SVM)\n   * @returns Extra data with feePayer address\n   */\n  getExtra(_: string): Record<string, unknown> | undefined {\n    // Randomly select from available signers to distribute load\n    const addresses = this.signer.getAddresses();\n    const randomIndex = Math.floor(Math.random() * addresses.length);\n\n    return {\n      feePayer: addresses[randomIndex],\n    };\n  }\n\n  /**\n   * Get signer addresses used by this facilitator.\n   * For SVM, returns all available fee payer addresses.\n   *\n   * @param _ - The network identifier (unused for SVM)\n   * @returns Array of fee payer addresses\n   */\n  getSigners(_: string): string[] {\n    return [...this.signer.getAddresses()];\n  }\n\n  /**\n   * Verifies a payment payload.\n   *\n   * @param payload - The payment payload to verify\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to verification response\n   */\n  async verify(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<VerifyResponse> {\n    const exactSvmPayload = payload.payload as ExactSvmPayloadV2;\n\n    // Step 1: Validate Payment Requirements\n    if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n      return {\n        isValid: false,\n        invalidReason: \"unsupported_scheme\",\n        payer: \"\",\n      };\n    }\n\n    if (payload.accepted.network !== requirements.network) {\n      return {\n        isValid: false,\n        invalidReason: \"network_mismatch\",\n        payer: \"\",\n      };\n    }\n\n    if (!requirements.extra?.feePayer || typeof requirements.extra.feePayer !== \"string\") {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_missing_fee_payer\",\n        payer: \"\",\n      };\n    }\n\n    // Verify that the requested feePayer is managed by this facilitator\n    const signerAddresses = this.signer.getAddresses().map(addr => addr.toString());\n    if (!signerAddresses.includes(requirements.extra.feePayer)) {\n      return {\n        isValid: false,\n        invalidReason: \"fee_payer_not_managed_by_facilitator\",\n        payer: \"\",\n      };\n    }\n\n    // Step 2: Parse and Validate Transaction Structure\n    let transaction;\n    try {\n      transaction = decodeTransactionFromPayload(exactSvmPayload);\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_transaction_could_not_be_decoded\",\n        payer: \"\",\n      };\n    }\n\n    const compiled = getCompiledTransactionMessageDecoder().decode(transaction.messageBytes);\n    const decompiled = decompileTransactionMessage(compiled);\n    let instructions = decompiled.instructions ?? [];\n\n    // Security check: Verify signer count to prevent multi-sig spam attacks\n    // Typical x402 flow requires only 2 signatures (payer + fee payer)\n    //\n    // NOTE:\n    // Different `@solana/kit` major versions expose different header field names.\n    // - newer: `numRequiredSignatures` (canonical Solana name)\n    // - older: `numSignerAccounts`\n    // We support both to avoid dependency/version drift in downstream wrappers.\n    const header = compiled.header as unknown as {\n      numRequiredSignatures?: number;\n      numSignerAccounts?: number;\n    };\n    const numRequiredSignatures = header.numRequiredSignatures ?? header.numSignerAccounts;\n    if (\n      typeof numRequiredSignatures === \"number\" &&\n      numRequiredSignatures > MAX_REQUIRED_SIGNATURES\n    ) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_excessive_signers\",\n        payer: \"\",\n      };\n    }\n\n    // Normalize the transaction (handles Swig, regular, and future wallet types)\n    let normalized: NormalizedTransaction;\n    try {\n      normalized = await normalizeTransaction(\n        instructions,\n        compiled.staticAccounts ?? [],\n        transaction,\n      );\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_no_transfer_instruction\",\n        payer: \"\",\n      };\n    }\n    instructions = normalized.instructions;\n    const payer = normalized.payer;\n\n    // Instruction count check AFTER flattening (3-6)\n    // - 3 instructions: ComputeLimit + ComputePrice + TransferChecked\n    // - 4 instructions: ComputeLimit + ComputePrice + TransferChecked + Lighthouse or Memo\n    // - 5 instructions: ComputeLimit + ComputePrice + TransferChecked + Lighthouse + Lighthouse or Memo\n    // - 6 instructions: ComputeLimit + ComputePrice + TransferChecked + Lighthouse + Lighthouse + Memo\n    // See: https://github.com/x402-foundation/x402/issues/828\n    if (instructions.length < 3 || instructions.length > 6) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_transaction_instructions_length\",\n        payer: \"\",\n      };\n    }\n\n    // Step 3: Verify Compute Budget Instructions\n    try {\n      this.verifyComputeLimitInstruction(instructions[0] as never);\n      this.verifyComputePriceInstruction(instructions[1] as never);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      return {\n        isValid: false,\n        invalidReason: errorMessage,\n        payer: \"\",\n      };\n    }\n\n    // Step 4: Verify Transfer Instruction (unified — works for both regular and Swig)\n    const transferIx = instructions[2];\n    const transferProgramAddress = transferIx.programAddress.toString();\n\n    if (\n      transferProgramAddress !== TOKEN_PROGRAM_ADDRESS.toString() &&\n      transferProgramAddress !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n    ) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_no_transfer_instruction\",\n        payer,\n      };\n    }\n\n    // Parse the transfer instruction using the appropriate library helper\n    let parsedTransfer;\n    try {\n      if (transferProgramAddress === TOKEN_PROGRAM_ADDRESS.toString()) {\n        parsedTransfer = parseTransferCheckedInstructionToken(transferIx as never);\n      } else {\n        parsedTransfer = parseTransferCheckedInstruction2022(transferIx as never);\n      }\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_no_transfer_instruction\",\n        payer,\n      };\n    }\n\n    // Verify that the facilitator's signers are not transferring their own funds\n    // SECURITY: Prevent facilitator from signing away their own tokens\n    // For Swig txs, the authority is the Swig PDA (signs via CPI)\n    const authorityAddress = parsedTransfer.accounts.authority.address.toString();\n    if (signerAddresses.includes(authorityAddress)) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_transaction_fee_payer_transferring_funds\",\n        payer,\n      };\n    }\n\n    // Verify mint address matches requirements\n    const mintAddress = parsedTransfer.accounts.mint.address.toString();\n    if (mintAddress !== requirements.asset) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_mint_mismatch\",\n        payer,\n      };\n    }\n\n    // Verify destination ATA matches expected ATA for payTo address\n    const destATA = parsedTransfer.accounts.destination.address.toString();\n    try {\n      const [expectedDestATA] = await findAssociatedTokenPda({\n        mint: requirements.asset as Address,\n        owner: requirements.payTo as Address,\n        tokenProgram:\n          transferProgramAddress === TOKEN_PROGRAM_ADDRESS.toString()\n            ? (TOKEN_PROGRAM_ADDRESS as Address)\n            : (TOKEN_2022_PROGRAM_ADDRESS as Address),\n      });\n\n      if (destATA !== expectedDestATA.toString()) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_svm_payload_recipient_mismatch\",\n          payer,\n        };\n      }\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_recipient_mismatch\",\n        payer,\n      };\n    }\n\n    // Verify transfer amount meets requirements\n    const amount = parsedTransfer.data.amount;\n    if (amount !== BigInt(requirements.amount)) {\n      return {\n        isValid: false,\n        invalidReason: \"invalid_exact_svm_payload_amount_mismatch\",\n        payer,\n      };\n    }\n\n    // Step 5: Verify optional instructions (if present)\n    // Allowed optional programs: Lighthouse (wallet protection) and Memo (uniqueness)\n    const optionalInstructions = instructions.slice(3);\n    const invalidReasonByIndex = [\n      \"invalid_exact_svm_payload_unknown_fourth_instruction\",\n      \"invalid_exact_svm_payload_unknown_fifth_instruction\",\n      \"invalid_exact_svm_payload_unknown_sixth_instruction\",\n    ];\n\n    for (let i = 0; i < optionalInstructions.length; i += 1) {\n      const programAddress = optionalInstructions[i].programAddress.toString();\n      if (\n        programAddress === LIGHTHOUSE_PROGRAM_ADDRESS ||\n        programAddress === MEMO_PROGRAM_ADDRESS\n      ) {\n        continue;\n      }\n\n      return {\n        isValid: false,\n        invalidReason:\n          invalidReasonByIndex[i] ?? \"invalid_exact_svm_payload_unknown_optional_instruction\",\n        payer,\n      };\n    }\n\n    // Step 5b: Verify memo content matches extra.memo when present\n    const expectedMemo = requirements.extra?.memo as string | undefined;\n    if (expectedMemo) {\n      const memoInstructions = optionalInstructions.filter(\n        ix => ix.programAddress.toString() === MEMO_PROGRAM_ADDRESS,\n      );\n      if (memoInstructions.length !== 1) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_svm_payload_memo_count\",\n          payer,\n        };\n      }\n      const memoData = memoInstructions[0].data;\n      const actualMemo = memoData ? new TextDecoder().decode(new Uint8Array(memoData)) : \"\";\n      if (actualMemo !== expectedMemo) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_svm_payload_memo_mismatch\",\n          payer,\n        };\n      }\n    }\n\n    // Step 6: Sign and Simulate Transaction\n    // CRITICAL: Simulation proves transaction will succeed (catches insufficient balance, invalid accounts, etc)\n    try {\n      const feePayer = requirements.extra.feePayer as Address;\n\n      // Sign transaction with the feePayer's signer\n      const fullySignedTransaction = await this.signer.signTransaction(\n        exactSvmPayload.transaction,\n        feePayer,\n        requirements.network,\n      );\n\n      // Simulate to verify transaction would succeed\n      await this.signer.simulateTransaction(fullySignedTransaction, requirements.network);\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      return {\n        isValid: false,\n        invalidReason: \"transaction_simulation_failed\",\n        invalidMessage: errorMessage,\n        payer,\n      };\n    }\n\n    return {\n      isValid: true,\n      invalidReason: undefined,\n      payer,\n    };\n  }\n\n  /**\n   * Settles a payment by submitting the transaction.\n   * Ensures the correct signer is used based on the feePayer specified in requirements.\n   *\n   * @param payload - The payment payload to settle\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to settlement response\n   */\n  async settle(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<SettleResponse> {\n    const exactSvmPayload = payload.payload as ExactSvmPayloadV2;\n\n    const valid = await this.verify(payload, requirements);\n    if (!valid.isValid) {\n      return {\n        success: false,\n        network: payload.accepted.network,\n        transaction: \"\",\n        errorReason: valid.invalidReason ?? \"verification_failed\",\n        errorMessage: valid.invalidMessage,\n        payer: valid.payer || \"\",\n      };\n    }\n\n    // Decode the transaction to compute the message hash used as the cache key.\n    // Must remain synchronous (before any await) so concurrent settle calls for\n    // the same payment are caught before any async work begins.\n    const decodedTx = decodeTransactionFromPayload(exactSvmPayload);\n\n    // Duplicate settlement check keyed on message hash (immune to mutable fee-payer sig at slot 0).\n    const txKey = transactionMessageHash(decodedTx);\n    if (this.settlementCache.isDuplicate(txKey)) {\n      return {\n        success: false,\n        network: payload.accepted.network,\n        transaction: \"\",\n        errorReason: \"duplicate_settlement\",\n        payer: valid.payer || \"\",\n      };\n    }\n\n    try {\n      // Extract feePayer from requirements (already validated in verify)\n      const feePayer = requirements.extra.feePayer as Address;\n\n      // Sign transaction with the feePayer's signer\n      const fullySignedTransaction = await this.signer.signTransaction(\n        exactSvmPayload.transaction,\n        feePayer,\n        requirements.network,\n      );\n\n      // Send transaction to network\n      const signature = await this.signer.sendTransaction(\n        fullySignedTransaction,\n        requirements.network,\n      );\n\n      // Wait for confirmation\n      await this.signer.confirmTransaction(signature, requirements.network);\n\n      return {\n        success: true,\n        transaction: signature,\n        network: payload.accepted.network,\n        payer: valid.payer,\n      };\n    } catch (error) {\n      console.error(\"Failed to settle transaction:\", error);\n      return {\n        success: false,\n        errorReason: \"transaction_failed\",\n        errorMessage: error instanceof Error ? error.message : String(error),\n        transaction: \"\",\n        network: payload.accepted.network,\n        payer: valid.payer || \"\",\n      };\n    }\n  }\n\n  /**\n   * Verify that the compute limit instruction is valid and within bounds.\n   *\n   * Security: Enforces MAX_COMPUTE_UNIT_LIMIT to prevent attackers from\n   * inflating CU budget at the facilitator's expense (gas amplification attack).\n   *\n   * @param instruction - The compute limit instruction\n   * @param instruction.programAddress - Program address\n   * @param instruction.data - Instruction data bytes\n   */\n  private verifyComputeLimitInstruction(instruction: {\n    programAddress: Address;\n    data?: Readonly<Uint8Array>;\n  }): void {\n    const programAddress = instruction.programAddress.toString();\n\n    if (\n      programAddress !== COMPUTE_BUDGET_PROGRAM_ADDRESS.toString() ||\n      !instruction.data ||\n      instruction.data[0] !== 2 // discriminator for SetComputeUnitLimit\n    ) {\n      throw new Error(\n        \"invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction\",\n      );\n    }\n\n    try {\n      const parsedInstruction = parseSetComputeUnitLimitInstruction(instruction as never);\n\n      // Security: Check compute unit limit doesn't exceed maximum\n      // Prevents gas amplification attacks where attacker inflates CU at facilitator's cost\n      // Note: parsed instruction has structure { programAddress, data: { discriminator, units } }\n      const units = parsedInstruction.data.units;\n      if (units > MAX_COMPUTE_UNIT_LIMIT) {\n        throw new Error(\"invalid_exact_svm_payload_transaction_compute_limit_too_high\");\n      }\n    } catch (error) {\n      if (error instanceof Error && error.message.includes(\"too_high\")) {\n        throw error;\n      }\n      throw new Error(\n        \"invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction\",\n      );\n    }\n  }\n\n  /**\n   * Verify that the compute price instruction is valid.\n   *\n   * @param instruction - The compute price instruction\n   * @param instruction.programAddress - Program address\n   * @param instruction.data - Instruction data bytes\n   */\n  private verifyComputePriceInstruction(instruction: {\n    programAddress: Address;\n    data?: Readonly<Uint8Array>;\n  }): void {\n    const programAddress = instruction.programAddress.toString();\n\n    if (\n      programAddress !== COMPUTE_BUDGET_PROGRAM_ADDRESS.toString() ||\n      !instruction.data ||\n      instruction.data[0] !== 3 // discriminator for SetComputeUnitPrice\n    ) {\n      throw new Error(\n        \"invalid_exact_svm_payload_transaction_instructions_compute_price_instruction\",\n      );\n    }\n\n    try {\n      const parsedInstruction = parseSetComputeUnitPriceInstruction(instruction as never);\n\n      // Check if price exceeds maximum (5 lamports per compute unit)\n      // Note: parsed instruction has structure { programAddress, data: { discriminator, microLamports } }\n      const microLamports = parsedInstruction.data.microLamports;\n      if (microLamports > BigInt(MAX_COMPUTE_UNIT_PRICE_MICROLAMPORTS)) {\n        throw new Error(\n          \"invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high\",\n        );\n      }\n    } catch (error) {\n      if (error instanceof Error && error.message.includes(\"too_high\")) {\n        throw error;\n      }\n      throw new Error(\n        \"invalid_exact_svm_payload_transaction_instructions_compute_price_instruction\",\n      );\n    }\n  }\n}\n","import { x402Facilitator } from \"@payai/x402/facilitator\";\nimport { Network } from \"@payai/x402/types\";\nimport { SettlementCache } from \"../../settlement-cache\";\nimport { FacilitatorSvmSigner } from \"../../signer\";\nimport { ExactSvmScheme } from \"./scheme\";\nimport { ExactSvmSchemeV1 } from \"../v1/facilitator/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering SVM schemes to an x402Facilitator\n */\nexport interface SvmFacilitatorConfig {\n  /**\n   * The SVM signer for facilitator operations\n   */\n  signer: FacilitatorSvmSigner;\n\n  /**\n   * Networks to register (single network or array of networks)\n   * Examples: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\", [\"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\", \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\"]\n   */\n  networks: Network | Network[];\n}\n\n/**\n * Registers SVM payment schemes to an existing x402Facilitator instance.\n *\n * @param facilitator - The x402Facilitator instance to register schemes to\n * @param config - Configuration for SVM facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * // Single network\n * registerExactSvmScheme(facilitator, {\n *   signer: svmSigner,\n *   networks: \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\"  // Devnet\n * });\n *\n * // Multiple networks (will auto-derive solana:* pattern)\n * registerExactSvmScheme(facilitator, {\n *   signer: svmSigner,\n *   networks: [\"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\", \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\"]\n * });\n * ```\n */\nexport function registerExactSvmScheme(\n  facilitator: x402Facilitator,\n  config: SvmFacilitatorConfig,\n): x402Facilitator {\n  // Share a single settlement cache across V1 and V2 so that a duplicate\n  // transaction submitted through one protocol version is also caught by the other.\n  const settlementCache = new SettlementCache();\n\n  // Register V2 scheme with specified networks\n  facilitator.register(config.networks, new ExactSvmScheme(config.signer, settlementCache));\n\n  // Register all V1 networks\n  facilitator.registerV1(\n    NETWORKS as Network[],\n    new ExactSvmSchemeV1(config.signer, settlementCache),\n  );\n\n  return facilitator;\n}\n"],"mappings":"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","names":[]}