{"version":3,"sources":["../src/types/x402-protocol.ts","../src/utils/helpers.ts","../src/client/transaction-builder.ts","../src/client/payment-interceptor.ts","../src/client/index.ts","../src/server/facilitator-client.ts","../src/server/payment-handler.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Network } from \"@payai/x402/types\";\n\n/**\n * Solana-specific x402 Protocol Types (v2)\n * These are Solana-only variants of x402 protocol types\n */\n\n// CAIP-2 network identifiers for Solana\nexport const SOLANA_MAINNET_CAIP2 =\n  \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\" as const;\nexport const SOLANA_DEVNET_CAIP2 =\n  \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\" as const;\n\n/**\n * Solana network type - supports both simple and CAIP-2 formats\n * Simple: \"solana\" | \"solana-devnet\" (for user-facing config)\n * CAIP-2: \"solana:chainId\" (used in protocol)\n */\nexport type SolanaNetworkSimple = \"solana\" | \"solana-devnet\";\nexport type SolanaNetworkCAIP2 =\n  | typeof SOLANA_MAINNET_CAIP2\n  | typeof SOLANA_DEVNET_CAIP2;\nexport type SolanaNetwork = SolanaNetworkSimple | SolanaNetworkCAIP2;\n\n/**\n * Check if a network string is a Solana network (any format)\n */\nexport function isSolanaNetwork(network: string): network is SolanaNetwork {\n  return (\n    network === \"solana\" ||\n    network === \"solana-devnet\" ||\n    network.startsWith(\"solana:\")\n  );\n}\n\n/**\n * Check if network is mainnet\n */\nexport function isSolanaMainnet(network: string): boolean {\n  return network === \"solana\" || network === SOLANA_MAINNET_CAIP2;\n}\n\n/**\n * Check if network is devnet\n */\nexport function isSolanaDevnet(network: string): boolean {\n  return network === \"solana-devnet\" || network === SOLANA_DEVNET_CAIP2;\n}\n\n/**\n * Convert simple network name to CAIP-2 format\n */\nexport function toCAIP2Network(network: SolanaNetworkSimple): Network {\n  switch (network) {\n    case \"solana\":\n      return SOLANA_MAINNET_CAIP2;\n    case \"solana-devnet\":\n      return SOLANA_DEVNET_CAIP2;\n  }\n}\n\n/**\n * Convert CAIP-2 network to simple name (for display/config)\n */\nexport function toSimpleNetwork(network: string): SolanaNetworkSimple {\n  if (network === SOLANA_MAINNET_CAIP2 || network === \"solana\") {\n    return \"solana\";\n  }\n  return \"solana-devnet\";\n}\n","import type { VersionedTransaction } from \"@solana/web3.js\";\nimport type { PaymentRequirements, PaymentPayload } from \"@payai/x402/types\";\nimport {\n  type TokenAsset,\n  SOLANA_MAINNET_CAIP2,\n  SOLANA_DEVNET_CAIP2,\n  isSolanaMainnet,\n} from \"../types\";\n\n/**\n * Helper utilities for x402 payment processing (v2)\n */\n\n// USDC token addresses\nconst USDC_MAINNET = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst USDC_DEVNET = \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\";\n\n/**\n * Create v2 payment payload from a signed transaction\n * Encodes transaction and payment details for PAYMENT-SIGNATURE header\n *\n * @param transaction - Signed Solana VersionedTransaction\n * @param paymentRequirements - The accepted payment requirements\n * @param resourceUrl - URL of the protected resource\n * @returns Base64-encoded payment payload for PAYMENT-SIGNATURE header\n */\nexport function createPaymentPayload(\n  transaction: VersionedTransaction,\n  paymentRequirements: PaymentRequirements,\n  resourceUrl: string,\n): string {\n  // Serialize the signed transaction to base64\n  const base64Transaction = Buffer.from(transaction.serialize()).toString(\n    \"base64\",\n  );\n\n  // Create v2 payment payload\n  const paymentPayload: PaymentPayload = {\n    x402Version: 2,\n    resource: {\n      url: resourceUrl,\n      description: (paymentRequirements.extra?.description as string) || \"\",\n      mimeType:\n        (paymentRequirements.extra?.mimeType as string) || \"application/json\",\n    },\n    accepted: paymentRequirements,\n    payload: {\n      transaction: base64Transaction,\n    },\n  };\n\n  // Encode payment payload as base64 for PAYMENT-SIGNATURE header\n  const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');\n\n  return paymentHeader;\n}\n\n/**\n * Create v1 payment payload from a signed transaction\n * Encodes transaction for X-PAYMENT header (v1 format)\n *\n * @param transaction - Signed Solana VersionedTransaction\n * @param paymentRequirements - The accepted payment requirements\n * @returns Base64-encoded payment payload for X-PAYMENT header\n */\nexport function createPaymentPayloadV1(\n  transaction: VersionedTransaction,\n  paymentRequirements: PaymentRequirements\n): string {\n  // Serialize the signed transaction to base64\n  const base64Transaction = Buffer.from(transaction.serialize()).toString('base64');\n\n  // Create v1 payment payload (simpler format)\n  const paymentPayload = {\n    x402Version: 1,\n    scheme: paymentRequirements.scheme,\n    network: paymentRequirements.network,\n    payload: {\n      transaction: base64Transaction,\n    },\n  };\n\n  // Encode payment payload as base64 for X-PAYMENT header\n  const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString(\n    \"base64\",\n  );\n\n  return paymentHeader;\n}\n\n/**\n * Get default RPC URL for a given Solana network\n * @param network - Network in any format (simple or CAIP-2)\n * @returns Default RPC URL for the network\n */\nexport function getDefaultRpcUrl(network: string): string {\n  if (isSolanaMainnet(network)) {\n    return \"https://api.mainnet-beta.solana.com\";\n  }\n  return \"https://api.devnet.solana.com\";\n}\n\n/**\n * Get RPC URL for a CAIP-2 network identifier\n * @param network - Network in CAIP-2 format (e.g., \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\")\n * @returns RPC URL for the network\n */\nexport function getRpcUrlForNetwork(network: string): string {\n  if (network === SOLANA_MAINNET_CAIP2) {\n    return \"https://api.mainnet-beta.solana.com\";\n  }\n  if (network === SOLANA_DEVNET_CAIP2) {\n    return \"https://api.devnet.solana.com\";\n  }\n  // Fallback for unknown networks\n  return \"https://api.devnet.solana.com\";\n}\n\n/**\n * Get default USDC token asset for a given Solana network\n * @param network - Network in any format (simple or CAIP-2)\n * @returns USDC token asset configuration\n */\nexport function getDefaultTokenAsset(network: string): TokenAsset {\n  if (isSolanaMainnet(network)) {\n    return {\n      address: USDC_MAINNET,\n      decimals: 6,\n    };\n  }\n  return {\n    address: USDC_DEVNET,\n    decimals: 6,\n  };\n}\n\n/**\n * Convert human-readable amount to token's smallest unit (atomic units)\n * @param amount - Human-readable amount (e.g., 2.5 for 2.5 USDC)\n * @param decimals - Token decimals (e.g., 6 for USDC, 9 for SOL)\n * @returns Amount in atomic units as string\n */\nexport function toAtomicUnits(amount: number, decimals: number): string {\n  return Math.floor(amount * Math.pow(10, decimals)).toString();\n}\n\n/**\n * Convert token's atomic units to human-readable amount\n * @param atomicUnits - Token amount in smallest units (as string or bigint)\n * @param decimals - Token decimals (e.g., 6 for USDC, 9 for SOL)\n * @returns Human-readable amount\n */\nexport function fromAtomicUnits(\n  atomicUnits: string | bigint | number,\n  decimals: number,\n): number {\n  return Number(atomicUnits) / Math.pow(10, decimals);\n}\n","import {\n  PublicKey,\n  Connection,\n  TransactionMessage,\n  VersionedTransaction,\n  ComputeBudgetProgram,\n  type TransactionInstruction,\n} from \"@solana/web3.js\";\nimport {\n  getAssociatedTokenAddress,\n  createTransferCheckedInstruction,\n  getMint,\n  TOKEN_PROGRAM_ID,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport type { PaymentRequirements } from \"@payai/x402/types\";\nimport type { WalletAdapter } from \"../types\";\n\n// Constants for compute budget\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 20_000; // Sufficient for SPL token transfer\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1; // Minimal price\n\n/**\n * Build and sign a Solana transaction for x402 payment (v2)\n *\n * @param wallet - Wallet adapter for signing\n * @param paymentRequirements - Payment requirements from server\n * @param rpcUrl - Solana RPC URL\n * @returns Signed VersionedTransaction ready to be serialized\n */\nexport async function createSolanaPaymentTransaction(\n  wallet: WalletAdapter,\n  paymentRequirements: PaymentRequirements,\n  rpcUrl: string,\n): Promise<VersionedTransaction> {\n  const connection = new Connection(rpcUrl, \"confirmed\");\n\n  // Extract fee payer from payment requirements\n  const feePayer = paymentRequirements.extra?.feePayer as string | undefined;\n  if (!feePayer) {\n    throw new Error(\n      \"Missing facilitator feePayer in payment requirements (extra.feePayer).\",\n    );\n  }\n  const feePayerPubkey = new PublicKey(feePayer);\n\n  // Get wallet address - support both Anza wallet-adapter (publicKey) and custom implementations (address)\n  const walletAddress = wallet?.publicKey?.toString() || wallet?.address;\n  if (!walletAddress) {\n    throw new Error(\"Missing connected Solana wallet address or publicKey\");\n  }\n  const userPubkey = new PublicKey(walletAddress);\n\n  // Get destination (payTo)\n  if (!paymentRequirements.payTo) {\n    throw new Error(\"Missing payTo in payment requirements\");\n  }\n  const destination = new PublicKey(paymentRequirements.payTo);\n\n  // Get token mint\n  if (!paymentRequirements.asset) {\n    throw new Error(\"Missing token mint for SPL transfer\");\n  }\n  const mintPubkey = new PublicKey(paymentRequirements.asset);\n\n  const instructions: TransactionInstruction[] = [];\n\n  // The facilitator REQUIRES ComputeBudget instructions in positions 0 and 1\n  instructions.push(\n    ComputeBudgetProgram.setComputeUnitLimit({\n      units: DEFAULT_COMPUTE_UNIT_LIMIT,\n    }),\n  );\n\n  instructions.push(\n    ComputeBudgetProgram.setComputeUnitPrice({\n      microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n    }),\n  );\n\n  // Determine program (token vs token-2022) by reading mint owner\n  const mintInfo = await connection.getAccountInfo(mintPubkey, \"confirmed\");\n  const programId =\n    mintInfo?.owner?.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n      ? TOKEN_2022_PROGRAM_ID\n      : TOKEN_PROGRAM_ID;\n\n  // Fetch mint to get decimals\n  const mint = await getMint(connection, mintPubkey, undefined, programId);\n\n  // Derive source and destination ATAs\n  const sourceAta = await getAssociatedTokenAddress(\n    mintPubkey,\n    userPubkey,\n    false,\n    programId,\n  );\n  const destinationAta = await getAssociatedTokenAddress(\n    mintPubkey,\n    destination,\n    false,\n    programId,\n  );\n\n  // Check if source ATA exists (user must already have token account)\n  const sourceAtaInfo = await connection.getAccountInfo(sourceAta, \"confirmed\");\n  if (!sourceAtaInfo) {\n    throw new Error(\n      `User does not have an Associated Token Account for ${paymentRequirements.asset}. Please create one first or ensure you have the required token.`,\n    );\n  }\n\n  // Check if destination ATA exists (receiver must already have token account)\n  const destAtaInfo = await connection.getAccountInfo(\n    destinationAta,\n    \"confirmed\",\n  );\n  if (!destAtaInfo) {\n    throw new Error(\n      `Destination does not have an Associated Token Account for ${paymentRequirements.asset}. The receiver must create their token account before receiving payments.`,\n    );\n  }\n\n  // Get payment amount - v2 uses `amount`, support legacy `maxAmountRequired` for compatibility\n  const amountStr =\n    paymentRequirements.amount ||\n    (paymentRequirements as unknown as { maxAmountRequired?: string })\n      .maxAmountRequired;\n\n  if (!amountStr) {\n    throw new Error(\"Missing amount in payment requirements\");\n  }\n  const amount = BigInt(amountStr);\n\n  // TransferChecked instruction\n  instructions.push(\n    createTransferCheckedInstruction(\n      sourceAta,\n      mintPubkey,\n      destinationAta,\n      userPubkey,\n      amount,\n      mint.decimals,\n      [],\n      programId,\n    ),\n  );\n\n  // Get recent blockhash\n  const { blockhash } = await connection.getLatestBlockhash(\"confirmed\");\n\n  const message = new TransactionMessage({\n    payerKey: feePayerPubkey,\n    recentBlockhash: blockhash,\n    instructions,\n  }).compileToV0Message();\n\n  // Create transaction\n  const transaction = new VersionedTransaction(message);\n\n  // Sign with user's wallet\n  if (typeof wallet?.signTransaction !== \"function\") {\n    throw new Error(\"Connected wallet does not support signTransaction\");\n  }\n\n  const userSignedTx = await wallet.signTransaction(transaction);\n\n  return userSignedTx;\n}\n","import type { PaymentRequirements, PaymentRequired } from \"@payai/x402/types\";\nimport { safeBase64Decode } from \"@payai/x402/utils\";\nimport type { WalletAdapter } from \"../types\";\nimport { isSolanaNetwork } from \"../types\";\nimport { createSolanaPaymentTransaction } from \"./transaction-builder\";\nimport { createPaymentPayload, createPaymentPayloadV1 } from \"../utils\";\n\n/**\n * x402 Response structure (v1 body format)\n */\ninterface X402ResponseV1 extends PaymentRequired {\n  accepts: PaymentRequirements[];\n}\n\n/**\n * Decode a base64-encoded PAYMENT-REQUIRED header\n */\nfunction decodePaymentRequiredHeader(header: string): PaymentRequired {\n  const decoded = safeBase64Decode(header);\n  return JSON.parse(decoded) as PaymentRequired;\n}\n\n/**\n * Create a custom fetch function that automatically handles x402 payments (v2)\n *\n * @param fetchFn - Base fetch function to use\n * @param wallet - Wallet adapter for signing transactions\n * @param rpcUrl - Solana RPC URL\n * @param maxValue - Maximum payment amount in atomic units (0 = no limit)\n * @param verbose - Enable verbose logging (default: false)\n * @returns Wrapped fetch function with automatic payment handling\n */\nexport function createPaymentFetch(\n  fetchFn: typeof fetch,\n  wallet: WalletAdapter,\n  rpcUrl: string,\n  maxValue: bigint = BigInt(0),\n  verbose: boolean = false,\n) {\n  const log = (...args: unknown[]) => {\n    if (verbose) console.log(\"[x402-solana]\", ...args);\n  };\n\n  return async (input: RequestInfo, init?: RequestInit): Promise<Response> => {\n    const url = typeof input === \"string\" ? input : input.url;\n    log(\"Making initial request to:\", url);\n\n    // Make initial request\n    const response = await fetchFn(input, init);\n    log(\"Initial response status:\", response.status);\n\n    // If not 402, return as-is\n    if (response.status !== 402) {\n      return response;\n    }\n\n    log(\"Got 402, parsing payment requirements...\");\n\n    // Parse payment requirements from 402 response\n    // v2: Read from PAYMENT-REQUIRED header (base64-encoded)\n    // v1 fallback: Read from response body\n    let paymentRequired: PaymentRequired;\n    let protocolVersion: 1 | 2;\n\n    const paymentRequiredHeader = response.headers.get(\"PAYMENT-REQUIRED\");\n    if (paymentRequiredHeader) {\n      // v2: Decode from header\n      log(\"Found PAYMENT-REQUIRED header (v2 protocol)\");\n      paymentRequired = decodePaymentRequiredHeader(paymentRequiredHeader);\n      protocolVersion = 2;\n    } else {\n      // v1 fallback: Parse from body\n      log(\"No PAYMENT-REQUIRED header, falling back to body (v1 protocol)\");\n      const rawResponse = (await response.json()) as X402ResponseV1;\n      paymentRequired = rawResponse;\n      protocolVersion = 1;\n    }\n\n    log(\"Payment requirements:\", JSON.stringify(paymentRequired, null, 2));\n    log(\"Protocol version:\", protocolVersion);\n\n    const parsedPaymentRequirements: PaymentRequirements[] =\n      paymentRequired.accepts || [];\n\n    // Select first suitable payment requirement for Solana\n    // Supports both simple format (\"solana\", \"solana-devnet\") and CAIP-2 format (\"solana:chainId\")\n    const selectedRequirements = parsedPaymentRequirements.find(\n      (req: PaymentRequirements) =>\n        req.scheme === \"exact\" && isSolanaNetwork(req.network),\n    );\n\n    if (!selectedRequirements) {\n      console.error(\n        \"❌ No suitable Solana payment requirements found. Available networks:\",\n        parsedPaymentRequirements.map((req) => req.network),\n      );\n      throw new Error(\"No suitable Solana payment requirements found\");\n    }\n\n    // Check amount against max value if specified\n    // v2 uses `amount`, but we also support legacy `maxAmountRequired` for backwards compatibility\n    const paymentAmount = BigInt(\n      selectedRequirements.amount ||\n        (selectedRequirements as unknown as { maxAmountRequired?: string })\n          .maxAmountRequired ||\n        \"0\",\n    );\n\n    if (maxValue > BigInt(0) && paymentAmount > maxValue) {\n      throw new Error(\"Payment amount exceeds maximum allowed\");\n    }\n\n    // Get the resource URL for the payment payload\n    const resourceUrl = typeof input === \"string\" ? input : input.url;\n\n    log(\"Creating signed transaction...\");\n\n    // Create signed transaction\n    const signedTransaction = await createSolanaPaymentTransaction(\n      wallet,\n      selectedRequirements,\n      rpcUrl,\n    );\n    log(\"Transaction signed successfully\");\n\n    // Create payment payload based on protocol version\n    let paymentHeader: string;\n    let headerName: string;\n\n    if (protocolVersion === 2) {\n      // v2: Use PAYMENT-SIGNATURE header with full payload\n      paymentHeader = createPaymentPayload(\n        signedTransaction,\n        selectedRequirements,\n        resourceUrl,\n      );\n      headerName = \"PAYMENT-SIGNATURE\";\n    } else {\n      // v1: Use X-PAYMENT header with simpler payload\n      paymentHeader = createPaymentPayloadV1(\n        signedTransaction,\n        selectedRequirements,\n      );\n      headerName = \"X-PAYMENT\";\n    }\n\n    log(\"Payment header created, length:\", paymentHeader.length);\n    log(\"Using header:\", headerName);\n\n    // Retry with appropriate payment header\n    const newInit = {\n      ...init,\n      headers: {\n        ...(init?.headers || {}),\n        [headerName]: paymentHeader,\n      },\n    };\n\n    log(`Retrying request with ${headerName} header...`);\n    const retryResponse = await fetchFn(input, newInit);\n    log(\"Retry response status:\", retryResponse.status);\n\n    return retryResponse;\n  };\n}\n","import type { X402ClientConfig } from \"../types\";\nimport { getDefaultRpcUrl } from \"../utils\";\nimport { createPaymentFetch } from \"./payment-interceptor\";\n\n/**\n * x402 Solana Client (v2)\n * Handles automatic payment for x402-protected endpoints\n */\nexport class X402Client {\n  private paymentFetch: ReturnType<typeof createPaymentFetch>;\n\n  constructor(config: X402ClientConfig) {\n    const rpcUrl = config.rpcUrl || getDefaultRpcUrl(config.network);\n\n    // Use custom fetch if provided, otherwise use native fetch\n    // globalThis.fetch works in both browser and Node.js (18+)\n    const fetchFn = config.customFetch || globalThis.fetch.bind(globalThis);\n\n    this.paymentFetch = createPaymentFetch(\n      fetchFn,\n      config.wallet,\n      rpcUrl,\n      config.amount || BigInt(0),\n      config.verbose || false,\n    );\n  }\n\n  /**\n   * Make a fetch request with automatic x402 payment handling.\n   * If a customFetch was provided in the config, it will be used for all requests.\n   */\n  async fetch(input: RequestInfo, init?: RequestInit): Promise<Response> {\n    return this.paymentFetch(input, init);\n  }\n}\n\n/**\n * Create an x402 client instance\n */\nexport function createX402Client(config: X402ClientConfig): X402Client {\n  return new X402Client(config);\n}\n\n// Re-export types for convenience\nexport type { X402ClientConfig, WalletAdapter } from \"../types\";\n","import type {\n  PaymentRequirements,\n  PaymentPayload,\n  VerifyResponse,\n  SettleResponse,\n  SupportedResponse,\n} from '@payai/x402/types';\nimport { getOrGenerateJwt } from '@payai/facilitator';\nimport { isSolanaNetwork } from '../types';\n\n/**\n * Facilitator supported kind (from /supported endpoint)\n */\ninterface SupportedKind {\n  x402Version: number;\n  scheme: string;\n  network: string;\n  extra?: {\n    feePayer?: string;\n    [key: string]: unknown;\n  };\n}\n\n/**\n * Configuration for the facilitator client\n */\ninterface FacilitatorClientConfig {\n  url: string;\n  /** PayAI API Key ID for JWT auth */\n  apiKeyId?: string | undefined;\n  /** PayAI API Key Secret for JWT auth */\n  apiKeySecret?: string | undefined;\n}\n\n/**\n * Client for communicating with x402 facilitator service (v2).\n *\n * When `apiKeyId` and `apiKeySecret` are provided, all requests are\n * automatically authenticated with a JWT Bearer token (cached and refreshed).\n */\nexport class FacilitatorClient {\n  private readonly facilitatorUrl: string;\n  private readonly apiKeyId: string | undefined;\n  private readonly apiKeySecret: string | undefined;\n\n  constructor(config: FacilitatorClientConfig) {\n    this.facilitatorUrl = config.url;\n    this.apiKeyId = config.apiKeyId;\n    this.apiKeySecret = config.apiKeySecret;\n  }\n\n  /**\n   * Build auth headers when API keys are configured.\n   * Returns an empty object when no keys are present.\n   */\n  private async getAuthHeaders(): Promise<Record<string, string>> {\n    if (!this.apiKeyId || !this.apiKeySecret) {\n      return {};\n    }\n\n    const jwt = await getOrGenerateJwt({\n      apiKeyId: this.apiKeyId,\n      apiKeySecret: this.apiKeySecret,\n    });\n\n    return { Authorization: `Bearer ${jwt}` };\n  }\n\n  /**\n   * Get supported payment kinds from facilitator\n   */\n  async getSupported(): Promise<SupportedResponse> {\n    const authHeaders = await this.getAuthHeaders();\n\n    const response = await fetch(`${this.facilitatorUrl}/supported`, {\n      headers: { ...authHeaders },\n    });\n\n    if (!response.ok) {\n      throw new Error(`Facilitator /supported returned ${response.status}`);\n    }\n    return response.json();\n  }\n\n  /**\n   * Get fee payer address for a Solana network\n   * @param network - Network in any format (simple or CAIP-2)\n   */\n  async getFeePayer(network: string): Promise<string> {\n    const supportedData = await this.getSupported();\n\n    // Look for network support - match by CAIP-2 prefix for Solana networks\n    const networkSupport = (supportedData.kinds as SupportedKind[])?.find(\n      kind =>\n        kind.scheme === 'exact' &&\n        isSolanaNetwork(kind.network) &&\n        isSolanaNetwork(network) &&\n        // Match if both are same network type (mainnet or devnet)\n        (kind.network.includes('devnet') === network.includes('devnet') || kind.network === network)\n    );\n\n    if (!networkSupport?.extra?.feePayer) {\n      throw new Error(\n        `Facilitator does not support network \"${network}\" with scheme \"exact\" or feePayer not provided`\n      );\n    }\n\n    return networkSupport.extra.feePayer;\n  }\n\n  /**\n   * Verify payment with facilitator\n   * @returns VerifyResponse with isValid and optional invalidReason\n   */\n  async verifyPayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements\n  ): Promise<VerifyResponse> {\n    try {\n      // Decode the base64 payment payload\n      const paymentPayload: PaymentPayload = JSON.parse(\n        Buffer.from(paymentHeader, 'base64').toString('utf8')\n      );\n\n      const verifyPayload = {\n        paymentPayload,\n        paymentRequirements,\n      };\n\n      const authHeaders = await this.getAuthHeaders();\n\n      const response = await fetch(`${this.facilitatorUrl}/verify`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...authHeaders,\n        },\n        body: JSON.stringify(verifyPayload),\n      });\n\n      if (!response.ok) {\n        const errorBody = await response.text();\n        console.error(`Facilitator /verify returned ${response.status}:`, errorBody);\n        return {\n          isValid: false,\n          invalidReason: 'unexpected_verify_error',\n        };\n      }\n\n      // Facilitator returns VerifyResponse with status 200 even when validation fails\n      const facilitatorResponse: VerifyResponse = await response.json();\n      return facilitatorResponse;\n    } catch (error) {\n      console.error('Payment verification failed:', error);\n      return {\n        isValid: false,\n        invalidReason: 'unexpected_verify_error',\n      };\n    }\n  }\n\n  /**\n   * Settle payment with facilitator\n   * @returns SettleResponse with success status and optional errorReason\n   */\n  async settlePayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements\n  ): Promise<SettleResponse> {\n    try {\n      // Decode the base64 payment payload\n      const paymentPayload: PaymentPayload = JSON.parse(\n        Buffer.from(paymentHeader, 'base64').toString('utf8')\n      );\n\n      const settlePayload = {\n        paymentPayload,\n        paymentRequirements,\n      };\n\n      const authHeaders = await this.getAuthHeaders();\n\n      const response = await fetch(`${this.facilitatorUrl}/settle`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...authHeaders,\n        },\n        body: JSON.stringify(settlePayload),\n      });\n\n      if (!response.ok) {\n        const errorBody = await response.text();\n        console.error(`Facilitator /settle returned ${response.status}:`, errorBody);\n        return {\n          success: false,\n          errorReason: 'unexpected_settle_error',\n          transaction: '',\n          network: paymentRequirements.network,\n        };\n      }\n\n      // Facilitator returns SettleResponse with status 200 even when settlement fails\n      const facilitatorResponse: SettleResponse = await response.json();\n      return facilitatorResponse;\n    } catch (error) {\n      console.error('Payment settlement failed:', error);\n      return {\n        success: false,\n        errorReason: 'unexpected_settle_error',\n        transaction: '',\n        network: paymentRequirements.network,\n      };\n    }\n  }\n}\n","import type {\n  PaymentRequirements,\n  PaymentRequired,\n  VerifyResponse,\n  SettleResponse,\n  Network,\n} from '@payai/x402/types';\nimport type { X402ServerConfig, RouteConfig, TokenAsset } from '../types';\nimport { toCAIP2Network } from '../types';\nimport { getDefaultRpcUrl, getDefaultTokenAsset } from '../utils';\nimport { FacilitatorClient } from './facilitator-client';\n\n/**\n * Internal configuration with defaults resolved\n */\ninterface InternalConfig {\n  network: string; // CAIP-2 format\n  treasuryAddress: string;\n  facilitatorUrl: string;\n  rpcUrl: string;\n  defaultToken: TokenAsset;\n  defaultDescription: string;\n  defaultTimeoutSeconds: number;\n}\n\n/**\n * x402 Payment Handler for server-side payment processing (v2)\n * Framework agnostic - works with any Node.js HTTP framework\n */\nexport class X402PaymentHandler {\n  private facilitatorClient: FacilitatorClient;\n  private config: InternalConfig;\n\n  constructor(config: X402ServerConfig) {\n    const defaultToken = config.defaultToken || getDefaultTokenAsset(config.network);\n\n    this.config = {\n      network: toCAIP2Network(config.network),\n      treasuryAddress: config.treasuryAddress,\n      facilitatorUrl: config.facilitatorUrl,\n      rpcUrl: config.rpcUrl || getDefaultRpcUrl(config.network),\n      defaultToken,\n      defaultDescription: config.defaultDescription || 'Payment required',\n      defaultTimeoutSeconds: config.defaultTimeoutSeconds || 300,\n    };\n\n    this.facilitatorClient = new FacilitatorClient({\n      url: config.facilitatorUrl,\n      apiKeyId: config.apiKeyId,\n      apiKeySecret: config.apiKeySecret,\n    });\n  }\n\n  /**\n   * Extract payment header from request headers (v2)\n   * Pass in headers object from any framework (Next.js, Express, etc.)\n   *\n   * Note: v2 uses PAYMENT-SIGNATURE header (v1 used X-PAYMENT)\n   */\n  extractPayment(headers: Record<string, string | string[] | undefined> | Headers): string | null {\n    // Handle Headers object (Next.js, Fetch API)\n    if (headers instanceof Headers) {\n      // v2 header (PAYMENT-SIGNATURE)\n      return headers.get('PAYMENT-SIGNATURE') || headers.get('payment-signature');\n    }\n\n    // Handle plain object (Express, Fastify, etc.)\n    // v2 header (PAYMENT-SIGNATURE)\n    const paymentSignature = headers['PAYMENT-SIGNATURE'] || headers['payment-signature'];\n    return Array.isArray(paymentSignature) ? paymentSignature[0] || null : paymentSignature || null;\n  }\n\n  /**\n   * Create payment requirements for a protected resource\n   *\n   * @param routeConfig - Route-specific configuration\n   * @param resourceUrl - URL of the protected resource\n   * @returns Payment requirements object\n   */\n  async createPaymentRequirements(\n    routeConfig: RouteConfig,\n    resourceUrl: string\n  ): Promise<PaymentRequirements> {\n    // Get fee payer from facilitator\n    const feePayer = await this.facilitatorClient.getFeePayer(this.config.network);\n\n    const paymentRequirements: PaymentRequirements = {\n      scheme: 'exact',\n      network: this.config.network as Network,\n      amount: routeConfig.amount,\n      payTo: this.config.treasuryAddress,\n      maxTimeoutSeconds: routeConfig.maxTimeoutSeconds || this.config.defaultTimeoutSeconds,\n      asset: routeConfig.asset.address,\n      extra: {\n        feePayer,\n        description: routeConfig.description || this.config.defaultDescription,\n        mimeType: routeConfig.mimeType || 'application/json',\n        resource: resourceUrl,\n      },\n    };\n\n    return paymentRequirements;\n  }\n\n  /**\n   * Create a 402 Payment Required response body (v2)\n   * Use this with your framework's response method\n   *\n   * @param requirements - Payment requirements (from createPaymentRequirements)\n   * @param resourceUrl - URL of the protected resource\n   */\n  create402Response(\n    requirements: PaymentRequirements,\n    resourceUrl: string\n  ): {\n    status: 402;\n    body: PaymentRequired;\n  } {\n    return {\n      status: 402,\n      body: {\n        x402Version: 2,\n        resource: {\n          url: resourceUrl,\n          description: (requirements.extra?.description as string) || '',\n          mimeType: (requirements.extra?.mimeType as string) || 'application/json',\n        },\n        accepts: [requirements],\n        error: 'Payment required',\n      },\n    };\n  }\n\n  /**\n   * Verify payment with facilitator\n   * @returns VerifyResponse with isValid and optional invalidReason\n   */\n  async verifyPayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements\n  ): Promise<VerifyResponse> {\n    return this.facilitatorClient.verifyPayment(paymentHeader, paymentRequirements);\n  }\n\n  /**\n   * Settle payment with facilitator\n   * @returns SettleResponse with success status and optional errorReason\n   */\n  async settlePayment(\n    paymentHeader: string,\n    paymentRequirements: PaymentRequirements\n  ): Promise<SettleResponse> {\n    return this.facilitatorClient.settlePayment(paymentHeader, paymentRequirements);\n  }\n\n  /**\n   * Get the network in CAIP-2 format\n   */\n  getNetwork(): string {\n    return this.config.network;\n  }\n\n  /**\n   * Get the treasury address\n   */\n  getTreasuryAddress(): string {\n    return this.config.treasuryAddress;\n  }\n}\n"]}