{"version":3,"sources":["../../src/eip2612-gas-sponsoring/server.ts","../../src/eip2612-gas-sponsoring/client.ts","../../src/eip2612-gas-sponsoring/facilitator.ts"],"sourcesContent":["/**\n * EIP-2612 Gas Sponsoring Extension Server-Side Implementation\n *\n * Provides functions for servers to declare gas sponsoring requirements,\n * parse client headers, and validate permit payloads.\n */\n\nimport type {\n  Eip2612GasSponsorExtension,\n  Eip2612GasSponsorExtensionInfo,\n  Eip2612GasSponsorPayload,\n  DeclareEip2612GasSponsorOptions,\n  ValidateEip2612GasSponsorOptions,\n  Eip2612GasSponsorValidationResult,\n} from \"./types.js\";\n\n/**\n * JSON Schema for EIP-2612 gas sponsor payload validation.\n */\nconst EIP2612_GAS_SPONSOR_SCHEMA = {\n  type: \"object\",\n  required: [\"network\", \"permitSignature\", \"owner\", \"spender\", \"value\", \"deadline\", \"v\", \"r\", \"s\"],\n  properties: {\n    network: { type: \"string\" },\n    permitSignature: { type: \"string\" },\n    owner: { type: \"string\" },\n    spender: { type: \"string\" },\n    value: { type: \"string\" },\n    deadline: { type: \"number\" },\n    v: { type: \"number\" },\n    r: { type: \"string\" },\n    s: { type: \"string\" },\n  },\n};\n\n/**\n * Declares an EIP-2612 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 = declareEip2612GasSponsorExtension({\n *   sponsoredNetworks: [\"eip155:8453\", \"eip155:42161\"],\n *   maxAmount: \"1000000000\",\n *   sponsorAddress: \"0xFacilitator...\",\n * });\n * ```\n */\nexport function declareEip2612GasSponsorExtension(\n  options: DeclareEip2612GasSponsorOptions,\n): Eip2612GasSponsorExtension {\n  const info: Eip2612GasSponsorExtensionInfo = {\n    sponsoredNetworks: options.sponsoredNetworks,\n    maxAmount: options.maxAmount,\n    permitDeadline: options.permitDeadline ?? 300,\n    sponsorAddress: options.sponsorAddress,\n  };\n\n  return {\n    info,\n    schema: EIP2612_GAS_SPONSOR_SCHEMA,\n  };\n}\n\n/**\n * Parses an EIP-2612 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 = parseEip2612GasSponsorHeader(\n *   request.headers['x-t402-eip2612-gas-sponsoring']\n * );\n * ```\n */\nexport function parseEip2612GasSponsorHeader(header: string): Eip2612GasSponsorPayload {\n  if (!header) {\n    throw new Error(\"Missing EIP-2612 gas sponsor header\");\n  }\n\n  try {\n    const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n    const payload = JSON.parse(decoded) as Eip2612GasSponsorPayload;\n\n    const required = [\n      \"network\",\n      \"permitSignature\",\n      \"owner\",\n      \"spender\",\n      \"value\",\n      \"deadline\",\n      \"v\",\n      \"r\",\n      \"s\",\n    ];\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 EIP-2612 gas sponsor header: malformed JSON\");\n    }\n    throw error;\n  }\n}\n\n/**\n * Validates an EIP-2612 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 = validateEip2612GasSponsorPayload(payload, extension.info);\n * if (!result.valid) {\n *   throw new Error(result.error);\n * }\n * ```\n */\nexport function validateEip2612GasSponsorPayload(\n  payload: Eip2612GasSponsorPayload,\n  extensionInfo: Eip2612GasSponsorExtensionInfo,\n  options: ValidateEip2612GasSponsorOptions = {},\n): Eip2612GasSponsorValidationResult {\n  const now = options.now ? options.now() : Date.now();\n  const nowSeconds = Math.floor(now / 1000);\n\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 payloadValue = BigInt(payload.value);\n  const maxAmount = BigInt(extensionInfo.maxAmount);\n  if (payloadValue > maxAmount) {\n    return {\n      valid: false,\n      error: `Value ${payload.value} exceeds maximum amount ${extensionInfo.maxAmount}`,\n    };\n  }\n\n  // Validate deadline is in the future\n  if (payload.deadline <= nowSeconds) {\n    return {\n      valid: false,\n      error: \"Permit deadline has expired\",\n    };\n  }\n\n  // Validate deadline does not exceed permitDeadline seconds from now\n  const maxDeadline = nowSeconds + extensionInfo.permitDeadline;\n  if (payload.deadline > maxDeadline) {\n    return {\n      valid: false,\n      error: `Permit deadline ${payload.deadline} exceeds maximum allowed deadline ${maxDeadline}`,\n    };\n  }\n\n  // Validate spender matches sponsorAddress\n  if (payload.spender.toLowerCase() !== extensionInfo.sponsorAddress.toLowerCase()) {\n    return {\n      valid: false,\n      error: `Spender ${payload.spender} does not match sponsor address ${extensionInfo.sponsorAddress}`,\n    };\n  }\n\n  // Validate permitSignature format (65 bytes = 130 hex chars)\n  const sigHex = payload.permitSignature.startsWith(\"0x\")\n    ? payload.permitSignature.slice(2)\n    : payload.permitSignature;\n  if (sigHex.length !== 130) {\n    return {\n      valid: false,\n      error: `Invalid permit signature length: expected 130 hex chars, got ${sigHex.length}`,\n    };\n  }\n\n  // Validate v is 27 or 28\n  if (payload.v !== 27 && payload.v !== 28) {\n    return {\n      valid: false,\n      error: `Invalid v value: expected 27 or 28, got ${payload.v}`,\n    };\n  }\n\n  // Validate r format (32 bytes = 64 hex chars)\n  const rHex = payload.r.startsWith(\"0x\") ? payload.r.slice(2) : payload.r;\n  if (rHex.length !== 64) {\n    return {\n      valid: false,\n      error: `Invalid r length: expected 64 hex chars, got ${rHex.length}`,\n    };\n  }\n\n  // Validate s format (32 bytes = 64 hex chars)\n  const sHex = payload.s.startsWith(\"0x\") ? payload.s.slice(2) : payload.s;\n  if (sHex.length !== 64) {\n    return {\n      valid: false,\n      error: `Invalid s length: expected 64 hex chars, got ${sHex.length}`,\n    };\n  }\n\n  return { valid: true };\n}\n","/**\n * EIP-2612 Gas Sponsoring Extension Client-Side Implementation\n *\n * Provides functions for clients to create EIP-2612 permit signatures\n * and encode gas sponsor payloads for transmission.\n */\n\nimport type { Eip2612GasSponsorPayload, CreatePermitParams } from \"./types.js\";\n\n/**\n * Extension key for EIP-2612 gas sponsoring in payment requirements.\n */\nexport const EIP2612_GAS_SPONSOR_EXTENSION_KEY = \"eip2612GasSponsoring\";\n\n/**\n * HTTP header name for EIP-2612 gas sponsor payload.\n */\nexport const EIP2612_GAS_SPONSOR_HEADER_NAME = \"X-T402-EIP2612-Gas-Sponsoring\";\n\n/**\n * Creates an EIP-2612 permit signature using EIP-712 typed data signing.\n *\n * @param params - Permit signing parameters\n * @returns Permit data including the signature components\n *\n * @example\n * ```typescript\n * const permit = await createPermitSignature({\n *   signer: wallet,\n *   tokenAddress: \"0xUSDT...\",\n *   tokenName: \"Tether USD\",\n *   chainId: 8453,\n *   spender: facilitatorAddress,\n *   value: \"1000000\",\n *   deadline: Math.floor(Date.now() / 1000) + 300,\n * });\n * ```\n */\nexport async function createPermitSignature(params: CreatePermitParams): Promise<{\n  owner: string;\n  spender: string;\n  value: string;\n  deadline: number;\n  v: number;\n  r: string;\n  s: string;\n  permitSignature: string;\n}> {\n  const { signer, tokenAddress, tokenName, chainId, spender, value, deadline, nonce = 0 } = params;\n\n  const domain = {\n    name: tokenName,\n    version: \"1\",\n    chainId,\n    verifyingContract: tokenAddress,\n  };\n\n  const types = {\n    Permit: [\n      { name: \"owner\", type: \"address\" },\n      { name: \"spender\", type: \"address\" },\n      { name: \"value\", type: \"uint256\" },\n      { name: \"nonce\", type: \"uint256\" },\n      { name: \"deadline\", type: \"uint256\" },\n    ],\n  };\n\n  const message = {\n    owner: signer.address,\n    spender,\n    value,\n    nonce,\n    deadline,\n  };\n\n  const signature = await signer.signTypedData({\n    domain,\n    types,\n    primaryType: \"Permit\",\n    message,\n  });\n\n  // Parse signature into components\n  const sigHex = signature.startsWith(\"0x\") ? signature.slice(2) : signature;\n\n  if (sigHex.length !== 130) {\n    throw new Error(`Invalid signature length: expected 130 hex chars, got ${sigHex.length}`);\n  }\n\n  const r = \"0x\" + sigHex.slice(0, 64);\n  const s = \"0x\" + sigHex.slice(64, 128);\n  let v = parseInt(sigHex.slice(128, 130), 16);\n\n  // Normalize v to 27 or 28\n  if (v < 27) {\n    v += 27;\n  }\n\n  return {\n    owner: signer.address,\n    spender,\n    value,\n    deadline,\n    v,\n    r,\n    s,\n    permitSignature: signature.startsWith(\"0x\") ? signature : \"0x\" + signature,\n  };\n}\n\n/**\n * Creates a gas sponsor payload from permit data and network.\n *\n * @param permit - Permit signature data from createPermitSignature\n * @param permit.owner - Token owner address\n * @param permit.spender - Approved spender address\n * @param permit.value - Token amount in base units\n * @param permit.deadline - Unix timestamp for permit expiry\n * @param permit.v - Recovery parameter from signature\n * @param permit.r - Signature r component (32 bytes hex)\n * @param permit.s - Signature s component (32 bytes hex)\n * @param permit.permitSignature - Full hex-encoded permit signature\n * @param network - CAIP-2 network identifier (e.g., \"eip155:8453\")\n * @returns Gas sponsor payload ready for header encoding\n *\n * @example\n * ```typescript\n * const payload = createEip2612GasSponsorPayload(permit, \"eip155:8453\");\n * ```\n */\nexport function createEip2612GasSponsorPayload(\n  permit: {\n    owner: string;\n    spender: string;\n    value: string;\n    deadline: number;\n    v: number;\n    r: string;\n    s: string;\n    permitSignature: string;\n  },\n  network: string,\n): Eip2612GasSponsorPayload {\n  return {\n    network,\n    permitSignature: permit.permitSignature,\n    owner: permit.owner,\n    spender: permit.spender,\n    value: permit.value,\n    deadline: permit.deadline,\n    v: permit.v,\n    r: permit.r,\n    s: permit.s,\n  };\n}\n\n/**\n * Encodes a 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 = encodeEip2612GasSponsorHeader(payload);\n * fetch(url, {\n *   headers: { [EIP2612_GAS_SPONSOR_HEADER_NAME]: header }\n * });\n * ```\n */\nexport function encodeEip2612GasSponsorHeader(payload: Eip2612GasSponsorPayload): 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 * EIP-2612 Gas Sponsoring Extension Facilitator-Side Implementation\n *\n * Provides functions for facilitators to extract permit data from payment\n * extensions, validate permits, and prepare on-chain submission.\n */\n\nimport type {\n  Eip2612GasSponsorPayload,\n  Eip2612GasSponsorExtensionInfo,\n  Eip2612GasSponsorValidationResult,\n} from \"./types.js\";\nimport { EIP2612_GAS_SPONSOR_EXTENSION_KEY } from \"./client.js\";\nimport { validateEip2612GasSponsorPayload } from \"./server.js\";\n\n/**\n * Extracts the EIP-2612 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 permit = extractEip2612GasSponsorPayload(paymentPayload.extensions);\n * if (permit) {\n *   // Submit permit tx then settle via Permit2\n * }\n * ```\n */\nexport function extractEip2612GasSponsorPayload(\n  extensions: Record<string, unknown> | undefined,\n): Eip2612GasSponsorPayload | null {\n  if (!extensions) {\n    return null;\n  }\n\n  const raw = extensions[EIP2612_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 = [\n    \"network\",\n    \"permitSignature\",\n    \"owner\",\n    \"spender\",\n    \"value\",\n    \"deadline\",\n    \"v\",\n    \"r\",\n    \"s\",\n  ];\n  for (const field of required) {\n    if (!(field in payload)) {\n      return null;\n    }\n  }\n\n  return {\n    network: payload.network as string,\n    permitSignature: payload.permitSignature as string,\n    owner: payload.owner as string,\n    spender: payload.spender as string,\n    value: payload.value as string,\n    deadline: payload.deadline as number,\n    v: payload.v as number,\n    r: payload.r as string,\n    s: payload.s as string,\n  };\n}\n\n/**\n * Validates and extracts the EIP-2612 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 = validateAndExtractPermit(\n *   paymentPayload.extensions,\n *   extensionInfo\n * );\n * if (result.valid && result.payload) {\n *   // Submit permit() on token contract, then settle via Permit2\n * }\n * ```\n */\nexport function validateAndExtractPermit(\n  extensions: Record<string, unknown> | undefined,\n  extensionInfo: Eip2612GasSponsorExtensionInfo,\n): Eip2612GasSponsorValidationResult & { payload?: Eip2612GasSponsorPayload } {\n  const payload = extractEip2612GasSponsorPayload(extensions);\n\n  if (!payload) {\n    return {\n      valid: false,\n      error: `Missing or invalid ${EIP2612_GAS_SPONSOR_EXTENSION_KEY} extension in payment`,\n    };\n  }\n\n  const result = validateEip2612GasSponsorPayload(payload, extensionInfo);\n\n  if (!result.valid) {\n    return result;\n  }\n\n  return { valid: true, payload };\n}\n\n/**\n * Builds the EIP-2612 permit function call data for on-chain submission.\n *\n * Returns the ABI-encoded parameters needed to call `permit(owner, spender, value, deadline, v, r, s)`\n * on the token contract.\n *\n * @param payload - The validated gas sponsor payload\n * @returns Object with the permit call parameters\n *\n * @example\n * ```typescript\n * const permitCall = buildPermitCallData(payload);\n * // Use permitCall with your preferred web3 library to submit the tx\n * ```\n */\nexport function buildPermitCallData(payload: Eip2612GasSponsorPayload): {\n  owner: string;\n  spender: string;\n  value: string;\n  deadline: number;\n  v: number;\n  r: string;\n  s: string;\n} {\n  return {\n    owner: payload.owner,\n    spender: payload.spender,\n    value: payload.value,\n    deadline: payload.deadline,\n    v: payload.v,\n    r: payload.r,\n    s: payload.s,\n  };\n}\n"],"mappings":"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","names":[]}