@liberfi.io/utils 0.1.192 → 0.2.1

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.
package/dist/index.d.mts CHANGED
@@ -1,23 +1,59 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
3
 
4
- /** Returns the chain namespace (EVM or SOLANA) for a given chain */
4
+ /** Returns the chain namespace (EVM or SOLANA) for a given chain. */
5
5
  declare function chainToNamespace(chain: Chain): ChainNamespace;
6
6
  declare function isSolanaChain(chain: Chain): boolean;
7
7
  declare function isEthereumChain(chain: Chain): boolean;
8
8
  declare function isBinanceChain(chain: Chain): boolean;
9
+ /** All per-chain metadata stored in one record. */
10
+ interface ChainMetadata {
11
+ /** Canonical lowercase slug (used in URLs and icon CDN). */
12
+ slug: string;
13
+ /** Optional short abbreviation (e.g. "eth" for Ethereum). Takes precedence over `slug` in display. */
14
+ abbr?: string;
15
+ /** Optional brand colour (hex). */
16
+ color?: string;
17
+ }
18
+ /** Single source of truth for chain metadata. */
19
+ declare const CHAIN_REGISTRY: Partial<Record<Chain, ChainMetadata>>;
20
+ /** Returns the brand colour for the chain, when defined. */
9
21
  declare function chainColor(chainId: Chain): string | undefined;
10
- declare function chainIcon(chain: Chain | string): string | undefined;
22
+ /** Returns the canonical slug for the chain, when defined. */
11
23
  declare function chainSlug(chainId: Chain): string | undefined;
24
+ /**
25
+ * Returns a CDN icon URL for the chain.
26
+ * Accepts either a `Chain` enum value or a slug / abbreviation string.
27
+ */
28
+ declare function chainIcon(chain: Chain | string): string | undefined;
29
+ /**
30
+ * Returns a user-facing display name for the chain.
31
+ * Prefers the uppercased abbreviation when defined, otherwise title-cases the slug.
32
+ */
12
33
  declare function chainDisplayName(chainId: Chain): string;
13
34
  declare function chainIdBySlug(slug: string): Chain | undefined;
14
35
  declare function isValidWalletAddress(chain: Chain | string, addr: string): boolean;
15
36
  declare function isValidEvmAddress(value: string): boolean;
16
37
  declare function isValidSolanaAddress(value: string): boolean;
17
38
 
39
+ /**
40
+ * Error subclass raised by {@link httpRequest} when the server returns a
41
+ * structured 400-class response with a `message` / `code` payload.
42
+ */
18
43
  declare class ApiError extends Error {
44
+ /** Application-level error code parsed from the response body. */
19
45
  readonly code: number;
20
- constructor(message: string, code: number);
46
+ /** HTTP status code returned by the server, when known. */
47
+ readonly status?: number | undefined;
48
+ /** Raw parsed response body, when JSON. Useful for surfacing validation errors. */
49
+ readonly data?: unknown | undefined;
50
+ constructor(message: string,
51
+ /** Application-level error code parsed from the response body. */
52
+ code: number,
53
+ /** HTTP status code returned by the server, when known. */
54
+ status?: number | undefined,
55
+ /** Raw parsed response body, when JSON. Useful for surfacing validation errors. */
56
+ data?: unknown | undefined);
21
57
  }
22
58
 
