@metamask/core-backend 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +252 -1
  3. package/dist/AccountActivityService.cjs +1 -1
  4. package/dist/AccountActivityService.cjs.map +1 -1
  5. package/dist/AccountActivityService.mjs +1 -1
  6. package/dist/AccountActivityService.mjs.map +1 -1
  7. package/dist/BackendWebSocketService.cjs +5 -3
  8. package/dist/BackendWebSocketService.cjs.map +1 -1
  9. package/dist/BackendWebSocketService.d.cts +2 -2
  10. package/dist/BackendWebSocketService.d.cts.map +1 -1
  11. package/dist/BackendWebSocketService.d.mts +2 -2
  12. package/dist/BackendWebSocketService.d.mts.map +1 -1
  13. package/dist/BackendWebSocketService.mjs +5 -3
  14. package/dist/BackendWebSocketService.mjs.map +1 -1
  15. package/dist/api/ApiPlatformClient.cjs +177 -0
  16. package/dist/api/ApiPlatformClient.cjs.map +1 -0
  17. package/dist/api/ApiPlatformClient.d.cts +127 -0
  18. package/dist/api/ApiPlatformClient.d.cts.map +1 -0
  19. package/dist/api/ApiPlatformClient.d.mts +127 -0
  20. package/dist/api/ApiPlatformClient.d.mts.map +1 -0
  21. package/dist/api/ApiPlatformClient.mjs +172 -0
  22. package/dist/api/ApiPlatformClient.mjs.map +1 -0
  23. package/dist/api/accounts/client.cjs +492 -0
  24. package/dist/api/accounts/client.cjs.map +1 -0
  25. package/dist/api/accounts/client.d.cts +213 -0
  26. package/dist/api/accounts/client.d.cts.map +1 -0
  27. package/dist/api/accounts/client.d.mts +213 -0
  28. package/dist/api/accounts/client.d.mts.map +1 -0
  29. package/dist/api/accounts/client.mjs +488 -0
  30. package/dist/api/accounts/client.mjs.map +1 -0
  31. package/dist/api/accounts/index.cjs +9 -0
  32. package/dist/api/accounts/index.cjs.map +1 -0
  33. package/dist/api/accounts/index.d.cts +6 -0
  34. package/dist/api/accounts/index.d.cts.map +1 -0
  35. package/dist/api/accounts/index.d.mts +6 -0
  36. package/dist/api/accounts/index.d.mts.map +1 -0
  37. package/dist/api/accounts/index.mjs +5 -0
  38. package/dist/api/accounts/index.mjs.map +1 -0
  39. package/dist/api/accounts/types.cjs +7 -0
  40. package/dist/api/accounts/types.cjs.map +1 -0
  41. package/dist/api/accounts/types.d.cts +195 -0
  42. package/dist/api/accounts/types.d.cts.map +1 -0
  43. package/dist/api/accounts/types.d.mts +195 -0
  44. package/dist/api/accounts/types.d.mts.map +1 -0
  45. package/dist/api/accounts/types.mjs +6 -0
  46. package/dist/api/accounts/types.mjs.map +1 -0
  47. package/dist/api/base-client.cjs +149 -0
  48. package/dist/api/base-client.cjs.map +1 -0
  49. package/dist/api/base-client.d.cts +54 -0
  50. package/dist/api/base-client.d.cts.map +1 -0
  51. package/dist/api/base-client.d.mts +54 -0
  52. package/dist/api/base-client.d.mts.map +1 -0
  53. package/dist/api/base-client.mjs +143 -0
  54. package/dist/api/base-client.mjs.map +1 -0
  55. package/dist/api/index.cjs +35 -0
  56. package/dist/api/index.cjs.map +1 -0
  57. package/dist/api/index.d.cts +18 -0
  58. package/dist/api/index.d.cts.map +1 -0
  59. package/dist/api/index.d.mts +18 -0
  60. package/dist/api/index.d.mts.map +1 -0
  61. package/dist/api/index.mjs +18 -0
  62. package/dist/api/index.mjs.map +1 -0
  63. package/dist/api/prices/client.cjs +521 -0
  64. package/dist/api/prices/client.cjs.map +1 -0
  65. package/dist/api/prices/client.d.cts +235 -0
  66. package/dist/api/prices/client.d.cts.map +1 -0
  67. package/dist/api/prices/client.d.mts +235 -0
  68. package/dist/api/prices/client.d.mts.map +1 -0
  69. package/dist/api/prices/client.mjs +517 -0
  70. package/dist/api/prices/client.mjs.map +1 -0
  71. package/dist/api/prices/index.cjs +9 -0
  72. package/dist/api/prices/index.cjs.map +1 -0
  73. package/dist/api/prices/index.d.cts +6 -0
  74. package/dist/api/prices/index.d.cts.map +1 -0
  75. package/dist/api/prices/index.d.mts +6 -0
  76. package/dist/api/prices/index.d.mts.map +1 -0
  77. package/dist/api/prices/index.mjs +5 -0
  78. package/dist/api/prices/index.mjs.map +1 -0
  79. package/dist/api/prices/types.cjs +7 -0
  80. package/dist/api/prices/types.cjs.map +1 -0
  81. package/dist/api/prices/types.d.cts +61 -0
  82. package/dist/api/prices/types.d.cts.map +1 -0
  83. package/dist/api/prices/types.d.mts +61 -0
  84. package/dist/api/prices/types.d.mts.map +1 -0
  85. package/dist/api/prices/types.mjs +6 -0
  86. package/dist/api/prices/types.mjs.map +1 -0
  87. package/dist/api/shared-types.cjs +93 -0
  88. package/dist/api/shared-types.cjs.map +1 -0
  89. package/dist/api/shared-types.d.cts +131 -0
  90. package/dist/api/shared-types.d.cts.map +1 -0
  91. package/dist/api/shared-types.d.mts +131 -0
  92. package/dist/api/shared-types.d.mts.map +1 -0
  93. package/dist/api/shared-types.mjs +87 -0
  94. package/dist/api/shared-types.mjs.map +1 -0
  95. package/dist/api/test-utils.cjs +70 -0
  96. package/dist/api/test-utils.cjs.map +1 -0
  97. package/dist/api/test-utils.d.cts +30 -0
  98. package/dist/api/test-utils.d.cts.map +1 -0
  99. package/dist/api/test-utils.d.mts +30 -0
  100. package/dist/api/test-utils.d.mts.map +1 -0
  101. package/dist/api/test-utils.mjs +64 -0
  102. package/dist/api/test-utils.mjs.map +1 -0
  103. package/dist/api/token/client.cjs +342 -0
  104. package/dist/api/token/client.cjs.map +1 -0
  105. package/dist/api/token/client.d.cts +193 -0
  106. package/dist/api/token/client.d.cts.map +1 -0
  107. package/dist/api/token/client.d.mts +193 -0
  108. package/dist/api/token/client.d.mts.map +1 -0
  109. package/dist/api/token/client.mjs +338 -0
  110. package/dist/api/token/client.mjs.map +1 -0
  111. package/dist/api/token/index.cjs +9 -0
  112. package/dist/api/token/index.cjs.map +1 -0
  113. package/dist/api/token/index.d.cts +6 -0
  114. package/dist/api/token/index.d.cts.map +1 -0
  115. package/dist/api/token/index.d.mts +6 -0
  116. package/dist/api/token/index.d.mts.map +1 -0
  117. package/dist/api/token/index.mjs +5 -0
  118. package/dist/api/token/index.mjs.map +1 -0
  119. package/dist/api/token/types.cjs +7 -0
  120. package/dist/api/token/types.cjs.map +1 -0
  121. package/dist/api/token/types.d.cts +75 -0
  122. package/dist/api/token/types.d.cts.map +1 -0
  123. package/dist/api/token/types.d.mts +75 -0
  124. package/dist/api/token/types.d.mts.map +1 -0
  125. package/dist/api/token/types.mjs +6 -0
  126. package/dist/api/token/types.mjs.map +1 -0
  127. package/dist/api/tokens/client.cjs +91 -0
  128. package/dist/api/tokens/client.cjs.map +1 -0
  129. package/dist/api/tokens/client.d.cts +45 -0
  130. package/dist/api/tokens/client.d.cts.map +1 -0
  131. package/dist/api/tokens/client.d.mts +45 -0
  132. package/dist/api/tokens/client.d.mts.map +1 -0
  133. package/dist/api/tokens/client.mjs +87 -0
  134. package/dist/api/tokens/client.mjs.map +1 -0
  135. package/dist/api/tokens/index.cjs +9 -0
  136. package/dist/api/tokens/index.cjs.map +1 -0
  137. package/dist/api/tokens/index.d.cts +6 -0
  138. package/dist/api/tokens/index.d.cts.map +1 -0
  139. package/dist/api/tokens/index.d.mts +6 -0
  140. package/dist/api/tokens/index.d.mts.map +1 -0
  141. package/dist/api/tokens/index.mjs +5 -0
  142. package/dist/api/tokens/index.mjs.map +1 -0
  143. package/dist/api/tokens/types.cjs +7 -0
  144. package/dist/api/tokens/types.cjs.map +1 -0
  145. package/dist/api/tokens/types.d.cts +83 -0
  146. package/dist/api/tokens/types.d.cts.map +1 -0
  147. package/dist/api/tokens/types.d.mts +83 -0
  148. package/dist/api/tokens/types.d.mts.map +1 -0
  149. package/dist/api/tokens/types.mjs +6 -0
  150. package/dist/api/tokens/types.mjs.map +1 -0
  151. package/dist/index.cjs +33 -4
  152. package/dist/index.cjs.map +1 -1
  153. package/dist/index.d.cts +6 -7
  154. package/dist/index.d.cts.map +1 -1
  155. package/dist/index.d.mts +6 -7
  156. package/dist/index.d.mts.map +1 -1
  157. package/dist/index.mjs +21 -5
  158. package/dist/index.mjs.map +1 -1
  159. package/package.json +8 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-types.mjs","sourceRoot":"","sources":["../../src/api/shared-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared types, constants, and utilities for the API Platform Client.\n */\n\nimport type { QueryClient } from '@tanstack/query-core';\n\n// ============================================================================\n// SHARED TYPES\n// ============================================================================\n\n/**\n * Pagination info for paginated responses\n */\nexport type PageInfo = {\n count: number;\n hasNextPage: boolean;\n cursor?: string;\n};\n\n/**\n * Supported currencies for Price API\n */\nexport type SupportedCurrency =\n // Crypto\n | 'btc'\n | 'eth'\n | 'ltc'\n | 'bch'\n | 'bnb'\n | 'eos'\n | 'xrp'\n | 'xlm'\n | 'link'\n | 'dot'\n | 'yfi'\n // Fiat\n | 'usd'\n | 'aed'\n | 'ars'\n | 'aud'\n | 'bdt'\n | 'bhd'\n | 'bmd'\n | 'brl'\n | 'cad'\n | 'chf'\n | 'clp'\n | 'cny'\n | 'czk'\n | 'dkk'\n | 'eur'\n | 'gbp'\n | 'gel'\n | 'hkd'\n | 'huf'\n | 'idr'\n | 'ils'\n | 'inr'\n | 'jpy'\n | 'krw'\n | 'kwd'\n | 'lkr'\n | 'mmk'\n | 'mxn'\n | 'myr'\n | 'ngn'\n | 'nok'\n | 'nzd'\n | 'php'\n | 'pkr'\n | 'pln'\n | 'rub'\n | 'sar'\n | 'sek'\n | 'sgd'\n | 'thb'\n | 'try'\n | 'twd'\n | 'uah'\n | 'vef'\n | 'vnd'\n | 'zar';\n\n/**\n * Market data details from Price API spot-prices endpoint\n */\nexport type MarketDataDetails = {\n /** Current price in the requested currency */\n price: number;\n /** Currency code (e.g., 'ETH', 'USD') */\n currency: string;\n /** 24h price change amount */\n priceChange1d: number;\n /** 24h price change percentage */\n pricePercentChange1d: number;\n /** 1h price change percentage */\n pricePercentChange1h: number;\n /** 7d price change percentage */\n pricePercentChange7d: number;\n /** 14d price change percentage */\n pricePercentChange14d: number;\n /** 30d price change percentage */\n pricePercentChange30d: number;\n /** 200d price change percentage */\n pricePercentChange200d: number;\n /** 1y price change percentage */\n pricePercentChange1y: number;\n /** Market capitalization */\n marketCap: number;\n /** Market cap 24h change percentage */\n marketCapPercentChange1d: number;\n /** All-time high price */\n allTimeHigh: number;\n /** All-time low price */\n allTimeLow: number;\n /** 24h high price */\n high1d: number;\n /** 24h low price */\n low1d: number;\n /** Total trading volume */\n totalVolume: number;\n /** Circulating supply */\n circulatingSupply: number;\n /** Diluted market cap */\n dilutedMarketCap: number;\n};\n\n// ============================================================================\n// CLIENT OPTIONS\n// ============================================================================\n\nexport type ApiPlatformClientOptions = {\n /** Client product identifier (e.g., 'metamask-extension') */\n clientProduct: string;\n /** Optional client version */\n clientVersion?: string;\n /** Function to get bearer token for authenticated requests */\n getBearerToken?: () => Promise<string | undefined>;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n};\n\nexport type FetchOptions = {\n /** Custom stale time (ms) */\n staleTime?: number;\n /** Custom GC time (ms) */\n gcTime?: number;\n};\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/** API Base URLs */\nexport const API_URLS = {\n ACCOUNTS: 'https://accounts.api.cx.metamask.io',\n PRICES: 'https://price.api.cx.metamask.io',\n TOKEN: 'https://token.api.cx.metamask.io',\n TOKENS: 'https://tokens.api.cx.metamask.io',\n} as const;\n\n/** Stale times for different data types (ms) */\nexport const STALE_TIMES = {\n AUTH_TOKEN: 5 * 60 * 1000, // 5 minutes - cache the auth token\n PRICES: 30 * 1000, // 30 seconds\n BALANCES: 60 * 1000, // 1 minute\n NETWORKS: 10 * 60 * 1000, // 10 minutes\n SUPPORTED_NETWORKS: 30 * 60 * 1000, // 30 minutes\n TOKEN_METADATA: 5 * 60 * 1000, // 5 minutes\n TOKEN_LIST: 10 * 60 * 1000, // 10 minutes\n EXCHANGE_RATES: 5 * 60 * 1000, // 5 minutes\n TRENDING: 2 * 60 * 1000, // 2 minutes\n TRANSACTIONS: 30 * 1000, // 30 seconds\n DEFAULT: 30 * 1000, // 30 seconds\n} as const;\n\n/** Garbage collection times (ms) */\nexport const GC_TIMES = {\n DEFAULT: 5 * 60 * 1000, // 5 minutes\n EXTENDED: 30 * 60 * 1000, // 30 minutes\n SHORT: 2 * 60 * 1000, // 2 minutes\n} as const;\n\n/** Retry configuration */\nexport const RETRY_CONFIG = {\n MAX_RETRIES: 3,\n BASE_DELAY: 1000,\n MAX_DELAY: 5_000,\n} as const;\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate retry delay with exponential backoff and jitter.\n *\n * @param attemptIndex - The current retry attempt (0-indexed).\n * @returns The delay in milliseconds before the next retry.\n */\nexport function calculateRetryDelay(attemptIndex: number): number {\n const delay = Math.min(\n RETRY_CONFIG.BASE_DELAY * 2 ** attemptIndex,\n RETRY_CONFIG.MAX_DELAY,\n );\n return delay / 2 + Math.random() * (delay / 2);\n}\n\n/**\n * Determine if a failed request should be retried.\n *\n * @param failureCount - The number of failures so far (1 = first failure).\n * @param error - The error from the failed request.\n * @returns True if the request should be retried, false otherwise.\n */\nexport function shouldRetry(failureCount: number, error: unknown): boolean {\n // Allow up to MAX_RETRIES retries (e.g., MAX_RETRIES=3 means 4 total attempts)\n if (failureCount > RETRY_CONFIG.MAX_RETRIES) {\n return false;\n }\n\n if (error instanceof Error && 'status' in error) {\n const { status } = error as { status: number };\n // Don't retry 4xx except 429 (rate limit) and 408 (timeout)\n if (status >= 400 && status < 500 && status !== 429 && status !== 408) {\n return false;\n }\n }\n return true;\n}\n\n// ============================================================================\n// HTTP ERROR\n// ============================================================================\n\nexport class HttpError extends Error {\n readonly status: number;\n\n readonly statusText: string;\n\n readonly url: string;\n\n readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n statusText: string,\n url: string,\n body?: unknown,\n ) {\n super(message);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.url = url;\n this.body = body;\n }\n}\n"]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * Shared test utilities for API client tests.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupTestEnvironment = exports.createTestClient = exports.createMockResponse = exports.mockFetch = void 0;
