{"version":3,"file":"client.cjs","sourceRoot":"","sources":["../../../src/api/token/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Token API Client - token.api.cx.metamask.io\n *\n * Handles all token-related API calls including:\n * - Networks\n * - Token lists\n * - Token metadata\n * - Token descriptions\n * - Trending tokens\n * - Top gainers/popular tokens\n * - Top assets\n * - Occurrence floors\n */\n\nimport type {\n  FetchQueryOptions,\n  QueryFunctionContext,\n} from '@tanstack/query-core';\n\nimport { BaseApiClient, API_URLS, STALE_TIMES, GC_TIMES } from '../base-client';\nimport { getQueryOptionsOverrides } from '../shared-types';\nimport type { FetchOptions } from '../shared-types';\nimport type {\n  TokenMetadata,\n  V1TokenDescriptionResponse,\n  NetworkInfo,\n  TopAsset,\n  TrendingToken,\n  TrendingSortOption,\n  TopGainersSortOption,\n  V1SuggestedOccurrenceFloorsResponse,\n} from './types';\n\n/**\n * Token API Client.\n * Provides methods for interacting with the Token API.\n */\nexport class TokenApiClient extends BaseApiClient {\n  // ==========================================================================\n  // CACHE MANAGEMENT\n  // ==========================================================================\n\n  /**\n   * Invalidate all token API queries.\n   * Note: This only invalidates queries from token.api.cx.metamask.io,\n   * not from tokens.api.cx.metamask.io (use TokensApiClient.invalidateTokens() for that).\n   */\n  async invalidateToken(): Promise<void> {\n    await this.queryClient.invalidateQueries({\n      queryKey: ['token'],\n    });\n  }\n\n  // ==========================================================================\n  // NETWORKS\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for networks.\n   *\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getNetworksQueryOptions(\n    options?: FetchOptions,\n  ): FetchQueryOptions<NetworkInfo[]> {\n    return {\n      queryKey: ['token', 'networks'],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<NetworkInfo[]>(API_URLS.TOKEN, '/networks', { signal }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.SUPPORTED_NETWORKS,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get all networks.\n   *\n   * @param options - Fetch options including cache settings.\n   * @returns Array of network info.\n   */\n  async fetchNetworks(options?: FetchOptions): Promise<NetworkInfo[]> {\n    return this.queryClient.fetchQuery(this.getNetworksQueryOptions(options));\n  }\n\n  /**\n   * Returns the TanStack Query options object for network by chain ID.\n   *\n   * @param chainId - The chain ID.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getNetworkByChainIdQueryOptions(\n    chainId: number,\n    options?: FetchOptions,\n  ): FetchQueryOptions<NetworkInfo> {\n    return {\n      queryKey: ['token', 'networkByChainId', chainId],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<NetworkInfo>(API_URLS.TOKEN, `/networks/${chainId}`, {\n          signal,\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.SUPPORTED_NETWORKS,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get network by chain ID.\n   *\n   * @param chainId - The chain ID.\n   * @param options - Fetch options including cache settings.\n   * @returns The network info.\n   */\n  async fetchNetworkByChainId(\n    chainId: number,\n    options?: FetchOptions,\n  ): Promise<NetworkInfo> {\n    return this.queryClient.fetchQuery(\n      this.getNetworkByChainIdQueryOptions(chainId, options),\n    );\n  }\n\n  // ==========================================================================\n  // TOKEN LIST\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for token list.\n   *\n   * @param chainId - The chain ID.\n   * @param queryOptions - Query options.\n   * @param queryOptions.includeTokenFees - Whether to include token fees.\n   * @param queryOptions.includeAssetType - Whether to include asset type.\n   * @param queryOptions.includeAggregators - Whether to include aggregators.\n   * @param queryOptions.includeERC20Permit - Whether to include ERC20 permit.\n   * @param queryOptions.includeOccurrences - Whether to include occurrences.\n   * @param queryOptions.includeStorage - Whether to include storage.\n   * @param queryOptions.includeIconUrl - Whether to include icon URL.\n   * @param queryOptions.includeAddress - Whether to include address.\n   * @param queryOptions.includeName - Whether to include name.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getTokenListQueryOptions(\n    chainId: number,\n    queryOptions?: {\n      includeTokenFees?: boolean;\n      includeAssetType?: boolean;\n      includeAggregators?: boolean;\n      includeERC20Permit?: boolean;\n      includeOccurrences?: boolean;\n      includeStorage?: boolean;\n      includeIconUrl?: boolean;\n      includeAddress?: boolean;\n      includeName?: boolean;\n    },\n    options?: FetchOptions,\n  ): FetchQueryOptions<TokenMetadata[]> {\n    return {\n      queryKey: ['token', 'tokenList', { chainId, options: queryOptions }],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<TokenMetadata[]>(API_URLS.TOKEN, `/tokens/${chainId}`, {\n          signal,\n          params: {\n            includeTokenFees: queryOptions?.includeTokenFees,\n            includeAssetType: queryOptions?.includeAssetType,\n            includeAggregators: queryOptions?.includeAggregators,\n            includeERC20Permit: queryOptions?.includeERC20Permit,\n            includeOccurrences: queryOptions?.includeOccurrences,\n            includeStorage: queryOptions?.includeStorage,\n            includeIconUrl: queryOptions?.includeIconUrl,\n            includeAddress: queryOptions?.includeAddress,\n            includeName: queryOptions?.includeName,\n          },\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_LIST,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get token list for a chain.\n   *\n   * @param chainId - The chain ID.\n   * @param queryOptions - Query options.\n   * @param queryOptions.includeTokenFees - Include token fees data.\n   * @param queryOptions.includeAssetType - Include asset type data.\n   * @param queryOptions.includeAggregators - Include aggregators data.\n   * @param queryOptions.includeERC20Permit - Include ERC20 permit data.\n   * @param queryOptions.includeOccurrences - Include occurrences data.\n   * @param queryOptions.includeStorage - Include storage data.\n   * @param queryOptions.includeIconUrl - Include icon URL.\n   * @param queryOptions.includeAddress - Include address.\n   * @param queryOptions.includeName - Include name.\n   * @param options - Fetch options including cache settings.\n   * @returns Array of token metadata.\n   */\n  async fetchTokenList(\n    chainId: number,\n    queryOptions?: {\n      includeTokenFees?: boolean;\n      includeAssetType?: boolean;\n      includeAggregators?: boolean;\n      includeERC20Permit?: boolean;\n      includeOccurrences?: boolean;\n      includeStorage?: boolean;\n      includeIconUrl?: boolean;\n      includeAddress?: boolean;\n      includeName?: boolean;\n    },\n    options?: FetchOptions,\n  ): Promise<TokenMetadata[]> {\n    return this.queryClient.fetchQuery(\n      this.getTokenListQueryOptions(chainId, queryOptions, options),\n    );\n  }\n\n  // ==========================================================================\n  // TOKEN METADATA\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for v1 token metadata.\n   *\n   * @param chainId - The chain ID.\n   * @param tokenAddress - The token address.\n   * @param queryOptions - Query options.\n   * @param queryOptions.includeTokenFees - Whether to include token fees.\n   * @param queryOptions.includeAssetType - Whether to include asset type.\n   * @param queryOptions.includeAggregators - Whether to include aggregators.\n   * @param queryOptions.includeERC20Permit - Whether to include ERC20 permit.\n   * @param queryOptions.includeOccurrences - Whether to include occurrences.\n   * @param queryOptions.includeStorage - Whether to include storage.\n   * @param queryOptions.includeIconUrl - Whether to include icon URL.\n   * @param queryOptions.includeAddress - Whether to include address.\n   * @param queryOptions.includeName - Whether to include name.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getV1TokenMetadataQueryOptions(\n    chainId: number,\n    tokenAddress: string,\n    queryOptions?: {\n      includeTokenFees?: boolean;\n      includeAssetType?: boolean;\n      includeAggregators?: boolean;\n      includeERC20Permit?: boolean;\n      includeOccurrences?: boolean;\n      includeStorage?: boolean;\n      includeIconUrl?: boolean;\n      includeAddress?: boolean;\n      includeName?: boolean;\n    },\n    options?: FetchOptions,\n  ): FetchQueryOptions<TokenMetadata> {\n    return {\n      queryKey: [\n        'token',\n        'v1Metadata',\n        { chainId, tokenAddress, options: queryOptions },\n      ],\n      queryFn: async ({\n        signal,\n      }: QueryFunctionContext): Promise<TokenMetadata> => {\n        return this.fetch<TokenMetadata>(API_URLS.TOKEN, `/token/${chainId}`, {\n          signal,\n          params: {\n            address: tokenAddress,\n            includeTokenFees: queryOptions?.includeTokenFees,\n            includeAssetType: queryOptions?.includeAssetType,\n            includeAggregators: queryOptions?.includeAggregators,\n            includeERC20Permit: queryOptions?.includeERC20Permit,\n            includeOccurrences: queryOptions?.includeOccurrences,\n            includeStorage: queryOptions?.includeStorage,\n            includeIconUrl: queryOptions?.includeIconUrl,\n            includeAddress: queryOptions?.includeAddress,\n            includeName: queryOptions?.includeName,\n          },\n        });\n      },\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_METADATA,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get token metadata by address.\n   *\n   * @param chainId - The chain ID.\n   * @param tokenAddress - The token address.\n   * @param queryOptions - Query options.\n   * @param queryOptions.includeTokenFees - Include token fees data.\n   * @param queryOptions.includeAssetType - Include asset type data.\n   * @param queryOptions.includeAggregators - Include aggregators data.\n   * @param queryOptions.includeERC20Permit - Include ERC20 permit data.\n   * @param queryOptions.includeOccurrences - Include occurrences data.\n   * @param queryOptions.includeStorage - Include storage data.\n   * @param queryOptions.includeIconUrl - Include icon URL.\n   * @param queryOptions.includeAddress - Include address.\n   * @param queryOptions.includeName - Include name.\n   * @param options - Fetch options including cache settings.\n   * @returns The token metadata or undefined.\n   */\n  async fetchV1TokenMetadata(\n    chainId: number,\n    tokenAddress: string,\n    queryOptions?: {\n      includeTokenFees?: boolean;\n      includeAssetType?: boolean;\n      includeAggregators?: boolean;\n      includeERC20Permit?: boolean;\n      includeOccurrences?: boolean;\n      includeStorage?: boolean;\n      includeIconUrl?: boolean;\n      includeAddress?: boolean;\n      includeName?: boolean;\n    },\n    options?: FetchOptions,\n  ): Promise<TokenMetadata | undefined> {\n    try {\n      return await this.queryClient.fetchQuery(\n        this.getV1TokenMetadataQueryOptions(\n          chainId,\n          tokenAddress,\n          queryOptions,\n          options,\n        ),\n      );\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Returns the TanStack Query options object for token description.\n   *\n   * @param chainId - The chain ID.\n   * @param tokenAddress - The token address.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getTokenDescriptionQueryOptions(\n    chainId: number,\n    tokenAddress: string,\n    options?: FetchOptions,\n  ): FetchQueryOptions<V1TokenDescriptionResponse> {\n    return {\n      queryKey: ['token', 'tokenDescription', chainId, tokenAddress],\n      queryFn: async ({\n        signal,\n      }: QueryFunctionContext): Promise<V1TokenDescriptionResponse> =>\n        this.fetch<V1TokenDescriptionResponse>(\n          API_URLS.TOKEN,\n          `/token/${chainId}/description`,\n          {\n            signal,\n            params: { address: tokenAddress },\n          },\n        ),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_METADATA,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get token description.\n   *\n   * @param chainId - The chain ID.\n   * @param tokenAddress - The token address.\n   * @param options - Fetch options including cache settings.\n   * @returns The token description or undefined.\n   */\n  async fetchTokenDescription(\n    chainId: number,\n    tokenAddress: string,\n    options?: FetchOptions,\n  ): Promise<V1TokenDescriptionResponse | undefined> {\n    try {\n      return await this.queryClient.fetchQuery(\n        this.getTokenDescriptionQueryOptions(chainId, tokenAddress, options),\n      );\n    } catch {\n      return undefined;\n    }\n  }\n\n  // ==========================================================================\n  // TRENDING & TOP TOKENS\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for v3 trending tokens.\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.sortBy - Sort option.\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param queryOptions.includeTokenSecurityData - Whether to include token security data.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getV3TrendingTokensQueryOptions(\n    chainIds: string[],\n    queryOptions?: {\n      sortBy?: TrendingSortOption;\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n      includeTokenSecurityData?: boolean;\n    },\n    options?: FetchOptions,\n  ): FetchQueryOptions<TrendingToken[]> {\n    return {\n      queryKey: [\n        'token',\n        'v3Trending',\n        { chainIds: [...chainIds].sort(), options: queryOptions },\n      ],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<TrendingToken[]>(API_URLS.TOKEN, '/v3/tokens/trending', {\n          signal,\n          params: {\n            chainIds,\n            sort: queryOptions?.sortBy,\n            minLiquidity: queryOptions?.minLiquidity,\n            minVolume24hUsd: queryOptions?.minVolume24hUsd,\n            maxVolume24hUsd: queryOptions?.maxVolume24hUsd,\n            minMarketCap: queryOptions?.minMarketCap,\n            maxMarketCap: queryOptions?.maxMarketCap,\n            includeTokenSecurityData: queryOptions?.includeTokenSecurityData,\n          },\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n      gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n    };\n  }\n\n  /**\n   * Get trending tokens (v3 endpoint).\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.sortBy - Sort option.\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param queryOptions.includeTokenSecurityData - Whether to include token security data.\n   * @param options - Fetch options including cache settings.\n   * @returns Array of trending tokens.\n   */\n  async fetchV3TrendingTokens(\n    chainIds: string[],\n    queryOptions?: {\n      sortBy?: TrendingSortOption;\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n      includeTokenSecurityData?: boolean;\n    },\n    options?: FetchOptions,\n  ): Promise<TrendingToken[]> {\n    return this.queryClient.fetchQuery(\n      this.getV3TrendingTokensQueryOptions(chainIds, queryOptions, options),\n    );\n  }\n\n  /**\n   * Returns the TanStack Query options object for v3 top gainers.\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.sort - Sort option.\n   * @param queryOptions.blockRegion - Region filter (global/us).\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getV3TopGainersQueryOptions(\n    chainIds: string[],\n    queryOptions?: {\n      sort?: TopGainersSortOption;\n      blockRegion?: 'global' | 'us';\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n    },\n    options?: FetchOptions,\n  ): FetchQueryOptions<TrendingToken[]> {\n    return {\n      queryKey: [\n        'token',\n        'v3TopGainers',\n        { chainIds: [...chainIds].sort(), options: queryOptions },\n      ],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<TrendingToken[]>(API_URLS.TOKEN, '/v3/tokens/top-gainers', {\n          signal,\n          params: {\n            chainIds,\n            sort: queryOptions?.sort,\n            blockRegion: queryOptions?.blockRegion,\n            minLiquidity: queryOptions?.minLiquidity,\n            minVolume24hUsd: queryOptions?.minVolume24hUsd,\n            maxVolume24hUsd: queryOptions?.maxVolume24hUsd,\n            minMarketCap: queryOptions?.minMarketCap,\n            maxMarketCap: queryOptions?.maxMarketCap,\n          },\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n      gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n    };\n  }\n\n  /**\n   * Get top gainers/losers (v3 endpoint).\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.sort - Sort option.\n   * @param queryOptions.blockRegion - Region filter (global/us).\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param options - Fetch options including cache settings.\n   * @returns Array of top gainer tokens.\n   */\n  async fetchV3TopGainers(\n    chainIds: string[],\n    queryOptions?: {\n      sort?: TopGainersSortOption;\n      blockRegion?: 'global' | 'us';\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n    },\n    options?: FetchOptions,\n  ): Promise<TrendingToken[]> {\n    return this.queryClient.fetchQuery(\n      this.getV3TopGainersQueryOptions(chainIds, queryOptions, options),\n    );\n  }\n\n  /**\n   * Returns the TanStack Query options object for v3 popular tokens.\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.blockRegion - Region filter (global/us).\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getV3PopularTokensQueryOptions(\n    chainIds: string[],\n    queryOptions?: {\n      blockRegion?: 'global' | 'us';\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n    },\n    options?: FetchOptions,\n  ): FetchQueryOptions<TrendingToken[]> {\n    return {\n      queryKey: [\n        'token',\n        'v3Popular',\n        { chainIds: [...chainIds].sort(), options: queryOptions },\n      ],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<TrendingToken[]>(API_URLS.TOKEN, '/v3/tokens/popular', {\n          signal,\n          params: {\n            chainIds,\n            blockRegion: queryOptions?.blockRegion,\n            minLiquidity: queryOptions?.minLiquidity,\n            minVolume24hUsd: queryOptions?.minVolume24hUsd,\n            maxVolume24hUsd: queryOptions?.maxVolume24hUsd,\n            minMarketCap: queryOptions?.minMarketCap,\n            maxMarketCap: queryOptions?.maxMarketCap,\n          },\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n      gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n    };\n  }\n\n  /**\n   * Get popular tokens (v3 endpoint).\n   *\n   * @param chainIds - Array of chain IDs.\n   * @param queryOptions - Query options.\n   * @param queryOptions.blockRegion - Region filter (global/us).\n   * @param queryOptions.minLiquidity - Minimum liquidity filter.\n   * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.\n   * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.\n   * @param queryOptions.minMarketCap - Minimum market cap filter.\n   * @param queryOptions.maxMarketCap - Maximum market cap filter.\n   * @param options - Fetch options including cache settings.\n   * @returns Array of popular tokens.\n   */\n  async fetchV3PopularTokens(\n    chainIds: string[],\n    queryOptions?: {\n      blockRegion?: 'global' | 'us';\n      minLiquidity?: number;\n      minVolume24hUsd?: number;\n      maxVolume24hUsd?: number;\n      minMarketCap?: number;\n      maxMarketCap?: number;\n    },\n    options?: FetchOptions,\n  ): Promise<TrendingToken[]> {\n    return this.queryClient.fetchQuery(\n      this.getV3PopularTokensQueryOptions(chainIds, queryOptions, options),\n    );\n  }\n\n  // ==========================================================================\n  // TOP ASSETS\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for top assets.\n   *\n   * @param chainId - The chain ID.\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getTopAssetsQueryOptions(\n    chainId: number,\n    options?: FetchOptions,\n  ): FetchQueryOptions<TopAsset[]> {\n    return {\n      queryKey: ['token', 'topAssets', chainId],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<TopAsset[]>(API_URLS.TOKEN, `/topAssets/${chainId}`, {\n          signal,\n        }),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n      gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n    };\n  }\n\n  /**\n   * Get top assets for a chain.\n   *\n   * @param chainId - The chain ID.\n   * @param options - Fetch options including cache settings.\n   * @returns Array of top assets.\n   */\n  async fetchTopAssets(\n    chainId: number,\n    options?: FetchOptions,\n  ): Promise<TopAsset[]> {\n    return this.queryClient.fetchQuery(\n      this.getTopAssetsQueryOptions(chainId, options),\n    );\n  }\n\n  // ==========================================================================\n  // UTILITY\n  // ==========================================================================\n\n  /**\n   * Returns the TanStack Query options object for v1 suggested occurrence floors.\n   *\n   * @param options - Fetch options including cache settings.\n   * @returns TanStack Query options for use with useQuery, useSuspenseQuery, etc.\n   */\n  getV1SuggestedOccurrenceFloorsQueryOptions(\n    options?: FetchOptions,\n  ): FetchQueryOptions<V1SuggestedOccurrenceFloorsResponse> {\n    return {\n      queryKey: ['token', 'v1SuggestedOccurrenceFloors'],\n      queryFn: ({ signal }: QueryFunctionContext) =>\n        this.fetch<V1SuggestedOccurrenceFloorsResponse>(\n          API_URLS.TOKEN,\n          '/v1/suggestedOccurrenceFloors',\n          { signal },\n        ),\n      ...getQueryOptionsOverrides(options),\n      staleTime: options?.staleTime ?? STALE_TIMES.SUPPORTED_NETWORKS,\n      gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n    };\n  }\n\n  /**\n   * Get suggested occurrence floors for all chains.\n   *\n   * @param options - Fetch options including cache settings.\n   * @returns The suggested occurrence floors response.\n   */\n  async fetchV1SuggestedOccurrenceFloors(\n    options?: FetchOptions,\n  ): Promise<V1SuggestedOccurrenceFloorsResponse> {\n    return this.queryClient.fetchQuery(\n      this.getV1SuggestedOccurrenceFloorsQueryOptions(options),\n    );\n  }\n}\n"]}