23
59
  interface FormatAgeOptions {
@@ -67,20 +103,41 @@ declare function formatAgeInSeconds(age: number, options?: FormatAgeOptions): st
67
103
  */
68
104
  declare function formatAge(age: number, options?: FormatAgeOptions): string;
69
105
 
70
- declare function httpRequest<R = any>(url: string, options: RequestInit): Promise<R>;
71
- declare function httpGet<R = any>(url: string, options?: RequestInit): Promise<R>;
72
- declare function httpPost<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
73
- declare function httpPut<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
74
- declare function httpDelete<R = any>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
75
- declare function httpMutate<R = any>(url: string, init: RequestInit): Promise<R>;
106
+ /**
107
+ * Generic HTTP request helper.
108
+ *
109
+ * On success returns the parsed JSON body typed as `R` (defaults to `unknown`).
110
+ * On HTTP 400 responses throws {@link ApiError} populated with the response
111
+ * `message`, `code`, HTTP status, and raw parsed body. On any other non-OK
112
+ * response throws a plain `Error` with a best-effort message.
113
+ */
114
+ declare function httpRequest<R = unknown>(url: string, options: RequestInit): Promise<R>;
115
+ declare function httpGet<R = unknown>(url: string, options?: RequestInit): Promise<R>;
116
+ declare function httpPost<R = unknown, P = unknown>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
117
+ declare function httpPut<R = unknown, P = unknown>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
118
+ declare function httpDelete<R = unknown>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
119
+ declare function httpMutate<R = unknown>(url: string, init: RequestInit): Promise<R>;
76
120
 
77
121
  /**
78
122
  * A `BigNumber` subclass that never throws on construction.
79
- * Invalid / undefined values fall back to `0`.
123
+ *
124
+ * - `undefined` / `null` → falls back to `0`.
125
+ * - Strings that `BigNumber` can't parse (e.g. `"not-a-number"`) → falls back to `0`.
126
+ * - Strings with extra trailing characters (e.g. `"123abc"`) → falls back to `0`
127
+ * (because `BigNumber` itself returns NaN for these).
128
+ * - Any unexpected throw inside `BigNumber`'s constructor is caught and treated as `0`.
80
129
  */
81
130
  declare class SafeBigNumber extends BigNumber {
82
131
  constructor(num?: BigNumber.Value, base?: number);
83
132
  }
133
+ /**
134
+ * Returns `true` when the value can be unambiguously parsed as a finite number.
135
+ *
136
+ * Strings must be fully numeric decimal literals (after trimming). Permissive
137
+ * partial parses such as `"123abc"`, hex prefixes like `"0x10"`, the literal
138
+ * `"Infinity"`, or empty strings are rejected. Finite numbers and `BigNumber`
139
+ * / `SafeBigNumber` instances are accepted.
140
+ */
84
141
  declare const isValidNumber: (num: unknown) => boolean;
85
142
  type FormatAmountOptions = {
86
143
  showPlusGtThanZero: boolean;
@@ -146,7 +203,7 @@ type FormatPriceOptions = {
146
203
  isHighPrecise: boolean;
147
204
  };
148
205
  /**
149
- * Format a token price (no currency symbol).
206
+ * Format a token price (no currency symbol). Negative inputs render as `"--"`.
150
207
  *
151
208
  * Same precision tiers as {@link formatPriceUSD} but without the "$" prefix.
152
209
  *
@@ -155,7 +212,7 @@ type FormatPriceOptions = {
155
212
  */
156
213
  declare const formatPrice: (num?: BigNumber.Value, options?: FormatPriceOptions) => string;
157
214
  /**
158
- * Format a token price with "$" prefix.
215
+ * Format a token price with "$" prefix. Negative inputs render as `"--"`.
159
216
  *
160
217
  * Two precision modes controlled by `isHighPrecise` (default: `true`):
161
218
  *
@@ -190,6 +247,8 @@ type FormatPercentOptions = {
190
247
  * | < 1000 | "15,000.5%" (1 dp by default) |
191
248
  * | ≥ 1000 | "> 99,999%" |
192
249
  *
250
+ * Large values use thousand-grouping separators (e.g. `"15,000%"`).
251
+ *
193
252
  * @param num - The ratio value (0.3 means 30%).
194
253
  * @param options.showPlusGtThanZero - Prefix positive values with "+".
195
254
  * @param options.precision - Decimal precision override.
@@ -223,24 +282,27 @@ declare function capitalize(str: string): string;
223
282
  declare function truncateAddress(address: string, start?: number, end?: number): string;
224
283
 
225
284
  /**
226
- * Format trading pair symbol *
227
- * Format symbols like "PERP_BTC_USDT" according to the specified format
285
+ * Format trading pair symbol.
286
+ *
287
+ * Splits a symbol like `"PERP_BTC_USDT"` into `type`/`base`/`quote` parts and
288
+ * substitutes them into the format template. Placeholders may be written either
289
+ * as bare words (`type`, `base`, `quote`) or with curly braces (`{type}`,
290
+ * `{base}`, `{quote}`). All placeholder occurrences are replaced in a single
291
+ * pass, so substitutions cannot interfere with each other even if the
292
+ * substituted value happens to contain another placeholder substring.
228
293
  *
229
- * @param symbol - Original trading pair symbol in format "type_base_quote" (e.g., "PERP_BTC_USDT")
230
- * @param formatString - Format string template, defaults to "base"
231
- * - Supports the following placeholders:
232
- * - "type": Trading type (e.g., "PERP")
233
- * - "base": Base currency (e.g., "BTC")
234
- * - "quote": Quote currency (e.g., "USDT")
294
+ * @param symbol - Original trading pair symbol in format `"type_base_quote"` (e.g. `"PERP_BTC_USDT"`).
295
+ * @param formatString - Format string template; defaults to `"base-type"`.
235
296
  *
236
- * @returns Formatted string, returns empty string if input is empty
297
+ * @returns Formatted string, or `""` if `symbol` is empty.
237
298
  *
238
299
  * @example
239
300
  * ```typescript
240
- * formatSymbol("PERP_BTC_USDT") // "BTC"
301
+ * formatSymbol("PERP_BTC_USDT") // "BTC-PERP" (default "base-type")
241
302
  * formatSymbol("PERP_BTC_USDT", "base") // "BTC"
242
- * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
303
+ * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
243
304
  * formatSymbol("SPOT_ETH_USDC", "base-quote") // "ETH-USDC"
305
+ * formatSymbol("SPOT_ETH_USDC", "{base}/{quote}") // "ETH/USDC"
244
306
  * ```
245
307
  */
246
308
  declare function formatSymbol(symbol: string, formatString?: string): string;
@@ -286,11 +348,13 @@ type DebouncedFunction<T extends (...args: any[]) => void> = T & {
286
348
  };
287
349
  declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): DebouncedFunction<T>;
288
350
 
289
- declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
290
- declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
291
- declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
292
- declare function groupBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T[]>;
351
+ /** Accepts either a key-extractor function or a property name. */
352
+ type Iteratee<T, R> = ((item: T) => R) | keyof T;
353
+ declare function uniqBy<T>(array: T[], iteratee: Iteratee<T, unknown>): T[];
354
+ declare function intersectionBy<T>(a: T[], b: T[], iteratee: Iteratee<T, unknown>): T[];
355
+ declare function keyBy<T>(array: T[], iteratee: Iteratee<T, string>): Record<string, T>;
356
+ declare function groupBy<T>(array: T[], iteratee: Iteratee<T, string>): Record<string, T[]>;
293
357
  declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
294
358
  declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
295
359
 
296
- export { ARBITRUM_TOKENS, AVALANCHE_TOKENS, ApiError, BSC_TOKENS, CHAIN_TOKENS, type ChainPredefinedTokens, ETHEREUM_TOKENS, type FormatAgeOptions, type FormatAmountOptions, type FormatPercentOptions, type FormatPriceOptions, OPTIMISM_TOKENS, type PredefinedToken, SOLANA_TOKENS, SafeBigNumber, accountExplorerUrl, capitalize, chainColor, chainDisplayName, chainIcon, chainIdBySlug, chainSlug, chainToNamespace, debounce, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, groupBy, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, intersectionBy, isBinanceChain, isEthereumChain, isSolanaChain, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy };
360
+ export { ARBITRUM_TOKENS, AVALANCHE_TOKENS, ApiError, BSC_TOKENS, CHAIN_REGISTRY, CHAIN_TOKENS, type ChainMetadata, type ChainPredefinedTokens, ETHEREUM_TOKENS, type FormatAgeOptions, type FormatAmountOptions, type FormatPercentOptions, type FormatPriceOptions, OPTIMISM_TOKENS, type PredefinedToken, SOLANA_TOKENS, SafeBigNumber, accountExplorerUrl, capitalize, chainColor, chainDisplayName, chainIcon, chainIdBySlug, chainSlug, chainToNamespace, debounce, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, groupBy, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, intersectionBy, isBinanceChain, isEthereumChain, isSolanaChain, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy };
package/dist/index.d.ts CHANGED
@@ -1,23 +1,59 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
3
 
4
- /** Returns the chain namespace (EVM or SOLANA) for a given chain */
4
+ /** Returns the chain namespace (EVM or SOLANA) for a given chain. */
5
5
  declare function chainToNamespace(chain: Chain): ChainNamespace;
6
6
  declare function isSolanaChain(chain: Chain): boolean;
7
7
  declare function isEthereumChain(chain: Chain): boolean;
8
8
  declare function isBinanceChain(chain: Chain): boolean;
9
+ /** All per-chain metadata stored in one record. */
10
+ interface ChainMetadata {
11
+ /** Canonical lowercase slug (used in URLs and icon CDN). */
12
+ slug: string;
13
+ /** Optional short abbreviation (e.g. "eth" for Ethereum). Takes precedence over `slug` in display. */
14
+ abbr?: string;
15
+ /** Optional brand colour (hex). */
16
+ color?: string;
17
+ }
18
+ /** Single source of truth for chain metadata. */
19
+ declare const CHAIN_REGISTRY: Partial<Record<Chain, ChainMetadata>>;
20
+ /** Returns the brand colour for the chain, when defined. */
9
21
  declare function chainColor(chainId: Chain): string | undefined;
10
- declare function chainIcon(chain: Chain | string): string | undefined;
22
+ /** Returns the canonical slug for the chain, when defined. */
11
23
  declare function chainSlug(chainId: Chain): string | undefined;
24
+ /**
25
+ * Returns a CDN icon URL for the chain.
26
+ * Accepts either a `Chain` enum value or a slug / abbreviation string.
27
+ */
28
+ declare function chainIcon(chain: Chain | string): string | undefined;
29
+ /**
30
+ * Returns a user-facing display name for the chain.
31
+ * Prefers the uppercased abbreviation when defined, otherwise title-cases the slug.
32
+ */
12
33
  declare function chainDisplayName(chainId: Chain): string;
13
34
  declare function chainIdBySlug(slug: string): Chain | undefined;
14
35
  declare function isValidWalletAddress(chain: Chain | string, addr: string): boolean;
15
36
  declare function isValidEvmAddress(value: string): boolean;
16
37
  declare function isValidSolanaAddress(value: string): boolean;
17
38
 
39
+ /**
40
+ * Error subclass raised by {@link httpRequest} when the server returns a
41
+ * structured 400-class response with a `message` / `code` payload.
42
+ */
18
43
  declare class ApiError extends Error {
44
+ /** Application-level error code parsed from the response body. */
19
45
  readonly code: number;
20
- constructor(message: string, code: number);
46
+ /** HTTP status code returned by the server, when known. */
47
+ readonly status?: number | undefined;
48
+ /** Raw parsed response body, when JSON. Useful for surfacing validation errors. */
49
+ readonly data?: unknown | undefined;
50
+ constructor(message: string,
51
+ /** Application-level error code parsed from the response body. */
52
+ code: number,
53
+ /** HTTP status code returned by the server, when known. */
54
+ status?: number | undefined,
55
+ /** Raw parsed response body, when JSON. Useful for surfacing validation errors. */
56
+ data?: unknown | undefined);
21
57
  }
22
58
 
23
59
  interface FormatAgeOptions {
@@ -67,20 +103,41 @@ declare function formatAgeInSeconds(age: number, options?: FormatAgeOptions): st
67
103
  */
68
104
  declare function formatAge(age: number, options?: FormatAgeOptions): string;
69
105
 
70
- declare function httpRequest<R = any>(url: string, options: RequestInit): Promise<R>;
71
- declare function httpGet<R = any>(url: string, options?: RequestInit): Promise<R>;
72
- declare function httpPost<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
73
- declare function httpPut<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
74
- declare function httpDelete<R = any>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
75
- declare function httpMutate<R = any>(url: string, init: RequestInit): Promise<R>;
106
+ /**
107
+ * Generic HTTP request helper.
108
+ *
109
+ * On success returns the parsed JSON body typed as `R` (defaults to `unknown`).
110
+ * On HTTP 400 responses throws {@link ApiError} populated with the response
111
+ * `message`, `code`, HTTP status, and raw parsed body. On any other non-OK
112
+ * response throws a plain `Error` with a best-effort message.
113
+ */
114
+ declare function httpRequest<R = unknown>(url: string, options: RequestInit): Promise<R>;
115
+ declare function httpGet<R = unknown>(url: string, options?: RequestInit): Promise<R>;
116
+ declare function httpPost<R = unknown, P = unknown>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
117
+ declare function httpPut<R = unknown, P = unknown>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
118
+ declare function httpDelete<R = unknown>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
119
+ declare function httpMutate<R = unknown>(url: string, init: RequestInit): Promise<R>;
76
120
 
77
121
  /**
78
122
  * A `BigNumber` subclass that never throws on construction.
79
- * Invalid / undefined values fall back to `0`.
123
+ *
124
+ * - `undefined` / `null` → falls back to `0`.
125
+ * - Strings that `BigNumber` can't parse (e.g. `"not-a-number"`) → falls back to `0`.
126
+ * - Strings with extra trailing characters (e.g. `"123abc"`) → falls back to `0`
127
+ * (because `BigNumber` itself returns NaN for these).
128
+ * - Any unexpected throw inside `BigNumber`'s constructor is caught and treated as `0`.
80
129
  */
81
130
  declare class SafeBigNumber extends BigNumber {
82
131
  constructor(num?: BigNumber.Value, base?: number);
83
132
  }
133
+ /**
134
+ * Returns `true` when the value can be unambiguously parsed as a finite number.
135
+ *
136
+ * Strings must be fully numeric decimal literals (after trimming). Permissive
137
+ * partial parses such as `"123abc"`, hex prefixes like `"0x10"`, the literal
138
+ * `"Infinity"`, or empty strings are rejected. Finite numbers and `BigNumber`
139
+ * / `SafeBigNumber` instances are accepted.
140
+ */
84
141
  declare const isValidNumber: (num: unknown) => boolean;
85
142
  type FormatAmountOptions = {
86
143
  showPlusGtThanZero: boolean;
@@ -146,7 +203,7 @@ type FormatPriceOptions = {
146
203
  isHighPrecise: boolean;
147
204
  };
148
205
  /**
149
- * Format a token price (no currency symbol).
206
+ * Format a token price (no currency symbol). Negative inputs render as `"--"`.
150
207
  *
151
208
  * Same precision tiers as {@link formatPriceUSD} but without the "$" prefix.
152
209
  *
@@ -155,7 +212,7 @@ type FormatPriceOptions = {
155
212
  */
156
213
  declare const formatPrice: (num?: BigNumber.Value, options?: FormatPriceOptions) => string;
157
214
  /**
158
- * Format a token price with "$" prefix.
215
+ * Format a token price with "$" prefix. Negative inputs render as `"--"`.
159
216
  *
160
217
  * Two precision modes controlled by `isHighPrecise` (default: `true`):
161
218
  *
@@ -190,6 +247,8 @@ type FormatPercentOptions = {
190
247
  * | < 1000 | "15,000.5%" (1 dp by default) |
191
248
  * | ≥ 1000 | "> 99,999%" |
192
249
  *
250
+ * Large values use thousand-grouping separators (e.g. `"15,000%"`).
251
+ *
193
252
  * @param num - The ratio value (0.3 means 30%).
194
253
  * @param options.showPlusGtThanZero - Prefix positive values with "+".
195
254
  * @param options.precision - Decimal precision override.
@@ -223,24 +282,27 @@ declare function capitalize(str: string): string;
223
282
  declare function truncateAddress(address: string, start?: number, end?: number): string;
224
283
 
225
284
  /**
226
- * Format trading pair symbol *
227
- * Format symbols like "PERP_BTC_USDT" according to the specified format
285
+ * Format trading pair symbol.
286
+ *
287
+ * Splits a symbol like `"PERP_BTC_USDT"` into `type`/`base`/`quote` parts and
288
+ * substitutes them into the format template. Placeholders may be written either
289
+ * as bare words (`type`, `base`, `quote`) or with curly braces (`{type}`,
290
+ * `{base}`, `{quote}`). All placeholder occurrences are replaced in a single
291
+ * pass, so substitutions cannot interfere with each other even if the
292
+ * substituted value happens to contain another placeholder substring.
228
293
  *
229
- * @param symbol - Original trading pair symbol in format "type_base_quote" (e.g., "PERP_BTC_USDT")
230
- * @param formatString - Format string template, defaults to "base"
231
- * - Supports the following placeholders:
232
- * - "type": Trading type (e.g., "PERP")
233
- * - "base": Base currency (e.g., "BTC")
234
- * - "quote": Quote currency (e.g., "USDT")
294
+ * @param symbol - Original trading pair symbol in format `"type_base_quote"` (e.g. `"PERP_BTC_USDT"`).
295
+ * @param formatString - Format string template; defaults to `"base-type"`.
235
296
  *
236
- * @returns Formatted string, returns empty string if input is empty
297
+ * @returns Formatted string, or `""` if `symbol` is empty.
237
298
  *
238
299
  * @example
239
300
  * ```typescript
240
- * formatSymbol("PERP_BTC_USDT") // "BTC"
301
+ * formatSymbol("PERP_BTC_USDT") // "BTC-PERP" (default "base-type")
241
302
  * formatSymbol("PERP_BTC_USDT", "base") // "BTC"
242
- * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
303
+ * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
243
304
  * formatSymbol("SPOT_ETH_USDC", "base-quote") // "ETH-USDC"
305
+ * formatSymbol("SPOT_ETH_USDC", "{base}/{quote}") // "ETH/USDC"
244
306
  * ```
245
307
  */
246
308
  declare function formatSymbol(symbol: string, formatString?: string): string;
@@ -286,11 +348,13 @@ type DebouncedFunction<T extends (...args: any[]) => void> = T & {
286
348
  };
287
349
  declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): DebouncedFunction<T>;
288
350
 
289
- declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
290
- declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
291
- declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
292
- declare function groupBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T[]>;
351
+ /** Accepts either a key-extractor function or a property name. */
352
+ type Iteratee<T, R> = ((item: T) => R) | keyof T;
353
+ declare function uniqBy<T>(array: T[], iteratee: Iteratee<T, unknown>): T[];
354
+ declare function intersectionBy<T>(a: T[], b: T[], iteratee: Iteratee<T, unknown>): T[];
355
+ declare function keyBy<T>(array: T[], iteratee: Iteratee<T, string>): Record<string, T>;
356
+ declare function groupBy<T>(array: T[], iteratee: Iteratee<T, string>): Record<string, T[]>;
293
357
  declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
294
358
  declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
295
359
 
296
- export { ARBITRUM_TOKENS, AVALANCHE_TOKENS, ApiError, BSC_TOKENS, CHAIN_TOKENS, type ChainPredefinedTokens, ETHEREUM_TOKENS, type FormatAgeOptions, type FormatAmountOptions, type FormatPercentOptions, type FormatPriceOptions, OPTIMISM_TOKENS, type PredefinedToken, SOLANA_TOKENS, SafeBigNumber, accountExplorerUrl, capitalize, chainColor, chainDisplayName, chainIcon, chainIdBySlug, chainSlug, chainToNamespace, debounce, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, groupBy, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, intersectionBy, isBinanceChain, isEthereumChain, isSolanaChain, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy };
360
+ export { ARBITRUM_TOKENS, AVALANCHE_TOKENS, ApiError, BSC_TOKENS, CHAIN_REGISTRY, CHAIN_TOKENS, type ChainMetadata, type ChainPredefinedTokens, ETHEREUM_TOKENS, type FormatAgeOptions, type FormatAmountOptions, type FormatPercentOptions, type FormatPriceOptions, OPTIMISM_TOKENS, type PredefinedToken, SOLANA_TOKENS, SafeBigNumber, accountExplorerUrl, capitalize, chainColor, chainDisplayName, chainIcon, chainIdBySlug, chainSlug, chainToNamespace, debounce, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, groupBy, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, intersectionBy, isBinanceChain, isEthereumChain, isSolanaChain, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var j=Object.create;var S=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty;var ne=(t,r)=>{for(var n in r)S(t,n,{get:r[n],enumerable:!0})},I=(t,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of Q(r))!te.call(t,s)&&s!==n&&S(t,s,{get:()=>r[s],enumerable:!(o=J(r,s))||o.enumerable});return t};var re=(t,r,n)=>(n=t!=null?j(ee(t)):{},I(r||!t||!t.__esModule?S(n,"default",{value:t,enumerable:!0}):n,t)),oe=t=>I(S({},"__esModule",{value:!0}),t);var Qe={};ne(Qe,{ARBITRUM_TOKENS:()=>F,AVALANCHE_TOKENS:()=>V,ApiError:()=>f,BSC_TOKENS:()=>_,CHAIN_TOKENS:()=>T,ETHEREUM_TOKENS:()=>H,OPTIMISM_TOKENS:()=>v,SOLANA_TOKENS:()=>k,SafeBigNumber:()=>d,accountExplorerUrl:()=>qe,capitalize:()=>Le,chainColor:()=>de,chainDisplayName:()=>pe,chainIcon:()=>me,chainIdBySlug:()=>R,chainSlug:()=>Ae,chainToNamespace:()=>x,debounce:()=>Y,formatAge:()=>Ne,formatAgeInSeconds:()=>D,formatAmount:()=>ye,formatAmountUSD:()=>xe,formatAmountUSDCompact:()=>Be,formatPercent:()=>De,formatPrice:()=>Pe,formatPriceUSD:()=>Ue,formatSymbol:()=>we,formatTokenProtocolName:()=>Fe,getCommonTokenAddresses:()=>Ke,getCommonTokenSymbolsMap:()=>Ye,getNativeToken:()=>ve,getStablecoins:()=>$e,getWrappedToken:()=>Ve,groupBy:()=>q,httpDelete:()=>ge,httpGet:()=>Oe,httpMutate:()=>Re,httpPost:()=>Se,httpPut:()=>Ce,httpRequest:()=>p,intersectionBy:()=>G,isBinanceChain:()=>le,isEthereumChain:()=>ce,isSolanaChain:()=>ae,isValidEvmAddress:()=>P,isValidNumber:()=>m,isValidSolanaAddress:()=>U,isValidWalletAddress:()=>Te,keyBy:()=>Z,mapKeys:()=>z,mapValues:()=>X,parseTokenProtocolFamily:()=>_e,searchImageUrl:()=>ze,searchTwitterUrl:()=>Xe,throttle:()=>K,truncateAddress:()=>Me,twitterTweetUrl:()=>Je,twitterUserUrl:()=>je,txExplorerUrl:()=>Ze,uniqBy:()=>W});module.exports=oe(Qe);var e=require("@liberfi.io/types"),y=new Set([e.Chain.SOLANA,e.Chain.SOLANA_TESTNET,e.Chain.SOLANA_DEVNET]),se=new Set([e.Chain.ETHEREUM]),ie=new Set([e.Chain.BINANCE,e.Chain.BINANCE_TESTNET]);function x(t){return y.has(t)?e.ChainNamespace.SOLANA:e.ChainNamespace.EVM}function ae(t){return y.has(t)}function ce(t){return se.has(t)}function le(t){return ie.has(t)}var g={[e.Chain.ETHEREUM]:"ethereum",[e.Chain.UBIQ]:"ubiq",[e.Chain.OPTIMISM]:"optimism",[e.Chain.FLARE]:"flare",[e.Chain.SONGBIRD]:"songbird",[e.Chain.ELASTOS]:"elastos",[e.Chain.KARDIA]:"kardia",[e.Chain.CRONOS]:"cronos",[e.Chain.RSK]:"rsk",[e.Chain.TELOS]:"telos",[e.Chain.LUKSO]:"lukso",[e.Chain.CRAB]:"crab",[e.Chain.DARWINIA]:"darwinia",[e.Chain.XDC]:"xdc",[e.Chain.CSC]:"csc",[e.Chain.ZYX]:"zyx",[e.Chain.BINANCE]:"binance",[e.Chain.SYSCOIN]:"syscoin",[e.Chain.GOCHAIN]:"gochain",[e.Chain.ETHEREUMCLASSIC]:"ethereumclassic",[e.Chain.OKEXCHAIN]:"okexchain",[e.Chain.HOO]:"hoo",[e.Chain.METER]:"meter",[e.Chain.NOVA_NETWORK]:"nova network",[e.Chain.TOMOCHAIN]:"tomochain",[e.Chain.BITKUB]:"bitkub",[e.Chain.XDAI]:"xdai",[e.Chain.SOLANA]:"solana",[e.Chain.VELAS]:"velas",[e.Chain.THUNDERCORE]:"thundercore",[e.Chain.ENULS]:"enuls",[e.Chain.FUSE]:"fuse",[e.Chain.HECO]:"heco",[e.Chain.UNICHAIN]:"unichain",[e.Chain.POLYGON]:"polygon",[e.Chain.SONIC]:"sonic",[e.Chain.SHIMMER_EVM]:"shimmer_evm",[e.Chain.RBN]:"rbn",[e.Chain.OMNI]:"omni",[e.Chain.MANTA]:"manta",[e.Chain.HSK]:"hsk",[e.Chain.WATER]:"water",[e.Chain.XLAYER]:"xlayer",[e.Chain.XDAIARB]:"xdaiarb",[e.Chain.OP_BNB]:"op_bnb",[e.Chain.VINUCHAIN]:"vinuchain",[e.Chain.ENERGYWEB]:"energyweb",[e.Chain.OASYS]:"oasys",[e.Chain.FANTOM]:"fantom",[e.Chain.FRAXTAL]:"fraxtal",[e.Chain.HPB]:"hpb",[e.Chain.BOBA]:"boba",[e.Chain.OMAX]:"omax",[e.Chain.FILECOIN]:"filecoin",[e.Chain.KUCOIN]:"kucoin",[e.Chain.ZKSYNC_ERA]:"zksync era",[e.Chain.SHIDEN]:"shiden",[e.Chain.THETA]:"theta",[e.Chain.PULSE]:"pulse",[e.Chain.CRONOS_ZKEVM]:"cronos zkevm",[e.Chain.SX]:"sx",[e.Chain.AREON]:"areon",[e.Chain.WC]:"wc",[e.Chain.CANDLE]:"candle",[e.Chain.ROLLUX]:"rollux",[e.Chain.ASTAR]:"astar",[e.Chain.REDSTONE]:"redstone",[e.Chain.MATCHAIN]:"matchain",[e.Chain.CALLISTO]:"callisto",[e.Chain.TARA]:"tara",[e.Chain.WANCHAIN]:"wanchain",[e.Chain.LYRA_CHAIN]:"lyra chain",[e.Chain.BIFROST]:"bifrost",[e.Chain.CONFLUX]:"conflux",[e.Chain.METIS]:"metis",[e.Chain.DYMENSION]:"dymension",[e.Chain.POLYGON_ZKEVM]:"polygon zkevm",[e.Chain.CORE]:"core",[e.Chain.LISK]:"lisk",[e.Chain.ULTRON]:"ultron",[e.Chain.STEP]:"step",[e.Chain.MOONBEAM]:"moonbeam",[e.Chain.MOONRIVER]:"moonriver",[e.Chain.SEI]:"sei",[e.Chain.LIVING_ASSETS_MAINNET]:"living assets mainnet",[e.Chain.STY]:"sty",[e.Chain.TENET]:"tenet",[e.Chain.GRAVITY]:"gravity",[e.Chain.REYA_NETWORK]:"reya network",[e.Chain.SONEIUM]:"soneium",[e.Chain.SWELLCHAIN]:"swellchain",[e.Chain.ONUS]:"onus",[e.Chain.HUBBLENET]:"hubblenet",[e.Chain.SANKO]:"sanko",[e.Chain.DOGECHAIN]:"dogechain",[e.Chain.MILKOMEDA]:"milkomeda",[e.Chain.MILKOMEDA_A1]:"milkomeda_a1",[e.Chain.KAVA]:"kava",[e.Chain.SOMA]:"soma",[e.Chain.KARAK]:"karak",[e.Chain.ABSTRACT]:"abstract",[e.Chain.MORPH]:"morph",[e.Chain.CROSSFI]:"crossfi",[e.Chain.BEAM]:"beam",[e.Chain.IOTEX]:"iotex",[e.Chain.MANTLE]:"mantle",[e.Chain.XLC]:"xlc",[e.Chain.NAHMII]:"nahmii",[e.Chain.BOUNCEBIT]:"bouncebit",[e.Chain.TOMBCHAIN]:"tombchain",[e.Chain.ZETACHAIN]:"zetachain",[e.Chain.PLANQ]:"planq",[e.Chain.BITROCK]:"bitrock",[e.Chain.XSAT]:"xsat",[e.Chain.CYETH]:"cyeth",[e.Chain.CANTO]:"canto",[e.Chain.KLAYTN]:"klaytn",[e.Chain.THAT]:"that",[e.Chain.BASE]:"base",[e.Chain.HELA]:"hela",[e.Chain.IOTAEVM]:"iotaevm",[e.Chain.JBC]:"jbc",[e.Chain.EVMOS]:"evmos",[e.Chain.CARBON]:"carbon",[e.Chain.SMARTBCH]:"smartbch",[e.Chain.ARTELA]:"artela",[e.Chain.IMMUTABLE_ZKEVM]:"immutable zkevm",[e.Chain.LOOP]:"loop",[e.Chain.GENESYS]:"genesys",[e.Chain.EOS_EVM]:"eos evm",[e.Chain.MAP_PROTOCOL]:"map protocol",[e.Chain.SAPPHIRE]:"sapphire",[e.Chain.BITGERT]:"bitgert",[e.Chain.FUSION]:"fusion",[e.Chain.ZILLIQA]:"zilliqa",[e.Chain.APECHAIN]:"apechain",[e.Chain.EDU_CHAIN]:"edu chain",[e.Chain.ARBITRUM]:"arbitrum",[e.Chain.ARBITRUM_NOVA]:"arbitrum nova",[e.Chain.CELO]:"celo",[e.Chain.OASIS]:"oasis",[e.Chain.ASSETCHAIN]:"assetchain",[e.Chain.ETHERLINK]:"etherlink",[e.Chain.AVALANCHE]:"avalanche",[e.Chain.REI]:"rei",[e.Chain.ZIRCUIT]:"zircuit",[e.Chain.SOPHON]:"sophon",[e.Chain.ETN]:"etn",[e.Chain.SUPERPOSITION]:"superposition",[e.Chain.REICHAIN]:"reichain",[e.Chain.BOBA_BNB]:"boba_bnb",[e.Chain.INK]:"ink",[e.Chain.LINEA]:"linea",[e.Chain.BOB]:"bob",[e.Chain.GODWOKEN]:"godwoken",[e.Chain.BERACHAIN]:"berachain",[e.Chain.BLAST]:"blast",[e.Chain.CHILIZ]:"chiliz",[e.Chain.STRATIS]:"stratis",[e.Chain.REAL]:"real",[e.Chain.ODYSSEY]:"odyssey",[e.Chain.TAIKO]:"taiko",[e.Chain.BITLAYER]:"bitlayer",[e.Chain.HYDRATION]:"hydration",[e.Chain.PAREX]:"parex",[e.Chain.POLIS]:"polis",[e.Chain.KEKCHAIN]:"kekchain",[e.Chain.SCROLL]:"scroll",[e.Chain.ZERO_NETWORK]:"zero_network",[e.Chain.ZKLINK_NOVA]:"zklink nova",[e.Chain.VISION]:"vision",[e.Chain.SAAKURU]:"saakuru",[e.Chain.ZORA]:"zora",[e.Chain.CORN]:"corn",[e.Chain.NEON]:"neon",[e.Chain.LUMIA]:"lumia",[e.Chain.AURORA]:"aurora",[e.Chain.HARMONY]:"harmony",[e.Chain.PALM]:"palm",[e.Chain.ZENIQ]:"zeniq",[e.Chain.CURIO]:"curio",[e.Chain.MODE]:"mode"},B={[e.Chain.SOLANA]:"sol",[e.Chain.ETHEREUM]:"eth",[e.Chain.BINANCE]:"bsc",[e.Chain.ARBITRUM]:"arb",[e.Chain.OPTIMISM]:"opt",[e.Chain.AVALANCHE]:"avax"},ue={[e.Chain.SOLANA]:"#9945FF",[e.Chain.ETHEREUM]:"#627EEA",[e.Chain.BINANCE]:"#F0B90B",[e.Chain.ARBITRUM]:"#28A0F0",[e.Chain.OPTIMISM]:"#FF0420",[e.Chain.AVALANCHE]:"#E84142",[e.Chain.POLYGON]:"#8247E5",[e.Chain.BASE]:"#0052FF",[e.Chain.SONIC]:"#5B6EF5",[e.Chain.LINEA]:"#61DFFF",[e.Chain.SCROLL]:"#FFEEDA",[e.Chain.BLAST]:"#FCFC03",[e.Chain.CRONOS]:"#002D74",[e.Chain.BERACHAIN]:"#964B00"};function de(t){return ue[t]}function me(t){let r=R(t)??t,n=g[r];return n?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(n)}.jpg`:void 0}function Ae(t){return g[t]}function pe(t){let r=B[t];if(r)return r.toUpperCase();let n=g[t];return n?n.replace(/\b\w/g,o=>o.toUpperCase()):t}var C=new Map;for(let[t,r]of Object.entries(B))r&&C.set(r.toLowerCase(),t);for(let[t,r]of Object.entries(g)){let n=r?.toLowerCase();n&&!C.has(n)&&C.set(n,t)}function R(t){return C.get(t.toLowerCase())}function Te(t,r){let n=R(t)??t;switch(x(n)){case e.ChainNamespace.SOLANA:return U(r);case e.ChainNamespace.EVM:return P(r);default:throw new Error(`Unsupported chain: ${t}`)}}var fe=/^0x[0-9a-fA-F]{40}$/;function P(t){return fe.test(t)}var Ee=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function U(t){return Ee.test(t)}var f=class extends Error{constructor(n,o){super(n);this.code=o;this.name="ApiError"}};var he={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function D(t,r={}){let n={...he,...r};return t<10?n.justNow:t<60?n.secondsAgo.replace("{n}",String(t)):t<3600?n.minutesAgo.replace("{n}",String(Math.floor(t/60))):t<86400?n.hoursAgo.replace("{n}",String(Math.floor(t/3600))):t<31536e3?n.daysAgo.replace("{n}",String(Math.floor(t/86400))):n.yearsAgo.replace("{n}",String(Math.floor(t/31536e3)))}function Ne(t,r={}){return D(Math.floor(t/1e3),r)}async function p(t,r){if(!t.startsWith("http"))throw new Error("url must start with http(s)");let n=await fetch(t,{...r,headers:be(r.headers,r.method)});if(n.ok)return await n.json();try{let o=await n.json();throw n.status===400?new f(o.message||o.code||n.statusText,o.code):new Error(o.message||o.code||n.statusText)}catch(o){throw o}}function be(t={},r){let n=new Headers(t);return n.has("Content-Type")||(r!=="DELETE"?n.append("Content-Type","application/json;charset=utf-8"):n.append("Content-Type","application/x-www-form-urlencoded")),n}async function Oe(t,r){return await p(t,{method:"GET",...r})}async function Se(t,r,n){return await p(t,{method:"POST",body:JSON.stringify(r),...n})}async function Ce(t,r,n){return await p(t,{method:"PUT",body:JSON.stringify(r),...n})}async function ge(t,r){return await p(t,{method:"DELETE",...r})}async function Re(t,r){return await p(t,r)}var c=re(require("bignumber.js")),d=class extends c.default{constructor(r,n){try{super(r??0,n)}catch(o){console.error("SafeBigNumber constructor error",o),super(0,n)}}},m=t=>{if(typeof t=="number"&&!isNaN(t)||t instanceof d||t instanceof c.default)return!0;if(typeof t!="string")return!1;let r=Number.parseFloat(t);return!isNaN(r)},Ie=["\u2080","\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089","\u2081\u2080","\u2081\u2081","\u2081\u2082","\u2081\u2083","\u2081\u2084","\u2081\u2085","\u2081\u2086","\u2081\u2087","\u2081\u2088","\u2081\u2089","\u2082\u2080","\u2082\u2081","\u2082\u2082","\u2082\u2083","\u2082\u2084","\u2082\u2085","\u2082\u2086","\u2082\u2087","\u2082\u2088","\u2082\u2089","\u2083\u2080","\u2083\u2081","\u2083\u2082","\u2083\u2083","\u2083\u2084","\u2083\u2085","\u2083\u2086","\u2083\u2087","\u2083\u2088","\u2083\u2089","\u2084\u2080"],l=(t,r=0,n=c.default.ROUND_DOWN)=>{let s=new d(t).decimalPlaces(r,n).toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),s.join(".")},E=(t,r=1)=>{let n=new d(t);return n.lt(1e3)?n.toNumber():n.lt(1e6)?`${l(n.div(1e3),r)}K`:n.lt(1e9)?`${l(n.div(1e6),r)}M`:n.lt(1e12)?`${l(n.dividedBy(1e9),r)}B`:`${l(n.dividedBy(1e12),r)}T`},M=(t,r=5)=>{let n=new d(t);if(n.eq(0))return"0";let[o,s]=n.toFixed().split("."),i=s.split(""),u=i.findIndex(O=>O!=="0"),b=Math.min(i.length-u,r);return`${l(o)}.0`.concat(Ie[u]).concat(i.slice(u,u+b).join("").replace(/\.?0+$/,""))},w=(t,r)=>{let n=t.toString().match(/\.0*/),o=(n?n[0].length-1:0)+r;return l(t,o)},L=(t,r)=>`${t.times(100).decimalPlaces(r,c.default.ROUND_HALF_UP).toString()}%`,ye=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new d(t),o=n.lt(0),s=n.abs(),i=s.lt(.001)?s.decimalPlaces(5,c.default.ROUND_DOWN).toString():s.lt(1)?s.decimalPlaces(3,c.default.ROUND_DOWN).toString():s.lt(100)?s.decimalPlaces(2,c.default.ROUND_DOWN).toString():s.lt(1e5)?l(s,2):E(s);return Number(i)===0?`${i}`:o?`-${i}`:r?.showPlusGtThanZero?`+${i}`:`${i}`},xe=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new d(t),o=n.lt(0),s=n.abs(),i=s.lt(.001)?"$0":s.lt(1)?`$${s.decimalPlaces(3,c.default.ROUND_DOWN)}`:s.lt(100)?`$${s.decimalPlaces(2,c.default.ROUND_DOWN)}`:s.lt(1e4)?`$${l(s,2)}`:`$${E(s)}`;return i==="$0"?i:o?`-${i}`:r?.showPlusGtThanZero?`+${i}`:i},Be=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new d(t),o=n.lt(0),s=n.abs(),i=s.div(100).integerValue(c.default.ROUND_DOWN).times(100),u=s.lt(1e-4)||s.lt(.001)?"$0":s.lt(1)?`$${s.decimalPlaces(3,c.default.ROUND_DOWN)}`:s.lt(100)?`$${s.decimalPlaces(2,c.default.ROUND_DOWN)}`:s.lt(1e3)?`$${s.decimalPlaces(0,c.default.ROUND_DOWN)}`:`$${E(i,0)}`;return u==="$0"?u:o?`-${u}`:r?.showPlusGtThanZero?`+${u}`:u},Pe=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new d(t);if(n.lt(0))return"--";let o=n.abs(),{isHighPrecise:s}=r;return`${o.lt(1e-4)?M(o,s?4:2):o.lt(1)?s?l(o,4):w(o,2):o.lt(100)||o.lt(1e4)?l(o,s?4:2):o.lt(1e5)?l(o,2):E(o)}`},Ue=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new d(t);if(n.lt(0))return"--";let o=n.abs(),{isHighPrecise:s}=r;return`$${o.lt(1e-4)?M(o,s?4:2):o.lt(1)?s?l(o,4):w(o,2):o.lt(100)||o.lt(1e4)?l(o,s?4:2):o.lt(1e5)?l(o,2):E(o)}`},De=(t="",r={})=>{if(!m(t))return"-- %";let n=new d(t),o=n.lt(0),s=n.abs(),i=o?"-":r?.showPlusGtThanZero?"+":"";return s.lt(1e-4)?"0%":s.lt(100)?`${i}${L(s,r?.precision??2)}`:s.lt(1e3)?`${i}${L(s,r?.precision??1)}`:`${i}> 99,999%`};function Le(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Me(t,r=6,n=4){return t.slice(0,r)+"..."+t.slice(-n)}function we(t,r="base-type"){if(!t)return"";let n=t.split("_"),o=n[0],s=n[1],i=n[2];return r.replace("type",o).replace("base",s).replace("quote",i)}var h=require("@liberfi.io/types"),ke=new Set(h.SOLANA_TOKEN_PROTOCOLS),He=[...h.SOLANA_TOKEN_PROTOCOLS].sort((t,r)=>r.length-t.length),_e=(t,r)=>{if(t!==h.Chain.SOLANA)return;let n=r.toLowerCase();return ke.has(n)?n:He.find(o=>n.includes(o))},Fe=t=>t.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ");var A=require("@liberfi.io/types"),N="0x0000000000000000000000000000000000000000",k={native:{address:"11111111111111111111111111111111",symbol:"SOL",decimals:9},wrapped:{address:"So11111111111111111111111111111111111111112",symbol:"SOL",decimals:9},stablecoins:{USDC:{address:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",symbol:"USDC",decimals:6},USDT:{address:"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",symbol:"USDT",decimals:6},USD1:{address:"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB",symbol:"USD1",decimals:6}}},H={native:{address:N,symbol:"ETH",decimals:18},wrapped:{address:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",symbol:"USDC",decimals:6},USDT:{address:"0xdAC17F958D2ee523a2206206994597C13D831ec7",symbol:"USDT",decimals:6}}},_={native:{address:N,symbol:"BNB",decimals:18},wrapped:{address:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",symbol:"WBNB",decimals:18},stablecoins:{USDC:{address:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",symbol:"USDC",decimals:18},USDT:{address:"0x55d398326f99059fF775485246999027B3197955",symbol:"USDT",decimals:18}}},F={native:{address:N,symbol:"ETH",decimals:18},wrapped:{address:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",symbol:"USDC",decimals:6},USDT:{address:"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",symbol:"USDT",decimals:6}}},v={native:{address:N,symbol:"ETH",decimals:18},wrapped:{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",symbol:"USDC",decimals:6},USDT:{address:"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58",symbol:"USDT",decimals:6}}},V={native:{address:N,symbol:"AVAX",decimals:18},wrapped:{address:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",symbol:"WAVAX",decimals:18},stablecoins:{USDC:{address:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",symbol:"USDC",decimals:6},USDT:{address:"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",symbol:"USDT",decimals:6}}},T={[A.Chain.SOLANA]:k,[A.Chain.ETHEREUM]:H,[A.Chain.BINANCE]:_,[A.Chain.ARBITRUM]:F,[A.Chain.OPTIMISM]:v,[A.Chain.AVALANCHE]:V};function ve(t){return T[t]?.native}function Ve(t){return T[t]?.wrapped}function $e(t){return T[t]?.stablecoins}function Ke(t){let r=T[t];return r?[r.native.address,r.wrapped.address,...Object.values(r.stablecoins).map(n=>n.address)]:[]}function Ye(t){let r=T[t];if(!r)return{};let n={[r.native.address]:r.native.symbol,[r.wrapped.address]:r.wrapped.symbol};for(let o of Object.values(r.stablecoins))n[o.address]=o.symbol;return n}var a=require("@liberfi.io/types"),We={[a.Chain.SOLANA]:"https://solscan.io/tx/",[a.Chain.ETHEREUM]:"https://etherscan.io/tx/",[a.Chain.POLYGON]:"https://polygonscan.com/tx/",[a.Chain.BINANCE]:"https://bscscan.com/tx/",[a.Chain.BINANCE_TESTNET]:"https://testnet.bscscan.com/tx/",[a.Chain.AVALANCHE]:"https://snowtrace.io/tx/",[a.Chain.BASE]:"https://basescan.org/tx/",[a.Chain.BLAST]:"https://blastracker.xyz/tx/",[a.Chain.ARBITRUM]:"https://arbiscan.io/tx/",[a.Chain.ARBITRUM_NOVA]:"https://nova.arbiscan.io/tx/",[a.Chain.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/tx/",[a.Chain.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/tx/"},Ge={[a.Chain.SOLANA]:"https://solscan.io/account/",[a.Chain.ETHEREUM]:"https://etherscan.io/address/",[a.Chain.POLYGON]:"https://polygonscan.com/address/",[a.Chain.BINANCE]:"https://bscscan.com/address/",[a.Chain.BINANCE_TESTNET]:"https://testnet.bscscan.com/address/",[a.Chain.AVALANCHE]:"https://snowtrace.io/address/",[a.Chain.BASE]:"https://basescan.org/address/",[a.Chain.BLAST]:"https://blastracker.xyz/address/",[a.Chain.ARBITRUM]:"https://arbiscan.io/address/",[a.Chain.ARBITRUM_NOVA]:"https://nova.arbiscan.io/address/",[a.Chain.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/address/",[a.Chain.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/address/"};function $(t,r,n){let o=t[r];return o?`${o}${n}`:void 0}function Ze(t,r){return $(We,t,r)}function qe(t,r){return $(Ge,t,r)}function ze(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function Xe(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function je(t){return`https://x.com/${t}`}function Je(t){return`https://x.com/i/status/${t}`}function K(t,r){let n=0,o=null,s=null;return(...u)=>{let b=Date.now(),O=r-(b-n);O<=0?(o!==null&&(clearTimeout(o),o=null),n=b,t(...u)):(s=u,o===null&&(o=setTimeout(()=>{n=Date.now(),o=null,s&&(t(...s),s=null)},O)))}}function Y(t,r){let n=null,o=(...s)=>{n!==null&&clearTimeout(n),n=setTimeout(()=>{n=null,t(...s)},r)};return o.cancel=()=>{n!==null&&(clearTimeout(n),n=null)},o}function W(t,r){let n=new Set,o=typeof r=="function"?r:s=>s[r];return t.filter(s=>{let i=o(s);return n.has(i)?!1:(n.add(i),!0)})}function G(t,r,n){let o=typeof n=="function"?n:i=>i[n],s=new Set(r.map(o));return t.filter(i=>s.has(o(i)))}function Z(t,r){let n=typeof r=="function"?r:s=>String(s[r]),o={};for(let s of t)o[n(s)]=s;return o}function q(t,r){let n=typeof r=="function"?r:s=>String(s[r]),o={};for(let s of t){let i=n(s);(o[i]??=[]).push(s)}return o}function z(t,r){let n={};for(let o of Object.keys(t))n[r(t[o],o)]=t[o];return n}function X(t,r){let n={};for(let o of Object.keys(t))n[o]=r(t[o],o);return n}0&&(module.exports={ARBITRUM_TOKENS,AVALANCHE_TOKENS,ApiError,BSC_TOKENS,CHAIN_TOKENS,ETHEREUM_TOKENS,OPTIMISM_TOKENS,SOLANA_TOKENS,SafeBigNumber,accountExplorerUrl,capitalize,chainColor,chainDisplayName,chainIcon,chainIdBySlug,chainSlug,chainToNamespace,debounce,formatAge,formatAgeInSeconds,formatAmount,formatAmountUSD,formatAmountUSDCompact,formatPercent,formatPrice,formatPriceUSD,formatSymbol,formatTokenProtocolName,getCommonTokenAddresses,getCommonTokenSymbolsMap,getNativeToken,getStablecoins,getWrappedToken,groupBy,httpDelete,httpGet,httpMutate,httpPost,httpPut,httpRequest,intersectionBy,isBinanceChain,isEthereumChain,isSolanaChain,isValidEvmAddress,isValidNumber,isValidSolanaAddress,isValidWalletAddress,keyBy,mapKeys,mapValues,parseTokenProtocolFamily,searchImageUrl,searchTwitterUrl,throttle,truncateAddress,twitterTweetUrl,twitterUserUrl,txExplorerUrl,uniqBy});
1
+ "use strict";var J=Object.create;var R=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty;var se=(e,n)=>{for(var s in n)R(e,s,{get:n[s],enumerable:!0})},y=(e,n,s,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of ee(n))!ne.call(e,o)&&o!==s&&R(e,o,{get:()=>n[o],enumerable:!(r=Q(n,o))||r.enumerable});return e};var re=(e,n,s)=>(s=e!=null?J(te(e)):{},y(n||!e||!e.__esModule?R(s,"default",{value:e,enumerable:!0}):s,e)),oe=e=>y(R({},"__esModule",{value:!0}),e);var ut={};se(ut,{ARBITRUM_TOKENS:()=>v,AVALANCHE_TOKENS:()=>$,ApiError:()=>E,BSC_TOKENS:()=>H,CHAIN_REGISTRY:()=>m,CHAIN_TOKENS:()=>h,ETHEREUM_TOKENS:()=>F,OPTIMISM_TOKENS:()=>V,SOLANA_TOKENS:()=>_,SafeBigNumber:()=>g,accountExplorerUrl:()=>st,capitalize:()=>Ve,chainColor:()=>ge,chainDisplayName:()=>pe,chainIcon:()=>me,chainIdBySlug:()=>I,chainSlug:()=>de,chainToNamespace:()=>P,debounce:()=>Y,formatAge:()=>Ne,formatAgeInSeconds:()=>w,formatAmount:()=>we,formatAmountUSD:()=>ke,formatAmountUSDCompact:()=>_e,formatPercent:()=>ve,formatPrice:()=>Fe,formatPriceUSD:()=>He,formatSymbol:()=>Ge,formatTokenProtocolName:()=>ze,getCommonTokenAddresses:()=>Je,getCommonTokenSymbolsMap:()=>Qe,getNativeToken:()=>qe,getStablecoins:()=>je,getWrappedToken:()=>Xe,groupBy:()=>q,httpDelete:()=>Ie,httpGet:()=>Re,httpMutate:()=>xe,httpPost:()=>Oe,httpPut:()=>Ce,httpRequest:()=>f,intersectionBy:()=>Z,isBinanceChain:()=>ce,isEthereumChain:()=>le,isSolanaChain:()=>ue,isValidEvmAddress:()=>U,isValidNumber:()=>N,isValidSolanaAddress:()=>D,isValidWalletAddress:()=>Ae,keyBy:()=>z,mapKeys:()=>X,mapValues:()=>j,parseTokenProtocolFamily:()=>Ze,searchImageUrl:()=>rt,searchTwitterUrl:()=>ot,throttle:()=>G,truncateAddress:()=>$e,twitterTweetUrl:()=>at,twitterUserUrl:()=>it,txExplorerUrl:()=>nt,uniqBy:()=>W});module.exports=oe(ut);var t=require("@liberfi.io/types"),B=new Set([t.Chain.SOLANA,t.Chain.SOLANA_TESTNET,t.Chain.SOLANA_DEVNET]),ie=new Set([t.Chain.ETHEREUM]),ae=new Set([t.Chain.BINANCE,t.Chain.BINANCE_TESTNET]);function P(e){return B.has(e)?t.ChainNamespace.SOLANA:t.ChainNamespace.EVM}function ue(e){return B.has(e)}function le(e){return ie.has(e)}function ce(e){return ae.has(e)}var m={[t.Chain.ETHEREUM]:{slug:"ethereum",abbr:"eth",color:"#627EEA"},[t.Chain.UBIQ]:{slug:"ubiq"},[t.Chain.OPTIMISM]:{slug:"optimism",abbr:"opt",color:"#FF0420"},[t.Chain.FLARE]:{slug:"flare"},[t.Chain.SONGBIRD]:{slug:"songbird"},[t.Chain.ELASTOS]:{slug:"elastos"},[t.Chain.KARDIA]:{slug:"kardia"},[t.Chain.CRONOS]:{slug:"cronos",color:"#002D74"},[t.Chain.RSK]:{slug:"rsk"},[t.Chain.TELOS]:{slug:"telos"},[t.Chain.LUKSO]:{slug:"lukso"},[t.Chain.CRAB]:{slug:"crab"},[t.Chain.DARWINIA]:{slug:"darwinia"},[t.Chain.XDC]:{slug:"xdc"},[t.Chain.CSC]:{slug:"csc"},[t.Chain.ZYX]:{slug:"zyx"},[t.Chain.BINANCE]:{slug:"binance",abbr:"bsc",color:"#F0B90B"},[t.Chain.SYSCOIN]:{slug:"syscoin"},[t.Chain.GOCHAIN]:{slug:"gochain"},[t.Chain.ETHEREUMCLASSIC]:{slug:"ethereumclassic"},[t.Chain.OKEXCHAIN]:{slug:"okexchain"},[t.Chain.HOO]:{slug:"hoo"},[t.Chain.METER]:{slug:"meter"},[t.Chain.NOVA_NETWORK]:{slug:"nova network"},[t.Chain.TOMOCHAIN]:{slug:"tomochain"},[t.Chain.BITKUB]:{slug:"bitkub"},[t.Chain.XDAI]:{slug:"xdai"},[t.Chain.SOLANA]:{slug:"solana",abbr:"sol",color:"#9945FF"},[t.Chain.VELAS]:{slug:"velas"},[t.Chain.THUNDERCORE]:{slug:"thundercore"},[t.Chain.ENULS]:{slug:"enuls"},[t.Chain.FUSE]:{slug:"fuse"},[t.Chain.HECO]:{slug:"heco"},[t.Chain.UNICHAIN]:{slug:"unichain"},[t.Chain.POLYGON]:{slug:"polygon",color:"#8247E5"},[t.Chain.SONIC]:{slug:"sonic",color:"#5B6EF5"},[t.Chain.SHIMMER_EVM]:{slug:"shimmer_evm"},[t.Chain.RBN]:{slug:"rbn"},[t.Chain.OMNI]:{slug:"omni"},[t.Chain.MANTA]:{slug:"manta"},[t.Chain.HSK]:{slug:"hsk"},[t.Chain.WATER]:{slug:"water"},[t.Chain.XLAYER]:{slug:"xlayer"},[t.Chain.XDAIARB]:{slug:"xdaiarb"},[t.Chain.OP_BNB]:{slug:"op_bnb"},[t.Chain.VINUCHAIN]:{slug:"vinuchain"},[t.Chain.ENERGYWEB]:{slug:"energyweb"},[t.Chain.OASYS]:{slug:"oasys"},[t.Chain.FANTOM]:{slug:"fantom"},[t.Chain.FRAXTAL]:{slug:"fraxtal"},[t.Chain.HPB]:{slug:"hpb"},[t.Chain.BOBA]:{slug:"boba"},[t.Chain.OMAX]:{slug:"omax"},[t.Chain.FILECOIN]:{slug:"filecoin"},[t.Chain.KUCOIN]:{slug:"kucoin"},[t.Chain.ZKSYNC_ERA]:{slug:"zksync era"},[t.Chain.SHIDEN]:{slug:"shiden"},[t.Chain.THETA]:{slug:"theta"},[t.Chain.PULSE]:{slug:"pulse"},[t.Chain.CRONOS_ZKEVM]:{slug:"cronos zkevm"},[t.Chain.SX]:{slug:"sx"},[t.Chain.AREON]:{slug:"areon"},[t.Chain.WC]:{slug:"wc"},[t.Chain.CANDLE]:{slug:"candle"},[t.Chain.ROLLUX]:{slug:"rollux"},[t.Chain.ASTAR]:{slug:"astar"},[t.Chain.REDSTONE]:{slug:"redstone"},[t.Chain.MATCHAIN]:{slug:"matchain"},[t.Chain.CALLISTO]:{slug:"callisto"},[t.Chain.TARA]:{slug:"tara"},[t.Chain.WANCHAIN]:{slug:"wanchain"},[t.Chain.LYRA_CHAIN]:{slug:"lyra chain"},[t.Chain.BIFROST]:{slug:"bifrost"},[t.Chain.CONFLUX]:{slug:"conflux"},[t.Chain.METIS]:{slug:"metis"},[t.Chain.DYMENSION]:{slug:"dymension"},[t.Chain.POLYGON_ZKEVM]:{slug:"polygon zkevm"},[t.Chain.CORE]:{slug:"core"},[t.Chain.LISK]:{slug:"lisk"},[t.Chain.ULTRON]:{slug:"ultron"},[t.Chain.STEP]:{slug:"step"},[t.Chain.MOONBEAM]:{slug:"moonbeam"},[t.Chain.MOONRIVER]:{slug:"moonriver"},[t.Chain.SEI]:{slug:"sei"},[t.Chain.LIVING_ASSETS_MAINNET]:{slug:"living assets mainnet"},[t.Chain.STY]:{slug:"sty"},[t.Chain.TENET]:{slug:"tenet"},[t.Chain.GRAVITY]:{slug:"gravity"},[t.Chain.REYA_NETWORK]:{slug:"reya network"},[t.Chain.SONEIUM]:{slug:"soneium"},[t.Chain.SWELLCHAIN]:{slug:"swellchain"},[t.Chain.ONUS]:{slug:"onus"},[t.Chain.HUBBLENET]:{slug:"hubblenet"},[t.Chain.SANKO]:{slug:"sanko"},[t.Chain.DOGECHAIN]:{slug:"dogechain"},[t.Chain.MILKOMEDA]:{slug:"milkomeda"},[t.Chain.MILKOMEDA_A1]:{slug:"milkomeda_a1"},[t.Chain.KAVA]:{slug:"kava"},[t.Chain.SOMA]:{slug:"soma"},[t.Chain.KARAK]:{slug:"karak"},[t.Chain.ABSTRACT]:{slug:"abstract"},[t.Chain.MORPH]:{slug:"morph"},[t.Chain.CROSSFI]:{slug:"crossfi"},[t.Chain.BEAM]:{slug:"beam"},[t.Chain.IOTEX]:{slug:"iotex"},[t.Chain.MANTLE]:{slug:"mantle"},[t.Chain.XLC]:{slug:"xlc"},[t.Chain.NAHMII]:{slug:"nahmii"},[t.Chain.BOUNCEBIT]:{slug:"bouncebit"},[t.Chain.TOMBCHAIN]:{slug:"tombchain"},[t.Chain.ZETACHAIN]:{slug:"zetachain"},[t.Chain.PLANQ]:{slug:"planq"},[t.Chain.BITROCK]:{slug:"bitrock"},[t.Chain.XSAT]:{slug:"xsat"},[t.Chain.CYETH]:{slug:"cyeth"},[t.Chain.CANTO]:{slug:"canto"},[t.Chain.KLAYTN]:{slug:"klaytn"},[t.Chain.THAT]:{slug:"that"},[t.Chain.BASE]:{slug:"base",color:"#0052FF"},[t.Chain.HELA]:{slug:"hela"},[t.Chain.IOTAEVM]:{slug:"iotaevm"},[t.Chain.JBC]:{slug:"jbc"},[t.Chain.EVMOS]:{slug:"evmos"},[t.Chain.CARBON]:{slug:"carbon"},[t.Chain.SMARTBCH]:{slug:"smartbch"},[t.Chain.ARTELA]:{slug:"artela"},[t.Chain.IMMUTABLE_ZKEVM]:{slug:"immutable zkevm"},[t.Chain.LOOP]:{slug:"loop"},[t.Chain.GENESYS]:{slug:"genesys"},[t.Chain.EOS_EVM]:{slug:"eos evm"},[t.Chain.MAP_PROTOCOL]:{slug:"map protocol"},[t.Chain.SAPPHIRE]:{slug:"sapphire"},[t.Chain.BITGERT]:{slug:"bitgert"},[t.Chain.FUSION]:{slug:"fusion"},[t.Chain.ZILLIQA]:{slug:"zilliqa"},[t.Chain.APECHAIN]:{slug:"apechain"},[t.Chain.EDU_CHAIN]:{slug:"edu chain"},[t.Chain.ARBITRUM]:{slug:"arbitrum",abbr:"arb",color:"#28A0F0"},[t.Chain.ARBITRUM_NOVA]:{slug:"arbitrum nova"},[t.Chain.CELO]:{slug:"celo"},[t.Chain.OASIS]:{slug:"oasis"},[t.Chain.ASSETCHAIN]:{slug:"assetchain"},[t.Chain.ETHERLINK]:{slug:"etherlink"},[t.Chain.AVALANCHE]:{slug:"avalanche",abbr:"avax",color:"#E84142"},[t.Chain.REI]:{slug:"rei"},[t.Chain.ZIRCUIT]:{slug:"zircuit"},[t.Chain.SOPHON]:{slug:"sophon"},[t.Chain.ETN]:{slug:"etn"},[t.Chain.SUPERPOSITION]:{slug:"superposition"},[t.Chain.REICHAIN]:{slug:"reichain"},[t.Chain.BOBA_BNB]:{slug:"boba_bnb"},[t.Chain.INK]:{slug:"ink"},[t.Chain.LINEA]:{slug:"linea",color:"#61DFFF"},[t.Chain.BOB]:{slug:"bob"},[t.Chain.GODWOKEN]:{slug:"godwoken"},[t.Chain.BERACHAIN]:{slug:"berachain",color:"#964B00"},[t.Chain.BLAST]:{slug:"blast",color:"#FCFC03"},[t.Chain.CHILIZ]:{slug:"chiliz"},[t.Chain.STRATIS]:{slug:"stratis"},[t.Chain.REAL]:{slug:"real"},[t.Chain.ODYSSEY]:{slug:"odyssey"},[t.Chain.TAIKO]:{slug:"taiko"},[t.Chain.BITLAYER]:{slug:"bitlayer"},[t.Chain.HYDRATION]:{slug:"hydration"},[t.Chain.PAREX]:{slug:"parex"},[t.Chain.POLIS]:{slug:"polis"},[t.Chain.KEKCHAIN]:{slug:"kekchain"},[t.Chain.SCROLL]:{slug:"scroll",color:"#FFEEDA"},[t.Chain.ZERO_NETWORK]:{slug:"zero_network"},[t.Chain.ZKLINK_NOVA]:{slug:"zklink nova"},[t.Chain.VISION]:{slug:"vision"},[t.Chain.SAAKURU]:{slug:"saakuru"},[t.Chain.ZORA]:{slug:"zora"},[t.Chain.CORN]:{slug:"corn"},[t.Chain.NEON]:{slug:"neon"},[t.Chain.LUMIA]:{slug:"lumia"},[t.Chain.AURORA]:{slug:"aurora"},[t.Chain.HARMONY]:{slug:"harmony"},[t.Chain.PALM]:{slug:"palm"},[t.Chain.ZENIQ]:{slug:"zeniq"},[t.Chain.CURIO]:{slug:"curio"},[t.Chain.MODE]:{slug:"mode"}};function ge(e){return m[e]?.color}function de(e){return m[e]?.slug}function me(e){let n=I(e)??e,s=m[n]?.slug;return s?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(s)}.jpg`:void 0}function pe(e){let n=m[e];return n?n.abbr?n.abbr.toUpperCase():n.slug.replace(/\b\w/g,s=>s.toUpperCase()):e}var Te=(()=>{let e=new Map;for(let[n,s]of Object.entries(m))s?.abbr&&e.set(s.abbr.toLowerCase(),n);for(let[n,s]of Object.entries(m)){let r=s?.slug.toLowerCase();r&&!e.has(r)&&e.set(r,n)}return e})();function I(e){return Te.get(e.toLowerCase())}function Ae(e,n){let s=I(e)??e;switch(P(s)){case t.ChainNamespace.SOLANA:return D(n);case t.ChainNamespace.EVM:return U(n);default:throw new Error(`Unsupported chain: ${e}`)}}var fe=/^0x[0-9a-fA-F]{40}$/;function U(e){return fe.test(e)}var he=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function D(e){return he.test(e)}var E=class extends Error{constructor(s,r,o,a){super(s);this.code=r;this.status=o;this.data=a;this.name="ApiError"}};var Ee={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function w(e,n={}){let s={...Ee,...n};return e<10?s.justNow:e<60?s.secondsAgo.replace("{n}",String(e)):e<3600?s.minutesAgo.replace("{n}",String(Math.floor(e/60))):e<86400?s.hoursAgo.replace("{n}",String(Math.floor(e/3600))):e<31536e3?s.daysAgo.replace("{n}",String(Math.floor(e/86400))):s.yearsAgo.replace("{n}",String(Math.floor(e/31536e3)))}function Ne(e,n={}){return w(Math.floor(e/1e3),n)}async function be(e){let n=await e.text().catch(()=>"");if(n)try{return JSON.parse(n)}catch{return}}async function f(e,n){if(!e.startsWith("http"))throw new Error("url must start with http(s)");let s=await fetch(e,{...n,headers:Se(n.headers,n.method)});if(s.ok)return await s.json();let r=await be(s),o=r?.message??(r?.code!==void 0?String(r.code):void 0)??s.statusText;throw s.status===400?new E(o,r?.code??s.status,s.status,r):new Error(o)}function Se(e={},n){let s=new Headers(e);return s.has("Content-Type")||(n!=="DELETE"?s.append("Content-Type","application/json;charset=utf-8"):s.append("Content-Type","application/x-www-form-urlencoded")),s}async function Re(e,n){return await f(e,{method:"GET",...n})}async function Oe(e,n,s){return await f(e,{method:"POST",body:JSON.stringify(n),...s})}async function Ce(e,n,s){return await f(e,{method:"PUT",body:JSON.stringify(n),...s})}async function Ie(e,n){return await f(e,{method:"DELETE",...n})}async function xe(e,n){return await f(e,n)}var l=re(require("bignumber.js")),g=class extends l.default{constructor(n,s){try{if(super(n??0,s),this.isNaN())return new l.default(0,s)}catch(r){console.error("SafeBigNumber constructor error",r),super(0,s)}}},ye=/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i,N=e=>{if(typeof e=="number")return Number.isFinite(e);if(e instanceof g||e instanceof l.default)return!e.isNaN()&&e.isFinite();if(typeof e!="string")return!1;let n=e.trim();return n===""||!ye.test(n)?!1:Number.isFinite(Number(n))},k=["\u2080","\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089","\u2081\u2080","\u2081\u2081","\u2081\u2082","\u2081\u2083","\u2081\u2084","\u2081\u2085","\u2081\u2086","\u2081\u2087","\u2081\u2088","\u2081\u2089","\u2082\u2080","\u2082\u2081","\u2082\u2082","\u2082\u2083","\u2082\u2084","\u2082\u2085","\u2082\u2086","\u2082\u2087","\u2082\u2088","\u2082\u2089","\u2083\u2080","\u2083\u2081","\u2083\u2082","\u2083\u2083","\u2083\u2084","\u2083\u2085","\u2083\u2086","\u2083\u2087","\u2083\u2088","\u2083\u2089","\u2084\u2080"],Be=k.length-1,c=(e,n=0,s=l.default.ROUND_DOWN)=>{let o=new g(e).decimalPlaces(n,s).toString().split(".");return o[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o.join(".")},O=(e,n=1)=>{let s=new g(e);return s.lt(1e3)?s.toString():s.lt(1e6)?`${c(s.div(1e3),n)}K`:s.lt(1e9)?`${c(s.div(1e6),n)}M`:s.lt(1e12)?`${c(s.dividedBy(1e9),n)}B`:`${c(s.dividedBy(1e12),n)}T`},Pe=(e,n=5)=>{let s=new g(e);if(s.eq(0))return"0";let[r,o]=s.toFixed().split("."),a=o.split(""),u=a.findIndex(A=>A!=="0");if(u<0||u>Be)return"0";let T=Math.min(a.length-u,n);return`${c(r)}.0`.concat(k[u]).concat(a.slice(u,u+T).join("").replace(/\.?0+$/,""))},Ue=(e,n)=>{let s=e.toString().match(/\.0*/),r=(s?s[0].length-1:0)+n;return c(e,r)},L=(e,n)=>{let s=e.times(100).decimalPlaces(n,l.default.ROUND_HALF_UP);return`${c(s,n)}%`},x=(e,n,s)=>{let{showPlusGtThanZero:r,invalidPlaceholder:o="--",zeroToken:a}=s;if(!N(e))return o;let u=new g(e),T=u.lt(0),A=u.abs(),d=n(A);return a!==void 0&&d===a||d==="0"||Number(d)===0?d:T?`-${d}`:r?`+${d}`:d},De=e=>e.lt(.001)?e.decimalPlaces(5,l.default.ROUND_DOWN).toString():e.lt(1)?e.decimalPlaces(3,l.default.ROUND_DOWN).toString():e.lt(100)?e.decimalPlaces(2,l.default.ROUND_DOWN).toString():e.lt(1e5)?c(e,2):O(e),we=(e="",n={showPlusGtThanZero:!1})=>x(e,De,{showPlusGtThanZero:n?.showPlusGtThanZero}),Le=e=>e.lt(.001)?"$0":e.lt(1)?`$${e.decimalPlaces(3,l.default.ROUND_DOWN)}`:e.lt(100)?`$${e.decimalPlaces(2,l.default.ROUND_DOWN)}`:e.lt(1e4)?`$${c(e,2)}`:`$${O(e)}`,ke=(e="",n={showPlusGtThanZero:!1})=>x(e,Le,{showPlusGtThanZero:n?.showPlusGtThanZero,zeroToken:"$0"}),Me=e=>{if(e.lt(.001))return"$0";if(e.lt(1))return`$${e.decimalPlaces(3,l.default.ROUND_DOWN)}`;if(e.lt(100))return`$${e.decimalPlaces(2,l.default.ROUND_DOWN)}`;if(e.lt(1e3))return`$${e.decimalPlaces(0,l.default.ROUND_DOWN)}`;let n=e.div(100).integerValue(l.default.ROUND_DOWN).times(100);return`$${O(n,0)}`},_e=(e="",n={showPlusGtThanZero:!1})=>x(e,Me,{showPlusGtThanZero:n?.showPlusGtThanZero,zeroToken:"$0"}),M=e=>n=>n.lt(1e-4)?Pe(n,e?4:2):n.lt(1)?e?c(n,4):Ue(n,2):n.lt(100)||n.lt(1e4)?c(n,e?4:2):n.lt(1e5)?c(n,2):O(n),Fe=(e="",n={isHighPrecise:!0})=>{if(!N(e))return"--";let s=new g(e);return s.lt(0)?"--":M(n.isHighPrecise)(s.abs())},He=(e="",n={isHighPrecise:!0})=>{if(!N(e))return"--";let s=new g(e);return s.lt(0)?"--":`$${M(n.isHighPrecise)(s.abs())}`},ve=(e="",n={})=>{if(!N(e))return"-- %";let s=new g(e),r=s.lt(0),o=s.abs(),a=r?"-":n?.showPlusGtThanZero?"+":"";return o.lt(1e-4)?"0%":o.lt(100)?`${a}${L(o,n?.precision??2)}`:o.lt(1e3)?`${a}${L(o,n?.precision??1)}`:`${a}> 99,999%`};function Ve(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}function $e(e,n=6,s=4){return e.slice(0,n)+"..."+e.slice(-s)}var Ke=/\{?\b(type|base|quote)\b\}?/g;function Ge(e,n="base-type"){if(!e)return"";let[s="",r="",o=""]=e.split("_");return n.replace(Ke,(a,u)=>u==="type"?s:u==="base"?r:o)}var b=require("@liberfi.io/types"),Ye=new Set(b.SOLANA_TOKEN_PROTOCOLS),We=[...b.SOLANA_TOKEN_PROTOCOLS].sort((e,n)=>n.length-e.length),Ze=(e,n)=>{if(e!==b.Chain.SOLANA)return;let s=n.toLowerCase();return Ye.has(s)?s:We.find(r=>s.includes(r))},ze=e=>e.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ");var p=require("@liberfi.io/types"),S="0x0000000000000000000000000000000000000000",_={native:{address:"11111111111111111111111111111111",symbol:"SOL",decimals:9},wrapped:{address:"So11111111111111111111111111111111111111112",symbol:"SOL",decimals:9},stablecoins:{USDC:{address:"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",symbol:"USDC",decimals:6},USDT:{address:"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",symbol:"USDT",decimals:6},USD1:{address:"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB",symbol:"USD1",decimals:6}}},F={native:{address:S,symbol:"ETH",decimals:18},wrapped:{address:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",symbol:"USDC",decimals:6},USDT:{address:"0xdAC17F958D2ee523a2206206994597C13D831ec7",symbol:"USDT",decimals:6}}},H={native:{address:S,symbol:"BNB",decimals:18},wrapped:{address:"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",symbol:"WBNB",decimals:18},stablecoins:{USDC:{address:"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",symbol:"USDC",decimals:18},USDT:{address:"0x55d398326f99059fF775485246999027B3197955",symbol:"USDT",decimals:18}}},v={native:{address:S,symbol:"ETH",decimals:18},wrapped:{address:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",symbol:"USDC",decimals:6},USDT:{address:"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",symbol:"USDT",decimals:6}}},V={native:{address:S,symbol:"ETH",decimals:18},wrapped:{address:"0x4200000000000000000000000000000000000006",symbol:"WETH",decimals:18},stablecoins:{USDC:{address:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",symbol:"USDC",decimals:6},USDT:{address:"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58",symbol:"USDT",decimals:6}}},$={native:{address:S,symbol:"AVAX",decimals:18},wrapped:{address:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",symbol:"WAVAX",decimals:18},stablecoins:{USDC:{address:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",symbol:"USDC",decimals:6},USDT:{address:"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",symbol:"USDT",decimals:6}}},h={[p.Chain.SOLANA]:_,[p.Chain.ETHEREUM]:F,[p.Chain.BINANCE]:H,[p.Chain.ARBITRUM]:v,[p.Chain.OPTIMISM]:V,[p.Chain.AVALANCHE]:$};function qe(e){return h[e]?.native}function Xe(e){return h[e]?.wrapped}function je(e){return h[e]?.stablecoins}function Je(e){let n=h[e];return n?[n.native.address,n.wrapped.address,...Object.values(n.stablecoins).map(s=>s.address)]:[]}function Qe(e){let n=h[e];if(!n)return{};let s={[n.native.address]:n.native.symbol,[n.wrapped.address]:n.wrapped.symbol};for(let r of Object.values(n.stablecoins))s[r.address]=r.symbol;return s}var i=require("@liberfi.io/types"),et={[i.Chain.SOLANA]:"https://solscan.io/tx/",[i.Chain.ETHEREUM]:"https://etherscan.io/tx/",[i.Chain.POLYGON]:"https://polygonscan.com/tx/",[i.Chain.BINANCE]:"https://bscscan.com/tx/",[i.Chain.BINANCE_TESTNET]:"https://testnet.bscscan.com/tx/",[i.Chain.AVALANCHE]:"https://snowtrace.io/tx/",[i.Chain.BASE]:"https://basescan.org/tx/",[i.Chain.BLAST]:"https://blastracker.xyz/tx/",[i.Chain.ARBITRUM]:"https://arbiscan.io/tx/",[i.Chain.ARBITRUM_NOVA]:"https://nova.arbiscan.io/tx/",[i.Chain.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/tx/",[i.Chain.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/tx/"},tt={[i.Chain.SOLANA]:"https://solscan.io/account/",[i.Chain.ETHEREUM]:"https://etherscan.io/address/",[i.Chain.POLYGON]:"https://polygonscan.com/address/",[i.Chain.BINANCE]:"https://bscscan.com/address/",[i.Chain.BINANCE_TESTNET]:"https://testnet.bscscan.com/address/",[i.Chain.AVALANCHE]:"https://snowtrace.io/address/",[i.Chain.BASE]:"https://basescan.org/address/",[i.Chain.BLAST]:"https://blastracker.xyz/address/",[i.Chain.ARBITRUM]:"https://arbiscan.io/address/",[i.Chain.ARBITRUM_NOVA]:"https://nova.arbiscan.io/address/",[i.Chain.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/address/",[i.Chain.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/address/"};function K(e,n,s){let r=e[n];return r?`${r}${s}`:void 0}function nt(e,n){return K(et,e,n)}function st(e,n){return K(tt,e,n)}function rt(e){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(e)}`}function ot(e){return`https://x.com/search?q=${encodeURIComponent(e)}`}function it(e){return`https://x.com/${e}`}function at(e){return`https://x.com/i/status/${e}`}function G(e,n){let s=0,r=null,o=null;return(...u)=>{let T=Date.now(),A=n-(T-s);A<=0?(r!==null&&(clearTimeout(r),r=null),s=T,e(...u)):(o=u,r===null&&(r=setTimeout(()=>{s=Date.now(),r=null,o&&(e(...o),o=null)},A)))}}function Y(e,n){let s=null,r=(...o)=>{s!==null&&clearTimeout(s),s=setTimeout(()=>{s=null,e(...o)},n)};return r.cancel=()=>{s!==null&&(clearTimeout(s),s=null)},r}function C(e,n=!1){return typeof e=="function"?e:n?s=>String(s[e]):s=>s[e]}function W(e,n){let s=C(n),r=new Set;return e.filter(o=>{let a=s(o);return r.has(a)?!1:(r.add(a),!0)})}function Z(e,n,s){let r=C(s),o=new Set(n.map(r));return e.filter(a=>o.has(r(a)))}function z(e,n){let s=C(n,!0),r={};for(let o of e)r[s(o)]=o;return r}function q(e,n){let s=C(n,!0),r={};for(let o of e){let a=s(o);(r[a]??=[]).push(o)}return r}function X(e,n){let s={};for(let r of Object.keys(e))s[n(e[r],r)]=e[r];return s}function j(e,n){let s={};for(let r of Object.keys(e))s[r]=n(e[r],r);return s}0&&(module.exports={ARBITRUM_TOKENS,AVALANCHE_TOKENS,ApiError,BSC_TOKENS,CHAIN_REGISTRY,CHAIN_TOKENS,ETHEREUM_TOKENS,OPTIMISM_TOKENS,SOLANA_TOKENS,SafeBigNumber,accountExplorerUrl,capitalize,chainColor,chainDisplayName,chainIcon,chainIdBySlug,chainSlug,chainToNamespace,debounce,formatAge,formatAgeInSeconds,formatAmount,formatAmountUSD,formatAmountUSDCompact,formatPercent,formatPrice,formatPriceUSD,formatSymbol,formatTokenProtocolName,getCommonTokenAddresses,getCommonTokenSymbolsMap,getNativeToken,getStablecoins,getWrappedToken,groupBy,httpDelete,httpGet,httpMutate,httpPost,httpPut,httpRequest,intersectionBy,isBinanceChain,isEthereumChain,isSolanaChain,isValidEvmAddress,isValidNumber,isValidSolanaAddress,isValidWalletAddress,keyBy,mapKeys,mapValues,parseTokenProtocolFamily,searchImageUrl,searchTwitterUrl,throttle,truncateAddress,twitterTweetUrl,twitterUserUrl,txExplorerUrl,uniqBy});
2
2
  //# sourceMappingURL=index.js.map