@liberfi.io/utils 0.1.191 → 0.2.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.
package/dist/index.d.mts CHANGED
@@ -1,32 +1,59 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
3
 
4
- declare global {
5
- interface Window {
6
- __LIBERFI_VERSION__?: {
7
- [key: string]: string;
8
- };
9
- }
10
- }
11
- declare const _default: "0.1.191";
12
-
13
- /** Returns the chain namespace (EVM or SOLANA) for a given chain */
4
+ /** Returns the chain namespace (EVM or SOLANA) for a given chain. */
14
5
  declare function chainToNamespace(chain: Chain): ChainNamespace;
15
6
  declare function isSolanaChain(chain: Chain): boolean;
16
7
  declare function isEthereumChain(chain: Chain): boolean;
17
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. */
18
21
  declare function chainColor(chainId: Chain): string | undefined;
19
- declare function chainIcon(chain: Chain | string): string | undefined;
22
+ /** Returns the canonical slug for the chain, when defined. */
20
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
+ */
21
33
  declare function chainDisplayName(chainId: Chain): string;
22
34
  declare function chainIdBySlug(slug: string): Chain | undefined;
23
35
  declare function isValidWalletAddress(chain: Chain | string, addr: string): boolean;
24
36
  declare function isValidEvmAddress(value: string): boolean;
25
37
  declare function isValidSolanaAddress(value: string): boolean;
26
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
+ */
27
43
  declare class ApiError extends Error {
44
+ /** Application-level error code parsed from the response body. */
28
45
  readonly code: number;
29
- 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);
30
57
  }
31
58
 
