{"version":3,"sources":["../../src/exact/server/scheme.ts","../../src/exact/server/register.ts"],"sourcesContent":["import {\n  AssetAmount,\n  MoneyParser,\n  Network,\n  PaymentRequirements,\n  Price,\n  SchemeNetworkServer,\n} from '@x402/core/types'\n\nimport { X402X_EVM_SCHEME } from '../../constants'\nimport { TokenDetector } from 'x402x-utils'\nimport type { PublicClient } from 'viem'\nimport type { PermitType } from '../../types'\n\nexport type ExactX402xEvmServerAssetConfig = {\n  address: `0x${string}`\n  decimals: number\n  /**\n   * 可选：写入 requirements.extra，用于客户端/促进方签名与校验\n   * （缺失时，本包的 client/facilitator 会尝试链上读取）\n   */\n  name?: string\n  version?: string\n  /**\n   * 可选：显式指定该资产要使用的签名类型（写入 requirements.extra.permitType）。\n   */\n  permitType?: PermitType\n}\n\n/**\n * x402x EVM server implementation for x402 \"exact\" scheme.\n *\n * 重点：提供资产注册能力（BSC/USD1 等）。\n */\nexport class ExactX402xEvmServer implements SchemeNetworkServer {\n  private static readonly PERMIT_TYPE_PRIORITY: readonly PermitType[] = [\n    'eip3009',\n    'permit',\n    'permit2',\n  ] as const\n\n  readonly scheme = X402X_EVM_SCHEME\n  private moneyParsers: MoneyParser[] = []\n\n  private readonly assets: Map<string, ExactX402xEvmServerAssetConfig> = new Map()\n  /**\n   * 按 network + token address 索引的资产表，用于在请求路径 O(1) 反查配置。\n   *\n   * key: `${network}:${lowercase(address)}`\n   */\n  private readonly assetsByAddress: Map<string, ExactX402xEvmServerAssetConfig> = new Map()\n  private readonly defaultAssetByNetwork: Map<string, string> = new Map()\n  private readonly detectorsByNetwork: Map<string, TokenDetector> = new Map()\n\n  /**\n   * 注册一个 network 对应的公共链读客户端（用于自动探测 token 支持的 permitType）。\n   *\n   * - 若未注册，则当资产未配置 permitType 时会回退到默认优先级推断（不做链上检查）\n   * - 若已注册，则会在注册资产时触发一次链上探测并缓存（不在请求路径做链上 IO）\n   * - 若链式调用里先 registerAsset 再 registerPublicClient，则这里会补对已注册资产做一次探测\n   *\n   * @param network - CAIP-2 网络，如 \"eip155:56\"\n   * @param client - 具备 readContract 的公共读客户端\n   * @returns this\n   */\n  registerPublicClient(network: Network, client: PublicClient): this {\n    this.detectorsByNetwork.set(network, new TokenDetector(client, { logger: null }))\n\n    // 如果先注册了资产、后注册 publicClient，则这里补触发一次预热探测（fire-and-forget）\n    const prefix = `${network}:`\n    for (const [key, assetConfig] of this.assets.entries()) {\n      if (!key.startsWith(prefix)) continue\n      this.detectAndSetPermitType(network, assetConfig)\n    }\n    return this\n  }\n\n  /**\n   * 注册一个网络默认资产（用于 Money 价格转换）。\n   *\n   * @param network - CAIP-2 网络，如 \"eip155:56\"\n   * @param symbol - 资产符号（仅用于本地 key）\n   * @param config - 资产配置\n   * @returns The server instance for chaining\n   */\n  registerAsset(network: Network, symbol: string, config: ExactX402xEvmServerAssetConfig): this {\n    const key = this.assetKey(network, symbol)\n    this.assets.set(key, config)\n\n    const addrKey = this.assetAddressKey(network, config.address)\n    const existing = this.assetsByAddress.get(addrKey)\n    if (existing && existing !== config) {\n      throw new Error(\n        `Asset address already registered: ${config.address} on ${network}. ` +\n          `Each token address must map to a single config instance.`,\n      )\n    }\n    this.assetsByAddress.set(addrKey, config)\n\n    if (!this.defaultAssetByNetwork.has(network)) {\n      this.defaultAssetByNetwork.set(network, symbol.toUpperCase())\n    }\n\n    // 注册阶段预热：如果 publicClient 已就绪且用户未显式配置 permitType，则触发一次探测（fire-and-forget）\n    this.detectAndSetPermitType(network, config)\n    return this\n  }\n\n  /**\n   * 设置某个网络的默认资产符号（必须已 registerAsset）。\n   *\n   * @param network - CAIP-2 网络，如 \"eip155:56\"\n   * @param symbol - 资产符号\n   * @returns The server instance for chaining\n   */\n  setDefaultAsset(network: Network, symbol: string): this {\n    const key = this.assetKey(network, symbol)\n    if (!this.assets.has(key)) {\n      throw new Error(`Asset not registered: ${symbol} on ${network}`)\n    }\n    this.defaultAssetByNetwork.set(network, symbol.toUpperCase())\n    return this\n  }\n\n  /**\n   * 注册一个 Money 价格转换器。\n   *\n   * @param parser - 价格转换器\n   * @returns The server instance for chaining\n   */\n  registerMoneyParser(parser: MoneyParser): this {\n    this.moneyParsers.push(parser)\n    return this\n  }\n\n  /**\n   * 解析一个价格并转换为资产金额。\n   *\n   * @param price - 价格\n   * @param network - CAIP-2 网络\n   * @returns The asset amount\n   */\n  async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n    if (typeof price === 'object' && price !== null && 'amount' in price) {\n      if (!price.asset) {\n        throw new Error(`Asset address must be specified for AssetAmount on network ${network}`)\n      }\n      return this.injectAssetExtra(\n        {\n          amount: price.amount,\n          asset: price.asset,\n          extra: price.extra || {},\n        },\n        network,\n      )\n    }\n\n    const amount = this.parseMoneyToDecimal(price)\n\n    for (const parser of this.moneyParsers) {\n      const result = await parser(amount, network)\n      if (result !== null) return this.injectAssetExtra(result, network)\n    }\n\n    return this.injectAssetExtra(this.defaultMoneyConversion(amount, network), network)\n  }\n\n  /**\n   * Build payment requirements for this scheme/network combination\n   *\n   * @param paymentRequirements - The base payment requirements\n   * @param supportedKind - The supported kind from facilitator (unused)\n   * @param supportedKind.x402Version - The x402 version\n   * @param supportedKind.scheme - The logical payment scheme\n   * @param supportedKind.network - The network identifier in CAIP-2 format\n   * @param supportedKind.extra - Optional extra metadata regarding scheme/network implementation details\n   * @param extensionKeys - Extension keys supported by the facilitator (unused)\n   * @returns Payment requirements ready to be sent to clients\n   */\n  enhancePaymentRequirements(\n    paymentRequirements: PaymentRequirements,\n    supportedKind: {\n      x402Version: number\n      scheme: string\n      network: Network\n      extra?: Record<string, unknown>\n    },\n    extensionKeys: string[],\n  ): Promise<PaymentRequirements> {\n    // supportedKind.extra is facilitator-provided metadata (scheme/network-level).\n    // We intentionally do NOT forward it to clients via PaymentRequirements.extra.\n    // If you need server-side config validation, inspect supportedKind.extra here.\n    void supportedKind\n    void extensionKeys\n    return Promise.resolve(paymentRequirements)\n  }\n\n  /**\n   * 将资产注册信息（name/version/permitType）注入到 AssetAmount.extra。\n   *\n   * @param assetAmount - 解析出的资产金额\n   * @param network - CAIP-2 网络\n   * @returns 注入 extra 后的 AssetAmount\n   */\n  private injectAssetExtra(assetAmount: AssetAmount, network: Network): AssetAmount {\n    const extra: Record<string, unknown> = { ...(assetAmount.extra || {}) }\n    const assetConfig = this.assetsByAddress.get(this.assetAddressKey(network, assetAmount.asset))\n    if (!assetConfig) return { ...assetAmount, extra }\n\n    if (assetConfig.name && extra.name === undefined) extra.name = assetConfig.name\n    if (assetConfig.version && extra.version === undefined) extra.version = assetConfig.version\n\n    if (extra.permitType === undefined) {\n      const permitType = this.resolvePermitType(assetConfig)\n      if (permitType) extra.permitType = permitType\n    }\n\n    return { ...assetAmount, extra }\n  }\n\n  /**\n   * 根据资产配置选择 permitType（优先级：eip3009 > permit > permit2）。\n   *\n   * @param assetConfig - 资产配置\n   * @returns 选中的 permitType（如果能确定）\n   */\n  private resolvePermitType(assetConfig: ExactX402xEvmServerAssetConfig): PermitType | undefined {\n    if (assetConfig.permitType) return assetConfig.permitType\n    return ExactX402xEvmServer.PERMIT_TYPE_PRIORITY[0]\n  }\n\n  /**\n   * 当资产未显式声明 permitType 时，尝试链上探测 token 支持情况。\n   *\n   * @param network - CAIP-2 网络\n   * @param token - token 合约地址\n   * @returns 探测结果（若探测失败则返回 undefined）\n   */\n  private async detectPermitType(\n    network: Network,\n    token: `0x${string}`,\n  ): Promise<PermitType | undefined> {\n    const detector = this.detectorsByNetwork.get(network)\n    if (!detector) return undefined\n\n    const recommended = await detector.getRecommendedMethod(token)\n    if (recommended === 'eip3009') return 'eip3009'\n    if (recommended === 'permit') return 'permit'\n    if (recommended === 'permit2' || recommended === 'permit2-witness') return 'permit2'\n    return undefined\n  }\n\n  /**\n   * 若用户未显式指定 permitType，且 publicClient 已就绪，则异步探测并写回 assetConfig.permitType。\n   *\n   * 注意：这是 fire-and-forget，不保证立即可用；请求路径会用默认优先级兜底。\n   *\n   * @param network - CAIP-2 网络\n   * @param assetConfig - 资产配置（引用对象，会被写回 permitType）\n   */\n  private detectAndSetPermitType(\n    network: Network,\n    assetConfig: ExactX402xEvmServerAssetConfig,\n  ): void {\n    if (assetConfig.permitType) return\n    if (!this.detectorsByNetwork.get(network)) return\n\n    void (async () => {\n      const permitType = await this.detectPermitType(network, assetConfig.address)\n      if (!assetConfig.permitType && permitType) assetConfig.permitType = permitType\n    })().catch(() => {\n      // ignore\n    })\n  }\n\n  /**\n   * Parse money to decimal.\n   *\n   * @param money - The money to parse (e.g., \"$1.50\")\n   * @returns The amount in decimal\n   */\n  private parseMoneyToDecimal(money: string | number): number {\n    if (typeof money === 'number') return money\n    const cleanMoney = money.replace(/^\\$/, '').trim()\n    const amount = parseFloat(cleanMoney)\n    if (isNaN(amount)) throw new Error(`Invalid money format: ${money}`)\n    return amount\n  }\n\n  /**\n   * Default money conversion implementation.\n   *\n   * @param amount - The amount in decimal (e.g., 1.50)\n   * @param network - The network identifier in CAIP-2 format\n   * @returns The asset amount\n   */\n  private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n    const symbol = this.defaultAssetByNetwork.get(network)\n    if (!symbol) {\n      throw new Error(\n        `No default asset configured for network ${network}. Call registerAsset(network, symbol, config) first.`,\n      )\n    }\n    const asset = this.getAsset(network, symbol)\n\n    const tokenAmount = this.convertToTokenAmount(amount.toString(), asset.decimals)\n\n    const extra: Record<string, unknown> = {}\n    if (asset.name) extra.name = asset.name\n    if (asset.version) extra.version = asset.version\n    const permitType = this.resolvePermitType(asset)\n    if (permitType) extra.permitType = permitType\n\n    return {\n      amount: tokenAmount,\n      asset: asset.address,\n      extra,\n    }\n  }\n\n  /**\n   * Convert decimal amount to token amount.\n   *\n   * @param decimalAmount - The amount in decimal (e.g., 1.50)\n   * @param decimals - The number of decimals\n   * @returns The amount in token\n   */\n  private convertToTokenAmount(decimalAmount: string, decimals: number): string {\n    const amount = parseFloat(decimalAmount)\n    if (isNaN(amount)) throw new Error(`Invalid amount: ${decimalAmount}`)\n    const tokenAmount = Math.floor(amount * Math.pow(10, decimals))\n    return tokenAmount.toString()\n  }\n\n  /**\n   * Get the asset config for a network and symbol.\n   *\n   * @param network - The network identifier in CAIP-2 format\n   * @param symbol - The symbol of the asset\n   * @returns The asset config\n   */\n  private getAsset(network: Network, symbol: string): ExactX402xEvmServerAssetConfig {\n    const key = this.assetKey(network, symbol)\n    const cfg = this.assets.get(key)\n    if (!cfg) throw new Error(`Asset not registered: ${symbol} on ${network}`)\n    return cfg\n  }\n\n  /**\n   * Generate a unique asset key for a network and symbol.\n   *\n   * @param network - The network identifier in CAIP-2 format\n   * @param symbol - The symbol of the asset\n   * @returns The asset key\n   */\n  private assetKey(network: Network, symbol: string): string {\n    return `${network}:${symbol.toUpperCase()}`\n  }\n\n  /**\n   * Generate a unique asset key for a network and token address (case-insensitive).\n   *\n   * @param network - The network identifier in CAIP-2 format\n   * @param address - The token contract address\n   * @returns The asset address key\n   */\n  private assetAddressKey(network: Network, address: string): string {\n    return `${network}:${address.toLowerCase()}`\n  }\n}\n","import { x402ResourceServer } from '@x402/core/server'\nimport { Network } from '@x402/core/types'\nimport { ExactX402xEvmServer } from './scheme'\n\nexport interface X402xEvmResourceServerRegistrationConfig {\n  /**\n   * 可选：指定注册哪些网络；不填则注册 eip155:*（推荐）\n   */\n  networks?: Network[]\n  /**\n   * 可选：复用同一个 scheme 实例（用于提前 registerAsset）\n   */\n  scheme?: ExactX402xEvmServer\n}\n\n/**\n * 将 x402x 的 EVM exact 机制注册到 @x402/core 的 resource server。\n *\n * @param server - The x402ResourceServer instance to register schemes to\n * @param config - Configuration for EVM resource server registration\n * @returns The server instance for chaining\n */\nexport function registerExactX402xEvmScheme(\n  server: x402ResourceServer,\n  config: X402xEvmResourceServerRegistrationConfig = {},\n): x402ResourceServer {\n  const scheme = config.scheme ?? new ExactX402xEvmServer()\n\n  if (config.networks && config.networks.length > 0) {\n    config.networks.forEach((network) => {\n      server.register(network, scheme)\n    })\n  } else {\n    server.register('eip155:*', scheme)\n  }\n\n  return server\n}\n"],"mappings":"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","names":[]}