@liberfi.io/utils 0.1.28 → 0.1.30

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/README.md CHANGED
@@ -7,7 +7,7 @@ Framework-agnostic utility library for the Liberfi React SDK monorepo. Provides
7
7
  - **Pure functions** — All exports are stateless, side-effect-free functions (except `version` registration). No React, no DOM.
8
8
  - **Tiered precision formatting** — Number formatters automatically select decimal places and abbreviation based on magnitude, matching financial UI conventions.
9
9
  - **Single source of truth for chain data** — Chain slugs, colors, icons, and address validation live here so UI packages don't duplicate chain logic.
10
- - **Minimal dependencies** — Only `bignumber.js` for precision math, `lodash-es` for common utilities, and `@solana/kit` for Solana address validation.
10
+ - **Minimal dependencies** — Only `bignumber.js` for precision math. Solana address validation uses a lightweight base58 regex. Common collection/timing utilities (throttle, debounce, etc.) are implemented in-house to avoid lodash overhead.
11
11
 
12
12
  ## Installation
13
13
 
@@ -110,7 +110,7 @@ Validates a `0x`-prefixed 40-hex-character EVM address.
110
110
 
111
111
  #### `isValidSolanaAddress(value: string): boolean`
112
112
 
113
- Validates a Solana base58 address using `@solana/kit`.
113
+ Validates a Solana base58 address (32–44 character base58 string).
114
114
 
115
115
  #### `isValidWalletAddress(chain: Chain | string, addr: string): boolean`
116
116
 
@@ -229,9 +229,20 @@ Formats a protocol slug to display name (e.g. `"pump-amm"` → `"Pump Amm"`).
229
229
  - `CHAIN_TOKENS` — `Partial<Record<Chain, ChainPredefinedTokens>>`
230
230
  - `version` — Package version string
231
231
 
232
- ### Re-exported from lodash-es
232
+ ### Collection & Timing Utilities
233
233
 
234
- `throttle`, `debounce`, `uniqBy`, `intersectionBy`, `keyBy`, `groupBy`, `mapKeys`, `mapValues`
234
+ Lightweight, zero-dependency replacements for common lodash functions.
235
+
236
+ | Function | Signature | Description |
237
+ | ---------------- | ------------------------------------------ | ------------------------------------------ |
238
+ | `throttle` | `(fn, wait) => fn` | Throttle with leading + trailing execution |
239
+ | `debounce` | `(fn, wait) => fn` | Trailing-edge debounce |
240
+ | `uniqBy` | `(array, iteratee) => T[]` | Deduplicate by key or accessor |
241
+ | `intersectionBy` | `(a, b, iteratee) => T[]` | Items in `a` whose key exists in `b` |
242
+ | `keyBy` | `(array, iteratee) => Record<string, T>` | Index array into object by key |
243
+ | `groupBy` | `(array, iteratee) => Record<string, T[]>` | Group array items by key |
244
+ | `mapKeys` | `(obj, iteratee) => Record<string, T>` | Transform object keys |
245
+ | `mapValues` | `(obj, iteratee) => Record<string, R>` | Transform object values |
235
246
 
236
247
  ## Usage Examples
237
248
 
package/dist/index.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
- export { debounce, groupBy, intersectionBy, keyBy, mapKeys, mapValues, throttle, uniqBy } from 'lodash-es';
4
3
 
5
4
  declare global {
6
5
  interface Window {
@@ -9,7 +8,7 @@ declare global {
9
8
  };
10
9
  }
11
10
  }
12
- declare const _default: "0.1.28";
11
+ declare const _default: "0.1.30";
13
12
 
14
13
  /** Returns the chain namespace (EVM or SOLANA) for a given chain */
15
14
  declare function chainToNamespace(chain: Chain): ChainNamespace;
@@ -287,4 +286,14 @@ declare function searchTwitterUrl(q: string): string;
287
286
  declare function twitterUserUrl(username: string): string;
288
287
  declare function twitterTweetUrl(id: string): string;
289
288
 
290
- 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, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, _default as version };
289
+ declare function throttle<T extends (...args: any[]) => void>(fn: T, wait: number): T;
290
+ declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): T;
291
+
292
+ declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
293
+ declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
294
+ declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
295
+ declare function groupBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T[]>;
296
+ declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
297
+ declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
298
+
299
+ 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, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy, _default as version };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { Chain, ChainNamespace, TokenProtocol } from '@liberfi.io/types';
2
2
  import BigNumber from 'bignumber.js';
3
- export { debounce, groupBy, intersectionBy, keyBy, mapKeys, mapValues, throttle, uniqBy } from 'lodash-es';
4
3
 
5
4
  declare global {
6
5
  interface Window {
@@ -9,7 +8,7 @@ declare global {
9
8
  };
10
9
  }
11
10
  }
12
- declare const _default: "0.1.28";
11
+ declare const _default: "0.1.30";
13
12
 
14
13
  /** Returns the chain namespace (EVM or SOLANA) for a given chain */
15
14
  declare function chainToNamespace(chain: Chain): ChainNamespace;
@@ -287,4 +286,14 @@ declare function searchTwitterUrl(q: string): string;
287
286
  declare function twitterUserUrl(username: string): string;
288
287
  declare function twitterTweetUrl(id: string): string;
289
288
 