7
+ const query_core_1 = require("@tanstack/query-core");
8
+ const ApiPlatformClient_1 = require("./ApiPlatformClient.cjs");
9
+ // Mock fetch globally
10
+ exports.mockFetch = jest.fn();
11
+ globalThis.fetch = exports.mockFetch;
12
+ /**
13
+ * Helper to create a mock Response.
14
+ *
15
+ * @param data - The response data to return from json().
16
+ * @param status - HTTP status code.
17
+ * @param statusText - HTTP status text.
18
+ * @returns A mocked Response object.
19
+ */
20
+ const createMockResponse = (data, status = 200, statusText = 'OK') => ({
21
+ ok: status >= 200 && status < 300,
22
+ status,
23
+ statusText,
24
+ json: jest.fn().mockResolvedValue(data),
25
+ headers: { get: jest.fn() },
26
+ redirected: false,
27
+ type: 'basic',
28
+ url: '',
29
+ clone: jest.fn(),
30
+ body: null,
31
+ bodyUsed: false,
32
+ arrayBuffer: jest.fn(),
33
+ blob: jest.fn(),
34
+ formData: jest.fn(),
35
+ text: jest.fn(),
36
+ });
37
+ exports.createMockResponse = createMockResponse;
38
+ /**
39
+ * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.
40
+ *
41
+ * @returns A new ApiPlatformClient instance configured for testing.
42
+ */
43
+ function createTestClient() {
44
+ return new ApiPlatformClient_1.ApiPlatformClient({
45
+ clientProduct: 'test-client',
46
+ clientVersion: '1.0.0',
47
+ queryClient: new query_core_1.QueryClient({
48
+ defaultOptions: {
49
+ queries: {
50
+ retry: false,
51
+ gcTime: 0,
52
+ staleTime: 0,
53
+ },
54
+ },
55
+ }),
56
+ });
57
+ }
58
+ exports.createTestClient = createTestClient;
59
+ /**
60
+ * Setup function to be called in beforeEach.
61
+ *
62
+ * @returns An object containing a fresh test client.
63
+ */
64
+ function setupTestEnvironment() {
65
+ jest.clearAllMocks();
66
+ exports.mockFetch.mockReset();
67
+ return { client: createTestClient() };
68
+ }
69
+ exports.setupTestEnvironment = setupTestEnvironment;
70
+ //# sourceMappingURL=test-utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.cjs","sourceRoot":"","sources":["../../src/api/test-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qDAAmD;AAEnD,+DAAwD;AAExD,sBAAsB;AACT,QAAA,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAClC,UAAuD,CAAC,KAAK,GAAG,iBAAS,CAAC;AAE3E;;;;;;;GAOG;AACI,MAAM,kBAAkB,GAAG,CAChC,IAAkB,EAClB,MAAM,GAAG,GAAG,EACZ,UAAU,GAAG,IAAI,EACP,EAAE,CACZ,CAAC;IACC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IACjC,MAAM;IACN,UAAU;IACV,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACvC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;IAC3B,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;IACtB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;CAChB,CAAwB,CAAC;AArBf,QAAA,kBAAkB,sBAqBH;AAE5B;;;;GAIG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,qCAAiB,CAAC;QAC3B,aAAa,EAAE,aAAa;QAC5B,aAAa,EAAE,OAAO;QACtB,WAAW,EAAE,IAAI,wBAAW,CAAC;YAC3B,cAAc,EAAE;gBACd,OAAO,EAAE;oBACP,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;iBACb;aACF;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAdD,4CAcC;AAED;;;;GAIG;AACH,SAAgB,oBAAoB;IAClC,IAAI,CAAC,aAAa,EAAE,CAAC;IACrB,iBAAS,CAAC,SAAS,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC;AACxC,CAAC;AAJD,oDAIC","sourcesContent":["/**\n * Shared test utilities for API client tests.\n */\n\nimport { QueryClient } from '@tanstack/query-core';\n\nimport { ApiPlatformClient } from './ApiPlatformClient';\n\n// Mock fetch globally\nexport const mockFetch = jest.fn();\n(globalThis as typeof globalThis & { fetch: jest.Mock }).fetch = mockFetch;\n\n/**\n * Helper to create a mock Response.\n *\n * @param data - The response data to return from json().\n * @param status - HTTP status code.\n * @param statusText - HTTP status text.\n * @returns A mocked Response object.\n */\nexport const createMockResponse = <ResponseData>(\n data: ResponseData,\n status = 200,\n statusText = 'OK',\n): Response =>\n ({\n ok: status >= 200 && status < 300,\n status,\n statusText,\n json: jest.fn().mockResolvedValue(data),\n headers: { get: jest.fn() },\n redirected: false,\n type: 'basic',\n url: '',\n clone: jest.fn(),\n body: null,\n bodyUsed: false,\n arrayBuffer: jest.fn(),\n blob: jest.fn(),\n formData: jest.fn(),\n text: jest.fn(),\n }) as unknown as Response;\n\n/**\n * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.\n *\n * @returns A new ApiPlatformClient instance configured for testing.\n */\nexport function createTestClient(): ApiPlatformClient {\n return new ApiPlatformClient({\n clientProduct: 'test-client',\n clientVersion: '1.0.0',\n queryClient: new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n },\n }),\n });\n}\n\n/**\n * Setup function to be called in beforeEach.\n *\n * @returns An object containing a fresh test client.\n */\nexport function setupTestEnvironment(): { client: ApiPlatformClient } {\n jest.clearAllMocks();\n mockFetch.mockReset();\n return { client: createTestClient() };\n}\n"]}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shared test utilities for API client tests.
3
+ */
4
+ /// <reference types="jest" />
5
+ import { ApiPlatformClient } from "./ApiPlatformClient.cjs";
6
+ export declare const mockFetch: jest.Mock<any, any>;
7
+ /**
8
+ * Helper to create a mock Response.
9
+ *
10
+ * @param data - The response data to return from json().
11
+ * @param status - HTTP status code.
12
+ * @param statusText - HTTP status text.
13
+ * @returns A mocked Response object.
14
+ */
15
+ export declare const createMockResponse: <ResponseData>(data: ResponseData, status?: number, statusText?: string) => Response;
16
+ /**
17
+ * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.
18
+ *
19
+ * @returns A new ApiPlatformClient instance configured for testing.
20
+ */
21
+ export declare function createTestClient(): ApiPlatformClient;
22
+ /**
23
+ * Setup function to be called in beforeEach.
24
+ *
25
+ * @returns An object containing a fresh test client.
26
+ */
27
+ export declare function setupTestEnvironment(): {
28
+ client: ApiPlatformClient;
29
+ };
30
+ //# sourceMappingURL=test-utils.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.cts","sourceRoot":"","sources":["../../src/api/test-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAIH,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAGxD,eAAO,MAAM,SAAS,qBAAY,CAAC;AAGnC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,8EAI5B,QAiBwB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAcpD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAIpE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shared test utilities for API client tests.
3
+ */
4
+ /// <reference types="jest" />
5
+ import { ApiPlatformClient } from "./ApiPlatformClient.mjs";
6
+ export declare const mockFetch: jest.Mock<any, any>;
7
+ /**
8
+ * Helper to create a mock Response.
9
+ *
10
+ * @param data - The response data to return from json().
11
+ * @param status - HTTP status code.
12
+ * @param statusText - HTTP status text.
13
+ * @returns A mocked Response object.
14
+ */
15
+ export declare const createMockResponse: <ResponseData>(data: ResponseData, status?: number, statusText?: string) => Response;
16
+ /**
17
+ * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.
18
+ *
19
+ * @returns A new ApiPlatformClient instance configured for testing.
20
+ */
21
+ export declare function createTestClient(): ApiPlatformClient;
22
+ /**
23
+ * Setup function to be called in beforeEach.
24
+ *
25
+ * @returns An object containing a fresh test client.
26
+ */
27
+ export declare function setupTestEnvironment(): {
28
+ client: ApiPlatformClient;
29
+ };
30
+ //# sourceMappingURL=test-utils.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.mts","sourceRoot":"","sources":["../../src/api/test-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAIH,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAGxD,eAAO,MAAM,SAAS,qBAAY,CAAC;AAGnC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,8EAI5B,QAiBwB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAcpD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAIpE"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Shared test utilities for API client tests.
3
+ */
4
+ import { QueryClient } from "@tanstack/query-core";
5
+ import { ApiPlatformClient } from "./ApiPlatformClient.mjs";
6
+ // Mock fetch globally
7
+ export const mockFetch = jest.fn();
8
+ globalThis.fetch = mockFetch;
9
+ /**
10
+ * Helper to create a mock Response.
11
+ *
12
+ * @param data - The response data to return from json().
13
+ * @param status - HTTP status code.
14
+ * @param statusText - HTTP status text.
15
+ * @returns A mocked Response object.
16
+ */
17
+ export const createMockResponse = (data, status = 200, statusText = 'OK') => ({
18
+ ok: status >= 200 && status < 300,
19
+ status,
20
+ statusText,
21
+ json: jest.fn().mockResolvedValue(data),
22
+ headers: { get: jest.fn() },
23
+ redirected: false,
24
+ type: 'basic',
25
+ url: '',
26
+ clone: jest.fn(),
27
+ body: null,
28
+ bodyUsed: false,
29
+ arrayBuffer: jest.fn(),
30
+ blob: jest.fn(),
31
+ formData: jest.fn(),
32
+ text: jest.fn(),
33
+ });
34
+ /**
35
+ * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.
36
+ *
37
+ * @returns A new ApiPlatformClient instance configured for testing.
38
+ */
39
+ export function createTestClient() {
40
+ return new ApiPlatformClient({
41
+ clientProduct: 'test-client',
42
+ clientVersion: '1.0.0',
43
+ queryClient: new QueryClient({
44
+ defaultOptions: {
45
+ queries: {
46
+ retry: false,
47
+ gcTime: 0,
48
+ staleTime: 0,
49
+ },
50
+ },
51
+ }),
52
+ });
53
+ }
54
+ /**
55
+ * Setup function to be called in beforeEach.
56
+ *
57
+ * @returns An object containing a fresh test client.
58
+ */
59
+ export function setupTestEnvironment() {
60
+ jest.clearAllMocks();
61
+ mockFetch.mockReset();
62
+ return { client: createTestClient() };
63
+ }
64
+ //# sourceMappingURL=test-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.mjs","sourceRoot":"","sources":["../../src/api/test-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,6BAA6B;AAEnD,OAAO,EAAE,iBAAiB,EAAE,gCAA4B;AAExD,sBAAsB;AACtB,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAClC,UAAuD,CAAC,KAAK,GAAG,SAAS,CAAC;AAE3E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,IAAkB,EAClB,MAAM,GAAG,GAAG,EACZ,UAAU,GAAG,IAAI,EACP,EAAE,CACZ,CAAC;IACC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IACjC,MAAM;IACN,UAAU;IACV,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACvC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE;IAC3B,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;IACtB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;CAChB,CAAwB,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,iBAAiB,CAAC;QAC3B,aAAa,EAAE,aAAa;QAC5B,aAAa,EAAE,OAAO;QACtB,WAAW,EAAE,IAAI,WAAW,CAAC;YAC3B,cAAc,EAAE;gBACd,OAAO,EAAE;oBACP,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;iBACb;aACF;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,aAAa,EAAE,CAAC;IACrB,SAAS,CAAC,SAAS,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC;AACxC,CAAC","sourcesContent":["/**\n * Shared test utilities for API client tests.\n */\n\nimport { QueryClient } from '@tanstack/query-core';\n\nimport { ApiPlatformClient } from './ApiPlatformClient';\n\n// Mock fetch globally\nexport const mockFetch = jest.fn();\n(globalThis as typeof globalThis & { fetch: jest.Mock }).fetch = mockFetch;\n\n/**\n * Helper to create a mock Response.\n *\n * @param data - The response data to return from json().\n * @param status - HTTP status code.\n * @param statusText - HTTP status text.\n * @returns A mocked Response object.\n */\nexport const createMockResponse = <ResponseData>(\n data: ResponseData,\n status = 200,\n statusText = 'OK',\n): Response =>\n ({\n ok: status >= 200 && status < 300,\n status,\n statusText,\n json: jest.fn().mockResolvedValue(data),\n headers: { get: jest.fn() },\n redirected: false,\n type: 'basic',\n url: '',\n clone: jest.fn(),\n body: null,\n bodyUsed: false,\n arrayBuffer: jest.fn(),\n blob: jest.fn(),\n formData: jest.fn(),\n text: jest.fn(),\n }) as unknown as Response;\n\n/**\n * Creates a fresh ApiPlatformClient for testing with disabled caching/retry.\n *\n * @returns A new ApiPlatformClient instance configured for testing.\n */\nexport function createTestClient(): ApiPlatformClient {\n return new ApiPlatformClient({\n clientProduct: 'test-client',\n clientVersion: '1.0.0',\n queryClient: new QueryClient({\n defaultOptions: {\n queries: {\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n },\n }),\n });\n}\n\n/**\n * Setup function to be called in beforeEach.\n *\n * @returns An object containing a fresh test client.\n */\nexport function setupTestEnvironment(): { client: ApiPlatformClient } {\n jest.clearAllMocks();\n mockFetch.mockReset();\n return { client: createTestClient() };\n}\n"]}
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ /**
3
+ * Token API Client - token.api.cx.metamask.io
4
+ *
5
+ * Handles all token-related API calls including:
6
+ * - Networks
7
+ * - Token lists
8
+ * - Token metadata
9
+ * - Token descriptions
10
+ * - Trending tokens
11
+ * - Top gainers/popular tokens
12
+ * - Top assets
13
+ * - Occurrence floors
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.TokenApiClient = void 0;
17
+ const base_client_1 = require("../base-client.cjs");
18
+ /**
19
+ * Token API Client.
20
+ * Provides methods for interacting with the Token API.
21
+ */
22
+ class TokenApiClient extends base_client_1.BaseApiClient {
23
+ // ==========================================================================
24
+ // CACHE MANAGEMENT
25
+ // ==========================================================================
26
+ /**
27
+ * Invalidate all token API queries.
28
+ * Note: This only invalidates queries from token.api.cx.metamask.io,
29
+ * not from tokens.api.cx.metamask.io (use TokensApiClient.invalidateTokens() for that).
30
+ */
31
+ async invalidateToken() {
32
+ await this.queryClient.invalidateQueries({
33
+ queryKey: ['token'],
34
+ });
35
+ }
36
+ // ==========================================================================
37
+ // NETWORKS
38
+ // ==========================================================================
39
+ /**
40
+ * Get all networks.
41
+ *
42
+ * @param options - Fetch options including cache settings.
43
+ * @returns Array of network info.
44
+ */
45
+ async fetchNetworks(options) {
46
+ return this.queryClient.fetchQuery({
47
+ queryKey: ['token', 'networks'],
48
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, '/networks', { signal }),
49
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.SUPPORTED_NETWORKS,
50
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
51
+ });
52
+ }
53
+ /**
54
+ * Get network by chain ID.
55
+ *
56
+ * @param chainId - The chain ID.
57
+ * @param options - Fetch options including cache settings.
58
+ * @returns The network info.
59
+ */
60
+ async fetchNetworkByChainId(chainId, options) {
61
+ return this.queryClient.fetchQuery({
62
+ queryKey: ['token', 'networkByChainId', chainId],
63
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, `/networks/${chainId}`, {
64
+ signal,
65
+ }),
66
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.SUPPORTED_NETWORKS,
67
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
68
+ });
69
+ }
70
+ // ==========================================================================
71
+ // TOKEN LIST
72
+ // ==========================================================================
73
+ /**
74
+ * Get token list for a chain.
75
+ *
76
+ * @param chainId - The chain ID.
77
+ * @param queryOptions - Query options.
78
+ * @param queryOptions.includeTokenFees - Include token fees data.
79
+ * @param queryOptions.includeAssetType - Include asset type data.
80
+ * @param queryOptions.includeAggregators - Include aggregators data.
81
+ * @param queryOptions.includeERC20Permit - Include ERC20 permit data.
82
+ * @param queryOptions.includeOccurrences - Include occurrences data.
83
+ * @param queryOptions.includeStorage - Include storage data.
84
+ * @param queryOptions.includeIconUrl - Include icon URL.
85
+ * @param queryOptions.includeAddress - Include address.
86
+ * @param queryOptions.includeName - Include name.
87
+ * @param options - Fetch options including cache settings.
88
+ * @returns Array of token metadata.
89
+ */
90
+ async fetchTokenList(chainId, queryOptions, options) {
91
+ return this.queryClient.fetchQuery({
92
+ queryKey: ['token', 'tokenList', { chainId, options: queryOptions }],
93
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, `/tokens/${chainId}`, {
94
+ signal,
95
+ params: {
96
+ includeTokenFees: queryOptions?.includeTokenFees,
97
+ includeAssetType: queryOptions?.includeAssetType,
98
+ includeAggregators: queryOptions?.includeAggregators,
99
+ includeERC20Permit: queryOptions?.includeERC20Permit,
100
+ includeOccurrences: queryOptions?.includeOccurrences,
101
+ includeStorage: queryOptions?.includeStorage,
102
+ includeIconUrl: queryOptions?.includeIconUrl,
103
+ includeAddress: queryOptions?.includeAddress,
104
+ includeName: queryOptions?.includeName,
105
+ },
106
+ }),
107
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TOKEN_LIST,
108
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
109
+ });
110
+ }
111
+ // ==========================================================================
112
+ // TOKEN METADATA
113
+ // ==========================================================================
114
+ /**
115
+ * Get token metadata by address.
116
+ *
117
+ * @param chainId - The chain ID.
118
+ * @param tokenAddress - The token address.
119
+ * @param queryOptions - Query options.
120
+ * @param queryOptions.includeTokenFees - Include token fees data.
121
+ * @param queryOptions.includeAssetType - Include asset type data.
122
+ * @param queryOptions.includeAggregators - Include aggregators data.
123
+ * @param queryOptions.includeERC20Permit - Include ERC20 permit data.
124
+ * @param queryOptions.includeOccurrences - Include occurrences data.
125
+ * @param queryOptions.includeStorage - Include storage data.
126
+ * @param queryOptions.includeIconUrl - Include icon URL.
127
+ * @param queryOptions.includeAddress - Include address.
128
+ * @param queryOptions.includeName - Include name.
129
+ * @param options - Fetch options including cache settings.
130
+ * @returns The token metadata or undefined.
131
+ */
132
+ async fetchV1TokenMetadata(chainId, tokenAddress, queryOptions, options) {
133
+ try {
134
+ return await this.queryClient.fetchQuery({
135
+ queryKey: [
136
+ 'token',
137
+ 'v1Metadata',
138
+ { chainId, tokenAddress, options: queryOptions },
139
+ ],
140
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, `/token/${chainId}`, {
141
+ signal,
142
+ params: {
143
+ address: tokenAddress,
144
+ includeTokenFees: queryOptions?.includeTokenFees,
145
+ includeAssetType: queryOptions?.includeAssetType,
146
+ includeAggregators: queryOptions?.includeAggregators,
147
+ includeERC20Permit: queryOptions?.includeERC20Permit,
148
+ includeOccurrences: queryOptions?.includeOccurrences,
149
+ includeStorage: queryOptions?.includeStorage,
150
+ includeIconUrl: queryOptions?.includeIconUrl,
151
+ includeAddress: queryOptions?.includeAddress,
152
+ includeName: queryOptions?.includeName,
153
+ },
154
+ }),
155
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TOKEN_METADATA,
156
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
157
+ });
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ }
163
+ /**
164
+ * Get token description.
165
+ *
166
+ * @param chainId - The chain ID.
167
+ * @param tokenAddress - The token address.
168
+ * @param options - Fetch options including cache settings.
169
+ * @returns The token description or undefined.
170
+ */
171
+ async fetchTokenDescription(chainId, tokenAddress, options) {
172
+ try {
173
+ return await this.queryClient.fetchQuery({
174
+ queryKey: ['token', 'tokenDescription', chainId, tokenAddress],
175
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, `/token/${chainId}/description`, {
176
+ signal,
177
+ params: { address: tokenAddress },
178
+ }),
179
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TOKEN_METADATA,
180
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
181
+ });
182
+ }
183
+ catch {
184
+ return undefined;
185
+ }
186
+ }
187
+ // ==========================================================================
188
+ // TRENDING & TOP TOKENS
189
+ // ==========================================================================
190
+ /**
191
+ * Get trending tokens (v3 endpoint).
192
+ *
193
+ * @param chainIds - Array of chain IDs.
194
+ * @param queryOptions - Query options.
195
+ * @param queryOptions.sortBy - Sort option.
196
+ * @param queryOptions.minLiquidity - Minimum liquidity filter.
197
+ * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.
198
+ * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.
199
+ * @param queryOptions.minMarketCap - Minimum market cap filter.
200
+ * @param queryOptions.maxMarketCap - Maximum market cap filter.
201
+ * @param options - Fetch options including cache settings.
202
+ * @returns Array of trending tokens.
203
+ */
204
+ async fetchV3TrendingTokens(chainIds, queryOptions, options) {
205
+ return this.queryClient.fetchQuery({
206
+ queryKey: [
207
+ 'token',
208
+ 'v3Trending',
209
+ { chainIds: [...chainIds].sort(), options: queryOptions },
210
+ ],
211
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, '/v3/tokens/trending', {
212
+ signal,
213
+ params: {
214
+ chainIds,
215
+ sort: queryOptions?.sortBy,
216
+ minLiquidity: queryOptions?.minLiquidity,
217
+ minVolume24hUsd: queryOptions?.minVolume24hUsd,
218
+ maxVolume24hUsd: queryOptions?.maxVolume24hUsd,
219
+ minMarketCap: queryOptions?.minMarketCap,
220
+ maxMarketCap: queryOptions?.maxMarketCap,
221
+ },
222
+ }),
223
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TRENDING,
224
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.SHORT,
225
+ });
226
+ }
227
+ /**
228
+ * Get top gainers/losers (v3 endpoint).
229
+ *
230
+ * @param chainIds - Array of chain IDs.
231
+ * @param queryOptions - Query options.
232
+ * @param queryOptions.sort - Sort option.
233
+ * @param queryOptions.blockRegion - Region filter (global/us).
234
+ * @param queryOptions.minLiquidity - Minimum liquidity filter.
235
+ * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.
236
+ * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.
237
+ * @param queryOptions.minMarketCap - Minimum market cap filter.
238
+ * @param queryOptions.maxMarketCap - Maximum market cap filter.
239
+ * @param options - Fetch options including cache settings.
240
+ * @returns Array of top gainer tokens.
241
+ */
242
+ async fetchV3TopGainers(chainIds, queryOptions, options) {
243
+ return this.queryClient.fetchQuery({
244
+ queryKey: [
245
+ 'token',
246
+ 'v3TopGainers',
247
+ { chainIds: [...chainIds].sort(), options: queryOptions },
248
+ ],
249
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, '/v3/tokens/top-gainers', {
250
+ signal,
251
+ params: {
252
+ chainIds,
253
+ sort: queryOptions?.sort,
254
+ blockRegion: queryOptions?.blockRegion,
255
+ minLiquidity: queryOptions?.minLiquidity,
256
+ minVolume24hUsd: queryOptions?.minVolume24hUsd,
257
+ maxVolume24hUsd: queryOptions?.maxVolume24hUsd,
258
+ minMarketCap: queryOptions?.minMarketCap,
259
+ maxMarketCap: queryOptions?.maxMarketCap,
260
+ },
261
+ }),
262
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TRENDING,
263
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.SHORT,
264
+ });
265
+ }
266
+ /**
267
+ * Get popular tokens (v3 endpoint).
268
+ *
269
+ * @param chainIds - Array of chain IDs.
270
+ * @param queryOptions - Query options.
271
+ * @param queryOptions.blockRegion - Region filter (global/us).
272
+ * @param queryOptions.minLiquidity - Minimum liquidity filter.
273
+ * @param queryOptions.minVolume24hUsd - Minimum 24h volume filter.
274
+ * @param queryOptions.maxVolume24hUsd - Maximum 24h volume filter.
275
+ * @param queryOptions.minMarketCap - Minimum market cap filter.
276
+ * @param queryOptions.maxMarketCap - Maximum market cap filter.
277
+ * @param options - Fetch options including cache settings.
278
+ * @returns Array of popular tokens.
279
+ */
280
+ async fetchV3PopularTokens(chainIds, queryOptions, options) {
281
+ return this.queryClient.fetchQuery({
282
+ queryKey: [
283
+ 'token',
284
+ 'v3Popular',
285
+ { chainIds: [...chainIds].sort(), options: queryOptions },
286
+ ],
287
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, '/v3/tokens/popular', {
288
+ signal,
289
+ params: {
290
+ chainIds,
291
+ blockRegion: queryOptions?.blockRegion,
292
+ minLiquidity: queryOptions?.minLiquidity,
293
+ minVolume24hUsd: queryOptions?.minVolume24hUsd,
294
+ maxVolume24hUsd: queryOptions?.maxVolume24hUsd,
295
+ minMarketCap: queryOptions?.minMarketCap,
296
+ maxMarketCap: queryOptions?.maxMarketCap,
297
+ },
298
+ }),
299
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TRENDING,
300
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.SHORT,
301
+ });
302
+ }
303
+ // ==========================================================================
304
+ // TOP ASSETS
305
+ // ==========================================================================
306
+ /**
307
+ * Get top assets for a chain.
308
+ *
309
+ * @param chainId - The chain ID.
310
+ * @param options - Fetch options including cache settings.
311
+ * @returns Array of top assets.
312
+ */
313
+ async fetchTopAssets(chainId, options) {
314
+ return this.queryClient.fetchQuery({
315
+ queryKey: ['token', 'topAssets', chainId],
316
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, `/topAssets/${chainId}`, {
317
+ signal,
318
+ }),
319
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.TRENDING,
320
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.SHORT,
321
+ });
322
+ }
323
+ // ==========================================================================
324
+ // UTILITY
325
+ // ==========================================================================
326
+ /**
327
+ * Get suggested occurrence floors for all chains.
328
+ *
329
+ * @param options - Fetch options including cache settings.
330
+ * @returns The suggested occurrence floors response.
331
+ */
332
+ async fetchV1SuggestedOccurrenceFloors(options) {
333
+ return this.queryClient.fetchQuery({
334
+ queryKey: ['token', 'v1SuggestedOccurrenceFloors'],
335
+ queryFn: ({ signal }) => this.fetch(base_client_1.API_URLS.TOKEN, '/v1/suggestedOccurrenceFloors', { signal }),
336
+ staleTime: options?.staleTime ?? base_client_1.STALE_TIMES.SUPPORTED_NETWORKS,
337
+ gcTime: options?.gcTime ?? base_client_1.GC_TIMES.EXTENDED,
338
+ });
339
+ }
340
+ }
341
+ exports.TokenApiClient = TokenApiClient;
342
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.cjs","sourceRoot":"","sources":["../../../src/api/token/client.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAcH,oDAAgF;AAGhF;;;GAGG;AACH,MAAa,cAAe,SAAQ,2BAAa;IAC/C,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E;;;;OAIG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC;YACvC,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,WAAW;IACX,6EAA6E;IAE7E;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,OAAsB;QACxC,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;YAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAgB,sBAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC;YACpE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,kBAAkB;YAC/D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CACzB,OAAe,EACf,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC;YAChD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAc,sBAAQ,CAAC,KAAK,EAAE,aAAa,OAAO,EAAE,EAAE;gBAC9D,MAAM;aACP,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,kBAAkB;YAC/D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,aAAa;IACb,6EAA6E;IAE7E;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,YAUC,EACD,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;YACpE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAkB,sBAAQ,CAAC,KAAK,EAAE,WAAW,OAAO,EAAE,EAAE;gBAChE,MAAM;gBACN,MAAM,EAAE;oBACN,gBAAgB,EAAE,YAAY,EAAE,gBAAgB;oBAChD,gBAAgB,EAAE,YAAY,EAAE,gBAAgB;oBAChD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;oBACpD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;oBACpD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;oBACpD,cAAc,EAAE,YAAY,EAAE,cAAc;oBAC5C,cAAc,EAAE,YAAY,EAAE,cAAc;oBAC5C,cAAc,EAAE,YAAY,EAAE,cAAc;oBAC5C,WAAW,EAAE,YAAY,EAAE,WAAW;iBACvC;aACF,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,UAAU;YACvD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,oBAAoB,CACxB,OAAe,EACf,YAAoB,EACpB,YAUC,EACD,OAAsB;QAEtB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;gBACvC,QAAQ,EAAE;oBACR,OAAO;oBACP,YAAY;oBACZ,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE;iBACjD;gBACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAgB,sBAAQ,CAAC,KAAK,EAAE,UAAU,OAAO,EAAE,EAAE;oBAC7D,MAAM;oBACN,MAAM,EAAE;wBACN,OAAO,EAAE,YAAY;wBACrB,gBAAgB,EAAE,YAAY,EAAE,gBAAgB;wBAChD,gBAAgB,EAAE,YAAY,EAAE,gBAAgB;wBAChD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;wBACpD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;wBACpD,kBAAkB,EAAE,YAAY,EAAE,kBAAkB;wBACpD,cAAc,EAAE,YAAY,EAAE,cAAc;wBAC5C,cAAc,EAAE,YAAY,EAAE,cAAc;wBAC5C,cAAc,EAAE,YAAY,EAAE,cAAc;wBAC5C,WAAW,EAAE,YAAY,EAAE,WAAW;qBACvC;iBACF,CAAC;gBACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,cAAc;gBAC3D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,qBAAqB,CACzB,OAAe,EACf,YAAoB,EACpB,OAAsB;QAEtB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;gBACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,CAAC;gBAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CACR,sBAAQ,CAAC,KAAK,EACd,UAAU,OAAO,cAAc,EAC/B;oBACE,MAAM;oBACN,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;iBAClC,CACF;gBACH,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,cAAc;gBAC3D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,wBAAwB;IACxB,6EAA6E;IAE7E;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,qBAAqB,CACzB,QAAkB,EAClB,YAOC,EACD,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,OAAO;gBACP,YAAY;gBACZ,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;aAC1D;YACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAkB,sBAAQ,CAAC,KAAK,EAAE,qBAAqB,EAAE;gBACjE,MAAM;gBACN,MAAM,EAAE;oBACN,QAAQ;oBACR,IAAI,EAAE,YAAY,EAAE,MAAM;oBAC1B,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,YAAY,EAAE,YAAY,EAAE,YAAY;iBACzC;aACF,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,QAAQ;YACrD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAkB,EAClB,YAQC,EACD,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,OAAO;gBACP,cAAc;gBACd,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;aAC1D;YACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAkB,sBAAQ,CAAC,KAAK,EAAE,wBAAwB,EAAE;gBACpE,MAAM;gBACN,MAAM,EAAE;oBACN,QAAQ;oBACR,IAAI,EAAE,YAAY,EAAE,IAAI;oBACxB,WAAW,EAAE,YAAY,EAAE,WAAW;oBACtC,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,YAAY,EAAE,YAAY,EAAE,YAAY;iBACzC;aACF,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,QAAQ;YACrD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,oBAAoB,CACxB,QAAkB,EAClB,YAOC,EACD,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE;gBACR,OAAO;gBACP,WAAW;gBACX,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;aAC1D;YACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAkB,sBAAQ,CAAC,KAAK,EAAE,oBAAoB,EAAE;gBAChE,MAAM;gBACN,MAAM,EAAE;oBACN,QAAQ;oBACR,WAAW,EAAE,YAAY,EAAE,WAAW;oBACtC,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,eAAe,EAAE,YAAY,EAAE,eAAe;oBAC9C,YAAY,EAAE,YAAY,EAAE,YAAY;oBACxC,YAAY,EAAE,YAAY,EAAE,YAAY;iBACzC;aACF,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,QAAQ;YACrD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,aAAa;IACb,6EAA6E;IAE7E;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC;YACzC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CAAa,sBAAQ,CAAC,KAAK,EAAE,cAAc,OAAO,EAAE,EAAE;gBAC9D,MAAM;aACP,CAAC;YACJ,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,QAAQ;YACrD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,KAAK;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,UAAU;IACV,6EAA6E;IAE7E;;;;;OAKG;IACH,KAAK,CAAC,gCAAgC,CACpC,OAAsB;QAEtB,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,CAAC;YAClD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAwB,EAAE,EAAE,CAC5C,IAAI,CAAC,KAAK,CACR,sBAAQ,CAAC,KAAK,EACd,+BAA+B,EAC/B,EAAE,MAAM,EAAE,CACX;YACH,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,yBAAW,CAAC,kBAAkB;YAC/D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAQ,CAAC,QAAQ;SAC7C,CAAC,CAAC;IACL,CAAC;CACF;AA1aD,wCA0aC","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 { QueryFunctionContext } from '@tanstack/query-core';\n\nimport type {\n TokenMetadata,\n V1TokenDescriptionResponse,\n NetworkInfo,\n TopAsset,\n TrendingToken,\n TrendingSortOption,\n TopGainersSortOption,\n V1SuggestedOccurrenceFloorsResponse,\n} from './types';\nimport { BaseApiClient, API_URLS, STALE_TIMES, GC_TIMES } from '../base-client';\nimport type { FetchOptions } from '../shared-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 * 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({\n queryKey: ['token', 'networks'],\n queryFn: ({ signal }: QueryFunctionContext) =>\n this.fetch<NetworkInfo[]>(API_URLS.TOKEN, '/networks', { signal }),\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 queryKey: ['token', 'networkByChainId', chainId],\n queryFn: ({ signal }: QueryFunctionContext) =>\n this.fetch<NetworkInfo>(API_URLS.TOKEN, `/networks/${chainId}`, {\n signal,\n }),\n staleTime: options?.staleTime ?? STALE_TIMES.SUPPORTED_NETWORKS,\n gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n });\n }\n\n // ==========================================================================\n // TOKEN LIST\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 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 staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_LIST,\n gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n });\n }\n\n // ==========================================================================\n // TOKEN METADATA\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 queryKey: [\n 'token',\n 'v1Metadata',\n { chainId, tokenAddress, options: queryOptions },\n ],\n queryFn: ({ signal }: QueryFunctionContext) =>\n 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 staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_METADATA,\n gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n });\n } catch {\n return undefined;\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 queryKey: ['token', 'tokenDescription', chainId, tokenAddress],\n queryFn: ({ signal }: QueryFunctionContext) =>\n this.fetch<V1TokenDescriptionResponse>(\n API_URLS.TOKEN,\n `/token/${chainId}/description`,\n {\n signal,\n params: { address: tokenAddress },\n },\n ),\n staleTime: options?.staleTime ?? STALE_TIMES.TOKEN_METADATA,\n gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n });\n } catch {\n return undefined;\n }\n }\n\n // ==========================================================================\n // TRENDING & TOP TOKENS\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 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 },\n options?: FetchOptions,\n ): Promise<TrendingToken[]> {\n return this.queryClient.fetchQuery({\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 },\n }),\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 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 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 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 staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n });\n }\n\n // ==========================================================================\n // TOP ASSETS\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 queryKey: ['token', 'topAssets', chainId],\n queryFn: ({ signal }: QueryFunctionContext) =>\n this.fetch<TopAsset[]>(API_URLS.TOKEN, `/topAssets/${chainId}`, {\n signal,\n }),\n staleTime: options?.staleTime ?? STALE_TIMES.TRENDING,\n gcTime: options?.gcTime ?? GC_TIMES.SHORT,\n });\n }\n\n // ==========================================================================\n // UTILITY\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 queryKey: ['token', 'v1SuggestedOccurrenceFloors'],\n queryFn: ({ signal }: QueryFunctionContext) =>\n this.fetch<V1SuggestedOccurrenceFloorsResponse>(\n API_URLS.TOKEN,\n '/v1/suggestedOccurrenceFloors',\n { signal },\n ),\n staleTime: options?.staleTime ?? STALE_TIMES.SUPPORTED_NETWORKS,\n gcTime: options?.gcTime ?? GC_TIMES.EXTENDED,\n });\n }\n}\n"]}