32
59
  interface FormatAgeOptions {
@@ -76,20 +103,41 @@ declare function formatAgeInSeconds(age: number, options?: FormatAgeOptions): st
76
103
  */
77
104
  declare function formatAge(age: number, options?: FormatAgeOptions): string;
78
105
 
79
- declare function httpRequest<R = any>(url: string, options: RequestInit): Promise<R>;
80
- declare function httpGet<R = any>(url: string, options?: RequestInit): Promise<R>;
81
- declare function httpPost<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
82
- declare function httpPut<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
83
- declare function httpDelete<R = any>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
84
- 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>;
85
120
 
86
121
  /**
87
122
  * A `BigNumber` subclass that never throws on construction.
88
- * 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`.
89
129
  */
90
130
  declare class SafeBigNumber extends BigNumber {
91
131
  constructor(num?: BigNumber.Value, base?: number);
92
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
+ */
93
141
  declare const isValidNumber: (num: unknown) => boolean;
94
142
  type FormatAmountOptions = {
95
143
  showPlusGtThanZero: boolean;
@@ -155,7 +203,7 @@ type FormatPriceOptions = {
155
203
  isHighPrecise: boolean;
156
204
  };
157
205
  /**
158
- * Format a token price (no currency symbol).
206
+ * Format a token price (no currency symbol). Negative inputs render as `"--"`.
159
207
  *
160
208
  * Same precision tiers as {@link formatPriceUSD} but without the "$" prefix.
161
209
  *
@@ -164,7 +212,7 @@ type FormatPriceOptions = {
164
212
  */
165
213
  declare const formatPrice: (num?: BigNumber.Value, options?: FormatPriceOptions) => string;
166
214
  /**
167
- * Format a token price with "$" prefix.
215
+ * Format a token price with "$" prefix. Negative inputs render as `"--"`.
168
216
  *
169
217
  * Two precision modes controlled by `isHighPrecise` (default: `true`):
170
218
  *
@@ -199,6 +247,8 @@ type FormatPercentOptions = {
199
247
  * | < 1000 | "15,000.5%" (1 dp by default) |
200
248
  * | ≥ 1000 | "> 99,999%" |
201
249
  *
250
+ * Large values use thousand-grouping separators (e.g. `"15,000%"`).
251
+ *
202
252
  * @param num - The ratio value (0.3 means 30%).
203
253
  * @param options.showPlusGtThanZero - Prefix positive values with "+".
204
254
  * @param options.precision - Decimal precision override.
@@ -232,24 +282,27 @@ declare function capitalize(str: string): string;
232
282
  declare function truncateAddress(address: string, start?: number, end?: number): string;
233
283
 
234
284
  /**
235
- * Format trading pair symbol *
236
- * 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.
237
293
  *
238
- * @param symbol - Original trading pair symbol in format "type_base_quote" (e.g., "PERP_BTC_USDT")
239
- * @param formatString - Format string template, defaults to "base"
240
- * - Supports the following placeholders:
241
- * - "type": Trading type (e.g., "PERP")
242
- * - "base": Base currency (e.g., "BTC")
243
- * - "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"`.
244
296
  *
245
- * @returns Formatted string, returns empty string if input is empty
297
+ * @returns Formatted string, or `""` if `symbol` is empty.
246
298
  *
247
299
  * @example
248
300
  * ```typescript
249
- * formatSymbol("PERP_BTC_USDT") // "BTC"
301
+ * formatSymbol("PERP_BTC_USDT") // "BTC-PERP" (default "base-type")
250
302
  * formatSymbol("PERP_BTC_USDT", "base") // "BTC"
251
- * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
303
+ * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
252
304
  * formatSymbol("SPOT_ETH_USDC", "base-quote") // "ETH-USDC"
305
+ * formatSymbol("SPOT_ETH_USDC", "{base}/{quote}") // "ETH/USDC"
253
306
  * ```
254
307
  */
255
308
  declare function formatSymbol(symbol: string, formatString?: string): string;
@@ -295,11 +348,13 @@ type DebouncedFunction<T extends (...args: any[]) => void> = T & {
295
348
  };
296
349
  declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): DebouncedFunction<T>;
297
350
 
298
- declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
299
- declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
300
- declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
301
- 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[]>;
302
357
  declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
303
358
  declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
304
359
 
305
- 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, _default as version };
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,32 +1,59 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
3
 
4
- declare global {
5
- interface Window {
6
- __LIBERFI_VERSION__?: {
7
- [key: string]: string;
8
- };
9
- }
10
- }
11
- declare const _default: "0.1.191";
12
-
13
- /** Returns the chain namespace (EVM or SOLANA) for a given chain */
4
+ /** Returns the chain namespace (EVM or SOLANA) for a given chain. */
14
5
  declare function chainToNamespace(chain: Chain): ChainNamespace;
15
6
  declare function isSolanaChain(chain: Chain): boolean;
16
7
  declare function isEthereumChain(chain: Chain): boolean;
17
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. */
18
21
  declare function chainColor(chainId: Chain): string | undefined;
19
- declare function chainIcon(chain: Chain | string): string | undefined;
22
+ /** Returns the canonical slug for the chain, when defined. */
20
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
+ */
21
33
  declare function chainDisplayName(chainId: Chain): string;
22
34
  declare function chainIdBySlug(slug: string): Chain | undefined;
23
35
  declare function isValidWalletAddress(chain: Chain | string, addr: string): boolean;
24
36
  declare function isValidEvmAddress(value: string): boolean;
25
37
  declare function isValidSolanaAddress(value: string): boolean;
26
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
+ */
27
43
  declare class ApiError extends Error {
44
+ /** Application-level error code parsed from the response body. */
28
45
  readonly code: number;
29
- 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);
30
57
  }
31
58
 
