@tcswap/helpers 4.5.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.cjs +4 -0
- package/dist/api/index.cjs.map +16 -0
- package/dist/api/index.js +4 -0
- package/dist/api/index.js.map +16 -0
- package/dist/chunk-pfmeq01a.js +5 -0
- package/dist/chunk-pfmeq01a.js.map +9 -0
- package/dist/chunk-vb4wtm2w.js +4 -0
- package/dist/chunk-vb4wtm2w.js.map +9 -0
- package/dist/contracts.cjs +4 -0
- package/dist/contracts.cjs.map +10 -0
- package/dist/contracts.js +4 -0
- package/dist/contracts.js.map +10 -0
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +30 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +30 -0
- package/dist/tokens.cjs +4 -0
- package/dist/tokens.cjs.map +10 -0
- package/dist/tokens.js +4 -0
- package/dist/tokens.js.map +10 -0
- package/dist/types/api/index.d.ts +502 -0
- package/dist/types/api/index.d.ts.map +1 -0
- package/dist/types/api/memoless/endpoints.d.ts +56 -0
- package/dist/types/api/memoless/endpoints.d.ts.map +1 -0
- package/dist/types/api/memoless/types.d.ts +85 -0
- package/dist/types/api/memoless/types.d.ts.map +1 -0
- package/dist/types/api/midgard/endpoints.d.ts +80 -0
- package/dist/types/api/midgard/endpoints.d.ts.map +1 -0
- package/dist/types/api/midgard/types.d.ts +543 -0
- package/dist/types/api/midgard/types.d.ts.map +1 -0
- package/dist/types/api/thornode/endpoints.d.ts +34 -0
- package/dist/types/api/thornode/endpoints.d.ts.map +1 -0
- package/dist/types/api/thornode/types.d.ts +264 -0
- package/dist/types/api/thornode/types.d.ts.map +1 -0
- package/dist/types/api/uswap/endpoints.d.ts +372 -0
- package/dist/types/api/uswap/endpoints.d.ts.map +1 -0
- package/dist/types/api/uswap/types.d.ts +1487 -0
- package/dist/types/api/uswap/types.d.ts.map +1 -0
- package/dist/types/contracts.d.ts +2 -0
- package/dist/types/contracts.d.ts.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/modules/assetValue.d.ts +82 -0
- package/dist/types/modules/assetValue.d.ts.map +1 -0
- package/dist/types/modules/bigIntArithmetics.d.ts +60 -0
- package/dist/types/modules/bigIntArithmetics.d.ts.map +1 -0
- package/dist/types/modules/feeMultiplier.d.ts +48 -0
- package/dist/types/modules/feeMultiplier.d.ts.map +1 -0
- package/dist/types/modules/requestClient.d.ts +33 -0
- package/dist/types/modules/requestClient.d.ts.map +1 -0
- package/dist/types/modules/uSwapConfig.d.ts +249 -0
- package/dist/types/modules/uSwapConfig.d.ts.map +1 -0
- package/dist/types/modules/uSwapError.d.ts +879 -0
- package/dist/types/modules/uSwapError.d.ts.map +1 -0
- package/dist/types/modules/uSwapNumber.d.ts +10 -0
- package/dist/types/modules/uSwapNumber.d.ts.map +1 -0
- package/dist/types/tokens.d.ts +2 -0
- package/dist/types/tokens.d.ts.map +1 -0
- package/dist/types/types/commonTypes.d.ts +16 -0
- package/dist/types/types/commonTypes.d.ts.map +1 -0
- package/dist/types/types/derivationPath.d.ts +4 -0
- package/dist/types/types/derivationPath.d.ts.map +1 -0
- package/dist/types/types/errors/apiV1.d.ts +2 -0
- package/dist/types/types/errors/apiV1.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +6 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/quotes.d.ts +180 -0
- package/dist/types/types/quotes.d.ts.map +1 -0
- package/dist/types/types/sdk.d.ts +35 -0
- package/dist/types/types/sdk.d.ts.map +1 -0
- package/dist/types/types/wallet.d.ts +130 -0
- package/dist/types/types/wallet.d.ts.map +1 -0
- package/dist/types/utils/asset.d.ts +37 -0
- package/dist/types/utils/asset.d.ts.map +1 -0
- package/dist/types/utils/chains.d.ts +13 -0
- package/dist/types/utils/chains.d.ts.map +1 -0
- package/dist/types/utils/derivationPath.d.ts +21 -0
- package/dist/types/utils/derivationPath.d.ts.map +1 -0
- package/dist/types/utils/explorerUrls.d.ts +10 -0
- package/dist/types/utils/explorerUrls.d.ts.map +1 -0
- package/dist/types/utils/liquidity.d.ts +62 -0
- package/dist/types/utils/liquidity.d.ts.map +1 -0
- package/dist/types/utils/memo.d.ts +65 -0
- package/dist/types/utils/memo.d.ts.map +1 -0
- package/dist/types/utils/others.d.ts +15 -0
- package/dist/types/utils/others.d.ts.map +1 -0
- package/dist/types/utils/validators.d.ts +6 -0
- package/dist/types/utils/validators.d.ts.map +1 -0
- package/dist/types/utils/wallets.d.ts +36 -0
- package/dist/types/utils/wallets.d.ts.map +1 -0
- package/package.json +67 -0
- package/src/api/index.ts +15 -0
- package/src/api/memoless/endpoints.ts +62 -0
- package/src/api/memoless/types.ts +83 -0
- package/src/api/midgard/endpoints.ts +352 -0
- package/src/api/midgard/types.ts +515 -0
- package/src/api/thornode/endpoints.ts +109 -0
- package/src/api/thornode/types.ts +247 -0
- package/src/api/uswap/endpoints.ts +252 -0
- package/src/api/uswap/types.ts +626 -0
- package/src/contracts.ts +1 -0
- package/src/index.ts +32 -0
- package/src/modules/__tests__/assetValue.test.ts +2452 -0
- package/src/modules/__tests__/bigIntArithmetics.test.ts +410 -0
- package/src/modules/__tests__/feeMultiplier.test.ts +131 -0
- package/src/modules/__tests__/uSwapConfig.test.ts +429 -0
- package/src/modules/__tests__/uSwapNumber.test.ts +439 -0
- package/src/modules/assetValue.ts +536 -0
- package/src/modules/bigIntArithmetics.ts +366 -0
- package/src/modules/feeMultiplier.ts +84 -0
- package/src/modules/requestClient.ts +116 -0
- package/src/modules/uSwapConfig.ts +189 -0
- package/src/modules/uSwapError.ts +474 -0
- package/src/modules/uSwapNumber.ts +17 -0
- package/src/tokens.ts +1 -0
- package/src/types/commonTypes.ts +10 -0
- package/src/types/derivationPath.ts +11 -0
- package/src/types/errors/apiV1.ts +0 -0
- package/src/types/index.ts +5 -0
- package/src/types/quotes.ts +182 -0
- package/src/types/sdk.ts +38 -0
- package/src/types/wallet.ts +124 -0
- package/src/utils/__tests__/asset.test.ts +186 -0
- package/src/utils/__tests__/derivationPath.test.ts +142 -0
- package/src/utils/__tests__/explorerUrls.test.ts +59 -0
- package/src/utils/__tests__/liquidity.test.ts +302 -0
- package/src/utils/__tests__/memo.test.ts +99 -0
- package/src/utils/__tests__/others.test.ts +169 -0
- package/src/utils/__tests__/validators.test.ts +84 -0
- package/src/utils/__tests__/wallets.test.ts +625 -0
- package/src/utils/asset.ts +399 -0
- package/src/utils/chains.ts +104 -0
- package/src/utils/derivationPath.ts +101 -0
- package/src/utils/explorerUrls.ts +32 -0
- package/src/utils/liquidity.ts +154 -0
- package/src/utils/memo.ts +102 -0
- package/src/utils/others.ts +64 -0
- package/src/utils/validators.ts +36 -0
- package/src/utils/wallets.ts +238 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/modules/assetValue.ts", "../src/utils/asset.ts", "../src/modules/uSwapConfig.ts", "../src/types/derivationPath.ts", "../src/types/quotes.ts", "../src/types/sdk.ts", "../src/types/wallet.ts", "../src/modules/uSwapError.ts", "../src/modules/requestClient.ts", "../src/utils/chains.ts", "../src/utils/others.ts", "../src/utils/validators.ts", "../src/modules/bigIntArithmetics.ts", "../src/modules/feeMultiplier.ts", "../src/modules/uSwapNumber.ts", "../src/utils/derivationPath.ts", "../src/utils/explorerUrls.ts", "../src/utils/liquidity.ts", "../src/utils/memo.ts", "../src/utils/wallets.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nexport * from \"@tcswap/tokens\";\nexport * from \"@tcswap/types\";\n/**\n * Modules\n */\nexport * from \"./modules/assetValue\";\nexport * from \"./modules/bigIntArithmetics\";\nexport * from \"./modules/feeMultiplier\";\nexport * from \"./modules/requestClient\";\nexport * from \"./modules/uSwapConfig\";\nexport * from \"./modules/uSwapError\";\nexport * from \"./modules/uSwapNumber\";\n/**\n * Types\n */\nexport * from \"./types\";\n/**\n * Utils\n */\nexport * from \"./utils/asset\";\nexport * from \"./utils/chains\";\nexport * from \"./utils/derivationPath\";\nexport * from \"./utils/explorerUrls\";\nexport * from \"./utils/liquidity\";\nexport * from \"./utils/memo\";\nexport * from \"./utils/others\";\nexport * from \"./utils/validators\";\nexport * from \"./utils/wallets\";\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { TokenListName, TokenNames, TokenTax } from \"@tcswap/tokens\";\nimport { AllChains, Chain, type ChainId, type EVMChain, EVMChains, getChainConfig } from \"@tcswap/types\";\nimport { getAddress } from \"ethers\";\nimport { match } from \"ts-pattern\";\nimport {\n assetFromString,\n type CommonAssetString,\n fetchTokenInfo,\n getAssetType,\n getCommonAssetInfo,\n isGasAsset,\n} from \"../utils/asset\";\nimport { warnOnce } from \"../utils/others\";\nimport { validateIdentifier } from \"../utils/validators\";\n\nimport type { NumberPrimitives } from \"./bigIntArithmetics\";\nimport { BigIntArithmetics, formatBigIntToSafeValue } from \"./bigIntArithmetics\";\nimport { USwapError } from \"./uSwapError\";\nimport type { SwapKitValueType } from \"./uSwapNumber\";\n\nconst CASE_SENSITIVE_CHAINS: Chain[] = [Chain.Solana, Chain.Tron, Chain.Near, Chain.Sui];\nconst TC_CHAINS: Chain[] = [Chain.THORChain, Chain.Maya];\n\nconst staticTokensMap = new Map<\n TokenNames | (string & {}),\n { tax?: TokenTax; decimal: number; identifier: string; logoURI?: string }\n>();\n\nconst chainAddressIdentifierMap = new Map<string, string>();\n\nconst asyncTokenCache = new Map<string, { identifier: string; decimals: number; timestamp: number }>();\nconst CACHE_TTL = 3600000;\n\nfunction getCachedTokenInfo(key: string) {\n const cached = asyncTokenCache.get(key);\n\n if (cached?.timestamp && Date.now() - cached.timestamp > CACHE_TTL) {\n asyncTokenCache.delete(key);\n return undefined;\n }\n\n return cached;\n}\n\nfunction setCachedTokenInfo(key: string, info: { identifier: string; decimals: number }) {\n if (asyncTokenCache.size > 1000) {\n const firstKey = asyncTokenCache.keys().next().value;\n if (firstKey) asyncTokenCache.delete(firstKey);\n }\n\n asyncTokenCache.set(key, { ...info, timestamp: Date.now() });\n}\n\ntype ConditionalAssetValueReturn<T extends { asyncTokenLookup?: boolean }> = T[\"asyncTokenLookup\"] extends true\n ? Promise<AssetValue>\n : AssetValue;\n\ntype AssetIdentifier =\n | { asset: CommonAssetString | TokenNames }\n | { asset: string }\n | { chain: Chain; address?: string };\n\ntype AssetValueFromParams = AssetIdentifier & {\n value?: NumberPrimitives | SwapKitValueType;\n fromBaseDecimal?: number;\n asyncTokenLookup?: boolean;\n};\n\nexport class AssetValue extends BigIntArithmetics {\n address?: string;\n chain: Chain;\n isGasAsset = false;\n isSynthetic = false;\n isTradeAsset = false;\n symbol: string;\n tax?: TokenTax;\n ticker: string;\n type: ReturnType<typeof getAssetType>;\n chainId: ChainId;\n\n constructor({\n value,\n decimal,\n tax,\n chain,\n symbol,\n identifier,\n }: { decimal: number; value: SwapKitValueType; tax?: TokenTax } & (\n | { chain: Chain; symbol: string; identifier?: never }\n | { identifier: string; chain?: never; symbol?: never }\n )) {\n super(typeof value === \"object\" ? value : { decimal, value });\n\n const assetInfo = getAssetInfo(identifier || `${chain}.${symbol}`);\n\n this.type = getAssetType(assetInfo);\n this.tax = tax;\n this.chain = assetInfo.chain;\n this.ticker = assetInfo.ticker;\n this.symbol = assetInfo.symbol;\n this.address = assetInfo.address;\n this.isSynthetic = assetInfo.isSynthetic;\n this.isTradeAsset = assetInfo.isTradeAsset;\n this.isGasAsset = assetInfo.isGasAsset;\n this.chainId = getChainConfig(assetInfo.chain).chainId;\n }\n\n toString({ includeSynthProtocol }: { includeSynthProtocol?: boolean } = {}) {\n return (this.isSynthetic || this.isTradeAsset) && !includeSynthProtocol\n ? this.symbol\n : `${this.chain}.${this.symbol}`;\n }\n\n toUrl() {\n if (this.isSynthetic) {\n return `${this.chain}.${this.symbol.replace(/\\//g, \".\")}`;\n }\n\n if (this.isTradeAsset) {\n return `${this.chain}.${this.symbol.replace(/~/g, \"..\")}`;\n }\n\n const encodedSymbol = this.symbol.replace(/\\./g, \"__\");\n return `${this.chain}.${encodedSymbol}`;\n }\n\n getIconUrl() {\n const token = staticTokensMap.get(this.toString());\n return token?.logoURI;\n }\n\n eqAsset({ chain, symbol }: { chain: Chain; symbol: string }) {\n return this.chain === chain && this.symbol === symbol;\n }\n\n eq(assetValue: AssetValue) {\n return this.eqAsset(assetValue) && this.eqValue(assetValue);\n }\n\n static fromUrl(urlAsset: string, value: NumberPrimitives = 0) {\n const firstDotIndex = urlAsset.indexOf(\".\");\n\n if (firstDotIndex === -1) {\n throw new USwapError({ errorKey: \"helpers_invalid_asset_url\", info: { urlAsset } });\n }\n\n const chain = urlAsset.slice(0, firstDotIndex);\n const rest = urlAsset.slice(firstDotIndex + 1);\n\n const asset = match({ chain: chain as Chain, rest })\n .when(\n ({ rest }) => rest.includes(\"..\"),\n ({ chain, rest }) => `${chain}.${rest.replace(/\\.\\./g, \"~\")}`,\n )\n .when(\n ({ chain, rest }) => TC_CHAINS.includes(chain) && rest.includes(\".\"),\n ({ chain, rest }) => `${chain}.${rest.replace(/\\./g, \"/\")}`,\n )\n .otherwise(({ chain, rest }) => `${chain}.${rest.replace(/__/g, \".\")}`);\n\n return AssetValue.from({ asset, value });\n }\n\n static from<T extends {}>({\n value = 0,\n fromBaseDecimal,\n asyncTokenLookup,\n ...fromAssetOrChain\n }: T & AssetValueFromParams): ConditionalAssetValueReturn<T> {\n const parsedValue = value instanceof BigIntArithmetics ? value.getValue(\"string\") : value;\n const assetOrChain = getAssetString(fromAssetOrChain);\n\n const isChainAddressCombo = !assetOrChain.startsWith(Chain.Sui) && assetOrChain.includes(\":\");\n\n if (asyncTokenLookup && isChainAddressCombo) {\n const [chain, address] = assetOrChain.split(\":\") as [Chain, string];\n\n return createAsyncAssetValue({ address, chain, fromBaseDecimal, parsedValue }) as ConditionalAssetValueReturn<T>;\n }\n\n const fallbackIdentifier = isChainAddressCombo ? assetOrChain.split(\":\").join(\".UNKNOWN-\") : assetOrChain;\n\n const { identifier: unsafeIdentifier, decimal: commonAssetDecimal } = getCommonAssetInfo(\n fallbackIdentifier as CommonAssetString,\n );\n\n const { chain, isSynthetic, isTradeAsset, address } = getAssetInfo(unsafeIdentifier);\n const { baseDecimal } = getChainConfig(chain);\n\n const token = staticTokensMap.get(\n CASE_SENSITIVE_CHAINS.includes(chain)\n ? (unsafeIdentifier as TokenNames)\n : (unsafeIdentifier.toUpperCase() as TokenNames),\n );\n\n if (!token && asyncTokenLookup && !isSynthetic && !isTradeAsset) {\n return (async () => {\n const { ticker } = assetFromString(unsafeIdentifier);\n const tokenData = await fetchTokenData({ address, chain, ticker });\n return createAssetValue({\n decimal: tokenData.decimals,\n identifier: tokenData.identifier,\n value: fromBaseDecimal ? safeValue(BigInt(parsedValue), fromBaseDecimal) : parsedValue,\n });\n })() as ConditionalAssetValueReturn<T>;\n }\n\n const tokenDecimal = token?.decimal || commonAssetDecimal;\n\n warnOnce({\n condition: !tokenDecimal && !asyncTokenLookup,\n id: `assetValue_static_decimal_not_found_${chain}`,\n warning: `Couldn't find static decimal for one or more tokens on ${chain} (Using default ${baseDecimal} decimal as fallback).\nThis can result in incorrect calculations and mess with amount sent on transactions.\nYou can load static assets by installing @tcswap/tokens package and calling AssetValue.loadStaticAssets()\nor by passing asyncTokenLookup: true to the from() function, which will make it async and return a promise.`,\n });\n\n const { decimal, identifier, tax } = token || {\n decimal: tokenDecimal || baseDecimal,\n identifier: unsafeIdentifier,\n };\n\n const adjustedValue = fromBaseDecimal\n ? safeValue(BigInt(parsedValue), fromBaseDecimal)\n : safeValue(parsedValue, decimal);\n\n const assetValue =\n isSynthetic || isTradeAsset\n ? createSyntheticAssetValue(identifier, adjustedValue)\n : createAssetValue({ decimal, identifier, tax, value: adjustedValue });\n\n return assetValue as ConditionalAssetValueReturn<T>;\n }\n\n static async loadStaticAssets(listNames?: TokenListName[]) {\n const { loadTokenLists } = await import(\"@tcswap/tokens\");\n const lists = await loadTokenLists(listNames);\n\n for (const { tokens } of Object.values(lists)) {\n for (const { identifier, chain, ...rest } of tokens) {\n const chainConfig = getChainConfig(chain as Chain);\n\n const tokenKey = (\n CASE_SENSITIVE_CHAINS.includes(chainConfig.chain) ? identifier : identifier.toUpperCase()\n ) as TokenNames;\n const tokenDecimal = \"decimals\" in rest ? rest.decimals : chainConfig.baseDecimal;\n\n const tokenInfo = {\n decimal: tokenDecimal,\n identifier,\n logoURI: \"logoURI\" in rest ? (rest.logoURI as string) : undefined,\n tax: \"tax\" in rest ? (rest.tax as TokenTax) : undefined,\n };\n\n staticTokensMap.set(tokenKey, tokenInfo);\n\n // Also populate chain:address map for quick lookups\n if (\"address\" in rest && rest.address) {\n const lookupKey = CASE_SENSITIVE_CHAINS.includes(chainConfig.chain)\n ? `${chainConfig.chain}:${rest.address}`\n : `${chainConfig.chain}:${rest.address.toUpperCase()}`;\n chainAddressIdentifierMap.set(lookupKey, identifier);\n }\n }\n }\n\n return true;\n }\n\n static setStaticAssets(\n tokenMap: Map<\n string,\n { tax?: TokenTax; identifier: string; chain: Chain; address?: string } & (\n | { decimal: number }\n | { decimals: number }\n )\n >,\n ) {\n staticTokensMap.clear();\n chainAddressIdentifierMap.clear();\n\n for (const [key, value] of tokenMap.entries()) {\n const tokenKey = (\n CASE_SENSITIVE_CHAINS.includes(value.chain) ? value.identifier : value.identifier.toUpperCase()\n ) as TokenNames;\n const tokenDecimal = \"decimals\" in value ? value.decimals : value.decimal;\n const tokenInfo = { ...value, decimal: tokenDecimal, identifier: tokenKey };\n\n staticTokensMap.set(key, tokenInfo);\n\n if (value.address) {\n const lookupKey = CASE_SENSITIVE_CHAINS.includes(value.chain)\n ? `${value.chain}:${value.address}`\n : `${value.chain}:${value.address.toUpperCase()}`;\n chainAddressIdentifierMap.set(lookupKey, value.identifier);\n }\n }\n return true;\n }\n\n static get staticAssets() {\n return staticTokensMap;\n }\n}\n\nexport function getMinAmountByChain(chain: Chain) {\n const asset = AssetValue.from({ chain });\n\n return match(chain)\n .with(Chain.Bitcoin, Chain.Litecoin, Chain.BitcoinCash, Chain.Dash, () => asset.set(0.00010001))\n .with(Chain.Dogecoin, () => asset.set(1.00000001))\n .with(Chain.Avalanche, Chain.Ethereum, Chain.Arbitrum, Chain.BinanceSmartChain, () => asset.set(0.00000001))\n .with(Chain.THORChain, Chain.Maya, () => asset.set(0))\n .with(Chain.Cosmos, Chain.Kujira, () => asset.set(0.000001))\n .otherwise(() => asset.set(0.00000001));\n}\n\nasync function fetchTokenData({ chain, address, ticker }: { chain: Chain; address?: string; ticker?: string }) {\n const isCaseSensitiveChain = CASE_SENSITIVE_CHAINS.includes(chain);\n\n const cacheKey = isCaseSensitiveChain\n ? `${chain}:${address || ticker}`\n : `${chain}:${address || ticker}`.toUpperCase();\n\n const cached = getCachedTokenInfo(cacheKey);\n if (cached) {\n return cached;\n }\n\n if (!address) {\n const { baseDecimal } = getChainConfig(chain);\n return { decimals: baseDecimal, identifier: `${chain}.${ticker || \"UNKNOWN\"}` };\n }\n\n const tokenInfo = await fetchTokenInfo({ address, chain });\n\n const identifier = `${chain}.${tokenInfo.ticker || ticker || \"UNKNOWN\"}-${address}`;\n\n warnOnce({\n condition: !!(!tokenInfo.ticker && ticker),\n id: `async_token_lookup_failed_${chain}_${address}`,\n warning: `Could not fetch token metadata for ${chain}:${address} from chain. Using user-provided ticker (${ticker}) with baseDecimal (${tokenInfo.decimals}).`,\n });\n\n // only cache if we got a proper ticker back\n tokenInfo.ticker && setCachedTokenInfo(cacheKey, { decimals: tokenInfo.decimals, identifier });\n\n return { decimals: tokenInfo.decimals, identifier };\n}\n\nfunction createAssetValue({\n identifier,\n decimal,\n value,\n tax,\n}: {\n identifier: string;\n decimal: number;\n value: NumberPrimitives;\n tax?: TokenTax;\n}) {\n validateIdentifier(identifier);\n return new AssetValue({ decimal, identifier, tax, value: safeValue(value, decimal) });\n}\n\nfunction createSyntheticAssetValue(identifier: string, value: NumberPrimitives = 0) {\n const chain = identifier.includes(\".\") ? (identifier.split(\".\")?.[0]?.toUpperCase() as Chain) : undefined;\n const isMayaOrThor = chain ? TC_CHAINS.includes(chain) : false;\n\n const assetSeparator = identifier.slice(0, 14).includes(\"~\") ? \"~\" : \"/\";\n\n const [synthChain, symbol] = isMayaOrThor\n ? identifier.split(\".\").slice(1).join().split(assetSeparator)\n : identifier.split(assetSeparator);\n\n if (!(synthChain && symbol)) {\n throw new USwapError({ errorKey: \"helpers_invalid_asset_identifier\", info: { identifier } });\n }\n\n return new AssetValue({\n decimal: 8,\n identifier: `${chain || Chain.THORChain}.${synthChain}${assetSeparator}${symbol}`,\n value: safeValue(value, 8),\n });\n}\n\nasync function createAsyncAssetValue({\n address,\n chain,\n fromBaseDecimal,\n parsedValue,\n}: {\n address: string;\n chain: Chain;\n fromBaseDecimal?: number;\n parsedValue: NumberPrimitives;\n}): Promise<AssetValue> {\n const { decimals, identifier } = await fetchTokenData({ address, chain });\n const value = fromBaseDecimal ? safeValue(BigInt(parsedValue), fromBaseDecimal) : parsedValue;\n return createAssetValue({ decimal: decimals, identifier, value });\n}\n\nfunction safeValue(value: NumberPrimitives, decimal: number) {\n return typeof value === \"bigint\" ? formatBigIntToSafeValue({ bigIntDecimal: decimal, decimal, value }) : value;\n}\n\nfunction validateAssetChain(assetOrChain: AssetIdentifier) {\n const chain = match(assetOrChain)\n .when(\n (x): x is { chain: Chain } => \"chain\" in x && x.chain !== undefined,\n ({ chain }) => chain,\n )\n .otherwise((x) => {\n const assetInfo = assetFromString((x as { asset: string }).asset);\n return assetInfo.synth ? Chain.THORChain : assetInfo.chain;\n });\n\n // TODO: move to USwapConfig chains once we support it throughout sdk\n if (!AllChains.includes(chain.toUpperCase() as Chain)) {\n throw new USwapError({\n errorKey: \"helpers_invalid_asset_identifier\",\n info: { message: \"Please use the AssetValue constructor for unsupported chains\" },\n });\n }\n}\n\nfunction getAssetString(assetOrChain: AssetIdentifier) {\n validateAssetChain(assetOrChain);\n\n if (\"chain\" in assetOrChain) {\n const { chain, address } = assetOrChain;\n\n if (address) {\n const lookupKey = CASE_SENSITIVE_CHAINS.includes(chain as Chain)\n ? `${chain}:${address}`\n : `${chain}:${address.toUpperCase()}`;\n const identifier = chainAddressIdentifierMap.get(lookupKey);\n if (identifier) return identifier;\n return lookupKey;\n }\n\n return chain;\n }\n\n const { chain, symbol } = assetFromString(assetOrChain.asset);\n const isNativeChain = getAssetType({ chain, symbol }) === \"Native\";\n\n return isNativeChain ? chain : assetOrChain.asset;\n}\n\nfunction getSyntheticOrTradeAssetInfo(identifier: string, isSynthetic: boolean, isTradeAsset: boolean) {\n const splitIdentifier = identifier.split(\".\");\n const identifierChain = splitIdentifier[0]?.toUpperCase() as Chain;\n const isThorOrMaya = TC_CHAINS.includes(identifierChain);\n\n const assetSeparator = isTradeAsset ? \"~\" : \"/\";\n\n const [synthChain, synthSymbol = \"\"] = isThorOrMaya\n ? splitIdentifier.slice(1).join(\".\").split(assetSeparator)\n : identifier.split(assetSeparator);\n\n if (!(synthChain && synthSymbol)) {\n throw new USwapError({ errorKey: \"helpers_invalid_asset_identifier\", info: { identifier } });\n }\n\n // Get the ticker from the base symbol (e.g., \"AVAX\" from \"AVAX/AVAX\")\n const { ticker, address } = getAssetBaseInfo({ chain: synthChain as Chain, symbol: synthSymbol });\n const finalSymbol = `${synthChain}${assetSeparator}${synthSymbol}`;\n\n return { address, chain: identifierChain, isGasAsset: false, isSynthetic, isTradeAsset, symbol: finalSymbol, ticker };\n}\n\nfunction getNormalAssetInfo(identifier: string) {\n const firstDotIndex = identifier.indexOf(\".\");\n const chain = (firstDotIndex === -1 ? identifier : identifier.slice(0, firstDotIndex)).toUpperCase() as Chain;\n const assetSymbol = firstDotIndex === -1 ? identifier : identifier.slice(firstDotIndex + 1);\n\n const { address, ticker } = getAssetBaseInfo({ chain, symbol: assetSymbol });\n\n let formattedAddress: string | undefined;\n try {\n formattedAddress =\n address && EVMChains.includes(chain as EVMChain) && getAddress(address) ? getAddress(address) : address;\n } catch {\n formattedAddress = address;\n }\n\n const finalSymbol = formattedAddress ? `${ticker}-${formattedAddress}` : assetSymbol;\n\n return {\n address: formattedAddress,\n chain,\n isGasAsset: isGasAsset({ chain, symbol: assetSymbol }),\n isSynthetic: false,\n isTradeAsset: false,\n symbol: finalSymbol,\n ticker,\n };\n}\n\nfunction getAssetInfo(identifier: string) {\n const shortIdentifier = identifier.slice(0, 14);\n const isSynthetic = shortIdentifier.includes(\"/\");\n const isTradeAsset = shortIdentifier.includes(\"~\");\n\n if (isSynthetic || isTradeAsset) {\n return getSyntheticOrTradeAssetInfo(identifier, isSynthetic, isTradeAsset);\n }\n\n return getNormalAssetInfo(identifier);\n}\n\nfunction parseSymbolWithSeparator(symbol: string, useFirst = false) {\n const dashIndex = useFirst ? symbol.indexOf(\"-\") : symbol.lastIndexOf(\"-\");\n\n if (dashIndex === -1) {\n return { address: undefined, ticker: symbol };\n }\n\n const ticker = symbol.slice(0, dashIndex);\n const address = symbol.slice(dashIndex + 1);\n return { address, ticker };\n}\n\nfunction getAssetBaseInfo({ symbol, chain }: { symbol: string; chain: Chain }) {\n const { ticker, address } = parseSymbolWithSeparator(symbol, chain === Chain.Near);\n\n const finalAddress = address && !CASE_SENSITIVE_CHAINS.includes(chain) ? address.toLowerCase() : address;\n\n return { address: finalAddress, ticker };\n}\n",
|
|
7
|
+
"import type { TokenNames } from \"@tcswap/tokens\";\nimport { Chain, type EVMChain, EVMChains, getChainConfig, UTXOChains } from \"@tcswap/types\";\nimport { match } from \"ts-pattern\";\nimport type { AssetValue } from \"../modules/assetValue\";\nimport { RequestClient } from \"../modules/requestClient\";\nimport { getRPCUrl } from \"./chains\";\n\nexport type CommonAssetString = (typeof CommonAssetStrings)[number] | Chain;\n\nexport type ConditionalAssetValueReturn<T extends boolean> = T extends true ? Promise<AssetValue[]> : AssetValue[];\n\nexport const CommonAssetStrings = [\n `${Chain.Maya}.MAYA`,\n `${Chain.Maya}.CACAO`,\n `${Chain.Ethereum}.THOR`,\n `${Chain.Ethereum}.vTHOR`,\n `${Chain.Kujira}.USK`,\n `${Chain.Ethereum}.FLIP`,\n `${Chain.Radix}.XRD`,\n] as const;\n\ntype RadixResourceResponse = {\n at_ledger_state?: any;\n manager: {\n resource_type: string;\n divisibility: { substate_type: string; is_locked: boolean; value: { divisibility: number } };\n };\n owner_role?: any;\n};\nconst ethGasChains = [Chain.Arbitrum, Chain.Aurora, Chain.Base, Chain.Ethereum, Chain.Optimism] as const;\n\nasync function getRadixAssetDecimals(address: string) {\n const { baseDecimal } = getChainConfig(Chain.Radix);\n\n try {\n const rpcUrl = await getRPCUrl(Chain.Radix);\n\n const { manager } = await RequestClient.post<RadixResourceResponse>(`${rpcUrl}/state/resource`, {\n body: JSON.stringify({ network: \"mainnet\", resource_address: address }),\n headers: { Accept: \"*/*\", \"Content-Type\": \"application/json\" },\n });\n\n return manager?.divisibility?.value?.divisibility;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to fetch Radix asset decimals for ${address}: ${errorMessage}`);\n return baseDecimal;\n }\n}\n\nasync function getRadixAssetTicker(address: string) {\n try {\n const rpcUrl = await getRPCUrl(Chain.Radix);\n\n const response = await RequestClient.post<{\n items: Array<{\n address: string;\n explicit_metadata?: { items: Array<{ key: string; value: { typed: { value: string; type: string } } }> };\n }>;\n }>(`${rpcUrl}/state/entity/details`, {\n body: JSON.stringify({ addresses: [address], opt_ins: { explicit_metadata: [\"symbol\"] } }),\n headers: { Accept: \"*/*\", \"Content-Type\": \"application/json\" },\n });\n\n const symbolMetadata = response.items[0]?.explicit_metadata?.items.find((item) => item.key === \"symbol\");\n return symbolMetadata?.value.typed.value || undefined;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to fetch Radix asset symbol for ${address}: ${errorMessage}`);\n return \"\";\n }\n}\n\nasync function callEVMContract({\n chain,\n address,\n methodHex,\n id,\n}: {\n chain: EVMChain;\n address: string;\n methodHex: string;\n id: number;\n}) {\n const rpcUrl = await getRPCUrl(chain);\n return RequestClient.post<{ result: string }>(rpcUrl, {\n body: JSON.stringify({\n id,\n jsonrpc: \"2.0\",\n method: \"eth_call\",\n params: [{ data: methodHex, to: address.toLowerCase() }, \"latest\"],\n }),\n headers: { accept: \"*/*\", \"cache-control\": \"no-cache\", \"content-type\": \"application/json\" },\n });\n}\n\nasync function decodeABIString(hexResult: string) {\n if (!hexResult || hexResult === \"0x\") return \"UNKNOWN\";\n\n try {\n const { AbiCoder } = await import(\"ethers\");\n const abiCoder = AbiCoder.defaultAbiCoder();\n const decoded = abiCoder.decode([\"string\"], hexResult);\n return decoded[0].trim();\n } catch (error) {\n console.warn(`Failed to decode ABI string from ${hexResult}: ${error}`);\n return \"UNKNOWN\";\n }\n}\n\nfunction decodeABIUint8(hexResult: string, fallback: number) {\n if (!hexResult || hexResult === \"0x\") return fallback;\n\n try {\n return Number(hexResult);\n } catch (error) {\n console.warn(`Failed to decode ABI uint8 from ${hexResult}: ${error}`);\n return fallback;\n }\n}\n\nasync function getEVMAssetDecimals({ chain, address }: { chain: EVMChain; address: string }) {\n const { baseDecimal } = getChainConfig(chain);\n\n const formattedAddress = address.toLowerCase();\n\n if (address === \"\" || !formattedAddress.startsWith(\"0x\")) return baseDecimal;\n\n const decimalResponse = await callEVMContract({ address, chain, id: 2, methodHex: \"0x313ce567\" }).catch(\n (error: Error) => {\n console.warn(`Could not fetch decimals for ${address} on ${chain}: ${error.message}`);\n return { result: \"\" };\n },\n );\n\n const decimals = decodeABIUint8(decimalResponse.result, baseDecimal);\n return decimals;\n}\n\nasync function getEVMAssetTicker({ chain, address }: { chain: EVMChain; address: string }) {\n const formattedAddress = address.toLowerCase();\n\n if (formattedAddress === \"\" || !formattedAddress.startsWith(\"0x\")) return undefined;\n\n const tickerResponse = await callEVMContract({ address, chain, id: 1, methodHex: \"0x95d89b41\" }).catch(\n (error: Error) => {\n console.warn(`Could not fetch symbol for ${address} on ${chain}: ${error.message}`);\n return { result: \"\" };\n },\n );\n\n const ticker = await decodeABIString(tickerResponse.result);\n\n return ticker;\n}\n\nexport function fetchTokenInfo({ chain, address }: { chain: Chain; address: string }) {\n const { baseDecimal } = getChainConfig(chain);\n const defaultResult = { decimals: baseDecimal, ticker: undefined };\n\n return match(chain)\n .with(...EVMChains, async () => {\n try {\n const { isAddress, getAddress } = await import(\"ethers\");\n\n if (!isAddress(getAddress(address.replace(/^0X/, \"0x\")))) return defaultResult;\n\n const [ticker, decimals] = await Promise.all([\n getEVMAssetTicker({ address, chain: chain as EVMChain }),\n getEVMAssetDecimals({ address, chain: chain as EVMChain }),\n ]);\n\n return { decimals, ticker };\n } catch (error: any) {\n console.warn(`Failed to fetch token info for ${address} on ${chain}: ${error?.code} ${error?.message}`);\n return defaultResult;\n }\n })\n .with(Chain.Solana, async () => {\n if (!address) return defaultResult;\n\n try {\n const response = await fetch(`https://lite-api.jup.ag/tokens/v2/search?query=${address}`);\n if (response.ok) {\n const data = await response.json();\n const token = Array.isArray(data) ? data[0] : data;\n if (token) {\n return { decimals: token.decimals ?? baseDecimal, ticker: token.symbol || undefined };\n }\n }\n } catch (error: any) {\n console.warn(`Failed to fetch Solana token info for ${address}: ${error?.code} ${error?.message}`);\n }\n return defaultResult;\n })\n .with(Chain.Tron, async () => {\n if (!address) return defaultResult;\n\n try {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n const rpcUrl = await getRPCUrl(Chain.Tron);\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n // Set a default address for read-only calls (required by TronWeb)\n privateKey: \"0000000000000000000000000000000000000000000000000000000000000001\",\n });\n\n const contract = await tronWeb.contract().at(address);\n\n const [symbolResult, decimalsResult] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch((error: Error) => {\n console.warn(`Could not fetch symbol for ${address} on Tron:`, error);\n return undefined;\n }),\n contract\n .decimals()\n .call()\n .catch((error: Error) => {\n console.warn(`Could not fetch decimals for ${address} on Tron:`, error);\n return baseDecimal;\n }),\n ]);\n\n return {\n decimals: typeof decimalsResult === \"number\" ? decimalsResult : Number(decimalsResult || baseDecimal),\n ticker: symbolResult || undefined,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to fetch Tron token info for ${address}: ${errorMessage}`);\n return defaultResult;\n }\n })\n .with(Chain.Near, async () => {\n if (!address) return defaultResult;\n\n try {\n const { JsonRpcProvider } = await import(\"@near-js/providers\");\n const rpcUrl = await getRPCUrl(Chain.Near);\n const provider = new JsonRpcProvider({ url: rpcUrl });\n\n const metadata = await provider.query({\n account_id: address,\n args_base64: Buffer.from(\"{}\").toString(\"base64\"),\n finality: \"final\",\n method_name: \"ft_metadata\",\n request_type: \"call_function\",\n });\n\n const result = JSON.parse(Buffer.from((metadata as any).result).toString());\n\n return { decimals: result?.decimals || baseDecimal, ticker: result?.symbol };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to fetch Near token info for ${address}: ${errorMessage}`);\n return defaultResult;\n }\n })\n .with(Chain.Radix, async () => {\n if (!address) return defaultResult;\n\n try {\n const [ticker, decimals] = await Promise.all([getRadixAssetTicker(address), getRadixAssetDecimals(address)]);\n\n return { decimals, ticker };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to fetch Radix token info for ${address}: ${errorMessage}`);\n return defaultResult;\n }\n })\n .otherwise(async () => defaultResult);\n}\n\nexport function isGasAsset({ chain, symbol }: { chain: Chain; symbol: string }) {\n return match(chain)\n .with(...ethGasChains, () => symbol === \"ETH\")\n .with(Chain.Avalanche, () => symbol === \"AVAX\")\n .with(Chain.Berachain, () => symbol === \"BERA\")\n .with(Chain.BinanceSmartChain, () => symbol === \"BNB\")\n .with(Chain.Gnosis, () => symbol === \"xDAI\" || symbol === \"XDAI\")\n .with(Chain.Monad, () => symbol === \"MON\")\n .with(Chain.XLayer, () => symbol === \"OKB\")\n .with(Chain.Maya, () => symbol === \"CACAO\")\n .with(Chain.Cosmos, () => symbol === \"ATOM\")\n .with(Chain.THORChain, () => symbol === \"RUNE\")\n .with(Chain.Tron, () => symbol === \"TRX\")\n .with(Chain.Radix, () => `${chain}.${symbol}` === getCommonAssetInfo(chain).identifier)\n .otherwise(() => symbol === chain);\n}\n\nexport const getCommonAssetInfo = (assetString: CommonAssetString) => {\n const { baseDecimal: decimal } = getChainConfig(assetString as Chain);\n\n const commonAssetInfo = match(assetString.toUpperCase())\n .with(...ethGasChains, (asset) => ({ decimal, identifier: `${asset}.ETH` }))\n .with(Chain.THORChain, (asset) => ({ decimal, identifier: `${asset}.RUNE` }))\n .with(Chain.Cosmos, (asset) => ({ decimal, identifier: `${asset}.ATOM` }))\n .with(Chain.Maya, (asset) => ({ decimal: 10, identifier: `${asset}.CACAO` }))\n .with(Chain.BinanceSmartChain, (asset) => ({ decimal, identifier: `${asset}.BNB` }))\n .with(Chain.Monad, (asset) => ({ decimal, identifier: `${asset}.MON` }))\n .with(Chain.Avalanche, (asset) => ({ decimal, identifier: `${asset}.AVAX` }))\n .with(Chain.Gnosis, (asset) => ({ decimal, identifier: `${asset}.xDAI` }))\n .with(Chain.XLayer, (asset) => ({ decimal, identifier: `${asset}.OKB` }))\n .with(Chain.Berachain, (asset) => ({ decimal, identifier: `${asset}.BERA` }))\n .with(Chain.Tron, (asset) => ({ decimal, identifier: `${asset}.TRX` }))\n .with(\n Chain.Solana,\n Chain.Chainflip,\n Chain.Kujira,\n Chain.Ripple,\n Chain.Polkadot,\n Chain.Near,\n ...UTXOChains,\n (asset) => ({ decimal, identifier: `${asset}.${asset}` }),\n )\n .with(Chain.Radix, \"XRD.XRD\", () => ({ decimal, identifier: \"XRD.XRD\" }))\n .with(Chain.Polygon, \"POL.POL\", () => ({ decimal, identifier: \"POL.POL\" }))\n .with(\"KUJI.USK\", (asset) => ({ decimal: 6, identifier: asset }))\n .with(\"ETH.FLIP\", () => ({\n decimal: getChainConfig(Chain.Ethereum).baseDecimal,\n identifier: \"ETH.FLIP-0x826180541412D574cf1336d22c0C0a287822678A\",\n }))\n .with(\"ETH.THOR\", () => ({\n decimal: getChainConfig(Chain.Ethereum).baseDecimal,\n identifier: \"ETH.THOR-0xa5f2211b9b8170f694421f2046281775e8468044\",\n }))\n .with(\"ETH.vTHOR\", () => ({\n decimal: getChainConfig(Chain.Ethereum).baseDecimal,\n identifier: \"ETH.vTHOR-0x815c23eca83261b6ec689b60cc4a58b54bc24d8d\",\n }))\n .with(\"MAYA.CACAO\", (identifier) => ({ decimal: 10, identifier }))\n .with(\"MAYA.MAYA\", (identifier) => ({ decimal: 4, identifier }))\n // Just to be sure that we are not missing any chain\n .otherwise(() => ({ decimal, identifier: assetString }));\n\n return commonAssetInfo;\n};\n\nexport function getAssetType({ chain, symbol }: { chain: Chain; symbol: string }) {\n if (symbol.includes(\"/\")) return \"Synth\";\n if (symbol.includes(\"~\")) return \"Trade\";\n\n const isNative = match(chain)\n .with(Chain.Radix, () => symbol === Chain.Radix || `${chain}.${symbol}` === getCommonAssetInfo(chain).identifier)\n .with(Chain.Arbitrum, Chain.Optimism, Chain.Base, Chain.Aurora, () => symbol === Chain.Ethereum)\n .with(Chain.Cosmos, () => symbol === \"ATOM\")\n .with(Chain.BinanceSmartChain, () => symbol === \"BNB\")\n .with(Chain.Maya, () => symbol === \"CACAO\")\n .with(Chain.Monad, () => symbol === \"MON\")\n .with(Chain.THORChain, () => symbol === \"RUNE\")\n .with(Chain.Tron, () => symbol === \"TRX\")\n .with(Chain.XLayer, () => symbol === \"OKB\")\n .otherwise(() => symbol === chain);\n\n return isNative ? \"Native\" : chain;\n}\n\nexport const assetFromString = (assetString: string) => {\n const [chain, ...symbolArray] = assetString.split(\".\") as [Chain, ...(string | undefined)[]];\n const synth = assetString.includes(\"/\");\n const symbol = symbolArray.join(\".\");\n const splitSymbol = symbol?.split(\"-\");\n const ticker = splitSymbol?.length\n ? splitSymbol.length === 1\n ? splitSymbol[0]\n : splitSymbol.slice(0, -1).join(\"-\")\n : undefined;\n\n return { chain, symbol, synth, ticker };\n};\n\nexport async function findAssetBy(params: { chain: Chain; contract: string } | { identifier: `${Chain}.${string}` }) {\n const { loadTokenLists } = await import(\"../tokens\");\n const tokenLists = await loadTokenLists();\n\n for (const tokenList of Object.values(tokenLists)) {\n for (const { identifier, chain: tokenChain, ...rest } of tokenList.tokens) {\n if (\"identifier\" in params && identifier === params.identifier) {\n return identifier as TokenNames;\n }\n\n if (\n \"address\" in rest &&\n \"chain\" in params &&\n tokenChain === params.chain &&\n rest.address &&\n rest.address.toLowerCase() === params.contract.toLowerCase()\n )\n return identifier as TokenNames;\n }\n }\n\n return;\n}\n",
|
|
8
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AllChains,\n type Chain,\n getChainConfig,\n StagenetChain,\n StagenetMAYAConfig,\n StagenetTHORConfig,\n} from \"@tcswap/types\";\nimport { create } from \"zustand\";\nimport { useShallow } from \"zustand/shallow\";\nimport type { BalanceResponse, QuoteRequest, QuoteResponse, QuoteResponseRoute } from \"../api\";\nimport { WalletOption } from \"../types\";\nimport type { FeeMultiplierConfig } from \"./feeMultiplier\";\n\nexport type USwapConfigIntegrations = {\n chainflip?: { useSDKBroker?: boolean; brokerUrl: string };\n coinbase?: {\n appName: string;\n appLogoUrl?: string | null;\n darkMode?: boolean;\n linkAPIUrl?: string;\n overrideIsMetaMask?: boolean;\n overrideIsCoinbaseWallet?: boolean;\n overrideIsCoinbaseBrowser?: boolean;\n headlessMode?: boolean;\n reloadOnDisconnect?: boolean;\n };\n nearWalletSelector?: { contractId?: string };\n trezor?: { email: string; appUrl: string };\n keepKey?: { name: string; imageUrl: string; basePath: string; url: string };\n radix: {\n dAppDefinitionAddress: string;\n applicationName: string;\n applicationVersion: string;\n network: { networkId: number; networkName: string; dashboardBase: string };\n };\n};\n\nexport type CustomApiEndpoints = {\n getBalance: ({ chain, address }: { chain: Chain; address: string }) => Promise<BalanceResponse>;\n getQuote: (json: QuoteRequest) => Promise<QuoteResponse>;\n getRouteWithTx: (json: { routeId: string }) => Promise<QuoteResponseRoute>;\n};\n\nconst rpcUrls = AllChains.reduce(\n (acc, chain) => {\n if (!acc.THOR_STAGENET) {\n acc[StagenetChain.Maya] = StagenetMAYAConfig.rpcUrls;\n acc[StagenetChain.THORChain] = StagenetTHORConfig.rpcUrls;\n }\n\n acc[chain] = getChainConfig(chain).rpcUrls;\n return acc;\n },\n {} as { [key in Chain | StagenetChain]: string[] },\n);\n\nconst initialState = {\n apiKeys: {\n blockchair: \"\",\n keepKey: \"\",\n memoless: \"\",\n passkeys: \"\",\n uSwap: \"\",\n walletConnectProjectId: \"\",\n xaman: \"\",\n },\n chains: AllChains,\n endpoints: {} as CustomApiEndpoints,\n envs: {\n apiUrl: \"https://swap-api.unstoppable.money\",\n devApiUrl: \"https://swap-api-dev.unstoppable.money\",\n experimental_apiKey: null as string | null,\n experimental_apiUrlQuote: null as string | null,\n experimental_apiUrlSwap: null as string | null,\n isDev: false,\n isStagenet: false,\n memolessApiUrl: \"https://swap.unstoppable.money/memoless/api/v1\",\n },\n feeMultipliers: undefined as FeeMultiplierConfig | undefined,\n integrations: {\n radix: {\n applicationName: \"USwap Playground\",\n applicationVersion: \"0.0.1\",\n dAppDefinitionAddress: \"account_rdx128r289p58222hcvev7frs6kue76pl7pdcnw8725aw658v0zggkh9ws\",\n network: { dashboardBase: \"https://dashboard.radixdlt.com\", networkId: 1, networkName: \"mainnet\" },\n },\n } as USwapConfigIntegrations,\n\n requestOptions: { retry: { backoffMultiplier: 2, baseDelay: 300, maxDelay: 5000, maxRetries: 3 }, timeoutMs: 30000 },\n rpcUrls,\n wallets: Object.values(WalletOption),\n};\ntype USwapState = typeof initialState;\n\nexport type USwapConfigState = {\n apiKeys?: Partial<USwapState[\"apiKeys\"]>;\n chains?: USwapState[\"chains\"];\n endpoints?: Partial<CustomApiEndpoints>;\n envs?: Partial<USwapState[\"envs\"]>;\n integrations?: Partial<USwapConfigIntegrations>;\n rpcUrls?: Partial<USwapState[\"rpcUrls\"]>;\n wallets?: USwapState[\"wallets\"];\n feeMultipliers?: FeeMultiplierConfig;\n};\n\ntype USwapConfigStore = USwapState & {\n setApiKey: (key: keyof USwapState[\"apiKeys\"], apiKey: string) => void;\n setConfig: (config: USwapConfigState) => void;\n setEnv: <T extends keyof USwapState[\"envs\"]>(key: T, value: USwapState[\"envs\"][T]) => void;\n setEndpoint: <T extends keyof CustomApiEndpoints>(key: T, endpoint: CustomApiEndpoints[T]) => void;\n setRpcUrl: (chain: keyof USwapState[\"rpcUrls\"], url: string[]) => void;\n setRequestOptions: (options: Partial<USwapState[\"requestOptions\"]>) => void;\n setIntegrationConfig: (\n integration: keyof USwapState[\"integrations\"],\n config: USwapConfigIntegrations[keyof USwapConfigIntegrations],\n ) => void;\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => void;\n};\n\nexport const useUSwapStore = create<USwapConfigStore>((set) => ({\n ...initialState,\n\n setApiKey: (key, apiKey) => set((s) => ({ apiKeys: { ...s.apiKeys, [key]: apiKey } })),\n setConfig: (config) =>\n set((s) => ({\n apiKeys: { ...s.apiKeys, ...config?.apiKeys },\n chains: s.chains.concat(config?.chains || []),\n endpoints: { ...s.endpoints, ...config?.endpoints },\n envs: { ...s.envs, ...config?.envs },\n feeMultipliers: config?.feeMultipliers || s.feeMultipliers,\n integrations: { ...s.integrations, ...config?.integrations },\n rpcUrls: { ...s.rpcUrls, ...config?.rpcUrls },\n wallets: s.wallets.concat(config?.wallets || []),\n })),\n setEndpoint: (key, endpoint) => set((s) => ({ endpoints: { ...s.endpoints, [key]: endpoint } })),\n setEnv: (key, value) => set((s) => ({ envs: { ...s.envs, [key]: value } })),\n setFeeMultipliers: (multipliers) => set(() => ({ feeMultipliers: multipliers })),\n setIntegrationConfig: (integration, config) =>\n set((s) => ({ integrations: { ...s.integrations, [integration]: config } })),\n setRequestOptions: (options) =>\n set((s) => ({\n requestOptions: {\n retry: { ...s.requestOptions.retry, ...options.retry },\n timeoutMs: options.timeoutMs || s.requestOptions.timeoutMs,\n },\n })),\n setRpcUrl: (chain, url) => set((s) => ({ rpcUrls: { ...s.rpcUrls, [chain]: url } })),\n}));\n\nexport const useUSwapConfig = () =>\n useUSwapStore(\n useShallow((state) => ({\n apiKeys: state?.apiKeys,\n chains: state?.chains,\n endpoints: state?.endpoints,\n envs: state?.envs,\n feeMultipliers: state?.feeMultipliers,\n integrations: state?.integrations,\n rpcUrls: state?.rpcUrls,\n wallets: state?.wallets,\n })),\n );\n\nexport const USwapConfig = {\n get: <T extends keyof USwapState>(key: T) => useUSwapStore.getState()[key],\n getState: useUSwapStore.getState,\n reinitialize: () => useUSwapStore.setState(initialState),\n set: <T extends USwapConfigState>(config: T) => useUSwapStore.getState().setConfig(config),\n\n setApiKey: <T extends keyof USwapState[\"apiKeys\"]>(key: T, apiKey: string) =>\n useUSwapStore.getState().setApiKey(key, apiKey),\n setEndpoint: <T extends keyof CustomApiEndpoints>(key: T, endpoint: CustomApiEndpoints[T]) =>\n useUSwapStore.getState().setEndpoint(key, endpoint),\n setEnv: <T extends keyof USwapState[\"envs\"]>(key: T, value: USwapState[\"envs\"][T]) =>\n useUSwapStore.getState().setEnv(key, value),\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => useUSwapStore.getState().setFeeMultipliers(multipliers),\n setIntegrationConfig: <T extends keyof USwapState[\"integrations\"]>(\n integration: T,\n config: USwapConfigIntegrations[T],\n ) => useUSwapStore.getState().setIntegrationConfig(integration, config),\n setRequestOptions: (options: USwapState[\"requestOptions\"]) => useUSwapStore.getState().setRequestOptions(options),\n setRpcUrl: <T extends keyof USwapState[\"rpcUrls\"]>(chain: T, urls: string[]) =>\n useUSwapStore.getState().setRpcUrl(chain, urls),\n};\n",
|
|
9
|
+
"import { AllChains, type Chain, getChainConfig } from \"@tcswap/types\";\n\nexport type DerivationPathArray = ReturnType<typeof getChainConfig>[\"networkDerivationPath\"];\n\nexport const NetworkDerivationPath = AllChains.reduce(\n (acc, chain) => {\n acc[chain] = getChainConfig(chain).networkDerivationPath;\n return acc;\n },\n {} as Record<Chain, DerivationPathArray>,\n);\n",
|
|
10
|
+
"export enum ErrorCode {\n unknownError = \"unknownError\",\n test_error = \"test_error\",\n providerDetailsError = \"providerDetailsError\",\n blockHeaderNotFound = \"blockHeaderNotFound\",\n blockHashNotFoundAtHeight = \"blockHashNotFoundAtHeight\",\n blockHashNotFoundAtHash = \"blockHashNotFoundAtHash\",\n txHashMissing = \"txHashMissing\",\n assetValueMissingInfo = \"assetValueMissingInfo\",\n invalidAsset = \"invalidAsset\",\n blockIsRequired = \"blockIsRequired\",\n currentBlockHeaderNotFound = \"currentBlockHeaderNotFound\",\n failedToRetrieveBalance = \"failedToRetrieveBalance\",\n failedToRetrieveBlock = \"failedToRetrieveBlock\",\n failedToRetrieveFees = \"failedToRetrieveFees\",\n notImplementedBCH = \"notImplementedBCH\",\n notImplementedDoge = \"notImplementedDoge\",\n noPoolsFound = \"noPoolsFound\",\n noVaultsFound = \"noVaultsFound\",\n noTxFound = \"noTxFound\",\n noInputCoinFound = \"noInputCoinFound\",\n noBlockDataFound = \"noBlockDataFound\",\n multipleCosmosMessages = \"multipleCosmosMessages\",\n heightOrHashNotProvided = \"heightOrHashNotProvided\",\n unknownDenom = \"unknownDenom\",\n invalidBlockHeight = \"invalidBlockHeight\",\n timestampExtrinsicNoArgumentsForBlock = \"timestampExtrinsicNoArgumentsForBlock\",\n timestampExtrinsicNoTimestampForBlock = \"timestampExtrinsicNoTimestampForBlock\",\n noTimestampExtrinsicForHash = \"noTimestampExtrinsicForHash\",\n timestampExtrinsicNoArgumentsForHash = \"timestampExtrinsicNoArgumentsForHash\",\n txMemoUndefined = \"txMemoUndefined\",\n txMemoIncorrect = \"txMemoIncorrect\",\n txTypeNotFound = \"txTypeNotFound\",\n txNoMessage = \"txNoMessage\",\n txNotFound = \"txNotFound\",\n txReceiptNotFound = \"txReceiptNotFound\",\n txParsingError = \"txParsingError\",\n txLogsParsingError = \"txLogsParsingError\",\n blockNotFound = \"blockNotFound\",\n balanceNotFound = \"balanceNotFound\",\n configError = \"configError\",\n synthSwapDisallowed = \"synthSwapDisallowed\",\n providerQuoteTimeout = \"providerQuoteTimeout\",\n noQuoteResponse = \"noQuoteResponse\",\n noPoolAssetsFound = \"noPoolAssetsFound\",\n noThorchainPools = \"noThorchainPools\",\n noMayachainPools = \"noMayachainPools\",\n noThorchainNetworkInfo = \"noThorchainNetworkInfo\",\n invalidAffiliateFee = \"invalidAffiliateFee\",\n invalidBuyAssetAddress = \"invalidBuyAssetAddress\",\n invalidSellAssetAddress = \"invalidSellAssetAddress\",\n invalidSourceAddress = \"invalidSourceAddress\",\n invalidDestinationAddress = \"invalidDestinationAddress\",\n sourceAddressIsSmartContract = \"sourceAddressIsSmartContract\",\n destinationAddressIsSmartContract = \"destinationAddressIsSmartContract\",\n invalidChainId = \"invalidChainId\",\n unsupportedChainId = \"unsupportedChainId\",\n unsupportedEVMChainId = \"unsupportedEVMChainId\",\n unsupportedMethod = \"unsupportedMethod\",\n unsupportedProvider = \"unsupportedProvider\",\n invalidParamsForMethod = \"invalidParamsForMethod\",\n unsupportedAdapter = \"unsupportedAdapter\",\n noWhitelistTokens = \"noWhitelistTokens\",\n failedFetchGasPrice = \"failedFetchGasPrice\",\n failedToCreateDepositChannel = \"failedToCreateDepositChannel\",\n noProviderDetailsFound = \"noProviderDetailsFound\",\n noTokenListsFound = \"noTokenListsFound\",\n tokenNotFound = \"tokenNotFound\",\n tokenPriceNotFound = \"tokenPriceNotFound\",\n tokenPriceFailedToUpdate = \"tokenPriceFailedToUpdate\",\n swapAmountTooSmall = \"swapAmountTooSmall\",\n legsArrayIsEmpty = \"legsArrayIsEmpty\",\n failedToFetchQuoteForLeg = \"failedToFetchQuoteForLeg\",\n noBlockHeaderFound = \"noBlockHeaderFound\",\n failedToSimulateSwap = \"failedToSimulateSwap\",\n addressScreeningFailed = \"addressScreeningFailed\",\n noLiquidtyProvidersFound = \"noLiquidtyProvidersFound\",\n insufficientLiquidity = \"insufficientLiquidity\",\n noInboundDataFound = \"noInbounDataFound\",\n noInboundAddressesFound = \"noInboundAddressesFound\",\n noInboundAddressFoundForChain = \"noInboundAddressFoundForChain\",\n noLastBlocksFound = \"noLastBlocksFound\",\n noVersionFound = \"noVersionFound\",\n noConstantsFound = \"noConstantsFound\",\n noMimirsFound = \"noMimirsFound\",\n noRoutesFound = \"noRoutesFound\",\n quoteNotFound = \"quoteNotFound\",\n ledgerSignFailed = \"ledgerSignFailed\",\n ledgerWrongPayload = \"ledgerWrongPayload\",\n ledgerFetchSwapFailed = \"ledgerFetchSwapFailed\",\n failedToFetchTx = \"failedToFetchTx\",\n failedBuildTransactionDetails = \"failedBuildTransactionDetails\",\n noLegsForRoute = \"noLegsForRoute\",\n noRouterAddressFound = \"noRouterAddressFound\",\n noAggregatorAddressFound = \"noAggregatorAddressFound\",\n noContractInstanceFound = \"noContractInstanceFound\",\n noContractAddressFound = \"noContractAddressFound\",\n invalidAffiliate = \"invalidAffiliate\",\n thornameAffiliate = \"thornameAffiliate\",\n providerNotfound = \"No provider found\",\n noRecordFound = \"No Record found\",\n slippageTooLow = \"Slippage too low\",\n tradingHalted = \"tradingHalted\",\n noWrappedGasAsset = \"noWrappedGasAsset\",\n aggregatorAddressNotFound = \"aggregatorAddressNotFound\",\n routerAddressNotFound = \"routerAddressNotFound\",\n dummyAddressNotFound = \"dummyAddressNotFound\",\n trackerError = \"trackerError\",\n thorchainPoolUnavailable = \"thorchainPoolUnavailable\",\n noOhlcvDataFound = \"noOhlcvDataFound\",\n noTradingPairs = \"noTradingPairs\",\n noLendingAvailability = \"noLendingAvailability\",\n lendingRepayTooSmall = \"lendingRepayTooSmall\",\n missingState = \"missingState\",\n ledgerSwapNotFound = \"ledgerSwapNotFound\",\n ledgerSwapNotReadyForTracking = \"ledgerSwapNotReadyForTracking\",\n errorEstimatingGas = \"errorEstimatingGas\",\n apiKeyInvalid = \"apiKeyInvalid\",\n apiKeyFailedToUpdate = \"apiKeyFailedToUpdate\",\n apiKeyExpired = \"apiKeyExpired\",\n unauthorized = \"unauthorized\",\n failedToCreateMemo = \"failedToCreateMemo\",\n radixIncorrectInstructions = \"radixIncorrectInstructions\",\n radixTxMissedParam = \"radixTxMissedParam\",\n radixTxMissedAccount = \"radixTxMissedAccount\",\n radixManifestParseError = \"radixManifestParseError\",\n radixManifestBuildError = \"radixManifestBuildError\",\n invalidAddressForChain = \"invalidAddressForChain\",\n riskyAddress = \"riskyAddress\",\n noRoutesToProcess = \"noRoutesToProcess\",\n sellAssetAmountTooSmall = \"sellAssetAmountTooSmall\",\n missingPrivateKey = \"missingPrivateKey\",\n noMemoPriceProtection = \"noMemoPriceProtection\",\n rateExpired = \"rateExpired\",\n amountTooSmall = \"amountTooSmall\",\n amountTooBig = \"amountTooBig\",\n amountOutOfRange = \"amountOutOfRange\",\n requestTimeOut = \"requestTimeOut\",\n networkError = \"networkError\",\n unknownApiError = \"unknownApiError\",\n invalidResponseFormat = \"invalidResponseFormat\",\n}\n\nexport enum WarningCodeEnum {\n highSlippage = \"highSlippage\",\n highPriceImpact = \"highPriceImpact\",\n}\n\nexport enum ProviderName {\n CAVIAR_V1 = \"CAVIAR_V1\",\n CAMELOT_V3 = \"CAMELOT_V3\",\n CHAINFLIP = \"CHAINFLIP\",\n CHAINFLIP_STREAMING = \"CHAINFLIP_STREAMING\",\n JUPITER = \"JUPITER\",\n MAYACHAIN = \"MAYACHAIN\",\n MAYACHAIN_STREAMING = \"MAYACHAIN_STREAMING\",\n OCISWAP_V1 = \"OCISWAP_V1\",\n ONEINCH = \"ONEINCH\",\n OPENOCEAN_V2 = \"OPENOCEAN_V2\",\n PANCAKESWAP = \"PANCAKESWAP\",\n PANGOLIN_V1 = \"PANGOLIN_V1\",\n SUSHISWAP_V2 = \"SUSHISWAP_V2\",\n THORCHAIN = \"THORCHAIN\",\n THORCHAIN_STREAMING = \"THORCHAIN_STREAMING\",\n TRADERJOE_V2 = \"TRADERJOE_V2\",\n UNISWAP_V2 = \"UNISWAP_V2\",\n UNISWAP_V3 = \"UNISWAP_V3\",\n NEAR = \"NEAR\",\n GARDEN = \"GARDEN\",\n OKX = \"OKX\",\n}\n\nexport enum FeeTypeEnum {\n LIQUIDITY = \"liquidity\",\n NETWORK = \"network\",\n INBOUND = \"inbound\",\n OUTBOUND = \"outbound\",\n AFFILIATE = \"affiliate\",\n TAX = \"tax\",\n PRIORITY = \"priority\",\n SERVICE = \"service\",\n}\n",
|
|
11
|
+
"import type { AssetValue } from \"../modules/assetValue\";\n\nexport type GenericSwapParams<T = unknown> = {\n buyAsset?: AssetValue;\n sellAsset?: AssetValue;\n recipient?: string;\n feeOptionKey?: FeeOption;\n route: T;\n};\n\nexport type SwapParams<PluginNames = string, R = unknown> = GenericSwapParams<R> & { pluginName?: PluginNames };\n\nexport enum FeeOption {\n Average = \"average\",\n Fast = \"fast\",\n Fastest = \"fastest\",\n}\n\nexport enum ApproveMode {\n Approve = \"approve\",\n CheckOnly = \"checkOnly\",\n}\n\nexport type ApproveReturnType<T extends ApproveMode> = T extends \"checkOnly\" ? Promise<boolean> : Promise<string>;\n\nexport enum MemoType {\n NAME_REGISTER = \"~\",\n BOND = \"BOND\",\n DEPOSIT = \"+\",\n LEAVE = \"LEAVE\",\n UNBOND = \"UNBOND\",\n WITHDRAW = \"-\",\n RUNEPOOL_DEPOSIT = \"POOL+\",\n RUNEPOOL_WITHDRAW = \"POOL-\",\n CLAIM_TCY = \"tcy\",\n STAKE_TCY = \"tcy+\",\n UNSTAKE_TCY = \"tcy-\",\n}\n",
|
|
12
|
+
"import type { Chain, getChainConfig } from \"@tcswap/types\";\nimport type { BrowserProvider, Eip1193Provider } from \"ethers\";\n\nimport type { AssetValue } from \"../modules/assetValue\";\nimport type { FeeOption } from \"./sdk\";\n\ndeclare global {\n interface WindowEventMap {\n \"eip6963:announceProvider\": CustomEvent;\n }\n}\n\nexport type EthereumWindowProvider = BrowserProvider & {\n __XDEFI?: boolean;\n isBraveWallet?: boolean;\n isCoinbaseWallet?: boolean;\n isMetaMask?: boolean;\n isOkxWallet?: boolean;\n isKeepKeyWallet?: boolean;\n isTrust?: boolean;\n isTalisman?: boolean;\n on: (event: string, callback?: () => void) => void;\n overrideIsMetaMask?: boolean;\n request: <T = unknown>(args: { method: string; params?: unknown[] }) => Promise<T>;\n selectedProvider?: EthereumWindowProvider;\n};\n\nexport type NetworkParams = {\n chainId: ReturnType<typeof getChainConfig>[\"chainIdHex\"];\n chainName: string;\n nativeCurrency: { name: string; symbol: string; decimals: number };\n rpcUrls: string[];\n blockExplorerUrls: string[];\n};\n\nexport enum WalletOption {\n BITGET = \"BITGET\",\n BRAVE = \"BRAVE\",\n COINBASE_MOBILE = \"COINBASE_MOBILE\",\n COINBASE_WEB = \"COINBASE_WEB\",\n COSMOSTATION = \"COSMOSTATION\",\n CTRL = \"CTRL\",\n EIP6963 = \"EIP6963\",\n /**\n * @deprecated Use PASSKEYS instead\n */\n EXODUS = \"EXODUS\",\n KEEPKEY = \"KEEPKEY\",\n KEEPKEY_BEX = \"KEEPKEY_BEX\",\n KEPLR = \"KEPLR\",\n KEYSTORE = \"KEYSTORE\",\n LEAP = \"LEAP\",\n LEDGER = \"LEDGER\",\n LEDGER_LIVE = \"LEDGER_LIVE\",\n METAMASK = \"METAMASK\",\n OKX = \"OKX\",\n OKX_MOBILE = \"OKX_MOBILE\",\n ONEKEY = \"ONEKEY\",\n PASSKEYS = \"PASSKEYS\",\n PHANTOM = \"PHANTOM\",\n POLKADOT_JS = \"POLKADOT_JS\",\n RADIX_WALLET = \"RADIX_WALLET\",\n TALISMAN = \"TALISMAN\",\n TREZOR = \"TREZOR\",\n TRONLINK = \"TRONLINK\",\n TRUSTWALLET_WEB = \"TRUSTWALLET_WEB\",\n VULTISIG = \"VULTISIG\",\n WALLETCONNECT = \"WALLETCONNECT\",\n WALLET_SELECTOR = \"WALLET_SELECTOR\",\n XAMAN = \"XAMAN\",\n}\n\nexport enum LedgerErrorCode {\n NoError = 0x9000,\n LockedDevice = 0x5515,\n TC_NotFound = 65535,\n}\n\n/**\n * @deprecated CryptoChain has been deprecated - use Chain instead\n */\nexport type CryptoChain = Chain;\n\nexport type ChainWallet<T extends Chain> = {\n chain: T;\n address: string;\n balance: AssetValue[];\n walletType: WalletOption | string;\n disconnect?: () => void;\n signMessage?: (message: string) => Promise<string>;\n};\n\nexport type EmptyWallet = { [key in Chain]?: unknown };\nexport type BaseWallet<T extends EmptyWallet | Record<string, unknown>> = {\n [key in Chain]: ChainWallet<key> & (T extends EmptyWallet ? T[key] : never);\n};\n\nexport type EIP6963ProviderInfo = { walletId: string; uuid: string; name: string; icon: string };\n\nexport type EIP6963ProviderDetail = { info: EIP6963ProviderInfo; provider: Eip1193Provider };\n\nexport type EIP6963Provider = { info: EIP6963ProviderInfo; provider: Eip1193Provider };\n\n// This type represents the structure of an event dispatched by a wallet to announce its presence based on EIP-6963.\nexport type EIP6963AnnounceProviderEvent = Event & { detail: EIP6963Provider };\n\nexport type ChainSigner<T, S> = {\n signTransaction: (params: T) => Promise<S> | S;\n getAddress: () => Promise<string> | string;\n sign?: (message: string) => Promise<string> | string;\n};\n\nexport type GenericTransferParams = {\n recipient: string;\n assetValue: AssetValue;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n};\n\nexport type GenericCreateTransactionParams = Omit<GenericTransferParams, \"feeOptionKey\" & \"feeRate\"> & {\n sender: string;\n feeRate: number;\n};\n",
|
|
13
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\n/** biome-ignore-all assist/source/useSortedKeys: its sorted by type */\nconst errorCodes = {\n /**\n * Core\n */\n core_estimated_max_spendable_chain_not_supported: 10001,\n core_extend_error: 10002,\n core_inbound_data_not_found: 10003,\n core_approve_asset_address_or_from_not_found: 10004,\n core_plugin_not_found: 10005,\n core_plugin_swap_not_found: 10006,\n core_approve_asset_target_invalid: 10007,\n core_explorer_unsupported_chain: 10008,\n core_verify_message_not_supported: 10009,\n core_chain_halted: 10010,\n /**\n * Core - Wallet\n */\n core_wallet_connection_not_found: 10101,\n core_wallet_ctrl_not_installed: 10102,\n core_wallet_evmwallet_not_installed: 10103,\n core_wallet_walletconnect_not_installed: 10104,\n core_wallet_keystore_not_installed: 10105,\n core_wallet_ledger_not_installed: 10106,\n core_wallet_trezor_not_installed: 10107,\n core_wallet_keplr_not_installed: 10108,\n core_wallet_okx_not_installed: 10109,\n core_wallet_keepkey_not_installed: 10110,\n core_wallet_talisman_not_installed: 10111,\n core_wallet_not_keypair_wallet: 10112,\n core_wallet_sign_message_not_supported: 10113,\n core_wallet_connection_failed: 10114,\n core_wallet_create_not_supported: 10115,\n /**\n * Core - Swap\n */\n core_swap_invalid_params: 10201,\n core_swap_route_not_complete: 10202,\n core_swap_asset_not_recognized: 10203,\n core_swap_contract_not_found: 10204,\n core_swap_route_transaction_not_found: 10205,\n core_swap_contract_not_supported: 10206,\n core_swap_transaction_error: 10207,\n core_swap_quote_mode_not_supported: 10208,\n /**\n * Core - Transaction\n */\n core_transaction_deposit_error: 10301,\n core_transaction_create_liquidity_base_error: 10302,\n core_transaction_create_liquidity_asset_error: 10303,\n core_transaction_create_liquidity_invalid_params: 10304,\n core_transaction_add_liquidity_invalid_params: 10305,\n core_transaction_add_liquidity_base_address: 10306,\n core_transaction_add_liquidity_base_error: 10307,\n core_transaction_add_liquidity_asset_error: 10308,\n core_transaction_withdraw_error: 10309,\n core_transaction_deposit_to_pool_error: 10310,\n core_transaction_deposit_insufficient_funds_error: 10311,\n core_transaction_deposit_gas_error: 10312,\n core_transaction_invalid_sender_address: 10313,\n core_transaction_deposit_server_error: 10314,\n core_transaction_user_rejected: 10315,\n core_transaction_failed: 10316,\n core_transaction_invalid_recipient_address: 10317,\n /**\n * Wallets - General\n */\n wallet_connection_rejected_by_user: 20001,\n wallet_missing_api_key: 20002,\n wallet_chain_not_supported: 20003,\n wallet_missing_params: 20004,\n wallet_provider_not_found: 20005,\n wallet_failed_to_add_or_switch_network: 20006,\n /**\n * Wallets - Ledger\n */\n wallet_ledger_connection_error: 20101,\n wallet_ledger_connection_claimed: 20102,\n wallet_ledger_get_address_error: 20103,\n wallet_ledger_device_not_found: 20104,\n wallet_ledger_device_locked: 20105,\n wallet_ledger_transport_error: 20106,\n wallet_ledger_public_key_error: 20107,\n wallet_ledger_derivation_path_error: 20108,\n wallet_ledger_signing_error: 20109,\n wallet_ledger_app_not_open: 20110,\n wallet_ledger_invalid_response: 20111,\n wallet_ledger_method_not_supported: 20112,\n wallet_ledger_invalid_params: 20113,\n wallet_ledger_invalid_signature: 20114,\n wallet_ledger_no_provider: 20115,\n wallet_ledger_pubkey_not_found: 20116,\n wallet_ledger_transport_not_defined: 20117,\n wallet_ledger_webusb_not_supported: 20118,\n wallet_ledger_chain_not_supported: 20119,\n wallet_ledger_invalid_asset: 20120,\n wallet_ledger_invalid_account: 20121,\n wallet_ledger_address_not_found: 20122,\n wallet_ledger_failed_to_get_address: 20123,\n wallet_ledger_webhid_not_supported: 20124,\n /**\n * Wallets - Phantom\n */\n wallet_phantom_not_found: 20201,\n /**\n * Wallets - Ctrl\n */\n wallet_ctrl_not_found: 20301,\n wallet_ctrl_send_transaction_no_address: 20302,\n wallet_ctrl_contract_address_not_provided: 20303,\n wallet_ctrl_asset_not_defined: 20304,\n /**\n * Wallets - WalletConnect\n */\n wallet_walletconnect_project_id_not_specified: 20401,\n wallet_walletconnect_connection_not_established: 20402,\n wallet_walletconnect_namespace_not_supported: 20403,\n wallet_walletconnect_chain_not_supported: 20404,\n wallet_walletconnect_invalid_method: 20405,\n wallet_walletconnect_method_not_supported: 20406,\n /**\n * Wallets - Trezor\n */\n wallet_trezor_failed_to_sign_transaction: 20501,\n wallet_trezor_derivation_path_not_supported: 20502,\n wallet_trezor_failed_to_get_address: 20503,\n wallet_trezor_transport_error: 20504,\n wallet_trezor_method_not_supported: 20505,\n /**\n * Wallets - Talisman\n */\n wallet_talisman_not_enabled: 20601,\n wallet_talisman_not_found: 20602,\n /**\n * Wallets - Polkadot\n */\n wallet_polkadot_not_found: 20701,\n /**\n * Wallets - Radix\n */\n wallet_radix_not_found: 20801,\n wallet_radix_transaction_failed: 20802,\n wallet_radix_invalid_manifest: 20803,\n wallet_radix_method_not_supported: 20804,\n wallet_radix_no_account: 20805,\n /**\n * Wallets - KeepKey\n */\n wallet_keepkey_not_found: 20901,\n wallet_keepkey_asset_not_defined: 20902,\n wallet_keepkey_contract_address_not_provided: 20903,\n wallet_keepkey_send_transaction_no_address: 20904,\n wallet_keepkey_derivation_path_error: 20905,\n wallet_keepkey_signing_error: 20906,\n wallet_keepkey_transport_error: 20907,\n wallet_keepkey_unsupported_chain: 20908,\n wallet_keepkey_invalid_response: 20909,\n wallet_keepkey_chain_not_supported: 20910,\n wallet_keepkey_signer_not_found: 20911,\n wallet_keepkey_no_accounts: 20912,\n wallet_keepkey_method_not_supported: 20913,\n wallet_keepkey_invalid_params: 20914,\n wallet_keepkey_config_not_found: 20915,\n wallet_keepkey_no_provider: 20916,\n wallet_keepkey_account_not_found: 20917,\n /**\n * Wallets - BitKeep/BitGet\n */\n wallet_bitkeep_not_found: 21001,\n wallet_bitkeep_failed_to_switch_network: 21002,\n wallet_bitkeep_no_accounts: 21003,\n /**\n * Wallets - Passkeys\n */\n wallet_passkeys_sign_transaction_error: 21101,\n wallet_passkeys_not_found: 21102,\n wallet_passkeys_no_address: 21103,\n wallet_passkeys_request_canceled: 21104,\n wallet_passkeys_signature_canceled: 21105,\n wallet_passkeys_failed_to_switch_network: 21106,\n wallet_passkeys_chain_not_supported: 21107,\n wallet_passkeys_instance_missing: 21108,\n /**\n * Wallets - OneKey\n */\n wallet_onekey_not_found: 21201,\n wallet_onekey_sign_transaction_error: 21202,\n /**\n * Wallets - OKX\n */\n wallet_okx_not_found: 21301,\n wallet_okx_chain_not_supported: 21302,\n wallet_okx_failed_to_switch_network: 21303,\n wallet_okx_no_accounts: 21304,\n /**\n * Wallets - Keplr\n */\n wallet_keplr_not_found: 21401,\n wallet_keplr_chain_not_supported: 21402,\n wallet_keplr_signer_not_found: 21403,\n wallet_keplr_no_accounts: 21404,\n /**\n * Wallets - Cosmostation\n */\n wallet_cosmostation_not_found: 21501,\n wallet_cosmostation_chain_not_supported: 21502,\n wallet_cosmostation_evm_provider_not_found: 21503,\n wallet_cosmostation_keplr_provider_not_found: 21504,\n wallet_cosmostation_no_accounts: 21505,\n wallet_cosmostation_no_evm_accounts: 21506,\n wallet_cosmostation_no_evm_address: 21507,\n wallet_cosmostation_signer_not_found: 21508,\n /**\n * Wallets - ###EMPTY### 21601\n */\n\n /**\n * Wallets - Coinbase\n */\n wallet_coinbase_not_found: 21701,\n wallet_coinbase_chain_not_supported: 21702,\n wallet_coinbase_method_not_supported: 21703,\n wallet_coinbase_no_accounts: 21704,\n /**\n * Wallets - EVM Extensions\n */\n wallet_evm_extensions_failed_to_switch_network: 21801,\n wallet_evm_extensions_no_provider: 21802,\n wallet_evm_extensions_not_found: 21803,\n /**\n * Wallets - Keystore\n */\n wallet_keystore_invalid_password: 21901,\n wallet_keystore_unsupported_version: 21902,\n /**\n * Wallets - Near Extensions\n */\n wallet_near_extensions_failed_to_switch_network: 22001,\n wallet_near_extensions_no_provider: 22002,\n wallet_near_extensions_not_found: 22003,\n wallet_near_method_not_supported: 22003,\n /**\n * Wallets - Vultisig\n */\n wallet_vultisig_not_found: 22101,\n wallet_vultisig_contract_address_not_provided: 22102,\n wallet_vultisig_asset_not_defined: 22103,\n wallet_vultisig_send_transaction_no_address: 22104,\n\n /**\n * Wallets - Xaman\n */\n wallet_xaman_not_configured: 23001,\n wallet_xaman_not_connected: 23002,\n wallet_xaman_auth_failed: 23003,\n wallet_xaman_connection_failed: 23004,\n wallet_xaman_transaction_failed: 23005,\n wallet_xaman_monitoring_failed: 23006,\n /**\n * Wallets - TronLink\n */\n wallet_tronlink_request_accounts_failed: 24001,\n wallet_tronlink_locked: 24002,\n\n /**\n * Chainflip\n */\n chainflip_channel_error: 30001,\n chainflip_unknown_asset: 30002,\n /**\n * Chainflip - Broker\n */\n chainflip_broker_invalid_params: 30101,\n chainflip_broker_recipient_error: 30102,\n chainflip_broker_register: 30103,\n chainflip_broker_tx_error: 30104,\n chainflip_broker_withdraw: 30105,\n chainflip_broker_fund_only_flip_supported: 30106,\n chainflip_broker_fund_invalid_address: 30107,\n /**\n * THORChain\n */\n thorchain_chain_halted: 40001,\n thorchain_trading_halted: 40002,\n thorchain_asset_is_not_tcy: 40003,\n /**\n * THORChain - Swap\n */\n thorchain_swapin_router_required: 40101,\n thorchain_swapin_vault_required: 40102,\n thorchain_swapin_memo_required: 40103,\n thorchain_swapin_token_required: 40104,\n thorchain_preferred_asset_payout_required: 40105,\n /**\n * Toolboxes - Cosmos\n */\n toolbox_cosmos_account_not_found: 50101,\n toolbox_cosmos_invalid_fee: 50102,\n toolbox_cosmos_invalid_params: 50103,\n toolbox_cosmos_no_signer: 50104,\n toolbox_cosmos_not_supported: 50105,\n toolbox_cosmos_signer_not_defined: 50106,\n toolbox_cosmos_validate_address_prefix_not_found: 50107,\n toolbox_cosmos_verify_signature_no_pubkey: 50108,\n /**\n * Toolboxes - EVM\n */\n toolbox_evm_error_estimating_gas_limit: 50201,\n toolbox_evm_error_sending_transaction: 50202,\n toolbox_evm_gas_estimation_error: 50203,\n toolbox_evm_invalid_gas_asset_address: 50204,\n toolbox_evm_invalid_params: 50205,\n toolbox_evm_invalid_transaction: 50206,\n toolbox_evm_no_abi_fragment: 50207,\n toolbox_evm_no_contract_address: 50208,\n toolbox_evm_no_fee_data: 50209,\n toolbox_evm_no_from_address: 50210,\n toolbox_evm_no_gas_price: 50211,\n toolbox_evm_no_signer_address: 50212,\n toolbox_evm_no_signer: 50213,\n toolbox_evm_no_to_address: 50214,\n toolbox_evm_not_supported: 50215,\n toolbox_evm_provider_not_eip1193_compatible: 50216,\n /**\n * Toolboxes - UTXO\n */\n toolbox_utxo_api_error: 50301,\n toolbox_utxo_broadcast_failed: 50302,\n toolbox_utxo_insufficient_balance: 50303,\n toolbox_utxo_invalid_address: 50304,\n toolbox_utxo_invalid_params: 50305,\n toolbox_utxo_invalid_transaction: 50306,\n toolbox_utxo_no_signer: 50307,\n toolbox_utxo_not_supported: 50308,\n /**\n * Toolboxes - Solana\n */\n toolbox_solana_no_signer: 50401,\n toolbox_solana_fee_estimation_failed: 50402,\n /**\n * Toolboxes - Substrate\n */\n toolbox_substrate_not_supported: 50501,\n toolbox_substrate_transfer_error: 50502,\n /**\n * Toolboxes - Radix\n */\n toolbox_radix_method_not_supported: 50601,\n /**\n * Toolboxes - Ripple\n */\n toolbox_ripple_get_balance_error: 50701,\n toolbox_ripple_rpc_not_configured: 50702,\n toolbox_ripple_signer_not_found: 50703,\n toolbox_ripple_asset_not_supported: 50704,\n toolbox_ripple_broadcast_error: 50705,\n /**\n * Toolboxes - Tron\n */\n toolbox_tron_no_signer: 50801,\n toolbox_tron_invalid_token_identifier: 50802,\n toolbox_tron_token_transfer_failed: 50803,\n toolbox_tron_transaction_creation_failed: 50804,\n toolbox_tron_fee_estimation_failed: 50805,\n toolbox_tron_trongrid_api_error: 50806,\n toolbox_tron_approve_failed: 50807,\n toolbox_tron_invalid_token_contract: 50808,\n toolbox_tron_allowance_check_failed: 50809,\n /**\n * Toolboxes - Near\n */\n toolbox_near_no_signer: 90601,\n toolbox_near_invalid_address: 90602,\n toolbox_near_invalid_amount: 90603,\n toolbox_near_transfer_failed: 90604,\n toolbox_near_access_key_error: 90605,\n toolbox_near_no_rpc_url: 90606,\n toolbox_near_empty_batch: 90607,\n toolbox_near_balance_failed: 90608,\n toolbox_near_invalid_name: 90609,\n toolbox_near_missing_contract_address: 90610,\n toolbox_near_no_account: 90611,\n toolbox_near_invalid_gas_params: 90612,\n toolbox_near_no_public_key_found: 90613,\n /**\n * Toolboxes - SUI\n */\n toolbox_sui_address_required: 90701,\n toolbox_sui_keypair_required: 90702,\n toolbox_sui_balance_error: 90703,\n toolbox_sui_transaction_creation_error: 90704,\n toolbox_sui_signing_error: 90705,\n toolbox_sui_broadcast_error: 90706,\n toolbox_sui_no_signer: 90707,\n toolbox_sui_no_sender: 90708,\n /**\n * Toolboxes - General\n */\n toolbox_not_supported: 59901,\n /**\n * NEAR Plugin\n */\n plugin_near_invalid_name: 41001,\n plugin_near_no_connection: 41002,\n plugin_near_name_unavailable: 41003,\n plugin_near_registration_failed: 41004,\n plugin_near_transfer_failed: 41005,\n /**\n * Garden Plugin\n */\n plugin_garden_missing_data: 42001,\n /**\n * SwapKit API\n */\n api_v2_invalid_response: 60001,\n api_v2_server_error: 60002,\n api_v2_invalid_method_key_hash: 60003,\n /**\n * Helpers\n */\n helpers_invalid_number_different_decimals: 70001,\n helpers_invalid_number_of_years: 70002,\n helpers_invalid_identifier: 70003,\n helpers_invalid_asset_url: 70004,\n helpers_invalid_asset_identifier: 70005,\n helpers_invalid_memo_type: 70006,\n helpers_failed_to_switch_network: 70007,\n helpers_not_found_provider: 70008,\n helpers_chain_not_supported: 70009,\n helpers_invalid_params: 70010,\n helpers_invalid_response: 70011,\n helpers_chain_no_public_or_set_rpc_url: 70012,\n /**\n * Anything else\n */\n not_implemented: 99999,\n} as const;\n\nexport type ErrorKeys = keyof typeof errorCodes;\n\nexport class USwapError extends Error {\n static ErrorCode = errorCodes;\n\n constructor(\n errorOrErrorKey: ErrorKeys | { errorKey: ErrorKeys; info?: Record<string, any> },\n sourceErrorOrInfo?: any,\n ) {\n const isErrorString = typeof errorOrErrorKey === \"string\";\n const errorKey = isErrorString ? errorOrErrorKey : errorOrErrorKey.errorKey;\n const info = isErrorString ? undefined : errorOrErrorKey.info;\n const message = `${errorKey}${info ? `: ${JSON.stringify(info)}` : \"\"}`;\n\n super(message);\n Object.setPrototypeOf(this, USwapError.prototype);\n\n this.name = \"USwapError\";\n this.cause = sourceErrorOrInfo;\n\n // Log errors for debugging - bundlers can strip this in production if needed\n if (sourceErrorOrInfo) {\n const errorMsg =\n sourceErrorOrInfo instanceof Error\n ? `${sourceErrorOrInfo.message}${sourceErrorOrInfo.cause ? ` (${sourceErrorOrInfo.cause})` : \"\"}`\n : JSON.stringify(sourceErrorOrInfo);\n console.error(`USwapError [${errorKey}]: ${errorMsg}`);\n } else if (info) {\n console.error(`USwapError [${errorKey}]: ${JSON.stringify(info)}`);\n }\n }\n}\n",
|
|
14
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { USwapConfig } from \"./uSwapConfig\";\nimport { USwapError } from \"./uSwapError\";\n\nexport type RetryConfig = { maxRetries?: number; baseDelay?: number; maxDelay?: number; backoffMultiplier?: number };\n\nexport type RequestOptions = RequestInit & {\n /**\n * @deprecated @V4 Use onSuccess instead - will be removed in next major\n */\n responseHandler?: (response: any) => any;\n json?: unknown;\n onError?: (error: any) => any;\n onSuccess?: (response: any) => any;\n searchParams?: Record<string, string>;\n dynamicHeader?: () => Record<string, string> | {};\n retry?: RetryConfig;\n timeoutMs?: number;\n abortController?: AbortController;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\nconst calculateDelay = (attempt: number, { baseDelay, backoffMultiplier, maxDelay }: any) =>\n Math.min(baseDelay * backoffMultiplier ** attempt, maxDelay);\n\nconst makeRequest = async (url: string, config: RequestInit) => {\n const response = await fetch(url, config);\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => null);\n const errorData = { status: response.status, statusText: response.statusText };\n const errorInfo = { ...errorData, ...(errorBody && { errorData: errorBody }) };\n throw new USwapError({ errorKey: \"helpers_invalid_response\", info: errorData }, errorInfo);\n }\n return response.json();\n};\n\nfunction fetchWithConfig(method: \"GET\" | \"POST\", extendOptions: RequestOptions = {}) {\n return async function methodFetchWithConfig<T>(url: string, options: RequestOptions = {}): Promise<T> {\n const {\n searchParams,\n json,\n body,\n headers,\n dynamicHeader,\n retry,\n timeoutMs,\n abortController,\n onError,\n onSuccess,\n responseHandler,\n ...fetchOptions\n } = { ...extendOptions, ...options };\n const requestOptions = USwapConfig.get(\"requestOptions\");\n\n const retryConfig = { ...requestOptions.retry, ...retry };\n const isJson = !!json || url.endsWith(\".json\");\n const requestUrl = buildUrl(url, searchParams);\n const requestHeaders = buildHeaders(isJson, { ...headers, ...dynamicHeader?.() });\n const requestBody = isJson ? JSON.stringify(json) : body;\n\n let lastError: any;\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n const controller = abortController || new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs || requestOptions.timeoutMs);\n\n try {\n const result = await makeRequest(requestUrl, {\n ...fetchOptions,\n body: requestBody,\n headers: requestHeaders,\n method,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return onSuccess?.(result) || responseHandler?.(result) || result;\n } catch (error) {\n clearTimeout(timeoutId);\n lastError = error;\n\n if (attempt >= retryConfig.maxRetries) {\n return onError ? onError(error) : Promise.reject(error);\n }\n\n await sleep(calculateDelay(attempt, retryConfig));\n }\n }\n\n return onError ? onError(lastError) : Promise.reject(lastError);\n };\n}\n\nfunction buildHeaders(isJson: boolean, headers?: HeadersInit) {\n return { ...headers, ...(isJson && { \"Content-Type\": \"application/json\" }) };\n}\n\nfunction buildUrl(url: string, searchParams?: Record<string, string>) {\n const urlInstance = new URL(url);\n if (searchParams) urlInstance.search = new URLSearchParams(searchParams).toString();\n return urlInstance.toString();\n}\n\nexport const RequestClient = {\n extend: (extendOptions: RequestOptions) => ({\n extend: (newOptions: RequestOptions) => RequestClient.extend({ ...extendOptions, ...newOptions }),\n get: fetchWithConfig(\"GET\", extendOptions),\n post: fetchWithConfig(\"POST\", extendOptions),\n }),\n get: fetchWithConfig(\"GET\"),\n post: fetchWithConfig(\"POST\"),\n};\n",
|
|
15
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { Chain, CosmosChains, EVMChains, type StagenetChain, StagenetChains, UTXOChains } from \"@tcswap/types\";\nimport { match } from \"ts-pattern\";\nimport { USwapConfig } from \"../modules/uSwapConfig\";\nimport { USwapError } from \"../modules/uSwapError\";\nimport { warnOnce } from \"./others\";\n\nfunction getRpcBody(chain: Chain | StagenetChain) {\n return match(chain)\n .with(...EVMChains, () => ({ id: 1, jsonrpc: \"2.0\", method: \"eth_blockNumber\", params: [] }))\n .with(...UTXOChains, () => ({ id: \"test\", jsonrpc: \"1.0\", method: \"getblockchaininfo\", params: [] }))\n .with(...CosmosChains, ...StagenetChains, () => ({ id: 1, jsonrpc: \"2.0\", method: \"status\", params: {} }))\n .with(Chain.Polkadot, Chain.Chainflip, () => ({ id: 1, jsonrpc: \"2.0\", method: \"system_health\", params: [] }))\n .with(Chain.Solana, () => ({ id: 1, jsonrpc: \"2.0\", method: \"getHealth\" }))\n .with(Chain.Sui, () => ({ id: 1, jsonrpc: \"2.0\", method: \"sui_getSystemState\", params: [] }))\n .with(Chain.Ton, () => ({ id: 1, jsonrpc: \"2.0\", method: \"getAddressInformation\", params: { address: \"\" } }))\n .with(Chain.Tron, Chain.Radix, () => \"\")\n .with(Chain.Near, () => ({ id: \"dontcare\", jsonrpc: \"2.0\", method: \"status\", params: [] }))\n .with(Chain.Ripple, () => ({ id: 1, jsonrpc: \"2.0\", method: \"ping\", params: [{}] }))\n .otherwise(() => {\n throw new USwapError(\"helpers_chain_not_supported\", { chain });\n });\n}\n\nfunction getChainStatusEndpoint(chain: Chain | StagenetChain) {\n return match(chain)\n .with(Chain.Radix, () => \"/status/network-configuration\")\n .with(Chain.Tron, () => \"/wallet/getnowblock\")\n .otherwise(() => \"\");\n}\n\nasync function testRPCConnection(chain: Chain | StagenetChain, url: string) {\n try {\n const endpoint = url.startsWith(\"wss\") ? url.replace(\"wss\", \"https\") : url;\n const response = await fetch(`${endpoint}${getChainStatusEndpoint(chain)}`, {\n body: JSON.stringify(getRpcBody(chain)),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n signal: AbortSignal.timeout(3000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n}\n\nconst rpcCache = new Map<Chain | StagenetChain, { timestamp: number; url: string }>();\nconst rpcCacheTTL = 1000 * 60 * 2; // 2 minutes\n\nexport async function getRPCUrl(chain: Chain | StagenetChain) {\n const { isStagenet } = USwapConfig.get(\"envs\");\n const [rpcUrl = \"\", ...fallbackUrls] = USwapConfig.get(\"rpcUrls\")[chain];\n\n if (!rpcUrl) {\n warnOnce({\n condition: true,\n id: \"helpers_chain_no_public_or_set_rpc_url\",\n warning: `No public or set RPC URL found for chain. Please ensure you configured rpcUrls for ${chain}.`,\n });\n throw new USwapError(\"helpers_chain_no_public_or_set_rpc_url\", { chain });\n }\n\n if (isStagenet) return rpcUrl;\n\n const cached = rpcCache.get(chain);\n if (cached && Date.now() - cached.timestamp < rpcCacheTTL) {\n return cached.url;\n }\n\n const primaryIsWorking = await testRPCConnection(chain, rpcUrl);\n\n if (!primaryIsWorking) {\n for (const fallbackUrl of fallbackUrls) {\n const fallbackIsWorking = await testRPCConnection(chain, fallbackUrl);\n\n if (fallbackIsWorking) {\n rpcCache.set(chain, { timestamp: Date.now(), url: fallbackUrl });\n return fallbackUrl;\n }\n }\n }\n\n rpcCache.set(chain, { timestamp: Date.now(), url: rpcUrl });\n return rpcUrl;\n}\n\n/**\n * @deprecated\n * RPC URLs are now managed dynamically via USwapConfig.\n * Please use static { rpcUrls, fallbackRpcUrls } USwap init config or dynamic USwapConfig.setRpcUrl/setFallbackRpcUrl to configure RPC endpoints.\n * This function is obsolete and will be removed in a future release.\n */\nexport function initializeRPCUrlsWithFallback(_chains: never) {\n warnOnce({\n condition: true,\n id: \"initializeRPCUrlsWithFallback\",\n warning:\n \"initializeRPCUrlsWithFallback is deprecated. Use static { rpcUrls, fallbackRpcUrls } USwap init config or dynamic USwapConfig.setRpcUrl/setFallbackRpcUrl to configure RPC endpoints.\",\n });\n}\n",
|
|
16
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { Chain } from \"@tcswap/types\";\nimport { type ErrorKeys, USwapError } from \"../modules/uSwapError\";\n\n// 10 rune for register, 1 rune per year\n// MINIMUM_REGISTRATION_FEE = 11\nexport function getTHORNameCost(numberOfYears: number) {\n if (numberOfYears < 0) throw new USwapError({ errorKey: \"helpers_invalid_number_of_years\", info: { numberOfYears } });\n return 10 + numberOfYears;\n}\n\n// 10 CACAO for register\n// 1.0512 CACAO per year\nexport function getMAYANameCost(numberOfYears: number) {\n if (numberOfYears < 0) throw new USwapError({ errorKey: \"helpers_invalid_number_of_years\", info: { numberOfYears } });\n // round to max 10 decimals\n return Math.round((10 + numberOfYears * 1.0512) * 1e10) / 1e10;\n}\n\nexport function wrapWithThrow<T>(fn: () => T, errorKey?: ErrorKeys) {\n try {\n return fn();\n } catch (error) {\n if (errorKey) {\n throw new USwapError(errorKey, error);\n }\n\n return;\n }\n}\n\nexport function getChainIdentifier<T extends Chain>(chain: T) {\n switch (chain) {\n case Chain.THORChain:\n return `${chain}.RUNE`;\n\n case Chain.Cosmos:\n return `${chain}.ATOM`;\n\n case Chain.BinanceSmartChain:\n return `${chain}`;\n\n default:\n return `${chain}.${chain}`;\n }\n}\n\nconst warnings = new Set();\nexport function warnOnce({ condition, id, warning }: { condition: boolean; id: string; warning: string }) {\n if (condition) {\n if (warnings.has(id)) {\n return;\n }\n\n if (process.env.NODE_ENV !== \"test\") {\n console.warn(warning);\n }\n\n warnings.add(id);\n }\n}\n",
|
|
17
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport type { Chain } from \"@tcswap/types\";\nimport { USwapConfig } from \"../modules/uSwapConfig\";\nimport { USwapError } from \"../modules/uSwapError\";\n\n// Backward compatibility\nconst supportedChains = [\"TERRA\", ...USwapConfig.get(\"chains\")];\n\nexport function validateIdentifier(identifier = \"\") {\n const uppercasedIdentifier = identifier.toUpperCase();\n\n const [chain] = uppercasedIdentifier.split(\".\") as [Chain, string];\n if (supportedChains.includes(chain)) return true;\n\n const [synthChain] = uppercasedIdentifier.split(\"/\") as [Chain, string];\n if (supportedChains.includes(synthChain)) return true;\n\n throw new USwapError({\n errorKey: \"helpers_invalid_identifier\",\n info: {\n identifier,\n message: `Invalid identifier: ${identifier}. Expected format: <Chain>.<Ticker> or <Chain>.<Ticker>-<ContractAddress>`,\n },\n });\n}\n\nexport function validateTNS(name: string) {\n if (name.length > 30) return false;\n\n const regex = /^[a-zA-Z0-9+_-]+$/g;\n\n return !!name.match(regex);\n}\n",
|
|
18
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { match } from \"ts-pattern\";\nimport type { USwapNumber } from \"./uSwapNumber\";\n\ntype NumberPrimitivesType = { bigint: bigint; number: number; string: string };\nexport type NumberPrimitives = bigint | number | string;\ntype InitialisationValueType = NumberPrimitives | BigIntArithmetics | USwapNumber;\n\ntype USwapBigIntParams = InitialisationValueType | { decimal?: number; value: number | string };\ntype AllowedNumberTypes = \"bigint\" | \"number\" | \"string\";\n\nconst DEFAULT_DECIMAL = 8;\nconst PRECISION_BUFFER = 10;\n\nexport function formatBigIntToSafeValue({\n value,\n bigIntDecimal = DEFAULT_DECIMAL,\n decimal = DEFAULT_DECIMAL,\n}: {\n value: bigint;\n bigIntDecimal?: number;\n decimal?: number;\n}) {\n if (decimal === 0) return value.toString();\n\n const isNegative = value < 0n;\n let valueString = value.toString().substring(isNegative ? 1 : 0);\n const padLength = decimal - (valueString.length - 1);\n\n if (padLength > 0) {\n valueString = \"0\".repeat(padLength) + valueString;\n }\n\n const decimalIndex = valueString.length - decimal;\n let decimalString = valueString.slice(-decimal);\n\n const roundDigit = Number.parseInt(decimalString[bigIntDecimal] || \"0\", 10);\n if (roundDigit >= 5) {\n const lastDigit = Number.parseInt(decimalString[bigIntDecimal - 1] || \"0\", 10);\n decimalString = `${decimalString.substring(0, bigIntDecimal - 1)}${lastDigit + 1}`;\n } else {\n decimalString = decimalString.substring(0, bigIntDecimal);\n }\n\n return `${isNegative ? \"-\" : \"\"}${valueString.slice(0, decimalIndex)}.${decimalString}`.replace(/\\.?0*$/, \"\");\n}\n\nexport class BigIntArithmetics {\n decimalMultiplier: bigint = 10n ** 8n;\n bigIntValue = 0n;\n decimal?: number;\n\n static fromBigInt(value: bigint, decimal?: number) {\n return new BigIntArithmetics({\n decimal,\n value: formatBigIntToSafeValue({ bigIntDecimal: decimal, decimal, value }),\n });\n }\n\n static shiftDecimals({ value, from, to }: { value: InstanceType<typeof USwapNumber>; from: number; to: number }) {\n return BigIntArithmetics.fromBigInt((value.getBaseValue(\"bigint\") * toMultiplier(to)) / toMultiplier(from), to);\n }\n\n constructor(params: USwapBigIntParams) {\n const value = getStringValue(params);\n const isComplex = typeof params === \"object\";\n this.decimal = isComplex ? params.decimal : undefined;\n\n this.decimalMultiplier =\n isComplex && \"decimalMultiplier\" in params\n ? params.decimalMultiplier\n : toMultiplier(Math.max(getFloatDecimals(toSafeValue(value)), this.decimal || 0));\n\n this.#setValue(value);\n }\n\n set(value: USwapBigIntParams): this {\n return new (this.constructor as any)({\n decimal: this.decimal,\n identifier: (this as any).toString?.({ includeSynthProtocol: true }),\n value,\n });\n }\n\n add(...args: InitialisationValueType[]) {\n return this.#arithmetics(\"add\", ...args);\n }\n\n sub(...args: InitialisationValueType[]) {\n return this.#arithmetics(\"sub\", ...args);\n }\n\n mul(...args: InitialisationValueType[]) {\n return this.#arithmetics(\"mul\", ...args);\n }\n\n div(...args: InitialisationValueType[]) {\n return this.#arithmetics(\"div\", ...args);\n }\n\n gt(value: InitialisationValueType) {\n return this.#comparison(\"gt\", value);\n }\n\n gte(value: InitialisationValueType) {\n return this.#comparison(\"gte\", value);\n }\n\n lt(value: InitialisationValueType) {\n return this.#comparison(\"lt\", value);\n }\n\n lte(value: InitialisationValueType) {\n return this.#comparison(\"lte\", value);\n }\n\n eqValue(value: InitialisationValueType) {\n return this.#comparison(\"eqValue\", value);\n }\n\n getValue<T extends AllowedNumberTypes>(type: T, decimal?: number): NumberPrimitivesType[T] {\n const currentDecimal = decimalFromMultiplier(this.decimalMultiplier);\n const requestedDecimal = decimal !== undefined ? decimal : this.decimal;\n\n let outputDecimal = requestedDecimal !== undefined ? requestedDecimal : currentDecimal;\n\n if (requestedDecimal !== undefined && requestedDecimal < currentDecimal) {\n const testValue = this.formatBigIntToSafeValue(this.bigIntValue, requestedDecimal);\n if (testValue === \"0\" && this.bigIntValue !== 0n) {\n outputDecimal = currentDecimal;\n }\n }\n\n const value = this.formatBigIntToSafeValue(this.bigIntValue, outputDecimal);\n\n return match(type as AllowedNumberTypes)\n .with(\"number\", () => Number(value) as NumberPrimitivesType[T])\n .with(\"string\", () => value as NumberPrimitivesType[T])\n .with(\"bigint\", () => {\n const scaledValue = (this.bigIntValue * 10n ** BigInt(this.decimal || 8n)) / this.decimalMultiplier;\n return scaledValue as NumberPrimitivesType[T];\n })\n .otherwise(() => value as NumberPrimitivesType[T]);\n }\n\n getBaseValue<T extends AllowedNumberTypes>(type: T, decimal?: number): NumberPrimitivesType[T] {\n const divisor = this.decimalMultiplier / toMultiplier(decimal || this.decimal || DEFAULT_DECIMAL);\n const baseValue = divideBigIntWithRounding(this.bigIntValue, divisor);\n\n return match(type as AllowedNumberTypes)\n .with(\"number\", () => Number(baseValue) as NumberPrimitivesType[T])\n .with(\"string\", () => baseValue.toString() as NumberPrimitivesType[T])\n .otherwise(() => baseValue as NumberPrimitivesType[T]);\n }\n\n getBigIntValue(value: InitialisationValueType, decimal?: number) {\n if (!decimal && typeof value === \"object\") return value.bigIntValue;\n\n const stringValue = getStringValue(value);\n const safeValue = toSafeValue(stringValue);\n\n if (safeValue === \"0\" || safeValue === \"undefined\") return 0n;\n return this.#toBigInt(safeValue, decimal);\n }\n\n toSignificant(significantDigits = 6) {\n const valueStr = this.getValue(\"string\");\n const [int = \"\", dec = \"\"] = valueStr.split(\".\");\n const hasInteger = Number.parseInt(int, 10) > 0;\n const totalLength = hasInteger ? int.length + dec.length : dec.length;\n\n if (totalLength <= significantDigits) return valueStr;\n if (int.length >= significantDigits) return int.slice(0, significantDigits).padEnd(int.length, \"0\");\n if (hasInteger) return `${int}.${dec.slice(0, significantDigits - int.length)}`;\n\n const trimmed = BigInt(dec).toString();\n const sliced = trimmed.slice(0, significantDigits);\n const leadingZeros = dec.length - trimmed.length;\n\n return `0.${sliced.padStart(leadingZeros + sliced.length, \"0\")}`;\n }\n\n toFixed(fixedDigits = 6) {\n const valueStr = this.getValue(\"string\");\n const isNegative = valueStr.startsWith(\"-\");\n const [int = \"0\", dec = \"\"] = (isNegative ? valueStr.slice(1) : valueStr).split(\".\");\n const valueRoundsToZero = int === \"0\" && Number.parseInt(dec.slice(0, fixedDigits), 10) === 0;\n const sign = isNegative && !valueRoundsToZero ? \"-\" : \"\";\n\n if (fixedDigits === 0) {\n if (int === \"0\" && !dec) return \"0\";\n const shouldRound = dec && Number.parseInt(dec[0] || \"0\", 10) >= 5;\n return shouldRound ? `${sign}${BigInt(int) + 1n}.0` : `${sign}${int}.0`;\n }\n\n if (!dec) return `${sign}${int}.${\"0\".repeat(fixedDigits)}`;\n\n const nextDigit = dec[fixedDigits];\n const shouldRound = nextDigit && Number.parseInt(nextDigit, 10) >= 5;\n\n if (!shouldRound) return `${sign}${int}.${dec.slice(0, fixedDigits).padEnd(fixedDigits, \"0\")}`;\n\n const decimalValue = BigInt(dec.slice(0, fixedDigits).padEnd(fixedDigits, \"0\")) + 1n;\n const multiplier = 10n ** BigInt(fixedDigits);\n\n if (decimalValue >= multiplier) return `${sign}${BigInt(int) + 1n}.${\"0\".repeat(fixedDigits)}`;\n\n return `${sign}${int}.${decimalValue.toString().padStart(fixedDigits, \"0\")}`;\n }\n\n toAbbreviation(digits = 2) {\n const valueStr = this.getValue(\"string\");\n const value = Number(valueStr);\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\", \"Q\", \"Qi\", \"S\"] as const;\n const tier = Math.floor(Math.log10(Math.abs(value)) / 3);\n\n if (tier === 0 || !abbreviations[tier]) return valueStr;\n\n return `${(value / 10 ** (tier * 3)).toFixed(digits)}${abbreviations[tier]}`;\n }\n\n toCurrency(\n currency = \"$\",\n {\n currencyPosition = \"start\",\n decimal = 2,\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n trimTrailingZeros = true,\n } = {},\n ) {\n const fixedValue = this.toFixed(decimal);\n const isCurrencyAtEnd = currencyPosition === \"end\";\n const [int = \"0\", dec = \"\"] = fixedValue.split(\".\");\n\n const formattedInt = int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n const hasDecimals = dec && Number.parseInt(dec, 10) > 0;\n const formattedValue = hasDecimals ? `${formattedInt}${decimalSeparator}${dec}` : formattedInt;\n\n // Prevent regex from taking too long for large values\n const canTrimTrailingZeros = formattedValue.length < 100 && trimTrailingZeros && hasDecimals;\n const value = canTrimTrailingZeros ? formattedValue.replace(/\\.?0*$/, \"\") : formattedValue;\n\n return isCurrencyAtEnd ? `${value}${currency}` : `${currency}${value}`;\n }\n\n formatBigIntToSafeValue(value: bigint, decimal?: number) {\n const bigIntDecimal = decimal || this.decimal || DEFAULT_DECIMAL;\n const decimalToUseForConversion = Math.max(bigIntDecimal, decimalFromMultiplier(this.decimalMultiplier));\n\n return formatBigIntToSafeValue({ bigIntDecimal, decimal: decimalToUseForConversion, value });\n }\n\n #arithmetics(method: \"add\" | \"sub\" | \"mul\" | \"div\", ...args: InitialisationValueType[]): this {\n const precisionDecimal = this.#retrievePrecisionDecimal(this, ...args);\n const currentDecimal = decimalFromMultiplier(this.decimalMultiplier);\n const targetDecimal = Math.max(precisionDecimal, currentDecimal);\n const internalDecimal = targetDecimal + PRECISION_BUFFER;\n const internalMultiplier = toMultiplier(internalDecimal);\n\n const result = args.reduce(\n (acc: bigint, arg) => {\n const value = this.getBigIntValue(arg, internalDecimal);\n\n return match(method)\n .with(\"add\", () => acc + value)\n .with(\"sub\", () => acc - value)\n .with(\"mul\", () => (acc * value) / internalMultiplier)\n .with(\"div\", () => {\n if (value === 0n) throw new RangeError(\"Division by zero\");\n return (acc * internalMultiplier) / value;\n })\n .otherwise(() => acc);\n },\n (this.bigIntValue * internalMultiplier) / this.decimalMultiplier,\n );\n\n const value = formatBigIntToSafeValue({ bigIntDecimal: internalDecimal, decimal: internalDecimal, value: result });\n\n // @ts-expect-error False positive\n return new this.constructor({\n decimal: this.decimal,\n decimalMultiplier: toMultiplier(internalDecimal),\n identifier: this.toString(),\n value,\n });\n }\n\n #comparison(method: \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"eqValue\", ...args: InitialisationValueType[]) {\n const decimal = this.#retrievePrecisionDecimal(this, ...args);\n const value = this.getBigIntValue(args[0] || \"0\", decimal);\n const compareToValue = this.getBigIntValue(this, decimal);\n\n return match(method)\n .with(\"gt\", () => compareToValue > value)\n .with(\"gte\", () => compareToValue >= value)\n .with(\"lt\", () => compareToValue < value)\n .with(\"lte\", () => compareToValue <= value)\n .with(\"eqValue\", () => compareToValue === value)\n .otherwise(() => false);\n }\n\n #setValue(value: InitialisationValueType) {\n const safeValue = toSafeValue(value) || \"0\";\n this.bigIntValue = this.#toBigInt(safeValue);\n }\n\n #retrievePrecisionDecimal(...args: InitialisationValueType[]) {\n const decimals = args\n .map((arg) => {\n const isObject = typeof arg === \"object\";\n const value = isObject\n ? arg.decimal || decimalFromMultiplier(arg.decimalMultiplier)\n : getFloatDecimals(toSafeValue(arg));\n\n return value;\n })\n .filter(Boolean) as number[];\n\n return Math.max(...decimals, DEFAULT_DECIMAL);\n }\n\n #toBigInt(value: string, decimal?: number) {\n const multiplier = decimal ? toMultiplier(decimal) : this.decimalMultiplier;\n const padDecimal = decimalFromMultiplier(multiplier);\n const [integerPart = \"\", decimalPart = \"\"] = value.split(\".\");\n\n return BigInt(`${integerPart}${decimalPart.padEnd(padDecimal, \"0\")}`);\n }\n}\n\nconst numberFormatter = Intl.NumberFormat(\"fullwide\", { maximumFractionDigits: 20, useGrouping: false });\n\nfunction toSafeValue(value: InitialisationValueType) {\n const parsedValue = typeof value === \"number\" ? numberFormatter.format(value) : getStringValue(value);\n const splitValue = `${parsedValue}`.replaceAll(\",\", \".\").split(\".\");\n\n return splitValue.length > 1 ? `${splitValue.slice(0, -1).join(\"\")}.${splitValue.at(-1)}` : splitValue[0] || \"0\";\n}\n\nfunction getFloatDecimals(value: string) {\n const decimals = value.split(\".\")[1]?.length || 0;\n return Math.max(decimals, DEFAULT_DECIMAL);\n}\n\nfunction getStringValue(param: USwapBigIntParams) {\n return typeof param === \"object\" ? (\"getValue\" in param ? param.getValue(\"string\") : param.value) : param;\n}\n\nfunction divideBigIntWithRounding(n: bigint, d: bigint) {\n if (d === 0n) throw new Error(\"Cannot divide by zero\");\n\n const half = d / 2n;\n return (n >= 0n && d >= 0n) || (n < 0n && d < 0n) ? (n + half) / d : (n - half) / d;\n}\n\nfunction toMultiplier(decimal: number) {\n return 10n ** BigInt(decimal);\n}\n\nfunction decimalFromMultiplier(multiplier: bigint) {\n return Math.log10(Number.parseFloat(multiplier.toString()));\n}\n",
|
|
19
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { FeeOption } from \"../types\";\nimport { USwapConfig } from \"./uSwapConfig\";\n\nexport interface FeeMultiplierConfig {\n [FeeOption.Average]: number;\n [FeeOption.Fast]: number;\n [FeeOption.Fastest]: number;\n}\n\nconst DEFAULT_FEE_MULTIPLIERS: FeeMultiplierConfig = {\n [FeeOption.Average]: 1.0,\n [FeeOption.Fast]: 1.5,\n [FeeOption.Fastest]: 2.0,\n};\n\n/**\n * Get fee multiplier for the given fee option.\n * Checks USwapConfig for custom multipliers first, then falls back to defaults.\n *\n * @param feeOption - The fee option (Average, Fast, Fastest)\n * @returns The fee multiplier as a number\n */\nexport function getFeeMultiplier(feeOption: FeeOption = FeeOption.Average): number {\n const customMultipliers = USwapConfig.get(\"feeMultipliers\");\n\n if (customMultipliers && customMultipliers[feeOption] !== undefined) {\n return customMultipliers[feeOption];\n }\n\n return DEFAULT_FEE_MULTIPLIERS[feeOption];\n}\n\n/**\n * Get fee multiplier as BigInt for EVM calculations.\n * Returns numerator and denominator for precise BigInt arithmetic.\n *\n * @param feeOption - The fee option (Average, Fast, Fastest)\n * @returns Object with numerator and denominator for BigInt calculations\n */\nexport function getFeeMultiplierAsBigInt(feeOption: FeeOption = FeeOption.Average): {\n numerator: bigint;\n denominator: bigint;\n} {\n const multiplier = getFeeMultiplier(feeOption);\n\n // Convert decimal multiplier to fraction for precise BigInt arithmetic\n // e.g., 1.5 -> 15/10, 2.0 -> 20/10\n const denominator = 10n;\n const numerator = BigInt(Math.round(multiplier * 10));\n\n return { denominator, numerator };\n}\n\n/**\n * Apply fee multiplier to a BigInt value (for EVM chains).\n *\n * @param value - The base fee value as BigInt\n * @param feeOption - The fee option (Average, Fast, Fastest)\n * @returns The multiplied fee value as BigInt\n */\nexport function applyFeeMultiplierToBigInt(value: bigint, feeOption: FeeOption = FeeOption.Average) {\n const { numerator, denominator } = getFeeMultiplierAsBigInt(feeOption);\n return (value * numerator) / denominator;\n}\n\n/**\n * Apply fee multiplier to a number value (for non-EVM chains).\n *\n * @param value - The base fee value as number\n * @param feeOption - The fee option (Average, Fast, Fastest)\n * @param floor - Whether to floor the result (default: false)\n * @returns The multiplied fee value as number\n */\nexport function applyFeeMultiplier(value: number, feeOption: FeeOption = FeeOption.Average, floor = false): number {\n const multiplier = getFeeMultiplier(feeOption);\n const result = value * multiplier;\n return floor ? Math.floor(result) : result;\n}\n\nexport { DEFAULT_FEE_MULTIPLIERS };\n",
|
|
20
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { BigIntArithmetics, formatBigIntToSafeValue } from \"./bigIntArithmetics\";\n\nexport type SwapKitValueType = BigIntArithmetics | string | number;\n\nexport class USwapNumber extends BigIntArithmetics {\n eq(value: SwapKitValueType) {\n return this.eqValue(value);\n }\n\n static fromBigInt(value: bigint, decimal?: number) {\n return new USwapNumber({ decimal, value: formatBigIntToSafeValue({ bigIntDecimal: decimal, decimal, value }) });\n }\n}\n",
|
|
21
|
+
"import { Chain, type EVMChain, EVMChains } from \"@tcswap/types\";\nimport { type DerivationPathArray, NetworkDerivationPath } from \"../types\";\n\ntype Params = {\n chain: Chain;\n index: number;\n addressIndex?: number;\n type?: \"legacy\" | \"ledgerLive\" | \"nativeSegwitMiddleAccount\" | \"segwit\" | \"account\";\n};\n\nexport function updateDerivationPath(\n path: DerivationPathArray,\n params: { index: number } | { account: number } | { change: number },\n) {\n if (\"index\" in params) {\n const newPath = [...path.slice(0, path.length - 1), params.index];\n return newPath as DerivationPathArray;\n }\n\n if (\"change\" in params) {\n const [network, chainId, account, , index] = path;\n return [network, chainId, account, params.change, index] as DerivationPathArray;\n }\n\n if (\"account\" in params) {\n const [network, chainId, , change, index] = path;\n return [network, chainId, params.account, change, index] as DerivationPathArray;\n }\n\n return path;\n}\n\nexport function derivationPathToString([network, chainId, account, change, index]:\n | [number, number, number, number?, number?]\n | [number, number, number, number, number?]\n | DerivationPathArray) {\n const shortPath = typeof index !== \"number\";\n const accountPath = typeof change !== \"number\";\n\n if (accountPath) {\n return `m/${network}'/${chainId}'/${account}'`;\n }\n\n return `m/${network}'/${chainId}'/${account}'/${change}${shortPath ? \"\" : `/${index}`}`;\n}\n\n// TODO @towan - sort this out and make it more readable\nexport function getDerivationPathFor({ chain, index, addressIndex = 0, type }: Params) {\n if (EVMChains.includes(chain as EVMChain)) {\n if (type && [\"legacy\", \"account\"].includes(type)) {\n return [44, 60, 0, index];\n }\n\n if (type === \"ledgerLive\") {\n return [44, 60, index, 0, addressIndex] as DerivationPathArray;\n }\n\n return updateDerivationPath(NetworkDerivationPath[chain], { index });\n }\n\n if (chain === Chain.Solana) {\n if (type === \"account\") return [44, 501, 0, index];\n return updateDerivationPath(NetworkDerivationPath[chain], { index });\n }\n\n const chainId = chain === Chain.Litecoin ? 2 : 0;\n\n switch (type) {\n case \"nativeSegwitMiddleAccount\":\n return [84, chainId, index, 0, addressIndex];\n case \"segwit\":\n return [49, chainId, 0, 0, index];\n case \"legacy\":\n return [44, chainId, 0, 0, index];\n default:\n return updateDerivationPath(NetworkDerivationPath[chain], { index });\n }\n}\n\nexport function getWalletFormatFor(path: string) {\n const [_, purpose, chainId] = path.split(\"/\").map((p) => Number.parseInt(p, 10));\n\n if (chainId === 145) \"cashaddr\";\n\n switch (purpose) {\n case 44:\n return \"legacy\";\n case 49:\n return \"p2sh\";\n default:\n return \"bech32\";\n }\n}\n\nexport const DerivationPath: Record<Chain, string> = Object.keys(NetworkDerivationPath).reduce(\n (acc, key) => {\n acc[key as Chain] = derivationPathToString(NetworkDerivationPath[key as Chain]);\n return acc;\n },\n {} as Record<Chain, string>,\n);\n",
|
|
22
|
+
"import { Chain, CosmosChains, EVMChains, getChainConfig, SubstrateChains, UTXOChains } from \"@tcswap/types\";\nimport { match } from \"ts-pattern\";\n\nexport function getExplorerTxUrl({ chain, txHash }: { txHash: string; chain: Chain }) {\n const { explorerUrl } = getChainConfig(chain);\n\n return match(chain)\n .with(\n ...CosmosChains,\n Chain.Solana,\n () => `${explorerUrl}/tx/${txHash.startsWith(\"0x\") ? txHash.slice(2) : txHash}`,\n )\n .with(\n ...EVMChains,\n ...SubstrateChains,\n () => `${explorerUrl}/tx/${txHash.startsWith(\"0x\") ? txHash : `0x${txHash}`}`,\n )\n .with(...UTXOChains, Chain.Radix, Chain.Tron, () => `${explorerUrl}/transaction/${txHash.toLowerCase()}`)\n .with(Chain.Near, () => `${explorerUrl}/txns/${txHash}`)\n .with(Chain.Ripple, () => `${explorerUrl}/transactions/${txHash}`)\n .with(Chain.Sui, () => `${explorerUrl}/txblock/${txHash}`)\n .with(Chain.Cardano, Chain.Ton, () => `${explorerUrl}/tx/${txHash}`)\n .otherwise(() => \"\");\n}\n\nexport function getExplorerAddressUrl({ chain, address }: { address: string; chain: Chain }) {\n const { explorerUrl } = getChainConfig(chain);\n\n return match(chain)\n .with(Chain.Solana, Chain.Sui, Chain.Radix, () => `${explorerUrl}/account/${address}`)\n .otherwise(() => `${explorerUrl}/address/${address}`);\n}\n",
|
|
23
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { Chain, getChainConfig } from \"@tcswap/types\";\nimport { USwapNumber } from \"../modules/uSwapNumber\";\n\ntype ShareParams<T extends {}> = T & { liquidityUnits: string; poolUnits: string };\n\ntype PoolParams = { runeAmount: string; assetAmount: string; runeDepth: string; assetDepth: string };\n\n/**\n * Ref: https://gitlab.com/thorchain/thornode/-/issues/657\n * share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3\n * s = stakeUnits for member (after factoring in withdrawBasisPoints)\n * T = totalPoolUnits for pool\n * A = assetDepth to be withdrawn\n *\n * Formula:\n * share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3\n * (part1 * (part2 - part3 + part4)) / part5\n */\nexport function getAsymmetricRuneShare({ liquidityUnits, poolUnits, runeDepth }: ShareParams<{ runeDepth: string }>) {\n const s = toTCUSwapNumber(liquidityUnits);\n const T = toTCUSwapNumber(poolUnits);\n const A = toTCUSwapNumber(runeDepth);\n\n const part1 = s.mul(A);\n const part2 = T.mul(T).mul(2);\n const part3 = T.mul(s).mul(2);\n const part4 = s.mul(s);\n const part5 = T.mul(T).mul(T);\n\n const numerator = part1.mul(part2.sub(part3).add(part4));\n\n return numerator.div(part5);\n}\n\nexport function getAsymmetricAssetShare({\n liquidityUnits,\n poolUnits,\n assetDepth,\n}: ShareParams<{ assetDepth: string }>) {\n const s = toTCUSwapNumber(liquidityUnits);\n const T = toTCUSwapNumber(poolUnits);\n const A = toTCUSwapNumber(assetDepth);\n\n const part1 = s.mul(A);\n const part2 = T.mul(T).mul(2);\n const part3 = T.mul(s).mul(2);\n const part4 = s.mul(s);\n const numerator = part1.mul(part2.sub(part3).add(part4));\n const part5 = T.mul(T).mul(T);\n\n return numerator.div(part5);\n}\n\nexport function getAsymmetricRuneWithdrawAmount({\n percent,\n runeDepth,\n liquidityUnits,\n poolUnits,\n}: ShareParams<{ percent: number; runeDepth: string }>) {\n return getAsymmetricRuneShare({ liquidityUnits, poolUnits, runeDepth }).mul(percent);\n}\n\nexport function getAsymmetricAssetWithdrawAmount({\n percent,\n assetDepth,\n liquidityUnits,\n poolUnits,\n}: ShareParams<{ percent: number; assetDepth: string }>) {\n return getAsymmetricAssetShare({ assetDepth, liquidityUnits, poolUnits }).mul(percent);\n}\n\nfunction toTCUSwapNumber(value: string) {\n return USwapNumber.fromBigInt(BigInt(value), getChainConfig(Chain.THORChain).baseDecimal);\n}\n\nexport function getSymmetricPoolShare({\n liquidityUnits,\n poolUnits,\n runeDepth,\n assetDepth,\n}: ShareParams<{ runeDepth: string; assetDepth: string }>) {\n return {\n assetAmount: toTCUSwapNumber(assetDepth).mul(liquidityUnits).div(poolUnits),\n runeAmount: toTCUSwapNumber(runeDepth).mul(liquidityUnits).div(poolUnits),\n };\n}\n\nexport function getSymmetricWithdraw({\n liquidityUnits,\n poolUnits,\n runeDepth,\n assetDepth,\n percent,\n}: ShareParams<{ runeDepth: string; assetDepth: string; percent: number }>) {\n return Object.fromEntries(\n Object.entries(getSymmetricPoolShare({ assetDepth, liquidityUnits, poolUnits, runeDepth })).map(([name, value]) => [\n name,\n value.mul(percent),\n ]),\n );\n}\n\nexport function getEstimatedPoolShare({\n runeDepth,\n poolUnits,\n assetDepth,\n liquidityUnits,\n runeAmount,\n assetAmount,\n}: ShareParams<{ runeAmount: string; assetAmount: string; runeDepth: string; assetDepth: string }>) {\n const R = new USwapNumber({ decimal: 8, value: runeDepth });\n const A = new USwapNumber({ decimal: 8, value: assetDepth });\n const P = new USwapNumber({ decimal: 8, value: poolUnits });\n const runeAddAmount = new USwapNumber({ decimal: 8, value: runeAmount });\n const assetAddAmount = new USwapNumber({ decimal: 8, value: assetAmount });\n\n // liquidityUnits = P * (r*A + a*R + 2*r*a) / (r*A + a*R + 2*R*A)\n const rA = runeAddAmount.mul(A);\n const aR = assetAddAmount.mul(R);\n const ra = runeAddAmount.mul(assetAddAmount);\n const RA = R.mul(A);\n const numerator = P.mul(rA.add(aR.add(ra.mul(2))));\n const denominator = rA.add(aR.add(RA.mul(2)));\n const liquidityUnitsAfterAdd = numerator.div(denominator);\n const estimatedLiquidityUnits = toTCUSwapNumber(liquidityUnits).add(liquidityUnitsAfterAdd);\n\n if (liquidityUnitsAfterAdd.getBaseValue(\"number\") === 0) {\n return estimatedLiquidityUnits.div(P).getBaseValue(\"number\");\n }\n\n // get pool units after add\n const newPoolUnits = P.add(estimatedLiquidityUnits);\n\n return estimatedLiquidityUnits.div(newPoolUnits).getBaseValue(\"number\");\n}\n\nexport function getLiquiditySlippage({ runeAmount, assetAmount, runeDepth, assetDepth }: PoolParams) {\n if (runeAmount === \"0\" || assetAmount === \"0\" || runeDepth === \"0\" || assetDepth === \"0\") return 0;\n // formula: (t * R - T * r)/ (T*r + R*T)\n const R = toTCUSwapNumber(runeDepth);\n const T = toTCUSwapNumber(assetDepth);\n const assetAddAmount = toTCUSwapNumber(assetAmount);\n const runeAddAmount = toTCUSwapNumber(runeAmount);\n\n const numerator = assetAddAmount.mul(R).sub(T.mul(runeAddAmount));\n const denominator = T.mul(runeAddAmount).add(R.mul(T));\n\n // set absolute value of percent, no negative allowed\n return Math.abs(numerator.div(denominator).getBaseValue(\"number\"));\n}\n",
|
|
24
|
+
"import { Chain } from \"@tcswap/types\";\nimport { match } from \"ts-pattern\";\nimport { MemoType } from \"../types/sdk\";\n\nexport function getMemoForLeaveAndBond({ type, address }: BondOrLeaveParams) {\n return `${type}:${address}`;\n}\n\nexport function getMemoForUnbond({ address, unbondAmount }: UnbondParams) {\n return `${MemoType.UNBOND}:${address}:${unbondAmount}`;\n}\n\n/**\n * Deposit\n */\nexport function getMemoForRunePoolDeposit(affiliate?: WithAffiliate<{}>) {\n return addAffiliate(MemoType.RUNEPOOL_DEPOSIT, affiliate);\n}\n\nexport function getMemoForDeposit({\n chain,\n symbol,\n address,\n ...affiliate\n}: WithAffiliate<{ chain: Chain; symbol: string; address?: string }>) {\n const poolIdentifier = getPoolIdentifier({ chain, symbol });\n const addressPart = address ? `:${address}:` : \":\";\n\n return addAffiliate(`${MemoType.DEPOSIT}:${poolIdentifier}${addressPart}`, affiliate);\n}\n\n/**\n * Withdraw\n */\nexport function getMemoForWithdraw({ chain, symbol, ticker, basisPoints, targetAsset }: WithdrawParams) {\n const shortenedSymbol = chain === \"ETH\" && ticker !== \"ETH\" ? `${ticker}-${symbol.slice(-3)}` : symbol;\n const targetPart = targetAsset ? `:${targetAsset}` : \"\";\n\n return `${MemoType.WITHDRAW}:${chain}.${shortenedSymbol}:${basisPoints}${targetPart}`;\n}\n\nexport function getMemoForRunePoolWithdraw({ basisPoints, ...affiliate }: WithAffiliate<{ basisPoints: number }>) {\n return addAffiliate(`${MemoType.RUNEPOOL_WITHDRAW}:${basisPoints}`, affiliate);\n}\n\n/**\n * TNS\n */\nexport function getMemoForNameRegister({ name, chain, address, owner }: NameRegisterParams) {\n const baseMemo = `${MemoType.NAME_REGISTER}:${name}:${chain}:${address}`;\n const ownerAssignmentOrChangePart = owner ? `:${owner}` : \"\";\n\n return `${baseMemo}${ownerAssignmentOrChangePart}`;\n}\n\nexport function getMemoForNamePreferredAssetRegister({\n name,\n chain,\n asset,\n payout,\n owner,\n}: PreferredAssetRegisterParams) {\n return `${MemoType.NAME_REGISTER}:${name}:${chain}:${payout}:${owner}:${asset}`;\n}\n\nexport function getMemoForTcyClaim(memoType: MemoType.CLAIM_TCY, { address }: WithAffiliate<{ address: string }>) {\n return `${memoType}:${address}`;\n}\n\nexport function getMemoForTcyStake(\n memoType: MemoType.STAKE_TCY | MemoType.UNSTAKE_TCY,\n { unstakeBps, ...affiliate }: WithAffiliate<{ unstakeBps?: number }>,\n) {\n const bps = unstakeBps ? `:${unstakeBps}` : \"\";\n const baseMemo = `${memoType}${bps}`;\n\n return addAffiliate(`${baseMemo}`, affiliate);\n}\n\n/**\n * Internal helpers\n */\nfunction addAffiliate(memo: string, { affiliateAddress, affiliateBasisPoints }: WithAffiliate<{}> = {}) {\n const affiliatedMemo = `${memo}${affiliateAddress ? `:${affiliateAddress}:${affiliateBasisPoints || 0}` : \"\"}`;\n\n return affiliatedMemo.endsWith(\":\") ? affiliatedMemo.slice(0, -1) : affiliatedMemo;\n}\n\nfunction getPoolIdentifier({ chain, symbol }: { chain: Chain; symbol: string }) {\n return match(chain)\n .with(Chain.Bitcoin, Chain.Dogecoin, Chain.Litecoin, () => chain.slice(0, 1).toLowerCase())\n .with(Chain.BitcoinCash, () => \"c\")\n .otherwise(() => `${chain}.${symbol}`);\n}\n\ntype WithAffiliate<T extends {}> = T & { affiliateAddress?: string; affiliateBasisPoints?: number };\n\ntype BondOrLeaveParams = { type: MemoType.BOND | MemoType.LEAVE; address: string };\ntype UnbondParams = { address: string; unbondAmount: number };\ntype NameRegisterParams = { name: string; chain: string; address: string; owner?: string };\ntype PreferredAssetRegisterParams = { name: string; chain: Chain; asset: string; payout: string; owner: string };\ntype WithdrawParams = { chain: Chain; symbol: string; ticker: string; basisPoints: number; targetAsset?: string };\n",
|
|
25
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { type Chain, getChainConfig } from \"@tcswap/types\";\nimport type { BrowserProvider, JsonRpcProvider } from \"ethers\";\nimport { USwapError } from \"../modules/uSwapError\";\nimport {\n type EIP6963AnnounceProviderEvent,\n type EIP6963Provider,\n type EthereumWindowProvider,\n type NetworkParams,\n WalletOption,\n} from \"../types\";\nimport { warnOnce } from \"./others\";\n\ndeclare const window: {\n ethereum: EthereumWindowProvider;\n trustwallet: EthereumWindowProvider;\n coinbaseWalletExtension: EthereumWindowProvider;\n braveSolana: any;\n bitkeep?: { ethereum: EthereumWindowProvider };\n ctrl?: { ethereum: EthereumWindowProvider };\n $onekey?: { ethereum: EthereumWindowProvider };\n vultisig?: { ethereum: EthereumWindowProvider };\n} & Window;\n\nexport function isWeb3Detected() {\n return typeof window.ethereum !== \"undefined\";\n}\n\nexport function isDetected(walletOption: WalletOption) {\n return listWeb3EVMWallets().includes(walletOption);\n}\n\nexport function listWeb3EVMWallets() {\n const metamaskEnabled = window?.ethereum && !window.ethereum?.isBraveWallet;\n const ctrlEnabled = window?.ctrl || window?.ethereum?.__XDEFI;\n const vultisigEnabled = window?.vultisig;\n const braveEnabled = window?.ethereum?.isBraveWallet;\n const trustEnabled = window?.ethereum?.isTrust || window?.trustwallet;\n const coinbaseEnabled =\n (window?.ethereum?.overrideIsMetaMask && window?.ethereum?.selectedProvider?.isCoinbaseWallet) ||\n window?.coinbaseWalletExtension;\n const bitgetEnabled = window?.bitkeep?.ethereum;\n const onekeyEnabled = window?.$onekey?.ethereum;\n\n const wallets = [];\n if (metamaskEnabled) wallets.push(WalletOption.METAMASK);\n if (ctrlEnabled) wallets.push(WalletOption.CTRL);\n if (vultisigEnabled) wallets.push(WalletOption.VULTISIG);\n if (braveEnabled) wallets.push(WalletOption.BRAVE);\n if (trustEnabled) wallets.push(WalletOption.TRUSTWALLET_WEB);\n if (coinbaseEnabled) wallets.push(WalletOption.COINBASE_WEB);\n if (okxMobileEnabled()) wallets.push(WalletOption.OKX_MOBILE);\n if (bitgetEnabled) wallets.push(WalletOption.BITGET);\n if (onekeyEnabled) wallets.push(WalletOption.ONEKEY);\n\n return wallets;\n}\n\nexport async function switchEVMWalletNetwork(provider: BrowserProvider, chain: Chain, networkParams?: NetworkParams) {\n const chainConfig = getChainConfig(chain);\n\n try {\n await providerRequest({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: chainConfig.chainIdHex }],\n provider,\n });\n } catch (error) {\n if (!networkParams) {\n throw new USwapError(\"helpers_failed_to_switch_network\", { error: error, reason: \"networkParams not provided\" });\n }\n await addEVMWalletNetwork(provider, networkParams);\n }\n}\n\nexport function filterSupportedChains<T extends string[]>({\n chains,\n supportedChains,\n walletType,\n}: {\n chains: Chain[];\n supportedChains: T;\n walletType?: WalletOption;\n}) {\n const supported = chains.filter((chain) => !chain || supportedChains.includes(chain));\n\n if (supported.length === 0) {\n throw new USwapError(\"wallet_chain_not_supported\", { chain: chains.join(\", \"), wallet: walletType });\n }\n\n const unsupported = chains.filter((chain) => !supportedChains.includes(chain));\n\n warnOnce({\n condition: unsupported.length > 0,\n id: `wallet_chain_not_supported_${walletType}`,\n warning: `${walletType} wallet does not support the following chains: ${unsupported.join(\n \", \",\n )}. These chains will be ignored.`,\n });\n\n return supported as T;\n}\n\nexport function wrapMethodWithNetworkSwitch<T extends (...args: any[]) => any>(\n func: T,\n provider: BrowserProvider,\n chain: Chain,\n) {\n return (async (...args: any[]) => {\n const { chainIdHex } = getChainConfig(chain);\n if ((await provider.getNetwork()).chainId.toString() === chainIdHex) {\n return func(...args);\n }\n try {\n await switchEVMWalletNetwork(provider, chain);\n } catch (error) {\n throw new USwapError({ errorKey: \"helpers_failed_to_switch_network\", info: { error } });\n }\n return func(...args);\n }) as unknown as T;\n}\n\nexport function prepareNetworkSwitch<T extends Record<string, unknown>, M extends keyof T>({\n toolbox,\n chain,\n provider = window.ethereum,\n methodNames = [],\n}: {\n toolbox: T;\n chain: Chain;\n provider?: BrowserProvider | JsonRpcProvider;\n methodNames?: M[];\n}) {\n const methodsToWrap = [\n ...methodNames,\n \"approve\",\n \"approvedAmount\",\n \"call\",\n \"sendTransaction\",\n \"transfer\",\n \"isApproved\",\n \"approvedAmount\",\n \"EIP1193SendTransaction\",\n \"getFeeData\",\n \"broadcastTransaction\",\n \"estimateCall\",\n \"estimateGasLimit\",\n \"estimateGasPrices\",\n \"createContractTxObject\",\n ] as M[];\n const wrappedMethods = methodsToWrap.reduce((object, methodName) => {\n if (!toolbox[methodName]) return object;\n\n const method = toolbox[methodName];\n\n if (typeof method !== \"function\") return object;\n\n // @ts-expect-error\n const wrappedMethod = wrapMethodWithNetworkSwitch(method, provider, chain);\n\n // biome-ignore lint/performance/noAccumulatingSpread: valid use case\n return { ...object, [methodName]: wrappedMethod };\n }, {});\n\n return { ...toolbox, ...wrappedMethods };\n}\n\nexport function addEVMWalletNetwork(provider: BrowserProvider, networkParams: NetworkParams) {\n return providerRequest({ method: \"wallet_addEthereumChain\", params: [networkParams], provider });\n}\n\nexport function addAccountsChangedCallback(callback: () => void) {\n window.ethereum?.on(\"accountsChanged\", () => callback());\n window.ctrl?.ethereum.on(\"accountsChanged\", () => callback());\n}\n\nexport function getETHDefaultWallet() {\n const { isTrust, isBraveWallet, __XDEFI, overrideIsMetaMask, selectedProvider } = window?.ethereum || {};\n if (isTrust) return WalletOption.TRUSTWALLET_WEB;\n if (isBraveWallet) return WalletOption.BRAVE;\n if (overrideIsMetaMask && selectedProvider?.isCoinbaseWallet) return WalletOption.COINBASE_WEB;\n if (__XDEFI) return WalletOption.CTRL;\n if (window?.$onekey?.ethereum) return WalletOption.ONEKEY;\n return WalletOption.METAMASK;\n}\n\nexport function getEIP6963Wallets() {\n const providers: EIP6963Provider[] = [];\n\n function onAnnouncement(event: EIP6963AnnounceProviderEvent) {\n if (providers.map((p) => p.info.uuid).includes(event.detail.info.uuid)) return;\n providers.push(event.detail);\n }\n\n window.addEventListener(\"eip6963:announceProvider\", onAnnouncement);\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n\n function removeEIP6963EventListener() {\n window.removeEventListener(\"eip6963:announceProvider\", onAnnouncement);\n }\n\n return { providers, removeEIP6963EventListener };\n}\n\nexport function okxMobileEnabled() {\n const ua = navigator.userAgent;\n const isIOS = /iphone|ipad|ipod|ios/i.test(ua);\n const isAndroid = /android|XiaoMi|MiuiBrowser/i.test(ua);\n const isMobile = isIOS || isAndroid;\n const isOKApp = /OKApp/i.test(ua);\n\n return isMobile && isOKApp;\n}\n\nexport function providerRequest({\n provider,\n params,\n method,\n}: {\n provider?: BrowserProvider;\n params?: any;\n method:\n | \"wallet_addEthereumChain\"\n | \"wallet_switchEthereumChain\"\n | \"eth_requestAccounts\"\n | \"eth_sendTransaction\"\n | \"eth_signTransaction\";\n}) {\n if (!provider?.send) {\n throw new USwapError(\"helpers_not_found_provider\");\n }\n\n const providerParams = params ? (Array.isArray(params) ? params : [params]) : [];\n return provider.send(method, providerParams);\n}\n"
|
|
26
|
+
],
|
|
27
|
+
"mappings": "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",
|
|
28
|
+
"debugId": "DC75328D02A1A7C364756E2164756E21",
|
|
29
|
+
"names": []
|
|
30
|
+
}
|
package/dist/tokens.cjs
ADDED
package/dist/tokens.js
ADDED