{"version":3,"sources":["../../src/facilitator/facilitator.ts","../../src/facilitator/anyspend.ts"],"sourcesContent":["import { verify as verifyExactEvm, settle as settleExactEvm } from \"../schemes/exact/evm\";\nimport { verify as verifyExactSvm, settle as settleExactSvm } from \"../schemes/exact/svm\";\nimport { SupportedEVMNetworks, SupportedSVMNetworks } from \"../types/shared\";\nimport { X402Config } from \"../types/config\";\nimport {\n  ConnectedClient as EvmConnectedClient,\n  SignerWallet as EvmSignerWallet,\n} from \"../types/shared/evm\";\nimport { ConnectedClient, Signer } from \"../types/shared/wallet\";\nimport {\n  PaymentPayload,\n  PaymentRequirements,\n  SettleResponse,\n  VerifyResponse,\n  ExactEvmPayload,\n} from \"../types/verify\";\nimport { Chain, Transport, Account } from \"viem\";\nimport { TransactionSigner } from \"@solana/kit\";\n\n/**\n * Verifies a payment payload against the required payment details regardless of the scheme\n * this function wraps all verify functions for each specific scheme\n *\n * @param client - The public client used for blockchain interactions\n * @param payload - The signed payment payload containing transfer parameters and signature\n * @param paymentRequirements - The payment requirements that the payload must satisfy\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A ValidPaymentRequest indicating if the payment is valid and any invalidation reason\n */\nexport async function verify<\n  transport extends Transport,\n  chain extends Chain,\n  account extends Account | undefined,\n>(\n  client: ConnectedClient | Signer,\n  payload: PaymentPayload,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n): Promise<VerifyResponse> {\n  // exact scheme\n  if (paymentRequirements.scheme === \"exact\") {\n    // evm\n    if (SupportedEVMNetworks.includes(paymentRequirements.network)) {\n      return verifyExactEvm(\n        client as EvmConnectedClient<transport, chain, account>,\n        payload,\n        paymentRequirements,\n      );\n    }\n\n    // svm\n    if (SupportedSVMNetworks.includes(paymentRequirements.network)) {\n      return await verifyExactSvm(\n        client as TransactionSigner,\n        payload,\n        paymentRequirements,\n        config,\n      );\n    }\n  }\n\n  // unsupported scheme\n  return {\n    isValid: false,\n    invalidReason: \"invalid_scheme\",\n    payer: SupportedEVMNetworks.includes(paymentRequirements.network)\n      ? (payload.payload as ExactEvmPayload).authorization.from\n      : \"\",\n  };\n}\n\n/**\n * Settles a payment payload against the required payment details regardless of the scheme\n * this function wraps all settle functions for each specific scheme\n *\n * @param client - The signer wallet used for blockchain interactions\n * @param payload - The signed payment payload containing transfer parameters and signature\n * @param paymentRequirements - The payment requirements that the payload must satisfy\n * @param config - Optional configuration for X402 operations (e.g., custom RPC URLs)\n * @returns A SettleResponse indicating if the payment is settled and any settlement reason\n */\nexport async function settle<transport extends Transport, chain extends Chain>(\n  client: Signer,\n  payload: PaymentPayload,\n  paymentRequirements: PaymentRequirements,\n  config?: X402Config,\n): Promise<SettleResponse> {\n  // exact scheme\n  if (paymentRequirements.scheme === \"exact\") {\n    // evm\n    if (SupportedEVMNetworks.includes(paymentRequirements.network)) {\n      return await settleExactEvm(\n        client as EvmSignerWallet<chain, transport>,\n        payload,\n        paymentRequirements,\n      );\n    }\n\n    // svm\n    if (SupportedSVMNetworks.includes(paymentRequirements.network)) {\n      return await settleExactSvm(\n        client as TransactionSigner,\n        payload,\n        paymentRequirements,\n        config,\n      );\n    }\n  }\n\n  return {\n    success: false,\n    errorReason: \"invalid_scheme\",\n    transaction: \"\",\n    network: paymentRequirements.network,\n    payer: SupportedEVMNetworks.includes(paymentRequirements.network)\n      ? (payload.payload as ExactEvmPayload).authorization.from\n      : \"\",\n  };\n}\n\nexport type Supported = {\n  x402Version: number;\n  kind: {\n    scheme: string;\n    networkId: string;\n    extra: object;\n  }[];\n};\n","import { generateJwt } from \"@coinbase/cdp-sdk/auth\";\nimport { FacilitatorConfig } from \"../types\";\nimport { CreateHeaders } from \"../verify\";\n\nconst ANYSPEND_FACILITATOR_BASE_URL = \"https://mainnet.anyspend.com\";\nconst ANYSPEND_FACILITATOR_ROUTE = \"/x402\";\n\nconst COINBASE_FACILITATOR_BASE_URL = \"https://api.cdp.coinbase.com\";\nconst COINBASE_FACILITATOR_V2_ROUTE = \"/platform/v2/x402\";\n\nconst X402_SDK_VERSION = \"0.7.1\";\nconst CDP_SDK_VERSION = \"1.29.0\";\n\n/**\n * Creates an authorization header for a request to the Coinbase API.\n *\n * @param apiKeyId - The api key ID\n * @param apiKeySecret - The api key secret\n * @param requestMethod - The method for the request (e.g. 'POST')\n * @param requestHost - The host for the request (e.g. 'https://x402.org/facilitator')\n * @param requestPath - The path for the request (e.g. '/verify')\n * @returns The authorization header string\n */\nexport async function createAuthHeader(\n  apiKeyId: string,\n  apiKeySecret: string,\n  requestMethod: string,\n  requestHost: string,\n  requestPath: string,\n) {\n  const jwt = await generateJwt({\n    apiKeyId,\n    apiKeySecret,\n    requestMethod,\n    requestHost,\n    requestPath,\n  });\n  return `Bearer ${jwt}`;\n}\n\n/**\n * Creates a correlation header for a request to the Coinbase API.\n *\n * @returns The correlation header string\n */\nexport function createCorrelationHeader(): string {\n  const data: Record<string, string> = {\n    sdk_version: CDP_SDK_VERSION,\n    sdk_language: \"typescript\",\n    source: \"x402\",\n    source_version: X402_SDK_VERSION,\n  };\n  return Object.keys(data)\n    .map(key => `${key}=${encodeURIComponent(data[key])}`)\n    .join(\",\");\n}\n\n/**\n * Creates a CDP auth header for the facilitator service\n *\n * @param apiKeyId - The CDP API key ID\n * @param apiKeySecret - The CDP API key secret\n * @returns A function that returns the auth headers\n */\nexport function createCdpAuthHeaders(apiKeyId?: string, apiKeySecret?: string): CreateHeaders {\n  const requestHost = COINBASE_FACILITATOR_BASE_URL.replace(\"https://\", \"\");\n\n  return async () => {\n    apiKeyId = apiKeyId ?? process.env.CDP_API_KEY_ID;\n    apiKeySecret = apiKeySecret ?? process.env.CDP_API_KEY_SECRET;\n\n    const headers = {\n      verify: {\n        \"Correlation-Context\": createCorrelationHeader(),\n      } as Record<string, string>,\n      settle: {\n        \"Correlation-Context\": createCorrelationHeader(),\n      } as Record<string, string>,\n      supported: {\n        \"Correlation-Context\": createCorrelationHeader(),\n      } as Record<string, string>,\n      list: {\n        \"Correlation-Context\": createCorrelationHeader(),\n      },\n    };\n\n    if (apiKeyId && apiKeySecret) {\n      headers.verify.Authorization = await createAuthHeader(\n        apiKeyId,\n        apiKeySecret,\n        \"POST\",\n        requestHost,\n        `${COINBASE_FACILITATOR_V2_ROUTE}/verify`,\n      );\n      headers.settle.Authorization = await createAuthHeader(\n        apiKeyId,\n        apiKeySecret,\n        \"POST\",\n        requestHost,\n        `${COINBASE_FACILITATOR_V2_ROUTE}/settle`,\n      );\n      headers.supported.Authorization = await createAuthHeader(\n        apiKeyId,\n        apiKeySecret,\n        \"GET\",\n        requestHost,\n        `${COINBASE_FACILITATOR_V2_ROUTE}/supported`,\n      );\n    }\n\n    return headers;\n  };\n}\n\n/**\n * Creates a facilitator config for the Coinbase CDP X402 facilitator\n *\n * @param apiKeyId - The CDP API key ID\n * @param apiKeySecret - The CDP API key secret\n * @returns A facilitator config for CDP\n */\nexport function createCdpFacilitatorConfig(\n  apiKeyId?: string,\n  apiKeySecret?: string,\n): FacilitatorConfig {\n  return {\n    url: `${COINBASE_FACILITATOR_BASE_URL}${COINBASE_FACILITATOR_V2_ROUTE}`,\n    createAuthHeaders: createCdpAuthHeaders(apiKeyId, apiKeySecret),\n  };\n}\n\n/**\n * Creates a facilitator config for the AnySpend X402 facilitator\n * AnySpend does not require authentication headers\n *\n * @returns A facilitator config for AnySpend\n */\nexport function createFacilitatorConfig(): FacilitatorConfig {\n  return {\n    url: `${ANYSPEND_FACILITATOR_BASE_URL}${ANYSPEND_FACILITATOR_ROUTE}`,\n  };\n}\n\n/**\n * Default facilitator using AnySpend (no auth required)\n */\nexport const facilitator = createFacilitatorConfig();\n\n/**\n * CDP facilitator (requires CDP API keys)\n */\nexport const cdpFacilitator = createCdpFacilitatorConfig();\n"],"mappings":"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","names":["verify","settle"]}