32
59
  interface FormatAgeOptions {
@@ -76,20 +103,41 @@ declare function formatAgeInSeconds(age: number, options?: FormatAgeOptions): st
76
103
  */
77
104
  declare function formatAge(age: number, options?: FormatAgeOptions): string;
78
105
 
79
- declare function httpRequest<R = any>(url: string, options: RequestInit): Promise<R>;
80
- declare function httpGet<R = any>(url: string, options?: RequestInit): Promise<R>;
81
- declare function httpPost<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
82
- declare function httpPut<R = any, P = any>(url: string, data: P, options?: Omit<RequestInit, "method">): Promise<R>;
83
- declare function httpDelete<R = any>(url: string, options?: Omit<RequestInit, "method">): Promise<R>;
84
- 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>;
85
120
 
86
121
  /**
87
122
  * A `BigNumber` subclass that never throws on construction.
88
- * 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`.
89
129
  */
90
130
  declare class SafeBigNumber extends BigNumber {
91
131
  constructor(num?: BigNumber.Value, base?: number);
92
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
+ */
93
141
  declare const isValidNumber: (num: unknown) => boolean;
94
142
  type FormatAmountOptions = {
95
143
  showPlusGtThanZero: boolean;
@@ -155,7 +203,7 @@ type FormatPriceOptions = {
155
203
  isHighPrecise: boolean;
156
204
  };
157
205
  /**
158
- * Format a token price (no currency symbol).
206
+ * Format a token price (no currency symbol). Negative inputs render as `"--"`.
159
207
  *
160
208
  * Same precision tiers as {@link formatPriceUSD} but without the "$" prefix.
161
209
  *
@@ -164,7 +212,7 @@ type FormatPriceOptions = {
164
212
  */
165
213
  declare const formatPrice: (num?: BigNumber.Value, options?: FormatPriceOptions) => string;
166
214
  /**
167
- * Format a token price with "$" prefix.
215
+ * Format a token price with "$" prefix. Negative inputs render as `"--"`.
168
216
  *
169
217
  * Two precision modes controlled by `isHighPrecise` (default: `true`):
170
218
  *
@@ -199,6 +247,8 @@ type FormatPercentOptions = {
199
247
  * | < 1000 | "15,000.5%" (1 dp by default) |
200
248
  * | ≥ 1000 | "> 99,999%" |
201
249
  *
250
+ * Large values use thousand-grouping separators (e.g. `"15,000%"`).
251
+ *
202
252
  * @param num - The ratio value (0.3 means 30%).
203
253
  * @param options.showPlusGtThanZero - Prefix positive values with "+".
204
254
  * @param options.precision - Decimal precision override.
@@ -232,24 +282,27 @@ declare function capitalize(str: string): string;
232
282
  declare function truncateAddress(address: string, start?: number, end?: number): string;
233
283
 
234
284
  /**
235
- * Format trading pair symbol *
236
- * 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.
237
293
  *
238
- * @param symbol - Original trading pair symbol in format "type_base_quote" (e.g., "PERP_BTC_USDT")
239
- * @param formatString - Format string template, defaults to "base"
240
- * - Supports the following placeholders:
241
- * - "type": Trading type (e.g., "PERP")
242
- * - "base": Base currency (e.g., "BTC")
243
- * - "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"`.
244
296
  *
245
- * @returns Formatted string, returns empty string if input is empty
297
+ * @returns Formatted string, or `""` if `symbol` is empty.
246
298
  *
247
299
  * @example
248
300
  * ```typescript
249
- * formatSymbol("PERP_BTC_USDT") // "BTC"
301
+ * formatSymbol("PERP_BTC_USDT") // "BTC-PERP" (default "base-type")
250
302
  * formatSymbol("PERP_BTC_USDT", "base") // "BTC"
251
- * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
303
+ * formatSymbol("PERP_BTC_USDT", "base-type") // "BTC-PERP"
252
304
  * formatSymbol("SPOT_ETH_USDC", "base-quote") // "ETH-USDC"
305
+ * formatSymbol("SPOT_ETH_USDC", "{base}/{quote}") // "ETH/USDC"
253
306
  * ```
254
307
  */
255
308
  declare function formatSymbol(symbol: string, formatString?: string): string;
@@ -295,11 +348,13 @@ type DebouncedFunction<T extends (...args: any[]) => void> = T & {
295
348
  };
296
349
  declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): DebouncedFunction<T>;
297
350
 
298
- declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
299
- declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
300
- declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
301
- 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[]>;
302
357
  declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
303
358
  declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
304
359
 
305
- 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, _default as version };
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 Q=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty;var re=(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 ee(r))!ne.call(t,s)&&s!==n&&S(t,s,{get:()=>r[s],enumerable:!(o=Q(r,s))||o.enumerable});return t};var oe=(t,r,n)=>(n=t!=null?J(te(t)):{},I(r||!t||!t.__esModule?S(n,"default",{value:t,enumerable:!0}):n,t)),se=t=>I(S({},"__esModule",{value:!0}),t);var et={};re(et,{ARBITRUM_TOKENS:()=>V,AVALANCHE_TOKENS:()=>$,ApiError:()=>f,BSC_TOKENS:()=>F,CHAIN_TOKENS:()=>T,ETHEREUM_TOKENS:()=>H,OPTIMISM_TOKENS:()=>v,SOLANA_TOKENS:()=>k,SafeBigNumber:()=>u,accountExplorerUrl:()=>ze,capitalize:()=>we,chainColor:()=>me,chainDisplayName:()=>Te,chainIcon:()=>pe,chainIdBySlug:()=>C,chainSlug:()=>Ae,chainToNamespace:()=>B,debounce:()=>W,formatAge:()=>be,formatAgeInSeconds:()=>L,formatAmount:()=>xe,formatAmountUSD:()=>Be,formatAmountUSDCompact:()=>Pe,formatPercent:()=>Le,formatPrice:()=>Ue,formatPriceUSD:()=>De,formatSymbol:()=>Me,formatTokenProtocolName:()=>Ve,getCommonTokenAddresses:()=>Ye,getCommonTokenSymbolsMap:()=>We,getNativeToken:()=>ve,getStablecoins:()=>Ke,getWrappedToken:()=>$e,groupBy:()=>z,httpDelete:()=>Ce,httpGet:()=>Se,httpMutate:()=>Ie,httpPost:()=>Re,httpPut:()=>ge,httpRequest:()=>A,intersectionBy:()=>Z,isBinanceChain:()=>de,isEthereumChain:()=>le,isSolanaChain:()=>ce,isValidEvmAddress:()=>U,isValidNumber:()=>m,isValidSolanaAddress:()=>D,isValidWalletAddress:()=>fe,keyBy:()=>q,mapKeys:()=>X,mapValues:()=>j,parseTokenProtocolFamily:()=>Fe,searchImageUrl:()=>Xe,searchTwitterUrl:()=>je,throttle:()=>Y,truncateAddress:()=>_e,twitterTweetUrl:()=>Qe,twitterUserUrl:()=>Je,txExplorerUrl:()=>qe,uniqBy:()=>G,version:()=>y});module.exports=se(et);typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/utils"]="0.1.191");var y="0.1.191";var e=require("@liberfi.io/types"),x=new Set([e.Chain.SOLANA,e.Chain.SOLANA_TESTNET,e.Chain.SOLANA_DEVNET]),ie=new Set([e.Chain.ETHEREUM]),ae=new Set([e.Chain.BINANCE,e.Chain.BINANCE_TESTNET]);function B(t){return x.has(t)?e.ChainNamespace.SOLANA:e.ChainNamespace.EVM}function ce(t){return x.has(t)}function le(t){return ie.has(t)}function de(t){return ae.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"},P={[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 me(t){return ue[t]}function pe(t){let r=C(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 Te(t){let r=P[t];if(r)return r.toUpperCase();let n=g[t];return n?n.replace(/\b\w/g,o=>o.toUpperCase()):t}var R=new Map;for(let[t,r]of Object.entries(P))r&&R.set(r.toLowerCase(),t);for(let[t,r]of Object.entries(g)){let n=r?.toLowerCase();n&&!R.has(n)&&R.set(n,t)}function C(t){return R.get(t.toLowerCase())}function fe(t,r){let n=C(t)??t;switch(B(n)){case e.ChainNamespace.SOLANA:return D(r);case e.ChainNamespace.EVM:return U(r);default:throw new Error(`Unsupported chain: ${t}`)}}var Ee=/^0x[0-9a-fA-F]{40}$/;function U(t){return Ee.test(t)}var Ne=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function D(t){return Ne.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 L(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 be(t,r={}){return L(Math.floor(t/1e3),r)}async function A(t,r){if(!t.startsWith("http"))throw new Error("url must start with http(s)");let n=await fetch(t,{...r,headers:Oe(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 Oe(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 Se(t,r){return await A(t,{method:"GET",...r})}async function Re(t,r,n){return await A(t,{method:"POST",body:JSON.stringify(r),...n})}async function ge(t,r,n){return await A(t,{method:"PUT",body:JSON.stringify(r),...n})}async function Ce(t,r){return await A(t,{method:"DELETE",...r})}async function Ie(t,r){return await A(t,r)}var c=oe(require("bignumber.js")),u=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 u||t instanceof c.default)return!0;if(typeof t!="string")return!1;let r=Number.parseFloat(t);return!isNaN(r)},ye=["\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 u(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 u(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`},_=(t,r=5)=>{let n=new u(t);if(n.eq(0))return"0";let[o,s]=n.toFixed().split("."),i=s.split(""),d=i.findIndex(O=>O!=="0"),b=Math.min(i.length-d,r);return`${l(o)}.0`.concat(ye[d]).concat(i.slice(d,d+b).join("").replace(/\.?0+$/,""))},M=(t,r)=>{let n=t.toString().match(/\.0*/),o=(n?n[0].length-1:0)+r;return l(t,o)},w=(t,r)=>`${t.times(100).decimalPlaces(r,c.default.ROUND_HALF_UP).toString()}%`,xe=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(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}`},Be=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(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},Pe=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(t),o=n.lt(0),s=n.abs(),i=s.div(100).integerValue(c.default.ROUND_DOWN).times(100),d=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 d==="$0"?d:o?`-${d}`:r?.showPlusGtThanZero?`+${d}`:d},Ue=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new u(t);if(n.lt(0))return"--";let o=n.abs(),{isHighPrecise:s}=r;return`${o.lt(1e-4)?_(o,s?4:2):o.lt(1)?s?l(o,4):M(o,2):o.lt(100)||o.lt(1e4)?l(o,s?4:2):o.lt(1e5)?l(o,2):E(o)}`},De=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new u(t);if(n.lt(0))return"--";let o=n.abs(),{isHighPrecise:s}=r;return`$${o.lt(1e-4)?_(o,s?4:2):o.lt(1)?s?l(o,4):M(o,2):o.lt(100)||o.lt(1e4)?l(o,s?4:2):o.lt(1e5)?l(o,2):E(o)}`},Le=(t="",r={})=>{if(!m(t))return"-- %";let n=new u(t),o=n.lt(0),s=n.abs(),i=o?"-":r?.showPlusGtThanZero?"+":"";return s.lt(1e-4)?"0%":s.lt(100)?`${i}${w(s,r?.precision??2)}`:s.lt(1e3)?`${i}${w(s,r?.precision??1)}`:`${i}> 99,999%`};function we(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function _e(t,r=6,n=4){return t.slice(0,r)+"..."+t.slice(-n)}function Me(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 N=require("@liberfi.io/types"),ke=new Set(N.SOLANA_TOKEN_PROTOCOLS),He=[...N.SOLANA_TOKEN_PROTOCOLS].sort((t,r)=>r.length-t.length),Fe=(t,r)=>{if(t!==N.Chain.SOLANA)return;let n=r.toLowerCase();return ke.has(n)?n:He.find(o=>n.includes(o))},Ve=t=>t.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ");var p=require("@liberfi.io/types"),h="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:h,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}}},F={native:{address:h,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:h,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:h,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:h,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={[p.Chain.SOLANA]:k,[p.Chain.ETHEREUM]:H,[p.Chain.BINANCE]:F,[p.Chain.ARBITRUM]:V,[p.Chain.OPTIMISM]:v,[p.Chain.AVALANCHE]:$};function ve(t){return T[t]?.native}function $e(t){return T[t]?.wrapped}function Ke(t){return T[t]?.stablecoins}function Ye(t){let r=T[t];return r?[r.native.address,r.wrapped.address,...Object.values(r.stablecoins).map(n=>n.address)]:[]}function We(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"),Ge={[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/"},Ze={[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 K(t,r,n){let o=t[r];return o?`${o}${n}`:void 0}function qe(t,r){return K(Ge,t,r)}function ze(t,r){return K(Ze,t,r)}function Xe(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function je(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function Je(t){return`https://x.com/${t}`}function Qe(t){return`https://x.com/i/status/${t}`}function Y(t,r){let n=0,o=null,s=null;return(...d)=>{let b=Date.now(),O=r-(b-n);O<=0?(o!==null&&(clearTimeout(o),o=null),n=b,t(...d)):(s=d,o===null&&(o=setTimeout(()=>{n=Date.now(),o=null,s&&(t(...s),s=null)},O)))}}function W(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 G(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 Z(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 q(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 z(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 X(t,r){let n={};for(let o of Object.keys(t))n[r(t[o],o)]=t[o];return n}function j(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,version});
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