{"version":3,"sources":["../../../../src/exact/facilitator/eip3009.ts","../../../../src/exact/facilitator/permit2.ts","../../../../src/exact/facilitator/scheme.ts","../../../../src/exact/facilitator/register.ts"],"sourcesContent":["import {\n  PaymentPayload,\n  PaymentRequirements,\n  FacilitatorContext,\n  SettleResponse,\n  VerifyResponse,\n} from \"@x402/core/types\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { getEvmChainId } from \"../../utils\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\nimport { resolveDataSuffix } from \"../../shared/extensions\";\nimport { verifyTypedDataSignature, classifyErc6492Payer } from \"../../shared/verifySignature\";\nimport {\n  diagnoseEip3009SimulationFailure,\n  executeTransferWithAuthorization,\n  parseEip3009TransferError,\n  simulateEip3009TransferResult,\n} from \"./eip3009-utils\";\n\nexport interface VerifyEIP3009Options {\n  /** Run onchain simulation. Defaults to true. */\n  simulate?: boolean;\n}\n\nexport interface EIP3009FacilitatorConfig {\n  /**\n   * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n   * will call when deploying an undeployed smart wallet via ERC-6492.\n   *\n   * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. Facilitators must\n   * explicitly list every factory they trust to prevent arbitrary transaction injection via\n   * attacker-controlled ERC-6492 signature wrappers. An empty or omitted list denies all factory\n   * deployment calls.\n   *\n   * @default []\n   */\n  eip6492AllowedFactories?: string[];\n  /**\n   * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n   *\n   * @default false\n   */\n  simulateInSettle?: boolean;\n}\n\n/**\n * Verifies an EIP-3009 payment payload.\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param options - Optional verification options\n * @param allowedFactories - Allowlisted ERC-6492 factory addresses; a counterfactual payment whose\n *   factory is not in this list is rejected here so verify mirrors settle's policy gate.\n * @returns Promise resolving to verification response\n */\nexport async function verifyEIP3009(\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  requirements: PaymentRequirements,\n  eip3009Payload: ExactEIP3009Payload,\n  options?: VerifyEIP3009Options,\n  allowedFactories: string[] = [],\n): Promise<VerifyResponse> {\n  const payer = eip3009Payload.authorization.from;\n  let eip6492Deployment:\n    | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n    | undefined;\n\n  // Verify scheme matches\n  if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrInvalidScheme,\n      payer,\n    };\n  }\n\n  // Get chain configuration\n  if (!requirements.extra?.name || !requirements.extra?.version) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrMissingEip712Domain,\n      payer,\n    };\n  }\n\n  const { name, version } = requirements.extra as { name: string; version: string };\n  const erc20Address = getAddress(requirements.asset);\n\n  // Verify network matches\n  if (payload.accepted.network !== requirements.network) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrNetworkMismatch,\n      payer,\n    };\n  }\n\n  // Build typed data for signature verification\n  const permitTypedData = {\n    types: authorizationTypes,\n    primaryType: \"TransferWithAuthorization\" as const,\n    domain: {\n      name,\n      version,\n      chainId: getEvmChainId(requirements.network),\n      verifyingContract: erc20Address,\n    },\n    message: {\n      from: eip3009Payload.authorization.from,\n      to: eip3009Payload.authorization.to,\n      value: BigInt(eip3009Payload.authorization.value),\n      validAfter: BigInt(eip3009Payload.authorization.validAfter),\n      validBefore: BigInt(eip3009Payload.authorization.validBefore),\n      nonce: eip3009Payload.authorization.nonce,\n    },\n  };\n\n  const signature = eip3009Payload.signature!;\n\n  // Classify the payer: fetch code once, parse ERC-6492 wrapper, determine counterfactual.\n  // Using classifyErc6492Payer avoids duplicating this block across eip3009.ts / v1/scheme.ts.\n  const {\n    isCounterfactual,\n    innerSignature,\n    eip6492Deployment: classification6492,\n  } = await classifyErc6492Payer(signer, signature, payer);\n\n  if (classification6492) {\n    eip6492Deployment = classification6492;\n  }\n\n  if (isCounterfactual) {\n    // Counterfactual deposits are deployed by settle via the factory, which is gated by the\n    // allowlist. Enforce the same gate here so verify does not return isValid:true for a payment\n    // that settle will reject with ErrFactoryNotAllowed (verify must predict settle).\n    const factory = classification6492?.factoryAddress;\n    const factoryAllowed =\n      !!factory && allowedFactories.some(a => a.trim().toLowerCase() === factory.toLowerCase());\n    if (!factoryAllowed) {\n      return {\n        isValid: false,\n        invalidReason: Errors.ErrFactoryNotAllowed,\n        payer,\n      };\n    }\n  }\n\n  if (!isCounterfactual) {\n    // For deployed addresses (plain EOA, smart contract, 7702 EOA): verify the\n    // signature using a strict primitive that mirrors on-chain SignatureChecker\n    // semantics — ecrecover when no code, strict EIP-1271 when code is present.\n    // No ECDSA fallback for code addresses; that fallback causes pre-verify to\n    // accept sigs the on-chain token rejects (empirically confirmed on Base Sepolia).\n    const isValid = await verifyTypedDataSignature(signer, {\n      address: eip3009Payload.authorization.from,\n      ...permitTypedData,\n      signature: innerSignature,\n    });\n    if (!isValid) {\n      return {\n        isValid: false,\n        invalidReason: Errors.ErrInvalidSignature,\n        payer,\n      };\n    }\n  }\n  // Counterfactual: skip pre-verify and defer to on-chain simulation/settle which\n  // deploys the factory first then atomically validates the signature.\n\n  // Verify payment recipient matches\n  if (getAddress(eip3009Payload.authorization.to) !== getAddress(requirements.payTo)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrRecipientMismatch,\n      payer,\n    };\n  }\n\n  // Verify validBefore is in the future (with 6 second buffer for block time)\n  const now = Math.floor(Date.now() / 1000);\n  if (BigInt(eip3009Payload.authorization.validBefore) < BigInt(now + 6)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrValidBeforeExpired,\n      payer,\n    };\n  }\n\n  // Verify validAfter is not in the future\n  if (BigInt(eip3009Payload.authorization.validAfter) > BigInt(now)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrValidAfterInFuture,\n      payer,\n    };\n  }\n\n  // Verify amount exactly matches requirements\n  if (BigInt(eip3009Payload.authorization.value) !== BigInt(requirements.amount)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrInvalidAuthorizationValue,\n      payer,\n    };\n  }\n\n  // Reject payments whose asset is an EOA — eth_call on an EOA silently returns\n  // empty data without reverting, so simulation would pass but no Transfer event\n  // would be emitted, producing a silent no-op settlement.\n  const assetBytecode = await signer.getCode({ address: erc20Address });\n  if (!assetBytecode || assetBytecode === \"0x\") {\n    return { isValid: false, invalidReason: Errors.ErrAssetNotDeployedContract, payer };\n  }\n\n  // Transaction simulation\n  if (options?.simulate !== false) {\n    const { ok, error: simError } = await simulateEip3009TransferResult(\n      signer,\n      erc20Address,\n      eip3009Payload,\n      eip6492Deployment,\n    );\n    if (!ok) {\n      const diagnosis = await diagnoseEip3009SimulationFailure(\n        signer,\n        erc20Address,\n        eip3009Payload,\n        requirements,\n        requirements.amount,\n      );\n      // Carry the raw revert text so the concrete reason survives the mapping to a code.\n      const rawMessage =\n        simError instanceof Error ? simError.message : simError ? String(simError) : undefined;\n      return rawMessage ? { ...diagnosis, invalidMessage: rawMessage } : diagnosis;\n    }\n  }\n\n  return {\n    isValid: true,\n    invalidReason: undefined,\n    payer,\n  };\n}\n\n/**\n * Settles an EIP-3009 payment by executing transferWithAuthorization.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param eip3009Payload - The EIP-3009 specific payload\n * @param config - Facilitator configuration\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to settlement response\n */\nexport async function settleEIP3009(\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  requirements: PaymentRequirements,\n  eip3009Payload: ExactEIP3009Payload,\n  config: EIP3009FacilitatorConfig,\n  context?: FacilitatorContext,\n): Promise<SettleResponse> {\n  const payer = eip3009Payload.authorization.from;\n\n  // Re-verify before settling\n  const valid = await verifyEIP3009(\n    signer,\n    payload,\n    requirements,\n    eip3009Payload,\n    { simulate: config.simulateInSettle ?? false },\n    config.eip6492AllowedFactories ?? [],\n  );\n  if (!valid.isValid) {\n    return {\n      success: false,\n      network: payload.accepted.network,\n      transaction: \"\",\n      errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n      payer,\n    };\n  }\n\n  try {\n    // Parse ERC-6492 signature if applicable (for optional deployment).\n    // Keep the full result so we can access the inner signature later for\n    // the post-deploy transfer simulation.\n    const settleErc6492Data = parseErc6492Signature(eip3009Payload.signature!);\n    const {\n      address: factoryAddress,\n      data: factoryCalldata,\n      signature: erc6492InnerSig,\n    } = settleErc6492Data;\n\n    // Deploy ERC-4337 smart wallet via EIP-6492 if factory is in the allowlist\n    if (\n      factoryAddress &&\n      factoryCalldata &&\n      !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n    ) {\n      // Check if smart wallet is already deployed\n      const bytecode = await signer.getCode({ address: payer });\n\n      if (!bytecode || bytecode === \"0x\") {\n        const normalizedFactory = factoryAddress.toLowerCase();\n        const isAllowed = (config.eip6492AllowedFactories ?? []).some(\n          allowed => allowed.toLowerCase() === normalizedFactory,\n        );\n        if (!isAllowed) {\n          return {\n            success: false,\n            errorReason: Errors.ErrFactoryNotAllowed,\n            transaction: \"\",\n            network: payload.accepted.network,\n            payer,\n          };\n        }\n\n        // Wallet not deployed - attempt deployment\n        const deployTx = await signer.sendTransaction({\n          to: factoryAddress as Hex,\n          data: factoryCalldata as Hex,\n        });\n\n        // Wait for deployment and check whether it actually succeeded.\n        // A reverted factory tx would silently proceed without this check, misclassifying\n        // the downstream transfer failure as an invalid-signature error.\n        const deployReceipt = await signer.waitForTransactionReceipt({ hash: deployTx });\n        if (deployReceipt.status !== \"success\") {\n          return {\n            success: false,\n            errorReason: Errors.ErrSmartWalletDeploymentFailed,\n            transaction: \"\",\n            network: payload.accepted.network,\n            payer,\n          };\n        }\n\n        // Do NOT re-simulate the transfer here. The single authoritative pre-check is the\n        // atomic Multicall3 deploy+transfer simulation that runs in verify (one eth_call,\n        // state carried across both sub-calls). A second standalone eth_call after the real\n        // deploy tx is unreliable — the read can race the deploy's state propagation across\n        // load-balanced RPC nodes — and was producing false `eip6492_deployed_inner_wallet_\n        // signature_unsupported` rejections for valid wallets (e.g. Coinbase Smart Wallet).\n        // The on-chain transferWithAuthorization below is itself the definitive signature\n        // check (the token routes to the wallet's isValidSignature); a genuinely\n        // unsupported inner signature reverts there and is classified by the catch block.\n      }\n    }\n\n    const dataSuffix = await resolveDataSuffix(context, {\n      paymentPayload: payload,\n      paymentRequirements: requirements,\n    });\n\n    // When the original signature was ERC-6492 wrapped (deployed wallet), use the\n    // extracted inner signature for the on-chain transferWithAuthorization call.\n    // FiatTokenV2_2's isValidSignature on the deployed contract expects the compact inner signature\n    const settlePayload =\n      erc6492InnerSig && erc6492InnerSig !== eip3009Payload.signature\n        ? { ...eip3009Payload, signature: erc6492InnerSig }\n        : eip3009Payload;\n\n    const tx = await executeTransferWithAuthorization(\n      signer,\n      getAddress(requirements.asset),\n      settlePayload,\n      dataSuffix,\n    );\n\n    // Wait for transaction confirmation\n    const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n    if (receipt.status !== \"success\") {\n      return {\n        success: false,\n        errorReason: Errors.ErrTransactionFailed,\n        transaction: tx,\n        network: payload.accepted.network,\n        payer,\n      };\n    }\n\n    return {\n      success: true,\n      transaction: tx,\n      network: payload.accepted.network,\n      payer,\n    };\n  } catch (error) {\n    // Preserve the raw revert text alongside the mapped code. The mapper collapses many\n    // distinct on-chain reverts into a single reason (e.g. ErrInvalidSignature), so without\n    // the original message the true cause is invisible to callers/operators.\n    return {\n      success: false,\n      errorReason: parseEip3009TransferError(error),\n      errorMessage: error instanceof Error ? error.message : String(error),\n      transaction: \"\",\n      network: payload.accepted.network,\n      payer,\n    };\n  }\n}\n","import {\n  PaymentPayload,\n  PaymentRequirements,\n  FacilitatorContext,\n  SettleResponse,\n  VerifyResponse,\n} from \"@x402/core/types\";\nimport {\n  extractEip2612GasSponsoringInfo,\n  extractErc20ApprovalGasSponsoringInfo,\n  ERC20_APPROVAL_GAS_SPONSORING_KEY,\n  resolveErc20ApprovalExtensionSigner,\n  type Eip2612GasSponsoringInfo,\n  type Erc20ApprovalGasSponsoringFacilitatorExtension,\n  type Erc20ApprovalGasSponsoringSigner,\n} from \"../extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport { appendDataSuffix, resolveDataSuffix } from \"../../shared/extensions\";\nimport {\n  PERMIT2_ADDRESS,\n  permit2WitnessTypes,\n  x402ExactPermit2ProxyABI,\n  x402ExactPermit2ProxyAddress,\n} from \"../../constants\";\nimport * as Errors from \"./errors\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactPermit2Payload } from \"../../types\";\nimport { getEvmChainId } from \"../../utils\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport { verifyTypedDataSignature } from \"../../shared/verifySignature\";\nimport {\n  simulatePermit2Settle,\n  simulatePermit2SettleWithPermit,\n  simulatePermit2SettleWithErc20Approval,\n  diagnosePermit2SimulationFailure,\n  checkPermit2Prerequisites,\n  validateEip2612PermitForPayment,\n  buildExactPermit2SettleArgs,\n  splitEip2612Signature,\n  waitAndReturnSettleResponse,\n  mapSettleError,\n  type Permit2ProxyConfig,\n} from \"../../shared/permit2\";\n\nconst exactProxyConfig: Permit2ProxyConfig = {\n  proxyAddress: x402ExactPermit2ProxyAddress,\n  proxyABI: x402ExactPermit2ProxyABI,\n};\n\nexport interface VerifyPermit2Options {\n  /** Run onchain simulation. Defaults to true. */\n  simulate?: boolean;\n}\n\nexport interface Permit2FacilitatorConfig {\n  /**\n   * If enabled, simulates transaction before settling. Defaults to false,\n   * i.e. only simulate during verify.\n   *\n   * @default false\n   */\n  simulateInSettle?: boolean;\n}\n\n/**\n * Verifies a Permit2 payment payload.\n *\n * Handles all Permit2 verification paths:\n * - Standard: checks on-chain Permit2 allowance\n * - EIP-2612: validates the EIP-2612 permit extension when allowance is insufficient\n * - ERC-20 approval: validates the pre-signed approve tx extension when allowance is insufficient\n *\n * @param signer - The facilitator signer for contract reads\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param options - Optional verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\nexport async function verifyPermit2(\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  requirements: PaymentRequirements,\n  permit2Payload: ExactPermit2Payload,\n  context?: FacilitatorContext,\n  options?: VerifyPermit2Options,\n): Promise<VerifyResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n\n  if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrUnsupportedPayloadType,\n      payer,\n    };\n  }\n\n  if (payload.accepted.network !== requirements.network) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrNetworkMismatch,\n      payer,\n    };\n  }\n\n  const chainId = getEvmChainId(requirements.network);\n  const tokenAddress = getAddress(requirements.asset);\n\n  const assetBytecode = await signer.getCode({ address: tokenAddress });\n  if (!assetBytecode || assetBytecode === \"0x\") {\n    return { isValid: false, invalidReason: Errors.ErrAssetNotDeployedContract, payer };\n  }\n\n  if (\n    getAddress(permit2Payload.permit2Authorization.spender) !==\n    getAddress(x402ExactPermit2ProxyAddress)\n  ) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2InvalidSpender,\n      payer,\n    };\n  }\n\n  if (\n    getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)\n  ) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2RecipientMismatch,\n      payer,\n    };\n  }\n\n  const now = Math.floor(Date.now() / 1000);\n  if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2DeadlineExpired,\n      payer,\n    };\n  }\n\n  if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2NotYetValid,\n      payer,\n    };\n  }\n\n  // Verify amount exactly matches requirements\n  if (\n    BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)\n  ) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2AmountMismatch,\n      payer,\n    };\n  }\n\n  if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2TokenMismatch,\n      payer,\n    };\n  }\n\n  const permit2TypedData = {\n    types: permit2WitnessTypes,\n    primaryType: \"PermitWitnessTransferFrom\" as const,\n    domain: {\n      name: \"Permit2\",\n      chainId,\n      verifyingContract: PERMIT2_ADDRESS,\n    },\n    message: {\n      permitted: {\n        token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n        amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n      },\n      spender: getAddress(permit2Payload.permit2Authorization.spender),\n      nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n      deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n      witness: {\n        to: getAddress(permit2Payload.permit2Authorization.witness.to),\n        validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n      },\n    },\n  };\n\n  // Verify signature using a strict primitive that mirrors Permit2's\n  // on-chain SignatureVerification (libraries/SignatureVerification.sol):\n  // ecrecover when the address has no code, strict EIP-1271 isValidSignature\n  // when it does. No ECDSA fallback for addresses with code — that fallback\n  // would accept signatures Permit2 rejects on-chain (notably for ERC-7702\n  // EOAs whose delegate doesn't accept raw owner ECDSA).\n  const signatureValid = await verifyTypedDataSignature(signer, {\n    address: payer,\n    ...permit2TypedData,\n    signature: permit2Payload.signature,\n  });\n  if (!signatureValid) {\n    return {\n      isValid: false,\n      invalidReason: Errors.ErrPermit2InvalidSignature,\n      payer,\n    };\n  }\n\n  // If simulation is disabled, return early\n  if (options?.simulate === false) {\n    return { isValid: true, invalidReason: undefined, payer };\n  }\n\n  // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n  const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n  if (eip2612Info) {\n    const fieldResult = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n    if (!fieldResult.isValid) {\n      return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n    }\n\n    const exactSettleArgs = buildExactPermit2SettleArgs(permit2Payload);\n    const simOk = await simulatePermit2SettleWithPermit(\n      exactProxyConfig,\n      signer,\n      exactSettleArgs,\n      eip2612Info,\n    );\n    if (!simOk) {\n      return diagnosePermit2SimulationFailure(\n        exactProxyConfig,\n        signer,\n        tokenAddress,\n        permit2Payload,\n        requirements.amount,\n      );\n    }\n\n    return { isValid: true, invalidReason: undefined, payer };\n  }\n\n  // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n  const erc20GasSponsorshipExtension =\n    context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n      ERC20_APPROVAL_GAS_SPONSORING_KEY,\n    );\n  if (erc20GasSponsorshipExtension) {\n    const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n    if (erc20Info) {\n      const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n      if (!fieldResult.isValid) {\n        return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n      }\n\n      const extensionSigner = resolveErc20ApprovalExtensionSigner(\n        erc20GasSponsorshipExtension,\n        requirements.network,\n      );\n\n      if (extensionSigner?.simulateTransactions) {\n        const simOk = await simulatePermit2SettleWithErc20Approval(\n          exactProxyConfig,\n          extensionSigner,\n          buildExactPermit2SettleArgs(permit2Payload),\n          erc20Info,\n        );\n        if (!simOk) {\n          return diagnosePermit2SimulationFailure(\n            exactProxyConfig,\n            signer,\n            tokenAddress,\n            permit2Payload,\n            requirements.amount,\n          );\n        }\n        return { isValid: true, invalidReason: undefined, payer };\n      }\n\n      // Fallback to prerequisite-only check if simulateTransactions is not available\n      return checkPermit2Prerequisites(\n        exactProxyConfig,\n        signer,\n        tokenAddress,\n        payer,\n        requirements.amount,\n      );\n    }\n  }\n\n  // Branch: standard settle (allowance already on-chain)\n  const simOk = await simulatePermit2Settle(\n    exactProxyConfig,\n    signer,\n    buildExactPermit2SettleArgs(permit2Payload),\n  );\n  if (!simOk) {\n    return diagnosePermit2SimulationFailure(\n      exactProxyConfig,\n      signer,\n      tokenAddress,\n      permit2Payload,\n      requirements.amount,\n    );\n  }\n\n  return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Settles a Permit2 payment. Single entry point for all Permit2 settlement paths:\n *\n * 1. EIP-2612 extension present -> settleWithPermit (atomic single tx via contract)\n * 2. ERC-20 approval extension present + extension signer -> broadcast approval + settle (via extension signer)\n * 3. Standard -> settle directly (allowance already on-chain)\n *\n * @param signer - The base facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param permit2Payload - The Permit2 specific payload\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param config - Optional facilitator config (simulateInSettle)\n * @returns Promise resolving to settlement response\n */\nexport async function settlePermit2(\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  requirements: PaymentRequirements,\n  permit2Payload: ExactPermit2Payload,\n  context?: FacilitatorContext,\n  config?: Permit2FacilitatorConfig,\n): Promise<SettleResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n\n  const valid = await verifyPermit2(signer, payload, requirements, permit2Payload, context, {\n    simulate: config?.simulateInSettle ?? false,\n  });\n  if (!valid.isValid) {\n    return {\n      success: false,\n      network: payload.accepted.network,\n      transaction: \"\",\n      errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n      payer,\n    };\n  }\n\n  const dataSuffix = await resolveDataSuffix(context, {\n    paymentPayload: payload,\n    paymentRequirements: requirements,\n  });\n\n  // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n  const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n  if (eip2612Info) {\n    return settlePermit2WithEIP2612(\n      exactProxyConfig,\n      signer,\n      payload,\n      permit2Payload,\n      eip2612Info,\n      dataSuffix,\n    );\n  }\n\n  // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n  const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n  if (erc20Info) {\n    const erc20GasSponsorshipExtension =\n      context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n        ERC20_APPROVAL_GAS_SPONSORING_KEY,\n      );\n    const extensionSigner = resolveErc20ApprovalExtensionSigner(\n      erc20GasSponsorshipExtension,\n      payload.accepted.network,\n    );\n    if (extensionSigner) {\n      return settlePermit2WithERC20Approval(\n        exactProxyConfig,\n        extensionSigner,\n        payload,\n        permit2Payload,\n        erc20Info,\n        dataSuffix,\n      );\n    }\n  }\n\n  // Branch: standard settle (allowance already on-chain)\n  return settlePermit2Direct(exactProxyConfig, signer, payload, permit2Payload, dataSuffix);\n}\n\n// ---------------------------------------------------------------------------\n// Exact-only settle helpers (not shared — upto has its own implementations)\n// ---------------------------------------------------------------------------\n\n/**\n * Settles a Permit2 payment via settleWithPermit, including the EIP-2612 permit atomically.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param eip2612Info - The EIP-2612 gas sponsoring info from the payload extension\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithEIP2612(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  permit2Payload: ExactPermit2Payload,\n  eip2612Info: Eip2612GasSponsoringInfo,\n  dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n  try {\n    const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n    const tx = await signer.writeContract({\n      address: config.proxyAddress,\n      abi: config.proxyABI,\n      functionName: \"settleWithPermit\",\n      args: [\n        {\n          value: BigInt(eip2612Info.amount),\n          deadline: BigInt(eip2612Info.deadline),\n          r,\n          s,\n          v,\n        },\n        ...buildExactPermit2SettleArgs(permit2Payload),\n      ],\n      dataSuffix,\n    });\n\n    return waitAndReturnSettleResponse(signer, tx, payload, payer);\n  } catch (error) {\n    return mapSettleError(error, payload, payer);\n  }\n}\n\n/**\n * Settles a Permit2 payment using an ERC-20 approval gas sponsoring extension.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with sendTransactions capability\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2WithERC20Approval(\n  config: Permit2ProxyConfig,\n  extensionSigner: Erc20ApprovalGasSponsoringSigner,\n  payload: PaymentPayload,\n  permit2Payload: ExactPermit2Payload,\n  erc20Info: { signedTransaction: string },\n  dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n\n  try {\n    const settleData = appendDataSuffix(\n      encodeFunctionData({\n        abi: config.proxyABI,\n        functionName: \"settle\",\n        args: buildExactPermit2SettleArgs(permit2Payload),\n      }),\n      dataSuffix,\n    );\n\n    const txHashes = await extensionSigner.sendTransactions([\n      erc20Info.signedTransaction as `0x${string}`,\n      { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n    ]);\n\n    const settleTxHash = txHashes[txHashes.length - 1];\n    return waitAndReturnSettleResponse(extensionSigner, settleTxHash, payload, payer);\n  } catch (error) {\n    return mapSettleError(error, payload, payer);\n  }\n}\n\n/**\n * Settles a Permit2 payment directly when Permit2 allowance is already on-chain.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The Permit2 payload with authorization and signature\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settlePermit2Direct(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  permit2Payload: ExactPermit2Payload,\n  dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n  try {\n    const tx = await signer.writeContract({\n      address: config.proxyAddress,\n      abi: config.proxyABI,\n      functionName: \"settle\",\n      args: buildExactPermit2SettleArgs(permit2Payload),\n      dataSuffix,\n    });\n\n    return waitAndReturnSettleResponse(signer, tx, payload, payer);\n  } catch (error) {\n    return mapSettleError(error, payload, payer);\n  }\n}\n","import {\n  PaymentPayload,\n  PaymentRequirements,\n  SchemeNetworkFacilitator,\n  FacilitatorContext,\n  SettleResponse,\n  VerifyResponse,\n} from \"@x402/core/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmPayloadV2, ExactEIP3009Payload, isPermit2Payload } from \"../../types\";\nimport { verifyEIP3009, settleEIP3009 } from \"./eip3009\";\nimport { verifyPermit2, settlePermit2 } from \"./permit2\";\n\nexport interface ExactEvmSchemeConfig {\n  /**\n   * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n   * will call when deploying an undeployed smart wallet via ERC-6492.\n   *\n   * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted\n   * list denies all factory deployment calls (feature disabled by default).\n   *\n   * @default []\n   */\n  eip6492AllowedFactories?: string[];\n  /**\n   * If enabled, run on-chain simulation during settle's re-verify.\n   *\n   * @default false\n   */\n  simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme.\n * Thin router that delegates to EIP-3009 or Permit2 based on payload type.\n * All extension handling (EIP-2612, ERC-20 approval gas sponsoring) is owned\n * by the Permit2 functions via FacilitatorContext.\n */\nexport class ExactEvmScheme implements SchemeNetworkFacilitator {\n  readonly scheme = \"exact\";\n  readonly caipFamily = \"eip155:*\";\n  private readonly config: Required<ExactEvmSchemeConfig>;\n\n  /**\n   * Creates a new ExactEvmScheme facilitator instance.\n   *\n   * @param signer - The EVM signer for facilitator operations\n   * @param config - Optional configuration\n   */\n  constructor(\n    private readonly signer: FacilitatorEvmSigner,\n    config?: ExactEvmSchemeConfig,\n  ) {\n    this.config = {\n      eip6492AllowedFactories: config?.eip6492AllowedFactories ?? [],\n      simulateInSettle: config?.simulateInSettle ?? false,\n    };\n  }\n\n  /**\n   * Returns undefined — EVM has no mechanism-specific extra data.\n   *\n   * @param _ - The network identifier (unused)\n   * @returns undefined\n   */\n  getExtra(_: string): Record<string, unknown> | undefined {\n    return undefined;\n  }\n\n  /**\n   * Returns facilitator wallet addresses for the supported response.\n   *\n   * @param _ - The network identifier (unused, addresses are network-agnostic)\n   * @returns Array of facilitator wallet addresses\n   */\n  getSigners(_: string): string[] {\n    return [...this.signer.getAddresses()];\n  }\n\n  /**\n   * Verifies a payment payload. Routes to Permit2 or EIP-3009 based on payload type.\n   *\n   * @param payload - The payment payload to verify\n   * @param requirements - The payment requirements\n   * @param context - Optional facilitator context for extension capabilities\n   * @param _ - Payment required extensions (unused; reserved for interface parity)\n   * @returns Promise resolving to verification response\n   */\n  async verify(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n    context?: FacilitatorContext,\n    _?: Record<string, unknown>,\n  ): Promise<VerifyResponse> {\n    const rawPayload = payload.payload as ExactEvmPayloadV2;\n    const isPermit2 = isPermit2Payload(rawPayload);\n\n    if (isPermit2) {\n      return verifyPermit2(this.signer, payload, requirements, rawPayload, context);\n    }\n\n    const eip3009Payload: ExactEIP3009Payload = rawPayload;\n    return verifyEIP3009(\n      this.signer,\n      payload,\n      requirements,\n      eip3009Payload,\n      undefined,\n      this.config.eip6492AllowedFactories,\n    );\n  }\n\n  /**\n   * Settles a payment. Routes to Permit2 or EIP-3009 based on payload type.\n   *\n   * @param payload - The payment payload to settle\n   * @param requirements - The payment requirements\n   * @param context - Optional facilitator context for extension capabilities\n   * @returns Promise resolving to settlement response\n   */\n  async settle(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n    context?: FacilitatorContext,\n  ): Promise<SettleResponse> {\n    const rawPayload = payload.payload as ExactEvmPayloadV2;\n    const isPermit2 = isPermit2Payload(rawPayload);\n\n    if (isPermit2) {\n      return settlePermit2(this.signer, payload, requirements, rawPayload, context, {\n        simulateInSettle: this.config.simulateInSettle,\n      });\n    }\n\n    const eip3009Payload: ExactEIP3009Payload = rawPayload;\n    return settleEIP3009(this.signer, payload, requirements, eip3009Payload, this.config, context);\n  }\n}\n","import { x402Facilitator } from \"@x402/core/facilitator\";\nimport { Network } from \"@x402/core/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeV1 } from \"../v1/facilitator/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Facilitator\n */\nexport interface EvmFacilitatorConfig {\n  /**\n   * The EVM signer for facilitator operations (verify and settle)\n   */\n  signer: FacilitatorEvmSigner;\n\n  /**\n   * Networks to register (single network or array of networks)\n   * Examples: \"eip155:84532\", [\"eip155:84532\", \"eip155:1\"]\n   */\n  networks: Network | Network[];\n\n  /**\n   * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n   * will call when deploying an undeployed smart wallet via ERC-6492.\n   *\n   * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted\n   * list denies all factory deployment calls (feature disabled by default).\n   *\n   * @default []\n   */\n  eip6492AllowedFactories?: string[];\n\n  /**\n   * If enabled, reruns on-chain simulation during settle's re-verify.\n   *\n   * @default false\n   */\n  simulateInSettle?: boolean;\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Facilitator instance.\n *\n * This function registers:\n * - V2: Specified networks with ExactEvmScheme\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param facilitator - The x402Facilitator instance to register schemes to\n * @param config - Configuration for EVM facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@x402/evm/exact/facilitator/register\";\n * import { x402Facilitator } from \"@x402/core/facilitator\";\n * import { createPublicClient, createWalletClient } from \"viem\";\n *\n * const facilitator = new x402Facilitator();\n *\n * // Single network\n * registerExactEvmScheme(facilitator, {\n *   signer: combinedClient,\n *   networks: \"eip155:84532\"  // Base Sepolia\n * });\n *\n * // Multiple networks (will auto-derive eip155:* pattern)\n * registerExactEvmScheme(facilitator, {\n *   signer: combinedClient,\n *   networks: [\"eip155:84532\", \"eip155:1\"]  // Base Sepolia and Mainnet\n * });\n * ```\n */\nexport function registerExactEvmScheme(\n  facilitator: x402Facilitator,\n  config: EvmFacilitatorConfig,\n): x402Facilitator {\n  // Register V2 scheme with specified networks\n  facilitator.register(\n    config.networks,\n    new ExactEvmScheme(config.signer, {\n      eip6492AllowedFactories: config.eip6492AllowedFactories,\n      simulateInSettle: config.simulateInSettle,\n    }),\n  );\n\n  // Register all V1 networks\n  facilitator.registerV1(\n    NETWORKS as Network[],\n    new ExactEvmSchemeV1(config.signer, {\n      eip6492AllowedFactories: config.eip6492AllowedFactories,\n      simulateInSettle: config.simulateInSettle,\n    }),\n  );\n\n  return facilitator;\n}\n"],"mappings":"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","names":["getAddress","getAddress","simOk"]}