{"version":3,"sources":["../../src/erc20-approval-gas-sponsoring/server.ts","../../src/erc20-approval-gas-sponsoring/client.ts","../../src/erc20-approval-gas-sponsoring/facilitator.ts"],"sourcesContent":["/**\n * ERC-20 Approval Gas Sponsoring Extension Server-Side Implementation\n *\n * Provides functions for servers to declare gas sponsoring requirements,\n * parse client headers, and validate approval payloads.\n */\n\nimport type {\n  ERC20ApprovalGasSponsorExtension,\n  ERC20ApprovalGasSponsorExtensionInfo,\n  ERC20ApprovalGasSponsorPayload,\n  DeclareERC20ApprovalGasSponsorOptions,\n  ValidateERC20ApprovalGasSponsorOptions,\n  ERC20ApprovalGasSponsorValidationResult,\n} from \"./types.js\";\n\n/**\n * JSON Schema for ERC-20 approval gas sponsor payload validation.\n */\nconst ERC20_APPROVAL_GAS_SPONSOR_SCHEMA = {\n  type: \"object\",\n  required: [\"network\", \"from\", \"asset\", \"amount\", \"signedApprovalTx\", \"chainId\"],\n  properties: {\n    network: { type: \"string\" },\n    from: { type: \"string\" },\n    asset: { type: \"string\" },\n    amount: { type: \"string\" },\n    signedApprovalTx: { type: \"string\" },\n    chainId: { type: \"number\" },\n    nonce: { type: \"number\" },\n  },\n};\n\n/**\n * Declares an ERC-20 approval gas sponsor extension for server responses.\n *\n * @param options - Extension declaration options\n * @returns Gas sponsor extension object ready for response\n *\n * @example\n * ```typescript\n * const extension = declareERC20ApprovalGasSponsorExtension({\n *   sponsoredNetworks: [\"eip155:8453\", \"eip155:42161\"],\n *   maxAmount: \"1000000000\",\n *   sponsorAddress: \"0xFacilitator...\",\n *   requiresAtomicBatch: true,\n * });\n * ```\n */\nexport function declareERC20ApprovalGasSponsorExtension(\n  options: DeclareERC20ApprovalGasSponsorOptions,\n): ERC20ApprovalGasSponsorExtension {\n  const info: ERC20ApprovalGasSponsorExtensionInfo = {\n    sponsoredNetworks: options.sponsoredNetworks,\n    maxAmount: options.maxAmount,\n    sponsorAddress: options.sponsorAddress,\n    requiresAtomicBatch: options.requiresAtomicBatch ?? false,\n  };\n\n  if (options.permit2Address) {\n    info.permit2Address = options.permit2Address;\n  }\n\n  return {\n    info,\n    schema: ERC20_APPROVAL_GAS_SPONSOR_SCHEMA,\n  };\n}\n\n/**\n * Parses an ERC-20 approval gas sponsor header from client request.\n *\n * The header format is base64-encoded JSON.\n *\n * @param header - Base64-encoded gas sponsor header value\n * @returns Parsed gas sponsor payload\n * @throws Error if header is invalid\n *\n * @example\n * ```typescript\n * const payload = parseERC20ApprovalGasSponsorHeader(\n *   request.headers['x-t402-erc20-approval-gas-sponsoring']\n * );\n * ```\n */\nexport function parseERC20ApprovalGasSponsorHeader(header: string): ERC20ApprovalGasSponsorPayload {\n  if (!header) {\n    throw new Error(\"Missing ERC-20 approval gas sponsor header\");\n  }\n\n  try {\n    const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n    const payload = JSON.parse(decoded) as ERC20ApprovalGasSponsorPayload;\n\n    const required = [\"network\", \"from\", \"asset\", \"amount\", \"signedApprovalTx\", \"chainId\"];\n    for (const field of required) {\n      if (!(field in payload)) {\n        throw new Error(`Missing required field: ${field}`);\n      }\n    }\n\n    return payload;\n  } catch (error) {\n    if (error instanceof SyntaxError) {\n      throw new Error(\"Invalid ERC-20 approval gas sponsor header: malformed JSON\");\n    }\n    throw error;\n  }\n}\n\n/**\n * Validates an ERC-20 approval gas sponsor payload against server extension info.\n *\n * @param payload - The gas sponsor payload from the client\n * @param extensionInfo - The server's gas sponsor extension info\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validateERC20ApprovalGasSponsorPayload(payload, extension.info);\n * if (!result.valid) {\n *   throw new Error(result.error);\n * }\n * ```\n */\nexport function validateERC20ApprovalGasSponsorPayload(\n  payload: ERC20ApprovalGasSponsorPayload,\n  extensionInfo: ERC20ApprovalGasSponsorExtensionInfo,\n  options: ValidateERC20ApprovalGasSponsorOptions = {},\n): ERC20ApprovalGasSponsorValidationResult {\n  // Validate network is in sponsoredNetworks\n  if (!extensionInfo.sponsoredNetworks.includes(payload.network)) {\n    return {\n      valid: false,\n      error: `Network ${payload.network} is not in sponsored networks: ${extensionInfo.sponsoredNetworks.join(\", \")}`,\n    };\n  }\n\n  // Validate amount does not exceed maxAmount\n  const payloadAmount = BigInt(payload.amount);\n  const maxAmount = BigInt(extensionInfo.maxAmount);\n  if (payloadAmount > maxAmount) {\n    return {\n      valid: false,\n      error: `Amount ${payload.amount} exceeds maximum amount ${extensionInfo.maxAmount}`,\n    };\n  }\n\n  // Validate chainId matches expected value for network (if provided)\n  if (options.expectedChainIds) {\n    const expectedChainId = options.expectedChainIds[payload.network];\n    if (expectedChainId !== undefined && payload.chainId !== expectedChainId) {\n      return {\n        valid: false,\n        error: `Chain ID ${payload.chainId} does not match expected chain ID ${expectedChainId} for network ${payload.network}`,\n      };\n    }\n  }\n\n  // Validate signedApprovalTx is hex-encoded\n  const txHex = payload.signedApprovalTx.startsWith(\"0x\")\n    ? payload.signedApprovalTx.slice(2)\n    : payload.signedApprovalTx;\n  if (txHex.length === 0) {\n    return {\n      valid: false,\n      error: \"Signed approval transaction is empty\",\n    };\n  }\n  if (!/^[0-9a-fA-F]+$/.test(txHex)) {\n    return {\n      valid: false,\n      error: \"Signed approval transaction is not valid hex\",\n    };\n  }\n\n  // Validate from address format\n  const fromHex = payload.from.startsWith(\"0x\") ? payload.from.slice(2) : payload.from;\n  if (fromHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(fromHex)) {\n    return {\n      valid: false,\n      error: `Invalid from address: ${payload.from}`,\n    };\n  }\n\n  // Validate asset address format\n  const assetHex = payload.asset.startsWith(\"0x\") ? payload.asset.slice(2) : payload.asset;\n  if (assetHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(assetHex)) {\n    return {\n      valid: false,\n      error: `Invalid asset address: ${payload.asset}`,\n    };\n  }\n\n  return { valid: true };\n}\n","/**\n * ERC-20 Approval Gas Sponsoring Extension Client-Side Implementation\n *\n * Provides functions for clients to construct ERC-20 approve() calldata\n * and encode gas sponsor payloads for transmission.\n */\n\nimport type {\n  ERC20ApprovalGasSponsorPayload,\n  ERC20ApprovalGasSponsorExtensionInfo,\n  CreateERC20ApprovalParams,\n} from \"./types.js\";\n\n/**\n * Extension key for ERC-20 approval gas sponsoring in payment requirements.\n */\nexport const ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY = \"erc20ApprovalGasSponsoring\";\n\n/**\n * HTTP header name for ERC-20 approval gas sponsor payload.\n */\nexport const ERC20_APPROVAL_GAS_SPONSOR_HEADER_NAME = \"X-T402-ERC20-Approval-Gas-Sponsoring\";\n\n/**\n * ERC-20 approve(address,uint256) function selector.\n */\nexport const APPROVE_FUNCTION_SELECTOR = \"0x095ea7b3\";\n\n/**\n * Encodes ERC-20 approve(address spender, uint256 amount) calldata.\n *\n * @param spender - The spender address to approve\n * @param amount - The approval amount in base units\n * @returns Hex-encoded calldata with 0x prefix\n *\n * @example\n * ```typescript\n * const calldata = encodeApproveCalldata(\"0xFacilitator...\", \"1000000\");\n * // Returns \"0x095ea7b3\" + abi-encoded args\n * ```\n */\nexport function encodeApproveCalldata(spender: string, amount: string): string {\n  // Remove 0x prefix from spender address\n  const spenderHex = spender.startsWith(\"0x\") ? spender.slice(2) : spender;\n\n  // Pad spender address to 32 bytes (left-padded with zeros)\n  const paddedSpender = spenderHex.toLowerCase().padStart(64, \"0\");\n\n  // Convert amount to hex and pad to 32 bytes (left-padded with zeros)\n  const amountBigInt = BigInt(amount);\n  const amountHex = amountBigInt.toString(16).padStart(64, \"0\");\n\n  return APPROVE_FUNCTION_SELECTOR + paddedSpender + amountHex;\n}\n\n/**\n * Creates an ERC-20 approval gas sponsor payload from params and extension info.\n *\n * @param _info - The server's extension info (reserved for future use)\n * @param params - The approval parameters\n * @returns Gas sponsor payload ready for header encoding\n *\n * @example\n * ```typescript\n * const payload = createERC20ApprovalGasSponsorPayload(extensionInfo, {\n *   network: \"eip155:8453\",\n *   from: wallet.address,\n *   asset: \"0xUSDT...\",\n *   amount: \"1000000\",\n *   signedApprovalTx: signedTx,\n *   chainId: 8453,\n * });\n * ```\n */\nexport function createERC20ApprovalGasSponsorPayload(\n  _info: ERC20ApprovalGasSponsorExtensionInfo,\n  params: CreateERC20ApprovalParams,\n): ERC20ApprovalGasSponsorPayload {\n  const payload: ERC20ApprovalGasSponsorPayload = {\n    network: params.network,\n    from: params.from,\n    asset: params.asset,\n    amount: params.amount,\n    signedApprovalTx: params.signedApprovalTx.startsWith(\"0x\")\n      ? params.signedApprovalTx\n      : \"0x\" + params.signedApprovalTx,\n    chainId: params.chainId,\n  };\n\n  if (params.nonce !== undefined) {\n    payload.nonce = params.nonce;\n  }\n\n  return payload;\n}\n\n/**\n * Encodes an ERC-20 approval gas sponsor payload for transmission in HTTP header.\n *\n * @param payload - The gas sponsor payload to encode\n * @returns Base64-encoded JSON string\n *\n * @example\n * ```typescript\n * const header = encodeERC20ApprovalGasSponsorHeader(payload);\n * fetch(url, {\n *   headers: { [ERC20_APPROVAL_GAS_SPONSOR_HEADER_NAME]: header }\n * });\n * ```\n */\nexport function encodeERC20ApprovalGasSponsorHeader(\n  payload: ERC20ApprovalGasSponsorPayload,\n): string {\n  const json = JSON.stringify(payload);\n  if (typeof Buffer !== \"undefined\") {\n    return Buffer.from(json, \"utf-8\").toString(\"base64\");\n  }\n  return btoa(json);\n}\n","/**\n * ERC-20 Approval Gas Sponsoring Extension Facilitator-Side Implementation\n *\n * Provides functions for facilitators to extract approval data from payment\n * extensions, validate the signed approve() transaction, and prepare for\n * on-chain submission.\n */\n\nimport type {\n  ERC20ApprovalGasSponsorPayload,\n  ERC20ApprovalGasSponsorExtensionInfo,\n  ERC20ApprovalGasSponsorValidationResult,\n} from \"./types.js\";\nimport { ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY, APPROVE_FUNCTION_SELECTOR } from \"./client.js\";\nimport { validateERC20ApprovalGasSponsorPayload } from \"./server.js\";\n\n/**\n * Extracts the ERC-20 approval gas sponsor payload from payment extensions.\n *\n * @param extensions - The extensions map from a PaymentPayload\n * @returns The gas sponsor payload if present, or null\n *\n * @example\n * ```typescript\n * const approval = extractERC20ApprovalGasSponsorPayload(paymentPayload.extensions);\n * if (approval) {\n *   // Validate and broadcast the approval tx, then settle\n * }\n * ```\n */\nexport function extractERC20ApprovalGasSponsorPayload(\n  extensions: Record<string, unknown> | undefined,\n): ERC20ApprovalGasSponsorPayload | null {\n  if (!extensions) {\n    return null;\n  }\n\n  const raw = extensions[ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY];\n  if (!raw || typeof raw !== \"object\") {\n    return null;\n  }\n\n  const payload = raw as Record<string, unknown>;\n\n  // Validate required fields are present\n  const required = [\"network\", \"from\", \"asset\", \"amount\", \"signedApprovalTx\", \"chainId\"];\n  for (const field of required) {\n    if (!(field in payload)) {\n      return null;\n    }\n  }\n\n  const result: ERC20ApprovalGasSponsorPayload = {\n    network: payload.network as string,\n    from: payload.from as string,\n    asset: payload.asset as string,\n    amount: payload.amount as string,\n    signedApprovalTx: payload.signedApprovalTx as string,\n    chainId: payload.chainId as number,\n  };\n\n  if (\"nonce\" in payload && payload.nonce !== undefined) {\n    result.nonce = payload.nonce as number;\n  }\n\n  return result;\n}\n\n/**\n * Processes and validates an ERC-20 approval payload for the facilitator.\n *\n * Combines extraction validation with approve() function selector verification.\n * Checks that the signed transaction data contains the correct approve() selector\n * and that the approval amount matches the declared amount.\n *\n * @param payload - The ERC-20 approval gas sponsor payload\n * @param extensionInfo - The server's gas sponsor extension info\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = processERC20ApprovalPayload(payload, extensionInfo);\n * if (result.valid) {\n *   // Safe to broadcast the approval tx and settle\n * }\n * ```\n */\nexport function processERC20ApprovalPayload(\n  payload: ERC20ApprovalGasSponsorPayload,\n  extensionInfo: ERC20ApprovalGasSponsorExtensionInfo,\n): ERC20ApprovalGasSponsorValidationResult {\n  // Run standard validation\n  const validationResult = validateERC20ApprovalGasSponsorPayload(payload, extensionInfo);\n  if (!validationResult.valid) {\n    return validationResult;\n  }\n\n  // Verify the signed tx is not empty\n  const txHex = payload.signedApprovalTx.startsWith(\"0x\")\n    ? payload.signedApprovalTx.slice(2)\n    : payload.signedApprovalTx;\n\n  if (txHex.length < 8) {\n    return {\n      valid: false,\n      error: \"Signed approval transaction is too short to contain function selector\",\n    };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Validates and extracts the ERC-20 approval gas sponsor payload in one step.\n *\n * This is a convenience function for facilitators that combines extraction\n * and validation against the server's extension info.\n *\n * @param extensions - The extensions map from a PaymentPayload\n * @param extensionInfo - The server's gas sponsor extension info\n * @returns Validation result with the extracted payload if valid\n *\n * @example\n * ```typescript\n * const result = validateAndExtractApproval(\n *   paymentPayload.extensions,\n *   extensionInfo\n * );\n * if (result.valid && result.payload) {\n *   // Broadcast approval tx, then settle\n * }\n * ```\n */\nexport function validateAndExtractApproval(\n  extensions: Record<string, unknown> | undefined,\n  extensionInfo: ERC20ApprovalGasSponsorExtensionInfo,\n): ERC20ApprovalGasSponsorValidationResult & { payload?: ERC20ApprovalGasSponsorPayload } {\n  const payload = extractERC20ApprovalGasSponsorPayload(extensions);\n\n  if (!payload) {\n    return {\n      valid: false,\n      error: `Missing or invalid ${ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY} extension in payment`,\n    };\n  }\n\n  const result = processERC20ApprovalPayload(payload, extensionInfo);\n\n  if (!result.valid) {\n    return result;\n  }\n\n  return { valid: true, payload };\n}\n\n/**\n * Decodes the approve() calldata from a hex string to extract spender and amount.\n *\n * @param calldata - Hex-encoded approve() calldata (with or without 0x prefix)\n * @returns Decoded spender and amount, or null if not valid approve() calldata\n *\n * @example\n * ```typescript\n * const decoded = decodeApproveCalldata(\"0x095ea7b3...\");\n * if (decoded) {\n *   console.log(decoded.spender, decoded.amount);\n * }\n * ```\n */\nexport function decodeApproveCalldata(\n  calldata: string,\n): { spender: string; amount: string } | null {\n  const hex = calldata.startsWith(\"0x\") ? calldata.slice(2) : calldata;\n\n  // approve(address,uint256) = 4 byte selector + 32 byte address + 32 byte amount = 136 hex chars\n  if (hex.length < 136) {\n    return null;\n  }\n\n  const selector = \"0x\" + hex.slice(0, 8);\n  if (selector !== APPROVE_FUNCTION_SELECTOR) {\n    return null;\n  }\n\n  // Extract spender address (bytes 4-36, last 20 bytes of the 32-byte word)\n  const spenderWord = hex.slice(8, 72);\n  const spender = \"0x\" + spenderWord.slice(24);\n\n  // Extract amount (bytes 36-68)\n  const amountHex = hex.slice(72, 136);\n  const amount = BigInt(\"0x\" + amountHex).toString(10);\n\n  return { spender, amount };\n}\n"],"mappings":"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","names":[]}