{"version":3,"sources":["../../src/shared/permit2.ts","../../src/shared/erc20approval.ts","../../src/upto/facilitator/errors.ts"],"sourcesContent":["import {\n  PaymentPayload,\n  PaymentPayloadResult,\n  PaymentRequirements,\n  FacilitatorContext,\n  SettleResponse,\n  VerifyResponse,\n} from \"@x402/core/types\";\nimport {\n  extractEip2612GasSponsoringInfo,\n  validateEip2612GasSponsoringInfo,\n  extractErc20ApprovalGasSponsoringInfo,\n  ERC20_APPROVAL_GAS_SPONSORING_KEY,\n  type Eip2612GasSponsoringInfo,\n  type Erc20ApprovalGasSponsoringFacilitatorExtension,\n  type Erc20ApprovalGasSponsoringSigner,\n} from \"../exact/extensions\";\nimport { getAddress, encodeFunctionData, parseErc6492Signature } from \"viem\";\nimport { PERMIT2_ADDRESS, eip3009ABI, erc20AllowanceAbi, permit2WitnessTypes } from \"../constants\";\nimport { multicall, ContractCall } from \"../multicall\";\nimport { createPermit2Nonce, getEvmChainId } from \"../utils\";\nimport {\n  ErrPermit2612AmountMismatch,\n  ErrPermit2InvalidAmount,\n  ErrPermit2InvalidDestination,\n  ErrPermit2InvalidNonce,\n  ErrPermit2InvalidOwner,\n  ErrPermit2InvalidSignature,\n  ErrPermit2PaymentTooEarly,\n  ErrPermit2AllowanceRequired,\n  ErrPermit2SimulationFailed,\n  ErrPermit2InsufficientBalance,\n  ErrPermit2ProxyNotDeployed,\n  ErrInvalidTransactionState,\n  ErrTransactionFailed,\n  ErrInvalidEip2612ExtensionFormat,\n  ErrEip2612FromMismatch,\n  ErrEip2612AssetMismatch,\n  ErrEip2612SpenderNotPermit2,\n  ErrEip2612DeadlineExpired,\n  ErrErc20ApprovalTxFailed,\n} from \"../exact/facilitator/errors\";\nimport { ClientEvmSigner, FacilitatorEvmSigner } from \"../signer\";\nimport { ExactPermit2Payload, Permit2Authorization, UptoPermit2Payload } from \"../types\";\nimport { validateErc20ApprovalForPayment } from \"./erc20approval\";\nimport {\n  ErrUptoAmountExceedsPermitted,\n  ErrUptoUnauthorizedFacilitator,\n} from \"../upto/facilitator/errors\";\n\n/**\n * Base type for Permit2 payloads shared between exact and upto schemes.\n * Both {@link ExactPermit2Payload} and {@link UptoPermit2Payload} satisfy this type.\n */\nexport type Permit2PayloadBase = ExactPermit2Payload | UptoPermit2Payload;\n\n/**\n * Configuration for the Permit2 proxy contract used during settlement.\n * The exact and upto schemes use different proxy addresses and ABIs.\n */\nexport type Permit2ProxyConfig = {\n  /** The deployed proxy contract address. */\n  proxyAddress: `0x${string}`;\n  /** The proxy contract ABI (must include settle and settleWithPermit functions). */\n  proxyABI: readonly Record<string, unknown>[];\n};\n\n/**\n * Checks Permit2 allowance and validates gas sponsoring extensions if allowance is insufficient.\n *\n * When the on-chain ERC-20 allowance to the Permit2 contract is below the required amount,\n * this function falls back to validating EIP-2612 or ERC-20 approval gas sponsoring extensions\n * attached to the payment payload.\n *\n * @param signer - The facilitator signer for on-chain reads\n * @param payload - The payment payload\n * @param requirements - The payment requirements\n * @param payer - The payer address\n * @param tokenAddress - The token contract address\n * @param context - Optional facilitator context for extension lookup\n * @returns A VerifyResponse if verification should stop (failure), or null to continue\n */\nexport async function verifyPermit2Allowance(\n  signer: FacilitatorEvmSigner,\n  payload: PaymentPayload,\n  requirements: PaymentRequirements,\n  payer: `0x${string}`,\n  tokenAddress: `0x${string}`,\n  context?: FacilitatorContext,\n): Promise<VerifyResponse | null> {\n  try {\n    const allowance = (await signer.readContract({\n      address: tokenAddress,\n      abi: erc20AllowanceAbi,\n      functionName: \"allowance\",\n      args: [payer, PERMIT2_ADDRESS],\n    })) as bigint;\n\n    if (allowance >= BigInt(requirements.amount)) {\n      return null; // Sufficient allowance, continue verification\n    }\n\n    // Allowance insufficient — try EIP-2612 gas sponsoring first\n    const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n    if (eip2612Info) {\n      const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n      if (!result.isValid) {\n        return { isValid: false, invalidReason: result.invalidReason!, payer };\n      }\n      return null; // EIP-2612 is valid, allowance will be set atomically during settlement\n    }\n\n    // Try ERC-20 approval gas sponsoring as fallback\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 result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n        if (!result.isValid) {\n          return { isValid: false, invalidReason: result.invalidReason!, payer };\n        }\n        return null; // ERC-20 approval is valid, will be broadcast before settlement\n      }\n    }\n\n    return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n  } catch {\n    // Allowance check failed — validate extensions if present; fail closed if none valid\n    const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n    if (eip2612Info) {\n      const result = validateEip2612PermitForPayment(eip2612Info, payer, tokenAddress);\n      if (!result.isValid) {\n        return { isValid: false, invalidReason: result.invalidReason!, payer };\n      }\n      return null;\n    }\n\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 result = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n        if (!result.isValid) {\n          return { isValid: false, invalidReason: result.invalidReason!, payer };\n        }\n        return null;\n      }\n    }\n\n    return { isValid: false, invalidReason: \"permit2_allowance_required\", payer };\n  }\n}\n\n/**\n * Waits for a transaction receipt and returns the appropriate SettleResponse.\n *\n * @param signer - Signer with waitForTransactionReceipt capability\n * @param tx - The transaction hash to wait for\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function waitAndReturnSettleResponse(\n  signer: Pick<FacilitatorEvmSigner, \"waitForTransactionReceipt\">,\n  tx: `0x${string}`,\n  payload: PaymentPayload,\n  payer: `0x${string}`,\n): Promise<SettleResponse> {\n  const receipt = await signer.waitForTransactionReceipt({ hash: tx });\n\n  if (receipt.status !== \"success\") {\n    return {\n      success: false,\n      errorReason: ErrInvalidTransactionState,\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}\n\n/**\n * Maps contract revert errors to structured SettleResponse error reasons.\n *\n * Inspects the error message for known contract revert strings and maps them\n * to the corresponding error reason constants. Falls back to a generic\n * \"transaction_failed\" reason with truncated message for unrecognized errors.\n *\n * @param error - The caught error (typically from a contract write)\n * @param payload - The payment payload (for network info)\n * @param payer - The payer address\n * @returns A failed SettleResponse with the mapped error reason\n */\nexport function mapSettleError(\n  error: unknown,\n  payload: PaymentPayload,\n  payer: `0x${string}`,\n): SettleResponse {\n  let errorReason: string = ErrTransactionFailed;\n  if (error instanceof Error) {\n    const message = error.message;\n    if (message.includes(\"Permit2612AmountMismatch\")) {\n      errorReason = ErrPermit2612AmountMismatch;\n    } else if (message.includes(\"InvalidAmount\")) {\n      errorReason = ErrPermit2InvalidAmount;\n    } else if (message.includes(\"InvalidDestination\")) {\n      errorReason = ErrPermit2InvalidDestination;\n    } else if (message.includes(\"InvalidOwner\")) {\n      errorReason = ErrPermit2InvalidOwner;\n    } else if (message.includes(\"PaymentTooEarly\")) {\n      errorReason = ErrPermit2PaymentTooEarly;\n    } else if (message.includes(\"InvalidSignature\") || message.includes(\"SignatureExpired\")) {\n      errorReason = ErrPermit2InvalidSignature;\n    } else if (message.includes(\"InvalidNonce\")) {\n      errorReason = ErrPermit2InvalidNonce;\n    } else if (message.includes(\"erc20_approval_tx_failed\")) {\n      errorReason = ErrErc20ApprovalTxFailed;\n    } else if (message.includes(\"AmountExceedsPermitted\")) {\n      errorReason = ErrUptoAmountExceedsPermitted;\n    } else if (message.includes(\"UnauthorizedFacilitator\")) {\n      errorReason = ErrUptoUnauthorizedFacilitator;\n    } else {\n      errorReason = `${ErrTransactionFailed}: ${message.slice(0, 500)}`;\n    }\n  }\n  return {\n    success: false,\n    errorReason,\n    transaction: \"\",\n    network: payload.accepted.network,\n    payer,\n  };\n}\n\n/**\n * Validates EIP-2612 permit extension data for a Permit2 payment.\n *\n * Checks that the permit extension has a valid format and that the from address,\n * asset address, spender address, and deadline all match expectations.\n *\n * @param info - The EIP-2612 gas sponsoring info extracted from the payment payload\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with isValid flag and optional invalidReason string\n */\nexport function validateEip2612PermitForPayment(\n  info: Eip2612GasSponsoringInfo,\n  payer: `0x${string}`,\n  tokenAddress: `0x${string}`,\n): { isValid: boolean; invalidReason?: string } {\n  if (!validateEip2612GasSponsoringInfo(info)) {\n    return { isValid: false, invalidReason: ErrInvalidEip2612ExtensionFormat };\n  }\n\n  if (getAddress(info.from as `0x${string}`) !== getAddress(payer)) {\n    return { isValid: false, invalidReason: ErrEip2612FromMismatch };\n  }\n\n  if (getAddress(info.asset as `0x${string}`) !== tokenAddress) {\n    return { isValid: false, invalidReason: ErrEip2612AssetMismatch };\n  }\n\n  if (getAddress(info.spender as `0x${string}`) !== getAddress(PERMIT2_ADDRESS)) {\n    return { isValid: false, invalidReason: ErrEip2612SpenderNotPermit2 };\n  }\n\n  const now = Math.floor(Date.now() / 1000);\n  if (BigInt(info.deadline) < BigInt(now + 6)) {\n    return { isValid: false, invalidReason: ErrEip2612DeadlineExpired };\n  }\n\n  return { isValid: true };\n}\n\n// ---------------------------------------------------------------------------\n// Simulation helpers (shared across exact and upto)\n// ---------------------------------------------------------------------------\n\n/**\n * Simulates settle() via eth_call (readContract).\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2Settle(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  settleArgs: readonly unknown[],\n): Promise<boolean> {\n  try {\n    await signer.readContract({\n      address: config.proxyAddress,\n      abi: config.proxyABI,\n      functionName: \"settle\",\n      args: settleArgs,\n    });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Simulates settleWithPermit() via eth_call (readContract).\n * The contract atomically calls token.permit() then PERMIT2.permitTransferFrom(),\n * so simulation covers allowance + balance + nonces.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param eip2612Info - EIP-2612 gas sponsoring info from the payload extension\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulatePermit2SettleWithPermit(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  settleArgs: readonly unknown[],\n  eip2612Info: Eip2612GasSponsoringInfo,\n): Promise<boolean> {\n  try {\n    const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n    await signer.readContract({\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        ...settleArgs,\n      ],\n    });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Delegates the full approve+settle simulation flow to the extension signer via simulateTransactions.\n * The signer owns execution strategy.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param extensionSigner - The extension signer with simulateTransactions capability\n * @param settleArgs - Pre-built settle function arguments (scheme-specific)\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction hex string\n * @returns true if the bundle simulation succeeded, false otherwise\n */\nexport async function simulatePermit2SettleWithErc20Approval(\n  config: Permit2ProxyConfig,\n  extensionSigner: Erc20ApprovalGasSponsoringSigner,\n  settleArgs: readonly unknown[],\n  erc20Info: { signedTransaction: string },\n): Promise<boolean> {\n  if (!extensionSigner.simulateTransactions) {\n    return false;\n  }\n\n  try {\n    const settleData = encodeFunctionData({\n      abi: config.proxyABI,\n      functionName: \"settle\",\n      args: settleArgs,\n    });\n\n    return await extensionSigner.simulateTransactions([\n      erc20Info.signedTransaction as `0x${string}`,\n      { to: config.proxyAddress, data: settleData, gas: BigInt(300_000) },\n    ]);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Diagnoses a Permit2 simulation failure by performing a multicall to check the proxy deployment, balance and allowance.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param permit2Payload - The Permit2 authorization payload\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse with the most specific failure reason\n */\nexport async function diagnosePermit2SimulationFailure(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  tokenAddress: `0x${string}`,\n  permit2Payload: Permit2PayloadBase,\n  amountRequired: string,\n): Promise<VerifyResponse> {\n  const payer = permit2Payload.permit2Authorization.from;\n\n  const diagnosticCalls: ContractCall[] = [\n    {\n      address: config.proxyAddress,\n      abi: config.proxyABI,\n      functionName: \"PERMIT2\",\n    },\n    {\n      address: tokenAddress,\n      abi: eip3009ABI,\n      functionName: \"balanceOf\",\n      args: [payer],\n    },\n    {\n      address: tokenAddress,\n      abi: erc20AllowanceAbi,\n      functionName: \"allowance\",\n      args: [payer, PERMIT2_ADDRESS],\n    },\n  ];\n\n  try {\n    const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n    const [proxyResult, balanceResult, allowanceResult] = results;\n\n    if (proxyResult.status === \"failure\") {\n      return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n    }\n\n    if (balanceResult.status === \"success\") {\n      const balance = balanceResult.result as bigint;\n      if (balance < BigInt(amountRequired)) {\n        return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n      }\n    }\n\n    if (allowanceResult.status === \"success\") {\n      const allowance = allowanceResult.result as bigint;\n      if (allowance < BigInt(amountRequired)) {\n        return { isValid: false, invalidReason: ErrPermit2AllowanceRequired, payer };\n      }\n    }\n  } catch {\n    // Diagnostic multicall itself failed — fall through to generic error\n  }\n\n  return { isValid: false, invalidReason: ErrPermit2SimulationFailed, payer };\n}\n\n/**\n * Targeted multicall for the ERC-20 approval path where simulation cannot be used\n * (the approval hasn't been broadcast yet, so settle() would fail for expected reasons).\n * Checks proxy deployment, payer token balance and payer ETH balance for gas.\n *\n * @param config - The proxy contract configuration (address and ABI)\n * @param signer - EVM signer for contract reads\n * @param tokenAddress - ERC-20 token contract address\n * @param payer - The payer address\n * @param amountRequired - Required payment amount (as string)\n * @returns VerifyResponse — valid if checks pass, otherwise the most specific failure\n */\nexport async function checkPermit2Prerequisites(\n  config: Permit2ProxyConfig,\n  signer: FacilitatorEvmSigner,\n  tokenAddress: `0x${string}`,\n  payer: `0x${string}`,\n  amountRequired: string,\n): Promise<VerifyResponse> {\n  const diagnosticCalls: ContractCall[] = [\n    {\n      address: config.proxyAddress,\n      abi: config.proxyABI,\n      functionName: \"PERMIT2\",\n    },\n    {\n      address: tokenAddress,\n      abi: eip3009ABI,\n      functionName: \"balanceOf\",\n      args: [payer],\n    },\n  ];\n\n  try {\n    const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n    const [proxyResult, balanceResult] = results;\n\n    if (proxyResult.status === \"failure\") {\n      return { isValid: false, invalidReason: ErrPermit2ProxyNotDeployed, payer };\n    }\n\n    if (balanceResult.status === \"success\") {\n      const balance = balanceResult.result as bigint;\n      if (balance < BigInt(amountRequired)) {\n        return { isValid: false, invalidReason: ErrPermit2InsufficientBalance, payer };\n      }\n    }\n  } catch {\n    // Multicall failed — fall through to valid (fail open for prerequisites-only check)\n  }\n\n  return { isValid: true, invalidReason: undefined, payer };\n}\n\n/**\n * Builds args for exact settle(permit, owner, witness, signature).\n *\n * @param permit2Payload - The Permit2 payload containing authorization and signature data\n * @returns Tuple of contract call arguments for the exact settle function\n */\nexport function buildExactPermit2SettleArgs(permit2Payload: Permit2PayloadBase) {\n  const { signature } = parseErc6492Signature(permit2Payload.signature);\n\n  return [\n    {\n      permitted: {\n        token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n        amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n      },\n      nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n      deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n    },\n    getAddress(permit2Payload.permit2Authorization.from),\n    {\n      to: getAddress(permit2Payload.permit2Authorization.witness.to),\n      validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n    },\n    signature,\n  ] as const;\n}\n\n/**\n * Builds args for upto settle(permit, amount, owner, witness, signature).\n * The upto contract's settle() takes an additional `amount` parameter and the witness\n * includes a `facilitator` field.\n *\n * @param permit2Payload - The upto Permit2 payload containing authorization and signature data\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @returns Tuple of contract call arguments for the upto settle function\n */\nexport function buildUptoPermit2SettleArgs(\n  permit2Payload: UptoPermit2Payload,\n  settlementAmount: bigint,\n  facilitatorAddress: `0x${string}`,\n) {\n  const { signature } = parseErc6492Signature(permit2Payload.signature);\n\n  return [\n    {\n      permitted: {\n        token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n        amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n      },\n      nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n      deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n    },\n    settlementAmount,\n    getAddress(permit2Payload.permit2Authorization.from),\n    {\n      to: getAddress(permit2Payload.permit2Authorization.witness.to),\n      facilitator: getAddress(facilitatorAddress),\n      validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n    },\n    signature,\n  ] as const;\n}\n\n/**\n * Splits a 65-byte EIP-2612 signature into v, r, s components.\n *\n * @param signature - The hex-encoded 65-byte signature (with or without 0x prefix)\n * @returns Object with v (uint8), r (bytes32 hex), s (bytes32 hex)\n * @throws Error if the signature is not exactly 65 bytes (130 hex chars)\n */\nexport function splitEip2612Signature(signature: string): {\n  v: number;\n  r: `0x${string}`;\n  s: `0x${string}`;\n} {\n  const sig = signature.startsWith(\"0x\") ? signature.slice(2) : signature;\n\n  if (sig.length !== 130) {\n    throw new Error(\n      `invalid EIP-2612 signature length: expected 65 bytes (130 hex chars), got ${sig.length / 2} bytes`,\n    );\n  }\n\n  const r = `0x${sig.slice(0, 64)}` as `0x${string}`;\n  const s = `0x${sig.slice(64, 128)}` as `0x${string}`;\n  const v = parseInt(sig.slice(128, 130), 16);\n\n  return { v, r, s };\n}\n\n// ---------------------------------------------------------------------------\n// Client-side helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Permit2 payload for any scheme (exact or upto).\n * The only scheme-specific input is the proxy address used as the spender.\n *\n * @param proxyAddress - The x402 proxy contract address to set as spender\n * @param signer - The EVM client signer\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 createPermit2PayloadForProxy(\n  proxyAddress: `0x${string}`,\n  signer: ClientEvmSigner,\n  x402Version: number,\n  paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n  const now = Math.floor(Date.now() / 1000);\n  const nonce = createPermit2Nonce();\n\n  // Lower time bound - allow some clock skew\n  const validAfter = \"0\";\n  // Upper time bound is enforced by Permit2's deadline field\n  const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();\n\n  const permit2Authorization: Permit2Authorization & { from: `0x${string}` } = {\n    from: signer.address,\n    permitted: {\n      token: getAddress(paymentRequirements.asset),\n      amount: paymentRequirements.amount,\n    },\n    spender: proxyAddress,\n    nonce,\n    deadline,\n    witness: {\n      to: getAddress(paymentRequirements.payTo),\n      validAfter,\n    },\n  };\n\n  const signature = await signPermit2Authorization(\n    signer,\n    permit2Authorization,\n    paymentRequirements,\n  );\n\n  return {\n    x402Version,\n    payload: { signature, permit2Authorization },\n  };\n}\n\n/**\n * Signs a Permit2 authorization using EIP-712 with witness data.\n * The signature authorizes the proxy contract to transfer tokens on behalf of the signer.\n *\n * @param signer - The EVM client signer\n * @param permit2Authorization - The Permit2 authorization parameters\n * @param requirements - The payment requirements\n * @returns Promise resolving to the hex-encoded signature\n */\nasync function signPermit2Authorization(\n  signer: ClientEvmSigner,\n  permit2Authorization: Permit2Authorization & { from: `0x${string}` },\n  requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n  const chainId = getEvmChainId(requirements.network);\n\n  return await signer.signTypedData({\n    domain: { name: \"Permit2\", chainId, verifyingContract: PERMIT2_ADDRESS },\n    types: permit2WitnessTypes,\n    primaryType: \"PermitWitnessTransferFrom\",\n    message: {\n      permitted: {\n        token: getAddress(permit2Authorization.permitted.token),\n        amount: BigInt(permit2Authorization.permitted.amount),\n      },\n      spender: getAddress(permit2Authorization.spender),\n      nonce: BigInt(permit2Authorization.nonce),\n      deadline: BigInt(permit2Authorization.deadline),\n      witness: {\n        to: getAddress(permit2Authorization.witness.to),\n        validAfter: BigInt(permit2Authorization.witness.validAfter),\n      },\n    },\n  });\n}\n","import {\n  getAddress,\n  parseTransaction,\n  decodeFunctionData,\n  recoverTransactionAddress,\n  type TransactionSerialized,\n} from \"viem\";\nimport type { VerifyResponse } from \"@x402/core/types\";\nimport {\n  validateErc20ApprovalGasSponsoringInfo,\n  type Erc20ApprovalGasSponsoringInfo,\n} from \"../exact/extensions\";\nimport { PERMIT2_ADDRESS, erc20ApproveAbi } from \"../constants\";\nimport {\n  ErrErc20ApprovalInvalidFormat,\n  ErrErc20ApprovalFromMismatch,\n  ErrErc20ApprovalAssetMismatch,\n  ErrErc20ApprovalSpenderNotPermit2,\n  ErrErc20ApprovalTxWrongTarget,\n  ErrErc20ApprovalTxWrongSelector,\n  ErrErc20ApprovalTxWrongSpender,\n  ErrErc20ApprovalTxInvalidCalldata,\n  ErrErc20ApprovalTxSignerMismatch,\n  ErrErc20ApprovalTxInvalidSignature,\n  ErrErc20ApprovalTxParseFailed,\n} from \"../exact/facilitator/errors\";\n\n/** The approve(address,uint256) function selector */\nconst APPROVE_SELECTOR = \"0x095ea7b3\";\n\n/**\n * Validates ERC-20 approval extension data for a Permit2 payment.\n *\n * Performs comprehensive validation:\n * - Format validation via validateErc20ApprovalGasSponsoringInfo (JSON Schema)\n * - `from` matches payer\n * - `asset` matches token\n * - `spender` is PERMIT2_ADDRESS\n * - Transaction `to` matches token address\n * - Transaction calldata is a valid approve(PERMIT2_ADDRESS, ...) call\n * - Recovered transaction signer matches `from`\n *\n * @param info - The ERC-20 approval gas sponsoring info\n * @param payer - The expected payer address\n * @param tokenAddress - The expected token address\n * @returns Validation result with invalidReason and invalidMessage on failure\n */\nexport async function validateErc20ApprovalForPayment(\n  info: Erc20ApprovalGasSponsoringInfo,\n  payer: `0x${string}`,\n  tokenAddress: `0x${string}`,\n): Promise<Pick<VerifyResponse, \"isValid\" | \"invalidReason\" | \"invalidMessage\">> {\n  if (!validateErc20ApprovalGasSponsoringInfo(info)) {\n    return {\n      isValid: false,\n      invalidReason: ErrErc20ApprovalInvalidFormat,\n      invalidMessage: \"ERC-20 approval extension info failed schema validation\",\n    };\n  }\n\n  if (getAddress(info.from) !== getAddress(payer)) {\n    return {\n      isValid: false,\n      invalidReason: ErrErc20ApprovalFromMismatch,\n      invalidMessage: `Expected from=${payer}, got ${info.from}`,\n    };\n  }\n\n  if (getAddress(info.asset) !== tokenAddress) {\n    return {\n      isValid: false,\n      invalidReason: ErrErc20ApprovalAssetMismatch,\n      invalidMessage: `Expected asset=${tokenAddress}, got ${info.asset}`,\n    };\n  }\n\n  if (getAddress(info.spender) !== getAddress(PERMIT2_ADDRESS)) {\n    return {\n      isValid: false,\n      invalidReason: ErrErc20ApprovalSpenderNotPermit2,\n      invalidMessage: `Expected spender=${PERMIT2_ADDRESS}, got ${info.spender}`,\n    };\n  }\n\n  try {\n    const serializedTx = info.signedTransaction as TransactionSerialized;\n    const tx = parseTransaction(serializedTx);\n\n    if (!tx.to || getAddress(tx.to) !== tokenAddress) {\n      return {\n        isValid: false,\n        invalidReason: ErrErc20ApprovalTxWrongTarget,\n        invalidMessage: `Transaction targets ${tx.to ?? \"null\"}, expected ${tokenAddress}`,\n      };\n    }\n\n    const data = tx.data ?? \"0x\";\n    if (!data.startsWith(APPROVE_SELECTOR)) {\n      return {\n        isValid: false,\n        invalidReason: ErrErc20ApprovalTxWrongSelector,\n        invalidMessage: `Transaction calldata does not start with approve() selector ${APPROVE_SELECTOR}`,\n      };\n    }\n\n    try {\n      const decoded = decodeFunctionData({\n        abi: erc20ApproveAbi,\n        data: data as `0x${string}`,\n      });\n      const calldataSpender = getAddress(decoded.args[0] as `0x${string}`);\n      if (calldataSpender !== getAddress(PERMIT2_ADDRESS)) {\n        return {\n          isValid: false,\n          invalidReason: ErrErc20ApprovalTxWrongSpender,\n          invalidMessage: `approve() spender is ${calldataSpender}, expected Permit2 ${PERMIT2_ADDRESS}`,\n        };\n      }\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: ErrErc20ApprovalTxInvalidCalldata,\n        invalidMessage: \"Failed to decode approve() calldata from the signed transaction\",\n      };\n    }\n\n    try {\n      const recoveredAddress = await recoverTransactionAddress({\n        serializedTransaction: serializedTx,\n      });\n      if (getAddress(recoveredAddress) !== getAddress(payer)) {\n        return {\n          isValid: false,\n          invalidReason: ErrErc20ApprovalTxSignerMismatch,\n          invalidMessage: `Transaction signed by ${recoveredAddress}, expected payer ${payer}`,\n        };\n      }\n    } catch {\n      return {\n        isValid: false,\n        invalidReason: ErrErc20ApprovalTxInvalidSignature,\n        invalidMessage: \"Failed to recover signer from the signed transaction\",\n      };\n    }\n  } catch {\n    return {\n      isValid: false,\n      invalidReason: ErrErc20ApprovalTxParseFailed,\n      invalidMessage: \"Failed to parse the signed transaction\",\n    };\n  }\n\n  return { isValid: true };\n}\n","/**\n * Named error reason constants for the upto EVM facilitator.\n *\n * Shared Permit2 errors are re-exported from exact/facilitator/errors.ts.\n * Upto-specific errors are defined here.\n *\n * These strings must be character-for-character identical to the Go constants\n * to maintain cross-SDK parity.\n */\n\n// Re-export shared EVM errors\nexport { ErrAssetNotDeployedContract } from \"../../exact/facilitator/errors\";\n\n// Re-export shared Permit2 errors\nexport {\n  ErrPermit2InvalidSpender,\n  ErrPermit2RecipientMismatch,\n  ErrPermit2DeadlineExpired,\n  ErrPermit2NotYetValid,\n  ErrPermit2AmountMismatch,\n  ErrPermit2TokenMismatch,\n  ErrPermit2InvalidSignature,\n  ErrPermit2AllowanceRequired,\n  ErrPermit2InvalidAmount,\n  ErrPermit2InvalidDestination,\n  ErrPermit2InvalidOwner,\n  ErrPermit2PaymentTooEarly,\n  ErrPermit2InvalidNonce,\n  ErrPermit2612AmountMismatch,\n  ErrErc20ApprovalInvalidFormat,\n  ErrErc20ApprovalFromMismatch,\n  ErrErc20ApprovalAssetMismatch,\n  ErrErc20ApprovalSpenderNotPermit2,\n  ErrErc20ApprovalTxWrongTarget,\n  ErrErc20ApprovalTxWrongSelector,\n  ErrErc20ApprovalTxWrongSpender,\n  ErrErc20ApprovalTxInvalidCalldata,\n  ErrErc20ApprovalTxSignerMismatch,\n  ErrErc20ApprovalTxInvalidSignature,\n  ErrErc20ApprovalTxParseFailed,\n} from \"../../exact/facilitator/errors\";\n\n// Upto-specific errors\nexport const ErrUptoInvalidScheme = \"invalid_upto_evm_scheme\";\nexport const ErrUptoNetworkMismatch = \"invalid_upto_evm_network_mismatch\";\nexport const ErrUptoSettlementExceedsAmount = \"invalid_upto_evm_payload_settlement_exceeds_amount\";\nexport const ErrUptoAmountExceedsPermitted = \"upto_amount_exceeds_permitted\";\nexport const ErrUptoUnauthorizedFacilitator = \"upto_unauthorized_facilitator\";\nexport const ErrUptoFacilitatorMismatch = \"upto_facilitator_mismatch\";\n"],"mappings":"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","names":["getAddress","getAddress"]}