{"version":3,"sources":["../../src/exact/v1/client/scheme.ts","../../src/exact/v1/facilitator/scheme.ts","../../src/exact/facilitator/eip3009-utils.ts","../../src/v1/index.ts"],"sourcesContent":["import {\n  Network,\n  PaymentPayload,\n  PaymentRequirements,\n  SchemeNetworkClient,\n} from \"@x402/core/types\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { ClientEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { createNonce } from \"../../../utils\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\n\n/**\n * EVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkClient {\n  readonly scheme = \"exact\";\n\n  /**\n   * Creates a new ExactEvmClientV1 instance.\n   *\n   * @param signer - The EVM signer for client operations\n   */\n  constructor(private readonly signer: ClientEvmSigner) {}\n\n  /**\n   * Creates a payment payload for the Exact scheme (V1).\n   *\n   * @param x402Version - The x402 protocol version\n   * @param paymentRequirements - The payment requirements\n   * @returns Promise resolving to a payment payload\n   */\n  async createPaymentPayload(\n    x402Version: number,\n    paymentRequirements: PaymentRequirements,\n  ): Promise<\n    Pick<PaymentPayload, \"x402Version\" | \"payload\"> & { scheme: string; network: Network }\n  > {\n    const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n    const nonce = createNonce();\n    const now = Math.floor(Date.now() / 1000);\n\n    const authorization: ExactEvmPayloadV1[\"authorization\"] = {\n      from: this.signer.address,\n      to: getAddress(selectedV1.payTo),\n      value: selectedV1.maxAmountRequired,\n      validAfter: (now - 600).toString(), // 10 minutes before\n      validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),\n      nonce,\n    };\n\n    // Sign the authorization\n    const signature = await this.signAuthorization(authorization, selectedV1);\n\n    const payload: ExactEvmPayloadV1 = {\n      authorization,\n      signature,\n    };\n\n    return {\n      x402Version,\n      scheme: selectedV1.scheme,\n      network: selectedV1.network,\n      payload,\n    };\n  }\n\n  /**\n   * Sign the EIP-3009 authorization using EIP-712\n   *\n   * @param authorization - The authorization to sign\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to the signature\n   */\n  private async signAuthorization(\n    authorization: ExactEvmPayloadV1[\"authorization\"],\n    requirements: PaymentRequirementsV1,\n  ): Promise<`0x${string}`> {\n    const chainId = getEvmChainIdV1(requirements.network as EvmNetworkV1);\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 this.signer.signTypedData({\n      domain,\n      types: authorizationTypes,\n      primaryType: \"TransferWithAuthorization\",\n      message,\n    });\n  }\n}\n","import {\n  PaymentPayload,\n  PaymentPayloadV1,\n  PaymentRequirements,\n  SchemeNetworkFacilitator,\n  FacilitatorContext,\n  SettleResponse,\n  VerifyResponse,\n} from \"@x402/core/types\";\nimport { resolveDataSuffix } from \"../../../shared/extensions\";\nimport { verifyTypedDataSignature, classifyErc6492Payer } from \"../../../shared/verifySignature\";\nimport { PaymentRequirementsV1 } from \"@x402/core/types/v1\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { FacilitatorEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\nimport * as Errors from \"../../facilitator/errors\";\nimport {\n  diagnoseEip3009SimulationFailure,\n  executeTransferWithAuthorization,\n  simulateEip3009Transfer,\n} from \"../../facilitator/eip3009-utils\";\n\nexport interface VerifyV1Options {\n  /** Run onchain simulation. Defaults to true. */\n  simulate?: boolean;\n}\n\nexport interface ExactEvmSchemeV1Config {\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 * EVM facilitator implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkFacilitator {\n  readonly scheme = \"exact\";\n  readonly caipFamily = \"eip155:*\";\n  private readonly config: Required<ExactEvmSchemeV1Config>;\n\n  /**\n   * Creates a new ExactEvmFacilitatorV1 instance.\n   *\n   * @param signer - The EVM signer for facilitator operations\n   * @param config - Optional configuration for the facilitator\n   */\n  constructor(\n    private readonly signer: FacilitatorEvmSigner,\n    config?: ExactEvmSchemeV1Config,\n  ) {\n    this.config = {\n      eip6492AllowedFactories: config?.eip6492AllowedFactories ?? [],\n      simulateInSettle: config?.simulateInSettle ?? false,\n    };\n  }\n\n  /**\n   * Get mechanism-specific extra data for the supported kinds endpoint.\n   * For EVM, no extra data is needed.\n   *\n   * @param _ - The network identifier (unused for EVM)\n   * @returns undefined (EVM has no extra data)\n   */\n  getExtra(_: string): Record<string, unknown> | undefined {\n    return undefined;\n  }\n\n  /**\n   * Get signer addresses used by this facilitator.\n   * Returns all addresses this facilitator can use for signing/settling transactions.\n   *\n   * @param _ - The network identifier (unused for EVM, 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 (V1).\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    return this._verify(payload, requirements);\n  }\n\n  /**\n   * Settles a payment by executing the transfer (V1).\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 payloadV1 = payload as unknown as PaymentPayloadV1;\n    const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n    // Re-verify before settling\n    const valid = await this._verify(payload, requirements, {\n      simulate: this.config.simulateInSettle ?? false,\n    });\n    if (!valid.isValid) {\n      return {\n        success: false,\n        network: payloadV1.network,\n        transaction: \"\",\n        errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n\n    try {\n      // Parse ERC-6492 signature if applicable (for optional deployment)\n      const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n        exactEvmPayload.signature!,\n      );\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 payerAddress = exactEvmPayload.authorization.from;\n        const bytecode = await this.signer.getCode({ address: payerAddress });\n\n        if (!bytecode || bytecode === \"0x\") {\n          const normalizedFactory = factoryAddress.toLowerCase();\n          const isAllowed = (this.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: payloadV1.network,\n              payer: exactEvmPayload.authorization.from,\n            };\n          }\n\n          // Send the factory calldata directly as a transaction\n          // The factoryCalldata already contains the complete encoded function call\n          const deployTx = await this.signer.sendTransaction({\n            to: factoryAddress as Hex,\n            data: factoryCalldata as Hex,\n          });\n\n          // Wait for deployment and verify it actually succeeded.\n          const deployReceipt = await this.signer.waitForTransactionReceipt({ hash: deployTx });\n          if (deployReceipt.status !== \"success\") {\n            return {\n              success: false,\n              errorReason: Errors.ErrSmartWalletDeploymentFailed,\n              transaction: \"\",\n              network: payloadV1.network,\n              payer: exactEvmPayload.authorization.from,\n            };\n          }\n\n          // Do NOT re-simulate the transfer here. The authoritative pre-check is the atomic\n          // deploy+transfer simulation in verify; a second standalone eth_call after the real\n          // deploy tx races the deploy's state propagation across load-balanced RPC nodes and\n          // false-rejected valid wallets. The on-chain transferWithAuthorization below is the\n          // definitive signature check; a genuinely unsupported inner signature reverts there\n          // and is classified by parseEip3009TransferError.\n        }\n      }\n\n      // V1 payloads carry no extensions, so the builder-code suffix can only contain the\n      // facilitator's own wallet code (`w`); client app (`a`) and service (`s`) codes are\n      // always absent.\n      const dataSuffix = await resolveDataSuffix(context, {\n        paymentPayload: payload,\n        paymentRequirements: requirements,\n      });\n\n      const tx = await executeTransferWithAuthorization(\n        this.signer,\n        getAddress(requirements.asset),\n        exactEvmPayload,\n        dataSuffix,\n      );\n\n      // Wait for transaction confirmation\n      const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });\n\n      if (receipt.status !== \"success\") {\n        return {\n          success: false,\n          errorReason: Errors.ErrTransactionFailed,\n          transaction: tx,\n          network: payloadV1.network,\n          payer: exactEvmPayload.authorization.from,\n        };\n      }\n\n      return {\n        success: true,\n        transaction: tx,\n        network: payloadV1.network,\n        payer: exactEvmPayload.authorization.from,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        errorReason: error instanceof Error ? error.message : Errors.ErrTransactionFailed,\n        transaction: \"\",\n        network: payloadV1.network,\n        payer: exactEvmPayload.authorization.from,\n      };\n    }\n  }\n\n  /**\n   * Internal verify with optional simulation control.\n   *\n   * @param payload - The payment payload to verify\n   * @param requirements - The payment requirements\n   * @param options - Verification options (e.g. simulate)\n   * @returns Promise resolving to verification response\n   */\n  private async _verify(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n    options?: VerifyV1Options,\n  ): Promise<VerifyResponse> {\n    const requirementsV1 = requirements as unknown as PaymentRequirementsV1;\n    const payloadV1 = payload as unknown as PaymentPayloadV1;\n    const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n    const payer = exactEvmPayload.authorization.from;\n    let eip6492Deployment:\n      | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n      | undefined;\n\n    // Verify scheme matches\n    if (payloadV1.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n      return {\n        isValid: false,\n        invalidReason: Errors.ErrInvalidScheme,\n        payer,\n      };\n    }\n\n    // Get chain configuration\n    let chainId: number;\n    try {\n      chainId = getEvmChainIdV1(payloadV1.network as EvmNetworkV1);\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: Errors.ErrNetworkMismatch,\n        payer,\n      };\n    }\n\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 (payloadV1.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,\n        verifyingContract: erc20Address,\n      },\n      message: {\n        from: exactEvmPayload.authorization.from,\n        to: exactEvmPayload.authorization.to,\n        value: BigInt(exactEvmPayload.authorization.value),\n        validAfter: BigInt(exactEvmPayload.authorization.validAfter),\n        validBefore: BigInt(exactEvmPayload.authorization.validBefore),\n        nonce: exactEvmPayload.authorization.nonce,\n      },\n    };\n\n    const signature = exactEvmPayload.signature!;\n\n    // Classify the payer (counterfactual vs deployed) and extract inner sig in one shot.\n    const {\n      isCounterfactual,\n      innerSignature,\n      eip6492Deployment: classification6492,\n    } = await classifyErc6492Payer(this.signer, signature, payer);\n\n    if (classification6492) {\n      eip6492Deployment = classification6492;\n    }\n\n    if (isCounterfactual) {\n      // Mirror settle's allowlist gate so verify predicts settle: a counterfactual payment whose\n      // factory is not allowlisted is rejected at settle, so reject it here too.\n      const factory = classification6492?.factoryAddress;\n      const factoryAllowed =\n        !!factory &&\n        this.config.eip6492AllowedFactories.some(\n          a => a.trim().toLowerCase() === factory.toLowerCase(),\n        );\n      if (!factoryAllowed) {\n        return {\n          isValid: false,\n          invalidReason: Errors.ErrFactoryNotAllowed,\n          payer,\n        };\n      }\n    }\n\n    if (!isCounterfactual) {\n      // Non-counterfactual path: verify using the strict primitive that mirrors\n      // on-chain SignatureChecker semantics (ecrecover for EOAs, strict EIP-1271\n      // for any address with code). No ECDSA fallback for code addresses.\n      const isValid = await verifyTypedDataSignature(this.signer, {\n        address: payer,\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 path: defer to on-chain simulation which deploys + verifies atomically.\n\n    // Verify payment recipient matches\n    if (getAddress(exactEvmPayload.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(exactEvmPayload.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(exactEvmPayload.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(exactEvmPayload.authorization.value) !== BigInt(requirementsV1.maxAmountRequired)) {\n      return {\n        isValid: false,\n        invalidReason: Errors.ErrInvalidAuthorizationValue,\n        payer,\n      };\n    }\n\n    // Transaction simulation\n    if (options?.simulate !== false) {\n      const simulationSucceeded = await simulateEip3009Transfer(\n        this.signer,\n        erc20Address,\n        exactEvmPayload,\n        eip6492Deployment,\n      );\n      if (!simulationSucceeded) {\n        return diagnoseEip3009SimulationFailure(\n          this.signer,\n          erc20Address,\n          exactEvmPayload,\n          requirements,\n          requirementsV1.maxAmountRequired,\n        );\n      }\n    }\n\n    return {\n      isValid: true,\n      invalidReason: undefined,\n      payer,\n    };\n  }\n}\n","import { PaymentRequirements, VerifyResponse } from \"@x402/core/types\";\nimport { encodeFunctionData, getAddress, Hex, parseErc6492Signature, parseSignature } from \"viem\";\nimport { eip3009ABI } from \"../../constants\";\nimport { multicall, ContractCall, RawContractCall } from \"../../multicall\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\n\nexport interface Eip6492Deployment {\n  factoryAddress: `0x${string}`;\n  factoryCalldata: `0x${string}`;\n}\n\n/**\n * Outcome of a transfer simulation. `error` is populated only when the underlying `eth_call`\n * threw (revert or transport), letting callers distinguish a contract revert from an RPC failure.\n */\nexport interface SimulateEip3009Result {\n  ok: boolean;\n  error?: unknown;\n}\n\n/**\n * Simulates transferWithAuthorization via eth_call.\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param signer - EVM signer for contract reads\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param eip6492Deployment - Optional EIP-6492 factory info for undeployed smart wallets\n *\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulateEip3009Transfer(\n  signer: FacilitatorEvmSigner,\n  erc20Address: `0x${string}`,\n  payload: ExactEIP3009Payload,\n  eip6492Deployment?: Eip6492Deployment,\n): Promise<boolean> {\n  return (await simulateEip3009TransferResult(signer, erc20Address, payload, eip6492Deployment)).ok;\n}\n\n/**\n * Like {@link simulateEip3009Transfer} but returns the thrown error (if any) alongside the\n * boolean outcome, so callers can tell a contract revert apart from a transport/RPC failure.\n *\n * @param signer - EVM signer for contract reads\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param eip6492Deployment - Optional EIP-6492 factory info for undeployed smart wallets\n * @returns The simulation outcome and, on failure via a thrown error, that error.\n */\nexport async function simulateEip3009TransferResult(\n  signer: FacilitatorEvmSigner,\n  erc20Address: `0x${string}`,\n  payload: ExactEIP3009Payload,\n  eip6492Deployment?: Eip6492Deployment,\n): Promise<SimulateEip3009Result> {\n  const auth = payload.authorization;\n  const transferArgs = [\n    getAddress(auth.from),\n    getAddress(auth.to),\n    BigInt(auth.value),\n    BigInt(auth.validAfter),\n    BigInt(auth.validBefore),\n    auth.nonce,\n  ] as const;\n\n  if (eip6492Deployment) {\n    const { signature: innerSignature } = parseErc6492Signature(payload.signature!);\n    const transferCalldata = encodeFunctionData({\n      abi: eip3009ABI,\n      functionName: \"transferWithAuthorization\",\n      args: [...transferArgs, innerSignature],\n    });\n\n    try {\n      const results = await multicall(signer.readContract.bind(signer), [\n        {\n          address: getAddress(eip6492Deployment.factoryAddress),\n          callData: eip6492Deployment.factoryCalldata,\n        } satisfies RawContractCall,\n        {\n          address: erc20Address,\n          callData: transferCalldata,\n        } satisfies RawContractCall,\n      ]);\n\n      return { ok: results[1]?.status === \"success\" };\n    } catch (error) {\n      return { ok: false, error };\n    }\n  }\n\n  const sig = payload.signature!;\n  const sigLength = sig.startsWith(\"0x\") ? sig.length - 2 : sig.length;\n  const isECDSA = sigLength === 130;\n\n  try {\n    if (isECDSA) {\n      const parsedSig = parseSignature(sig);\n      await signer.readContract({\n        address: erc20Address,\n        abi: eip3009ABI,\n        functionName: \"transferWithAuthorization\",\n        args: [\n          ...transferArgs,\n          (parsedSig.v as number | undefined) ?? parsedSig.yParity,\n          parsedSig.r,\n          parsedSig.s,\n        ],\n      });\n    } else {\n      await signer.readContract({\n        address: erc20Address,\n        abi: eip3009ABI,\n        functionName: \"transferWithAuthorization\",\n        args: [...transferArgs, sig],\n      });\n    }\n    return { ok: true };\n  } catch (error) {\n    return { ok: false, error };\n  }\n}\n\n/**\n * After simulation fails, runs a single diagnostic multicall to determine the most specific error reason.\n * Checks balanceOf, name, version and authorizationState in one RPC round-trip.\n *\n * @param signer - EVM signer used for the payment\n * @param erc20Address - Address of the ERC-20 token contract\n * @param payload - The EIP-3009 transfer authorization payload\n * @param requirements - Payment requirements to validate against\n * @param amountRequired - Required amount for the payment (balance check)\n *\n * @returns Promise resolving to the verification result with validity and optional invalid reason\n */\nexport async function diagnoseEip3009SimulationFailure(\n  signer: FacilitatorEvmSigner,\n  erc20Address: `0x${string}`,\n  payload: ExactEIP3009Payload,\n  requirements: PaymentRequirements,\n  amountRequired: string,\n): Promise<VerifyResponse> {\n  const payer = payload.authorization.from;\n\n  const diagnosticCalls: ContractCall[] = [\n    {\n      address: erc20Address,\n      abi: eip3009ABI,\n      functionName: \"balanceOf\",\n      args: [payload.authorization.from],\n    },\n    {\n      address: erc20Address,\n      abi: eip3009ABI,\n      functionName: \"name\",\n    },\n    {\n      address: erc20Address,\n      abi: eip3009ABI,\n      functionName: \"version\",\n    },\n    {\n      address: erc20Address,\n      abi: eip3009ABI,\n      functionName: \"authorizationState\",\n      args: [payload.authorization.from, payload.authorization.nonce],\n    },\n  ];\n\n  try {\n    const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n    const [balanceResult, nameResult, versionResult, authStateResult] = results;\n\n    if (authStateResult.status === \"failure\") {\n      return { isValid: false, invalidReason: Errors.ErrEip3009NotSupported, payer };\n    }\n\n    if (authStateResult.status === \"success\" && authStateResult.result === true) {\n      return { isValid: false, invalidReason: Errors.ErrEip3009NonceAlreadyUsed, payer };\n    }\n\n    if (\n      nameResult.status === \"success\" &&\n      requirements.extra?.name &&\n      nameResult.result !== requirements.extra.name\n    ) {\n      return { isValid: false, invalidReason: Errors.ErrEip3009TokenNameMismatch, payer };\n    }\n\n    if (\n      versionResult.status === \"success\" &&\n      requirements.extra?.version &&\n      versionResult.result !== requirements.extra.version\n    ) {\n      return { isValid: false, invalidReason: Errors.ErrEip3009TokenVersionMismatch, payer };\n    }\n\n    if (balanceResult.status === \"success\") {\n      const balance = balanceResult.result as bigint;\n      if (balance < BigInt(amountRequired)) {\n        return {\n          isValid: false,\n          invalidReason: Errors.ErrEip3009InsufficientBalance,\n          payer,\n        };\n      }\n    }\n  } catch {\n    // Diagnostic multicall failed — fall through to generic error\n  }\n\n  return { isValid: false, invalidReason: Errors.ErrEip3009SimulationFailed, payer };\n}\n\n/**\n * Maps an EIP-3009 contract revert error to a specific error code.\n * Falls back to ErrTransactionFailed when the revert reason is unknown.\n *\n * @param error - The error thrown during transfer execution\n * @returns A specific error reason string\n */\nexport function parseEip3009TransferError(error: unknown): string {\n  const msg = error instanceof Error ? error.message : String(error);\n  if (/authorization.*(expired|valid before)/i.test(msg) || /AuthorizationExpired/i.test(msg)) {\n    return Errors.ErrValidBeforeExpired;\n  }\n  if (/authorization.*not.*valid|AuthorizationNotYetValid/i.test(msg)) {\n    return Errors.ErrValidAfterInFuture;\n  }\n  if (/authorization.*used|AuthorizationAlreadyUsed|AuthorizationUsedOrCanceled/i.test(msg)) {\n    return Errors.ErrEip3009NonceAlreadyUsed;\n  }\n  if (/transfer.*exceeds.*balance|insufficient.*balance|ERC20InsufficientBalance/i.test(msg)) {\n    return Errors.ErrEip3009InsufficientBalance;\n  }\n  if (/invalid.*signature|SignerMismatch|InvalidSignatureV|InvalidSignatureS/i.test(msg)) {\n    return Errors.ErrInvalidSignature;\n  }\n  return Errors.ErrTransactionFailed;\n}\n\n/**\n * Executes transferWithAuthorization onchain.\n *\n * @param signer - EVM signer for contract writes\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param dataSuffix - Optional hex bytes to append after the ABI-encoded calldata\n *\n * @returns Transaction hash\n */\nexport async function executeTransferWithAuthorization(\n  signer: FacilitatorEvmSigner,\n  erc20Address: `0x${string}`,\n  payload: ExactEIP3009Payload,\n  dataSuffix?: Hex,\n): Promise<Hex> {\n  const { signature } = parseErc6492Signature(payload.signature!);\n  const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n  const isECDSA = signatureLength === 130;\n\n  const auth = payload.authorization;\n  const baseArgs = [\n    getAddress(auth.from),\n    getAddress(auth.to),\n    BigInt(auth.value),\n    BigInt(auth.validAfter),\n    BigInt(auth.validBefore),\n    auth.nonce,\n  ] as const;\n\n  let signatureArgs: readonly unknown[];\n  if (isECDSA) {\n    const parsedSig = parseSignature(signature);\n    signatureArgs = [\n      (parsedSig.v as number | undefined) || parsedSig.yParity,\n      parsedSig.r,\n      parsedSig.s,\n    ];\n  } else {\n    signatureArgs = [signature];\n  }\n\n  return signer.writeContract({\n    address: erc20Address,\n    abi: eip3009ABI,\n    functionName: \"transferWithAuthorization\",\n    args: [...baseArgs, ...signatureArgs],\n    dataSuffix,\n  });\n}\n","export { ExactEvmSchemeV1 } from \"../exact/v1\";\n\nexport const EVM_NETWORK_CHAIN_ID_MAP = {\n  ethereum: 1,\n  sepolia: 11155111,\n  abstract: 2741,\n  \"abstract-testnet\": 11124,\n  \"base-sepolia\": 84532,\n  base: 8453,\n  \"avalanche-fuji\": 43113,\n  avalanche: 43114,\n  iotex: 4689,\n  sei: 1329,\n  \"sei-testnet\": 1328,\n  polygon: 137,\n  \"polygon-amoy\": 80002,\n  peaq: 3338,\n  story: 1514,\n  educhain: 41923,\n  \"skale-base-sepolia\": 324705682,\n  megaeth: 4326,\n  monad: 143,\n  stable: 988,\n  \"stable-testnet\": 2201,\n} as const;\n\nexport type EvmNetworkV1 = keyof typeof EVM_NETWORK_CHAIN_ID_MAP;\n\nexport const NETWORKS: string[] = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);\n\n/**\n * Extract chain ID from a v1 legacy network name.\n *\n * @param network - The v1 network name (e.g., \"base-sepolia\", \"polygon\")\n * @returns The numeric chain ID\n * @throws Error if the network name is not a known v1 network\n */\nexport function getEvmChainIdV1(network: string): number {\n  const chainId = EVM_NETWORK_CHAIN_ID_MAP[network as EvmNetworkV1];\n  if (!chainId) {\n    throw new Error(`Unsupported v1 network: ${network}`);\n  }\n  return chainId;\n}\n"],"mappings":"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","names":["getAddress","parseErc6492Signature","getAddress","getAddress","ExactEvmSchemeV1","parseErc6492Signature","getAddress"]}