290
- 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, formatAge, formatAgeInSeconds, formatAmount, formatAmountUSD, formatAmountUSDCompact, formatPercent, formatPrice, formatPriceUSD, formatSymbol, formatTokenProtocolName, getCommonTokenAddresses, getCommonTokenSymbolsMap, getNativeToken, getStablecoins, getWrappedToken, httpDelete, httpGet, httpMutate, httpPost, httpPut, httpRequest, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, _default as version };
289
+ declare function throttle<T extends (...args: any[]) => void>(fn: T, wait: number): T;
290
+ declare function debounce<T extends (...args: any[]) => void>(fn: T, wait: number): T;
291
+
292
+ declare function uniqBy<T>(array: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
293
+ declare function intersectionBy<T>(a: T[], b: T[], iteratee: ((item: T) => unknown) | keyof T): T[];
294
+ declare function keyBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T>;
295
+ declare function groupBy<T>(array: T[], iteratee: ((item: T) => string) | keyof T): Record<string, T[]>;
296
+ declare function mapKeys<T>(obj: Record<string, T>, iteratee: (value: T, key: string) => string): Record<string, T>;
297
+ declare function mapValues<T, R>(obj: Record<string, T>, iteratee: (value: T, key: string) => R): Record<string, R>;
298
+
299
+ 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, isValidEvmAddress, isValidNumber, isValidSolanaAddress, isValidWalletAddress, keyBy, mapKeys, mapValues, parseTokenProtocolFamily, searchImageUrl, searchTwitterUrl, throttle, truncateAddress, twitterTweetUrl, twitterUserUrl, txExplorerUrl, uniqBy, _default as version };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var Q=Object.create;var T=Object.defineProperty,J=Object.defineProperties,ee=Object.getOwnPropertyDescriptor,te=Object.getOwnPropertyDescriptors,re=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols,ne=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty,se=Object.prototype.propertyIsEnumerable;var P=(t,r,n)=>r in t?T(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,E=(t,r)=>{for(var n in r||(r={}))L.call(r,n)&&P(t,n,r[n]);if(U)for(var n of U(r))se.call(r,n)&&P(t,n,r[n]);return t},D=(t,r)=>J(t,te(r));var oe=(t,r)=>{for(var n in r)T(t,n,{get:r[n],enumerable:!0})},M=(t,r,n,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of re(r))!L.call(t,o)&&o!==n&&T(t,o,{get:()=>r[o],enumerable:!(s=ee(r,o))||s.enumerable});return t};var ae=(t,r,n)=>(n=t!=null?Q(ne(t)):{},M(r||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t)),ie=t=>M(T({},"__esModule",{value:!0}),t);var N=(t,r,n)=>new Promise((s,o)=>{var a=m=>{try{p(n.next(m))}catch(B){o(B)}},d=m=>{try{p(n.throw(m))}catch(B){o(B)}},p=m=>m.done?s(m.value):Promise.resolve(m.value).then(a,d);p((n=n.apply(t,r)).next())});var je={};oe(je,{ARBITRUM_TOKENS:()=>q,AVALANCHE_TOKENS:()=>X,ApiError:()=>S,BSC_TOKENS:()=>Z,CHAIN_TOKENS:()=>O,ETHEREUM_TOKENS:()=>G,OPTIMISM_TOKENS:()=>z,SOLANA_TOKENS:()=>W,SafeBigNumber:()=>A,accountExplorerUrl:()=>Ge,capitalize:()=>Pe,chainColor:()=>le,chainDisplayName:()=>me,chainIcon:()=>ue,chainIdBySlug:()=>y,chainSlug:()=>Ae,chainToNamespace:()=>H,debounce:()=>c.debounce,formatAge:()=>fe,formatAgeInSeconds:()=>$,formatAmount:()=>ge,formatAmountUSD:()=>Ie,formatAmountUSDCompact:()=>xe,formatPercent:()=>Ue,formatPrice:()=>Be,formatPriceUSD:()=>ye,formatSymbol:()=>De,formatTokenProtocolName:()=>He,getCommonTokenAddresses:()=>$e,getCommonTokenSymbolsMap:()=>ve,getNativeToken:()=>ke,getStablecoins:()=>Ve,getWrappedToken:()=>Fe,groupBy:()=>c.groupBy,httpDelete:()=>Se,httpGet:()=>be,httpMutate:()=>Ce,httpPost:()=>Oe,httpPut:()=>Te,httpRequest:()=>b,intersectionBy:()=>c.intersectionBy,isValidEvmAddress:()=>F,isValidNumber:()=>f,isValidSolanaAddress:()=>V,isValidWalletAddress:()=>Ee,keyBy:()=>c.keyBy,mapKeys:()=>c.mapKeys,mapValues:()=>c.mapValues,parseTokenProtocolFamily:()=>we,searchImageUrl:()=>Ze,searchTwitterUrl:()=>qe,throttle:()=>c.throttle,truncateAddress:()=>Le,twitterTweetUrl:()=>Xe,twitterUserUrl:()=>ze,txExplorerUrl:()=>We,uniqBy:()=>c.uniqBy,version:()=>_});module.exports=ie(je);typeof window!="undefined"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/utils"]="0.1.28");var _="0.1.28";var w=require("@solana/kit"),e=require("@liberfi.io/types"),ce=new Set([e.Chain.SOLANA,e.Chain.SOLANA_TESTNET,e.Chain.SOLANA_DEVNET]);function H(t){return ce.has(t)?e.ChainNamespace.SOLANA:e.ChainNamespace.EVM}var x={[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"},k={[e.Chain.SOLANA]:"sol",[e.Chain.ETHEREUM]:"eth",[e.Chain.BINANCE]:"bsc",[e.Chain.ARBITRUM]:"arb",[e.Chain.OPTIMISM]:"opt",[e.Chain.AVALANCHE]:"avax"},de={[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 le(t){return de[t]}function ue(t){var s;let r=(s=y(t))!=null?s:t,n=x[r];return n?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(n)}.jpg`:void 0}function Ae(t){return x[t]}function me(t){let r=k[t];if(r)return r.toUpperCase();let n=x[t];return n?n.replace(/\b\w/g,s=>s.toUpperCase()):t}var I=new Map;for(let[t,r]of Object.entries(k))r&&I.set(r.toLowerCase(),t);for(let[t,r]of Object.entries(x)){let n=r==null?void 0:r.toLowerCase();n&&!I.has(n)&&I.set(n,t)}function y(t){return I.get(t.toLowerCase())}function Ee(t,r){var o;let n=(o=y(t))!=null?o:t;switch(H(n)){case e.ChainNamespace.SOLANA:return V(r);case e.ChainNamespace.EVM:return F(r);default:throw new Error(`Unsupported chain: ${t}`)}}var pe=/^0x[0-9a-fA-F]{40}$/;function F(t){return pe.test(t)}function V(t){try{return(0,w.address)(t),!0}catch(r){return!1}}var S=class extends Error{constructor(n,s){super(n);this.code=s;this.name="ApiError"}};var Ne={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function $(t,r={}){let n=E(E({},Ne),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 fe(t,r={}){return $(Math.floor(t/1e3),r)}function b(t,r){return N(this,null,function*(){if(!t.startsWith("http"))throw new Error("url must start with http(s)");let n=yield fetch(t,D(E({},r),{headers:he(r.headers,r.method)}));if(n.ok)return yield n.json();try{let s=yield n.json();throw n.status===400?new S(s.message||s.code||n.statusText,s.code):new Error(s.message||s.code||n.statusText)}catch(s){throw s}})}function he(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}function be(t,r){return N(this,null,function*(){return yield b(t,E({method:"GET"},r))})}function Oe(t,r,n){return N(this,null,function*(){return yield b(t,E({method:"POST",body:JSON.stringify(r)},n))})}function Te(t,r,n){return N(this,null,function*(){return yield b(t,E({method:"PUT",body:JSON.stringify(r)},n))})}function Se(t,r){return N(this,null,function*(){return yield b(t,E({method:"DELETE"},r))})}function Ce(t,r){return N(this,null,function*(){return yield b(t,r)})}var l=ae(require("bignumber.js")),A=class extends l.default{constructor(r,n){try{super(r!=null?r:0,n)}catch(s){console.error("SafeBigNumber constructor error",s),super(0,n)}}},f=t=>{if(typeof t=="number"&&!isNaN(t)||t instanceof A||t instanceof l.default)return!0;if(typeof t!="string")return!1;let r=Number.parseFloat(t);return!isNaN(r)},Re=["\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"],u=(t,r=0,n=l.default.ROUND_DOWN)=>{let o=new A(t).decimalPlaces(r,n).toString().split(".");return o[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o.join(".")},C=(t,r=1)=>{let n=new A(t);return n.lt(1e3)?n.toNumber():n.lt(1e6)?`${u(n.div(1e3),r)}K`:n.lt(1e9)?`${u(n.div(1e6),r)}M`:n.lt(1e12)?`${u(n.dividedBy(1e9),r)}B`:`${u(n.dividedBy(1e12),r)}T`},K=(t,r=5)=>{let n=new A(t);if(n.eq(0))return"0";let[s,o]=n.toFixed().split("."),a=o.split(""),d=a.findIndex(m=>m!=="0"),p=Math.min(a.length-d,r);return`${u(s)}.0`.concat(Re[d]).concat(a.slice(d,d+p).join("").replace(/\.?0+$/,""))},Y=(t,r)=>{let n=t.toString().match(/\.0*/),s=(n?n[0].length-1:0)+r;return u(t,s)},v=(t,r)=>`${t.times(100).decimalPlaces(r,l.default.ROUND_HALF_UP).toString()}%`,ge=(t="",r={showPlusGtThanZero:!1})=>{if(!f(t))return"--";let n=new A(t),s=n.lt(0),o=n.abs(),a=o.lt(.001)?o.decimalPlaces(5,l.default.ROUND_DOWN).toString():o.lt(1)?o.decimalPlaces(3,l.default.ROUND_DOWN).toString():o.lt(100)?o.decimalPlaces(2,l.default.ROUND_DOWN).toString():o.lt(1e5)?u(o,2):C(o);return Number(a)===0?`${a}`:s?`-${a}`:r!=null&&r.showPlusGtThanZero?`+${a}`:`${a}`},Ie=(t="",r={showPlusGtThanZero:!1})=>{if(!f(t))return"--";let n=new A(t),s=n.lt(0),o=n.abs(),a=o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,l.default.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,l.default.ROUND_DOWN)}`:o.lt(1e4)?`$${u(o,2)}`:`$${C(o)}`;return a==="$0"?a:s?`-${a}`:r!=null&&r.showPlusGtThanZero?`+${a}`:a},xe=(t="",r={showPlusGtThanZero:!1})=>{if(!f(t))return"--";let n=new A(t),s=n.lt(0),o=n.abs(),a=o.div(100).integerValue(l.default.ROUND_DOWN).times(100),d=o.lt(1e-4)||o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,l.default.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,l.default.ROUND_DOWN)}`:o.lt(1e3)?`$${o.decimalPlaces(0,l.default.ROUND_DOWN)}`:`$${C(a,0)}`;return d==="$0"?d:s?`-${d}`:r!=null&&r.showPlusGtThanZero?`+${d}`:d},Be=(t="",r={isHighPrecise:!0})=>{if(!f(t))return"--";let n=new A(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`${s.lt(1e-4)?K(s,o?4:2):s.lt(1)?o?u(s,4):Y(s,2):s.lt(100)||s.lt(1e4)?u(s,o?4:2):s.lt(1e5)?u(s,2):C(s)}`},ye=(t="",r={isHighPrecise:!0})=>{if(!f(t))return"--";let n=new A(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`$${s.lt(1e-4)?K(s,o?4:2):s.lt(1)?o?u(s,4):Y(s,2):s.lt(100)||s.lt(1e4)?u(s,o?4:2):s.lt(1e5)?u(s,2):C(s)}`},Ue=(t="",r={})=>{var d,p;if(!f(t))return"-- %";let n=new A(t),s=n.lt(0),o=n.abs(),a=s?"-":r!=null&&r.showPlusGtThanZero?"+":"";return o.lt(1e-4)?"0%":o.lt(100)?`${a}${v(o,(d=r==null?void 0:r.precision)!=null?d:2)}`:o.lt(1e3)?`${a}${v(o,(p=r==null?void 0:r.precision)!=null?p:1)}`:`${a}> 99,999%`};function Pe(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Le(t,r=6,n=4){return t.slice(0,r)+"..."+t.slice(-n)}function De(t,r="base-type"){if(!t)return"";let n=t.split("_"),s=n[0],o=n[1],a=n[2];return r.replace("type",s).replace("base",o).replace("quote",a)}var R=require("@liberfi.io/types"),Me=new Set(R.SOLANA_TOKEN_PROTOCOLS),_e=[...R.SOLANA_TOKEN_PROTOCOLS].sort((t,r)=>r.length-t.length),we=(t,r)=>{if(t!==R.Chain.SOLANA)return;let n=r.toLowerCase();return Me.has(n)?n:_e.find(s=>n.includes(s))},He=t=>t.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ");var h=require("@liberfi.io/types"),g="0x0000000000000000000000000000000000000000",W={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}}},G={native:{address:g,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}}},Z={native:{address:g,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}}},q={native:{address:g,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}}},z={native:{address:g,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}}},X={native:{address:g,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}}},O={[h.Chain.SOLANA]:W,[h.Chain.ETHEREUM]:G,[h.Chain.BINANCE]:Z,[h.Chain.ARBITRUM]:q,[h.Chain.OPTIMISM]:z,[h.Chain.AVALANCHE]:X};function ke(t){var r;return(r=O[t])==null?void 0:r.native}function Fe(t){var r;return(r=O[t])==null?void 0:r.wrapped}function Ve(t){var r;return(r=O[t])==null?void 0:r.stablecoins}function $e(t){let r=O[t];return r?[r.native.address,r.wrapped.address,...Object.values(r.stablecoins).map(n=>n.address)]:[]}function ve(t){let r=O[t];if(!r)return{};let n={[r.native.address]:r.native.symbol,[r.wrapped.address]:r.wrapped.symbol};for(let s of Object.values(r.stablecoins))n[s.address]=s.symbol;return n}var i=require("@liberfi.io/types"),Ke={[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/"},Ye={[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 j(t,r,n){let s=t[r];return s?`${s}${n}`:void 0}function We(t,r){return j(Ke,t,r)}function Ge(t,r){return j(Ye,t,r)}function Ze(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function qe(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function ze(t){return`https://x.com/${t}`}function Xe(t){return`https://x.com/i/status/${t}`}var c=require("lodash-es");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,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 g=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,te=Object.prototype.hasOwnProperty;var ne=(t,n)=>{for(var r in n)g(t,r,{get:n[r],enumerable:!0})},I=(t,n,r,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Q(n))!te.call(t,o)&&o!==r&&g(t,o,{get:()=>n[o],enumerable:!(s=J(n,o))||s.enumerable});return t};var re=(t,n,r)=>(r=t!=null?j(ee(t)):{},I(n||!t||!t.__esModule?g(r,"default",{value:t,enumerable:!0}):r,t)),se=t=>I(g({},"__esModule",{value:!0}),t);var ze={};ne(ze,{ARBITRUM_TOKENS:()=>F,AVALANCHE_TOKENS:()=>v,ApiError:()=>f,BSC_TOKENS:()=>H,CHAIN_TOKENS:()=>T,ETHEREUM_TOKENS:()=>k,OPTIMISM_TOKENS:()=>V,SOLANA_TOKENS:()=>M,SafeBigNumber:()=>u,accountExplorerUrl:()=>Ye,capitalize:()=>Be,chainColor:()=>ae,chainDisplayName:()=>de,chainIcon:()=>ce,chainIdBySlug:()=>C,chainSlug:()=>le,chainToNamespace:()=>x,debounce:()=>Y,formatAge:()=>Te,formatAgeInSeconds:()=>L,formatAmount:()=>Re,formatAmountUSD:()=>Se,formatAmountUSDCompact:()=>Ce,formatPercent:()=>xe,formatPrice:()=>Ie,formatPriceUSD:()=>ye,formatSymbol:()=>Ue,formatTokenProtocolName:()=>_e,getCommonTokenAddresses:()=>Fe,getCommonTokenSymbolsMap:()=>Ve,getNativeToken:()=>Me,getStablecoins:()=>He,getWrappedToken:()=>ke,groupBy:()=>q,httpDelete:()=>be,httpGet:()=>Ee,httpMutate:()=>Oe,httpPost:()=>Ne,httpPut:()=>he,httpRequest:()=>p,intersectionBy:()=>G,isValidEvmAddress:()=>P,isValidNumber:()=>m,isValidSolanaAddress:()=>U,isValidWalletAddress:()=>ue,keyBy:()=>Z,mapKeys:()=>z,mapValues:()=>X,parseTokenProtocolFamily:()=>we,searchImageUrl:()=>We,searchTwitterUrl:()=>Ge,throttle:()=>K,truncateAddress:()=>Pe,twitterTweetUrl:()=>qe,twitterUserUrl:()=>Ze,txExplorerUrl:()=>Ke,uniqBy:()=>W,version:()=>y});module.exports=se(ze);typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/utils"]="0.1.30");var y="0.1.30";var e=require("@liberfi.io/types"),oe=new Set([e.Chain.SOLANA,e.Chain.SOLANA_TESTNET,e.Chain.SOLANA_DEVNET]);function x(t){return oe.has(t)?e.ChainNamespace.SOLANA:e.ChainNamespace.EVM}var S={[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"},ie={[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 ae(t){return ie[t]}function ce(t){let n=C(t)??t,r=S[n];return r?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(r)}.jpg`:void 0}function le(t){return S[t]}function de(t){let n=B[t];if(n)return n.toUpperCase();let r=S[t];return r?r.replace(/\b\w/g,s=>s.toUpperCase()):t}var R=new Map;for(let[t,n]of Object.entries(B))n&&R.set(n.toLowerCase(),t);for(let[t,n]of Object.entries(S)){let r=n?.toLowerCase();r&&!R.has(r)&&R.set(r,t)}function C(t){return R.get(t.toLowerCase())}function ue(t,n){let r=C(t)??t;switch(x(r)){case e.ChainNamespace.SOLANA:return U(n);case e.ChainNamespace.EVM:return P(n);default:throw new Error(`Unsupported chain: ${t}`)}}var me=/^0x[0-9a-fA-F]{40}$/;function P(t){return me.test(t)}var Ae=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function U(t){return Ae.test(t)}var f=class extends Error{constructor(r,s){super(r);this.code=s;this.name="ApiError"}};var pe={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function L(t,n={}){let r={...pe,...n};return t<10?r.justNow:t<60?r.secondsAgo.replace("{n}",String(t)):t<3600?r.minutesAgo.replace("{n}",String(Math.floor(t/60))):t<86400?r.hoursAgo.replace("{n}",String(Math.floor(t/3600))):t<31536e3?r.daysAgo.replace("{n}",String(Math.floor(t/86400))):r.yearsAgo.replace("{n}",String(Math.floor(t/31536e3)))}function Te(t,n={}){return L(Math.floor(t/1e3),n)}async function p(t,n){if(!t.startsWith("http"))throw new Error("url must start with http(s)");let r=await fetch(t,{...n,headers:fe(n.headers,n.method)});if(r.ok)return await r.json();try{let s=await r.json();throw r.status===400?new f(s.message||s.code||r.statusText,s.code):new Error(s.message||s.code||r.statusText)}catch(s){throw s}}function fe(t={},n){let r=new Headers(t);return r.has("Content-Type")||(n!=="DELETE"?r.append("Content-Type","application/json;charset=utf-8"):r.append("Content-Type","application/x-www-form-urlencoded")),r}async function Ee(t,n){return await p(t,{method:"GET",...n})}async function Ne(t,n,r){return await p(t,{method:"POST",body:JSON.stringify(n),...r})}async function he(t,n,r){return await p(t,{method:"PUT",body:JSON.stringify(n),...r})}async function be(t,n){return await p(t,{method:"DELETE",...n})}async function Oe(t,n){return await p(t,n)}var c=re(require("bignumber.js")),u=class extends c.default{constructor(n,r){try{super(n??0,r)}catch(s){console.error("SafeBigNumber constructor error",s),super(0,r)}}},m=t=>{if(typeof t=="number"&&!isNaN(t)||t instanceof u||t instanceof c.default)return!0;if(typeof t!="string")return!1;let n=Number.parseFloat(t);return!isNaN(n)},ge=["\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,n=0,r=c.default.ROUND_DOWN)=>{let o=new u(t).decimalPlaces(n,r).toString().split(".");return o[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o.join(".")},E=(t,n=1)=>{let r=new u(t);return r.lt(1e3)?r.toNumber():r.lt(1e6)?`${l(r.div(1e3),n)}K`:r.lt(1e9)?`${l(r.div(1e6),n)}M`:r.lt(1e12)?`${l(r.dividedBy(1e9),n)}B`:`${l(r.dividedBy(1e12),n)}T`},w=(t,n=5)=>{let r=new u(t);if(r.eq(0))return"0";let[s,o]=r.toFixed().split("."),i=o.split(""),d=i.findIndex(O=>O!=="0"),b=Math.min(i.length-d,n);return`${l(s)}.0`.concat(ge[d]).concat(i.slice(d,d+b).join("").replace(/\.?0+$/,""))},_=(t,n)=>{let r=t.toString().match(/\.0*/),s=(r?r[0].length-1:0)+n;return l(t,s)},D=(t,n)=>`${t.times(100).decimalPlaces(n,c.default.ROUND_HALF_UP).toString()}%`,Re=(t="",n={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let r=new u(t),s=r.lt(0),o=r.abs(),i=o.lt(.001)?o.decimalPlaces(5,c.default.ROUND_DOWN).toString():o.lt(1)?o.decimalPlaces(3,c.default.ROUND_DOWN).toString():o.lt(100)?o.decimalPlaces(2,c.default.ROUND_DOWN).toString():o.lt(1e5)?l(o,2):E(o);return Number(i)===0?`${i}`:s?`-${i}`:n?.showPlusGtThanZero?`+${i}`:`${i}`},Se=(t="",n={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let r=new u(t),s=r.lt(0),o=r.abs(),i=o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,c.default.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,c.default.ROUND_DOWN)}`:o.lt(1e4)?`$${l(o,2)}`:`$${E(o)}`;return i==="$0"?i:s?`-${i}`:n?.showPlusGtThanZero?`+${i}`:i},Ce=(t="",n={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let r=new u(t),s=r.lt(0),o=r.abs(),i=o.div(100).integerValue(c.default.ROUND_DOWN).times(100),d=o.lt(1e-4)||o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,c.default.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,c.default.ROUND_DOWN)}`:o.lt(1e3)?`$${o.decimalPlaces(0,c.default.ROUND_DOWN)}`:`$${E(i,0)}`;return d==="$0"?d:s?`-${d}`:n?.showPlusGtThanZero?`+${d}`:d},Ie=(t="",n={isHighPrecise:!0})=>{if(!m(t))return"--";let r=new u(t);if(r.lt(0))return"--";let s=r.abs(),{isHighPrecise:o}=n;return`${s.lt(1e-4)?w(s,o?4:2):s.lt(1)?o?l(s,4):_(s,2):s.lt(100)||s.lt(1e4)?l(s,o?4:2):s.lt(1e5)?l(s,2):E(s)}`},ye=(t="",n={isHighPrecise:!0})=>{if(!m(t))return"--";let r=new u(t);if(r.lt(0))return"--";let s=r.abs(),{isHighPrecise:o}=n;return`$${s.lt(1e-4)?w(s,o?4:2):s.lt(1)?o?l(s,4):_(s,2):s.lt(100)||s.lt(1e4)?l(s,o?4:2):s.lt(1e5)?l(s,2):E(s)}`},xe=(t="",n={})=>{if(!m(t))return"-- %";let r=new u(t),s=r.lt(0),o=r.abs(),i=s?"-":n?.showPlusGtThanZero?"+":"";return o.lt(1e-4)?"0%":o.lt(100)?`${i}${D(o,n?.precision??2)}`:o.lt(1e3)?`${i}${D(o,n?.precision??1)}`:`${i}> 99,999%`};function Be(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Pe(t,n=6,r=4){return t.slice(0,n)+"..."+t.slice(-r)}function Ue(t,n="base-type"){if(!t)return"";let r=t.split("_"),s=r[0],o=r[1],i=r[2];return n.replace("type",s).replace("base",o).replace("quote",i)}var N=require("@liberfi.io/types"),Le=new Set(N.SOLANA_TOKEN_PROTOCOLS),De=[...N.SOLANA_TOKEN_PROTOCOLS].sort((t,n)=>n.length-t.length),we=(t,n)=>{if(t!==N.Chain.SOLANA)return;let r=n.toLowerCase();return Le.has(r)?r:De.find(s=>r.includes(s))},_e=t=>t.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" ");var A=require("@liberfi.io/types"),h="0x0000000000000000000000000000000000000000",M={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}}},k={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}}},H={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}}},F={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}}},v={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={[A.Chain.SOLANA]:M,[A.Chain.ETHEREUM]:k,[A.Chain.BINANCE]:H,[A.Chain.ARBITRUM]:F,[A.Chain.OPTIMISM]:V,[A.Chain.AVALANCHE]:v};function Me(t){return T[t]?.native}function ke(t){return T[t]?.wrapped}function He(t){return T[t]?.stablecoins}function Fe(t){let n=T[t];return n?[n.native.address,n.wrapped.address,...Object.values(n.stablecoins).map(r=>r.address)]:[]}function Ve(t){let n=T[t];if(!n)return{};let r={[n.native.address]:n.native.symbol,[n.wrapped.address]:n.wrapped.symbol};for(let s of Object.values(n.stablecoins))r[s.address]=s.symbol;return r}var a=require("@liberfi.io/types"),ve={[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/"},$e={[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,n,r){let s=t[n];return s?`${s}${r}`:void 0}function Ke(t,n){return $(ve,t,n)}function Ye(t,n){return $($e,t,n)}function We(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function Ge(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function Ze(t){return`https://x.com/${t}`}function qe(t){return`https://x.com/i/status/${t}`}function K(t,n){let r=0,s=null,o=null;return(...d)=>{let b=Date.now(),O=n-(b-r);O<=0?(s!==null&&(clearTimeout(s),s=null),r=b,t(...d)):(o=d,s===null&&(s=setTimeout(()=>{r=Date.now(),s=null,o&&(t(...o),o=null)},O)))}}function Y(t,n){let r=null;return(...o)=>{r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,t(...o)},n)}}function W(t,n){let r=new Set,s=typeof n=="function"?n:o=>o[n];return t.filter(o=>{let i=s(o);return r.has(i)?!1:(r.add(i),!0)})}function G(t,n,r){let s=typeof r=="function"?r:i=>i[r],o=new Set(n.map(s));return t.filter(i=>o.has(s(i)))}function Z(t,n){let r=typeof n=="function"?n:o=>String(o[n]),s={};for(let o of t)s[r(o)]=o;return s}function q(t,n){let r=typeof n=="function"?n:o=>String(o[n]),s={};for(let o of t){let i=r(o);(s[i]??=[]).push(o)}return s}function z(t,n){let r={};for(let s of Object.keys(t))r[n(t[s],s)]=t[s];return r}function X(t,n){let r={};for(let s of Object.keys(t))r[s]=n(t[s],s);return r}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,isValidEvmAddress,isValidNumber,isValidSolanaAddress,isValidWalletAddress,keyBy,mapKeys,mapValues,parseTokenProtocolFamily,searchImageUrl,searchTwitterUrl,throttle,truncateAddress,twitterTweetUrl,twitterUserUrl,txExplorerUrl,uniqBy,version});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/chain.ts","../src/errors.ts","../src/dateTime.ts","../src/fetch.ts","../src/number.ts","../src/string.ts","../src/symbol.ts","../src/tokenProtocols.ts","../src/tokens.ts","../src/urls.ts"],"sourcesContent":["export { default as version } from \"./version\";\nexport * from \"./chain\";\nexport * from \"./errors\";\nexport * from \"./dateTime\";\nexport * from \"./fetch\";\nexport * from \"./number\";\nexport * from \"./string\";\nexport * from \"./symbol\";\nexport * from \"./tokenProtocols\";\nexport * from \"./tokens\";\nexport * from \"./urls\";\n\nexport {\n throttle,\n debounce,\n uniqBy,\n intersectionBy,\n keyBy,\n groupBy,\n mapKeys,\n mapValues,\n} from \"lodash-es\";\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/utils\"] = \"0.1.28\";\n}\n\nexport default \"0.1.28\";\n","import { address } from \"@solana/kit\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst solanaChains: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\n/** Returns the chain namespace (EVM or SOLANA) for a given chain */\nexport function chainToNamespace(chain: Chain): ChainNamespace {\n return solanaChains.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst chainSlugs: Partial<Record<Chain, string>> = {\n [Chain.ETHEREUM]: \"ethereum\",\n [Chain.UBIQ]: \"ubiq\",\n [Chain.OPTIMISM]: \"optimism\",\n [Chain.FLARE]: \"flare\",\n [Chain.SONGBIRD]: \"songbird\",\n [Chain.ELASTOS]: \"elastos\",\n [Chain.KARDIA]: \"kardia\",\n [Chain.CRONOS]: \"cronos\",\n [Chain.RSK]: \"rsk\",\n [Chain.TELOS]: \"telos\",\n [Chain.LUKSO]: \"lukso\",\n [Chain.CRAB]: \"crab\",\n [Chain.DARWINIA]: \"darwinia\",\n [Chain.XDC]: \"xdc\",\n [Chain.CSC]: \"csc\",\n [Chain.ZYX]: \"zyx\",\n [Chain.BINANCE]: \"binance\",\n [Chain.SYSCOIN]: \"syscoin\",\n [Chain.GOCHAIN]: \"gochain\",\n [Chain.ETHEREUMCLASSIC]: \"ethereumclassic\",\n [Chain.OKEXCHAIN]: \"okexchain\",\n [Chain.HOO]: \"hoo\",\n [Chain.METER]: \"meter\",\n [Chain.NOVA_NETWORK]: \"nova network\",\n [Chain.TOMOCHAIN]: \"tomochain\",\n [Chain.BITKUB]: \"bitkub\",\n [Chain.XDAI]: \"xdai\",\n [Chain.SOLANA]: \"solana\",\n [Chain.VELAS]: \"velas\",\n [Chain.THUNDERCORE]: \"thundercore\",\n [Chain.ENULS]: \"enuls\",\n [Chain.FUSE]: \"fuse\",\n [Chain.HECO]: \"heco\",\n [Chain.UNICHAIN]: \"unichain\",\n [Chain.POLYGON]: \"polygon\",\n [Chain.SONIC]: \"sonic\",\n [Chain.SHIMMER_EVM]: \"shimmer_evm\",\n [Chain.RBN]: \"rbn\",\n [Chain.OMNI]: \"omni\",\n [Chain.MANTA]: \"manta\",\n [Chain.HSK]: \"hsk\",\n [Chain.WATER]: \"water\",\n [Chain.XLAYER]: \"xlayer\",\n [Chain.XDAIARB]: \"xdaiarb\",\n [Chain.OP_BNB]: \"op_bnb\",\n [Chain.VINUCHAIN]: \"vinuchain\",\n [Chain.ENERGYWEB]: \"energyweb\",\n [Chain.OASYS]: \"oasys\",\n [Chain.FANTOM]: \"fantom\",\n [Chain.FRAXTAL]: \"fraxtal\",\n [Chain.HPB]: \"hpb\",\n [Chain.BOBA]: \"boba\",\n [Chain.OMAX]: \"omax\",\n [Chain.FILECOIN]: \"filecoin\",\n [Chain.KUCOIN]: \"kucoin\",\n [Chain.ZKSYNC_ERA]: \"zksync era\",\n [Chain.SHIDEN]: \"shiden\",\n [Chain.THETA]: \"theta\",\n [Chain.PULSE]: \"pulse\",\n [Chain.CRONOS_ZKEVM]: \"cronos zkevm\",\n [Chain.SX]: \"sx\",\n [Chain.AREON]: \"areon\",\n [Chain.WC]: \"wc\",\n [Chain.CANDLE]: \"candle\",\n [Chain.ROLLUX]: \"rollux\",\n [Chain.ASTAR]: \"astar\",\n [Chain.REDSTONE]: \"redstone\",\n [Chain.MATCHAIN]: \"matchain\",\n [Chain.CALLISTO]: \"callisto\",\n [Chain.TARA]: \"tara\",\n [Chain.WANCHAIN]: \"wanchain\",\n [Chain.LYRA_CHAIN]: \"lyra chain\",\n [Chain.BIFROST]: \"bifrost\",\n [Chain.CONFLUX]: \"conflux\",\n [Chain.METIS]: \"metis\",\n [Chain.DYMENSION]: \"dymension\",\n [Chain.POLYGON_ZKEVM]: \"polygon zkevm\",\n [Chain.CORE]: \"core\",\n [Chain.LISK]: \"lisk\",\n [Chain.ULTRON]: \"ultron\",\n [Chain.STEP]: \"step\",\n [Chain.MOONBEAM]: \"moonbeam\",\n [Chain.MOONRIVER]: \"moonriver\",\n [Chain.SEI]: \"sei\",\n [Chain.LIVING_ASSETS_MAINNET]: \"living assets mainnet\",\n [Chain.STY]: \"sty\",\n [Chain.TENET]: \"tenet\",\n [Chain.GRAVITY]: \"gravity\",\n [Chain.REYA_NETWORK]: \"reya network\",\n [Chain.SONEIUM]: \"soneium\",\n [Chain.SWELLCHAIN]: \"swellchain\",\n [Chain.ONUS]: \"onus\",\n [Chain.HUBBLENET]: \"hubblenet\",\n [Chain.SANKO]: \"sanko\",\n [Chain.DOGECHAIN]: \"dogechain\",\n [Chain.MILKOMEDA]: \"milkomeda\",\n [Chain.MILKOMEDA_A1]: \"milkomeda_a1\",\n [Chain.KAVA]: \"kava\",\n [Chain.SOMA]: \"soma\",\n [Chain.KARAK]: \"karak\",\n [Chain.ABSTRACT]: \"abstract\",\n [Chain.MORPH]: \"morph\",\n [Chain.CROSSFI]: \"crossfi\",\n [Chain.BEAM]: \"beam\",\n [Chain.IOTEX]: \"iotex\",\n [Chain.MANTLE]: \"mantle\",\n [Chain.XLC]: \"xlc\",\n [Chain.NAHMII]: \"nahmii\",\n [Chain.BOUNCEBIT]: \"bouncebit\",\n [Chain.TOMBCHAIN]: \"tombchain\",\n [Chain.ZETACHAIN]: \"zetachain\",\n [Chain.PLANQ]: \"planq\",\n [Chain.BITROCK]: \"bitrock\",\n [Chain.XSAT]: \"xsat\",\n [Chain.CYETH]: \"cyeth\",\n [Chain.CANTO]: \"canto\",\n [Chain.KLAYTN]: \"klaytn\",\n [Chain.THAT]: \"that\",\n [Chain.BASE]: \"base\",\n [Chain.HELA]: \"hela\",\n [Chain.IOTAEVM]: \"iotaevm\",\n [Chain.JBC]: \"jbc\",\n [Chain.EVMOS]: \"evmos\",\n [Chain.CARBON]: \"carbon\",\n [Chain.SMARTBCH]: \"smartbch\",\n [Chain.ARTELA]: \"artela\",\n [Chain.IMMUTABLE_ZKEVM]: \"immutable zkevm\",\n [Chain.LOOP]: \"loop\",\n [Chain.GENESYS]: \"genesys\",\n [Chain.EOS_EVM]: \"eos evm\",\n [Chain.MAP_PROTOCOL]: \"map protocol\",\n [Chain.SAPPHIRE]: \"sapphire\",\n [Chain.BITGERT]: \"bitgert\",\n [Chain.FUSION]: \"fusion\",\n [Chain.ZILLIQA]: \"zilliqa\",\n [Chain.APECHAIN]: \"apechain\",\n [Chain.EDU_CHAIN]: \"edu chain\",\n [Chain.ARBITRUM]: \"arbitrum\",\n [Chain.ARBITRUM_NOVA]: \"arbitrum nova\",\n [Chain.CELO]: \"celo\",\n [Chain.OASIS]: \"oasis\",\n [Chain.ASSETCHAIN]: \"assetchain\",\n [Chain.ETHERLINK]: \"etherlink\",\n [Chain.AVALANCHE]: \"avalanche\",\n [Chain.REI]: \"rei\",\n [Chain.ZIRCUIT]: \"zircuit\",\n [Chain.SOPHON]: \"sophon\",\n [Chain.ETN]: \"etn\",\n [Chain.SUPERPOSITION]: \"superposition\",\n [Chain.REICHAIN]: \"reichain\",\n [Chain.BOBA_BNB]: \"boba_bnb\",\n [Chain.INK]: \"ink\",\n [Chain.LINEA]: \"linea\",\n [Chain.BOB]: \"bob\",\n [Chain.GODWOKEN]: \"godwoken\",\n [Chain.BERACHAIN]: \"berachain\",\n [Chain.BLAST]: \"blast\",\n [Chain.CHILIZ]: \"chiliz\",\n [Chain.STRATIS]: \"stratis\",\n [Chain.REAL]: \"real\",\n [Chain.ODYSSEY]: \"odyssey\",\n [Chain.TAIKO]: \"taiko\",\n [Chain.BITLAYER]: \"bitlayer\",\n [Chain.HYDRATION]: \"hydration\",\n [Chain.PAREX]: \"parex\",\n [Chain.POLIS]: \"polis\",\n [Chain.KEKCHAIN]: \"kekchain\",\n [Chain.SCROLL]: \"scroll\",\n [Chain.ZERO_NETWORK]: \"zero_network\",\n [Chain.ZKLINK_NOVA]: \"zklink nova\",\n [Chain.VISION]: \"vision\",\n [Chain.SAAKURU]: \"saakuru\",\n [Chain.ZORA]: \"zora\",\n [Chain.CORN]: \"corn\",\n [Chain.NEON]: \"neon\",\n [Chain.LUMIA]: \"lumia\",\n [Chain.AURORA]: \"aurora\",\n [Chain.HARMONY]: \"harmony\",\n [Chain.PALM]: \"palm\",\n [Chain.ZENIQ]: \"zeniq\",\n [Chain.CURIO]: \"curio\",\n [Chain.MODE]: \"mode\",\n};\n\nconst chainSlugAbbrs: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"sol\",\n [Chain.ETHEREUM]: \"eth\",\n [Chain.BINANCE]: \"bsc\",\n [Chain.ARBITRUM]: \"arb\",\n [Chain.OPTIMISM]: \"opt\",\n [Chain.AVALANCHE]: \"avax\",\n};\n\nconst chainColors: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"#9945FF\",\n [Chain.ETHEREUM]: \"#627EEA\",\n [Chain.BINANCE]: \"#F0B90B\",\n [Chain.ARBITRUM]: \"#28A0F0\",\n [Chain.OPTIMISM]: \"#FF0420\",\n [Chain.AVALANCHE]: \"#E84142\",\n [Chain.POLYGON]: \"#8247E5\",\n [Chain.BASE]: \"#0052FF\",\n [Chain.SONIC]: \"#5B6EF5\",\n [Chain.LINEA]: \"#61DFFF\",\n [Chain.SCROLL]: \"#FFEEDA\",\n [Chain.BLAST]: \"#FCFC03\",\n [Chain.CRONOS]: \"#002D74\",\n [Chain.BERACHAIN]: \"#964B00\",\n};\n\nexport function chainColor(chainId: Chain): string | undefined {\n return chainColors[chainId];\n}\n\nexport function chainIcon(chain: Chain | string): string | undefined {\n const chainId = chainIdBySlug(chain) ?? chain;\n const slug = chainSlugs[chainId as Chain];\n return slug\n ? `https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(slug)}.jpg`\n : undefined;\n}\n\nexport function chainSlug(chainId: Chain): string | undefined {\n return chainSlugs[chainId];\n}\n\nexport function chainDisplayName(chainId: Chain): string {\n const abbr = chainSlugAbbrs[chainId];\n if (abbr) return abbr.toUpperCase();\n const slug = chainSlugs[chainId];\n if (slug) return slug.replace(/\\b\\w/g, (c) => c.toUpperCase());\n return chainId;\n}\n\nconst slugToChainId: Map<string, Chain> = new Map();\nfor (const [chainId, abbr] of Object.entries(chainSlugAbbrs)) {\n if (abbr) slugToChainId.set(abbr.toLowerCase(), chainId as Chain);\n}\nfor (const [chainId, slug] of Object.entries(chainSlugs)) {\n const key = slug?.toLowerCase();\n if (key && !slugToChainId.has(key)) slugToChainId.set(key, chainId as Chain);\n}\n\nexport function chainIdBySlug(slug: string): Chain | undefined {\n return slugToChainId.get(slug.toLowerCase());\n}\n\nexport function isValidWalletAddress(chain: Chain | string, addr: string) {\n const chainId = (chainIdBySlug(chain) ?? chain) as Chain;\n const namespace = chainToNamespace(chainId);\n switch (namespace) {\n case ChainNamespace.SOLANA:\n return isValidSolanaAddress(addr);\n case ChainNamespace.EVM:\n return isValidEvmAddress(addr);\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n}\n\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport function isValidEvmAddress(value: string) {\n return EVM_ADDRESS_RE.test(value);\n}\n\nexport function isValidSolanaAddress(value: string) {\n try {\n address(value);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n return false;\n }\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n public readonly code: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n","const MINUTE = 60;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst YEAR = 365 * DAY;\n\nexport interface FormatAgeOptions {\n justNow?: string;\n secondsAgo?: string;\n minutesAgo?: string;\n hoursAgo?: string;\n daysAgo?: string;\n yearsAgo?: string;\n}\n\nconst defaultLabels: Required<FormatAgeOptions> = {\n justNow: \"just now\",\n secondsAgo: \"{n}s\",\n minutesAgo: \"{n}m\",\n hoursAgo: \"{n}h\",\n daysAgo: \"{n}d\",\n yearsAgo: \"{n}y\",\n};\n\n/**\n * Formats an age (elapsed time) given in **seconds** into a compact\n * human-readable string like \"3m\", \"2h\", or \"just now\".\n *\n * Use this when you already have the elapsed time in seconds (e.g. from\n * a server-provided `age` field). If you have milliseconds instead, use\n * {@link formatAge}.\n *\n * @example\n * formatAgeInSeconds(5) // \"just now\" (< 10s)\n * formatAgeInSeconds(45) // \"45s\"\n * formatAgeInSeconds(120) // \"2m\"\n * formatAgeInSeconds(7200) // \"2h\"\n * formatAgeInSeconds(172800) // \"2d\"\n * formatAgeInSeconds(63072000) // \"2y\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAgeInSeconds(120, { minutesAgo: \"{n} minutes ago\" }) // \"2 minutes ago\"\n */\nexport function formatAgeInSeconds(\n age: number,\n options: FormatAgeOptions = {},\n): string {\n const labels = { ...defaultLabels, ...options };\n\n if (age < 10) return labels.justNow;\n if (age < MINUTE) return labels.secondsAgo.replace(\"{n}\", String(age));\n\n if (age < HOUR) {\n return labels.minutesAgo.replace(\"{n}\", String(Math.floor(age / MINUTE)));\n }\n if (age < DAY) {\n return labels.hoursAgo.replace(\"{n}\", String(Math.floor(age / HOUR)));\n }\n if (age < YEAR) {\n return labels.daysAgo.replace(\"{n}\", String(Math.floor(age / DAY)));\n }\n return labels.yearsAgo.replace(\"{n}\", String(Math.floor(age / YEAR)));\n}\n\n/**\n * Formats an age (elapsed time) given in **milliseconds** into a compact\n * human-readable string. Internally converts to seconds and delegates to\n * {@link formatAgeInSeconds}.\n *\n * This is the primary function used across UI components to display how\n * long ago something happened (e.g. a trade, a tweet, a channel update).\n *\n * @example\n * formatAge(3000) // \"just now\" (3 s < 10 s threshold)\n * formatAge(45000) // \"45s\"\n * formatAge(120000) // \"2m\"\n * formatAge(7200000) // \"2h\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAge(120000, { minutesAgo: \"{n} 分钟前\" }) // \"2 分钟前\"\n */\nexport function formatAge(age: number, options: FormatAgeOptions = {}): string {\n return formatAgeInSeconds(Math.floor(age / 1000), options);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from \"./errors\";\n\nexport async function httpRequest<R = any>(\n url: string,\n options: RequestInit,\n): Promise<R> {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n // const urlInstance = new URL(url);\n const response = await fetch(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n } else {\n try {\n const errorMsg = await response.json();\n if (response.status === 400) {\n throw new ApiError(\n errorMsg.message || errorMsg.code || response.statusText,\n errorMsg.code,\n );\n }\n throw new Error(errorMsg.message || errorMsg.code || response.statusText);\n } catch (e) {\n throw e;\n }\n }\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string,\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nexport async function httpGet<R = any>(\n url: string,\n options?: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function httpPost<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpPut<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpDelete<R = any>(\n url: string,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"DELETE\",\n ...options,\n });\n}\n\nexport async function httpMutate<R = any>(\n url: string,\n init: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, init);\n}\n","import BigNumber from \"bignumber.js\";\n\n// ---------------------------------------------------------------------------\n// SafeBigNumber\n// ---------------------------------------------------------------------------\n\n/**\n * A `BigNumber` subclass that never throws on construction.\n * Invalid / undefined values fall back to `0`.\n */\nexport class SafeBigNumber extends BigNumber {\n constructor(num?: BigNumber.Value, base?: number) {\n try {\n super(num ?? 0, base);\n } catch (e) {\n console.error(\"SafeBigNumber constructor error\", e);\n super(0, base);\n }\n }\n}\n\ndeclare namespace SafeBigNumber {\n type Value = BigNumber.Value;\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport const isValidNumber = (num: unknown) => {\n if (\n (\"number\" === typeof num && !isNaN(num)) ||\n num instanceof SafeBigNumber ||\n num instanceof BigNumber\n ) {\n return true;\n }\n if (\"string\" !== typeof num) {\n return false;\n }\n const floatNum = Number.parseFloat(num);\n return !isNaN(floatNum);\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst subscriptDigits = [\n \"₀\",\n \"₁\",\n \"₂\",\n \"₃\",\n \"₄\",\n \"₅\",\n \"₆\",\n \"₇\",\n \"₈\",\n \"₉\",\n \"₁₀\",\n \"₁₁\",\n \"₁₂\",\n \"₁₃\",\n \"₁₄\",\n \"₁₅\",\n \"₁₆\",\n \"₁₇\",\n \"₁₈\",\n \"₁₉\",\n \"₂₀\",\n \"₂₁\",\n \"₂₂\",\n \"₂₃\",\n \"₂₄\",\n \"₂₅\",\n \"₂₆\",\n \"₂₇\",\n \"₂₈\",\n \"₂₉\",\n \"₃₀\",\n \"₃₁\",\n \"₃₂\",\n \"₃₃\",\n \"₃₄\",\n \"₃₅\",\n \"₃₆\",\n \"₃₇\",\n \"₃₈\",\n \"₃₉\",\n \"₄₀\",\n];\n\n/**\n * Add thousand-separators (commas) and truncate to `precision` decimals.\n *\n * stringifyNumberWithGroupingSeparator(12345.6789, 2) → \"12,345.67\"\n */\nconst stringifyNumberWithGroupingSeparator = (\n num: BigNumber.Value,\n precision: number = 0,\n rounding: BigNumber.RoundingMode = BigNumber.ROUND_DOWN,\n) => {\n const bn = new SafeBigNumber(num);\n const parts = bn.decimalPlaces(precision, rounding).toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n};\n\n/**\n * Abbreviate large numbers with K / M / B / T suffixes.\n *\n * stringifyNumberWithAbbreviation(1234) → \"1.2K\"\n * stringifyNumberWithAbbreviation(5_600_000) → \"5.6M\"\n */\nconst stringifyNumberWithAbbreviation = (\n num: BigNumber.Value,\n precision: number = 1,\n) => {\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? bn.toNumber()\n : bn.lt(1e6)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e3), precision)}K`\n : bn.lt(1e9)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e6), precision)}M`\n : bn.lt(1e12)\n ? `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e9), precision)}B`\n : `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e12), precision)}T`;\n};\n\n/**\n * Display tiny decimals with Unicode subscript zero-count notation.\n * E.g. `0.00000382` → `\"0.0₅382\"` (5 leading zeros after the decimal).\n */\nconst stringifyNumberWithLeadingZeroSubscripts = (\n num: BigNumber.Value,\n precision: number = 5,\n) => {\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return \"0\";\n const [integerPart, decimalPart] = bn.toFixed().split(\".\");\n const digits = decimalPart.split(\"\");\n const firstNonZeroIndex = digits.findIndex((num) => \"0\" !== num);\n const precisionDigitsCount = Math.min(\n digits.length - firstNonZeroIndex,\n precision,\n );\n return `${stringifyNumberWithGroupingSeparator(integerPart)}.0`\n .concat(subscriptDigits[firstNonZeroIndex])\n .concat(\n digits\n .slice(firstNonZeroIndex, firstNonZeroIndex + precisionDigitsCount)\n .join(\"\")\n .replace(/\\.?0+$/, \"\"),\n );\n};\n\n/**\n * Round to `precision` *significant* decimal digits (skipping leading zeros).\n * E.g. `0.00456` with precision 2 → keeps 5 decimal places → `\"0.00456\"`.\n */\nconst stringifyNumberWithSignificantPrecision = (\n num: BigNumber,\n precision: number,\n) => {\n const matched = num.toString().match(/\\.0*/);\n const significantPrecision =\n (matched ? matched[0].length - 1 : 0) + precision;\n return stringifyNumberWithGroupingSeparator(num, significantPrecision);\n};\n\nconst stringifyPercent = (bn: BigNumber, precision: number) =>\n `${bn.times(100).decimalPlaces(precision, BigNumber.ROUND_HALF_UP).toString()}%`;\n\n// ---------------------------------------------------------------------------\n// Public formatting functions\n// ---------------------------------------------------------------------------\n\nexport type FormatAmountOptions = {\n showPlusGtThanZero: boolean;\n};\n\n/**\n * Format a raw token / asset amount (no currency symbol).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | 5 decimal places | 0.0001234 → \"0.00012\" |\n * | < 1 | 3 decimal places | 0.56789 → \"0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"42.67\" |\n * | < 100 000 | grouped, 2 dp | 12345.6 → \"12,345.60\" |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | 1_500_000 → \"1.5M\" |\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmount = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? abs.decimalPlaces(5, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1)\n ? abs.decimalPlaces(3, BigNumber.ROUND_DOWN).toString()\n : abs.lt(100)\n ? abs.decimalPlaces(2, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n if (Number(formatted) === 0) return `${formatted}`;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return `${formatted}`;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix (standard precision).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 10 000 | grouped, 2 dp | 1234.5 → \"$1,234.50\" |\n * | ≥ 10 000 | abbreviated (K/M/B/T) | 1_500_000 → \"$1.5M\" |\n *\n * Use this for standard financial displays (volume, market cap, liquidity).\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSD = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e4)\n ? `$${stringifyNumberWithGroupingSeparator(abs, 2)}`\n : `$${stringifyNumberWithAbbreviation(abs)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix — **compact** variant.\n *\n * Compared to {@link formatAmountUSD}, this variant is more aggressively\n * rounded and suited for space-constrained UIs (cards, badges, list items):\n *\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 1 000 | 0 decimal places | 567.89 → \"$567\" |\n * | ≥ 1 000 | abbreviated, 0 dp, | 15 678 → \"$15.6K\" |\n * | | rounded to nearest 100 | 1 234 567 → \"$1.2M\" |\n *\n * Key differences from `formatAmountUSD`:\n * - 100–1 000: shows 0 dp instead of 2 dp\n * - ≥ 1 000: abbreviates earlier (1K vs 10K) with 0 precision, rounded to 100s\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSDCompact = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const roundedAbs = abs.div(100).integerValue(BigNumber.ROUND_DOWN).times(100);\n\n const formatted =\n abs.lt(1e-4) || abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e3)\n ? `$${abs.decimalPlaces(0, BigNumber.ROUND_DOWN)}`\n : `$${stringifyNumberWithAbbreviation(roundedAbs, 0)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\nexport type FormatPriceOptions = {\n isHighPrecise: boolean;\n};\n\n/**\n * Format a token price (no currency symbol).\n *\n * Same precision tiers as {@link formatPriceUSD} but without the \"$\" prefix.\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPrice = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `${formatted}`;\n};\n\n/**\n * Format a token price with \"$\" prefix.\n *\n * Two precision modes controlled by `isHighPrecise` (default: `true`):\n *\n * | Range | High precision (default) | Low precision |\n * |---------------|-------------------------------|------------------------------|\n * | < 0.0001 | subscript notation, 4 sig | subscript notation, 2 sig |\n * | | 0.0000382 → \"$0.0₄382\" | 0.0000382 → \"$0.0₄38\" |\n * | < 1 | 4 dp, grouped | 2 significant dp |\n * | | 0.12345 → \"$0.1234\" | 0.12345 → \"$0.12\" |\n * | < 10 000 | 4 dp, grouped | 2 dp, grouped |\n * | | 1234.567 → \"$1,234.5670\" | 1234.567 → \"$1,234.56\" |\n * | < 100 000 | 2 dp, grouped | 2 dp, grouped |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | abbreviated (K/M/B/T) |\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPriceUSD = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `$${formatted}`;\n};\n\nexport type FormatPercentOptions = {\n showPlusGtThanZero?: boolean;\n precision?: number;\n};\n\n/**\n * Format a ratio as a percentage string.\n *\n * The input is a **ratio** (0.3 = 30%, 1.5 = 150%).\n *\n * | Input range | Output example |\n * |---------------|-----------------------------------------|\n * | < 0.0001 | \"0%\" |\n * | < 100 | \"56.79%\" (2 dp by default) |\n * | < 1000 | \"15,000.5%\" (1 dp by default) |\n * | ≥ 1000 | \"> 99,999%\" |\n *\n * @param num - The ratio value (0.3 means 30%).\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n * @param options.precision - Decimal precision override.\n */\nexport const formatPercent = (\n num: BigNumber.Value = \"\",\n options: FormatPercentOptions = {},\n) => {\n if (!isValidNumber(num)) return \"-- %\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const sign = negative ? \"-\" : options?.showPlusGtThanZero ? \"+\" : \"\";\n\n if (abs.lt(1e-4)) return \"0%\";\n if (abs.lt(100))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 2)}`;\n if (abs.lt(1e3))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 1)}`;\n return `${sign}> 99,999%`;\n};\n","/**\n * Capitalize the first letter of a string, lowercasing the rest.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n * capitalize(\"hELLO\") // \"Hello\"\n * capitalize(\"solana\") // \"Solana\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Truncate an address (or any string) to show the first `start` and last `end`\n * characters with \"...\" in between.\n *\n * @param address - The full address string.\n * @param start - Number of characters to keep from the beginning (default 6).\n * @param end - Number of characters to keep from the end (default 4).\n *\n * @example\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\")\n * // \"0x1234...5678\"\n *\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\", 4, 4)\n * // \"0x12...5678\"\n */\nexport function truncateAddress(\n address: string,\n start: number = 6,\n end: number = 4,\n): string {\n return address.slice(0, start) + \"...\" + address.slice(-end);\n}\n","/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import {\n Chain,\n SOLANA_TOKEN_PROTOCOLS,\n TokenProtocol,\n} from \"@liberfi.io/types\";\n\nconst SOLANA_PROTOCOL_SET = new Set<string>(SOLANA_TOKEN_PROTOCOLS);\n\n/** Sorted by length descending so \"pump-amm\" is tested before \"pump\". */\nconst SOLANA_PROTOCOLS_BY_SPECIFICITY = [...SOLANA_TOKEN_PROTOCOLS].sort(\n (a, b) => b.length - a.length,\n);\n\nexport const parseTokenProtocolFamily = (\n chain: Chain,\n protocolFamily: string,\n): TokenProtocol | undefined => {\n if (chain !== Chain.SOLANA) return undefined;\n\n const normalized = protocolFamily.toLowerCase();\n\n if (SOLANA_PROTOCOL_SET.has(normalized)) {\n return normalized as TokenProtocol;\n }\n\n return SOLANA_PROTOCOLS_BY_SPECIFICITY.find((p) => normalized.includes(p));\n};\n\nexport const formatTokenProtocolName = (protocol: TokenProtocol): string => {\n return protocol\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n};\n","import { Chain } from \"@liberfi.io/types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PredefinedToken {\n address: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface ChainPredefinedTokens {\n native: PredefinedToken;\n wrapped: PredefinedToken;\n stablecoins: Record<string, PredefinedToken>;\n}\n\n// ---------------------------------------------------------------------------\n// EVM common\n// ---------------------------------------------------------------------------\n\nconst EVM_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\n// ---------------------------------------------------------------------------\n// Solana\n// ---------------------------------------------------------------------------\n\nexport const SOLANA_TOKENS: ChainPredefinedTokens = {\n native: {\n address: \"11111111111111111111111111111111\",\n symbol: \"SOL\",\n decimals: 9,\n },\n wrapped: {\n address: \"So11111111111111111111111111111111111111112\",\n symbol: \"SOL\",\n decimals: 9,\n },\n stablecoins: {\n USDC: {\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n symbol: \"USDT\",\n decimals: 6,\n },\n USD1: {\n address: \"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB\",\n symbol: \"USD1\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Ethereum\n// ---------------------------------------------------------------------------\n\nexport const ETHEREUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// BSC (Binance Smart Chain)\n// ---------------------------------------------------------------------------\n\nexport const BSC_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"BNB\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n symbol: \"WBNB\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\",\n symbol: \"USDC\",\n decimals: 18,\n },\n USDT: {\n address: \"0x55d398326f99059fF775485246999027B3197955\",\n symbol: \"USDT\",\n decimals: 18,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrum\n// ---------------------------------------------------------------------------\n\nexport const ARBITRUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Optimism\n// ---------------------------------------------------------------------------\n\nexport const OPTIMISM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x4200000000000000000000000000000000000006\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Avalanche\n// ---------------------------------------------------------------------------\n\nexport const AVALANCHE_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"AVAX\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n symbol: \"WAVAX\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Chain -> Tokens index\n// ---------------------------------------------------------------------------\n\nexport const CHAIN_TOKENS: Partial<Record<Chain, ChainPredefinedTokens>> = {\n [Chain.SOLANA]: SOLANA_TOKENS,\n [Chain.ETHEREUM]: ETHEREUM_TOKENS,\n [Chain.BINANCE]: BSC_TOKENS,\n [Chain.ARBITRUM]: ARBITRUM_TOKENS,\n [Chain.OPTIMISM]: OPTIMISM_TOKENS,\n [Chain.AVALANCHE]: AVALANCHE_TOKENS,\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nexport function getNativeToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.native;\n}\n\nexport function getWrappedToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.wrapped;\n}\n\nexport function getStablecoins(\n chain: Chain,\n): Record<string, PredefinedToken> | undefined {\n return CHAIN_TOKENS[chain]?.stablecoins;\n}\n\n/** Returns all predefined token addresses for the given chain (native + wrapped + stablecoins). */\nexport function getCommonTokenAddresses(chain: Chain): string[] {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return [];\n return [\n tokens.native.address,\n tokens.wrapped.address,\n ...Object.values(tokens.stablecoins).map((t) => t.address),\n ];\n}\n\n/** Returns an address -> symbol map for all predefined tokens on the given chain. */\nexport function getCommonTokenSymbolsMap(chain: Chain): Record<string, string> {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return {};\n const map: Record<string, string> = {\n [tokens.native.address]: tokens.native.symbol,\n [tokens.wrapped.address]: tokens.wrapped.symbol,\n };\n for (const t of Object.values(tokens.stablecoins)) {\n map[t.address] = t.symbol;\n }\n return map;\n}\n","import { Chain } from \"@liberfi.io/types\";\n\nconst TX_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/tx/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/tx/\",\n [Chain.POLYGON]: \"https://polygonscan.com/tx/\",\n [Chain.BINANCE]: \"https://bscscan.com/tx/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/tx/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/tx/\",\n [Chain.BASE]: \"https://basescan.org/tx/\",\n [Chain.BLAST]: \"https://blastracker.xyz/tx/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/tx/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/tx/\",\n};\n\nconst ACCOUNT_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/account/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/address/\",\n [Chain.POLYGON]: \"https://polygonscan.com/address/\",\n [Chain.BINANCE]: \"https://bscscan.com/address/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/address/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/address/\",\n [Chain.BASE]: \"https://basescan.org/address/\",\n [Chain.BLAST]: \"https://blastracker.xyz/address/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/address/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/address/\",\n};\n\nfunction explorerUrl(\n urls: Partial<Record<Chain, string>>,\n chainId: Chain,\n value: string,\n): string | undefined {\n const base = urls[chainId];\n return base ? `${base}${value}` : undefined;\n}\n\nexport function txExplorerUrl(\n chainId: Chain,\n txHash: string,\n): string | undefined {\n return explorerUrl(TX_EXPLORER_URLS, chainId, txHash);\n}\n\nexport function accountExplorerUrl(\n chainId: Chain,\n account: string,\n): string | undefined {\n return explorerUrl(ACCOUNT_EXPLORER_URLS, chainId, account);\n}\n\nexport function searchImageUrl(image: string): string {\n return `https://lens.google.com/uploadbyurl?url=${encodeURIComponent(image)}`;\n}\n\nexport function searchTwitterUrl(q: string): string {\n return `https://x.com/search?q=${encodeURIComponent(q)}`;\n}\n\nexport function twitterUserUrl(username: string): string {\n return `https://x.com/${username}`;\n}\n\nexport function twitterTweetUrl(id: string): string {\n return `https://x.com/i/status/${id}`;\n}\n"],"mappings":"2mCAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,EAAA,qBAAAC,EAAA,aAAAC,EAAA,eAAAC,EAAA,iBAAAC,EAAA,oBAAAC,EAAA,oBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,uBAAAC,GAAA,eAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,cAAAC,GAAA,kBAAAC,EAAA,cAAAC,GAAA,qBAAAC,EAAA,sCAAAC,GAAA,uBAAAC,EAAA,iBAAAC,GAAA,oBAAAC,GAAA,2BAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,4BAAAC,GAAA,4BAAAC,GAAA,6BAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,oBAAAC,GAAA,qCAAAC,GAAA,YAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,YAAAC,GAAA,gBAAAC,EAAA,0DAAAC,EAAA,kBAAAC,EAAA,yBAAAC,EAAA,yBAAAC,GAAA,+FAAAC,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,4CAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,kBAAAC,GAAA,gCAAAC,IAAA,eAAAC,GAAApD,ICOI,OAAO,QAAW,cACpB,OAAO,oBAAsB,OAAO,qBAAuB,CAAC,EAC5D,OAAO,oBAAoB,mBAAmB,EAAI,UAGpD,IAAOqD,EAAQ,SCZf,IAAAC,EAAwB,uBACxBC,EAAsC,6BAEhCC,GAAmC,IAAI,IAAI,CAC/C,QAAM,OACN,QAAM,eACN,QAAM,aACR,CAAC,EAGM,SAASC,EAAiBC,EAA8B,CAC7D,OAAOF,GAAa,IAAIE,CAAK,EAAI,iBAAe,OAAS,iBAAe,GAC1E,CAEA,IAAMC,EAA6C,CACjD,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,eAAe,EAAG,kBACzB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,WAAW,EAAG,cACrB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,WAAW,EAAG,cACrB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,UAAU,EAAG,aACpB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,EAAE,EAAG,KACZ,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,EAAE,EAAG,KACZ,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,UAAU,EAAG,aACpB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,aAAa,EAAG,gBACvB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,qBAAqB,EAAG,wBAC/B,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,UAAU,EAAG,aACpB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,eAAe,EAAG,kBACzB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,aAAa,EAAG,gBACvB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,UAAU,EAAG,aACpB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,aAAa,EAAG,gBACvB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,GAAG,EAAG,MACb,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,SAAS,EAAG,YACnB,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,QAAQ,EAAG,WAClB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,YAAY,EAAG,eACtB,CAAC,QAAM,WAAW,EAAG,cACrB,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,MAAM,EAAG,SAChB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,OACd,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,KAAK,EAAG,QACf,CAAC,QAAM,IAAI,EAAG,MAChB,EAEMC,EAAiD,CACrD,CAAC,QAAM,MAAM,EAAG,MAChB,CAAC,QAAM,QAAQ,EAAG,MAClB,CAAC,QAAM,OAAO,EAAG,MACjB,CAAC,QAAM,QAAQ,EAAG,MAClB,CAAC,QAAM,QAAQ,EAAG,MAClB,CAAC,QAAM,SAAS,EAAG,MACrB,EAEMC,GAA8C,CAClD,CAAC,QAAM,MAAM,EAAG,UAChB,CAAC,QAAM,QAAQ,EAAG,UAClB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,QAAQ,EAAG,UAClB,CAAC,QAAM,QAAQ,EAAG,UAClB,CAAC,QAAM,SAAS,EAAG,UACnB,CAAC,QAAM,OAAO,EAAG,UACjB,CAAC,QAAM,IAAI,EAAG,UACd,CAAC,QAAM,KAAK,EAAG,UACf,CAAC,QAAM,KAAK,EAAG,UACf,CAAC,QAAM,MAAM,EAAG,UAChB,CAAC,QAAM,KAAK,EAAG,UACf,CAAC,QAAM,MAAM,EAAG,UAChB,CAAC,QAAM,SAAS,EAAG,SACrB,EAEO,SAASC,GAAWC,EAAoC,CAC7D,OAAOF,GAAYE,CAAO,CAC5B,CAEO,SAASC,GAAUN,EAA2C,CArOrE,IAAAO,EAsOE,IAAMF,GAAUE,EAAAC,EAAcR,CAAK,IAAnB,KAAAO,EAAwBP,EAClCS,EAAOR,EAAWI,CAAgB,EACxC,OAAOI,EACH,4CAA4C,mBAAmBA,CAAI,CAAC,OACpE,MACN,CAEO,SAASC,GAAUL,EAAoC,CAC5D,OAAOJ,EAAWI,CAAO,CAC3B,CAEO,SAASM,GAAiBN,EAAwB,CACvD,IAAMO,EAAOV,EAAeG,CAAO,EACnC,GAAIO,EAAM,OAAOA,EAAK,YAAY,EAClC,IAAMH,EAAOR,EAAWI,CAAO,EAC/B,OAAII,EAAaA,EAAK,QAAQ,QAAUI,GAAMA,EAAE,YAAY,CAAC,EACtDR,CACT,CAEA,IAAMS,EAAoC,IAAI,IAC9C,OAAW,CAACT,EAASO,CAAI,IAAK,OAAO,QAAQV,CAAc,EACrDU,GAAME,EAAc,IAAIF,EAAK,YAAY,EAAGP,CAAgB,EAElE,OAAW,CAACA,EAASI,CAAI,IAAK,OAAO,QAAQR,CAAU,EAAG,CACxD,IAAMc,EAAMN,GAAA,YAAAA,EAAM,cACdM,GAAO,CAACD,EAAc,IAAIC,CAAG,GAAGD,EAAc,IAAIC,EAAKV,CAAgB,CAC7E,CAEO,SAASG,EAAcC,EAAiC,CAC7D,OAAOK,EAAc,IAAIL,EAAK,YAAY,CAAC,CAC7C,CAEO,SAASO,GAAqBhB,EAAuBiB,EAAc,CAtQ1E,IAAAV,EAuQE,IAAMF,GAAWE,EAAAC,EAAcR,CAAK,IAAnB,KAAAO,EAAwBP,EAEzC,OADkBD,EAAiBM,CAAO,EACvB,CACjB,KAAK,iBAAe,OAClB,OAAOa,EAAqBD,CAAI,EAClC,KAAK,iBAAe,IAClB,OAAOE,EAAkBF,CAAI,EAC/B,QACE,MAAM,IAAI,MAAM,sBAAsBjB,CAAK,EAAE,CACjD,CACF,CAEA,IAAMoB,GAAiB,sBAEhB,SAASD,EAAkBE,EAAe,CAC/C,OAAOD,GAAe,KAAKC,CAAK,CAClC,CAEO,SAASH,EAAqBG,EAAe,CAClD,GAAI,CACF,oBAAQA,CAAK,EACN,EAET,OAASC,EAAG,CACV,MAAO,EACT,CACF,CCjSO,IAAMC,EAAN,cAAuB,KAAM,CAClC,YACEC,EACgBC,EAChB,CACA,MAAMD,CAAO,EAFG,UAAAC,EAGhB,KAAK,KAAO,UACd,CACF,ECMA,IAAMC,GAA4C,CAChD,QAAS,WACT,WAAY,OACZ,WAAY,OACZ,SAAU,OACV,QAAS,OACT,SAAU,MACZ,EAqBO,SAASC,EACdC,EACAC,EAA4B,CAAC,EACrB,CACR,IAAMC,EAASC,IAAA,GAAKL,IAAkBG,GAEtC,OAAID,EAAM,GAAWE,EAAO,QACxBF,EAAM,GAAeE,EAAO,WAAW,QAAQ,MAAO,OAAOF,CAAG,CAAC,EAEjEA,EAAM,KACDE,EAAO,WAAW,QAAQ,MAAO,OAAO,KAAK,MAAMF,EAAM,EAAM,CAAC,CAAC,EAEtEA,EAAM,MACDE,EAAO,SAAS,QAAQ,MAAO,OAAO,KAAK,MAAMF,EAAM,IAAI,CAAC,CAAC,EAElEA,EAAM,QACDE,EAAO,QAAQ,QAAQ,MAAO,OAAO,KAAK,MAAMF,EAAM,KAAG,CAAC,CAAC,EAE7DE,EAAO,SAAS,QAAQ,MAAO,OAAO,KAAK,MAAMF,EAAM,OAAI,CAAC,CAAC,CACtE,CAmBO,SAASI,GAAUJ,EAAaC,EAA4B,CAAC,EAAW,CAC7E,OAAOF,EAAmB,KAAK,MAAMC,EAAM,GAAI,EAAGC,CAAO,CAC3D,CC/EA,SAAsBI,EACpBC,EACAC,EACY,QAAAC,EAAA,sBACZ,GAAI,CAACF,EAAI,WAAW,MAAM,EACxB,MAAM,IAAI,MAAM,6BAA6B,EAG/C,IAAMG,EAAW,MAAM,MAAMH,EAAKI,EAAAC,EAAA,GAC7BJ,GAD6B,CAIhC,QAASK,GAAeL,EAAQ,QAASA,EAAQ,MAAM,CACzD,EAAC,EAED,GAAIE,EAAS,GAEX,OADY,MAAMA,EAAS,KAAK,EAGhC,GAAI,CACF,IAAMI,EAAW,MAAMJ,EAAS,KAAK,EACrC,MAAIA,EAAS,SAAW,IAChB,IAAIK,EACRD,EAAS,SAAWA,EAAS,MAAQJ,EAAS,WAC9CI,EAAS,IACX,EAEI,IAAI,MAAMA,EAAS,SAAWA,EAAS,MAAQJ,EAAS,UAAU,CAC1E,OAASM,EAAG,CACV,MAAMA,CACR,CAEJ,GAEA,SAASH,GACPI,EAAuB,CAAC,EACxBC,EACa,CAEb,IAAMC,EAAW,IAAI,QAAQF,CAAO,EAGpC,OAAKE,EAAS,IAAI,cAAc,IAC1BD,IAAW,SACbC,EAAS,OAAO,eAAgB,gCAAgC,EAEhEA,EAAS,OAAO,eAAgB,mCAAmC,GAIhEA,CACT,CAEA,SAAsBC,GACpBb,EACAC,EACY,QAAAC,EAAA,sBACZ,OAAO,MAAMH,EAAeC,EAAKK,EAAA,CAC/B,OAAQ,OACLJ,EACJ,CACH,GAEA,SAAsBa,GACpBd,EACAe,EACAd,EACY,QAAAC,EAAA,sBACZ,OAAO,MAAMH,EAAeC,EAAKK,EAAA,CAC/B,OAAQ,OACR,KAAM,KAAK,UAAUU,CAAI,GACtBd,EACJ,CACH,GAEA,SAAsBe,GACpBhB,EACAe,EACAd,EACY,QAAAC,EAAA,sBACZ,OAAO,MAAMH,EAAeC,EAAKK,EAAA,CAC/B,OAAQ,MACR,KAAM,KAAK,UAAUU,CAAI,GACtBd,EACJ,CACH,GAEA,SAAsBgB,GACpBjB,EACAC,EACY,QAAAC,EAAA,sBACZ,OAAO,MAAMH,EAAeC,EAAKK,EAAA,CAC/B,OAAQ,UACLJ,EACJ,CACH,GAEA,SAAsBiB,GACpBlB,EACAmB,EACY,QAAAjB,EAAA,sBACZ,OAAO,MAAMH,EAAeC,EAAKmB,CAAI,CACvC,GCzGA,IAAAC,EAAsB,4BAUTC,EAAN,cAA4B,EAAAC,OAAU,CAC3C,YAAYC,EAAuBC,EAAe,CAChD,GAAI,CACF,MAAMD,GAAA,KAAAA,EAAO,EAAGC,CAAI,CACtB,OAASC,EAAG,CACV,QAAQ,MAAM,kCAAmCA,CAAC,EAClD,MAAM,EAAGD,CAAI,CACf,CACF,CACF,EAUaE,EAAiBH,GAAiB,CAC7C,GACgB,OAAOA,GAApB,UAA2B,CAAC,MAAMA,CAAG,GACtCA,aAAeF,GACfE,aAAe,EAAAD,QAEf,MAAO,GAET,GAAiB,OAAOC,GAApB,SACF,MAAO,GAET,IAAMI,EAAW,OAAO,WAAWJ,CAAG,EACtC,MAAO,CAAC,MAAMI,CAAQ,CACxB,EAMMC,GAAkB,CACtB,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,cACF,EAOMC,EAAuC,CAC3CN,EACAO,EAAoB,EACpBC,EAAmC,EAAAT,QAAU,aAC1C,CAEH,IAAMU,EADK,IAAIX,EAAcE,CAAG,EACf,cAAcO,EAAWC,CAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,EACxE,OAAAC,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAE,QAAQ,wBAAyB,GAAG,EACjDA,EAAM,KAAK,GAAG,CACvB,EAQMC,EAAkC,CACtCV,EACAO,EAAoB,IACjB,CACH,IAAMI,EAAK,IAAIb,EAAcE,CAAG,EAChC,OAAOW,EAAG,GAAG,GAAG,EACZA,EAAG,SAAS,EACZA,EAAG,GAAG,GAAG,EACP,GAAGL,EAAqCK,EAAG,IAAI,GAAG,EAAGJ,CAAS,CAAC,IAC/DI,EAAG,GAAG,GAAG,EACP,GAAGL,EAAqCK,EAAG,IAAI,GAAG,EAAGJ,CAAS,CAAC,IAC/DI,EAAG,GAAG,IAAI,EACR,GAAGL,EAAqCK,EAAG,UAAU,GAAG,EAAGJ,CAAS,CAAC,IACrE,GAAGD,EAAqCK,EAAG,UAAU,IAAI,EAAGJ,CAAS,CAAC,GAClF,EAMMK,EAA2C,CAC/CZ,EACAO,EAAoB,IACjB,CACH,IAAMI,EAAK,IAAIb,EAAcE,CAAG,EAChC,GAAIW,EAAG,GAAG,CAAC,EAAG,MAAO,IACrB,GAAM,CAACE,EAAaC,CAAW,EAAIH,EAAG,QAAQ,EAAE,MAAM,GAAG,EACnDI,EAASD,EAAY,MAAM,EAAE,EAC7BE,EAAoBD,EAAO,UAAWf,GAAgBA,IAAR,GAAW,EACzDiB,EAAuB,KAAK,IAChCF,EAAO,OAASC,EAChBT,CACF,EACA,MAAO,GAAGD,EAAqCO,CAAW,CAAC,KACxD,OAAOR,GAAgBW,CAAiB,CAAC,EACzC,OACCD,EACG,MAAMC,EAAmBA,EAAoBC,CAAoB,EACjE,KAAK,EAAE,EACP,QAAQ,SAAU,EAAE,CACzB,CACJ,EAMMC,EAA0C,CAC9ClB,EACAO,IACG,CACH,IAAMY,EAAUnB,EAAI,SAAS,EAAE,MAAM,MAAM,EACrCoB,GACHD,EAAUA,EAAQ,CAAC,EAAE,OAAS,EAAI,GAAKZ,EAC1C,OAAOD,EAAqCN,EAAKoB,CAAoB,CACvE,EAEMC,EAAmB,CAACV,EAAeJ,IACvC,GAAGI,EAAG,MAAM,GAAG,EAAE,cAAcJ,EAAW,EAAAR,QAAU,aAAa,EAAE,SAAS,CAAC,IAyBlEuB,GAAe,CAC1BtB,EAAuB,GACvBuB,EAA+B,CAAE,mBAAoB,EAAM,IACxD,CACH,GAAI,CAACpB,EAAcH,CAAG,EAAG,MAAO,KAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAC1BwB,EAAWb,EAAG,GAAG,CAAC,EAClBc,EAAMd,EAAG,IAAI,EAEbe,EAAYD,EAAI,GAAG,IAAK,EAC1BA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,EAAE,SAAS,EACpD0B,EAAI,GAAG,CAAC,EACNA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,EAAE,SAAS,EACpD0B,EAAI,GAAG,GAAG,EACRA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,EAAE,SAAS,EACpD0B,EAAI,GAAG,GAAG,EACRnB,EAAqCmB,EAAK,CAAC,EAC3Cf,EAAgCe,CAAG,EAE7C,OAAI,OAAOC,CAAS,IAAM,EAAU,GAAGA,CAAS,GAC5CF,EAAiB,IAAIE,CAAS,GAC7BH,GAAA,MAAAA,EAAS,mBACP,IAAIG,CAAS,GADqB,GAAGA,CAAS,EAEvD,EAmBaC,GAAkB,CAC7B3B,EAAuB,GACvBuB,EAA+B,CAAE,mBAAoB,EAAM,IACxD,CACH,GAAI,CAACpB,EAAcH,CAAG,EAAG,MAAO,KAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAC1BwB,EAAWb,EAAG,GAAG,CAAC,EAClBc,EAAMd,EAAG,IAAI,EAEbe,EAAYD,EAAI,GAAG,IAAK,EAC1B,KACAA,EAAI,GAAG,CAAC,EACN,IAAIA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,CAAC,GAC9C0B,EAAI,GAAG,GAAG,EACR,IAAIA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,CAAC,GAC9C0B,EAAI,GAAG,GAAG,EACR,IAAInB,EAAqCmB,EAAK,CAAC,CAAC,GAChD,IAAIf,EAAgCe,CAAG,CAAC,GAElD,OAAaC,IAAT,KAA2BA,EAC3BF,EAAiB,IAAIE,CAAS,GAC7BH,GAAA,MAAAA,EAAS,mBACP,IAAIG,CAAS,GADqBA,CAE3C,EAwBaE,GAAyB,CACpC5B,EAAuB,GACvBuB,EAA+B,CAAE,mBAAoB,EAAM,IACxD,CACH,GAAI,CAACpB,EAAcH,CAAG,EAAG,MAAO,KAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAC1BwB,EAAWb,EAAG,GAAG,CAAC,EAClBc,EAAMd,EAAG,IAAI,EACbkB,EAAaJ,EAAI,IAAI,GAAG,EAAE,aAAa,EAAA1B,QAAU,UAAU,EAAE,MAAM,GAAG,EAEtE2B,EACJD,EAAI,GAAG,IAAI,GAAKA,EAAI,GAAG,IAAK,EACxB,KACAA,EAAI,GAAG,CAAC,EACN,IAAIA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,CAAC,GAC9C0B,EAAI,GAAG,GAAG,EACR,IAAIA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,CAAC,GAC9C0B,EAAI,GAAG,GAAG,EACR,IAAIA,EAAI,cAAc,EAAG,EAAA1B,QAAU,UAAU,CAAC,GAC9C,IAAIW,EAAgCmB,EAAY,CAAC,CAAC,GAE9D,OAAaH,IAAT,KAA2BA,EAC3BF,EAAiB,IAAIE,CAAS,GAC7BH,GAAA,MAAAA,EAAS,mBACP,IAAIG,CAAS,GADqBA,CAE3C,EAcaI,GAAc,CACzB9B,EAAuB,GACvBuB,EAA8B,CAAE,cAAe,EAAK,IACjD,CACH,GAAI,CAACpB,EAAcH,CAAG,EAAG,MAAO,KAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAChC,GAAIW,EAAG,GAAG,CAAC,EAAG,MAAO,KAErB,IAAMc,EAAMd,EAAG,IAAI,EACb,CAAE,cAAAoB,CAAc,EAAIR,EAc1B,MAAO,GAZWE,EAAI,GAAG,IAAI,EACzBb,EAAyCa,EAAKM,EAAgB,EAAI,CAAC,EACnEN,EAAI,GAAG,CAAC,EACNM,EACEzB,EAAqCmB,EAAK,CAAC,EAC3CP,EAAwCO,EAAK,CAAC,EAChDA,EAAI,GAAG,GAAG,GAAKA,EAAI,GAAG,GAAG,EACvBnB,EAAqCmB,EAAKM,EAAgB,EAAI,CAAC,EAC/DN,EAAI,GAAG,GAAG,EACRnB,EAAqCmB,EAAK,CAAC,EAC3Cf,EAAgCe,CAAG,CAE1B,EACrB,EAqBaO,GAAiB,CAC5BhC,EAAuB,GACvBuB,EAA8B,CAAE,cAAe,EAAK,IACjD,CACH,GAAI,CAACpB,EAAcH,CAAG,EAAG,MAAO,KAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAChC,GAAIW,EAAG,GAAG,CAAC,EAAG,MAAO,KAErB,IAAMc,EAAMd,EAAG,IAAI,EACb,CAAE,cAAAoB,CAAc,EAAIR,EAc1B,MAAO,IAZWE,EAAI,GAAG,IAAI,EACzBb,EAAyCa,EAAKM,EAAgB,EAAI,CAAC,EACnEN,EAAI,GAAG,CAAC,EACNM,EACEzB,EAAqCmB,EAAK,CAAC,EAC3CP,EAAwCO,EAAK,CAAC,EAChDA,EAAI,GAAG,GAAG,GAAKA,EAAI,GAAG,GAAG,EACvBnB,EAAqCmB,EAAKM,EAAgB,EAAI,CAAC,EAC/DN,EAAI,GAAG,GAAG,EACRnB,EAAqCmB,EAAK,CAAC,EAC3Cf,EAAgCe,CAAG,CAEzB,EACtB,EAuBaQ,GAAgB,CAC3BjC,EAAuB,GACvBuB,EAAgC,CAAC,IAC9B,CAzaL,IAAAW,EAAAC,EA0aE,GAAI,CAAChC,EAAcH,CAAG,EAAG,MAAO,OAEhC,IAAMW,EAAK,IAAIb,EAAcE,CAAG,EAC1BwB,EAAWb,EAAG,GAAG,CAAC,EAClBc,EAAMd,EAAG,IAAI,EACbyB,EAAOZ,EAAW,IAAMD,GAAA,MAAAA,EAAS,mBAAqB,IAAM,GAElE,OAAIE,EAAI,GAAG,IAAI,EAAU,KACrBA,EAAI,GAAG,GAAG,EACL,GAAGW,CAAI,GAAGf,EAAiBI,GAAKS,EAAAX,GAAA,YAAAA,EAAS,YAAT,KAAAW,EAAsB,CAAC,CAAC,GAC7DT,EAAI,GAAG,GAAG,EACL,GAAGW,CAAI,GAAGf,EAAiBI,GAAKU,EAAAZ,GAAA,YAAAA,EAAS,YAAT,KAAAY,EAAsB,CAAC,CAAC,GAC1D,GAAGC,CAAI,WAChB,EC/aO,SAASC,GAAWC,EAAqB,CAC9C,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAAE,YAAY,CAChE,CAiBO,SAASC,GACdC,EACAC,EAAgB,EAChBC,EAAc,EACN,CACR,OAAOF,EAAQ,MAAM,EAAGC,CAAK,EAAI,MAAQD,EAAQ,MAAM,CAACE,CAAG,CAC7D,CCZO,SAASC,GACdC,EACAC,EAAuB,YACvB,CACA,GAAI,CAACD,EACH,MAAO,GAIT,IAAME,EAAMF,EAAO,MAAM,GAAG,EACtBG,EAAOD,EAAI,CAAC,EACZE,EAAOF,EAAI,CAAC,EACZG,EAAQH,EAAI,CAAC,EAGnB,OAAOD,EACJ,QAAQ,OAAQE,CAAI,EACpB,QAAQ,OAAQC,CAAI,EACpB,QAAQ,QAASC,CAAK,CAC3B,CCxCA,IAAAC,EAIO,6BAEDC,GAAsB,IAAI,IAAY,wBAAsB,EAG5DC,GAAkC,CAAC,GAAG,wBAAsB,EAAE,KAClE,CAACC,EAAGC,IAAMA,EAAE,OAASD,EAAE,MACzB,EAEaE,GAA2B,CACtCC,EACAC,IAC8B,CAC9B,GAAID,IAAU,QAAM,OAAQ,OAE5B,IAAME,EAAaD,EAAe,YAAY,EAE9C,OAAIN,GAAoB,IAAIO,CAAU,EAC7BA,EAGFN,GAAgC,KAAMO,GAAMD,EAAW,SAASC,CAAC,CAAC,CAC3E,EAEaC,GAA2BC,GAC/BA,EACJ,MAAM,GAAG,EACT,IAAKC,GAASA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG,EChCb,IAAAC,EAAsB,6BAsBhBC,EAAqB,6CAMdC,EAAuC,CAClD,OAAQ,CACN,QAAS,mCACT,OAAQ,MACR,SAAU,CACZ,EACA,QAAS,CACP,QAAS,8CACT,OAAQ,MACR,SAAU,CACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,+CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,+CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,8CACT,OAAQ,OACR,SAAU,CACZ,CACF,CACF,EAMaC,EAAyC,CACpD,OAAQ,CACN,QAASF,EACT,OAAQ,MACR,SAAU,EACZ,EACA,QAAS,CACP,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,CACF,CACF,EAMaG,EAAoC,CAC/C,OAAQ,CACN,QAASH,EACT,OAAQ,MACR,SAAU,EACZ,EACA,QAAS,CACP,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,EACA,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,CACF,CACF,EAMaI,EAAyC,CACpD,OAAQ,CACN,QAASJ,EACT,OAAQ,MACR,SAAU,EACZ,EACA,QAAS,CACP,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,CACF,CACF,EAMaK,EAAyC,CACpD,OAAQ,CACN,QAASL,EACT,OAAQ,MACR,SAAU,EACZ,EACA,QAAS,CACP,QAAS,6CACT,OAAQ,OACR,SAAU,EACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,CACF,CACF,EAMaM,EAA0C,CACrD,OAAQ,CACN,QAASN,EACT,OAAQ,OACR,SAAU,EACZ,EACA,QAAS,CACP,QAAS,6CACT,OAAQ,QACR,SAAU,EACZ,EACA,YAAa,CACX,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,EACA,KAAM,CACJ,QAAS,6CACT,OAAQ,OACR,SAAU,CACZ,CACF,CACF,EAMaO,EAA8D,CACzE,CAAC,QAAM,MAAM,EAAGN,EAChB,CAAC,QAAM,QAAQ,EAAGC,EAClB,CAAC,QAAM,OAAO,EAAGC,EACjB,CAAC,QAAM,QAAQ,EAAGC,EAClB,CAAC,QAAM,QAAQ,EAAGC,EAClB,CAAC,QAAM,SAAS,EAAGC,CACrB,EAMO,SAASE,GAAeC,EAA2C,CA5N1E,IAAAC,EA6NE,OAAOA,EAAAH,EAAaE,CAAK,IAAlB,YAAAC,EAAqB,MAC9B,CAEO,SAASC,GAAgBF,EAA2C,CAhO3E,IAAAC,EAiOE,OAAOA,EAAAH,EAAaE,CAAK,IAAlB,YAAAC,EAAqB,OAC9B,CAEO,SAASE,GACdH,EAC6C,CAtO/C,IAAAC,EAuOE,OAAOA,EAAAH,EAAaE,CAAK,IAAlB,YAAAC,EAAqB,WAC9B,CAGO,SAASG,GAAwBJ,EAAwB,CAC9D,IAAMK,EAASP,EAAaE,CAAK,EACjC,OAAKK,EACE,CACLA,EAAO,OAAO,QACdA,EAAO,QAAQ,QACf,GAAG,OAAO,OAAOA,EAAO,WAAW,EAAE,IAAKC,GAAMA,EAAE,OAAO,CAC3D,EALoB,CAAC,CAMvB,CAGO,SAASC,GAAyBP,EAAsC,CAC7E,IAAMK,EAASP,EAAaE,CAAK,EACjC,GAAI,CAACK,EAAQ,MAAO,CAAC,EACrB,IAAMG,EAA8B,CAClC,CAACH,EAAO,OAAO,OAAO,EAAGA,EAAO,OAAO,OACvC,CAACA,EAAO,QAAQ,OAAO,EAAGA,EAAO,QAAQ,MAC3C,EACA,QAAWC,KAAK,OAAO,OAAOD,EAAO,WAAW,EAC9CG,EAAIF,EAAE,OAAO,EAAIA,EAAE,OAErB,OAAOE,CACT,CCjQA,IAAAC,EAAsB,6BAEhBC,GAAmD,CACvD,CAAC,QAAM,MAAM,EAAG,yBAChB,CAAC,QAAM,QAAQ,EAAG,2BAClB,CAAC,QAAM,OAAO,EAAG,8BACjB,CAAC,QAAM,OAAO,EAAG,0BACjB,CAAC,QAAM,eAAe,EAAG,kCACzB,CAAC,QAAM,SAAS,EAAG,2BACnB,CAAC,QAAM,IAAI,EAAG,2BACd,CAAC,QAAM,KAAK,EAAG,8BACf,CAAC,QAAM,QAAQ,EAAG,0BAClB,CAAC,QAAM,aAAa,EAAG,+BACvB,CAAC,QAAM,uBAAuB,EAAG,iCACjC,CAAC,QAAM,wBAAwB,EAAG,iCACpC,EAEMC,GAAwD,CAC5D,CAAC,QAAM,MAAM,EAAG,8BAChB,CAAC,QAAM,QAAQ,EAAG,gCAClB,CAAC,QAAM,OAAO,EAAG,mCACjB,CAAC,QAAM,OAAO,EAAG,+BACjB,CAAC,QAAM,eAAe,EAAG,uCACzB,CAAC,QAAM,SAAS,EAAG,gCACnB,CAAC,QAAM,IAAI,EAAG,gCACd,CAAC,QAAM,KAAK,EAAG,mCACf,CAAC,QAAM,QAAQ,EAAG,+BAClB,CAAC,QAAM,aAAa,EAAG,oCACvB,CAAC,QAAM,uBAAuB,EAAG,sCACjC,CAAC,QAAM,wBAAwB,EAAG,sCACpC,EAEA,SAASC,EACPC,EACAC,EACAC,EACoB,CACpB,IAAMC,EAAOH,EAAKC,CAAO,EACzB,OAAOE,EAAO,GAAGA,CAAI,GAAGD,CAAK,GAAK,MACpC,CAEO,SAASE,GACdH,EACAI,EACoB,CACpB,OAAON,EAAYF,GAAkBI,EAASI,CAAM,CACtD,CAEO,SAASC,GACdL,EACAM,EACoB,CACpB,OAAOR,EAAYD,GAAuBG,EAASM,CAAO,CAC5D,CAEO,SAASC,GAAeC,EAAuB,CACpD,MAAO,2CAA2C,mBAAmBA,CAAK,CAAC,EAC7E,CAEO,SAASC,GAAiBC,EAAmB,CAClD,MAAO,0BAA0B,mBAAmBA,CAAC,CAAC,EACxD,CAEO,SAASC,GAAeC,EAA0B,CACvD,MAAO,iBAAiBA,CAAQ,EAClC,CAEO,SAASC,GAAgBC,EAAoB,CAClD,MAAO,0BAA0BA,CAAE,EACrC,CXzDA,IAAAC,EASO","names":["index_exports","__export","ARBITRUM_TOKENS","AVALANCHE_TOKENS","ApiError","BSC_TOKENS","CHAIN_TOKENS","ETHEREUM_TOKENS","OPTIMISM_TOKENS","SOLANA_TOKENS","SafeBigNumber","accountExplorerUrl","capitalize","chainColor","chainDisplayName","chainIcon","chainIdBySlug","chainSlug","chainToNamespace","formatAge","formatAgeInSeconds","formatAmount","formatAmountUSD","formatAmountUSDCompact","formatPercent","formatPrice","formatPriceUSD","formatSymbol","formatTokenProtocolName","getCommonTokenAddresses","getCommonTokenSymbolsMap","getNativeToken","getStablecoins","getWrappedToken","httpDelete","httpGet","httpMutate","httpPost","httpPut","httpRequest","isValidEvmAddress","isValidNumber","isValidSolanaAddress","isValidWalletAddress","parseTokenProtocolFamily","searchImageUrl","searchTwitterUrl","truncateAddress","twitterTweetUrl","twitterUserUrl","txExplorerUrl","version_default","__toCommonJS","version_default","import_kit","import_types","solanaChains","chainToNamespace","chain","chainSlugs","chainSlugAbbrs","chainColors","chainColor","chainId","chainIcon","_a","chainIdBySlug","slug","chainSlug","chainDisplayName","abbr","c","slugToChainId","key","isValidWalletAddress","addr","isValidSolanaAddress","isValidEvmAddress","EVM_ADDRESS_RE","value","e","ApiError","message","code","defaultLabels","formatAgeInSeconds","age","options","labels","__spreadValues","formatAge","httpRequest","url","options","__async","response","__spreadProps","__spreadValues","_createHeaders","errorMsg","ApiError","e","headers","method","_headers","httpGet","httpPost","data","httpPut","httpDelete","httpMutate","init","import_bignumber","SafeBigNumber","BigNumber","num","base","e","isValidNumber","floatNum","subscriptDigits","stringifyNumberWithGroupingSeparator","precision","rounding","parts","stringifyNumberWithAbbreviation","bn","stringifyNumberWithLeadingZeroSubscripts","integerPart","decimalPart","digits","firstNonZeroIndex","precisionDigitsCount","stringifyNumberWithSignificantPrecision","matched","significantPrecision","stringifyPercent","formatAmount","options","negative","abs","formatted","formatAmountUSD","formatAmountUSDCompact","roundedAbs","formatPrice","isHighPrecise","formatPriceUSD","formatPercent","_a","_b","sign","capitalize","str","truncateAddress","address","start","end","formatSymbol","symbol","formatString","arr","type","base","quote","import_types","SOLANA_PROTOCOL_SET","SOLANA_PROTOCOLS_BY_SPECIFICITY","a","b","parseTokenProtocolFamily","chain","protocolFamily","normalized","p","formatTokenProtocolName","protocol","word","import_types","EVM_NATIVE_ADDRESS","SOLANA_TOKENS","ETHEREUM_TOKENS","BSC_TOKENS","ARBITRUM_TOKENS","OPTIMISM_TOKENS","AVALANCHE_TOKENS","CHAIN_TOKENS","getNativeToken","chain","_a","getWrappedToken","getStablecoins","getCommonTokenAddresses","tokens","t","getCommonTokenSymbolsMap","map","import_types","TX_EXPLORER_URLS","ACCOUNT_EXPLORER_URLS","explorerUrl","urls","chainId","value","base","txExplorerUrl","txHash","accountExplorerUrl","account","searchImageUrl","image","searchTwitterUrl","q","twitterUserUrl","username","twitterTweetUrl","id","import_lodash_es"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/chain.ts","../src/errors.ts","../src/dateTime.ts","../src/fetch.ts","../src/number.ts","../src/string.ts","../src/symbol.ts","../src/tokenProtocols.ts","../src/tokens.ts","../src/urls.ts","../src/timing.ts","../src/collection.ts"],"sourcesContent":["export { default as version } from \"./version\";\nexport * from \"./chain\";\nexport * from \"./errors\";\nexport * from \"./dateTime\";\nexport * from \"./fetch\";\nexport * from \"./number\";\nexport * from \"./string\";\nexport * from \"./symbol\";\nexport * from \"./tokenProtocols\";\nexport * from \"./tokens\";\nexport * from \"./urls\";\n\nexport { throttle, debounce } from \"./timing\";\nexport {\n uniqBy,\n intersectionBy,\n keyBy,\n groupBy,\n mapKeys,\n mapValues,\n} from \"./collection\";\n","declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/utils\"] = \"0.1.30\";\n}\n\nexport default \"0.1.30\";\n","import { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst solanaChains: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\n/** Returns the chain namespace (EVM or SOLANA) for a given chain */\nexport function chainToNamespace(chain: Chain): ChainNamespace {\n return solanaChains.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst chainSlugs: Partial<Record<Chain, string>> = {\n [Chain.ETHEREUM]: \"ethereum\",\n [Chain.UBIQ]: \"ubiq\",\n [Chain.OPTIMISM]: \"optimism\",\n [Chain.FLARE]: \"flare\",\n [Chain.SONGBIRD]: \"songbird\",\n [Chain.ELASTOS]: \"elastos\",\n [Chain.KARDIA]: \"kardia\",\n [Chain.CRONOS]: \"cronos\",\n [Chain.RSK]: \"rsk\",\n [Chain.TELOS]: \"telos\",\n [Chain.LUKSO]: \"lukso\",\n [Chain.CRAB]: \"crab\",\n [Chain.DARWINIA]: \"darwinia\",\n [Chain.XDC]: \"xdc\",\n [Chain.CSC]: \"csc\",\n [Chain.ZYX]: \"zyx\",\n [Chain.BINANCE]: \"binance\",\n [Chain.SYSCOIN]: \"syscoin\",\n [Chain.GOCHAIN]: \"gochain\",\n [Chain.ETHEREUMCLASSIC]: \"ethereumclassic\",\n [Chain.OKEXCHAIN]: \"okexchain\",\n [Chain.HOO]: \"hoo\",\n [Chain.METER]: \"meter\",\n [Chain.NOVA_NETWORK]: \"nova network\",\n [Chain.TOMOCHAIN]: \"tomochain\",\n [Chain.BITKUB]: \"bitkub\",\n [Chain.XDAI]: \"xdai\",\n [Chain.SOLANA]: \"solana\",\n [Chain.VELAS]: \"velas\",\n [Chain.THUNDERCORE]: \"thundercore\",\n [Chain.ENULS]: \"enuls\",\n [Chain.FUSE]: \"fuse\",\n [Chain.HECO]: \"heco\",\n [Chain.UNICHAIN]: \"unichain\",\n [Chain.POLYGON]: \"polygon\",\n [Chain.SONIC]: \"sonic\",\n [Chain.SHIMMER_EVM]: \"shimmer_evm\",\n [Chain.RBN]: \"rbn\",\n [Chain.OMNI]: \"omni\",\n [Chain.MANTA]: \"manta\",\n [Chain.HSK]: \"hsk\",\n [Chain.WATER]: \"water\",\n [Chain.XLAYER]: \"xlayer\",\n [Chain.XDAIARB]: \"xdaiarb\",\n [Chain.OP_BNB]: \"op_bnb\",\n [Chain.VINUCHAIN]: \"vinuchain\",\n [Chain.ENERGYWEB]: \"energyweb\",\n [Chain.OASYS]: \"oasys\",\n [Chain.FANTOM]: \"fantom\",\n [Chain.FRAXTAL]: \"fraxtal\",\n [Chain.HPB]: \"hpb\",\n [Chain.BOBA]: \"boba\",\n [Chain.OMAX]: \"omax\",\n [Chain.FILECOIN]: \"filecoin\",\n [Chain.KUCOIN]: \"kucoin\",\n [Chain.ZKSYNC_ERA]: \"zksync era\",\n [Chain.SHIDEN]: \"shiden\",\n [Chain.THETA]: \"theta\",\n [Chain.PULSE]: \"pulse\",\n [Chain.CRONOS_ZKEVM]: \"cronos zkevm\",\n [Chain.SX]: \"sx\",\n [Chain.AREON]: \"areon\",\n [Chain.WC]: \"wc\",\n [Chain.CANDLE]: \"candle\",\n [Chain.ROLLUX]: \"rollux\",\n [Chain.ASTAR]: \"astar\",\n [Chain.REDSTONE]: \"redstone\",\n [Chain.MATCHAIN]: \"matchain\",\n [Chain.CALLISTO]: \"callisto\",\n [Chain.TARA]: \"tara\",\n [Chain.WANCHAIN]: \"wanchain\",\n [Chain.LYRA_CHAIN]: \"lyra chain\",\n [Chain.BIFROST]: \"bifrost\",\n [Chain.CONFLUX]: \"conflux\",\n [Chain.METIS]: \"metis\",\n [Chain.DYMENSION]: \"dymension\",\n [Chain.POLYGON_ZKEVM]: \"polygon zkevm\",\n [Chain.CORE]: \"core\",\n [Chain.LISK]: \"lisk\",\n [Chain.ULTRON]: \"ultron\",\n [Chain.STEP]: \"step\",\n [Chain.MOONBEAM]: \"moonbeam\",\n [Chain.MOONRIVER]: \"moonriver\",\n [Chain.SEI]: \"sei\",\n [Chain.LIVING_ASSETS_MAINNET]: \"living assets mainnet\",\n [Chain.STY]: \"sty\",\n [Chain.TENET]: \"tenet\",\n [Chain.GRAVITY]: \"gravity\",\n [Chain.REYA_NETWORK]: \"reya network\",\n [Chain.SONEIUM]: \"soneium\",\n [Chain.SWELLCHAIN]: \"swellchain\",\n [Chain.ONUS]: \"onus\",\n [Chain.HUBBLENET]: \"hubblenet\",\n [Chain.SANKO]: \"sanko\",\n [Chain.DOGECHAIN]: \"dogechain\",\n [Chain.MILKOMEDA]: \"milkomeda\",\n [Chain.MILKOMEDA_A1]: \"milkomeda_a1\",\n [Chain.KAVA]: \"kava\",\n [Chain.SOMA]: \"soma\",\n [Chain.KARAK]: \"karak\",\n [Chain.ABSTRACT]: \"abstract\",\n [Chain.MORPH]: \"morph\",\n [Chain.CROSSFI]: \"crossfi\",\n [Chain.BEAM]: \"beam\",\n [Chain.IOTEX]: \"iotex\",\n [Chain.MANTLE]: \"mantle\",\n [Chain.XLC]: \"xlc\",\n [Chain.NAHMII]: \"nahmii\",\n [Chain.BOUNCEBIT]: \"bouncebit\",\n [Chain.TOMBCHAIN]: \"tombchain\",\n [Chain.ZETACHAIN]: \"zetachain\",\n [Chain.PLANQ]: \"planq\",\n [Chain.BITROCK]: \"bitrock\",\n [Chain.XSAT]: \"xsat\",\n [Chain.CYETH]: \"cyeth\",\n [Chain.CANTO]: \"canto\",\n [Chain.KLAYTN]: \"klaytn\",\n [Chain.THAT]: \"that\",\n [Chain.BASE]: \"base\",\n [Chain.HELA]: \"hela\",\n [Chain.IOTAEVM]: \"iotaevm\",\n [Chain.JBC]: \"jbc\",\n [Chain.EVMOS]: \"evmos\",\n [Chain.CARBON]: \"carbon\",\n [Chain.SMARTBCH]: \"smartbch\",\n [Chain.ARTELA]: \"artela\",\n [Chain.IMMUTABLE_ZKEVM]: \"immutable zkevm\",\n [Chain.LOOP]: \"loop\",\n [Chain.GENESYS]: \"genesys\",\n [Chain.EOS_EVM]: \"eos evm\",\n [Chain.MAP_PROTOCOL]: \"map protocol\",\n [Chain.SAPPHIRE]: \"sapphire\",\n [Chain.BITGERT]: \"bitgert\",\n [Chain.FUSION]: \"fusion\",\n [Chain.ZILLIQA]: \"zilliqa\",\n [Chain.APECHAIN]: \"apechain\",\n [Chain.EDU_CHAIN]: \"edu chain\",\n [Chain.ARBITRUM]: \"arbitrum\",\n [Chain.ARBITRUM_NOVA]: \"arbitrum nova\",\n [Chain.CELO]: \"celo\",\n [Chain.OASIS]: \"oasis\",\n [Chain.ASSETCHAIN]: \"assetchain\",\n [Chain.ETHERLINK]: \"etherlink\",\n [Chain.AVALANCHE]: \"avalanche\",\n [Chain.REI]: \"rei\",\n [Chain.ZIRCUIT]: \"zircuit\",\n [Chain.SOPHON]: \"sophon\",\n [Chain.ETN]: \"etn\",\n [Chain.SUPERPOSITION]: \"superposition\",\n [Chain.REICHAIN]: \"reichain\",\n [Chain.BOBA_BNB]: \"boba_bnb\",\n [Chain.INK]: \"ink\",\n [Chain.LINEA]: \"linea\",\n [Chain.BOB]: \"bob\",\n [Chain.GODWOKEN]: \"godwoken\",\n [Chain.BERACHAIN]: \"berachain\",\n [Chain.BLAST]: \"blast\",\n [Chain.CHILIZ]: \"chiliz\",\n [Chain.STRATIS]: \"stratis\",\n [Chain.REAL]: \"real\",\n [Chain.ODYSSEY]: \"odyssey\",\n [Chain.TAIKO]: \"taiko\",\n [Chain.BITLAYER]: \"bitlayer\",\n [Chain.HYDRATION]: \"hydration\",\n [Chain.PAREX]: \"parex\",\n [Chain.POLIS]: \"polis\",\n [Chain.KEKCHAIN]: \"kekchain\",\n [Chain.SCROLL]: \"scroll\",\n [Chain.ZERO_NETWORK]: \"zero_network\",\n [Chain.ZKLINK_NOVA]: \"zklink nova\",\n [Chain.VISION]: \"vision\",\n [Chain.SAAKURU]: \"saakuru\",\n [Chain.ZORA]: \"zora\",\n [Chain.CORN]: \"corn\",\n [Chain.NEON]: \"neon\",\n [Chain.LUMIA]: \"lumia\",\n [Chain.AURORA]: \"aurora\",\n [Chain.HARMONY]: \"harmony\",\n [Chain.PALM]: \"palm\",\n [Chain.ZENIQ]: \"zeniq\",\n [Chain.CURIO]: \"curio\",\n [Chain.MODE]: \"mode\",\n};\n\nconst chainSlugAbbrs: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"sol\",\n [Chain.ETHEREUM]: \"eth\",\n [Chain.BINANCE]: \"bsc\",\n [Chain.ARBITRUM]: \"arb\",\n [Chain.OPTIMISM]: \"opt\",\n [Chain.AVALANCHE]: \"avax\",\n};\n\nconst chainColors: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"#9945FF\",\n [Chain.ETHEREUM]: \"#627EEA\",\n [Chain.BINANCE]: \"#F0B90B\",\n [Chain.ARBITRUM]: \"#28A0F0\",\n [Chain.OPTIMISM]: \"#FF0420\",\n [Chain.AVALANCHE]: \"#E84142\",\n [Chain.POLYGON]: \"#8247E5\",\n [Chain.BASE]: \"#0052FF\",\n [Chain.SONIC]: \"#5B6EF5\",\n [Chain.LINEA]: \"#61DFFF\",\n [Chain.SCROLL]: \"#FFEEDA\",\n [Chain.BLAST]: \"#FCFC03\",\n [Chain.CRONOS]: \"#002D74\",\n [Chain.BERACHAIN]: \"#964B00\",\n};\n\nexport function chainColor(chainId: Chain): string | undefined {\n return chainColors[chainId];\n}\n\nexport function chainIcon(chain: Chain | string): string | undefined {\n const chainId = chainIdBySlug(chain) ?? chain;\n const slug = chainSlugs[chainId as Chain];\n return slug\n ? `https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(slug)}.jpg`\n : undefined;\n}\n\nexport function chainSlug(chainId: Chain): string | undefined {\n return chainSlugs[chainId];\n}\n\nexport function chainDisplayName(chainId: Chain): string {\n const abbr = chainSlugAbbrs[chainId];\n if (abbr) return abbr.toUpperCase();\n const slug = chainSlugs[chainId];\n if (slug) return slug.replace(/\\b\\w/g, (c) => c.toUpperCase());\n return chainId;\n}\n\nconst slugToChainId: Map<string, Chain> = new Map();\nfor (const [chainId, abbr] of Object.entries(chainSlugAbbrs)) {\n if (abbr) slugToChainId.set(abbr.toLowerCase(), chainId as Chain);\n}\nfor (const [chainId, slug] of Object.entries(chainSlugs)) {\n const key = slug?.toLowerCase();\n if (key && !slugToChainId.has(key)) slugToChainId.set(key, chainId as Chain);\n}\n\nexport function chainIdBySlug(slug: string): Chain | undefined {\n return slugToChainId.get(slug.toLowerCase());\n}\n\nexport function isValidWalletAddress(chain: Chain | string, addr: string) {\n const chainId = (chainIdBySlug(chain) ?? chain) as Chain;\n const namespace = chainToNamespace(chainId);\n switch (namespace) {\n case ChainNamespace.SOLANA:\n return isValidSolanaAddress(addr);\n case ChainNamespace.EVM:\n return isValidEvmAddress(addr);\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n}\n\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport function isValidEvmAddress(value: string) {\n return EVM_ADDRESS_RE.test(value);\n}\n\nconst SOLANA_BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nexport function isValidSolanaAddress(value: string): boolean {\n return SOLANA_BASE58_RE.test(value);\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n public readonly code: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n","const MINUTE = 60;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst YEAR = 365 * DAY;\n\nexport interface FormatAgeOptions {\n justNow?: string;\n secondsAgo?: string;\n minutesAgo?: string;\n hoursAgo?: string;\n daysAgo?: string;\n yearsAgo?: string;\n}\n\nconst defaultLabels: Required<FormatAgeOptions> = {\n justNow: \"just now\",\n secondsAgo: \"{n}s\",\n minutesAgo: \"{n}m\",\n hoursAgo: \"{n}h\",\n daysAgo: \"{n}d\",\n yearsAgo: \"{n}y\",\n};\n\n/**\n * Formats an age (elapsed time) given in **seconds** into a compact\n * human-readable string like \"3m\", \"2h\", or \"just now\".\n *\n * Use this when you already have the elapsed time in seconds (e.g. from\n * a server-provided `age` field). If you have milliseconds instead, use\n * {@link formatAge}.\n *\n * @example\n * formatAgeInSeconds(5) // \"just now\" (< 10s)\n * formatAgeInSeconds(45) // \"45s\"\n * formatAgeInSeconds(120) // \"2m\"\n * formatAgeInSeconds(7200) // \"2h\"\n * formatAgeInSeconds(172800) // \"2d\"\n * formatAgeInSeconds(63072000) // \"2y\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAgeInSeconds(120, { minutesAgo: \"{n} minutes ago\" }) // \"2 minutes ago\"\n */\nexport function formatAgeInSeconds(\n age: number,\n options: FormatAgeOptions = {},\n): string {\n const labels = { ...defaultLabels, ...options };\n\n if (age < 10) return labels.justNow;\n if (age < MINUTE) return labels.secondsAgo.replace(\"{n}\", String(age));\n\n if (age < HOUR) {\n return labels.minutesAgo.replace(\"{n}\", String(Math.floor(age / MINUTE)));\n }\n if (age < DAY) {\n return labels.hoursAgo.replace(\"{n}\", String(Math.floor(age / HOUR)));\n }\n if (age < YEAR) {\n return labels.daysAgo.replace(\"{n}\", String(Math.floor(age / DAY)));\n }\n return labels.yearsAgo.replace(\"{n}\", String(Math.floor(age / YEAR)));\n}\n\n/**\n * Formats an age (elapsed time) given in **milliseconds** into a compact\n * human-readable string. Internally converts to seconds and delegates to\n * {@link formatAgeInSeconds}.\n *\n * This is the primary function used across UI components to display how\n * long ago something happened (e.g. a trade, a tweet, a channel update).\n *\n * @example\n * formatAge(3000) // \"just now\" (3 s < 10 s threshold)\n * formatAge(45000) // \"45s\"\n * formatAge(120000) // \"2m\"\n * formatAge(7200000) // \"2h\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAge(120000, { minutesAgo: \"{n} 分钟前\" }) // \"2 分钟前\"\n */\nexport function formatAge(age: number, options: FormatAgeOptions = {}): string {\n return formatAgeInSeconds(Math.floor(age / 1000), options);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from \"./errors\";\n\nexport async function httpRequest<R = any>(\n url: string,\n options: RequestInit,\n): Promise<R> {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n // const urlInstance = new URL(url);\n const response = await fetch(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n } else {\n try {\n const errorMsg = await response.json();\n if (response.status === 400) {\n throw new ApiError(\n errorMsg.message || errorMsg.code || response.statusText,\n errorMsg.code,\n );\n }\n throw new Error(errorMsg.message || errorMsg.code || response.statusText);\n } catch (e) {\n throw e;\n }\n }\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string,\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nexport async function httpGet<R = any>(\n url: string,\n options?: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function httpPost<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpPut<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpDelete<R = any>(\n url: string,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"DELETE\",\n ...options,\n });\n}\n\nexport async function httpMutate<R = any>(\n url: string,\n init: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, init);\n}\n","import BigNumber from \"bignumber.js\";\n\n// ---------------------------------------------------------------------------\n// SafeBigNumber\n// ---------------------------------------------------------------------------\n\n/**\n * A `BigNumber` subclass that never throws on construction.\n * Invalid / undefined values fall back to `0`.\n */\nexport class SafeBigNumber extends BigNumber {\n constructor(num?: BigNumber.Value, base?: number) {\n try {\n super(num ?? 0, base);\n } catch (e) {\n console.error(\"SafeBigNumber constructor error\", e);\n super(0, base);\n }\n }\n}\n\ndeclare namespace SafeBigNumber {\n type Value = BigNumber.Value;\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport const isValidNumber = (num: unknown) => {\n if (\n (\"number\" === typeof num && !isNaN(num)) ||\n num instanceof SafeBigNumber ||\n num instanceof BigNumber\n ) {\n return true;\n }\n if (\"string\" !== typeof num) {\n return false;\n }\n const floatNum = Number.parseFloat(num);\n return !isNaN(floatNum);\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst subscriptDigits = [\n \"₀\",\n \"₁\",\n \"₂\",\n \"₃\",\n \"₄\",\n \"₅\",\n \"₆\",\n \"₇\",\n \"₈\",\n \"₉\",\n \"₁₀\",\n \"₁₁\",\n \"₁₂\",\n \"₁₃\",\n \"₁₄\",\n \"₁₅\",\n \"₁₆\",\n \"₁₇\",\n \"₁₈\",\n \"₁₉\",\n \"₂₀\",\n \"₂₁\",\n \"₂₂\",\n \"₂₃\",\n \"₂₄\",\n \"₂₅\",\n \"₂₆\",\n \"₂₇\",\n \"₂₈\",\n \"₂₉\",\n \"₃₀\",\n \"₃₁\",\n \"₃₂\",\n \"₃₃\",\n \"₃₄\",\n \"₃₅\",\n \"₃₆\",\n \"₃₇\",\n \"₃₈\",\n \"₃₉\",\n \"₄₀\",\n];\n\n/**\n * Add thousand-separators (commas) and truncate to `precision` decimals.\n *\n * stringifyNumberWithGroupingSeparator(12345.6789, 2) → \"12,345.67\"\n */\nconst stringifyNumberWithGroupingSeparator = (\n num: BigNumber.Value,\n precision: number = 0,\n rounding: BigNumber.RoundingMode = BigNumber.ROUND_DOWN,\n) => {\n const bn = new SafeBigNumber(num);\n const parts = bn.decimalPlaces(precision, rounding).toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n};\n\n/**\n * Abbreviate large numbers with K / M / B / T suffixes.\n *\n * stringifyNumberWithAbbreviation(1234) → \"1.2K\"\n * stringifyNumberWithAbbreviation(5_600_000) → \"5.6M\"\n */\nconst stringifyNumberWithAbbreviation = (\n num: BigNumber.Value,\n precision: number = 1,\n) => {\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? bn.toNumber()\n : bn.lt(1e6)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e3), precision)}K`\n : bn.lt(1e9)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e6), precision)}M`\n : bn.lt(1e12)\n ? `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e9), precision)}B`\n : `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e12), precision)}T`;\n};\n\n/**\n * Display tiny decimals with Unicode subscript zero-count notation.\n * E.g. `0.00000382` → `\"0.0₅382\"` (5 leading zeros after the decimal).\n */\nconst stringifyNumberWithLeadingZeroSubscripts = (\n num: BigNumber.Value,\n precision: number = 5,\n) => {\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return \"0\";\n const [integerPart, decimalPart] = bn.toFixed().split(\".\");\n const digits = decimalPart.split(\"\");\n const firstNonZeroIndex = digits.findIndex((num) => \"0\" !== num);\n const precisionDigitsCount = Math.min(\n digits.length - firstNonZeroIndex,\n precision,\n );\n return `${stringifyNumberWithGroupingSeparator(integerPart)}.0`\n .concat(subscriptDigits[firstNonZeroIndex])\n .concat(\n digits\n .slice(firstNonZeroIndex, firstNonZeroIndex + precisionDigitsCount)\n .join(\"\")\n .replace(/\\.?0+$/, \"\"),\n );\n};\n\n/**\n * Round to `precision` *significant* decimal digits (skipping leading zeros).\n * E.g. `0.00456` with precision 2 → keeps 5 decimal places → `\"0.00456\"`.\n */\nconst stringifyNumberWithSignificantPrecision = (\n num: BigNumber,\n precision: number,\n) => {\n const matched = num.toString().match(/\\.0*/);\n const significantPrecision =\n (matched ? matched[0].length - 1 : 0) + precision;\n return stringifyNumberWithGroupingSeparator(num, significantPrecision);\n};\n\nconst stringifyPercent = (bn: BigNumber, precision: number) =>\n `${bn.times(100).decimalPlaces(precision, BigNumber.ROUND_HALF_UP).toString()}%`;\n\n// ---------------------------------------------------------------------------\n// Public formatting functions\n// ---------------------------------------------------------------------------\n\nexport type FormatAmountOptions = {\n showPlusGtThanZero: boolean;\n};\n\n/**\n * Format a raw token / asset amount (no currency symbol).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | 5 decimal places | 0.0001234 → \"0.00012\" |\n * | < 1 | 3 decimal places | 0.56789 → \"0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"42.67\" |\n * | < 100 000 | grouped, 2 dp | 12345.6 → \"12,345.60\" |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | 1_500_000 → \"1.5M\" |\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmount = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? abs.decimalPlaces(5, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1)\n ? abs.decimalPlaces(3, BigNumber.ROUND_DOWN).toString()\n : abs.lt(100)\n ? abs.decimalPlaces(2, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n if (Number(formatted) === 0) return `${formatted}`;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return `${formatted}`;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix (standard precision).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 10 000 | grouped, 2 dp | 1234.5 → \"$1,234.50\" |\n * | ≥ 10 000 | abbreviated (K/M/B/T) | 1_500_000 → \"$1.5M\" |\n *\n * Use this for standard financial displays (volume, market cap, liquidity).\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSD = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e4)\n ? `$${stringifyNumberWithGroupingSeparator(abs, 2)}`\n : `$${stringifyNumberWithAbbreviation(abs)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix — **compact** variant.\n *\n * Compared to {@link formatAmountUSD}, this variant is more aggressively\n * rounded and suited for space-constrained UIs (cards, badges, list items):\n *\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 1 000 | 0 decimal places | 567.89 → \"$567\" |\n * | ≥ 1 000 | abbreviated, 0 dp, | 15 678 → \"$15.6K\" |\n * | | rounded to nearest 100 | 1 234 567 → \"$1.2M\" |\n *\n * Key differences from `formatAmountUSD`:\n * - 100–1 000: shows 0 dp instead of 2 dp\n * - ≥ 1 000: abbreviates earlier (1K vs 10K) with 0 precision, rounded to 100s\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSDCompact = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const roundedAbs = abs.div(100).integerValue(BigNumber.ROUND_DOWN).times(100);\n\n const formatted =\n abs.lt(1e-4) || abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e3)\n ? `$${abs.decimalPlaces(0, BigNumber.ROUND_DOWN)}`\n : `$${stringifyNumberWithAbbreviation(roundedAbs, 0)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\nexport type FormatPriceOptions = {\n isHighPrecise: boolean;\n};\n\n/**\n * Format a token price (no currency symbol).\n *\n * Same precision tiers as {@link formatPriceUSD} but without the \"$\" prefix.\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPrice = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `${formatted}`;\n};\n\n/**\n * Format a token price with \"$\" prefix.\n *\n * Two precision modes controlled by `isHighPrecise` (default: `true`):\n *\n * | Range | High precision (default) | Low precision |\n * |---------------|-------------------------------|------------------------------|\n * | < 0.0001 | subscript notation, 4 sig | subscript notation, 2 sig |\n * | | 0.0000382 → \"$0.0₄382\" | 0.0000382 → \"$0.0₄38\" |\n * | < 1 | 4 dp, grouped | 2 significant dp |\n * | | 0.12345 → \"$0.1234\" | 0.12345 → \"$0.12\" |\n * | < 10 000 | 4 dp, grouped | 2 dp, grouped |\n * | | 1234.567 → \"$1,234.5670\" | 1234.567 → \"$1,234.56\" |\n * | < 100 000 | 2 dp, grouped | 2 dp, grouped |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | abbreviated (K/M/B/T) |\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPriceUSD = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `$${formatted}`;\n};\n\nexport type FormatPercentOptions = {\n showPlusGtThanZero?: boolean;\n precision?: number;\n};\n\n/**\n * Format a ratio as a percentage string.\n *\n * The input is a **ratio** (0.3 = 30%, 1.5 = 150%).\n *\n * | Input range | Output example |\n * |---------------|-----------------------------------------|\n * | < 0.0001 | \"0%\" |\n * | < 100 | \"56.79%\" (2 dp by default) |\n * | < 1000 | \"15,000.5%\" (1 dp by default) |\n * | ≥ 1000 | \"> 99,999%\" |\n *\n * @param num - The ratio value (0.3 means 30%).\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n * @param options.precision - Decimal precision override.\n */\nexport const formatPercent = (\n num: BigNumber.Value = \"\",\n options: FormatPercentOptions = {},\n) => {\n if (!isValidNumber(num)) return \"-- %\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const sign = negative ? \"-\" : options?.showPlusGtThanZero ? \"+\" : \"\";\n\n if (abs.lt(1e-4)) return \"0%\";\n if (abs.lt(100))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 2)}`;\n if (abs.lt(1e3))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 1)}`;\n return `${sign}> 99,999%`;\n};\n","/**\n * Capitalize the first letter of a string, lowercasing the rest.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n * capitalize(\"hELLO\") // \"Hello\"\n * capitalize(\"solana\") // \"Solana\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Truncate an address (or any string) to show the first `start` and last `end`\n * characters with \"...\" in between.\n *\n * @param address - The full address string.\n * @param start - Number of characters to keep from the beginning (default 6).\n * @param end - Number of characters to keep from the end (default 4).\n *\n * @example\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\")\n * // \"0x1234...5678\"\n *\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\", 4, 4)\n * // \"0x12...5678\"\n */\nexport function truncateAddress(\n address: string,\n start: number = 6,\n end: number = 4,\n): string {\n return address.slice(0, start) + \"...\" + address.slice(-end);\n}\n","/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import {\n Chain,\n SOLANA_TOKEN_PROTOCOLS,\n TokenProtocol,\n} from \"@liberfi.io/types\";\n\nconst SOLANA_PROTOCOL_SET = new Set<string>(SOLANA_TOKEN_PROTOCOLS);\n\n/** Sorted by length descending so \"pump-amm\" is tested before \"pump\". */\nconst SOLANA_PROTOCOLS_BY_SPECIFICITY = [...SOLANA_TOKEN_PROTOCOLS].sort(\n (a, b) => b.length - a.length,\n);\n\nexport const parseTokenProtocolFamily = (\n chain: Chain,\n protocolFamily: string,\n): TokenProtocol | undefined => {\n if (chain !== Chain.SOLANA) return undefined;\n\n const normalized = protocolFamily.toLowerCase();\n\n if (SOLANA_PROTOCOL_SET.has(normalized)) {\n return normalized as TokenProtocol;\n }\n\n return SOLANA_PROTOCOLS_BY_SPECIFICITY.find((p) => normalized.includes(p));\n};\n\nexport const formatTokenProtocolName = (protocol: TokenProtocol): string => {\n return protocol\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n};\n","import { Chain } from \"@liberfi.io/types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PredefinedToken {\n address: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface ChainPredefinedTokens {\n native: PredefinedToken;\n wrapped: PredefinedToken;\n stablecoins: Record<string, PredefinedToken>;\n}\n\n// ---------------------------------------------------------------------------\n// EVM common\n// ---------------------------------------------------------------------------\n\nconst EVM_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\n// ---------------------------------------------------------------------------\n// Solana\n// ---------------------------------------------------------------------------\n\nexport const SOLANA_TOKENS: ChainPredefinedTokens = {\n native: {\n address: \"11111111111111111111111111111111\",\n symbol: \"SOL\",\n decimals: 9,\n },\n wrapped: {\n address: \"So11111111111111111111111111111111111111112\",\n symbol: \"SOL\",\n decimals: 9,\n },\n stablecoins: {\n USDC: {\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n symbol: \"USDT\",\n decimals: 6,\n },\n USD1: {\n address: \"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB\",\n symbol: \"USD1\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Ethereum\n// ---------------------------------------------------------------------------\n\nexport const ETHEREUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// BSC (Binance Smart Chain)\n// ---------------------------------------------------------------------------\n\nexport const BSC_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"BNB\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n symbol: \"WBNB\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\",\n symbol: \"USDC\",\n decimals: 18,\n },\n USDT: {\n address: \"0x55d398326f99059fF775485246999027B3197955\",\n symbol: \"USDT\",\n decimals: 18,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrum\n// ---------------------------------------------------------------------------\n\nexport const ARBITRUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Optimism\n// ---------------------------------------------------------------------------\n\nexport const OPTIMISM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x4200000000000000000000000000000000000006\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Avalanche\n// ---------------------------------------------------------------------------\n\nexport const AVALANCHE_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"AVAX\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n symbol: \"WAVAX\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Chain -> Tokens index\n// ---------------------------------------------------------------------------\n\nexport const CHAIN_TOKENS: Partial<Record<Chain, ChainPredefinedTokens>> = {\n [Chain.SOLANA]: SOLANA_TOKENS,\n [Chain.ETHEREUM]: ETHEREUM_TOKENS,\n [Chain.BINANCE]: BSC_TOKENS,\n [Chain.ARBITRUM]: ARBITRUM_TOKENS,\n [Chain.OPTIMISM]: OPTIMISM_TOKENS,\n [Chain.AVALANCHE]: AVALANCHE_TOKENS,\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nexport function getNativeToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.native;\n}\n\nexport function getWrappedToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.wrapped;\n}\n\nexport function getStablecoins(\n chain: Chain,\n): Record<string, PredefinedToken> | undefined {\n return CHAIN_TOKENS[chain]?.stablecoins;\n}\n\n/** Returns all predefined token addresses for the given chain (native + wrapped + stablecoins). */\nexport function getCommonTokenAddresses(chain: Chain): string[] {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return [];\n return [\n tokens.native.address,\n tokens.wrapped.address,\n ...Object.values(tokens.stablecoins).map((t) => t.address),\n ];\n}\n\n/** Returns an address -> symbol map for all predefined tokens on the given chain. */\nexport function getCommonTokenSymbolsMap(chain: Chain): Record<string, string> {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return {};\n const map: Record<string, string> = {\n [tokens.native.address]: tokens.native.symbol,\n [tokens.wrapped.address]: tokens.wrapped.symbol,\n };\n for (const t of Object.values(tokens.stablecoins)) {\n map[t.address] = t.symbol;\n }\n return map;\n}\n","import { Chain } from \"@liberfi.io/types\";\n\nconst TX_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/tx/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/tx/\",\n [Chain.POLYGON]: \"https://polygonscan.com/tx/\",\n [Chain.BINANCE]: \"https://bscscan.com/tx/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/tx/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/tx/\",\n [Chain.BASE]: \"https://basescan.org/tx/\",\n [Chain.BLAST]: \"https://blastracker.xyz/tx/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/tx/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/tx/\",\n};\n\nconst ACCOUNT_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/account/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/address/\",\n [Chain.POLYGON]: \"https://polygonscan.com/address/\",\n [Chain.BINANCE]: \"https://bscscan.com/address/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/address/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/address/\",\n [Chain.BASE]: \"https://basescan.org/address/\",\n [Chain.BLAST]: \"https://blastracker.xyz/address/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/address/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/address/\",\n};\n\nfunction explorerUrl(\n urls: Partial<Record<Chain, string>>,\n chainId: Chain,\n value: string,\n): string | undefined {\n const base = urls[chainId];\n return base ? `${base}${value}` : undefined;\n}\n\nexport function txExplorerUrl(\n chainId: Chain,\n txHash: string,\n): string | undefined {\n return explorerUrl(TX_EXPLORER_URLS, chainId, txHash);\n}\n\nexport function accountExplorerUrl(\n chainId: Chain,\n account: string,\n): string | undefined {\n return explorerUrl(ACCOUNT_EXPLORER_URLS, chainId, account);\n}\n\nexport function searchImageUrl(image: string): string {\n return `https://lens.google.com/uploadbyurl?url=${encodeURIComponent(image)}`;\n}\n\nexport function searchTwitterUrl(q: string): string {\n return `https://x.com/search?q=${encodeURIComponent(q)}`;\n}\n\nexport function twitterUserUrl(username: string): string {\n return `https://x.com/${username}`;\n}\n\nexport function twitterTweetUrl(id: string): string {\n return `https://x.com/i/status/${id}`;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport function throttle<T extends (...args: any[]) => void>(\n fn: T,\n wait: number,\n): T {\n let lastCallTime = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n\n const throttled = (...args: Parameters<T>) => {\n const now = Date.now();\n const remaining = wait - (now - lastCallTime);\n\n if (remaining <= 0) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastCallTime = now;\n fn(...args);\n } else {\n lastArgs = args;\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n lastCallTime = Date.now();\n timeoutId = null;\n if (lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n }\n }, remaining);\n }\n }\n };\n\n return throttled as T;\n}\n\nexport function debounce<T extends (...args: any[]) => void>(\n fn: T,\n wait: number,\n): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = (...args: Parameters<T>) => {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, wait);\n };\n\n return debounced as T;\n}\n","export function uniqBy<T>(\n array: T[],\n iteratee: ((item: T) => unknown) | keyof T,\n): T[] {\n const seen = new Set<unknown>();\n const getter =\n typeof iteratee === \"function\" ? iteratee : (item: T) => item[iteratee];\n\n return array.filter((item) => {\n const key = getter(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function intersectionBy<T>(\n a: T[],\n b: T[],\n iteratee: ((item: T) => unknown) | keyof T,\n): T[] {\n const getter =\n typeof iteratee === \"function\" ? iteratee : (item: T) => item[iteratee];\n const bKeys = new Set(b.map(getter));\n return a.filter((item) => bKeys.has(getter(item)));\n}\n\nexport function keyBy<T>(\n array: T[],\n iteratee: ((item: T) => string) | keyof T,\n): Record<string, T> {\n const getter =\n typeof iteratee === \"function\"\n ? iteratee\n : (item: T) => String(item[iteratee]);\n\n const result: Record<string, T> = {};\n for (const item of array) {\n result[getter(item)] = item;\n }\n return result;\n}\n\nexport function groupBy<T>(\n array: T[],\n iteratee: ((item: T) => string) | keyof T,\n): Record<string, T[]> {\n const getter =\n typeof iteratee === \"function\"\n ? iteratee\n : (item: T) => String(item[iteratee]);\n\n const result: Record<string, T[]> = {};\n for (const item of array) {\n const key = getter(item);\n (result[key] ??= []).push(item);\n }\n return result;\n}\n\nexport function mapKeys<T>(\n obj: Record<string, T>,\n iteratee: (value: T, key: string) => string,\n): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj)) {\n result[iteratee(obj[key], key)] = obj[key];\n }\n return result;\n}\n\nexport function mapValues<T, R>(\n obj: Record<string, T>,\n iteratee: (value: T, key: string) => R,\n): Record<string, R> {\n const result: Record<string, R> = {};\n for (const key of Object.keys(obj)) {\n result[key] = iteratee(obj[key], key);\n }\n return result;\n}\n"],"mappings":"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","names":["index_exports","__export","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","isValidEvmAddress","isValidNumber","isValidSolanaAddress","isValidWalletAddress","keyBy","mapKeys","mapValues","parseTokenProtocolFamily","searchImageUrl","searchTwitterUrl","throttle","truncateAddress","twitterTweetUrl","twitterUserUrl","txExplorerUrl","uniqBy","version_default","__toCommonJS","version_default","import_types","solanaChains","chainToNamespace","chain","chainSlugs","chainSlugAbbrs","chainColors","chainColor","chainId","chainIcon","chainIdBySlug","slug","chainSlug","chainDisplayName","abbr","c","slugToChainId","key","isValidWalletAddress","addr","isValidSolanaAddress","isValidEvmAddress","EVM_ADDRESS_RE","value","SOLANA_BASE58_RE","ApiError","message","code","defaultLabels","formatAgeInSeconds","age","options","labels","formatAge","httpRequest","url","options","response","_createHeaders","errorMsg","ApiError","e","headers","method","_headers","httpGet","httpPost","data","httpPut","httpDelete","httpMutate","init","import_bignumber","SafeBigNumber","BigNumber","num","base","e","isValidNumber","floatNum","subscriptDigits","stringifyNumberWithGroupingSeparator","precision","rounding","parts","stringifyNumberWithAbbreviation","bn","stringifyNumberWithLeadingZeroSubscripts","integerPart","decimalPart","digits","firstNonZeroIndex","precisionDigitsCount","stringifyNumberWithSignificantPrecision","matched","significantPrecision","stringifyPercent","formatAmount","options","negative","abs","formatted","formatAmountUSD","formatAmountUSDCompact","roundedAbs","formatPrice","isHighPrecise","formatPriceUSD","formatPercent","sign","capitalize","str","truncateAddress","address","start","end","formatSymbol","symbol","formatString","arr","type","base","quote","import_types","SOLANA_PROTOCOL_SET","SOLANA_PROTOCOLS_BY_SPECIFICITY","a","b","parseTokenProtocolFamily","chain","protocolFamily","normalized","p","formatTokenProtocolName","protocol","word","import_types","EVM_NATIVE_ADDRESS","SOLANA_TOKENS","ETHEREUM_TOKENS","BSC_TOKENS","ARBITRUM_TOKENS","OPTIMISM_TOKENS","AVALANCHE_TOKENS","CHAIN_TOKENS","getNativeToken","chain","getWrappedToken","getStablecoins","getCommonTokenAddresses","tokens","t","getCommonTokenSymbolsMap","map","import_types","TX_EXPLORER_URLS","ACCOUNT_EXPLORER_URLS","explorerUrl","urls","chainId","value","base","txExplorerUrl","txHash","accountExplorerUrl","account","searchImageUrl","image","searchTwitterUrl","q","twitterUserUrl","username","twitterTweetUrl","id","throttle","fn","wait","lastCallTime","timeoutId","lastArgs","args","now","remaining","debounce","uniqBy","array","iteratee","seen","getter","item","key","intersectionBy","a","b","bKeys","keyBy","result","groupBy","mapKeys","obj","mapValues"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var H=Object.defineProperty,k=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var V=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var B=(t,r,n)=>r in t?H(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,m=(t,r)=>{for(var n in r||(r={}))V.call(r,n)&&B(t,n,r[n]);if(x)for(var n of x(r))$.call(r,n)&&B(t,n,r[n]);return t},y=(t,r)=>k(t,F(r));var p=(t,r,n)=>new Promise((s,o)=>{var a=A=>{try{E(n.next(A))}catch(I){o(I)}},c=A=>{try{E(n.throw(A))}catch(I){o(I)}},E=A=>A.done?s(A.value):Promise.resolve(A.value).then(a,c);E((n=n.apply(t,r)).next())});typeof window!="undefined"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/utils"]="0.1.28");var v="0.1.28";import{address as K}from"@solana/kit";import{Chain as e,ChainNamespace as S}from"@liberfi.io/types";var Y=new Set([e.SOLANA,e.SOLANA_TESTNET,e.SOLANA_DEVNET]);function W(t){return Y.has(t)?S.SOLANA:S.EVM}var R={[e.ETHEREUM]:"ethereum",[e.UBIQ]:"ubiq",[e.OPTIMISM]:"optimism",[e.FLARE]:"flare",[e.SONGBIRD]:"songbird",[e.ELASTOS]:"elastos",[e.KARDIA]:"kardia",[e.CRONOS]:"cronos",[e.RSK]:"rsk",[e.TELOS]:"telos",[e.LUKSO]:"lukso",[e.CRAB]:"crab",[e.DARWINIA]:"darwinia",[e.XDC]:"xdc",[e.CSC]:"csc",[e.ZYX]:"zyx",[e.BINANCE]:"binance",[e.SYSCOIN]:"syscoin",[e.GOCHAIN]:"gochain",[e.ETHEREUMCLASSIC]:"ethereumclassic",[e.OKEXCHAIN]:"okexchain",[e.HOO]:"hoo",[e.METER]:"meter",[e.NOVA_NETWORK]:"nova network",[e.TOMOCHAIN]:"tomochain",[e.BITKUB]:"bitkub",[e.XDAI]:"xdai",[e.SOLANA]:"solana",[e.VELAS]:"velas",[e.THUNDERCORE]:"thundercore",[e.ENULS]:"enuls",[e.FUSE]:"fuse",[e.HECO]:"heco",[e.UNICHAIN]:"unichain",[e.POLYGON]:"polygon",[e.SONIC]:"sonic",[e.SHIMMER_EVM]:"shimmer_evm",[e.RBN]:"rbn",[e.OMNI]:"omni",[e.MANTA]:"manta",[e.HSK]:"hsk",[e.WATER]:"water",[e.XLAYER]:"xlayer",[e.XDAIARB]:"xdaiarb",[e.OP_BNB]:"op_bnb",[e.VINUCHAIN]:"vinuchain",[e.ENERGYWEB]:"energyweb",[e.OASYS]:"oasys",[e.FANTOM]:"fantom",[e.FRAXTAL]:"fraxtal",[e.HPB]:"hpb",[e.BOBA]:"boba",[e.OMAX]:"omax",[e.FILECOIN]:"filecoin",[e.KUCOIN]:"kucoin",[e.ZKSYNC_ERA]:"zksync era",[e.SHIDEN]:"shiden",[e.THETA]:"theta",[e.PULSE]:"pulse",[e.CRONOS_ZKEVM]:"cronos zkevm",[e.SX]:"sx",[e.AREON]:"areon",[e.WC]:"wc",[e.CANDLE]:"candle",[e.ROLLUX]:"rollux",[e.ASTAR]:"astar",[e.REDSTONE]:"redstone",[e.MATCHAIN]:"matchain",[e.CALLISTO]:"callisto",[e.TARA]:"tara",[e.WANCHAIN]:"wanchain",[e.LYRA_CHAIN]:"lyra chain",[e.BIFROST]:"bifrost",[e.CONFLUX]:"conflux",[e.METIS]:"metis",[e.DYMENSION]:"dymension",[e.POLYGON_ZKEVM]:"polygon zkevm",[e.CORE]:"core",[e.LISK]:"lisk",[e.ULTRON]:"ultron",[e.STEP]:"step",[e.MOONBEAM]:"moonbeam",[e.MOONRIVER]:"moonriver",[e.SEI]:"sei",[e.LIVING_ASSETS_MAINNET]:"living assets mainnet",[e.STY]:"sty",[e.TENET]:"tenet",[e.GRAVITY]:"gravity",[e.REYA_NETWORK]:"reya network",[e.SONEIUM]:"soneium",[e.SWELLCHAIN]:"swellchain",[e.ONUS]:"onus",[e.HUBBLENET]:"hubblenet",[e.SANKO]:"sanko",[e.DOGECHAIN]:"dogechain",[e.MILKOMEDA]:"milkomeda",[e.MILKOMEDA_A1]:"milkomeda_a1",[e.KAVA]:"kava",[e.SOMA]:"soma",[e.KARAK]:"karak",[e.ABSTRACT]:"abstract",[e.MORPH]:"morph",[e.CROSSFI]:"crossfi",[e.BEAM]:"beam",[e.IOTEX]:"iotex",[e.MANTLE]:"mantle",[e.XLC]:"xlc",[e.NAHMII]:"nahmii",[e.BOUNCEBIT]:"bouncebit",[e.TOMBCHAIN]:"tombchain",[e.ZETACHAIN]:"zetachain",[e.PLANQ]:"planq",[e.BITROCK]:"bitrock",[e.XSAT]:"xsat",[e.CYETH]:"cyeth",[e.CANTO]:"canto",[e.KLAYTN]:"klaytn",[e.THAT]:"that",[e.BASE]:"base",[e.HELA]:"hela",[e.IOTAEVM]:"iotaevm",[e.JBC]:"jbc",[e.EVMOS]:"evmos",[e.CARBON]:"carbon",[e.SMARTBCH]:"smartbch",[e.ARTELA]:"artela",[e.IMMUTABLE_ZKEVM]:"immutable zkevm",[e.LOOP]:"loop",[e.GENESYS]:"genesys",[e.EOS_EVM]:"eos evm",[e.MAP_PROTOCOL]:"map protocol",[e.SAPPHIRE]:"sapphire",[e.BITGERT]:"bitgert",[e.FUSION]:"fusion",[e.ZILLIQA]:"zilliqa",[e.APECHAIN]:"apechain",[e.EDU_CHAIN]:"edu chain",[e.ARBITRUM]:"arbitrum",[e.ARBITRUM_NOVA]:"arbitrum nova",[e.CELO]:"celo",[e.OASIS]:"oasis",[e.ASSETCHAIN]:"assetchain",[e.ETHERLINK]:"etherlink",[e.AVALANCHE]:"avalanche",[e.REI]:"rei",[e.ZIRCUIT]:"zircuit",[e.SOPHON]:"sophon",[e.ETN]:"etn",[e.SUPERPOSITION]:"superposition",[e.REICHAIN]:"reichain",[e.BOBA_BNB]:"boba_bnb",[e.INK]:"ink",[e.LINEA]:"linea",[e.BOB]:"bob",[e.GODWOKEN]:"godwoken",[e.BERACHAIN]:"berachain",[e.BLAST]:"blast",[e.CHILIZ]:"chiliz",[e.STRATIS]:"stratis",[e.REAL]:"real",[e.ODYSSEY]:"odyssey",[e.TAIKO]:"taiko",[e.BITLAYER]:"bitlayer",[e.HYDRATION]:"hydration",[e.PAREX]:"parex",[e.POLIS]:"polis",[e.KEKCHAIN]:"kekchain",[e.SCROLL]:"scroll",[e.ZERO_NETWORK]:"zero_network",[e.ZKLINK_NOVA]:"zklink nova",[e.VISION]:"vision",[e.SAAKURU]:"saakuru",[e.ZORA]:"zora",[e.CORN]:"corn",[e.NEON]:"neon",[e.LUMIA]:"lumia",[e.AURORA]:"aurora",[e.HARMONY]:"harmony",[e.PALM]:"palm",[e.ZENIQ]:"zeniq",[e.CURIO]:"curio",[e.MODE]:"mode"},U={[e.SOLANA]:"sol",[e.ETHEREUM]:"eth",[e.BINANCE]:"bsc",[e.ARBITRUM]:"arb",[e.OPTIMISM]:"opt",[e.AVALANCHE]:"avax"},G={[e.SOLANA]:"#9945FF",[e.ETHEREUM]:"#627EEA",[e.BINANCE]:"#F0B90B",[e.ARBITRUM]:"#28A0F0",[e.OPTIMISM]:"#FF0420",[e.AVALANCHE]:"#E84142",[e.POLYGON]:"#8247E5",[e.BASE]:"#0052FF",[e.SONIC]:"#5B6EF5",[e.LINEA]:"#61DFFF",[e.SCROLL]:"#FFEEDA",[e.BLAST]:"#FCFC03",[e.CRONOS]:"#002D74",[e.BERACHAIN]:"#964B00"};function pe(t){return G[t]}function Ne(t){var s;let r=(s=P(t))!=null?s:t,n=R[r];return n?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(n)}.jpg`:void 0}function fe(t){return R[t]}function he(t){let r=U[t];if(r)return r.toUpperCase();let n=R[t];return n?n.replace(/\b\w/g,s=>s.toUpperCase()):t}var C=new Map;for(let[t,r]of Object.entries(U))r&&C.set(r.toLowerCase(),t);for(let[t,r]of Object.entries(R)){let n=r==null?void 0:r.toLowerCase();n&&!C.has(n)&&C.set(n,t)}function P(t){return C.get(t.toLowerCase())}function be(t,r){var o;let n=(o=P(t))!=null?o:t;switch(W(n)){case S.SOLANA:return z(r);case S.EVM:return q(r);default:throw new Error(`Unsupported chain: ${t}`)}}var Z=/^0x[0-9a-fA-F]{40}$/;function q(t){return Z.test(t)}function z(t){try{return K(t),!0}catch(r){return!1}}var g=class extends Error{constructor(n,s){super(n);this.code=s;this.name="ApiError"}};var X={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function j(t,r={}){let n=m(m({},X),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 Se(t,r={}){return j(Math.floor(t/1e3),r)}function h(t,r){return p(this,null,function*(){if(!t.startsWith("http"))throw new Error("url must start with http(s)");let n=yield fetch(t,y(m({},r),{headers:Q(r.headers,r.method)}));if(n.ok)return yield n.json();try{let s=yield n.json();throw n.status===400?new g(s.message||s.code||n.statusText,s.code):new Error(s.message||s.code||n.statusText)}catch(s){throw s}})}function Q(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}function Ie(t,r){return p(this,null,function*(){return yield h(t,m({method:"GET"},r))})}function xe(t,r,n){return p(this,null,function*(){return yield h(t,m({method:"POST",body:JSON.stringify(r)},n))})}function Be(t,r,n){return p(this,null,function*(){return yield h(t,m({method:"PUT",body:JSON.stringify(r)},n))})}function ye(t,r){return p(this,null,function*(){return yield h(t,m({method:"DELETE"},r))})}function Ue(t,r){return p(this,null,function*(){return yield h(t,r)})}import l from"bignumber.js";var u=class extends l{constructor(r,n){try{super(r!=null?r:0,n)}catch(s){console.error("SafeBigNumber constructor error",s),super(0,n)}}},N=t=>{if(typeof t=="number"&&!isNaN(t)||t instanceof u||t instanceof l)return!0;if(typeof t!="string")return!1;let r=Number.parseFloat(t);return!isNaN(r)},J=["\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"],d=(t,r=0,n=l.ROUND_DOWN)=>{let o=new u(t).decimalPlaces(r,n).toString().split(".");return o[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o.join(".")},b=(t,r=1)=>{let n=new u(t);return n.lt(1e3)?n.toNumber():n.lt(1e6)?`${d(n.div(1e3),r)}K`:n.lt(1e9)?`${d(n.div(1e6),r)}M`:n.lt(1e12)?`${d(n.dividedBy(1e9),r)}B`:`${d(n.dividedBy(1e12),r)}T`},D=(t,r=5)=>{let n=new u(t);if(n.eq(0))return"0";let[s,o]=n.toFixed().split("."),a=o.split(""),c=a.findIndex(A=>A!=="0"),E=Math.min(a.length-c,r);return`${d(s)}.0`.concat(J[c]).concat(a.slice(c,c+E).join("").replace(/\.?0+$/,""))},M=(t,r)=>{let n=t.toString().match(/\.0*/),s=(n?n[0].length-1:0)+r;return d(t,s)},L=(t,r)=>`${t.times(100).decimalPlaces(r,l.ROUND_HALF_UP).toString()}%`,Me=(t="",r={showPlusGtThanZero:!1})=>{if(!N(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),a=o.lt(.001)?o.decimalPlaces(5,l.ROUND_DOWN).toString():o.lt(1)?o.decimalPlaces(3,l.ROUND_DOWN).toString():o.lt(100)?o.decimalPlaces(2,l.ROUND_DOWN).toString():o.lt(1e5)?d(o,2):b(o);return Number(a)===0?`${a}`:s?`-${a}`:r!=null&&r.showPlusGtThanZero?`+${a}`:`${a}`},_e=(t="",r={showPlusGtThanZero:!1})=>{if(!N(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),a=o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,l.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,l.ROUND_DOWN)}`:o.lt(1e4)?`$${d(o,2)}`:`$${b(o)}`;return a==="$0"?a:s?`-${a}`:r!=null&&r.showPlusGtThanZero?`+${a}`:a},we=(t="",r={showPlusGtThanZero:!1})=>{if(!N(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),a=o.div(100).integerValue(l.ROUND_DOWN).times(100),c=o.lt(1e-4)||o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,l.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,l.ROUND_DOWN)}`:o.lt(1e3)?`$${o.decimalPlaces(0,l.ROUND_DOWN)}`:`$${b(a,0)}`;return c==="$0"?c:s?`-${c}`:r!=null&&r.showPlusGtThanZero?`+${c}`:c},He=(t="",r={isHighPrecise:!0})=>{if(!N(t))return"--";let n=new u(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`${s.lt(1e-4)?D(s,o?4:2):s.lt(1)?o?d(s,4):M(s,2):s.lt(100)||s.lt(1e4)?d(s,o?4:2):s.lt(1e5)?d(s,2):b(s)}`},ke=(t="",r={isHighPrecise:!0})=>{if(!N(t))return"--";let n=new u(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`$${s.lt(1e-4)?D(s,o?4:2):s.lt(1)?o?d(s,4):M(s,2):s.lt(100)||s.lt(1e4)?d(s,o?4:2):s.lt(1e5)?d(s,2):b(s)}`},Fe=(t="",r={})=>{var c,E;if(!N(t))return"-- %";let n=new u(t),s=n.lt(0),o=n.abs(),a=s?"-":r!=null&&r.showPlusGtThanZero?"+":"";return o.lt(1e-4)?"0%":o.lt(100)?`${a}${L(o,(c=r==null?void 0:r.precision)!=null?c:2)}`:o.lt(1e3)?`${a}${L(o,(E=r==null?void 0:r.precision)!=null?E:1)}`:`${a}> 99,999%`};function $e(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function ve(t,r=6,n=4){return t.slice(0,r)+"..."+t.slice(-n)}function Ye(t,r="base-type"){if(!t)return"";let n=t.split("_"),s=n[0],o=n[1],a=n[2];return r.replace("type",s).replace("base",o).replace("quote",a)}import{Chain as ee,SOLANA_TOKEN_PROTOCOLS as _}from"@liberfi.io/types";var te=new Set(_),re=[..._].sort((t,r)=>r.length-t.length),qe=(t,r)=>{if(t!==ee.SOLANA)return;let n=r.toLowerCase();return te.has(n)?n:re.find(s=>n.includes(s))},ze=t=>t.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ");import{Chain as f}from"@liberfi.io/types";var O="0x0000000000000000000000000000000000000000",ne={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}}},se={native:{address:O,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}}},oe={native:{address:O,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}}},ae={native:{address:O,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}}},ie={native:{address:O,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}}},ce={native:{address:O,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={[f.SOLANA]:ne,[f.ETHEREUM]:se,[f.BINANCE]:oe,[f.ARBITRUM]:ae,[f.OPTIMISM]:ie,[f.AVALANCHE]:ce};function Qe(t){var r;return(r=T[t])==null?void 0:r.native}function Je(t){var r;return(r=T[t])==null?void 0:r.wrapped}function et(t){var r;return(r=T[t])==null?void 0:r.stablecoins}function tt(t){let r=T[t];return r?[r.native.address,r.wrapped.address,...Object.values(r.stablecoins).map(n=>n.address)]:[]}function rt(t){let r=T[t];if(!r)return{};let n={[r.native.address]:r.native.symbol,[r.wrapped.address]:r.wrapped.symbol};for(let s of Object.values(r.stablecoins))n[s.address]=s.symbol;return n}import{Chain as i}from"@liberfi.io/types";var de={[i.SOLANA]:"https://solscan.io/tx/",[i.ETHEREUM]:"https://etherscan.io/tx/",[i.POLYGON]:"https://polygonscan.com/tx/",[i.BINANCE]:"https://bscscan.com/tx/",[i.BINANCE_TESTNET]:"https://testnet.bscscan.com/tx/",[i.AVALANCHE]:"https://snowtrace.io/tx/",[i.BASE]:"https://basescan.org/tx/",[i.BLAST]:"https://blastracker.xyz/tx/",[i.ARBITRUM]:"https://arbiscan.io/tx/",[i.ARBITRUM_NOVA]:"https://nova.arbiscan.io/tx/",[i.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/tx/",[i.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/tx/"},le={[i.SOLANA]:"https://solscan.io/account/",[i.ETHEREUM]:"https://etherscan.io/address/",[i.POLYGON]:"https://polygonscan.com/address/",[i.BINANCE]:"https://bscscan.com/address/",[i.BINANCE_TESTNET]:"https://testnet.bscscan.com/address/",[i.AVALANCHE]:"https://snowtrace.io/address/",[i.BASE]:"https://basescan.org/address/",[i.BLAST]:"https://blastracker.xyz/address/",[i.ARBITRUM]:"https://arbiscan.io/address/",[i.ARBITRUM_NOVA]:"https://nova.arbiscan.io/address/",[i.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/address/",[i.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/address/"};function w(t,r,n){let s=t[r];return s?`${s}${n}`:void 0}function ot(t,r){return w(de,t,r)}function at(t,r){return w(le,t,r)}function it(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function ct(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function dt(t){return`https://x.com/${t}`}function lt(t){return`https://x.com/i/status/${t}`}import{throttle as gt,debounce as It,uniqBy as xt,intersectionBy as Bt,keyBy as yt,groupBy as Ut,mapKeys as Pt,mapValues as Lt}from"lodash-es";export{ae as ARBITRUM_TOKENS,ce as AVALANCHE_TOKENS,g as ApiError,oe as BSC_TOKENS,T as CHAIN_TOKENS,se as ETHEREUM_TOKENS,ie as OPTIMISM_TOKENS,ne as SOLANA_TOKENS,u as SafeBigNumber,at as accountExplorerUrl,$e as capitalize,pe as chainColor,he as chainDisplayName,Ne as chainIcon,P as chainIdBySlug,fe as chainSlug,W as chainToNamespace,It as debounce,Se as formatAge,j as formatAgeInSeconds,Me as formatAmount,_e as formatAmountUSD,we as formatAmountUSDCompact,Fe as formatPercent,He as formatPrice,ke as formatPriceUSD,Ye as formatSymbol,ze as formatTokenProtocolName,tt as getCommonTokenAddresses,rt as getCommonTokenSymbolsMap,Qe as getNativeToken,et as getStablecoins,Je as getWrappedToken,Ut as groupBy,ye as httpDelete,Ie as httpGet,Ue as httpMutate,xe as httpPost,Be as httpPut,h as httpRequest,Bt as intersectionBy,q as isValidEvmAddress,N as isValidNumber,z as isValidSolanaAddress,be as isValidWalletAddress,yt as keyBy,Pt as mapKeys,Lt as mapValues,qe as parseTokenProtocolFamily,it as searchImageUrl,ct as searchTwitterUrl,gt as throttle,ve as truncateAddress,lt as twitterTweetUrl,dt as twitterUserUrl,ot as txExplorerUrl,xt as uniqBy,v as version};
1
+ typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/utils"]="0.1.30");var U="0.1.30";import{Chain as e,ChainNamespace as b}from"@liberfi.io/types";var L=new Set([e.SOLANA,e.SOLANA_TESTNET,e.SOLANA_DEVNET]);function D(t){return L.has(t)?b.SOLANA:b.EVM}var g={[e.ETHEREUM]:"ethereum",[e.UBIQ]:"ubiq",[e.OPTIMISM]:"optimism",[e.FLARE]:"flare",[e.SONGBIRD]:"songbird",[e.ELASTOS]:"elastos",[e.KARDIA]:"kardia",[e.CRONOS]:"cronos",[e.RSK]:"rsk",[e.TELOS]:"telos",[e.LUKSO]:"lukso",[e.CRAB]:"crab",[e.DARWINIA]:"darwinia",[e.XDC]:"xdc",[e.CSC]:"csc",[e.ZYX]:"zyx",[e.BINANCE]:"binance",[e.SYSCOIN]:"syscoin",[e.GOCHAIN]:"gochain",[e.ETHEREUMCLASSIC]:"ethereumclassic",[e.OKEXCHAIN]:"okexchain",[e.HOO]:"hoo",[e.METER]:"meter",[e.NOVA_NETWORK]:"nova network",[e.TOMOCHAIN]:"tomochain",[e.BITKUB]:"bitkub",[e.XDAI]:"xdai",[e.SOLANA]:"solana",[e.VELAS]:"velas",[e.THUNDERCORE]:"thundercore",[e.ENULS]:"enuls",[e.FUSE]:"fuse",[e.HECO]:"heco",[e.UNICHAIN]:"unichain",[e.POLYGON]:"polygon",[e.SONIC]:"sonic",[e.SHIMMER_EVM]:"shimmer_evm",[e.RBN]:"rbn",[e.OMNI]:"omni",[e.MANTA]:"manta",[e.HSK]:"hsk",[e.WATER]:"water",[e.XLAYER]:"xlayer",[e.XDAIARB]:"xdaiarb",[e.OP_BNB]:"op_bnb",[e.VINUCHAIN]:"vinuchain",[e.ENERGYWEB]:"energyweb",[e.OASYS]:"oasys",[e.FANTOM]:"fantom",[e.FRAXTAL]:"fraxtal",[e.HPB]:"hpb",[e.BOBA]:"boba",[e.OMAX]:"omax",[e.FILECOIN]:"filecoin",[e.KUCOIN]:"kucoin",[e.ZKSYNC_ERA]:"zksync era",[e.SHIDEN]:"shiden",[e.THETA]:"theta",[e.PULSE]:"pulse",[e.CRONOS_ZKEVM]:"cronos zkevm",[e.SX]:"sx",[e.AREON]:"areon",[e.WC]:"wc",[e.CANDLE]:"candle",[e.ROLLUX]:"rollux",[e.ASTAR]:"astar",[e.REDSTONE]:"redstone",[e.MATCHAIN]:"matchain",[e.CALLISTO]:"callisto",[e.TARA]:"tara",[e.WANCHAIN]:"wanchain",[e.LYRA_CHAIN]:"lyra chain",[e.BIFROST]:"bifrost",[e.CONFLUX]:"conflux",[e.METIS]:"metis",[e.DYMENSION]:"dymension",[e.POLYGON_ZKEVM]:"polygon zkevm",[e.CORE]:"core",[e.LISK]:"lisk",[e.ULTRON]:"ultron",[e.STEP]:"step",[e.MOONBEAM]:"moonbeam",[e.MOONRIVER]:"moonriver",[e.SEI]:"sei",[e.LIVING_ASSETS_MAINNET]:"living assets mainnet",[e.STY]:"sty",[e.TENET]:"tenet",[e.GRAVITY]:"gravity",[e.REYA_NETWORK]:"reya network",[e.SONEIUM]:"soneium",[e.SWELLCHAIN]:"swellchain",[e.ONUS]:"onus",[e.HUBBLENET]:"hubblenet",[e.SANKO]:"sanko",[e.DOGECHAIN]:"dogechain",[e.MILKOMEDA]:"milkomeda",[e.MILKOMEDA_A1]:"milkomeda_a1",[e.KAVA]:"kava",[e.SOMA]:"soma",[e.KARAK]:"karak",[e.ABSTRACT]:"abstract",[e.MORPH]:"morph",[e.CROSSFI]:"crossfi",[e.BEAM]:"beam",[e.IOTEX]:"iotex",[e.MANTLE]:"mantle",[e.XLC]:"xlc",[e.NAHMII]:"nahmii",[e.BOUNCEBIT]:"bouncebit",[e.TOMBCHAIN]:"tombchain",[e.ZETACHAIN]:"zetachain",[e.PLANQ]:"planq",[e.BITROCK]:"bitrock",[e.XSAT]:"xsat",[e.CYETH]:"cyeth",[e.CANTO]:"canto",[e.KLAYTN]:"klaytn",[e.THAT]:"that",[e.BASE]:"base",[e.HELA]:"hela",[e.IOTAEVM]:"iotaevm",[e.JBC]:"jbc",[e.EVMOS]:"evmos",[e.CARBON]:"carbon",[e.SMARTBCH]:"smartbch",[e.ARTELA]:"artela",[e.IMMUTABLE_ZKEVM]:"immutable zkevm",[e.LOOP]:"loop",[e.GENESYS]:"genesys",[e.EOS_EVM]:"eos evm",[e.MAP_PROTOCOL]:"map protocol",[e.SAPPHIRE]:"sapphire",[e.BITGERT]:"bitgert",[e.FUSION]:"fusion",[e.ZILLIQA]:"zilliqa",[e.APECHAIN]:"apechain",[e.EDU_CHAIN]:"edu chain",[e.ARBITRUM]:"arbitrum",[e.ARBITRUM_NOVA]:"arbitrum nova",[e.CELO]:"celo",[e.OASIS]:"oasis",[e.ASSETCHAIN]:"assetchain",[e.ETHERLINK]:"etherlink",[e.AVALANCHE]:"avalanche",[e.REI]:"rei",[e.ZIRCUIT]:"zircuit",[e.SOPHON]:"sophon",[e.ETN]:"etn",[e.SUPERPOSITION]:"superposition",[e.REICHAIN]:"reichain",[e.BOBA_BNB]:"boba_bnb",[e.INK]:"ink",[e.LINEA]:"linea",[e.BOB]:"bob",[e.GODWOKEN]:"godwoken",[e.BERACHAIN]:"berachain",[e.BLAST]:"blast",[e.CHILIZ]:"chiliz",[e.STRATIS]:"stratis",[e.REAL]:"real",[e.ODYSSEY]:"odyssey",[e.TAIKO]:"taiko",[e.BITLAYER]:"bitlayer",[e.HYDRATION]:"hydration",[e.PAREX]:"parex",[e.POLIS]:"polis",[e.KEKCHAIN]:"kekchain",[e.SCROLL]:"scroll",[e.ZERO_NETWORK]:"zero_network",[e.ZKLINK_NOVA]:"zklink nova",[e.VISION]:"vision",[e.SAAKURU]:"saakuru",[e.ZORA]:"zora",[e.CORN]:"corn",[e.NEON]:"neon",[e.LUMIA]:"lumia",[e.AURORA]:"aurora",[e.HARMONY]:"harmony",[e.PALM]:"palm",[e.ZENIQ]:"zeniq",[e.CURIO]:"curio",[e.MODE]:"mode"},S={[e.SOLANA]:"sol",[e.ETHEREUM]:"eth",[e.BINANCE]:"bsc",[e.ARBITRUM]:"arb",[e.OPTIMISM]:"opt",[e.AVALANCHE]:"avax"},w={[e.SOLANA]:"#9945FF",[e.ETHEREUM]:"#627EEA",[e.BINANCE]:"#F0B90B",[e.ARBITRUM]:"#28A0F0",[e.OPTIMISM]:"#FF0420",[e.AVALANCHE]:"#E84142",[e.POLYGON]:"#8247E5",[e.BASE]:"#0052FF",[e.SONIC]:"#5B6EF5",[e.LINEA]:"#61DFFF",[e.SCROLL]:"#FFEEDA",[e.BLAST]:"#FCFC03",[e.CRONOS]:"#002D74",[e.BERACHAIN]:"#964B00"};function de(t){return w[t]}function ue(t){let r=C(t)??t,n=g[r];return n?`https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(n)}.jpg`:void 0}function me(t){return g[t]}function Ae(t){let r=S[t];if(r)return r.toUpperCase();let n=g[t];return n?n.replace(/\b\w/g,s=>s.toUpperCase()):t}var O=new Map;for(let[t,r]of Object.entries(S))r&&O.set(r.toLowerCase(),t);for(let[t,r]of Object.entries(g)){let n=r?.toLowerCase();n&&!O.has(n)&&O.set(n,t)}function C(t){return O.get(t.toLowerCase())}function pe(t,r){let n=C(t)??t;switch(D(n)){case b.SOLANA:return H(r);case b.EVM:return M(r);default:throw new Error(`Unsupported chain: ${t}`)}}var _=/^0x[0-9a-fA-F]{40}$/;function M(t){return _.test(t)}var k=/^[1-9A-HJ-NP-Za-km-z]{32,44}$/;function H(t){return k.test(t)}var R=class extends Error{constructor(n,s){super(n);this.code=s;this.name="ApiError"}};var F={justNow:"just now",secondsAgo:"{n}s",minutesAgo:"{n}m",hoursAgo:"{n}h",daysAgo:"{n}d",yearsAgo:"{n}y"};function V(t,r={}){let n={...F,...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 Ee(t,r={}){return V(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:v(r.headers,r.method)});if(n.ok)return await n.json();try{let s=await n.json();throw n.status===400?new R(s.message||s.code||n.statusText,s.code):new Error(s.message||s.code||n.statusText)}catch(s){throw s}}function v(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 be(t,r){return await p(t,{method:"GET",...r})}async function Oe(t,r,n){return await p(t,{method:"POST",body:JSON.stringify(r),...n})}async function ge(t,r,n){return await p(t,{method:"PUT",body:JSON.stringify(r),...n})}async function Re(t,r){return await p(t,{method:"DELETE",...r})}async function Se(t,r){return await p(t,r)}import d from"bignumber.js";var u=class extends d{constructor(r,n){try{super(r??0,n)}catch(s){console.error("SafeBigNumber constructor error",s),super(0,n)}}},m=t=>{if(typeof t=="number"&&!isNaN(t)||t instanceof u||t instanceof d)return!0;if(typeof t!="string")return!1;let r=Number.parseFloat(t);return!isNaN(r)},$=["\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"],c=(t,r=0,n=d.ROUND_DOWN)=>{let o=new u(t).decimalPlaces(r,n).toString().split(".");return o[0]=o[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),o.join(".")},T=(t,r=1)=>{let n=new u(t);return n.lt(1e3)?n.toNumber():n.lt(1e6)?`${c(n.div(1e3),r)}K`:n.lt(1e9)?`${c(n.div(1e6),r)}M`:n.lt(1e12)?`${c(n.dividedBy(1e9),r)}B`:`${c(n.dividedBy(1e12),r)}T`},y=(t,r=5)=>{let n=new u(t);if(n.eq(0))return"0";let[s,o]=n.toFixed().split("."),i=o.split(""),l=i.findIndex(h=>h!=="0"),N=Math.min(i.length-l,r);return`${c(s)}.0`.concat($[l]).concat(i.slice(l,l+N).join("").replace(/\.?0+$/,""))},x=(t,r)=>{let n=t.toString().match(/\.0*/),s=(n?n[0].length-1:0)+r;return c(t,s)},I=(t,r)=>`${t.times(100).decimalPlaces(r,d.ROUND_HALF_UP).toString()}%`,ye=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),i=o.lt(.001)?o.decimalPlaces(5,d.ROUND_DOWN).toString():o.lt(1)?o.decimalPlaces(3,d.ROUND_DOWN).toString():o.lt(100)?o.decimalPlaces(2,d.ROUND_DOWN).toString():o.lt(1e5)?c(o,2):T(o);return Number(i)===0?`${i}`:s?`-${i}`:r?.showPlusGtThanZero?`+${i}`:`${i}`},xe=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),i=o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,d.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,d.ROUND_DOWN)}`:o.lt(1e4)?`$${c(o,2)}`:`$${T(o)}`;return i==="$0"?i:s?`-${i}`:r?.showPlusGtThanZero?`+${i}`:i},Be=(t="",r={showPlusGtThanZero:!1})=>{if(!m(t))return"--";let n=new u(t),s=n.lt(0),o=n.abs(),i=o.div(100).integerValue(d.ROUND_DOWN).times(100),l=o.lt(1e-4)||o.lt(.001)?"$0":o.lt(1)?`$${o.decimalPlaces(3,d.ROUND_DOWN)}`:o.lt(100)?`$${o.decimalPlaces(2,d.ROUND_DOWN)}`:o.lt(1e3)?`$${o.decimalPlaces(0,d.ROUND_DOWN)}`:`$${T(i,0)}`;return l==="$0"?l:s?`-${l}`:r?.showPlusGtThanZero?`+${l}`:l},Pe=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new u(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`${s.lt(1e-4)?y(s,o?4:2):s.lt(1)?o?c(s,4):x(s,2):s.lt(100)||s.lt(1e4)?c(s,o?4:2):s.lt(1e5)?c(s,2):T(s)}`},Ue=(t="",r={isHighPrecise:!0})=>{if(!m(t))return"--";let n=new u(t);if(n.lt(0))return"--";let s=n.abs(),{isHighPrecise:o}=r;return`$${s.lt(1e-4)?y(s,o?4:2):s.lt(1)?o?c(s,4):x(s,2):s.lt(100)||s.lt(1e4)?c(s,o?4:2):s.lt(1e5)?c(s,2):T(s)}`},Le=(t="",r={})=>{if(!m(t))return"-- %";let n=new u(t),s=n.lt(0),o=n.abs(),i=s?"-":r?.showPlusGtThanZero?"+":"";return o.lt(1e-4)?"0%":o.lt(100)?`${i}${I(o,r?.precision??2)}`:o.lt(1e3)?`${i}${I(o,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 ke(t,r="base-type"){if(!t)return"";let n=t.split("_"),s=n[0],o=n[1],i=n[2];return r.replace("type",s).replace("base",o).replace("quote",i)}import{Chain as K,SOLANA_TOKEN_PROTOCOLS as B}from"@liberfi.io/types";var Y=new Set(B),W=[...B].sort((t,r)=>r.length-t.length),ve=(t,r)=>{if(t!==K.SOLANA)return;let n=r.toLowerCase();return Y.has(n)?n:W.find(s=>n.includes(s))},$e=t=>t.split("-").map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join(" ");import{Chain as A}from"@liberfi.io/types";var f="0x0000000000000000000000000000000000000000",G={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}}},Z={native:{address:f,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}}},q={native:{address:f,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}}},z={native:{address:f,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}}},X={native:{address:f,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}}},j={native:{address:f,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}}},E={[A.SOLANA]:G,[A.ETHEREUM]:Z,[A.BINANCE]:q,[A.ARBITRUM]:z,[A.OPTIMISM]:X,[A.AVALANCHE]:j};function We(t){return E[t]?.native}function Ge(t){return E[t]?.wrapped}function Ze(t){return E[t]?.stablecoins}function qe(t){let r=E[t];return r?[r.native.address,r.wrapped.address,...Object.values(r.stablecoins).map(n=>n.address)]:[]}function ze(t){let r=E[t];if(!r)return{};let n={[r.native.address]:r.native.symbol,[r.wrapped.address]:r.wrapped.symbol};for(let s of Object.values(r.stablecoins))n[s.address]=s.symbol;return n}import{Chain as a}from"@liberfi.io/types";var J={[a.SOLANA]:"https://solscan.io/tx/",[a.ETHEREUM]:"https://etherscan.io/tx/",[a.POLYGON]:"https://polygonscan.com/tx/",[a.BINANCE]:"https://bscscan.com/tx/",[a.BINANCE_TESTNET]:"https://testnet.bscscan.com/tx/",[a.AVALANCHE]:"https://snowtrace.io/tx/",[a.BASE]:"https://basescan.org/tx/",[a.BLAST]:"https://blastracker.xyz/tx/",[a.ARBITRUM]:"https://arbiscan.io/tx/",[a.ARBITRUM_NOVA]:"https://nova.arbiscan.io/tx/",[a.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/tx/",[a.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/tx/"},Q={[a.SOLANA]:"https://solscan.io/account/",[a.ETHEREUM]:"https://etherscan.io/address/",[a.POLYGON]:"https://polygonscan.com/address/",[a.BINANCE]:"https://bscscan.com/address/",[a.BINANCE_TESTNET]:"https://testnet.bscscan.com/address/",[a.AVALANCHE]:"https://snowtrace.io/address/",[a.BASE]:"https://basescan.org/address/",[a.BLAST]:"https://blastracker.xyz/address/",[a.ARBITRUM]:"https://arbiscan.io/address/",[a.ARBITRUM_NOVA]:"https://nova.arbiscan.io/address/",[a.ARBITRUM_TESTNET_GOERLI]:"https://goerli.arbiscan.io/address/",[a.ARBITRUM_TESTNET_SEPOLIA]:"https://sepolia.arbiscan.io/address/"};function P(t,r,n){let s=t[r];return s?`${s}${n}`:void 0}function Je(t,r){return P(J,t,r)}function Qe(t,r){return P(Q,t,r)}function et(t){return`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(t)}`}function tt(t){return`https://x.com/search?q=${encodeURIComponent(t)}`}function nt(t){return`https://x.com/${t}`}function rt(t){return`https://x.com/i/status/${t}`}function ee(t,r){let n=0,s=null,o=null;return(...l)=>{let N=Date.now(),h=r-(N-n);h<=0?(s!==null&&(clearTimeout(s),s=null),n=N,t(...l)):(o=l,s===null&&(s=setTimeout(()=>{n=Date.now(),s=null,o&&(t(...o),o=null)},h)))}}function te(t,r){let n=null;return(...o)=>{n!==null&&clearTimeout(n),n=setTimeout(()=>{n=null,t(...o)},r)}}function ne(t,r){let n=new Set,s=typeof r=="function"?r:o=>o[r];return t.filter(o=>{let i=s(o);return n.has(i)?!1:(n.add(i),!0)})}function re(t,r,n){let s=typeof n=="function"?n:i=>i[n],o=new Set(r.map(s));return t.filter(i=>o.has(s(i)))}function se(t,r){let n=typeof r=="function"?r:o=>String(o[r]),s={};for(let o of t)s[n(o)]=o;return s}function oe(t,r){let n=typeof r=="function"?r:o=>String(o[r]),s={};for(let o of t){let i=n(o);(s[i]??=[]).push(o)}return s}function ie(t,r){let n={};for(let s of Object.keys(t))n[r(t[s],s)]=t[s];return n}function ae(t,r){let n={};for(let s of Object.keys(t))n[s]=r(t[s],s);return n}export{z as ARBITRUM_TOKENS,j as AVALANCHE_TOKENS,R as ApiError,q as BSC_TOKENS,E as CHAIN_TOKENS,Z as ETHEREUM_TOKENS,X as OPTIMISM_TOKENS,G as SOLANA_TOKENS,u as SafeBigNumber,Qe as accountExplorerUrl,we as capitalize,de as chainColor,Ae as chainDisplayName,ue as chainIcon,C as chainIdBySlug,me as chainSlug,D as chainToNamespace,te as debounce,Ee as formatAge,V as formatAgeInSeconds,ye as formatAmount,xe as formatAmountUSD,Be as formatAmountUSDCompact,Le as formatPercent,Pe as formatPrice,Ue as formatPriceUSD,ke as formatSymbol,$e as formatTokenProtocolName,qe as getCommonTokenAddresses,ze as getCommonTokenSymbolsMap,We as getNativeToken,Ze as getStablecoins,Ge as getWrappedToken,oe as groupBy,Re as httpDelete,be as httpGet,Se as httpMutate,Oe as httpPost,ge as httpPut,p as httpRequest,re as intersectionBy,M as isValidEvmAddress,m as isValidNumber,H as isValidSolanaAddress,pe as isValidWalletAddress,se as keyBy,ie as mapKeys,ae as mapValues,ve as parseTokenProtocolFamily,et as searchImageUrl,tt as searchTwitterUrl,ee as throttle,_e as truncateAddress,rt as twitterTweetUrl,nt as twitterUserUrl,Je as txExplorerUrl,ne as uniqBy,U as version};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/chain.ts","../src/errors.ts","../src/dateTime.ts","../src/fetch.ts","../src/number.ts","../src/string.ts","../src/symbol.ts","../src/tokenProtocols.ts","../src/tokens.ts","../src/urls.ts","../src/index.ts"],"sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/utils\"] = \"0.1.28\";\n}\n\nexport default \"0.1.28\";\n","import { address } from \"@solana/kit\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst solanaChains: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\n/** Returns the chain namespace (EVM or SOLANA) for a given chain */\nexport function chainToNamespace(chain: Chain): ChainNamespace {\n return solanaChains.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst chainSlugs: Partial<Record<Chain, string>> = {\n [Chain.ETHEREUM]: \"ethereum\",\n [Chain.UBIQ]: \"ubiq\",\n [Chain.OPTIMISM]: \"optimism\",\n [Chain.FLARE]: \"flare\",\n [Chain.SONGBIRD]: \"songbird\",\n [Chain.ELASTOS]: \"elastos\",\n [Chain.KARDIA]: \"kardia\",\n [Chain.CRONOS]: \"cronos\",\n [Chain.RSK]: \"rsk\",\n [Chain.TELOS]: \"telos\",\n [Chain.LUKSO]: \"lukso\",\n [Chain.CRAB]: \"crab\",\n [Chain.DARWINIA]: \"darwinia\",\n [Chain.XDC]: \"xdc\",\n [Chain.CSC]: \"csc\",\n [Chain.ZYX]: \"zyx\",\n [Chain.BINANCE]: \"binance\",\n [Chain.SYSCOIN]: \"syscoin\",\n [Chain.GOCHAIN]: \"gochain\",\n [Chain.ETHEREUMCLASSIC]: \"ethereumclassic\",\n [Chain.OKEXCHAIN]: \"okexchain\",\n [Chain.HOO]: \"hoo\",\n [Chain.METER]: \"meter\",\n [Chain.NOVA_NETWORK]: \"nova network\",\n [Chain.TOMOCHAIN]: \"tomochain\",\n [Chain.BITKUB]: \"bitkub\",\n [Chain.XDAI]: \"xdai\",\n [Chain.SOLANA]: \"solana\",\n [Chain.VELAS]: \"velas\",\n [Chain.THUNDERCORE]: \"thundercore\",\n [Chain.ENULS]: \"enuls\",\n [Chain.FUSE]: \"fuse\",\n [Chain.HECO]: \"heco\",\n [Chain.UNICHAIN]: \"unichain\",\n [Chain.POLYGON]: \"polygon\",\n [Chain.SONIC]: \"sonic\",\n [Chain.SHIMMER_EVM]: \"shimmer_evm\",\n [Chain.RBN]: \"rbn\",\n [Chain.OMNI]: \"omni\",\n [Chain.MANTA]: \"manta\",\n [Chain.HSK]: \"hsk\",\n [Chain.WATER]: \"water\",\n [Chain.XLAYER]: \"xlayer\",\n [Chain.XDAIARB]: \"xdaiarb\",\n [Chain.OP_BNB]: \"op_bnb\",\n [Chain.VINUCHAIN]: \"vinuchain\",\n [Chain.ENERGYWEB]: \"energyweb\",\n [Chain.OASYS]: \"oasys\",\n [Chain.FANTOM]: \"fantom\",\n [Chain.FRAXTAL]: \"fraxtal\",\n [Chain.HPB]: \"hpb\",\n [Chain.BOBA]: \"boba\",\n [Chain.OMAX]: \"omax\",\n [Chain.FILECOIN]: \"filecoin\",\n [Chain.KUCOIN]: \"kucoin\",\n [Chain.ZKSYNC_ERA]: \"zksync era\",\n [Chain.SHIDEN]: \"shiden\",\n [Chain.THETA]: \"theta\",\n [Chain.PULSE]: \"pulse\",\n [Chain.CRONOS_ZKEVM]: \"cronos zkevm\",\n [Chain.SX]: \"sx\",\n [Chain.AREON]: \"areon\",\n [Chain.WC]: \"wc\",\n [Chain.CANDLE]: \"candle\",\n [Chain.ROLLUX]: \"rollux\",\n [Chain.ASTAR]: \"astar\",\n [Chain.REDSTONE]: \"redstone\",\n [Chain.MATCHAIN]: \"matchain\",\n [Chain.CALLISTO]: \"callisto\",\n [Chain.TARA]: \"tara\",\n [Chain.WANCHAIN]: \"wanchain\",\n [Chain.LYRA_CHAIN]: \"lyra chain\",\n [Chain.BIFROST]: \"bifrost\",\n [Chain.CONFLUX]: \"conflux\",\n [Chain.METIS]: \"metis\",\n [Chain.DYMENSION]: \"dymension\",\n [Chain.POLYGON_ZKEVM]: \"polygon zkevm\",\n [Chain.CORE]: \"core\",\n [Chain.LISK]: \"lisk\",\n [Chain.ULTRON]: \"ultron\",\n [Chain.STEP]: \"step\",\n [Chain.MOONBEAM]: \"moonbeam\",\n [Chain.MOONRIVER]: \"moonriver\",\n [Chain.SEI]: \"sei\",\n [Chain.LIVING_ASSETS_MAINNET]: \"living assets mainnet\",\n [Chain.STY]: \"sty\",\n [Chain.TENET]: \"tenet\",\n [Chain.GRAVITY]: \"gravity\",\n [Chain.REYA_NETWORK]: \"reya network\",\n [Chain.SONEIUM]: \"soneium\",\n [Chain.SWELLCHAIN]: \"swellchain\",\n [Chain.ONUS]: \"onus\",\n [Chain.HUBBLENET]: \"hubblenet\",\n [Chain.SANKO]: \"sanko\",\n [Chain.DOGECHAIN]: \"dogechain\",\n [Chain.MILKOMEDA]: \"milkomeda\",\n [Chain.MILKOMEDA_A1]: \"milkomeda_a1\",\n [Chain.KAVA]: \"kava\",\n [Chain.SOMA]: \"soma\",\n [Chain.KARAK]: \"karak\",\n [Chain.ABSTRACT]: \"abstract\",\n [Chain.MORPH]: \"morph\",\n [Chain.CROSSFI]: \"crossfi\",\n [Chain.BEAM]: \"beam\",\n [Chain.IOTEX]: \"iotex\",\n [Chain.MANTLE]: \"mantle\",\n [Chain.XLC]: \"xlc\",\n [Chain.NAHMII]: \"nahmii\",\n [Chain.BOUNCEBIT]: \"bouncebit\",\n [Chain.TOMBCHAIN]: \"tombchain\",\n [Chain.ZETACHAIN]: \"zetachain\",\n [Chain.PLANQ]: \"planq\",\n [Chain.BITROCK]: \"bitrock\",\n [Chain.XSAT]: \"xsat\",\n [Chain.CYETH]: \"cyeth\",\n [Chain.CANTO]: \"canto\",\n [Chain.KLAYTN]: \"klaytn\",\n [Chain.THAT]: \"that\",\n [Chain.BASE]: \"base\",\n [Chain.HELA]: \"hela\",\n [Chain.IOTAEVM]: \"iotaevm\",\n [Chain.JBC]: \"jbc\",\n [Chain.EVMOS]: \"evmos\",\n [Chain.CARBON]: \"carbon\",\n [Chain.SMARTBCH]: \"smartbch\",\n [Chain.ARTELA]: \"artela\",\n [Chain.IMMUTABLE_ZKEVM]: \"immutable zkevm\",\n [Chain.LOOP]: \"loop\",\n [Chain.GENESYS]: \"genesys\",\n [Chain.EOS_EVM]: \"eos evm\",\n [Chain.MAP_PROTOCOL]: \"map protocol\",\n [Chain.SAPPHIRE]: \"sapphire\",\n [Chain.BITGERT]: \"bitgert\",\n [Chain.FUSION]: \"fusion\",\n [Chain.ZILLIQA]: \"zilliqa\",\n [Chain.APECHAIN]: \"apechain\",\n [Chain.EDU_CHAIN]: \"edu chain\",\n [Chain.ARBITRUM]: \"arbitrum\",\n [Chain.ARBITRUM_NOVA]: \"arbitrum nova\",\n [Chain.CELO]: \"celo\",\n [Chain.OASIS]: \"oasis\",\n [Chain.ASSETCHAIN]: \"assetchain\",\n [Chain.ETHERLINK]: \"etherlink\",\n [Chain.AVALANCHE]: \"avalanche\",\n [Chain.REI]: \"rei\",\n [Chain.ZIRCUIT]: \"zircuit\",\n [Chain.SOPHON]: \"sophon\",\n [Chain.ETN]: \"etn\",\n [Chain.SUPERPOSITION]: \"superposition\",\n [Chain.REICHAIN]: \"reichain\",\n [Chain.BOBA_BNB]: \"boba_bnb\",\n [Chain.INK]: \"ink\",\n [Chain.LINEA]: \"linea\",\n [Chain.BOB]: \"bob\",\n [Chain.GODWOKEN]: \"godwoken\",\n [Chain.BERACHAIN]: \"berachain\",\n [Chain.BLAST]: \"blast\",\n [Chain.CHILIZ]: \"chiliz\",\n [Chain.STRATIS]: \"stratis\",\n [Chain.REAL]: \"real\",\n [Chain.ODYSSEY]: \"odyssey\",\n [Chain.TAIKO]: \"taiko\",\n [Chain.BITLAYER]: \"bitlayer\",\n [Chain.HYDRATION]: \"hydration\",\n [Chain.PAREX]: \"parex\",\n [Chain.POLIS]: \"polis\",\n [Chain.KEKCHAIN]: \"kekchain\",\n [Chain.SCROLL]: \"scroll\",\n [Chain.ZERO_NETWORK]: \"zero_network\",\n [Chain.ZKLINK_NOVA]: \"zklink nova\",\n [Chain.VISION]: \"vision\",\n [Chain.SAAKURU]: \"saakuru\",\n [Chain.ZORA]: \"zora\",\n [Chain.CORN]: \"corn\",\n [Chain.NEON]: \"neon\",\n [Chain.LUMIA]: \"lumia\",\n [Chain.AURORA]: \"aurora\",\n [Chain.HARMONY]: \"harmony\",\n [Chain.PALM]: \"palm\",\n [Chain.ZENIQ]: \"zeniq\",\n [Chain.CURIO]: \"curio\",\n [Chain.MODE]: \"mode\",\n};\n\nconst chainSlugAbbrs: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"sol\",\n [Chain.ETHEREUM]: \"eth\",\n [Chain.BINANCE]: \"bsc\",\n [Chain.ARBITRUM]: \"arb\",\n [Chain.OPTIMISM]: \"opt\",\n [Chain.AVALANCHE]: \"avax\",\n};\n\nconst chainColors: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"#9945FF\",\n [Chain.ETHEREUM]: \"#627EEA\",\n [Chain.BINANCE]: \"#F0B90B\",\n [Chain.ARBITRUM]: \"#28A0F0\",\n [Chain.OPTIMISM]: \"#FF0420\",\n [Chain.AVALANCHE]: \"#E84142\",\n [Chain.POLYGON]: \"#8247E5\",\n [Chain.BASE]: \"#0052FF\",\n [Chain.SONIC]: \"#5B6EF5\",\n [Chain.LINEA]: \"#61DFFF\",\n [Chain.SCROLL]: \"#FFEEDA\",\n [Chain.BLAST]: \"#FCFC03\",\n [Chain.CRONOS]: \"#002D74\",\n [Chain.BERACHAIN]: \"#964B00\",\n};\n\nexport function chainColor(chainId: Chain): string | undefined {\n return chainColors[chainId];\n}\n\nexport function chainIcon(chain: Chain | string): string | undefined {\n const chainId = chainIdBySlug(chain) ?? chain;\n const slug = chainSlugs[chainId as Chain];\n return slug\n ? `https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(slug)}.jpg`\n : undefined;\n}\n\nexport function chainSlug(chainId: Chain): string | undefined {\n return chainSlugs[chainId];\n}\n\nexport function chainDisplayName(chainId: Chain): string {\n const abbr = chainSlugAbbrs[chainId];\n if (abbr) return abbr.toUpperCase();\n const slug = chainSlugs[chainId];\n if (slug) return slug.replace(/\\b\\w/g, (c) => c.toUpperCase());\n return chainId;\n}\n\nconst slugToChainId: Map<string, Chain> = new Map();\nfor (const [chainId, abbr] of Object.entries(chainSlugAbbrs)) {\n if (abbr) slugToChainId.set(abbr.toLowerCase(), chainId as Chain);\n}\nfor (const [chainId, slug] of Object.entries(chainSlugs)) {\n const key = slug?.toLowerCase();\n if (key && !slugToChainId.has(key)) slugToChainId.set(key, chainId as Chain);\n}\n\nexport function chainIdBySlug(slug: string): Chain | undefined {\n return slugToChainId.get(slug.toLowerCase());\n}\n\nexport function isValidWalletAddress(chain: Chain | string, addr: string) {\n const chainId = (chainIdBySlug(chain) ?? chain) as Chain;\n const namespace = chainToNamespace(chainId);\n switch (namespace) {\n case ChainNamespace.SOLANA:\n return isValidSolanaAddress(addr);\n case ChainNamespace.EVM:\n return isValidEvmAddress(addr);\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n}\n\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport function isValidEvmAddress(value: string) {\n return EVM_ADDRESS_RE.test(value);\n}\n\nexport function isValidSolanaAddress(value: string) {\n try {\n address(value);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n return false;\n }\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n public readonly code: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n","const MINUTE = 60;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst YEAR = 365 * DAY;\n\nexport interface FormatAgeOptions {\n justNow?: string;\n secondsAgo?: string;\n minutesAgo?: string;\n hoursAgo?: string;\n daysAgo?: string;\n yearsAgo?: string;\n}\n\nconst defaultLabels: Required<FormatAgeOptions> = {\n justNow: \"just now\",\n secondsAgo: \"{n}s\",\n minutesAgo: \"{n}m\",\n hoursAgo: \"{n}h\",\n daysAgo: \"{n}d\",\n yearsAgo: \"{n}y\",\n};\n\n/**\n * Formats an age (elapsed time) given in **seconds** into a compact\n * human-readable string like \"3m\", \"2h\", or \"just now\".\n *\n * Use this when you already have the elapsed time in seconds (e.g. from\n * a server-provided `age` field). If you have milliseconds instead, use\n * {@link formatAge}.\n *\n * @example\n * formatAgeInSeconds(5) // \"just now\" (< 10s)\n * formatAgeInSeconds(45) // \"45s\"\n * formatAgeInSeconds(120) // \"2m\"\n * formatAgeInSeconds(7200) // \"2h\"\n * formatAgeInSeconds(172800) // \"2d\"\n * formatAgeInSeconds(63072000) // \"2y\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAgeInSeconds(120, { minutesAgo: \"{n} minutes ago\" }) // \"2 minutes ago\"\n */\nexport function formatAgeInSeconds(\n age: number,\n options: FormatAgeOptions = {},\n): string {\n const labels = { ...defaultLabels, ...options };\n\n if (age < 10) return labels.justNow;\n if (age < MINUTE) return labels.secondsAgo.replace(\"{n}\", String(age));\n\n if (age < HOUR) {\n return labels.minutesAgo.replace(\"{n}\", String(Math.floor(age / MINUTE)));\n }\n if (age < DAY) {\n return labels.hoursAgo.replace(\"{n}\", String(Math.floor(age / HOUR)));\n }\n if (age < YEAR) {\n return labels.daysAgo.replace(\"{n}\", String(Math.floor(age / DAY)));\n }\n return labels.yearsAgo.replace(\"{n}\", String(Math.floor(age / YEAR)));\n}\n\n/**\n * Formats an age (elapsed time) given in **milliseconds** into a compact\n * human-readable string. Internally converts to seconds and delegates to\n * {@link formatAgeInSeconds}.\n *\n * This is the primary function used across UI components to display how\n * long ago something happened (e.g. a trade, a tweet, a channel update).\n *\n * @example\n * formatAge(3000) // \"just now\" (3 s < 10 s threshold)\n * formatAge(45000) // \"45s\"\n * formatAge(120000) // \"2m\"\n * formatAge(7200000) // \"2h\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAge(120000, { minutesAgo: \"{n} 分钟前\" }) // \"2 分钟前\"\n */\nexport function formatAge(age: number, options: FormatAgeOptions = {}): string {\n return formatAgeInSeconds(Math.floor(age / 1000), options);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from \"./errors\";\n\nexport async function httpRequest<R = any>(\n url: string,\n options: RequestInit,\n): Promise<R> {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n // const urlInstance = new URL(url);\n const response = await fetch(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n } else {\n try {\n const errorMsg = await response.json();\n if (response.status === 400) {\n throw new ApiError(\n errorMsg.message || errorMsg.code || response.statusText,\n errorMsg.code,\n );\n }\n throw new Error(errorMsg.message || errorMsg.code || response.statusText);\n } catch (e) {\n throw e;\n }\n }\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string,\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nexport async function httpGet<R = any>(\n url: string,\n options?: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function httpPost<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpPut<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpDelete<R = any>(\n url: string,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"DELETE\",\n ...options,\n });\n}\n\nexport async function httpMutate<R = any>(\n url: string,\n init: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, init);\n}\n","import BigNumber from \"bignumber.js\";\n\n// ---------------------------------------------------------------------------\n// SafeBigNumber\n// ---------------------------------------------------------------------------\n\n/**\n * A `BigNumber` subclass that never throws on construction.\n * Invalid / undefined values fall back to `0`.\n */\nexport class SafeBigNumber extends BigNumber {\n constructor(num?: BigNumber.Value, base?: number) {\n try {\n super(num ?? 0, base);\n } catch (e) {\n console.error(\"SafeBigNumber constructor error\", e);\n super(0, base);\n }\n }\n}\n\ndeclare namespace SafeBigNumber {\n type Value = BigNumber.Value;\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport const isValidNumber = (num: unknown) => {\n if (\n (\"number\" === typeof num && !isNaN(num)) ||\n num instanceof SafeBigNumber ||\n num instanceof BigNumber\n ) {\n return true;\n }\n if (\"string\" !== typeof num) {\n return false;\n }\n const floatNum = Number.parseFloat(num);\n return !isNaN(floatNum);\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst subscriptDigits = [\n \"₀\",\n \"₁\",\n \"₂\",\n \"₃\",\n \"₄\",\n \"₅\",\n \"₆\",\n \"₇\",\n \"₈\",\n \"₉\",\n \"₁₀\",\n \"₁₁\",\n \"₁₂\",\n \"₁₃\",\n \"₁₄\",\n \"₁₅\",\n \"₁₆\",\n \"₁₇\",\n \"₁₈\",\n \"₁₉\",\n \"₂₀\",\n \"₂₁\",\n \"₂₂\",\n \"₂₃\",\n \"₂₄\",\n \"₂₅\",\n \"₂₆\",\n \"₂₇\",\n \"₂₈\",\n \"₂₉\",\n \"₃₀\",\n \"₃₁\",\n \"₃₂\",\n \"₃₃\",\n \"₃₄\",\n \"₃₅\",\n \"₃₆\",\n \"₃₇\",\n \"₃₈\",\n \"₃₉\",\n \"₄₀\",\n];\n\n/**\n * Add thousand-separators (commas) and truncate to `precision` decimals.\n *\n * stringifyNumberWithGroupingSeparator(12345.6789, 2) → \"12,345.67\"\n */\nconst stringifyNumberWithGroupingSeparator = (\n num: BigNumber.Value,\n precision: number = 0,\n rounding: BigNumber.RoundingMode = BigNumber.ROUND_DOWN,\n) => {\n const bn = new SafeBigNumber(num);\n const parts = bn.decimalPlaces(precision, rounding).toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n};\n\n/**\n * Abbreviate large numbers with K / M / B / T suffixes.\n *\n * stringifyNumberWithAbbreviation(1234) → \"1.2K\"\n * stringifyNumberWithAbbreviation(5_600_000) → \"5.6M\"\n */\nconst stringifyNumberWithAbbreviation = (\n num: BigNumber.Value,\n precision: number = 1,\n) => {\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? bn.toNumber()\n : bn.lt(1e6)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e3), precision)}K`\n : bn.lt(1e9)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e6), precision)}M`\n : bn.lt(1e12)\n ? `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e9), precision)}B`\n : `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e12), precision)}T`;\n};\n\n/**\n * Display tiny decimals with Unicode subscript zero-count notation.\n * E.g. `0.00000382` → `\"0.0₅382\"` (5 leading zeros after the decimal).\n */\nconst stringifyNumberWithLeadingZeroSubscripts = (\n num: BigNumber.Value,\n precision: number = 5,\n) => {\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return \"0\";\n const [integerPart, decimalPart] = bn.toFixed().split(\".\");\n const digits = decimalPart.split(\"\");\n const firstNonZeroIndex = digits.findIndex((num) => \"0\" !== num);\n const precisionDigitsCount = Math.min(\n digits.length - firstNonZeroIndex,\n precision,\n );\n return `${stringifyNumberWithGroupingSeparator(integerPart)}.0`\n .concat(subscriptDigits[firstNonZeroIndex])\n .concat(\n digits\n .slice(firstNonZeroIndex, firstNonZeroIndex + precisionDigitsCount)\n .join(\"\")\n .replace(/\\.?0+$/, \"\"),\n );\n};\n\n/**\n * Round to `precision` *significant* decimal digits (skipping leading zeros).\n * E.g. `0.00456` with precision 2 → keeps 5 decimal places → `\"0.00456\"`.\n */\nconst stringifyNumberWithSignificantPrecision = (\n num: BigNumber,\n precision: number,\n) => {\n const matched = num.toString().match(/\\.0*/);\n const significantPrecision =\n (matched ? matched[0].length - 1 : 0) + precision;\n return stringifyNumberWithGroupingSeparator(num, significantPrecision);\n};\n\nconst stringifyPercent = (bn: BigNumber, precision: number) =>\n `${bn.times(100).decimalPlaces(precision, BigNumber.ROUND_HALF_UP).toString()}%`;\n\n// ---------------------------------------------------------------------------\n// Public formatting functions\n// ---------------------------------------------------------------------------\n\nexport type FormatAmountOptions = {\n showPlusGtThanZero: boolean;\n};\n\n/**\n * Format a raw token / asset amount (no currency symbol).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | 5 decimal places | 0.0001234 → \"0.00012\" |\n * | < 1 | 3 decimal places | 0.56789 → \"0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"42.67\" |\n * | < 100 000 | grouped, 2 dp | 12345.6 → \"12,345.60\" |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | 1_500_000 → \"1.5M\" |\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmount = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? abs.decimalPlaces(5, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1)\n ? abs.decimalPlaces(3, BigNumber.ROUND_DOWN).toString()\n : abs.lt(100)\n ? abs.decimalPlaces(2, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n if (Number(formatted) === 0) return `${formatted}`;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return `${formatted}`;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix (standard precision).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 10 000 | grouped, 2 dp | 1234.5 → \"$1,234.50\" |\n * | ≥ 10 000 | abbreviated (K/M/B/T) | 1_500_000 → \"$1.5M\" |\n *\n * Use this for standard financial displays (volume, market cap, liquidity).\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSD = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e4)\n ? `$${stringifyNumberWithGroupingSeparator(abs, 2)}`\n : `$${stringifyNumberWithAbbreviation(abs)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix — **compact** variant.\n *\n * Compared to {@link formatAmountUSD}, this variant is more aggressively\n * rounded and suited for space-constrained UIs (cards, badges, list items):\n *\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 1 000 | 0 decimal places | 567.89 → \"$567\" |\n * | ≥ 1 000 | abbreviated, 0 dp, | 15 678 → \"$15.6K\" |\n * | | rounded to nearest 100 | 1 234 567 → \"$1.2M\" |\n *\n * Key differences from `formatAmountUSD`:\n * - 100–1 000: shows 0 dp instead of 2 dp\n * - ≥ 1 000: abbreviates earlier (1K vs 10K) with 0 precision, rounded to 100s\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSDCompact = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const roundedAbs = abs.div(100).integerValue(BigNumber.ROUND_DOWN).times(100);\n\n const formatted =\n abs.lt(1e-4) || abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e3)\n ? `$${abs.decimalPlaces(0, BigNumber.ROUND_DOWN)}`\n : `$${stringifyNumberWithAbbreviation(roundedAbs, 0)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\nexport type FormatPriceOptions = {\n isHighPrecise: boolean;\n};\n\n/**\n * Format a token price (no currency symbol).\n *\n * Same precision tiers as {@link formatPriceUSD} but without the \"$\" prefix.\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPrice = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `${formatted}`;\n};\n\n/**\n * Format a token price with \"$\" prefix.\n *\n * Two precision modes controlled by `isHighPrecise` (default: `true`):\n *\n * | Range | High precision (default) | Low precision |\n * |---------------|-------------------------------|------------------------------|\n * | < 0.0001 | subscript notation, 4 sig | subscript notation, 2 sig |\n * | | 0.0000382 → \"$0.0₄382\" | 0.0000382 → \"$0.0₄38\" |\n * | < 1 | 4 dp, grouped | 2 significant dp |\n * | | 0.12345 → \"$0.1234\" | 0.12345 → \"$0.12\" |\n * | < 10 000 | 4 dp, grouped | 2 dp, grouped |\n * | | 1234.567 → \"$1,234.5670\" | 1234.567 → \"$1,234.56\" |\n * | < 100 000 | 2 dp, grouped | 2 dp, grouped |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | abbreviated (K/M/B/T) |\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPriceUSD = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `$${formatted}`;\n};\n\nexport type FormatPercentOptions = {\n showPlusGtThanZero?: boolean;\n precision?: number;\n};\n\n/**\n * Format a ratio as a percentage string.\n *\n * The input is a **ratio** (0.3 = 30%, 1.5 = 150%).\n *\n * | Input range | Output example |\n * |---------------|-----------------------------------------|\n * | < 0.0001 | \"0%\" |\n * | < 100 | \"56.79%\" (2 dp by default) |\n * | < 1000 | \"15,000.5%\" (1 dp by default) |\n * | ≥ 1000 | \"> 99,999%\" |\n *\n * @param num - The ratio value (0.3 means 30%).\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n * @param options.precision - Decimal precision override.\n */\nexport const formatPercent = (\n num: BigNumber.Value = \"\",\n options: FormatPercentOptions = {},\n) => {\n if (!isValidNumber(num)) return \"-- %\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const sign = negative ? \"-\" : options?.showPlusGtThanZero ? \"+\" : \"\";\n\n if (abs.lt(1e-4)) return \"0%\";\n if (abs.lt(100))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 2)}`;\n if (abs.lt(1e3))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 1)}`;\n return `${sign}> 99,999%`;\n};\n","/**\n * Capitalize the first letter of a string, lowercasing the rest.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n * capitalize(\"hELLO\") // \"Hello\"\n * capitalize(\"solana\") // \"Solana\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Truncate an address (or any string) to show the first `start` and last `end`\n * characters with \"...\" in between.\n *\n * @param address - The full address string.\n * @param start - Number of characters to keep from the beginning (default 6).\n * @param end - Number of characters to keep from the end (default 4).\n *\n * @example\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\")\n * // \"0x1234...5678\"\n *\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\", 4, 4)\n * // \"0x12...5678\"\n */\nexport function truncateAddress(\n address: string,\n start: number = 6,\n end: number = 4,\n): string {\n return address.slice(0, start) + \"...\" + address.slice(-end);\n}\n","/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import {\n Chain,\n SOLANA_TOKEN_PROTOCOLS,\n TokenProtocol,\n} from \"@liberfi.io/types\";\n\nconst SOLANA_PROTOCOL_SET = new Set<string>(SOLANA_TOKEN_PROTOCOLS);\n\n/** Sorted by length descending so \"pump-amm\" is tested before \"pump\". */\nconst SOLANA_PROTOCOLS_BY_SPECIFICITY = [...SOLANA_TOKEN_PROTOCOLS].sort(\n (a, b) => b.length - a.length,\n);\n\nexport const parseTokenProtocolFamily = (\n chain: Chain,\n protocolFamily: string,\n): TokenProtocol | undefined => {\n if (chain !== Chain.SOLANA) return undefined;\n\n const normalized = protocolFamily.toLowerCase();\n\n if (SOLANA_PROTOCOL_SET.has(normalized)) {\n return normalized as TokenProtocol;\n }\n\n return SOLANA_PROTOCOLS_BY_SPECIFICITY.find((p) => normalized.includes(p));\n};\n\nexport const formatTokenProtocolName = (protocol: TokenProtocol): string => {\n return protocol\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n};\n","import { Chain } from \"@liberfi.io/types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PredefinedToken {\n address: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface ChainPredefinedTokens {\n native: PredefinedToken;\n wrapped: PredefinedToken;\n stablecoins: Record<string, PredefinedToken>;\n}\n\n// ---------------------------------------------------------------------------\n// EVM common\n// ---------------------------------------------------------------------------\n\nconst EVM_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\n// ---------------------------------------------------------------------------\n// Solana\n// ---------------------------------------------------------------------------\n\nexport const SOLANA_TOKENS: ChainPredefinedTokens = {\n native: {\n address: \"11111111111111111111111111111111\",\n symbol: \"SOL\",\n decimals: 9,\n },\n wrapped: {\n address: \"So11111111111111111111111111111111111111112\",\n symbol: \"SOL\",\n decimals: 9,\n },\n stablecoins: {\n USDC: {\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n symbol: \"USDT\",\n decimals: 6,\n },\n USD1: {\n address: \"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB\",\n symbol: \"USD1\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Ethereum\n// ---------------------------------------------------------------------------\n\nexport const ETHEREUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// BSC (Binance Smart Chain)\n// ---------------------------------------------------------------------------\n\nexport const BSC_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"BNB\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n symbol: \"WBNB\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\",\n symbol: \"USDC\",\n decimals: 18,\n },\n USDT: {\n address: \"0x55d398326f99059fF775485246999027B3197955\",\n symbol: \"USDT\",\n decimals: 18,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrum\n// ---------------------------------------------------------------------------\n\nexport const ARBITRUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Optimism\n// ---------------------------------------------------------------------------\n\nexport const OPTIMISM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x4200000000000000000000000000000000000006\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Avalanche\n// ---------------------------------------------------------------------------\n\nexport const AVALANCHE_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"AVAX\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n symbol: \"WAVAX\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Chain -> Tokens index\n// ---------------------------------------------------------------------------\n\nexport const CHAIN_TOKENS: Partial<Record<Chain, ChainPredefinedTokens>> = {\n [Chain.SOLANA]: SOLANA_TOKENS,\n [Chain.ETHEREUM]: ETHEREUM_TOKENS,\n [Chain.BINANCE]: BSC_TOKENS,\n [Chain.ARBITRUM]: ARBITRUM_TOKENS,\n [Chain.OPTIMISM]: OPTIMISM_TOKENS,\n [Chain.AVALANCHE]: AVALANCHE_TOKENS,\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nexport function getNativeToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.native;\n}\n\nexport function getWrappedToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.wrapped;\n}\n\nexport function getStablecoins(\n chain: Chain,\n): Record<string, PredefinedToken> | undefined {\n return CHAIN_TOKENS[chain]?.stablecoins;\n}\n\n/** Returns all predefined token addresses for the given chain (native + wrapped + stablecoins). */\nexport function getCommonTokenAddresses(chain: Chain): string[] {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return [];\n return [\n tokens.native.address,\n tokens.wrapped.address,\n ...Object.values(tokens.stablecoins).map((t) => t.address),\n ];\n}\n\n/** Returns an address -> symbol map for all predefined tokens on the given chain. */\nexport function getCommonTokenSymbolsMap(chain: Chain): Record<string, string> {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return {};\n const map: Record<string, string> = {\n [tokens.native.address]: tokens.native.symbol,\n [tokens.wrapped.address]: tokens.wrapped.symbol,\n };\n for (const t of Object.values(tokens.stablecoins)) {\n map[t.address] = t.symbol;\n }\n return map;\n}\n","import { Chain } from \"@liberfi.io/types\";\n\nconst TX_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/tx/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/tx/\",\n [Chain.POLYGON]: \"https://polygonscan.com/tx/\",\n [Chain.BINANCE]: \"https://bscscan.com/tx/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/tx/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/tx/\",\n [Chain.BASE]: \"https://basescan.org/tx/\",\n [Chain.BLAST]: \"https://blastracker.xyz/tx/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/tx/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/tx/\",\n};\n\nconst ACCOUNT_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/account/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/address/\",\n [Chain.POLYGON]: \"https://polygonscan.com/address/\",\n [Chain.BINANCE]: \"https://bscscan.com/address/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/address/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/address/\",\n [Chain.BASE]: \"https://basescan.org/address/\",\n [Chain.BLAST]: \"https://blastracker.xyz/address/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/address/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/address/\",\n};\n\nfunction explorerUrl(\n urls: Partial<Record<Chain, string>>,\n chainId: Chain,\n value: string,\n): string | undefined {\n const base = urls[chainId];\n return base ? `${base}${value}` : undefined;\n}\n\nexport function txExplorerUrl(\n chainId: Chain,\n txHash: string,\n): string | undefined {\n return explorerUrl(TX_EXPLORER_URLS, chainId, txHash);\n}\n\nexport function accountExplorerUrl(\n chainId: Chain,\n account: string,\n): string | undefined {\n return explorerUrl(ACCOUNT_EXPLORER_URLS, chainId, account);\n}\n\nexport function searchImageUrl(image: string): string {\n return `https://lens.google.com/uploadbyurl?url=${encodeURIComponent(image)}`;\n}\n\nexport function searchTwitterUrl(q: string): string {\n return `https://x.com/search?q=${encodeURIComponent(q)}`;\n}\n\nexport function twitterUserUrl(username: string): string {\n return `https://x.com/${username}`;\n}\n\nexport function twitterTweetUrl(id: string): string {\n return `https://x.com/i/status/${id}`;\n}\n","export { default as version } from \"./version\";\nexport * from \"./chain\";\nexport * from \"./errors\";\nexport * from \"./dateTime\";\nexport * from \"./fetch\";\nexport * from \"./number\";\nexport * from \"./string\";\nexport * from \"./symbol\";\nexport * from \"./tokenProtocols\";\nexport * from \"./tokens\";\nexport * from \"./urls\";\n\nexport {\n throttle,\n debounce,\n uniqBy,\n intersectionBy,\n keyBy,\n groupBy,\n mapKeys,\n mapValues,\n} from \"lodash-es\";\n"],"mappings":"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","names":["version_default","address","Chain","ChainNamespace","solanaChains","chainToNamespace","chain","chainSlugs","chainSlugAbbrs","chainColors","chainColor","chainId","chainIcon","_a","chainIdBySlug","slug","chainSlug","chainDisplayName","abbr","c","slugToChainId","key","isValidWalletAddress","addr","isValidSolanaAddress","isValidEvmAddress","EVM_ADDRESS_RE","value","e","ApiError","message","code","defaultLabels","formatAgeInSeconds","age","options","labels","__spreadValues","formatAge","httpRequest","url","options","__async","response","__spreadProps","__spreadValues","_createHeaders","errorMsg","ApiError","e","headers","method","_headers","httpGet","httpPost","data","httpPut","httpDelete","httpMutate","init","BigNumber","SafeBigNumber","num","base","e","isValidNumber","floatNum","subscriptDigits","stringifyNumberWithGroupingSeparator","precision","rounding","parts","stringifyNumberWithAbbreviation","bn","stringifyNumberWithLeadingZeroSubscripts","integerPart","decimalPart","digits","firstNonZeroIndex","precisionDigitsCount","stringifyNumberWithSignificantPrecision","matched","significantPrecision","stringifyPercent","formatAmount","options","negative","abs","formatted","formatAmountUSD","formatAmountUSDCompact","roundedAbs","formatPrice","isHighPrecise","formatPriceUSD","formatPercent","_a","_b","sign","capitalize","str","truncateAddress","address","start","end","formatSymbol","symbol","formatString","arr","type","base","quote","Chain","SOLANA_TOKEN_PROTOCOLS","SOLANA_PROTOCOL_SET","SOLANA_PROTOCOLS_BY_SPECIFICITY","a","b","parseTokenProtocolFamily","chain","protocolFamily","normalized","p","formatTokenProtocolName","protocol","word","Chain","EVM_NATIVE_ADDRESS","SOLANA_TOKENS","ETHEREUM_TOKENS","BSC_TOKENS","ARBITRUM_TOKENS","OPTIMISM_TOKENS","AVALANCHE_TOKENS","CHAIN_TOKENS","getNativeToken","chain","_a","getWrappedToken","getStablecoins","getCommonTokenAddresses","tokens","t","getCommonTokenSymbolsMap","map","Chain","TX_EXPLORER_URLS","ACCOUNT_EXPLORER_URLS","explorerUrl","urls","chainId","value","base","txExplorerUrl","txHash","accountExplorerUrl","account","searchImageUrl","image","searchTwitterUrl","q","twitterUserUrl","username","twitterTweetUrl","id","throttle","debounce","uniqBy","intersectionBy","keyBy","groupBy","mapKeys","mapValues"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/chain.ts","../src/errors.ts","../src/dateTime.ts","../src/fetch.ts","../src/number.ts","../src/string.ts","../src/symbol.ts","../src/tokenProtocols.ts","../src/tokens.ts","../src/urls.ts","../src/timing.ts","../src/collection.ts"],"sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/utils\"] = \"0.1.30\";\n}\n\nexport default \"0.1.30\";\n","import { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst solanaChains: ReadonlySet<Chain> = new Set([\n Chain.SOLANA,\n Chain.SOLANA_TESTNET,\n Chain.SOLANA_DEVNET,\n]);\n\n/** Returns the chain namespace (EVM or SOLANA) for a given chain */\nexport function chainToNamespace(chain: Chain): ChainNamespace {\n return solanaChains.has(chain) ? ChainNamespace.SOLANA : ChainNamespace.EVM;\n}\n\nconst chainSlugs: Partial<Record<Chain, string>> = {\n [Chain.ETHEREUM]: \"ethereum\",\n [Chain.UBIQ]: \"ubiq\",\n [Chain.OPTIMISM]: \"optimism\",\n [Chain.FLARE]: \"flare\",\n [Chain.SONGBIRD]: \"songbird\",\n [Chain.ELASTOS]: \"elastos\",\n [Chain.KARDIA]: \"kardia\",\n [Chain.CRONOS]: \"cronos\",\n [Chain.RSK]: \"rsk\",\n [Chain.TELOS]: \"telos\",\n [Chain.LUKSO]: \"lukso\",\n [Chain.CRAB]: \"crab\",\n [Chain.DARWINIA]: \"darwinia\",\n [Chain.XDC]: \"xdc\",\n [Chain.CSC]: \"csc\",\n [Chain.ZYX]: \"zyx\",\n [Chain.BINANCE]: \"binance\",\n [Chain.SYSCOIN]: \"syscoin\",\n [Chain.GOCHAIN]: \"gochain\",\n [Chain.ETHEREUMCLASSIC]: \"ethereumclassic\",\n [Chain.OKEXCHAIN]: \"okexchain\",\n [Chain.HOO]: \"hoo\",\n [Chain.METER]: \"meter\",\n [Chain.NOVA_NETWORK]: \"nova network\",\n [Chain.TOMOCHAIN]: \"tomochain\",\n [Chain.BITKUB]: \"bitkub\",\n [Chain.XDAI]: \"xdai\",\n [Chain.SOLANA]: \"solana\",\n [Chain.VELAS]: \"velas\",\n [Chain.THUNDERCORE]: \"thundercore\",\n [Chain.ENULS]: \"enuls\",\n [Chain.FUSE]: \"fuse\",\n [Chain.HECO]: \"heco\",\n [Chain.UNICHAIN]: \"unichain\",\n [Chain.POLYGON]: \"polygon\",\n [Chain.SONIC]: \"sonic\",\n [Chain.SHIMMER_EVM]: \"shimmer_evm\",\n [Chain.RBN]: \"rbn\",\n [Chain.OMNI]: \"omni\",\n [Chain.MANTA]: \"manta\",\n [Chain.HSK]: \"hsk\",\n [Chain.WATER]: \"water\",\n [Chain.XLAYER]: \"xlayer\",\n [Chain.XDAIARB]: \"xdaiarb\",\n [Chain.OP_BNB]: \"op_bnb\",\n [Chain.VINUCHAIN]: \"vinuchain\",\n [Chain.ENERGYWEB]: \"energyweb\",\n [Chain.OASYS]: \"oasys\",\n [Chain.FANTOM]: \"fantom\",\n [Chain.FRAXTAL]: \"fraxtal\",\n [Chain.HPB]: \"hpb\",\n [Chain.BOBA]: \"boba\",\n [Chain.OMAX]: \"omax\",\n [Chain.FILECOIN]: \"filecoin\",\n [Chain.KUCOIN]: \"kucoin\",\n [Chain.ZKSYNC_ERA]: \"zksync era\",\n [Chain.SHIDEN]: \"shiden\",\n [Chain.THETA]: \"theta\",\n [Chain.PULSE]: \"pulse\",\n [Chain.CRONOS_ZKEVM]: \"cronos zkevm\",\n [Chain.SX]: \"sx\",\n [Chain.AREON]: \"areon\",\n [Chain.WC]: \"wc\",\n [Chain.CANDLE]: \"candle\",\n [Chain.ROLLUX]: \"rollux\",\n [Chain.ASTAR]: \"astar\",\n [Chain.REDSTONE]: \"redstone\",\n [Chain.MATCHAIN]: \"matchain\",\n [Chain.CALLISTO]: \"callisto\",\n [Chain.TARA]: \"tara\",\n [Chain.WANCHAIN]: \"wanchain\",\n [Chain.LYRA_CHAIN]: \"lyra chain\",\n [Chain.BIFROST]: \"bifrost\",\n [Chain.CONFLUX]: \"conflux\",\n [Chain.METIS]: \"metis\",\n [Chain.DYMENSION]: \"dymension\",\n [Chain.POLYGON_ZKEVM]: \"polygon zkevm\",\n [Chain.CORE]: \"core\",\n [Chain.LISK]: \"lisk\",\n [Chain.ULTRON]: \"ultron\",\n [Chain.STEP]: \"step\",\n [Chain.MOONBEAM]: \"moonbeam\",\n [Chain.MOONRIVER]: \"moonriver\",\n [Chain.SEI]: \"sei\",\n [Chain.LIVING_ASSETS_MAINNET]: \"living assets mainnet\",\n [Chain.STY]: \"sty\",\n [Chain.TENET]: \"tenet\",\n [Chain.GRAVITY]: \"gravity\",\n [Chain.REYA_NETWORK]: \"reya network\",\n [Chain.SONEIUM]: \"soneium\",\n [Chain.SWELLCHAIN]: \"swellchain\",\n [Chain.ONUS]: \"onus\",\n [Chain.HUBBLENET]: \"hubblenet\",\n [Chain.SANKO]: \"sanko\",\n [Chain.DOGECHAIN]: \"dogechain\",\n [Chain.MILKOMEDA]: \"milkomeda\",\n [Chain.MILKOMEDA_A1]: \"milkomeda_a1\",\n [Chain.KAVA]: \"kava\",\n [Chain.SOMA]: \"soma\",\n [Chain.KARAK]: \"karak\",\n [Chain.ABSTRACT]: \"abstract\",\n [Chain.MORPH]: \"morph\",\n [Chain.CROSSFI]: \"crossfi\",\n [Chain.BEAM]: \"beam\",\n [Chain.IOTEX]: \"iotex\",\n [Chain.MANTLE]: \"mantle\",\n [Chain.XLC]: \"xlc\",\n [Chain.NAHMII]: \"nahmii\",\n [Chain.BOUNCEBIT]: \"bouncebit\",\n [Chain.TOMBCHAIN]: \"tombchain\",\n [Chain.ZETACHAIN]: \"zetachain\",\n [Chain.PLANQ]: \"planq\",\n [Chain.BITROCK]: \"bitrock\",\n [Chain.XSAT]: \"xsat\",\n [Chain.CYETH]: \"cyeth\",\n [Chain.CANTO]: \"canto\",\n [Chain.KLAYTN]: \"klaytn\",\n [Chain.THAT]: \"that\",\n [Chain.BASE]: \"base\",\n [Chain.HELA]: \"hela\",\n [Chain.IOTAEVM]: \"iotaevm\",\n [Chain.JBC]: \"jbc\",\n [Chain.EVMOS]: \"evmos\",\n [Chain.CARBON]: \"carbon\",\n [Chain.SMARTBCH]: \"smartbch\",\n [Chain.ARTELA]: \"artela\",\n [Chain.IMMUTABLE_ZKEVM]: \"immutable zkevm\",\n [Chain.LOOP]: \"loop\",\n [Chain.GENESYS]: \"genesys\",\n [Chain.EOS_EVM]: \"eos evm\",\n [Chain.MAP_PROTOCOL]: \"map protocol\",\n [Chain.SAPPHIRE]: \"sapphire\",\n [Chain.BITGERT]: \"bitgert\",\n [Chain.FUSION]: \"fusion\",\n [Chain.ZILLIQA]: \"zilliqa\",\n [Chain.APECHAIN]: \"apechain\",\n [Chain.EDU_CHAIN]: \"edu chain\",\n [Chain.ARBITRUM]: \"arbitrum\",\n [Chain.ARBITRUM_NOVA]: \"arbitrum nova\",\n [Chain.CELO]: \"celo\",\n [Chain.OASIS]: \"oasis\",\n [Chain.ASSETCHAIN]: \"assetchain\",\n [Chain.ETHERLINK]: \"etherlink\",\n [Chain.AVALANCHE]: \"avalanche\",\n [Chain.REI]: \"rei\",\n [Chain.ZIRCUIT]: \"zircuit\",\n [Chain.SOPHON]: \"sophon\",\n [Chain.ETN]: \"etn\",\n [Chain.SUPERPOSITION]: \"superposition\",\n [Chain.REICHAIN]: \"reichain\",\n [Chain.BOBA_BNB]: \"boba_bnb\",\n [Chain.INK]: \"ink\",\n [Chain.LINEA]: \"linea\",\n [Chain.BOB]: \"bob\",\n [Chain.GODWOKEN]: \"godwoken\",\n [Chain.BERACHAIN]: \"berachain\",\n [Chain.BLAST]: \"blast\",\n [Chain.CHILIZ]: \"chiliz\",\n [Chain.STRATIS]: \"stratis\",\n [Chain.REAL]: \"real\",\n [Chain.ODYSSEY]: \"odyssey\",\n [Chain.TAIKO]: \"taiko\",\n [Chain.BITLAYER]: \"bitlayer\",\n [Chain.HYDRATION]: \"hydration\",\n [Chain.PAREX]: \"parex\",\n [Chain.POLIS]: \"polis\",\n [Chain.KEKCHAIN]: \"kekchain\",\n [Chain.SCROLL]: \"scroll\",\n [Chain.ZERO_NETWORK]: \"zero_network\",\n [Chain.ZKLINK_NOVA]: \"zklink nova\",\n [Chain.VISION]: \"vision\",\n [Chain.SAAKURU]: \"saakuru\",\n [Chain.ZORA]: \"zora\",\n [Chain.CORN]: \"corn\",\n [Chain.NEON]: \"neon\",\n [Chain.LUMIA]: \"lumia\",\n [Chain.AURORA]: \"aurora\",\n [Chain.HARMONY]: \"harmony\",\n [Chain.PALM]: \"palm\",\n [Chain.ZENIQ]: \"zeniq\",\n [Chain.CURIO]: \"curio\",\n [Chain.MODE]: \"mode\",\n};\n\nconst chainSlugAbbrs: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"sol\",\n [Chain.ETHEREUM]: \"eth\",\n [Chain.BINANCE]: \"bsc\",\n [Chain.ARBITRUM]: \"arb\",\n [Chain.OPTIMISM]: \"opt\",\n [Chain.AVALANCHE]: \"avax\",\n};\n\nconst chainColors: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"#9945FF\",\n [Chain.ETHEREUM]: \"#627EEA\",\n [Chain.BINANCE]: \"#F0B90B\",\n [Chain.ARBITRUM]: \"#28A0F0\",\n [Chain.OPTIMISM]: \"#FF0420\",\n [Chain.AVALANCHE]: \"#E84142\",\n [Chain.POLYGON]: \"#8247E5\",\n [Chain.BASE]: \"#0052FF\",\n [Chain.SONIC]: \"#5B6EF5\",\n [Chain.LINEA]: \"#61DFFF\",\n [Chain.SCROLL]: \"#FFEEDA\",\n [Chain.BLAST]: \"#FCFC03\",\n [Chain.CRONOS]: \"#002D74\",\n [Chain.BERACHAIN]: \"#964B00\",\n};\n\nexport function chainColor(chainId: Chain): string | undefined {\n return chainColors[chainId];\n}\n\nexport function chainIcon(chain: Chain | string): string | undefined {\n const chainId = chainIdBySlug(chain) ?? chain;\n const slug = chainSlugs[chainId as Chain];\n return slug\n ? `https://icons.llamao.fi/icons/chains/rsz_${encodeURIComponent(slug)}.jpg`\n : undefined;\n}\n\nexport function chainSlug(chainId: Chain): string | undefined {\n return chainSlugs[chainId];\n}\n\nexport function chainDisplayName(chainId: Chain): string {\n const abbr = chainSlugAbbrs[chainId];\n if (abbr) return abbr.toUpperCase();\n const slug = chainSlugs[chainId];\n if (slug) return slug.replace(/\\b\\w/g, (c) => c.toUpperCase());\n return chainId;\n}\n\nconst slugToChainId: Map<string, Chain> = new Map();\nfor (const [chainId, abbr] of Object.entries(chainSlugAbbrs)) {\n if (abbr) slugToChainId.set(abbr.toLowerCase(), chainId as Chain);\n}\nfor (const [chainId, slug] of Object.entries(chainSlugs)) {\n const key = slug?.toLowerCase();\n if (key && !slugToChainId.has(key)) slugToChainId.set(key, chainId as Chain);\n}\n\nexport function chainIdBySlug(slug: string): Chain | undefined {\n return slugToChainId.get(slug.toLowerCase());\n}\n\nexport function isValidWalletAddress(chain: Chain | string, addr: string) {\n const chainId = (chainIdBySlug(chain) ?? chain) as Chain;\n const namespace = chainToNamespace(chainId);\n switch (namespace) {\n case ChainNamespace.SOLANA:\n return isValidSolanaAddress(addr);\n case ChainNamespace.EVM:\n return isValidEvmAddress(addr);\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n}\n\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nexport function isValidEvmAddress(value: string) {\n return EVM_ADDRESS_RE.test(value);\n}\n\nconst SOLANA_BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nexport function isValidSolanaAddress(value: string): boolean {\n return SOLANA_BASE58_RE.test(value);\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n public readonly code: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n","const MINUTE = 60;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst YEAR = 365 * DAY;\n\nexport interface FormatAgeOptions {\n justNow?: string;\n secondsAgo?: string;\n minutesAgo?: string;\n hoursAgo?: string;\n daysAgo?: string;\n yearsAgo?: string;\n}\n\nconst defaultLabels: Required<FormatAgeOptions> = {\n justNow: \"just now\",\n secondsAgo: \"{n}s\",\n minutesAgo: \"{n}m\",\n hoursAgo: \"{n}h\",\n daysAgo: \"{n}d\",\n yearsAgo: \"{n}y\",\n};\n\n/**\n * Formats an age (elapsed time) given in **seconds** into a compact\n * human-readable string like \"3m\", \"2h\", or \"just now\".\n *\n * Use this when you already have the elapsed time in seconds (e.g. from\n * a server-provided `age` field). If you have milliseconds instead, use\n * {@link formatAge}.\n *\n * @example\n * formatAgeInSeconds(5) // \"just now\" (< 10s)\n * formatAgeInSeconds(45) // \"45s\"\n * formatAgeInSeconds(120) // \"2m\"\n * formatAgeInSeconds(7200) // \"2h\"\n * formatAgeInSeconds(172800) // \"2d\"\n * formatAgeInSeconds(63072000) // \"2y\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAgeInSeconds(120, { minutesAgo: \"{n} minutes ago\" }) // \"2 minutes ago\"\n */\nexport function formatAgeInSeconds(\n age: number,\n options: FormatAgeOptions = {},\n): string {\n const labels = { ...defaultLabels, ...options };\n\n if (age < 10) return labels.justNow;\n if (age < MINUTE) return labels.secondsAgo.replace(\"{n}\", String(age));\n\n if (age < HOUR) {\n return labels.minutesAgo.replace(\"{n}\", String(Math.floor(age / MINUTE)));\n }\n if (age < DAY) {\n return labels.hoursAgo.replace(\"{n}\", String(Math.floor(age / HOUR)));\n }\n if (age < YEAR) {\n return labels.daysAgo.replace(\"{n}\", String(Math.floor(age / DAY)));\n }\n return labels.yearsAgo.replace(\"{n}\", String(Math.floor(age / YEAR)));\n}\n\n/**\n * Formats an age (elapsed time) given in **milliseconds** into a compact\n * human-readable string. Internally converts to seconds and delegates to\n * {@link formatAgeInSeconds}.\n *\n * This is the primary function used across UI components to display how\n * long ago something happened (e.g. a trade, a tweet, a channel update).\n *\n * @example\n * formatAge(3000) // \"just now\" (3 s < 10 s threshold)\n * formatAge(45000) // \"45s\"\n * formatAge(120000) // \"2m\"\n * formatAge(7200000) // \"2h\"\n *\n * @example Custom labels (e.g. for i18n)\n * formatAge(120000, { minutesAgo: \"{n} 分钟前\" }) // \"2 分钟前\"\n */\nexport function formatAge(age: number, options: FormatAgeOptions = {}): string {\n return formatAgeInSeconds(Math.floor(age / 1000), options);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from \"./errors\";\n\nexport async function httpRequest<R = any>(\n url: string,\n options: RequestInit,\n): Promise<R> {\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n // const urlInstance = new URL(url);\n const response = await fetch(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n } else {\n try {\n const errorMsg = await response.json();\n if (response.status === 400) {\n throw new ApiError(\n errorMsg.message || errorMsg.code || response.statusText,\n errorMsg.code,\n );\n }\n throw new Error(errorMsg.message || errorMsg.code || response.statusText);\n } catch (e) {\n throw e;\n }\n }\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string,\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\n }\n\n return _headers;\n}\n\nexport async function httpGet<R = any>(\n url: string,\n options?: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function httpPost<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpPut<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function httpDelete<R = any>(\n url: string,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await httpRequest<R>(url, {\n method: \"DELETE\",\n ...options,\n });\n}\n\nexport async function httpMutate<R = any>(\n url: string,\n init: RequestInit,\n): Promise<R> {\n return await httpRequest<R>(url, init);\n}\n","import BigNumber from \"bignumber.js\";\n\n// ---------------------------------------------------------------------------\n// SafeBigNumber\n// ---------------------------------------------------------------------------\n\n/**\n * A `BigNumber` subclass that never throws on construction.\n * Invalid / undefined values fall back to `0`.\n */\nexport class SafeBigNumber extends BigNumber {\n constructor(num?: BigNumber.Value, base?: number) {\n try {\n super(num ?? 0, base);\n } catch (e) {\n console.error(\"SafeBigNumber constructor error\", e);\n super(0, base);\n }\n }\n}\n\ndeclare namespace SafeBigNumber {\n type Value = BigNumber.Value;\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport const isValidNumber = (num: unknown) => {\n if (\n (\"number\" === typeof num && !isNaN(num)) ||\n num instanceof SafeBigNumber ||\n num instanceof BigNumber\n ) {\n return true;\n }\n if (\"string\" !== typeof num) {\n return false;\n }\n const floatNum = Number.parseFloat(num);\n return !isNaN(floatNum);\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nconst subscriptDigits = [\n \"₀\",\n \"₁\",\n \"₂\",\n \"₃\",\n \"₄\",\n \"₅\",\n \"₆\",\n \"₇\",\n \"₈\",\n \"₉\",\n \"₁₀\",\n \"₁₁\",\n \"₁₂\",\n \"₁₃\",\n \"₁₄\",\n \"₁₅\",\n \"₁₆\",\n \"₁₇\",\n \"₁₈\",\n \"₁₉\",\n \"₂₀\",\n \"₂₁\",\n \"₂₂\",\n \"₂₃\",\n \"₂₄\",\n \"₂₅\",\n \"₂₆\",\n \"₂₇\",\n \"₂₈\",\n \"₂₉\",\n \"₃₀\",\n \"₃₁\",\n \"₃₂\",\n \"₃₃\",\n \"₃₄\",\n \"₃₅\",\n \"₃₆\",\n \"₃₇\",\n \"₃₈\",\n \"₃₉\",\n \"₄₀\",\n];\n\n/**\n * Add thousand-separators (commas) and truncate to `precision` decimals.\n *\n * stringifyNumberWithGroupingSeparator(12345.6789, 2) → \"12,345.67\"\n */\nconst stringifyNumberWithGroupingSeparator = (\n num: BigNumber.Value,\n precision: number = 0,\n rounding: BigNumber.RoundingMode = BigNumber.ROUND_DOWN,\n) => {\n const bn = new SafeBigNumber(num);\n const parts = bn.decimalPlaces(precision, rounding).toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n return parts.join(\".\");\n};\n\n/**\n * Abbreviate large numbers with K / M / B / T suffixes.\n *\n * stringifyNumberWithAbbreviation(1234) → \"1.2K\"\n * stringifyNumberWithAbbreviation(5_600_000) → \"5.6M\"\n */\nconst stringifyNumberWithAbbreviation = (\n num: BigNumber.Value,\n precision: number = 1,\n) => {\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? bn.toNumber()\n : bn.lt(1e6)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e3), precision)}K`\n : bn.lt(1e9)\n ? `${stringifyNumberWithGroupingSeparator(bn.div(1e6), precision)}M`\n : bn.lt(1e12)\n ? `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e9), precision)}B`\n : `${stringifyNumberWithGroupingSeparator(bn.dividedBy(1e12), precision)}T`;\n};\n\n/**\n * Display tiny decimals with Unicode subscript zero-count notation.\n * E.g. `0.00000382` → `\"0.0₅382\"` (5 leading zeros after the decimal).\n */\nconst stringifyNumberWithLeadingZeroSubscripts = (\n num: BigNumber.Value,\n precision: number = 5,\n) => {\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return \"0\";\n const [integerPart, decimalPart] = bn.toFixed().split(\".\");\n const digits = decimalPart.split(\"\");\n const firstNonZeroIndex = digits.findIndex((num) => \"0\" !== num);\n const precisionDigitsCount = Math.min(\n digits.length - firstNonZeroIndex,\n precision,\n );\n return `${stringifyNumberWithGroupingSeparator(integerPart)}.0`\n .concat(subscriptDigits[firstNonZeroIndex])\n .concat(\n digits\n .slice(firstNonZeroIndex, firstNonZeroIndex + precisionDigitsCount)\n .join(\"\")\n .replace(/\\.?0+$/, \"\"),\n );\n};\n\n/**\n * Round to `precision` *significant* decimal digits (skipping leading zeros).\n * E.g. `0.00456` with precision 2 → keeps 5 decimal places → `\"0.00456\"`.\n */\nconst stringifyNumberWithSignificantPrecision = (\n num: BigNumber,\n precision: number,\n) => {\n const matched = num.toString().match(/\\.0*/);\n const significantPrecision =\n (matched ? matched[0].length - 1 : 0) + precision;\n return stringifyNumberWithGroupingSeparator(num, significantPrecision);\n};\n\nconst stringifyPercent = (bn: BigNumber, precision: number) =>\n `${bn.times(100).decimalPlaces(precision, BigNumber.ROUND_HALF_UP).toString()}%`;\n\n// ---------------------------------------------------------------------------\n// Public formatting functions\n// ---------------------------------------------------------------------------\n\nexport type FormatAmountOptions = {\n showPlusGtThanZero: boolean;\n};\n\n/**\n * Format a raw token / asset amount (no currency symbol).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | 5 decimal places | 0.0001234 → \"0.00012\" |\n * | < 1 | 3 decimal places | 0.56789 → \"0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"42.67\" |\n * | < 100 000 | grouped, 2 dp | 12345.6 → \"12,345.60\" |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | 1_500_000 → \"1.5M\" |\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmount = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? abs.decimalPlaces(5, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1)\n ? abs.decimalPlaces(3, BigNumber.ROUND_DOWN).toString()\n : abs.lt(100)\n ? abs.decimalPlaces(2, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n if (Number(formatted) === 0) return `${formatted}`;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return `${formatted}`;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix (standard precision).\n *\n * Precision tiers (ROUND_DOWN):\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 10 000 | grouped, 2 dp | 1234.5 → \"$1,234.50\" |\n * | ≥ 10 000 | abbreviated (K/M/B/T) | 1_500_000 → \"$1.5M\" |\n *\n * Use this for standard financial displays (volume, market cap, liquidity).\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSD = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n\n const formatted = abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e4)\n ? `$${stringifyNumberWithGroupingSeparator(abs, 2)}`\n : `$${stringifyNumberWithAbbreviation(abs)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\n/**\n * Format a USD dollar amount with \"$\" prefix — **compact** variant.\n *\n * Compared to {@link formatAmountUSD}, this variant is more aggressively\n * rounded and suited for space-constrained UIs (cards, badges, list items):\n *\n * | Range | Format | Example input → output |\n * |---------------|-------------------------|------------------------------|\n * | < 0.001 | \"$0\" | 0.00001 → \"$0\" |\n * | < 1 | 3 decimal places | 0.56789 → \"$0.567\" |\n * | < 100 | 2 decimal places | 42.678 → \"$42.67\" |\n * | < 1 000 | 0 decimal places | 567.89 → \"$567\" |\n * | ≥ 1 000 | abbreviated, 0 dp, | 15 678 → \"$15.6K\" |\n * | | rounded to nearest 100 | 1 234 567 → \"$1.2M\" |\n *\n * Key differences from `formatAmountUSD`:\n * - 100–1 000: shows 0 dp instead of 2 dp\n * - ≥ 1 000: abbreviates earlier (1K vs 10K) with 0 precision, rounded to 100s\n *\n * @param num - The numeric value.\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n */\nexport const formatAmountUSDCompact = (\n num: BigNumber.Value = \"\",\n options: FormatAmountOptions = { showPlusGtThanZero: false },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const roundedAbs = abs.div(100).integerValue(BigNumber.ROUND_DOWN).times(100);\n\n const formatted =\n abs.lt(1e-4) || abs.lt(0.001)\n ? \"$0\"\n : abs.lt(1)\n ? `$${abs.decimalPlaces(3, BigNumber.ROUND_DOWN)}`\n : abs.lt(100)\n ? `$${abs.decimalPlaces(2, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e3)\n ? `$${abs.decimalPlaces(0, BigNumber.ROUND_DOWN)}`\n : `$${stringifyNumberWithAbbreviation(roundedAbs, 0)}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\nexport type FormatPriceOptions = {\n isHighPrecise: boolean;\n};\n\n/**\n * Format a token price (no currency symbol).\n *\n * Same precision tiers as {@link formatPriceUSD} but without the \"$\" prefix.\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPrice = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `${formatted}`;\n};\n\n/**\n * Format a token price with \"$\" prefix.\n *\n * Two precision modes controlled by `isHighPrecise` (default: `true`):\n *\n * | Range | High precision (default) | Low precision |\n * |---------------|-------------------------------|------------------------------|\n * | < 0.0001 | subscript notation, 4 sig | subscript notation, 2 sig |\n * | | 0.0000382 → \"$0.0₄382\" | 0.0000382 → \"$0.0₄38\" |\n * | < 1 | 4 dp, grouped | 2 significant dp |\n * | | 0.12345 → \"$0.1234\" | 0.12345 → \"$0.12\" |\n * | < 10 000 | 4 dp, grouped | 2 dp, grouped |\n * | | 1234.567 → \"$1,234.5670\" | 1234.567 → \"$1,234.56\" |\n * | < 100 000 | 2 dp, grouped | 2 dp, grouped |\n * | ≥ 100 000 | abbreviated (K/M/B/T) | abbreviated (K/M/B/T) |\n *\n * @param num - The price value.\n * @param options.isHighPrecise - Use high-precision mode (default: true).\n */\nexport const formatPriceUSD = (\n num: BigNumber.Value = \"\",\n options: FormatPriceOptions = { isHighPrecise: true },\n) => {\n if (!isValidNumber(num)) return \"--\";\n\n const bn = new SafeBigNumber(num);\n if (bn.lt(0)) return \"--\";\n\n const abs = bn.abs();\n const { isHighPrecise } = options;\n\n const formatted = abs.lt(1e-4)\n ? stringifyNumberWithLeadingZeroSubscripts(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1)\n ? isHighPrecise\n ? stringifyNumberWithGroupingSeparator(abs, 4)\n : stringifyNumberWithSignificantPrecision(abs, 2)\n : abs.lt(100) || abs.lt(1e4)\n ? stringifyNumberWithGroupingSeparator(abs, isHighPrecise ? 4 : 2)\n : abs.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(abs, 2)\n : stringifyNumberWithAbbreviation(abs);\n\n return `$${formatted}`;\n};\n\nexport type FormatPercentOptions = {\n showPlusGtThanZero?: boolean;\n precision?: number;\n};\n\n/**\n * Format a ratio as a percentage string.\n *\n * The input is a **ratio** (0.3 = 30%, 1.5 = 150%).\n *\n * | Input range | Output example |\n * |---------------|-----------------------------------------|\n * | < 0.0001 | \"0%\" |\n * | < 100 | \"56.79%\" (2 dp by default) |\n * | < 1000 | \"15,000.5%\" (1 dp by default) |\n * | ≥ 1000 | \"> 99,999%\" |\n *\n * @param num - The ratio value (0.3 means 30%).\n * @param options.showPlusGtThanZero - Prefix positive values with \"+\".\n * @param options.precision - Decimal precision override.\n */\nexport const formatPercent = (\n num: BigNumber.Value = \"\",\n options: FormatPercentOptions = {},\n) => {\n if (!isValidNumber(num)) return \"-- %\";\n\n const bn = new SafeBigNumber(num);\n const negative = bn.lt(0);\n const abs = bn.abs();\n const sign = negative ? \"-\" : options?.showPlusGtThanZero ? \"+\" : \"\";\n\n if (abs.lt(1e-4)) return \"0%\";\n if (abs.lt(100))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 2)}`;\n if (abs.lt(1e3))\n return `${sign}${stringifyPercent(abs, options?.precision ?? 1)}`;\n return `${sign}> 99,999%`;\n};\n","/**\n * Capitalize the first letter of a string, lowercasing the rest.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n * capitalize(\"hELLO\") // \"Hello\"\n * capitalize(\"solana\") // \"Solana\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n/**\n * Truncate an address (or any string) to show the first `start` and last `end`\n * characters with \"...\" in between.\n *\n * @param address - The full address string.\n * @param start - Number of characters to keep from the beginning (default 6).\n * @param end - Number of characters to keep from the end (default 4).\n *\n * @example\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\")\n * // \"0x1234...5678\"\n *\n * truncateAddress(\"0x1234567890abcdef1234567890abcdef12345678\", 4, 4)\n * // \"0x12...5678\"\n */\nexport function truncateAddress(\n address: string,\n start: number = 6,\n end: number = 4,\n): string {\n return address.slice(0, start) + \"...\" + address.slice(-end);\n}\n","/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import {\n Chain,\n SOLANA_TOKEN_PROTOCOLS,\n TokenProtocol,\n} from \"@liberfi.io/types\";\n\nconst SOLANA_PROTOCOL_SET = new Set<string>(SOLANA_TOKEN_PROTOCOLS);\n\n/** Sorted by length descending so \"pump-amm\" is tested before \"pump\". */\nconst SOLANA_PROTOCOLS_BY_SPECIFICITY = [...SOLANA_TOKEN_PROTOCOLS].sort(\n (a, b) => b.length - a.length,\n);\n\nexport const parseTokenProtocolFamily = (\n chain: Chain,\n protocolFamily: string,\n): TokenProtocol | undefined => {\n if (chain !== Chain.SOLANA) return undefined;\n\n const normalized = protocolFamily.toLowerCase();\n\n if (SOLANA_PROTOCOL_SET.has(normalized)) {\n return normalized as TokenProtocol;\n }\n\n return SOLANA_PROTOCOLS_BY_SPECIFICITY.find((p) => normalized.includes(p));\n};\n\nexport const formatTokenProtocolName = (protocol: TokenProtocol): string => {\n return protocol\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n};\n","import { Chain } from \"@liberfi.io/types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PredefinedToken {\n address: string;\n symbol: string;\n decimals: number;\n}\n\nexport interface ChainPredefinedTokens {\n native: PredefinedToken;\n wrapped: PredefinedToken;\n stablecoins: Record<string, PredefinedToken>;\n}\n\n// ---------------------------------------------------------------------------\n// EVM common\n// ---------------------------------------------------------------------------\n\nconst EVM_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\n// ---------------------------------------------------------------------------\n// Solana\n// ---------------------------------------------------------------------------\n\nexport const SOLANA_TOKENS: ChainPredefinedTokens = {\n native: {\n address: \"11111111111111111111111111111111\",\n symbol: \"SOL\",\n decimals: 9,\n },\n wrapped: {\n address: \"So11111111111111111111111111111111111111112\",\n symbol: \"SOL\",\n decimals: 9,\n },\n stablecoins: {\n USDC: {\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\",\n symbol: \"USDT\",\n decimals: 6,\n },\n USD1: {\n address: \"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB\",\n symbol: \"USD1\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Ethereum\n// ---------------------------------------------------------------------------\n\nexport const ETHEREUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// BSC (Binance Smart Chain)\n// ---------------------------------------------------------------------------\n\nexport const BSC_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"BNB\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\",\n symbol: \"WBNB\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\",\n symbol: \"USDC\",\n decimals: 18,\n },\n USDT: {\n address: \"0x55d398326f99059fF775485246999027B3197955\",\n symbol: \"USDT\",\n decimals: 18,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrum\n// ---------------------------------------------------------------------------\n\nexport const ARBITRUM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Optimism\n// ---------------------------------------------------------------------------\n\nexport const OPTIMISM_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"ETH\",\n decimals: 18,\n },\n wrapped: {\n address: \"0x4200000000000000000000000000000000000006\",\n symbol: \"WETH\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Avalanche\n// ---------------------------------------------------------------------------\n\nexport const AVALANCHE_TOKENS: ChainPredefinedTokens = {\n native: {\n address: EVM_NATIVE_ADDRESS,\n symbol: \"AVAX\",\n decimals: 18,\n },\n wrapped: {\n address: \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\",\n symbol: \"WAVAX\",\n decimals: 18,\n },\n stablecoins: {\n USDC: {\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n symbol: \"USDC\",\n decimals: 6,\n },\n USDT: {\n address: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n symbol: \"USDT\",\n decimals: 6,\n },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Chain -> Tokens index\n// ---------------------------------------------------------------------------\n\nexport const CHAIN_TOKENS: Partial<Record<Chain, ChainPredefinedTokens>> = {\n [Chain.SOLANA]: SOLANA_TOKENS,\n [Chain.ETHEREUM]: ETHEREUM_TOKENS,\n [Chain.BINANCE]: BSC_TOKENS,\n [Chain.ARBITRUM]: ARBITRUM_TOKENS,\n [Chain.OPTIMISM]: OPTIMISM_TOKENS,\n [Chain.AVALANCHE]: AVALANCHE_TOKENS,\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\nexport function getNativeToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.native;\n}\n\nexport function getWrappedToken(chain: Chain): PredefinedToken | undefined {\n return CHAIN_TOKENS[chain]?.wrapped;\n}\n\nexport function getStablecoins(\n chain: Chain,\n): Record<string, PredefinedToken> | undefined {\n return CHAIN_TOKENS[chain]?.stablecoins;\n}\n\n/** Returns all predefined token addresses for the given chain (native + wrapped + stablecoins). */\nexport function getCommonTokenAddresses(chain: Chain): string[] {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return [];\n return [\n tokens.native.address,\n tokens.wrapped.address,\n ...Object.values(tokens.stablecoins).map((t) => t.address),\n ];\n}\n\n/** Returns an address -> symbol map for all predefined tokens on the given chain. */\nexport function getCommonTokenSymbolsMap(chain: Chain): Record<string, string> {\n const tokens = CHAIN_TOKENS[chain];\n if (!tokens) return {};\n const map: Record<string, string> = {\n [tokens.native.address]: tokens.native.symbol,\n [tokens.wrapped.address]: tokens.wrapped.symbol,\n };\n for (const t of Object.values(tokens.stablecoins)) {\n map[t.address] = t.symbol;\n }\n return map;\n}\n","import { Chain } from \"@liberfi.io/types\";\n\nconst TX_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/tx/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/tx/\",\n [Chain.POLYGON]: \"https://polygonscan.com/tx/\",\n [Chain.BINANCE]: \"https://bscscan.com/tx/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/tx/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/tx/\",\n [Chain.BASE]: \"https://basescan.org/tx/\",\n [Chain.BLAST]: \"https://blastracker.xyz/tx/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/tx/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/tx/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/tx/\",\n};\n\nconst ACCOUNT_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/account/\",\n [Chain.ETHEREUM]: \"https://etherscan.io/address/\",\n [Chain.POLYGON]: \"https://polygonscan.com/address/\",\n [Chain.BINANCE]: \"https://bscscan.com/address/\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/address/\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/address/\",\n [Chain.BASE]: \"https://basescan.org/address/\",\n [Chain.BLAST]: \"https://blastracker.xyz/address/\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/address/\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/address/\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/address/\",\n};\n\nfunction explorerUrl(\n urls: Partial<Record<Chain, string>>,\n chainId: Chain,\n value: string,\n): string | undefined {\n const base = urls[chainId];\n return base ? `${base}${value}` : undefined;\n}\n\nexport function txExplorerUrl(\n chainId: Chain,\n txHash: string,\n): string | undefined {\n return explorerUrl(TX_EXPLORER_URLS, chainId, txHash);\n}\n\nexport function accountExplorerUrl(\n chainId: Chain,\n account: string,\n): string | undefined {\n return explorerUrl(ACCOUNT_EXPLORER_URLS, chainId, account);\n}\n\nexport function searchImageUrl(image: string): string {\n return `https://lens.google.com/uploadbyurl?url=${encodeURIComponent(image)}`;\n}\n\nexport function searchTwitterUrl(q: string): string {\n return `https://x.com/search?q=${encodeURIComponent(q)}`;\n}\n\nexport function twitterUserUrl(username: string): string {\n return `https://x.com/${username}`;\n}\n\nexport function twitterTweetUrl(id: string): string {\n return `https://x.com/i/status/${id}`;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport function throttle<T extends (...args: any[]) => void>(\n fn: T,\n wait: number,\n): T {\n let lastCallTime = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n\n const throttled = (...args: Parameters<T>) => {\n const now = Date.now();\n const remaining = wait - (now - lastCallTime);\n\n if (remaining <= 0) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastCallTime = now;\n fn(...args);\n } else {\n lastArgs = args;\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n lastCallTime = Date.now();\n timeoutId = null;\n if (lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n }\n }, remaining);\n }\n }\n };\n\n return throttled as T;\n}\n\nexport function debounce<T extends (...args: any[]) => void>(\n fn: T,\n wait: number,\n): T {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const debounced = (...args: Parameters<T>) => {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, wait);\n };\n\n return debounced as T;\n}\n","export function uniqBy<T>(\n array: T[],\n iteratee: ((item: T) => unknown) | keyof T,\n): T[] {\n const seen = new Set<unknown>();\n const getter =\n typeof iteratee === \"function\" ? iteratee : (item: T) => item[iteratee];\n\n return array.filter((item) => {\n const key = getter(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function intersectionBy<T>(\n a: T[],\n b: T[],\n iteratee: ((item: T) => unknown) | keyof T,\n): T[] {\n const getter =\n typeof iteratee === \"function\" ? iteratee : (item: T) => item[iteratee];\n const bKeys = new Set(b.map(getter));\n return a.filter((item) => bKeys.has(getter(item)));\n}\n\nexport function keyBy<T>(\n array: T[],\n iteratee: ((item: T) => string) | keyof T,\n): Record<string, T> {\n const getter =\n typeof iteratee === \"function\"\n ? iteratee\n : (item: T) => String(item[iteratee]);\n\n const result: Record<string, T> = {};\n for (const item of array) {\n result[getter(item)] = item;\n }\n return result;\n}\n\nexport function groupBy<T>(\n array: T[],\n iteratee: ((item: T) => string) | keyof T,\n): Record<string, T[]> {\n const getter =\n typeof iteratee === \"function\"\n ? iteratee\n : (item: T) => String(item[iteratee]);\n\n const result: Record<string, T[]> = {};\n for (const item of array) {\n const key = getter(item);\n (result[key] ??= []).push(item);\n }\n return result;\n}\n\nexport function mapKeys<T>(\n obj: Record<string, T>,\n iteratee: (value: T, key: string) => string,\n): Record<string, T> {\n const result: Record<string, T> = {};\n for (const key of Object.keys(obj)) {\n result[iteratee(obj[key], key)] = obj[key];\n }\n return result;\n}\n\nexport function mapValues<T, R>(\n obj: Record<string, T>,\n iteratee: (value: T, key: string) => R,\n): Record<string, R> {\n const result: Record<string, R> = {};\n for (const key of Object.keys(obj)) {\n result[key] = iteratee(obj[key], key);\n }\n return result;\n}\n"],"mappings":"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","names":["version_default","Chain","ChainNamespace","solanaChains","chainToNamespace","chain","chainSlugs","chainSlugAbbrs","chainColors","chainColor","chainId","chainIcon","chainIdBySlug","slug","chainSlug","chainDisplayName","abbr","c","slugToChainId","key","isValidWalletAddress","addr","isValidSolanaAddress","isValidEvmAddress","EVM_ADDRESS_RE","value","SOLANA_BASE58_RE","ApiError","message","code","defaultLabels","formatAgeInSeconds","age","options","labels","formatAge","httpRequest","url","options","response","_createHeaders","errorMsg","ApiError","e","headers","method","_headers","httpGet","httpPost","data","httpPut","httpDelete","httpMutate","init","BigNumber","SafeBigNumber","num","base","e","isValidNumber","floatNum","subscriptDigits","stringifyNumberWithGroupingSeparator","precision","rounding","parts","stringifyNumberWithAbbreviation","bn","stringifyNumberWithLeadingZeroSubscripts","integerPart","decimalPart","digits","firstNonZeroIndex","precisionDigitsCount","stringifyNumberWithSignificantPrecision","matched","significantPrecision","stringifyPercent","formatAmount","options","negative","abs","formatted","formatAmountUSD","formatAmountUSDCompact","roundedAbs","formatPrice","isHighPrecise","formatPriceUSD","formatPercent","sign","capitalize","str","truncateAddress","address","start","end","formatSymbol","symbol","formatString","arr","type","base","quote","Chain","SOLANA_TOKEN_PROTOCOLS","SOLANA_PROTOCOL_SET","SOLANA_PROTOCOLS_BY_SPECIFICITY","a","b","parseTokenProtocolFamily","chain","protocolFamily","normalized","p","formatTokenProtocolName","protocol","word","Chain","EVM_NATIVE_ADDRESS","SOLANA_TOKENS","ETHEREUM_TOKENS","BSC_TOKENS","ARBITRUM_TOKENS","OPTIMISM_TOKENS","AVALANCHE_TOKENS","CHAIN_TOKENS","getNativeToken","chain","getWrappedToken","getStablecoins","getCommonTokenAddresses","tokens","t","getCommonTokenSymbolsMap","map","Chain","TX_EXPLORER_URLS","ACCOUNT_EXPLORER_URLS","explorerUrl","urls","chainId","value","base","txExplorerUrl","txHash","accountExplorerUrl","account","searchImageUrl","image","searchTwitterUrl","q","twitterUserUrl","username","twitterTweetUrl","id","throttle","fn","wait","lastCallTime","timeoutId","lastArgs","args","now","remaining","debounce","uniqBy","array","iteratee","seen","getter","item","key","intersectionBy","a","b","bKeys","keyBy","result","groupBy","mapKeys","obj","mapValues"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/utils",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "description": "Liberfi React SDK utils",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,18 +11,15 @@
11
11
  "license": "ISC",
12
12
  "devDependencies": {
13
13
  "@types/jest": "^29.5.3",
14
- "@types/lodash-es": "^4.17.12",
15
14
  "jest": "^29.6.1",
16
15
  "ts-jest": "^29.4.0",
17
16
  "tsup": "^8.5.0",
18
17
  "typescript": "^5.9.2",
19
- "tsconfig": "0.1.19"
18
+ "tsconfig": "0.1.21"
20
19
  },
21
20
  "dependencies": {
22
- "@solana/kit": "^2.3.0",
23
21
  "bignumber.js": "^9.3.1",
24
- "lodash-es": "^4.17.21",
25
- "@liberfi.io/types": "0.1.31"
22
+ "@liberfi.io/types": "0.1.33"
26
23
  },
27
24
  "publishConfig": {
28
25
  "access": "public"