{"version":3,"sources":["../../src/exact/client/eip3009.ts","../../src/exact/client/scheme.ts","../../src/exact/client/register.ts"],"sourcesContent":["import { PaymentRequirements, PaymentPayloadResult } from \"@x402/core/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce, getEvmChainId } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createEIP3009Payload(\n  signer: ClientEvmSigner,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n  const nonce = createNonce();\n  const now = Math.floor(Date.now() / 1000);\n\n  const authorization: ExactEIP3009Payload[\"authorization\"] = {\n    from: signer.address,\n    to: getAddress(paymentRequirements.payTo),\n    value: paymentRequirements.amount,\n    validAfter: \"0\",\n    validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n    nonce,\n  };\n\n  const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n  const payload: ExactEIP3009Payload = {\n    authorization,\n    signature,\n  };\n\n  return {\n    x402Version,\n    payload,\n  };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n  signer: ClientEvmSigner,\n  authorization: ExactEIP3009Payload[\"authorization\"],\n  requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n  const chainId = getEvmChainId(requirements.network);\n\n  if (!requirements.extra?.name || !requirements.extra?.version) {\n    throw new Error(\n      `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n    );\n  }\n\n  const { name, version } = requirements.extra;\n\n  const domain = {\n    name,\n    version,\n    chainId,\n    verifyingContract: getAddress(requirements.asset),\n  };\n\n  const message = {\n    from: getAddress(authorization.from),\n    to: getAddress(authorization.to),\n    value: BigInt(authorization.value),\n    validAfter: BigInt(authorization.validAfter),\n    validBefore: BigInt(authorization.validBefore),\n    nonce: authorization.nonce,\n  };\n\n  return await signer.signTypedData({\n    domain,\n    types: authorizationTypes,\n    primaryType: \"TransferWithAuthorization\",\n    message,\n  });\n}\n","import {\n  SchemeNetworkClient,\n  PaymentRequirements,\n  PaymentPayloadResult,\n  PaymentPayloadContext,\n} from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\nimport {\n  trySignEip2612PermitExtension,\n  trySignErc20ApprovalExtension,\n} from \"../../shared/extensions\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n *\n * When the server advertises `eip2612GasSponsoring` and the asset transfer\n * method is `permit2`, the scheme automatically signs an EIP-2612 permit\n * if the user lacks Permit2 approval. This requires `readContract` on the signer.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n  readonly scheme = \"exact\";\n\n  /**\n   * Creates a new ExactEvmClient instance.\n   *\n   * @param signer - The EVM signer for client operations.\n   *   Base flow only requires `address` + `signTypedData`.\n   *   Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally\n   *   requires optional capabilities like `readContract` and tx signing helpers.\n   * @param options - Optional RPC configuration used to backfill extension capabilities.\n   */\n  constructor(\n    private readonly signer: ClientEvmSigner,\n    private readonly options?: ExactEvmSchemeOptions,\n  ) {}\n\n  /**\n   * Creates a payment payload for the Exact scheme.\n   * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n   *\n   * For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the\n   * signer supports `readContract`, automatically signs an EIP-2612 permit\n   * when Permit2 allowance is insufficient.\n   *\n   * @param x402Version - The x402 protocol version\n   * @param paymentRequirements - The payment requirements\n   * @param context - Optional context with server-declared extensions\n   * @returns Promise resolving to a payment payload result (with optional extensions)\n   */\n  async createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n    context?: PaymentPayloadContext,\n  ): Promise<PaymentPayloadResult> {\n    const assetTransferMethod =\n      (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n    if (assetTransferMethod === \"permit2\") {\n      const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);\n\n      const eip2612Extensions = await trySignEip2612PermitExtension(\n        this.signer,\n        this.options,\n        paymentRequirements,\n        result,\n        context,\n      );\n\n      if (eip2612Extensions) {\n        return {\n          ...result,\n          extensions: eip2612Extensions,\n        };\n      }\n\n      const erc20Extensions = await trySignErc20ApprovalExtension(\n        this.signer,\n        this.options,\n        paymentRequirements,\n        context,\n      );\n      if (erc20Extensions) {\n        return {\n          ...result,\n          extensions: erc20Extensions,\n        };\n      }\n\n      return result;\n    }\n\n    return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n  }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@x402/core/client\";\nimport { Network } from \"@x402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n  /**\n   * The EVM signer to use for creating payment payloads\n   */\n  signer: ClientEvmSigner;\n\n  /**\n   * Optional payment requirements selector function\n   * If not provided, uses the default selector (first available option)\n   */\n  paymentRequirementsSelector?: SelectPaymentRequirements;\n\n  /**\n   * Optional policies to apply to the client\n   */\n  policies?: PaymentPolicy[];\n\n  /**\n   * Optional Exact EVM client scheme options.\n   * Supports either a single config ({ rpcUrl }) or per-chain configs\n   * keyed by EVM chain ID ({ 8453: { rpcUrl: \"...\" } }).\n   */\n  schemeOptions?: ExactEvmSchemeOptions;\n\n  /**\n   * Optional specific networks to register.\n   * If not provided, registers wildcard support (eip155:*).\n   */\n  networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@x402/evm/exact/client/register\";\n * import { x402Client } from \"@x402/core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n  const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);\n\n  // Register V2 scheme\n  // EIP-2612 gas sponsoring is handled internally by the scheme when the\n  // server advertises support - no separate extension registration needed.\n  if (config.networks && config.networks.length > 0) {\n    // Register specific networks\n    config.networks.forEach(network => {\n      client.register(network, evmScheme);\n    });\n  } else {\n    // Register wildcard for all EVM chains\n    client.register(\"eip155:*\", evmScheme);\n  }\n\n  // Register all V1 networks\n  NETWORKS.forEach(network => {\n    client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n  });\n\n  // Apply policies if provided\n  if (config.policies) {\n    config.policies.forEach(policy => {\n      client.registerPolicy(policy);\n    });\n  }\n\n  return client;\n}\n"],"mappings":"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","names":[]}