{"version":3,"sources":["../../../x402-detector/src/constants.ts","../../../x402-detector/src/proxy.ts","../../../x402-detector/src/detector.ts","../../../x402-detector/src/cache.ts","../../src/schemas.ts","../../src/utils.ts","../../src/server.ts","../../src/middlewares/express.ts","../../src/middlewares/hono.ts","../../src/types.ts"],"sourcesContent":["import type { PresetTokenConfig } from \"./types\";\n\n/**\n * EIP-3009 方法签名\n * - transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)\n *\n * 支持多个方法签名变体，以兼容不同的实现：\n * - 0xe3ee160e: 标准 EIP-3009 实现\n * - 0xcf092995: 某些代币的替代实现\n */\nexport const EIP3009_SIGNATURES = [\"0xe3ee160e\", \"0xcf092995\"] as const;\n\n/**\n * EIP-2612 Permit 方法签名\n * - permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\n */\nexport const EIP2612_PERMIT = \"0xd505accf\" as const;\n\n/**\n * Uniswap Permit2 合约地址（所有链相同）\n */\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n/**\n * EIP-1967 标准实现槽位\n * keccak256(\"eip1967.proxy.implementation\") - 1\n */\nexport const EIP1967_IMPLEMENTATION_SLOT =\n  \"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\" as const;\n\n/**\n * EIP-1822 UUPS 实现槽位\n * keccak256(\"PROXIABLE\")\n */\nexport const EIP1822_IMPLEMENTATION_SLOT =\n  \"0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3\" as const;\n\n/**\n * 预设 Token 配置\n * 用于已知的特殊 Token，避免重复检测\n */\nexport const PRESET_TOKEN_CAPABILITIES: Record<string, PresetTokenConfig> = {\n  // World Liberty Financial USD - 只支持 permit\n  \"0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d\": {\n    supportedMethods: [\"permit\"],\n    supportedNetworks: [56], // BSC\n    description: \"World Liberty Financial USD (WLFI)\",\n  },\n  // 可以继续添加更多预设代币\n  // 示例：\n  // \"0x其他代币地址\": {\n  //   supportedMethods: [\"eip3009\", \"permit\"],\n  //   supportedNetworks: [1, 56],\n  //   description: \"代币名称\",\n  // },\n};\n\n","import type { Address, PublicClient } from \"viem\";\nimport type { Logger } from \"./types\";\nimport { EIP1967_IMPLEMENTATION_SLOT, EIP1822_IMPLEMENTATION_SLOT } from \"./constants\";\n\n/**\n * 默认 logger\n */\nconst defaultLogger: Logger = {\n  log: (message: string) => console.log(message),\n  error: (message: string, error?: unknown) => console.error(message, error),\n};\n\n/**\n * 检测合约是否是代理合约，并获取实现合约地址\n *\n * @param client - viem PublicClient\n * @param proxyAddress - 代理合约地址\n * @param logger - 可选的 logger\n * @returns 实现合约地址或 null\n */\nexport async function getImplementationAddress(\n  client: PublicClient,\n  proxyAddress: Address,\n  logger: Logger | null = defaultLogger,\n): Promise<Address | null> {\n  try {\n    // 方法1: 尝试读取 EIP-1967 存储槽位\n    try {\n      const implSlotData = await client.getStorageAt({\n        address: proxyAddress,\n        slot: EIP1967_IMPLEMENTATION_SLOT,\n      });\n      if (\n        implSlotData &&\n        implSlotData !== \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n      ) {\n        // 从存储槽中提取地址（最后20字节）\n        const implAddress = `0x${implSlotData.slice(-40)}` as Address;\n        if (implAddress !== \"0x0000000000000000000000000000000000000000\") {\n          logger?.log(`  📦 Detected EIP-1967 proxy, implementation: ${implAddress}`);\n          return implAddress;\n        }\n      }\n    } catch {\n      // 继续尝试其他方法\n    }\n\n    // 方法2: 尝试读取 EIP-1822 存储槽位\n    try {\n      const uupsSlotData = await client.getStorageAt({\n        address: proxyAddress,\n        slot: EIP1822_IMPLEMENTATION_SLOT,\n      });\n      if (\n        uupsSlotData &&\n        uupsSlotData !== \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n      ) {\n        const implAddress = `0x${uupsSlotData.slice(-40)}` as Address;\n        if (implAddress !== \"0x0000000000000000000000000000000000000000\") {\n          logger?.log(`  📦 Detected EIP-1822 UUPS proxy, implementation: ${implAddress}`);\n          return implAddress;\n        }\n      }\n    } catch {\n      // 继续尝试其他方法\n    }\n\n    // 方法3: 尝试调用 implementation() 函数\n    try {\n      const implABI = [\n        {\n          inputs: [],\n          name: \"implementation\",\n          outputs: [{ name: \"\", type: \"address\" }],\n          stateMutability: \"view\",\n          type: \"function\",\n        },\n      ] as const;\n\n      const implAddress = (await client.readContract({\n        address: proxyAddress,\n        abi: implABI,\n        functionName: \"implementation\",\n      })) as Address;\n\n      if (implAddress && implAddress !== \"0x0000000000000000000000000000000000000000\") {\n        logger?.log(`  📦 Detected proxy via implementation(), implementation: ${implAddress}`);\n        return implAddress;\n      }\n    } catch {\n      // 不是代理合约或不支持 implementation() 函数\n    }\n\n    return null;\n  } catch (error) {\n    logger?.error(\"Error detecting proxy implementation:\", error);\n    return null;\n  }\n}\n","import type { Address, PublicClient } from \"viem\";\nimport type { PaymentMethod, TokenPaymentCapabilities, TokenInfo, Logger } from \"./types\";\nimport {\n  EIP3009_SIGNATURES,\n  EIP2612_PERMIT,\n  PERMIT2_ADDRESS,\n  PRESET_TOKEN_CAPABILITIES,\n} from \"./constants\";\nimport { getImplementationAddress } from \"./proxy\";\n\n/**\n * 默认 logger\n */\nconst defaultLogger: Logger = {\n  log: (message: string) => console.log(message),\n  error: (message: string, error?: unknown) => console.error(message, error),\n};\n\n/**\n * 检查合约是否支持某个方法（通过字节码检查）\n * 支持代理合约检测\n *\n * @param client - viem PublicClient\n * @param tokenAddress - 合约地址\n * @param methodSelector - 方法选择器\n * @param logger - 可选的 logger\n * @returns true 如果合约支持该方法，否则 false\n */\nasync function hasMethod(\n  client: PublicClient,\n  tokenAddress: Address,\n  methodSelector: string,\n  logger: Logger | null = defaultLogger,\n): Promise<boolean> {\n  try {\n    // 尝试获取合约代码\n    const code = await client.getCode({ address: tokenAddress });\n    if (!code) return false;\n\n    // 检查字节码中是否包含方法选择器\n    const hasMethodInProxy = code.toLowerCase().includes(methodSelector.slice(2).toLowerCase());\n\n    // 如果代理合约中找到了方法，直接返回 true\n    if (hasMethodInProxy) {\n      return true;\n    }\n\n    // 如果代理合约中没有找到，尝试检测是否是代理合约\n    const implAddress = await getImplementationAddress(client, tokenAddress, logger);\n    if (implAddress) {\n      // 获取实现合约的字节码\n      const implCode = await client.getCode({ address: implAddress });\n      if (implCode) {\n        const hasMethodInImpl = implCode\n          .toLowerCase()\n          .includes(methodSelector.slice(2).toLowerCase());\n        if (hasMethodInImpl) {\n          logger?.log(`  ✅ Method ${methodSelector} found in implementation contract`);\n        }\n        return hasMethodInImpl;\n      }\n    }\n\n    return false;\n  } catch (error) {\n    logger?.error(`Error checking method ${methodSelector}:`, error);\n    return false;\n  }\n}\n\n/**\n * 检查合约是否支持多个方法签名中的任意一个\n * 支持代理合约检测\n *\n * @param client - viem PublicClient\n * @param tokenAddress - 合约地址\n * @param methodSelectors - 方法选择器列表\n * @param logger - 可选的 logger\n * @returns true 如果合约支持任意一个方法签名，否则 false\n */\nasync function hasAnyMethod(\n  client: PublicClient,\n  tokenAddress: Address,\n  methodSelectors: readonly string[],\n  logger: Logger | null = defaultLogger,\n): Promise<boolean> {\n  try {\n    // 尝试获取合约代码\n    const code = await client.getCode({ address: tokenAddress });\n    if (!code) return false;\n\n    const codeLower = code.toLowerCase();\n\n    // 检查代理合约中是否包含任何一个方法选择器\n    const hasMethodInProxy = methodSelectors.some(selector =>\n      codeLower.includes(selector.slice(2).toLowerCase()),\n    );\n\n    // 如果代理合约中找到了方法，直接返回 true\n    if (hasMethodInProxy) {\n      return true;\n    }\n\n    // 如果代理合约中没有找到，尝试检测是否是代理合约\n    const implAddress = await getImplementationAddress(client, tokenAddress, logger);\n    if (implAddress) {\n      // 获取实现合约的字节码\n      const implCode = await client.getCode({ address: implAddress });\n      if (implCode) {\n        const implCodeLower = implCode.toLowerCase();\n        const hasMethodInImpl = methodSelectors.some(selector =>\n          implCodeLower.includes(selector.slice(2).toLowerCase()),\n        );\n        if (hasMethodInImpl) {\n          logger?.log(`  ✅ Method(s) found in implementation contract`);\n        }\n        return hasMethodInImpl;\n      }\n    }\n\n    return false;\n  } catch (error) {\n    logger?.error(`Error checking methods ${methodSelectors.join(\", \")}:`, error);\n    return false;\n  }\n}\n\n/**\n * 检查 Permit2 合约是否在该链上部署\n *\n * @param client - viem PublicClient\n * @param logger - 可选的 logger\n * @returns true 如果 Permit2 合约已部署，否则 false\n */\nasync function checkPermit2Support(\n  client: PublicClient,\n  logger: Logger | null = defaultLogger,\n): Promise<boolean> {\n  try {\n    // 检查 Permit2 合约是否在该链上部署\n    const permit2Code = await client.getCode({ address: PERMIT2_ADDRESS });\n    if (!permit2Code) return false;\n\n    // 如果 Permit2 存在，理论上任何 ERC-20 都可以使用它\n    return true;\n  } catch (error) {\n    logger?.error(\"Error checking Permit2 support:\", error);\n    return false;\n  }\n}\n\n/**\n * 检测 Token 支持的支付方式\n *\n * @param tokenAddress - Token 地址\n * @param client - viem PublicClient\n * @param logger - 可选的 logger\n * @returns 检测结果\n */\nexport async function detectTokenPaymentMethods(\n  tokenAddress: string,\n  client: PublicClient,\n  logger: Logger | null = defaultLogger,\n): Promise<TokenPaymentCapabilities> {\n  const address = tokenAddress.toLowerCase() as Address;\n  const chainId = await client.getChainId();\n\n  // 检查预设配置\n  const presetCapabilities = PRESET_TOKEN_CAPABILITIES[address];\n  if (presetCapabilities) {\n    if (!chainId || !presetCapabilities.supportedNetworks.includes(chainId)) {\n      return {\n        address,\n        supportedMethods: [],\n        details: {\n          hasEIP3009: false,\n          hasPermit: false,\n          hasPermit2Approval: false,\n        },\n      };\n    }\n\n    // 从预设的方法列表构建 details\n    const hasEIP3009 = presetCapabilities.supportedMethods.includes(\"eip3009\");\n    const hasPermit = presetCapabilities.supportedMethods.includes(\"permit\");\n    const hasPermit2Approval =\n      presetCapabilities.supportedMethods.includes(\"permit2\") ||\n      presetCapabilities.supportedMethods.includes(\"permit2-witness\");\n\n    if (hasEIP3009) {\n      logger?.log(\"  ✅ EIP-3009 (transferWithAuthorization) - from preset\");\n    }\n    if (hasPermit) {\n      logger?.log(\"  ✅ EIP-2612 (permit) - from preset\");\n    }\n    if (hasPermit2Approval) {\n      logger?.log(\"  ✅ Permit2 support - from preset\");\n    }\n\n    return {\n      address,\n      supportedMethods: presetCapabilities.supportedMethods,\n      details: {\n        hasEIP3009,\n        hasPermit,\n        hasPermit2Approval,\n      },\n    };\n  }\n\n  logger?.log(`🔍 Detecting payment methods for token ${address}...`);\n\n  // 并行检测所有方法\n  const [hasEIP3009, hasPermit, hasPermit2Approval] = await Promise.all([\n    hasAnyMethod(client, address, EIP3009_SIGNATURES, logger),\n    hasMethod(client, address, EIP2612_PERMIT, logger),\n    checkPermit2Support(client, logger),\n  ]);\n\n  // 构建支持的方法列表\n  const supportedMethods: PaymentMethod[] = [];\n\n  if (hasEIP3009) {\n    supportedMethods.push(\"eip3009\");\n    logger?.log(\"  ✅ EIP-3009 (transferWithAuthorization) detected\");\n  }\n\n  if (hasPermit) {\n    supportedMethods.push(\"permit\");\n    logger?.log(\"  ✅ EIP-2612 (permit) detected\");\n  }\n\n  if (hasPermit2Approval) {\n    supportedMethods.push(\"permit2\");\n    supportedMethods.push(\"permit2-witness\");\n    logger?.log(\"  ✅ Permit2 support available (universal)\");\n  }\n\n  if (supportedMethods.length === 0) {\n    logger?.log(\"  ⚠️  No advanced payment methods detected (standard ERC-20 only)\");\n  }\n\n  return {\n    address,\n    supportedMethods,\n    details: {\n      hasEIP3009,\n      hasPermit,\n      hasPermit2Approval,\n    },\n  };\n}\n\n/**\n * 获取推荐的支付方式（仅返回 schema 支持的类型）\n * 按优先级排序：eip3009 > permit > permit2\n * 注意：permit2-witness 会被映射为 permit2，因为它们在 schema 中是同一种支付类型\n *\n * @param tokenAddress - Token 地址\n * @param client - viem PublicClient\n * @param logger - 可选的 logger\n * @returns 推荐的支付方式\n */\nexport async function getRecommendedPaymentMethod(\n  tokenAddress: string,\n  client: PublicClient,\n  logger: Logger | null = defaultLogger,\n): Promise<\"eip3009\" | \"permit2\" | \"permit\" | null> {\n  const capabilities = await detectTokenPaymentMethods(tokenAddress, client, logger);\n  const { supportedMethods } = capabilities;\n\n  if (supportedMethods.includes(\"eip3009\")) return \"eip3009\";\n  if (supportedMethods.includes(\"permit\")) return \"permit\";\n  // permit2 和 permit2-witness 都映射为 permit2（schema 只支持 permit2）\n  if (supportedMethods.includes(\"permit2\") || supportedMethods.includes(\"permit2-witness\")) {\n    return \"permit2\";\n  }\n\n  return null;\n}\n\n/**\n * 获取 Token 的 name 和 version 信息（用于 EIP-712 签名）\n * 支持代理合约（会自动从代理合约读取，因为代理合约会 delegatecall 到实现合约）\n *\n * @param tokenAddress - Token 地址\n * @param client - viem PublicClient\n * @param logger - 可选的 logger\n * @returns Token 的 name 和 version\n */\nexport async function getTokenInfo(\n  tokenAddress: string,\n  client: PublicClient,\n  logger: Logger | null = defaultLogger,\n): Promise<TokenInfo> {\n  const address = tokenAddress.toLowerCase() as Address;\n\n  // ERC-20 标准 ABI\n  const erc20ABI = [\n    {\n      inputs: [],\n      name: \"name\",\n      outputs: [{ name: \"\", type: \"string\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ] as const;\n\n  // EIP-5267 eip712Domain ABI（OpenZeppelin v5+）\n  const eip712DomainABI = [\n    {\n      inputs: [],\n      name: \"eip712Domain\",\n      outputs: [\n        { name: \"fields\", type: \"bytes1\" },\n        { name: \"name\", type: \"string\" },\n        { name: \"version\", type: \"string\" },\n        { name: \"chainId\", type: \"uint256\" },\n        { name: \"verifyingContract\", type: \"address\" },\n        { name: \"salt\", type: \"bytes32\" },\n        { name: \"extensions\", type: \"uint256[]\" },\n      ],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ] as const;\n\n  // version() ABI（OpenZeppelin v4）\n  const versionABI = [\n    {\n      inputs: [],\n      name: \"version\",\n      outputs: [{ name: \"\", type: \"string\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ] as const;\n\n  try {\n    // 检测是否为代理合约\n    const implAddress = await getImplementationAddress(client, address, logger);\n    if (implAddress) {\n      logger?.log(\n        `  📦 Reading token info from proxy, actual calls will be delegated to implementation`,\n      );\n    }\n\n    // 获取 token name (对于代理合约，delegatecall 会自动转发到实现合约)\n    const name = await client.readContract({\n      address,\n      abi: erc20ABI,\n      functionName: \"name\",\n    });\n\n    // 尝试获取 version，优先使用 EIP-5267\n    let version = \"1\"; // 默认版本\n    try {\n      const result = await client.readContract({\n        address,\n        abi: eip712DomainABI,\n        functionName: \"eip712Domain\",\n      });\n      // eip712Domain 返回 [fields, name, version, chainId, verifyingContract, salt, extensions]\n      version = result[2] as string; // version 是第 3 个元素（索引 2）\n    } catch {\n      // 回退到 version() 函数（OpenZeppelin v4）\n      try {\n        version = await client.readContract({\n          address,\n          abi: versionABI,\n          functionName: \"version\",\n        });\n      } catch {\n        // 如果两种方法都不可用，使用默认值 \"1\"\n        logger?.log(`  ℹ️  Using default version \"1\" for token ${address}`);\n      }\n    }\n\n    return {\n      name: name as string,\n      version: version as string,\n    };\n  } catch (error) {\n    logger?.error(`Error getting token info for ${address}:`, error);\n    throw new Error(`Failed to get token info: ${error}`);\n  }\n}\n","import type { PublicClient } from \"viem\";\nimport type { TokenDetectionResult, TokenDetectorOptions, Logger } from \"./types\";\nimport { detectTokenPaymentMethods, getTokenInfo } from \"./detector\";\n\n/**\n * 默认 logger\n */\nconst defaultLogger: Logger = {\n  log: (message: string) => console.log(message),\n  error: (message: string, error?: unknown) => console.error(message, error),\n};\n\n/**\n * Token 检测器 - 带缓存功能的 SDK\n *\n * 主要用于 x402-server，也可以独立使用\n */\nexport class TokenDetector {\n  /** 缓存存储 (chainId:address -> TokenDetectionResult) */\n  private cache: Map<string, TokenDetectionResult> = new Map();\n\n  /** viem PublicClient */\n  private client: PublicClient;\n\n  /** Logger 实例 */\n  private logger: Logger | null;\n\n  /**\n   * 构造函数\n   *\n   * @param client - viem PublicClient\n   * @param options - 可选配置\n   */\n  constructor(client: PublicClient, options?: TokenDetectorOptions) {\n    this.client = client;\n    this.logger = options?.logger === null ? null : options?.logger || defaultLogger;\n  }\n\n  /**\n   * 完整检测（同时获取支付能力和 Token 信息）\n   * 优先从缓存读取，缓存未命中时执行检测并缓存结果\n   *\n   * @param tokenAddress - Token 地址\n   * @returns 完整的检测结果\n   */\n  async detect(tokenAddress: string): Promise<TokenDetectionResult> {\n    const cacheKey = await this.getCacheKey(tokenAddress);\n\n    // 检查缓存\n    const cached = this.cache.get(cacheKey);\n    if (cached) {\n      this.logger?.log(`💾 Using cached result for token ${tokenAddress}`);\n      return cached;\n    }\n\n    // 并行执行检测\n    this.logger?.log(`🔍 Detecting token ${tokenAddress}...`);\n    const [capabilities, info] = await Promise.all([\n      detectTokenPaymentMethods(tokenAddress, this.client, this.logger),\n      getTokenInfo(tokenAddress, this.client, this.logger),\n    ]);\n\n    const result: TokenDetectionResult = {\n      ...capabilities,\n      ...info,\n    };\n\n    // 存入缓存\n    this.cache.set(cacheKey, result);\n\n    return result;\n  }\n\n  /**\n   * 获取推荐的支付方式\n   * 优先级：eip3009 > permit > permit2\n   *\n   * @param tokenAddress - Token 地址\n   * @returns 推荐的支付方式\n   */\n  async getRecommendedMethod(\n    tokenAddress: string,\n  ): Promise<\"eip3009\" | \"permit\" | \"permit2\" | null> {\n    const result = await this.detect(tokenAddress);\n    const { supportedMethods } = result;\n\n    if (supportedMethods.includes(\"eip3009\")) return \"eip3009\";\n    if (supportedMethods.includes(\"permit\")) return \"permit\";\n    if (supportedMethods.includes(\"permit2\") || supportedMethods.includes(\"permit2-witness\")) {\n      return \"permit2\";\n    }\n\n    return null;\n  }\n\n  /**\n   * 批量初始化（预热缓存）\n   * 并行检测多个 Token 并缓存结果\n   *\n   * @param tokenAddresses - Token 地址列表\n   * @returns 检测结果数组\n   */\n  async initialize(tokenAddresses: string[]): Promise<TokenDetectionResult[]> {\n    this.logger?.log(`🔥 Warming up cache for ${tokenAddresses.length} tokens...`);\n\n    // 并行检测所有 token\n    const results = await Promise.all(\n      tokenAddresses.map(address =>\n        this.detect(address).catch(error => {\n          this.logger?.error(`Failed to detect token ${address}:`, error);\n          return null;\n        }),\n      ),\n    );\n\n    const successCount = results.filter(r => r !== null).length;\n    this.logger?.log(`✅ Successfully detected ${successCount}/${tokenAddresses.length} tokens`);\n\n    return results.filter((r): r is TokenDetectionResult => r !== null);\n  }\n\n  /**\n   * 清除缓存\n   *\n   * @param tokenAddress - 可选，指定要清除的 Token 地址\n   */\n  async clearCache(tokenAddress?: string): Promise<void> {\n    if (tokenAddress) {\n      const cacheKey = await this.getCacheKey(tokenAddress);\n      this.cache.delete(cacheKey);\n      this.logger?.log(`🗑️  Cleared cache for token ${tokenAddress}`);\n    } else {\n      this.cache.clear();\n      this.logger?.log(`🗑️  Cleared all cache`);\n    }\n  }\n\n  /**\n   * 获取缓存统计\n   *\n   * @returns 缓存统计信息\n   */\n  getCacheStats(): {\n    size: number;\n    keys: string[];\n  } {\n    return {\n      size: this.cache.size,\n      keys: Array.from(this.cache.keys()),\n    };\n  }\n\n  /**\n   * 生成缓存键\n   *\n   * @param tokenAddress - Token 地址\n   * @returns 缓存键\n   */\n  private async getCacheKey(tokenAddress: string): Promise<string> {\n    const chainId = await this.client.getChainId();\n    return `${chainId}:${tokenAddress.toLowerCase()}`;\n  }\n}\n","import {\n  NetworkSchema,\n  PaymentPayloadSchema,\n  PaymentRequirementsSchema,\n} from \"@wtflabs/x402/types\";\nimport { z } from \"zod\";\n\n/**\n * 以太坊地址正则\n */\nconst EthAddressRegex = /^0x[a-fA-F0-9]{40}$/;\n\n/**\n * 整数字符串验证\n *\n * @param value - 整数字符串\n * @returns 是否为整数字符串\n */\nconst isIntegerString = (value: string) => {\n  const num = Number(value);\n  return Number.isInteger(num) && num >= 0;\n};\n\n/**\n * CreateRequirementsConfig Schema\n *\n * @example\n * ```typescript\n * const config = {\n *   asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n *   maxAmountRequired: \"1000\",\n * };\n * ```\n *\n * @returns CreateRequirementsConfigSchema\n */\nexport const CreateRequirementsConfigSchema = z.object({\n  // 必填\n  asset: z.string().regex(EthAddressRegex, \"Invalid token address\"),\n  maxAmountRequired: z\n    .string()\n    .refine(isIntegerString, \"Amount must be a non-negative integer string\"),\n\n  // 可选 - 网络和 scheme\n  network: NetworkSchema.optional(),\n  scheme: z.literal(\"exact\").optional(),\n  outputSchema: z.record(z.any()).optional(),\n\n  // 可选 - 额外信息\n  extra: z.record(z.any()).optional(),\n\n  // 可选 - 支付类型\n  paymentType: z.enum([\"permit\", \"eip3009\", \"permit2\", \"auto\"]).optional(),\n\n  // 可选 - 资源描述\n  resource: z.string().url().optional().or(z.literal(\"\")),\n  description: z.string().optional(),\n  mimeType: z.string().optional(),\n  maxTimeoutSeconds: z.number().int().positive().optional(),\n\n  // 可选 - 性能控制\n  autoDetect: z.boolean().optional(),\n});\n\nexport type CreateRequirementsConfig = z.infer<typeof CreateRequirementsConfigSchema>;\n\n/**\n * PaymentRequirements Schema\n *\n * @example\n * ```typescript\n * const requirements = {\n *   x402Version: 1,\n *   scheme: \"exact\",\n *   network: \"ethereum-mainnet\",\n *   maxAmountRequired: \"1000\",\n *   payTo: \"0x1234567890abcdef1234567890abcdef12345678\",\n *   asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n *   maxTimeoutSeconds: 300,\n *   resource: \"https://api.example.com/data\",\n *   description: \"API access\",\n *   mimeType: \"application/json\",\n *   paymentType: \"permit\",\n *   extra: {\n *     relayer: \"0x1234567890abcdef1234567890abcdef12345678\",\n *     name: \"API access\",\n *     version: \"1.0.0\",\n *   },\n * };\n * ```\n *\n * @returns PaymentRequirementsSchema\n */\n\nexport type PaymentRequirements = z.infer<typeof PaymentRequirementsSchema>;\n\n/**\n * PaymentPayload Schema\n *\n * @example\n * ```typescript\n * const payload = {\n *   x402Version: 1,\n *   scheme: \"exact\",\n *   network: \"ethereum-mainnet\",\n *   payload: {\n *     maxAmountRequired: \"1000\",\n *     asset: \"0x1234567890abcdef1234567890abcdef12345678\",\n *     recipient: \"0x1234567890abcdef1234567890abcdef12345678\",\n *     nonce: \"1234567890abcdef1234567890abcdef12345678\",\n *     expiration: 1715000000,\n *   },\n * };\n * ```\n */\n// export const PaymentPayloadSchema = z.object({\n//   x402Version: z.number(),\n//   scheme: z.literal(\"exact\"),\n//   network: z.string(),\n//   payload: z.any(),\n// });\n\nexport type PaymentPayload = z.infer<typeof PaymentPayloadSchema>;\n\n/**\n * Payment Error Stage\n */\nexport type PaymentErrorStage = \"parse\" | \"verify\" | \"settle\";\n\n/**\n * Response402 Schema\n */\nexport const Response402Schema = z.object({\n  x402Version: z.literal(1),\n  accepts: z.array(PaymentRequirementsSchema),\n  error: z.string().optional(),\n  errorStage: z.enum([\"parse\", \"verify\", \"settle\"]).optional(),\n});\n\nexport type Response402 = z.infer<typeof Response402Schema>;\n\n/**\n * InitResult Schema\n */\nexport const InitResultSchema = z.discriminatedUnion(\"success\", [\n  z.object({ success: z.literal(true) }),\n  z.object({ success: z.literal(false), error: z.string() }),\n]);\n\nexport type InitResult = z.infer<typeof InitResultSchema>;\n\n/**\n * ProcessResult Schema\n */\nexport const ProcessResultSchema = z.discriminatedUnion(\"success\", [\n  z.object({\n    success: z.literal(true),\n    status: z.literal(200),\n    data: z.object({\n      payer: z.string().regex(EthAddressRegex),\n      txHash: z.string(),\n    }),\n  }),\n  z.object({\n    success: z.literal(false),\n    status: z.literal(402),\n    errorStage: z.enum([\"parse\", \"verify\"]),\n    response: Response402Schema,\n  }),\n  z.object({\n    success: z.literal(false),\n    status: z.literal(500),\n    errorStage: z.literal(\"settle\"),\n    response: Response402Schema,\n    error: z.string(),\n  }),\n]);\n\nexport type ProcessResult = z.infer<typeof ProcessResultSchema>;\n\n/**\n * ParsedPayment Schema\n */\nexport const ParsedPaymentSchema = z.object({\n  payload: PaymentPayloadSchema,\n  requirements: PaymentRequirementsSchema,\n});\n\nexport type ParsedPayment = z.infer<typeof ParsedPaymentSchema>;\n\n/**\n * ParseResult Schema\n */\nexport const ParseResultSchema = z.discriminatedUnion(\"success\", [\n  z.object({ success: z.literal(true), data: ParsedPaymentSchema }),\n  z.object({ success: z.literal(false), response402: Response402Schema }),\n]);\n\nexport type ParseResult = z.infer<typeof ParseResultSchema>;\n\n/**\n * VerifyResult Schema\n */\nexport const VerifyResultSchema = z.discriminatedUnion(\"success\", [\n  z.object({ success: z.literal(true), payer: z.string().regex(EthAddressRegex) }),\n  z.object({ success: z.literal(false), error: z.string() }),\n]);\n\nexport type VerifyResult = z.infer<typeof VerifyResultSchema>;\n\n/**\n * SettleResult Schema\n */\nexport const SettleResultSchema = z.discriminatedUnion(\"success\", [\n  z.object({\n    success: z.literal(true),\n    txHash: z.string(),\n    network: z.string(),\n  }),\n  z.object({\n    success: z.literal(false),\n    error: z.string(),\n  }),\n]);\n\nexport type SettleResult = z.infer<typeof SettleResultSchema>;\n","/**\n * 解码 Base64 字符串\n *\n * @param base64 - Base64 编码的字符串\n * @returns 解码后的字符串\n */\nexport function decodeBase64(base64: string): string {\n  // 移除 data URL 前缀（如果存在）\n  const cleanBase64 = base64.replace(/^data:application\\/json;base64,/, \"\");\n\n  // 浏览器环境\n  if (typeof window !== \"undefined\" && window.atob) {\n    return window.atob(cleanBase64);\n  }\n\n  // Node.js 环境\n  if (typeof Buffer !== \"undefined\") {\n    return Buffer.from(cleanBase64, \"base64\").toString(\"utf-8\");\n  }\n\n  throw new Error(\"No Base64 decoder available\");\n}\n\n/**\n * 编码为 Base64 字符串\n *\n * @param str - 要编码的字符串\n * @returns Base64 编码的字符串\n */\nexport function encodeBase64(str: string): string {\n  // 浏览器环境\n  if (typeof window !== \"undefined\" && window.btoa) {\n    return window.btoa(str);\n  }\n\n  // Node.js 环境\n  if (typeof Buffer !== \"undefined\") {\n    return Buffer.from(str, \"utf-8\").toString(\"base64\");\n  }\n\n  throw new Error(\"No Base64 encoder available\");\n}\n","import type { PublicClient } from \"viem\";\nimport { TokenDetector } from \"@wtflabs/x402-detector\";\nimport { Facilitator } from \"@wtflabs/x402-facilitator\";\nimport type {\n  X402ServerConfig,\n  PaymentRequirements,\n  PaymentPayload,\n  Response402,\n  InitResult,\n  ProcessResult,\n  ParseResult,\n  VerifyResult,\n  SettleResult,\n  ParsedPayment,\n} from \"./types\";\nimport { CreateRequirementsConfigSchema } from \"./schemas\";\nimport type { CreateRequirementsConfig } from \"./schemas\";\nimport { decodeBase64 } from \"./utils\";\nimport {\n  NetworkSchema,\n  PaymentPayloadSchema,\n  PaymentRequirementsSchema,\n} from \"@wtflabs/x402/types\";\nimport z from \"zod\";\n/**\n * X402 Server\n *\n * 服务端 SDK，用于处理支付验证和结算\n *\n * @example\n * ```typescript\n * // 1. 创建 facilitator\n * const facilitator = new Facilitator({\n *   recipientAddress: \"0x1234...\",\n *   waitUntil: \"confirmed\",\n * });\n *\n * // 2. 创建 server\n * const server = new X402Server({\n *   client: viemClient,\n *   facilitator,\n * });\n *\n * // 3. 可选：预热缓存\n * await server.initialize([tokenAddress]);\n *\n * // 4. 创建支付要求\n * const requirements = await server.createRequirements({\n *   asset: tokenAddress,\n *   maxAmountRequired: \"1000\",\n * });\n *\n * // 5. 处理支付\n * const result = await server.process(paymentHeader, requirements);\n * ```\n */\nexport class X402Server {\n  private client: PublicClient;\n  private detector: TokenDetector;\n  private facilitator: Facilitator;\n  private network: string | null = null;\n\n  /**\n   * 构造函数\n   *\n   * @param config - Server 配置\n   */\n  constructor(config: X402ServerConfig) {\n    if (!config.client) {\n      throw new Error(\"client is required\");\n    }\n    if (!config.facilitator) {\n      throw new Error(\"facilitator is required\");\n    }\n\n    this.client = config.client;\n    this.facilitator = config.facilitator;\n\n    // 初始化 detector (禁用日志)\n    this.detector = new TokenDetector(config.client, { logger: null });\n\n    // 保存网络配置\n    this.network = config.network || null;\n  }\n\n  /**\n   * 可选的初始化 - 预热缓存\n   *\n   * @param tokens - 要预热的 token 地址列表\n   * @returns 初始化结果\n   */\n  async initialize(tokens: string[]): Promise<InitResult> {\n    try {\n      await this.detector.initialize(tokens);\n      return { success: true };\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : \"Initialization failed\",\n      };\n    }\n  }\n\n  /**\n   * 创建支付要求\n   *\n   * @param config - 配置选项\n   * @returns 支付要求\n   */\n  async createRequirements(config: CreateRequirementsConfig): Promise<PaymentRequirements> {\n    // 使用 Zod 验证输入参数\n    const validatedConfig = CreateRequirementsConfigSchema.parse(config);\n\n    // 获取网络名称\n    const network = validatedConfig.network || this.network || (await this.getNetworkName());\n\n    // 确定支付类型和 token 信息\n    let paymentType: \"permit\" | \"eip3009\" | \"permit2\" | undefined;\n    let tokenName: string | undefined;\n    let tokenVersion: string | undefined;\n\n    if (validatedConfig.autoDetect !== false) {\n      // 自动检测模式（默认）\n      const result = await this.detector.detect(validatedConfig.asset);\n\n      // 确定支付类型\n      if (validatedConfig.paymentType && validatedConfig.paymentType !== \"auto\") {\n        paymentType = validatedConfig.paymentType;\n      } else {\n        const recommendedMethod = await this.detector.getRecommendedMethod(validatedConfig.asset);\n        if (!recommendedMethod) {\n          throw new Error(\n            `Token ${validatedConfig.asset} does not support advanced payment methods`,\n          );\n        }\n        paymentType = recommendedMethod;\n      }\n\n      tokenName = result.name;\n      tokenVersion = result.version;\n    } else {\n      // 快速模式，跳过检测\n      if (!validatedConfig.paymentType || validatedConfig.paymentType === \"auto\") {\n        throw new Error(\"Must specify paymentType when autoDetect is false\");\n      }\n      paymentType = validatedConfig.paymentType;\n    }\n\n    // TODO: 检测 facilitator supported 是否满足当前 asset 的支付要求\n\n    // 构建支付要求（未验证的对象）\n    const requirements: PaymentRequirements = {\n      scheme: validatedConfig.scheme || \"exact\",\n      network: network as z.infer<typeof NetworkSchema>,\n      maxAmountRequired: validatedConfig.maxAmountRequired,\n      payTo: this.facilitator.recipientAddress,\n      asset: validatedConfig.asset,\n      maxTimeoutSeconds: validatedConfig.maxTimeoutSeconds || 300,\n      resource: validatedConfig.resource || \"\",\n      description: validatedConfig.description || \"\",\n      mimeType: validatedConfig.mimeType || \"application/json\",\n      paymentType,\n      outputSchema: validatedConfig.outputSchema,\n      extra: {\n        ...(validatedConfig.extra || {}),\n        ...(tokenName && { name: tokenName }),\n        ...(tokenVersion && { version: tokenVersion }),\n      },\n    };\n\n    // 使用 Zod 验证输出\n    return PaymentRequirementsSchema.parse(requirements);\n  }\n\n  /**\n   * 完整的支付处理流程\n   * parse → verify → settle 一步到位\n   *\n   * @param paymentHeader - X-PAYMENT header 的值 (Base64)\n   * @param expectedRequirements - 期望的支付要求\n   * @returns 处理结果\n   */\n  async process(\n    paymentHeader: string | undefined,\n    expectedRequirements: PaymentRequirements,\n  ): Promise<ProcessResult> {\n    // 1. 解析\n    const parsed = this.parse(paymentHeader, expectedRequirements);\n    if (!parsed.success) {\n      return {\n        success: false,\n        status: 402,\n        errorStage: \"parse\",\n        response: {\n          ...parsed.response402,\n          errorStage: \"parse\",\n        },\n      };\n    }\n\n    // 2. 验证\n    const verified = await this.verify(parsed.data);\n    if (!verified.success) {\n      return {\n        success: false,\n        status: 402,\n        errorStage: \"verify\",\n        response: this.get402Response(expectedRequirements, verified.error, \"verify\"),\n      };\n    }\n\n    // 3. 结算\n    const settled = await this.settle(parsed.data);\n    if (!settled.success) {\n      // 结算失败返回 500（服务端错误）\n      return {\n        success: false,\n        status: 500,\n        errorStage: \"settle\",\n        response: this.get402Response(expectedRequirements, settled.error, \"settle\"),\n        error: settled.error,\n      };\n    }\n\n    return {\n      success: true,\n      status: 200,\n      data: {\n        payer: verified.payer,\n        txHash: settled.txHash,\n      },\n    };\n  }\n\n  /**\n   * 解析支付头\n   *\n   * @param paymentHeader - X-PAYMENT header 的值\n   * @param expectedRequirements - 期望的支付要求\n   * @returns 解析结果\n   */\n  parse(paymentHeader: string | undefined, expectedRequirements: PaymentRequirements): ParseResult {\n    // 检查是否提供了支付头\n    if (!paymentHeader) {\n      return {\n        success: false,\n        response402: this.get402Response(expectedRequirements, \"missing_payment_header\"),\n      };\n    }\n\n    // 解析 Base64\n    let payload: PaymentPayload;\n    try {\n      const decoded = decodeBase64(paymentHeader);\n      const parsed = JSON.parse(decoded);\n\n      // 使用 Zod 验证 payload\n      payload = PaymentPayloadSchema.parse(parsed);\n    } catch (error) {\n      return {\n        success: false,\n        response402: this.get402Response(\n          expectedRequirements,\n          error instanceof Error\n            ? `invalid_payment_header: ${error.message}`\n            : \"invalid_payment_header\",\n        ),\n      };\n    }\n\n    return {\n      success: true,\n      data: {\n        payload,\n        requirements: expectedRequirements,\n      },\n    };\n  }\n\n  /**\n   * 验证支付签名\n   *\n   * @param parsed - 解析后的支付数据\n   * @returns 验证结果\n   */\n  async verify(parsed: ParsedPayment): Promise<VerifyResult> {\n    try {\n      // 调用 facilitator 验证\n      const facilitatorPayload = {\n        ...parsed.payload,\n        payload: parsed.payload.payload || {},\n      };\n\n      const result = await this.facilitator.verify(\n        facilitatorPayload as Parameters<typeof this.facilitator.verify>[0],\n        parsed.requirements as Parameters<typeof this.facilitator.verify>[1],\n      );\n\n      if (!result.success) {\n        return {\n          success: false,\n          error: result.error || result.errorMessage || \"Verification failed\",\n        };\n      }\n\n      if (!result.payer) {\n        return {\n          success: false,\n          error: \"Payer address not found in verification result\",\n        };\n      }\n\n      return {\n        success: true,\n        payer: result.payer,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : \"Verification error\",\n      };\n    }\n  }\n\n  /**\n   * 结算支付\n   *\n   * @param parsed - 解析后的支付数据\n   * @returns 结算结果\n   */\n  async settle(parsed: ParsedPayment): Promise<SettleResult> {\n    try {\n      // 调用 facilitator 结算\n      const facilitatorPayload = {\n        ...parsed.payload,\n        payload: parsed.payload.payload || {},\n      };\n\n      const result = await this.facilitator.settle(\n        facilitatorPayload as Parameters<typeof this.facilitator.settle>[0],\n        parsed.requirements as Parameters<typeof this.facilitator.settle>[1],\n      );\n\n      if (!result.success) {\n        return {\n          success: false,\n          error: result.error || result.errorMessage || \"Settlement failed\",\n        };\n      }\n\n      if (!result.transaction) {\n        return {\n          success: false,\n          error: \"Transaction hash not found in settlement result\",\n        };\n      }\n\n      return {\n        success: true,\n        txHash: result.transaction,\n        network: result.network || parsed.requirements.network,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : \"Settlement error\",\n      };\n    }\n  }\n\n  /**\n   * 生成 402 响应\n   *\n   * @param requirements - 支付要求\n   * @param error - 可选的错误信息\n   * @param errorStage - 可选的错误阶段\n   * @returns 402 响应对象\n   */\n  get402Response(\n    requirements: PaymentRequirements,\n    error?: string,\n    errorStage?: \"parse\" | \"verify\" | \"settle\",\n  ): Response402 {\n    return {\n      x402Version: 1,\n      accepts: [requirements],\n      error,\n      errorStage,\n    };\n  }\n\n  /**\n   * 清除缓存\n   *\n   * @param token - 可选，指定要清除的 token 地址\n   */\n  async clearCache(token?: string): Promise<void> {\n    await this.detector.clearCache(token);\n  }\n\n  /**\n   * 获取缓存统计\n   *\n   * @returns 缓存统计信息\n   */\n  getCacheStats(): { size: number; keys: string[] } {\n    return this.detector.getCacheStats();\n  }\n\n  /**\n   * 获取 facilitator 实例（供外部访问）\n   *\n   * @returns Facilitator 实例\n   */\n  getFacilitator(): Facilitator {\n    return this.facilitator;\n  }\n\n  /**\n   * 获取 detector 实例（供外部访问）\n   *\n   * @returns TokenDetector 实例\n   */\n  getDetector(): TokenDetector {\n    return this.detector;\n  }\n\n  /**\n   * 获取 client 实例（供外部访问）\n   *\n   * @returns PublicClient 实例\n   */\n  getClient(): PublicClient {\n    return this.client;\n  }\n\n  /**\n   * 获取网络名称\n   *\n   * @returns 网络名称\n   */\n  private async getNetworkName(): Promise<string> {\n    if (this.network) {\n      return this.network;\n    }\n\n    const chainId = await this.client.getChainId();\n\n    // 映射常见的 chainId 到网络名称\n    const networkMap: Record<number, string> = {\n      1: \"ethereum-mainnet\",\n      5: \"ethereum-goerli\",\n      11155111: \"ethereum-sepolia\",\n      56: \"bsc-mainnet\",\n      97: \"bsc-testnet\",\n      137: \"polygon-mainnet\",\n      80001: \"polygon-mumbai\",\n      42161: \"arbitrum-mainnet\",\n      421613: \"arbitrum-goerli\",\n      10: \"optimism-mainnet\",\n      420: \"optimism-goerli\",\n      8453: \"base-mainnet\",\n      84531: \"base-goerli\",\n    };\n\n    this.network = networkMap[chainId] || `chain-${chainId}`;\n    return this.network;\n  }\n}\n","/**\n * Express 中间件 for x402 Payment Protocol\n */\n\nimport type { X402Server } from \"../server\";\nimport type { CreateRequirementsConfig, Response402 } from \"../schemas\";\n\n/**\n * Express-like Request 接口\n * 定义最小化的类型，避免直接依赖 express\n */\nexport interface ExpressRequest {\n  headers: Record<string, string | string[] | undefined>;\n  body?: unknown;\n  params?: Record<string, string>;\n  query?: Record<string, string | string[] | undefined>;\n  x402?: {\n    payer: string;\n    txHash: string;\n  };\n}\n\n/**\n * Express-like Response 接口\n */\nexport interface ExpressResponse {\n  status(code: number): this;\n  json(body: unknown): this;\n}\n\n/**\n * Express-like NextFunction 类型\n */\nexport type ExpressNextFunction = (error?: Error) => void;\n\n/**\n * Express 中间件配置选项\n */\nexport interface ExpressMiddlewareOptions {\n  /** X402Server 实例 */\n  server: X402Server;\n\n  /** 获取 token 地址的函数 */\n  getToken: (req: ExpressRequest) => string | Promise<string>;\n\n  /** 获取金额的函数 */\n  getAmount: (req: ExpressRequest) => string | Promise<string>;\n\n  /** 可选：获取额外配置的函数 */\n  getConfig?: (\n    req: ExpressRequest,\n  ) => Partial<CreateRequirementsConfig> | Promise<Partial<CreateRequirementsConfig>>;\n\n  /** 可选：自定义错误处理 */\n  onError?: (error: Error, req: ExpressRequest, res: ExpressResponse) => void;\n\n  /** 可选：自定义 402 响应处理 */\n  on402?: (req: ExpressRequest, res: ExpressResponse, response402: Response402) => void;\n\n  /** 可选：支付成功后的回调 */\n  onPaymentSuccess?: (req: ExpressRequest, payer: string, txHash: string) => void | Promise<void>;\n}\n\n/**\n * 创建 Express 中间件\n *\n * @param options - 中间件配置\n * @returns Express 中间件函数\n *\n * @example\n * ```typescript\n * const middleware = createExpressMiddleware({\n *   server,\n *   getToken: (req) => req.body.token || USDC,\n *   getAmount: (req) => calculatePrice(req.body),\n * });\n *\n * app.post(\"/api/resource\", middleware, (req, res) => {\n *   // Payment already verified and settled\n *   const { payer, txHash } = req.x402;\n *   res.json({ data: \"resource\", payer, txHash });\n * });\n * ```\n */\nexport function createExpressMiddleware(options: ExpressMiddlewareOptions) {\n  return async (req: ExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => {\n    try {\n      // 1. 获取 token 和 amount\n      const token = await options.getToken(req);\n      const amount = await options.getAmount(req);\n\n      // 2. 获取额外配置\n      const extraConfig = options.getConfig ? await options.getConfig(req) : {};\n\n      // 3. 创建支付要求（过滤掉 undefined 值）\n      const filteredConfig = Object.fromEntries(\n        Object.entries(extraConfig).filter(([, value]) => value !== undefined),\n      );\n\n      const requirements = await options.server.createRequirements({\n        asset: token,\n        maxAmountRequired: amount,\n        ...filteredConfig,\n      } as CreateRequirementsConfig);\n\n      // 4. 处理支付\n      const paymentHeader = req.headers[\"x-payment\"] as string | undefined;\n      const result = await options.server.process(paymentHeader, requirements);\n\n      // 5. 处理结果\n      if (!result.success) {\n        // 支付失败，根据错误阶段返回不同状态码\n        // - parse/verify 失败: 402 (客户端需要重新支付)\n        // - settle 失败: 500 (服务端错误)\n        if (options.on402 && result.status === 402) {\n          options.on402(req, res, result.response);\n        } else {\n          res.status(result.status).json(result.response);\n        }\n        return;\n      }\n\n      // 6. 支付成功\n      // 将支付信息附加到 req 对象\n      req.x402 = {\n        payer: result.data.payer,\n        txHash: result.data.txHash,\n      };\n\n      // 调用成功回调\n      if (options.onPaymentSuccess) {\n        await options.onPaymentSuccess(req, result.data.payer, result.data.txHash);\n      }\n\n      // 继续到下一个中间件\n      next();\n    } catch (error) {\n      // 错误处理\n      if (options.onError) {\n        options.onError(error as Error, req, res);\n      } else {\n        console.error(\"x402 middleware error:\", error);\n        res.status(500).json({\n          error: \"Payment processing error\",\n          message: error instanceof Error ? error.message : \"Unknown error\",\n        });\n      }\n    }\n  };\n}\n\n/**\n * Express 中间件函数类型\n */\nexport type ExpressMiddleware = (\n  req: ExpressRequest,\n  res: ExpressResponse,\n  next: ExpressNextFunction,\n) => void | Promise<void>;\n","/**\n * Hono 中间件 for x402 Payment Protocol\n */\n\nimport type { X402Server } from \"../server\";\nimport type { CreateRequirementsConfig, Response402 } from \"../schemas\";\n\n/**\n * Hono-like Request 接口\n */\nexport interface HonoRequest {\n  header(name: string): string | undefined;\n  json<T = unknown>(): Promise<T>;\n  query(name: string): string | undefined;\n}\n\n/**\n * Hono-like Context 接口\n */\nexport interface HonoContext {\n  req: HonoRequest;\n  json(body: unknown, status?: number): Response;\n  set(key: string, value: unknown): void;\n  get(key: string): unknown;\n}\n\n/**\n * Hono-like Next 函数\n */\nexport type HonoNext = () => Promise<void>;\n\n/**\n * Hono 中间件函数类型\n */\nexport type HonoMiddlewareHandler = (c: HonoContext, next: HonoNext) => Promise<Response | void>;\n\n/**\n * Hono 中间件配置选项\n */\nexport interface HonoMiddlewareOptions {\n  /** X402Server 实例 */\n  server: X402Server;\n\n  /** 获取 token 地址的函数 */\n  getToken: (c: HonoContext) => string | Promise<string>;\n\n  /** 获取金额的函数 */\n  getAmount: (c: HonoContext) => string | Promise<string>;\n\n  /** 可选：获取额外配置的函数 */\n  getConfig?: (\n    c: HonoContext,\n  ) => Partial<CreateRequirementsConfig> | Promise<Partial<CreateRequirementsConfig>>;\n\n  /** 可选：自定义错误处理 */\n  onError?: (error: Error, c: HonoContext) => Response | Promise<Response>;\n\n  /** 可选：自定义 402 响应处理 */\n  on402?: (c: HonoContext, response402: Response402) => Response | Promise<Response>;\n\n  /** 可选：支付成功后的回调 */\n  onPaymentSuccess?: (c: HonoContext, payer: string, txHash: string) => void | Promise<void>;\n}\n\n/**\n * 创建 Hono 中间件\n *\n * @param options - 中间件配置\n * @returns Hono 中间件函数\n *\n * @example\n * ```typescript\n * const middleware = createHonoMiddleware({\n *   server,\n *   getToken: (c) => c.req.query(\"token\") || USDC,\n *   getAmount: async (c) => {\n *     const body = await c.req.json();\n *     return calculatePrice(body.complexity);\n *   },\n * });\n *\n * app.post(\"/api/resource\", middleware, (c) => {\n *   // Payment already verified and settled\n *   const { payer, txHash } = c.get(\"x402\");\n *   return c.json({ data: \"resource\", payer, txHash });\n * });\n * ```\n */\nexport function createHonoMiddleware(options: HonoMiddlewareOptions): HonoMiddlewareHandler {\n  return async (c: HonoContext, next: HonoNext) => {\n    try {\n      // 1. 获取 token 和 amount\n      const token = await options.getToken(c);\n      const amount = await options.getAmount(c);\n\n      // 2. 获取额外配置\n      const extraConfig = options.getConfig ? await options.getConfig(c) : {};\n\n      // 3. 创建支付要求（过滤掉 undefined 值）\n      const filteredConfig = Object.fromEntries(\n        Object.entries(extraConfig).filter(([, value]) => value !== undefined),\n      );\n\n      const requirements = await options.server.createRequirements({\n        asset: token,\n        maxAmountRequired: amount,\n        ...filteredConfig,\n      } as CreateRequirementsConfig);\n\n      // 4. 处理支付\n      const paymentHeader = c.req.header(\"x-payment\");\n      const result = await options.server.process(paymentHeader, requirements);\n\n      // 5. 处理结果\n      if (!result.success) {\n        // 支付失败，根据错误阶段返回不同状态码\n        // - parse/verify 失败: 402 (客户端需要重新支付)\n        // - settle 失败: 500 (服务端错误)\n        if (options.on402 && result.status === 402) {\n          return options.on402(c, result.response);\n        } else {\n          return c.json(result.response, result.status);\n        }\n      }\n\n      // 6. 支付成功\n      // 将支付信息存储到 context\n      c.set(\"x402\", {\n        payer: result.data.payer,\n        txHash: result.data.txHash,\n      });\n\n      // 调用成功回调\n      if (options.onPaymentSuccess) {\n        await options.onPaymentSuccess(c, result.data.payer, result.data.txHash);\n      }\n\n      // 继续到下一个中间件\n      await next();\n    } catch (error) {\n      // 错误处理\n      if (options.onError) {\n        return options.onError(error as Error, c);\n      } else {\n        console.error(\"x402 middleware error:\", error);\n        return c.json(\n          {\n            error: \"Payment processing error\",\n            message: error instanceof Error ? error.message : \"Unknown error\",\n          },\n          500,\n        );\n      }\n    }\n  };\n}\n","import type { PublicClient } from \"viem\";\nimport type { Facilitator } from \"@wtflabs/x402-facilitator\";\n\n/**\n * X402Server 配置选项\n */\nexport interface X402ServerConfig {\n  /** Viem PublicClient (必填) */\n  client: PublicClient;\n\n  /** Facilitator 实例 (必填) */\n  facilitator: Facilitator;\n\n  /** 网络名称，默认从 client 自动检测 */\n  network?: string;\n}\n\n// Re-export all types and schemas from schemas.ts\nexport type {\n  CreateRequirementsConfig,\n  PaymentRequirements,\n  PaymentPayload,\n  Response402,\n  InitResult,\n  ProcessResult,\n  ParseResult,\n  VerifyResult,\n  SettleResult,\n  ParsedPayment,\n} from \"./schemas\";\n\nexport {\n  CreateRequirementsConfigSchema,\n  Response402Schema,\n  InitResultSchema,\n  ProcessResultSchema,\n  ParseResultSchema,\n  VerifyResultSchema,\n  SettleResultSchema,\n  ParsedPaymentSchema,\n} from \"./schemas\";\n\nexport { PaymentRequirementsSchema, PaymentPayloadSchema } from \"@wtflabs/x402/types\";\n"],"mappings":"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","names":["defaultLogger","hasEIP3009","hasPermit","hasPermit2Approval","defaultLogger","_a","PaymentPayloadSchema","PaymentRequirementsSchema","PaymentRequirementsSchema","PaymentPayloadSchema"]}