@liberfi.io/utils 0.1.24 → 0.1.26

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.
@@ -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/window.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.24\";\n}\n\nexport default \"0.1.24\";\n","import { address } from \"@solana/kit\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\n/** Returns the chain namespace (EVM or SOLANA) for a given chain */\nexport function chainToNamespace(chain: Chain): ChainNamespace {\n return chain === Chain.SOLANA ||\n chain === Chain.SOLANA_TESTNET ||\n chain === Chain.SOLANA_DEVNET\n ? ChainNamespace.SOLANA\n : 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.charAt(0).toUpperCase() + slug.slice(1);\n return chainId;\n}\n\nexport function chainIdBySlug(slug: string): Chain | undefined {\n const foundAbbrKey = Object.keys(chainSlugAbbrs).find(\n (key) => chainSlugAbbrs[key as Chain]?.toLowerCase() === slug.toLowerCase(),\n );\n if (foundAbbrKey) {\n return foundAbbrKey as Chain;\n }\n const foundSlugKey = Object.keys(chainSlugs).find(\n (key) => chainSlugs[key as Chain]?.toLowerCase() === slug.toLowerCase(),\n );\n return foundSlugKey ? (foundSlugKey as Chain) : undefined;\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\nexport function isValidEvmAddress(value: string) {\n return /^0x[0-9a-fA-F]{40}$/.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 NOW = Date.now();\n\nconst MINUTE = 60;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst YEAR = 365 * DAY;\n\nexport const millisecondsToHMS = (\n milliseconds: number,\n): [number, number, number] => {\n const totalSeconds = Math.floor(milliseconds / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n return [hours, minutes, seconds];\n};\n\n/// will return 'yyyy-mm-dd hh:MM:ss'\nexport const timestampToString = (timestamp: number | Date): string => {\n const date = timestamp instanceof Date ? timestamp : new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n};\n\nexport function subtractDaysFromCurrentDate(\n days: number,\n startDate?: Date,\n): Date {\n const currentDate = startDate || new Date();\n const resultDate = new Date(currentDate);\n resultDate.setDate(currentDate.getDate() - days);\n return resultDate;\n}\n\nfunction maybeSecondsToMilliseconds(date: number): number {\n if (!date || Number.isNaN(date) || date <= 0) {\n return NOW;\n }\n if (date < 1e10) {\n return date * 1000;\n }\n return date;\n}\n\nfunction formatToMilliseconds(date?: number | string | Date | null): number {\n if (!date) {\n return NOW;\n }\n if (typeof date === \"number\") {\n return maybeSecondsToMilliseconds(date);\n }\n if (typeof date === \"string\") {\n const parsed = Date.parse(date);\n return maybeSecondsToMilliseconds(parsed);\n }\n if (date instanceof Date) {\n return date.getTime();\n }\n return NOW;\n}\n\nexport function formatTimeAgo(\n date: number | string | Date | null | undefined,\n): string {\n const diffSeconds = Math.floor(\n (Date.now() - formatToMilliseconds(date)) / 1000,\n );\n if (diffSeconds >= YEAR) {\n const years = Math.floor(diffSeconds / YEAR);\n return `${years}Y`;\n }\n if (diffSeconds >= DAY) {\n const days = Math.floor(diffSeconds / DAY);\n return `${days}D`;\n }\n if (diffSeconds >= HOUR) {\n const hours = Math.floor(diffSeconds / HOUR);\n return `${hours}h`;\n }\n if (diffSeconds >= MINUTE) {\n const minutes = Math.floor(diffSeconds / MINUTE);\n return `${minutes}m`;\n }\n return `${diffSeconds}s`;\n}\n\nexport function secondsSince(\n timestamp: number | Date,\n now?: number | Date,\n): number {\n const currentTime = now\n ? now instanceof Date\n ? now.getTime()\n : now\n : Date.now();\n const targetTime =\n timestamp instanceof Date ? timestamp.getTime() : timestamp;\n const diffInMilliseconds = currentTime - targetTime;\n return Math.floor(diffInMilliseconds / 1000);\n}\n\nexport interface FormatReadableTimeOptions {\n justNow?: string;\n secondsAgo?: string;\n minutesAgo?: string;\n hoursAgo?: string;\n daysAgo?: string;\n yearsAgo?: string;\n}\n\nconst defaultTranslations = {\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 a timestamp into a human-readable time ago string.\n\n *\n * @param timestamp - The timestamp (number) or Date object to format\n * @param options - Optional custom text translations\n * @returns Formatted time ago string\n */\nexport function formatReadableTime(\n timestamp: number | Date,\n options: FormatReadableTimeOptions = {},\n): string {\n const seconds = secondsSince(timestamp);\n\n const translations = {\n justNow: options.justNow || defaultTranslations.justNow,\n secondsAgo: options.secondsAgo || defaultTranslations.secondsAgo,\n minutesAgo: options.minutesAgo || defaultTranslations.minutesAgo,\n hoursAgo: options.hoursAgo || defaultTranslations.hoursAgo,\n daysAgo: options.daysAgo || defaultTranslations.daysAgo,\n yearsAgo: options.yearsAgo || defaultTranslations.yearsAgo,\n };\n\n const MINUTE = 60;\n const HOUR = 60 * MINUTE;\n const DAY = 24 * HOUR;\n const YEAR = 365 * DAY;\n\n if (seconds < 10) {\n return translations.justNow;\n }\n if (seconds < MINUTE) {\n return translations.secondsAgo.replace(\"{n}\", seconds.toString());\n }\n if (seconds < HOUR) {\n const minutes = Math.floor(seconds / MINUTE);\n return translations.minutesAgo.replace(\"{n}\", minutes.toString());\n }\n if (seconds < DAY) {\n const hours = Math.floor(seconds / HOUR);\n return translations.hoursAgo.replace(\"{n}\", hours.toString());\n }\n if (seconds < YEAR) {\n const days = Math.floor(seconds / DAY);\n return translations.daysAgo.replace(\"{n}\", days.toString());\n }\n const years = Math.floor(seconds / YEAR);\n return translations.yearsAgo.replace(\"{n}\", years.toString());\n}\n\n/**\n * Formats an age in milliseconds into a human-readable time ago string.\n * @param timestamp Age in milliseconds\n * @param options Optional custom text translations\n * @returns Formatted time ago string\n */\nexport function formatAge(\n age: number,\n options: FormatReadableTimeOptions = {},\n): string {\n const seconds = Math.floor(age / 1000);\n return formatAgeInSeconds(seconds, options);\n}\n\n/**\n * Formats an age in seconds into a human-readable time ago string.\n * @param timestamp Age in seconds\n * @param options Optional custom text translations\n * @returns Formatted time ago string\n * @examples\n * formatAgeInSeconds(0) // \"just now\"\n * formatAgeInSeconds(10) // \"10s\"\n * formatAgeInSeconds(60) // \"1m\"\n * formatAgeInSeconds(3600) // \"1h\"\n * formatAgeInSeconds(86400) // \"1d\"\n * formatAgeInSeconds(31536000) // \"1y\"\n */\nexport function formatAgeInSeconds(\n age: number,\n options: FormatReadableTimeOptions = {},\n): string {\n const translations = {\n justNow: options.justNow || defaultTranslations.justNow,\n secondsAgo: options.secondsAgo || defaultTranslations.secondsAgo,\n minutesAgo: options.minutesAgo || defaultTranslations.minutesAgo,\n hoursAgo: options.hoursAgo || defaultTranslations.hoursAgo,\n daysAgo: options.daysAgo || defaultTranslations.daysAgo,\n yearsAgo: options.yearsAgo || defaultTranslations.yearsAgo,\n };\n\n const MINUTE = 60;\n const HOUR = 60 * MINUTE;\n const DAY = 24 * HOUR;\n const YEAR = 365 * DAY;\n\n if (age < 10) {\n return translations.justNow;\n }\n if (age < MINUTE) {\n return translations.secondsAgo.replace(\"{n}\", age.toString());\n }\n if (age < HOUR) {\n const minutes = Math.floor(age / MINUTE);\n return translations.minutesAgo.replace(\"{n}\", minutes.toString());\n }\n if (age < DAY) {\n const hours = Math.floor(age / HOUR);\n return translations.hoursAgo.replace(\"{n}\", hours.toString());\n }\n if (age < YEAR) {\n const days = Math.floor(age / DAY);\n return translations.daysAgo.replace(\"{n}\", days.toString());\n }\n const years = Math.floor(age / YEAR);\n return translations.yearsAgo.replace(\"{n}\", years.toString());\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ApiError } from \"./errors\";\n\nexport async function request<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 get<R = any>(\n url: string,\n options?: RequestInit,\n): Promise<R> {\n return await request<R>(url, {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function post<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await request<R>(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function put<R = any, P = any>(\n url: string,\n data: P,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await request<R>(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n}\n\nexport async function del<R = any>(\n url: string,\n options?: Omit<RequestInit, \"method\">,\n): Promise<R> {\n return await request<R>(url, {\n method: \"DELETE\",\n ...options,\n });\n}\n\nexport async function mutate<R = any>(\n url: string,\n init: RequestInit,\n): Promise<R> {\n return await request<R>(url, init);\n}\n","import BigNumber from \"bignumber.js\";\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\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\nexport const canConvertToNumber = (num: unknown) =>\n (\"number\" === typeof num || !!num) &&\n isValidNumber(\"string\" === typeof num ? Number(num) : num);\n\nexport const isValidTimeframe = (timeframe: string = \"\") =>\n /^(\\d+\\.?\\d*|\\.\\d+)([hm]?)$$/.test(timeframe);\n\nexport type FormatAmountOptions = {\n showPlusGtThanZero: boolean;\n};\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\nexport const formatAmount2 = (\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(1, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e3)\n ? stringifyNumberWithGroupingSeparator(abs, 1)\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\nexport const formatAmount3 = (\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(1, BigNumber.ROUND_DOWN).toString()\n : abs.lt(1e3)\n ? stringifyNumberWithGroupingSeparator(abs, 1)\n : stringifyNumberWithAbbreviation(abs, 0);\n\n if (Number(formatted) === 0) return `${formatted}`;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return `${formatted}`;\n return `+${formatted}`;\n};\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\nexport const formatAmountUSD2 = (\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(1, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e15)\n ? `$${stringifyNumberWithAbbreviation(roundedAbs)}`\n : `$${stringifyAmount(abs, {\n acronymMin: 1e5,\n groupingSeparator: true,\n })}`;\n\n if (\"$0\" === formatted) return formatted;\n if (negative) return `-${formatted}`;\n if (!options?.showPlusGtThanZero) return formatted;\n return `+${formatted}`;\n};\n\nexport const formatAmountUSD3 = (\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 const formatAmountUSD4 = (\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 =\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 ? `$${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\nexport const formatAmountUSD5 = (\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 =\n abs.lt(1e-4) || abs.lt(0.001)\n ? \"$0\"\n : abs.lt(100)\n ? `$${abs.decimalPlaces(0, BigNumber.ROUND_DOWN)}`\n : abs.lt(1e3)\n ? `$${stringifyNumberWithGroupingSeparator(abs, 0)}`\n : `$${stringifyNumberWithAbbreviation(abs, 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\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\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 number as a percentage.\n * @param num - The number to format, 0.3 means 30%.\n * @param options - The options to format the number.\n * @param options.showPlusGtThanZero - Whether to show the plus sign if the number is greater than zero.\n * @param options.precision - The precision to format the number.\n * @returns\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\nconst stringifyPercent = (bn: BigNumber, precision: number) =>\n `${bn.times(100).decimalPlaces(precision, BigNumber.ROUND_HALF_UP).toString()}%`;\n\nexport type FormatMultiplierOptions = {\n showPlusGtThanZero?: boolean;\n};\n\nexport const formatMultiplier = (\n num: BigNumber.Value = \"\",\n options: FormatMultiplierOptions = { showPlusGtThanZero: true },\n) => {\n if (!isValidNumber(num)) return \"0%\";\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(0.01)) return \"0%\";\n if (abs.lt(10))\n return `${sign}${stringifyNumberWithGroupingSeparator(abs, 2)}X`;\n if (abs.lt(100))\n return `${sign}${stringifyNumberWithGroupingSeparator(abs, 1)}X`;\n if (abs.lt(1e5))\n return `${sign}${stringifyNumberWithGroupingSeparator(abs, 0)}X`;\n return `${sign}>99,999%`;\n};\n\nexport const formatCount = (num: BigNumber.Value = \"\") => {\n if (!isValidNumber(num)) return \"--\";\n const bn = new SafeBigNumber(num);\n return bn.lt(1e5)\n ? stringifyNumberWithGroupingSeparator(bn, 0)\n : stringifyNumberWithAbbreviation(bn);\n};\n\nexport const formatCount2 = (num: BigNumber.Value = \"\") => {\n if (!isValidNumber(num)) return \"--\";\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? stringifyNumberWithGroupingSeparator(bn, 0)\n : stringifyNumberWithAbbreviation(\n bn.div(1e3).integerValue(BigNumber.ROUND_DOWN).times(1e3),\n 0,\n );\n};\n\nexport const formatCount3 = (num: BigNumber.Value = \"\") => {\n if (!isValidNumber(num)) return \"--\";\n const bn = new SafeBigNumber(num);\n return stringifyNumberWithGroupingSeparator(bn, 0);\n};\n\nexport const displayCount4 = (num: BigNumber.Value = \"\") =>\n isValidNumber(num) ? stringifyNumberWithGroupingSeparator(num, 0) : \"--\";\n\nexport const displayCount3 = (num: BigNumber.Value = \"\") => {\n if (!isValidNumber(num)) return \"--\";\n const bn = new SafeBigNumber(num);\n return bn.lt(1e3)\n ? stringifyNumberWithGroupingSeparator(bn, 0)\n : stringifyNumberWithAbbreviation(\n bn.div(100).integerValue(BigNumber.ROUND_DOWN).times(100),\n );\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\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\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\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+$/, \"\"), // trim trailing zeros\n );\n};\n\nconst stringifyNumberWithSignificantPrecision = (\n num: BigNumber,\n precision: number,\n) => {\n const matched = num.toString().match(/\\.0*/); // has leading zeros\n const significantPrecision =\n (matched ? matched[0].length - 1 : 0) + precision;\n return stringifyNumberWithGroupingSeparator(num, significantPrecision);\n};\n\ntype StringifyAmountOptions = {\n precision?: number;\n groupingSeparator?: boolean;\n rounding?: \"up\" | \"down\" | \"ceil\" | \"floor\";\n // abbreviation if number is greater than this value\n acronymMin?: number;\n // display <min if number is less than this value\n min?: number;\n // display >max if number is greater than this value\n max?: number;\n // display this string if number is 0\n zeroDisplay?: string;\n};\n\nconst stringifyAmountWithClippingAndCapping = (\n num: BigNumber.Value,\n options: StringifyAmountOptions = {},\n) => {\n const {\n precision = 4,\n min,\n max,\n groupingSeparator,\n rounding,\n zeroDisplay,\n } = options;\n\n const roundingMap = {\n up: BigNumber.ROUND_UP,\n down: BigNumber.ROUND_DOWN,\n ceil: BigNumber.ROUND_CEIL,\n floor: BigNumber.ROUND_FLOOR,\n };\n\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return zeroDisplay ? zeroDisplay : \"0\";\n\n const abs = bn.abs();\n\n if (min && abs.lt(min)) return `<${min}`;\n if (max && abs.gt(max)) return `>${max}`;\n\n if (groupingSeparator) {\n return stringifyNumberWithGroupingSeparator(\n abs,\n precision,\n rounding ? roundingMap[rounding] : undefined,\n );\n }\n\n const rounded = rounding\n ? abs.decimalPlaces(precision, roundingMap[rounding])\n : abs.decimalPlaces(precision);\n return rounded.toString();\n};\n\nconst stringifyAmount = (\n num: BigNumber.Value,\n options: StringifyAmountOptions = {},\n) => {\n const bn = new SafeBigNumber(num);\n if (bn.eq(0)) return options.zeroDisplay ? options.zeroDisplay : \"\";\n\n const { acronymMin = 1e4 } = options;\n const abs = bn.abs();\n if (abs.lt(acronymMin))\n return stringifyAmountWithClippingAndCapping(bn, options);\n\n if (abs.gte(1e15)) {\n return bn.toExponential(2);\n }\n if (abs.gte(1e12)) {\n return `${stringifyAmountWithClippingAndCapping(bn.div(1e12), { ...options, precision: 0 })}T`;\n }\n if (abs.gte(1e9)) {\n return `${stringifyAmountWithClippingAndCapping(bn.div(1e9), { ...options, precision: 0 })}B`;\n }\n if (abs.gte(1e6)) {\n return `${stringifyAmountWithClippingAndCapping(bn.div(1e6), { ...options, precision: 1 })}M`;\n }\n if (abs.gte(1e4)) {\n return `${stringifyAmountWithClippingAndCapping(bn.div(1e3), { ...options, precision: 1 })}K`;\n }\n return stringifyAmountWithClippingAndCapping(bn, options);\n};\n","export function capitalizeString(str: string): string {\n // Convert the string to lowercase\n const lowercaseStr: string = str.toLowerCase();\n // Capitalize the first letter\n const capitalizedStr: string =\n lowercaseStr.charAt(0).toUpperCase() + lowercaseStr.slice(1);\n return capitalizedStr;\n}\n\nexport function camelCaseToSnakeCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nexport const findLongestCommonSubString = (str1: string, str2: string) => {\n for (let index = 0; index < str1.length; index++) {\n const ele1 = str1.at(index);\n const ele2 = str2.at(index);\n if (ele1 === ele2) {\n continue;\n }\n return index;\n }\n return -1;\n};\n\nexport function isHex(value: string): boolean {\n const hexRegex = /^[a-f0-9]+$/iu;\n return hexRegex.test(value);\n}\n\nexport function isHexString(value: string): boolean {\n return typeof value === \"string\" && value.startsWith(\"0x\") && isHex(value);\n}\n\n//address to short address\nexport function shortAddress(\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\nexport const parseTokenProtocolFamily = (\n chain: Chain,\n protocolFamily: string,\n): TokenProtocol | undefined => {\n switch (chain) {\n case Chain.SOLANA:\n return SOLANA_TOKEN_PROTOCOLS.find((p) =>\n new RegExp(p, \"i\").test(protocolFamily),\n );\n default:\n return undefined;\n }\n};\n\nexport const formatTokenProtocolName = (protocol: TokenProtocol) => {\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/${txHash}\",\n [Chain.ETHEREUM]: \"https://etherscan.io/tx/${txHash}\",\n [Chain.POLYGON]: \"https://polygonscan.com/tx/${txHash}\",\n [Chain.BINANCE]: \"https://bscscan.com/tx/${txHash}\",\n [Chain.BINANCE_TESTNET]: \"https://testnet.bscscan.com/tx/${txHash}\",\n [Chain.AVALANCHE]: \"https://snowtrace.io/tx/${txHash}\",\n [Chain.BASE]: \"https://basescan.org/tx/${txHash}\",\n [Chain.BLAST]: \"https://blastracker.xyz/tx/${txHash}\",\n [Chain.ARBITRUM]: \"https://arbiscan.io/tx/${txHash}\",\n [Chain.ARBITRUM_NOVA]: \"https://nova.arbiscan.io/tx/${txHash}\",\n [Chain.ARBITRUM_TESTNET_GOERLI]: \"https://goerli.arbiscan.io/tx/${txHash}\",\n [Chain.ARBITRUM_TESTNET_SEPOLIA]: \"https://sepolia.arbiscan.io/tx/${txHash}\",\n};\n\nexport function txExplorerUrl(chainId: Chain, txHash: string) {\n return TX_EXPLORER_URLS[chainId]?.replace(\"${txHash}\", txHash);\n}\n\nconst ACCOUNT_EXPLORER_URLS: Partial<Record<Chain, string>> = {\n [Chain.SOLANA]: \"https://solscan.io/account/${account}\",\n [Chain.ETHEREUM]: \"https://etherscan.io/address/${account}\",\n [Chain.POLYGON]: \"https://polygonscan.com/address/${account}\",\n [Chain.BINANCE]: \"https://bscscan.com/address/${account}\",\n};\n\nexport const accountExplorerUrl = (chainId: Chain, account: string) => {\n return ACCOUNT_EXPLORER_URLS[chainId]?.replace(\"${account}\", account);\n};\n\nexport function searchImageUrl(image: string) {\n return `https://lens.google.com/uploadbyurl?url=${encodeURIComponent(image)}`;\n}\n\nexport function searchTwitterUrl(q: string) {\n return `https://x.com/search?q=${encodeURIComponent(q)}`;\n}\n\nexport function twitterUserUrl(username: string) {\n return `https://x.com/${username}`;\n}\n\nexport function twitterTweetUrl(id: string) {\n return `https://x.com/${id}`;\n}\n\nexport function twitterMediaUrl(id: string) {\n return `https://x.com/${id}`;\n}\n","// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const windowGuard = (cb: Function) => {\n if (typeof window !== \"undefined\") {\n cb();\n }\n};\n\nexport const getGlobalObject = () => {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n if (typeof self !== \"undefined\") {\n return self;\n }\n if (typeof window !== \"undefined\") {\n return window;\n }\n // @ts-ignore\n if (typeof global !== \"undefined\") {\n // @ts-ignore\n return global;\n }\n throw new Error(\"cannot find the global object\");\n};\n\n/// get timestamp\nexport const getTimestamp = (): number => {\n if (typeof window !== \"undefined\") {\n // @ts-ignore\n const timeOffset = getGlobalObject()?.__LIBERFI_timestamp_offset;\n if (typeof timeOffset === \"number\") {\n return Date.now() + (timeOffset || 0);\n }\n }\n return Date.now();\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\";\nexport * from \"./window\";\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","chainToNamespace","chain","chainSlugs","chainSlugAbbrs","chainColors","chainColor","chainId","chainIcon","_a","chainIdBySlug","slug","chainSlug","chainDisplayName","abbr","foundAbbrKey","key","foundSlugKey","isValidWalletAddress","addr","isValidSolanaAddress","isValidEvmAddress","value","e","ApiError","message","code","NOW","MINUTE","HOUR","DAY","YEAR","millisecondsToHMS","milliseconds","totalSeconds","hours","minutes","seconds","timestampToString","timestamp","date","year","month","day","subtractDaysFromCurrentDate","days","startDate","currentDate","resultDate","maybeSecondsToMilliseconds","formatToMilliseconds","parsed","formatTimeAgo","diffSeconds","secondsSince","now","currentTime","targetTime","diffInMilliseconds","defaultTranslations","formatReadableTime","options","translations","years","formatAge","age","formatAgeInSeconds","request","url","options","__async","response","__spreadProps","__spreadValues","_createHeaders","errorMsg","ApiError","e","headers","method","_headers","get","post","data","put","del","mutate","init","BigNumber","SafeBigNumber","BigNumber","num","base","e","isValidNumber","floatNum","canConvertToNumber","isValidTimeframe","timeframe","formatAmount","options","bn","negative","abs","formatted","stringifyNumberWithGroupingSeparator","stringifyNumberWithAbbreviation","formatAmount2","formatAmount3","formatAmountUSD","formatAmountUSD2","roundedAbs","stringifyAmount","formatAmountUSD3","formatAmountUSD4","formatAmountUSD5","formatPrice","isHighPrecise","stringifyNumberWithLeadingZeroSubscripts","stringifyNumberWithSignificantPrecision","formatPriceUSD","formatPercent","_a","_b","sign","stringifyPercent","precision","formatMultiplier","formatCount","formatCount2","formatCount3","displayCount4","displayCount3","subscriptDigits","rounding","parts","integerPart","decimalPart","digits","firstNonZeroIndex","precisionDigitsCount","matched","significantPrecision","stringifyAmountWithClippingAndCapping","min","max","groupingSeparator","zeroDisplay","roundingMap","acronymMin","__spreadProps","__spreadValues","capitalizeString","str","lowercaseStr","camelCaseToSnakeCase","findLongestCommonSubString","str1","str2","index","ele1","ele2","isHex","value","isHexString","shortAddress","address","start","end","formatSymbol","symbol","formatString","arr","type","base","quote","Chain","SOLANA_TOKEN_PROTOCOLS","parseTokenProtocolFamily","chain","protocolFamily","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","txExplorerUrl","chainId","txHash","_a","ACCOUNT_EXPLORER_URLS","accountExplorerUrl","account","searchImageUrl","image","searchTwitterUrl","q","twitterUserUrl","username","twitterTweetUrl","id","twitterMediaUrl","windowGuard","cb","getGlobalObject","getTimestamp","_a","timeOffset","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/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.26\";\n}\n\nexport default \"0.1.26\";\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 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","formatPriceUSD","isHighPrecise","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/utils",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "Liberfi React SDK utils",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -10,22 +10,19 @@
10
10
  ],
11
11
  "license": "ISC",
12
12
  "devDependencies": {
13
- "@babel/core": "^7.22.9",
14
- "@babel/preset-env": "^7.22.9",
15
- "@babel/preset-typescript": "^7.22.5",
16
13
  "@types/jest": "^29.5.3",
17
14
  "@types/lodash-es": "^4.17.12",
18
- "babel-jest": "^29.6.1",
19
15
  "jest": "^29.6.1",
16
+ "ts-jest": "^29.4.0",
20
17
  "tsup": "^8.5.0",
21
18
  "typescript": "^5.9.2",
22
- "tsconfig": "0.1.15"
19
+ "tsconfig": "0.1.17"
23
20
  },
24
21
  "dependencies": {
25
22
  "@solana/kit": "^2.3.0",
26
23
  "bignumber.js": "^9.3.1",
27
24
  "lodash-es": "^4.17.21",
28
- "@liberfi.io/types": "0.1.27"
25
+ "@liberfi.io/types": "0.1.29"
29
26
  },
30
27
  "publishConfig": {
31
28
  "access": "public"