@swapkit/helpers 4.0.26 → 4.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/types/chains.d.ts +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"import type { TokenListName, TokenNames, TokenTax } from \"@swapkit/tokens\";\nimport { Chain, type ChainId, type EVMChain, EVMChains, getChainConfig } from \"@swapkit/types\";\nimport { getAddress } from \"ethers\";\nimport { match } from \"ts-pattern\";\nimport {\n assetFromString,\n type CommonAssetString,\n getAssetType,\n getCommonAssetInfo,\n getDecimal,\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 { SwapKitError } from \"./swapKitError\";\nimport type { SwapKitValueType } from \"./swapKitNumber\";\n\nconst CASE_SENSITIVE_CHAINS: Chain[] = [Chain.Solana, Chain.Tron, Chain.Near];\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\ntype ConditionalAssetValueReturn<T extends { asyncTokenLookup?: boolean }> = T[\"asyncTokenLookup\"] extends true\n ? Promise<AssetValue>\n : AssetValue;\n\ntype AssetIdentifier = { asset: CommonAssetString | TokenNames } | { asset: string } | { chain: Chain };\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 SwapKitError({ 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 const { identifier: unsafeIdentifier, decimal: commonAssetDecimal } = getCommonAssetInfo(\n assetOrChain as CommonAssetString,\n );\n const { chain, isSynthetic, isTradeAsset } = 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 const tokenDecimal = token?.decimal || commonAssetDecimal;\n\n warnOnce({\n condition: !(asyncTokenLookup || tokenDecimal),\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 @swapkit/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 = asyncTokenLookup\n ? createAssetValue(identifier, fromBaseDecimal ? adjustedValue : parsedValue)\n : isSynthetic || isTradeAsset\n ? createSyntheticAssetValue(identifier, adjustedValue)\n : new AssetValue({ 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(\"@swapkit/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 staticTokensMap.set(tokenKey, { decimal: tokenDecimal, identifier });\n }\n }\n\n return true;\n }\n\n static setStaticAssets(\n tokenMap: Map<\n string,\n { tax?: TokenTax; identifier: string; chain: Chain } & ({ decimal: number } | { decimals: number })\n >,\n ) {\n staticTokensMap.clear();\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 staticTokensMap.set(key, { ...value, decimal: tokenDecimal, identifier: tokenKey });\n }\n return true;\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 createAssetValue(identifier: string, value: NumberPrimitives = 0) {\n validateIdentifier(identifier);\n\n const isCaseSensitiveChain = identifier.includes(\"SOL.\");\n\n const modifiedIdentifier = isCaseSensitiveChain\n ? (identifier as TokenNames)\n : (identifier.toUpperCase() as TokenNames);\n\n const staticToken = staticTokensMap.get(modifiedIdentifier);\n const decimal = staticToken?.decimal || (await getDecimal(getAssetInfo(identifier)));\n if (!staticToken) {\n staticTokensMap.set(modifiedIdentifier, { decimal, identifier });\n }\n\n return new AssetValue({ decimal, identifier, 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 SwapKitError({ 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\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 SKConfig chains once we support it throughout sdk\n if (!Object.values(Chain).includes(chain.toUpperCase() as Chain)) {\n throw new SwapKitError({\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) return assetOrChain.chain;\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 SwapKitError({ 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 (_error) {\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 // Apply case-sensitivity rules after parsing\n const finalAddress = address && !CASE_SENSITIVE_CHAINS.includes(chain) ? address.toLowerCase() : address;\n\n return { address: finalAddress, ticker };\n}\n",
|
|
7
7
|
"import type { TokenNames } from \"@swapkit/tokens\";\nimport { Chain, type EVMChain, EVMChains, getChainConfig, UTXOChains } from \"@swapkit/types\";\nimport { match } from \"ts-pattern\";\nimport type { AssetValue } from \"../modules/assetValue\";\nimport { RequestClient } from \"../modules/requestClient\";\nimport type { RadixCoreStateResourceDTO } from \"../types/radix\";\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\nconst ethGasChains = [Chain.Arbitrum, Chain.Aurora, Chain.Base, Chain.Ethereum, Chain.Optimism] as const;\n\nasync function getContractDecimals({ chain, to }: { chain: EVMChain; to: string }) {\n const getDecimalMethodHex = \"0x313ce567\";\n const { baseDecimal } = getChainConfig(chain);\n\n try {\n const rpcUrl = await getRPCUrl(chain);\n\n const { result } = await RequestClient.post<{ result: string }>(rpcUrl, {\n body: JSON.stringify({\n id: 44,\n jsonrpc: \"2.0\",\n method: \"eth_call\",\n params: [{ data: getDecimalMethodHex, to: to.toLowerCase() }, \"latest\"],\n }),\n headers: { accept: \"*/*\", \"cache-control\": \"no-cache\", \"content-type\": \"application/json\" },\n });\n\n return Number.parseInt(BigInt(result || baseDecimal).toString(), 10);\n } catch (error) {\n console.error(`Failed to fetch contract decimals for ${to} on ${chain}:`, error);\n return baseDecimal;\n }\n}\n\nasync function getRadixAssetDecimal(symbol: string) {\n const { baseDecimal } = getChainConfig(Chain.Radix);\n\n if (symbol === Chain.Radix) return baseDecimal;\n\n try {\n const resourceAddress = symbol.split(\"-\")[1]?.toLowerCase();\n const rpcUrl = await getRPCUrl(Chain.Radix);\n\n const { manager } = await RequestClient.post<RadixCoreStateResourceDTO>(`${rpcUrl}/state/resource`, {\n body: JSON.stringify({ network: \"mainnet\", resource_address: resourceAddress }),\n headers: { Accept: \"*/*\", \"Content-Type\": \"application/json\" },\n });\n\n return manager.divisibility.value.divisibility;\n } catch (error) {\n console.error(`Failed to fetch Radix asset decimal for ${symbol}:`, error);\n return baseDecimal;\n }\n}\n\nasync function getEVMAssetDecimal({ chain, symbol }: { chain: EVMChain; symbol: string }) {\n const { baseDecimal } = getChainConfig(chain);\n\n if (EVMChains.includes(symbol as EVMChain)) return baseDecimal;\n\n const splitSymbol = symbol.split(\"-\");\n const address = splitSymbol.length === 1 ? undefined : splitSymbol[splitSymbol.length - 1]?.toLowerCase();\n\n const decimal = await (address?.startsWith(\"0x\") ? getContractDecimals({ chain, to: address }) : baseDecimal);\n\n return decimal;\n}\n\nexport function getDecimal({ chain, symbol }: { chain: Chain; symbol: string }) {\n const { baseDecimal } = getChainConfig(chain);\n\n return match(chain)\n .with(...EVMChains, (chain) => getEVMAssetDecimal({ chain, symbol }))\n .with(Chain.Radix, () => getRadixAssetDecimal(symbol))\n .otherwise(() => baseDecimal);\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\")\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.Avalanche, (asset) => ({ decimal, identifier: `${asset}.AVAX` }))\n .with(Chain.Gnosis, (asset) => ({ decimal, identifier: `${asset}.XDAI` }))\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.THORChain, () => symbol === \"RUNE\")\n .with(Chain.Tron, () => symbol === \"TRX\")\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
8
|
"import { Chain } from \"@swapkit/types\";\nimport { createStore } from \"zustand/vanilla\";\nimport { EXPLORER_URLS, FALLBACK_URLS, NODE_URLS, RPC_URLS, WalletOption } from \"../types\";\nimport type { FeeMultiplierConfig } from \"./feeMultiplier\";\n\nexport type SKConfigIntegrations = {\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 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\nconst initialState = {\n apiKeys: { blockchair: \"\", keepKey: \"\", swapKit: \"\", walletConnectProjectId: \"\", xaman: \"\" },\n // TODO: figure out how to type apis without using toolbox directly\n // Maybe move rpc/toolbox apis to helpers?\n apis: {} as { [key in Chain]: any },\n chains: Object.values(Chain),\n\n envs: {\n apiUrl: \"https://api.swapkit.dev\",\n devApiUrl: \"https://dev-api.swapkit.dev\",\n isDev: false,\n isStagenet: false,\n },\n explorerUrls: EXPLORER_URLS,\n fallbackRpcUrls: FALLBACK_URLS,\n\n feeMultipliers: undefined as FeeMultiplierConfig | undefined,\n\n integrations: {\n radix: {\n applicationName: \"Swapkit Playground\",\n applicationVersion: \"0.0.1\",\n dAppDefinitionAddress: \"account_rdx128r289p58222hcvev7frs6kue76pl7pdcnw8725aw658v0zggkh9ws\",\n network: { dashboardBase: \"https://dashboard.radixdlt.com\", networkId: 1, networkName: \"mainnet\" },\n },\n } as SKConfigIntegrations,\n nodeUrls: NODE_URLS,\n\n requestOptions: { retry: { backoffMultiplier: 2, baseDelay: 300, maxDelay: 5000, maxRetries: 3 }, timeoutMs: 30000 },\n rpcUrls: RPC_URLS,\n wallets: Object.values(WalletOption),\n};\ntype SKState = typeof initialState;\n\nexport type SKConfigState = {\n apiKeys?: Partial<SKState[\"apiKeys\"]>;\n chains?: SKState[\"chains\"];\n envs?: Partial<SKState[\"envs\"]>;\n explorerUrls?: Partial<SKState[\"explorerUrls\"]>;\n integrations?: Partial<SKConfigIntegrations>;\n nodeUrls?: Partial<SKState[\"nodeUrls\"]>;\n rpcUrls?: Partial<SKState[\"rpcUrls\"]>;\n fallbackRpcUrls?: Partial<SKState[\"fallbackRpcUrls\"]>;\n wallets?: SKState[\"wallets\"];\n feeMultipliers?: FeeMultiplierConfig;\n};\n\ntype SwapKitConfigStore = SKState & {\n setApiKey: (key: keyof SKState[\"apiKeys\"], apiKey: string) => void;\n setConfig: (config: SKConfigState) => void;\n setEnv: <T extends keyof SKState[\"envs\"]>(key: T, value: SKState[\"envs\"][T]) => void;\n setExplorerUrl: (chain: keyof SKState[\"explorerUrls\"], url: string) => void;\n setNodeUrl: (chain: keyof SKState[\"nodeUrls\"], url: string) => void;\n setRpcUrl: (chain: keyof SKState[\"rpcUrls\"], url: string) => void;\n setRequestOptions: (options: Partial<SKState[\"requestOptions\"]>) => void;\n setFallbackRpcUrls: <T extends keyof SKState[\"fallbackRpcUrls\"]>(\n chain: T,\n urls: SKState[\"fallbackRpcUrls\"][T],\n ) => void;\n setIntegrationConfig: (\n integration: keyof SKState[\"integrations\"],\n config: SKConfigIntegrations[keyof SKConfigIntegrations],\n ) => void;\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => void;\n};\n\nconst swapKitState = createStore<SwapKitConfigStore>((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 envs: { ...s.envs, ...config.envs },\n explorerUrls: { ...s.explorerUrls, ...config.explorerUrls },\n feeMultipliers: config.feeMultipliers || s.feeMultipliers,\n integrations: { ...s.integrations, ...config.integrations },\n nodeUrls: { ...s.nodeUrls, ...config.nodeUrls } as typeof s.nodeUrls,\n rpcUrls: { ...s.rpcUrls, ...config.rpcUrls },\n wallets: s.wallets.concat(config.wallets || []),\n })),\n setEnv: (key, value) => set((s) => ({ envs: { ...s.envs, [key]: value } })),\n setExplorerUrl: (chain, url) => set((s) => ({ explorerUrls: { ...s.explorerUrls, [chain]: url } })),\n setFallbackRpcUrls: (chain, urls) => set((s) => ({ fallbackRpcUrls: { ...s.fallbackRpcUrls, [chain]: urls } })),\n setFeeMultipliers: (multipliers) => set(() => ({ feeMultipliers: multipliers })),\n setIntegrationConfig: (integration, config) =>\n set((s) => ({ integrations: { ...s.integrations, [integration]: config } })),\n setNodeUrl: (chain, url) => set((s) => ({ nodeUrls: { ...s.nodeUrls, [chain]: url } as typeof s.nodeUrls })),\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 SKConfig = {\n get: <T extends keyof SKState>(key: T) => swapKitState.getState()[key],\n getState: swapKitState.getState,\n set: <T extends SKConfigState>(config: T) => swapKitState.getState().setConfig(config),\n\n setApiKey: <T extends keyof SKState[\"apiKeys\"]>(key: T, apiKey: string) =>\n swapKitState.getState().setApiKey(key, apiKey),\n setEnv: <T extends keyof SKState[\"envs\"]>(key: T, value: SKState[\"envs\"][T]) =>\n swapKitState.getState().setEnv(key, value),\n setExplorerUrl: <T extends keyof SKState[\"explorerUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setExplorerUrl(chain, url),\n setFallbackRpcUrls: <T extends keyof SKState[\"fallbackRpcUrls\"]>(chain: T, urls: SKState[\"fallbackRpcUrls\"][T]) =>\n swapKitState.getState().setFallbackRpcUrls(chain, urls),\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => swapKitState.getState().setFeeMultipliers(multipliers),\n setIntegrationConfig: <T extends keyof SKState[\"integrations\"]>(integration: T, config: SKConfigIntegrations[T]) =>\n swapKitState.getState().setIntegrationConfig(integration, config),\n setNodeUrl: <T extends keyof SKState[\"nodeUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setNodeUrl(chain, url),\n setRequestOptions: (options: SKState[\"requestOptions\"]) => swapKitState.getState().setRequestOptions(options),\n setRpcUrl: <T extends keyof SKState[\"rpcUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setRpcUrl(chain, url),\n};\n",
|
|
9
|
-
"import { Chain, getChainConfig, StagenetChain } from \"@swapkit/types\";\n\n/**\n * Note: RPC_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const rpcUrl = RPC_URLS[Chain.Ethereum];\n * +const { rpcUrls: [rpcUrl] } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const RPC_URLS: Record<Chain | StagenetChain, string> = {\n [Chain.Arbitrum]: \"https://arb1.arbitrum.io/rpc\",\n [Chain.Aurora]: \"https://aurora-rpc.publicnode.com\",\n [Chain.Avalanche]: \"https://api.avax.network/ext/bc/C/rpc\",\n [Chain.Base]: \"https://base-rpc.publicnode.com\",\n [Chain.Berachain]: \"https://berachain-rpc.publicnode.com\",\n [Chain.BinanceSmartChain]: \"https://bsc-dataseed.binance.org\",\n [Chain.BitcoinCash]: \"https://node-router.thorswap.net/bitcoin-cash\",\n [Chain.Bitcoin]: \"https://bitcoin-rpc.publicnode.com\",\n [Chain.Chainflip]: \"wss://mainnet-archive.chainflip.io\",\n [Chain.Cosmos]: \"https://cosmos-rpc.publicnode.com:443\",\n [Chain.Dash]: \"https://dash-rpc.publicnode.com\",\n [Chain.Dogecoin]: \"https://node-router.thorswap.net/dogecoin\",\n [Chain.Ethereum]: \"https://ethereum-rpc.publicnode.com\",\n [Chain.Gnosis]: \"https://gnosis-rpc.publicnode.com\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [Chain.Kujira]: \"https://kujira-rpc.ibs.team\",\n [Chain.Litecoin]: \"https://node-router.thorswap.net/litecoin\",\n [Chain.Maya]: \"https://tendermint.mayachain.info\",\n [Chain.Near]: \"https://rpc.mainnet.near.org\",\n [Chain.Noble]: \"https://noble-rpc.polkachu.com\",\n [Chain.Optimism]: \"https://mainnet.optimism.io\",\n [Chain.Polkadot]: \"wss://rpc.polkadot.io\",\n [Chain.Polygon]: \"https://polygon-rpc.com\",\n // TODO - Update Radix RPC URL when available\n [Chain.Radix]: \"https://radix-mainnet.rpc.grove.city/v1/326002fc/core\",\n [Chain.Ripple]: \"wss://xrpl.ws/\",\n [Chain.Solana]: \"https://solana-rpc.publicnode.com\",\n [Chain.THORChain]: \"https://rpc.ninerealms.com\",\n [Chain.Tron]: \"https://tron-rpc.publicnode.com\",\n [Chain.Zcash]:\n \"https://api.tatum.io/v3/blockchain/node/zcash-mainnet/t-6894a2ae7fc90cccfd3ce71b-2fce88aa7f4a41a5b1e93874\",\n [StagenetChain.Maya]: \"\",\n [StagenetChain.THORChain]: \"https://stagenet-rpc.ninerealms.com\",\n // WIP - might change\n [StagenetChain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n};\n\nexport const NODE_URLS = {\n [Chain.THORChain]: \"https://thornode.ninerealms.com\",\n [Chain.Maya]: \"https://mayanode.mayachain.info\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [StagenetChain.THORChain]: \"https://stagenet-thornode.ninerealms.com\",\n [StagenetChain.Maya]: \"https://stagenet.mayanode.mayachain.info\",\n};\n\n/**\n * Note: FALLBACK_URLS has been removed in favor of supporting multiple RPC URLs.\n * This export will be discontinued in future versions.\n */\nexport const FALLBACK_URLS: Record<Chain | StagenetChain, string[]> = {\n [Chain.Arbitrum]: [\"https://arb-mainnet.g.alchemy.com/v2/demo\", \"https://arbitrum.blockpi.network/v1/rpc/public\"],\n [Chain.Aurora]: [\"https://1rpc.io/aurora\", \"https://mainnet.aurora.dev\"],\n [Chain.Avalanche]: [\"https://api.avax.network/ext/bc/C/rpc\", \"https://avalanche-c-chain-rpc.publicnode.com\"],\n [Chain.Base]: [\"https://base.blockpi.network/v1/rpc/public\", \"https://1rpc.io/base\"],\n [Chain.BinanceSmartChain]: [\"https://bsc-rpc.gateway.pokt.network\", \"https://bsc-dataseed2.binance.org\"],\n [Chain.Berachain]: [\"https://rpc.berachain.com\", \"https://berachain.drpc.org\"],\n [Chain.Bitcoin]: [\"https://bitcoin.publicnode.com\"],\n [Chain.BitcoinCash]: [\"https://bch-dataseed.binance.org\", \"https://bch.getblock.io/mainnet\"],\n [Chain.Chainflip]: [\"wss://archive-1.mainnet.chainflip.io\", \"wss://archive-2.mainnet.chainflip.io\"],\n [Chain.Cosmos]: [\"https://cosmos-rpc.publicnode.com\"],\n [Chain.Dash]: [\"https://dash-rpc.publicnode.com\"],\n [Chain.Dogecoin]: [\"https://doge.getblock.io/mainnet\", \"https://dogecoin.publicnode.com\"],\n [Chain.Ethereum]: [\"https://eth.llamarpc.com\", \"https://cloudflare-eth.com\"],\n [Chain.Gnosis]: [\"https://gnosis.drpc.org\", \"https://rpc.ankr.com/gnosis\"],\n [Chain.Harbor]: [],\n [Chain.Kujira]: [\"https://kujira-rpc.polkachu.com\", \"https://rpc-kujira.synergynodes.com/\"],\n [Chain.Litecoin]: [\"https://ltc.getblock.io/mainnet\", \"https://litecoin.publicnode.com\"],\n [Chain.Maya]: [\"https://tendermint.mayachain.info\", \"https://maya-tendermint.publicnode.com\"],\n [StagenetChain.Maya]: [],\n [Chain.Near]: [\n \"https://1rpc.io/near\",\n \"https://near.lava.build\",\n \"https://near-mainnet.infura.io/v3/3cbfcafa5e1e48b7bb0ea41f2fbc4abf\",\n ],\n [Chain.Noble]: [\"https://rpc.noble.xyz\", \"https://rpc.cosmos.directory/noble\"],\n [Chain.Optimism]: [\"https://optimism.llamarpc.com\", \"https://1rpc.io/op\"],\n [Chain.Polkadot]: [\"wss://polkadot-rpc.dwellir.com\", \"wss://polkadot.api.onfinality.io/public-ws\"],\n [Chain.Polygon]: [\"https://polygon.llamarpc.com\", \"https://polygon-bor-rpc.publicnode.com\"],\n [Chain.Radix]: [\"https://mainnet.radixdlt.com\", \"https://radix-mainnet.rpc.grove.city/v1\"],\n [Chain.Ripple]: [\"wss://s1.ripple.com/\", \"wss://s2.ripple.com/\"],\n [Chain.THORChain]: [\"https://thornode.ninerealms.com\", NODE_URLS[Chain.THORChain]],\n [StagenetChain.THORChain]: [],\n [StagenetChain.Harbor]: [],\n [Chain.Solana]: [\"https://api.mainnet-beta.solana.com\", \"https://solana-mainnet.rpc.extrnode.com\"],\n [Chain.Tron]: [\"https://api.tronstack.io\", \"https://api.tron.network\"],\n [Chain.Zcash]: [],\n};\n\n/**\n * Note: EXPLORER_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const explorerUrl = EXPLORER_URLS[Chain.Ethereum];\n * +const {
|
|
9
|
+
"import { Chain, getChainConfig, StagenetChain } from \"@swapkit/types\";\n\n/**\n * Note: RPC_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const rpcUrl = RPC_URLS[Chain.Ethereum];\n * +const { rpcUrls: [rpcUrl] } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const RPC_URLS: Record<Chain | StagenetChain, string> = {\n [Chain.Arbitrum]: \"https://arb1.arbitrum.io/rpc\",\n [Chain.Aurora]: \"https://aurora-rpc.publicnode.com\",\n [Chain.Avalanche]: \"https://api.avax.network/ext/bc/C/rpc\",\n [Chain.Base]: \"https://base-rpc.publicnode.com\",\n [Chain.Berachain]: \"https://berachain-rpc.publicnode.com\",\n [Chain.BinanceSmartChain]: \"https://bsc-dataseed.binance.org\",\n [Chain.BitcoinCash]: \"https://node-router.thorswap.net/bitcoin-cash\",\n [Chain.Bitcoin]: \"https://bitcoin-rpc.publicnode.com\",\n [Chain.Chainflip]: \"wss://mainnet-archive.chainflip.io\",\n [Chain.Cosmos]: \"https://cosmos-rpc.publicnode.com:443\",\n [Chain.Dash]: \"https://dash-rpc.publicnode.com\",\n [Chain.Dogecoin]: \"https://node-router.thorswap.net/dogecoin\",\n [Chain.Ethereum]: \"https://ethereum-rpc.publicnode.com\",\n [Chain.Gnosis]: \"https://gnosis-rpc.publicnode.com\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [Chain.Kujira]: \"https://kujira-rpc.ibs.team\",\n [Chain.Litecoin]: \"https://node-router.thorswap.net/litecoin\",\n [Chain.Maya]: \"https://tendermint.mayachain.info\",\n [Chain.Near]: \"https://rpc.mainnet.near.org\",\n [Chain.Noble]: \"https://noble-rpc.polkachu.com\",\n [Chain.Optimism]: \"https://mainnet.optimism.io\",\n [Chain.Polkadot]: \"wss://rpc.polkadot.io\",\n [Chain.Polygon]: \"https://polygon-rpc.com\",\n // TODO - Update Radix RPC URL when available\n [Chain.Radix]: \"https://radix-mainnet.rpc.grove.city/v1/326002fc/core\",\n [Chain.Ripple]: \"wss://xrpl.ws/\",\n [Chain.Solana]: \"https://solana-rpc.publicnode.com\",\n [Chain.THORChain]: \"https://rpc.ninerealms.com\",\n [Chain.Tron]: \"https://tron-rpc.publicnode.com\",\n [Chain.Zcash]:\n \"https://api.tatum.io/v3/blockchain/node/zcash-mainnet/t-6894a2ae7fc90cccfd3ce71b-2fce88aa7f4a41a5b1e93874\",\n [StagenetChain.Maya]: \"\",\n [StagenetChain.THORChain]: \"https://stagenet-rpc.ninerealms.com\",\n // WIP - might change\n [StagenetChain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n};\n\nexport const NODE_URLS = {\n [Chain.THORChain]: \"https://thornode.ninerealms.com\",\n [Chain.Maya]: \"https://mayanode.mayachain.info\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [StagenetChain.THORChain]: \"https://stagenet-thornode.ninerealms.com\",\n [StagenetChain.Maya]: \"https://stagenet.mayanode.mayachain.info\",\n};\n\n/**\n * Note: FALLBACK_URLS has been removed in favor of supporting multiple RPC URLs.\n * This export will be discontinued in future versions.\n */\nexport const FALLBACK_URLS: Record<Chain | StagenetChain, string[]> = {\n [Chain.Arbitrum]: [\"https://arb-mainnet.g.alchemy.com/v2/demo\", \"https://arbitrum.blockpi.network/v1/rpc/public\"],\n [Chain.Aurora]: [\"https://1rpc.io/aurora\", \"https://mainnet.aurora.dev\"],\n [Chain.Avalanche]: [\"https://api.avax.network/ext/bc/C/rpc\", \"https://avalanche-c-chain-rpc.publicnode.com\"],\n [Chain.Base]: [\"https://base.blockpi.network/v1/rpc/public\", \"https://1rpc.io/base\"],\n [Chain.BinanceSmartChain]: [\"https://bsc-rpc.gateway.pokt.network\", \"https://bsc-dataseed2.binance.org\"],\n [Chain.Berachain]: [\"https://rpc.berachain.com\", \"https://berachain.drpc.org\"],\n [Chain.Bitcoin]: [\"https://bitcoin.publicnode.com\"],\n [Chain.BitcoinCash]: [\"https://bch-dataseed.binance.org\", \"https://bch.getblock.io/mainnet\"],\n [Chain.Chainflip]: [\"wss://archive-1.mainnet.chainflip.io\", \"wss://archive-2.mainnet.chainflip.io\"],\n [Chain.Cosmos]: [\"https://cosmos-rpc.publicnode.com\"],\n [Chain.Dash]: [\"https://dash-rpc.publicnode.com\"],\n [Chain.Dogecoin]: [\"https://doge.getblock.io/mainnet\", \"https://dogecoin.publicnode.com\"],\n [Chain.Ethereum]: [\"https://eth.llamarpc.com\", \"https://cloudflare-eth.com\"],\n [Chain.Gnosis]: [\"https://gnosis.drpc.org\", \"https://rpc.ankr.com/gnosis\"],\n [Chain.Harbor]: [],\n [Chain.Kujira]: [\"https://kujira-rpc.polkachu.com\", \"https://rpc-kujira.synergynodes.com/\"],\n [Chain.Litecoin]: [\"https://ltc.getblock.io/mainnet\", \"https://litecoin.publicnode.com\"],\n [Chain.Maya]: [\"https://tendermint.mayachain.info\", \"https://maya-tendermint.publicnode.com\"],\n [StagenetChain.Maya]: [],\n [Chain.Near]: [\n \"https://1rpc.io/near\",\n \"https://near.lava.build\",\n \"https://near-mainnet.infura.io/v3/3cbfcafa5e1e48b7bb0ea41f2fbc4abf\",\n ],\n [Chain.Noble]: [\"https://rpc.noble.xyz\", \"https://rpc.cosmos.directory/noble\"],\n [Chain.Optimism]: [\"https://optimism.llamarpc.com\", \"https://1rpc.io/op\"],\n [Chain.Polkadot]: [\"wss://polkadot-rpc.dwellir.com\", \"wss://polkadot.api.onfinality.io/public-ws\"],\n [Chain.Polygon]: [\"https://polygon.llamarpc.com\", \"https://polygon-bor-rpc.publicnode.com\"],\n [Chain.Radix]: [\"https://mainnet.radixdlt.com\", \"https://radix-mainnet.rpc.grove.city/v1\"],\n [Chain.Ripple]: [\"wss://s1.ripple.com/\", \"wss://s2.ripple.com/\"],\n [Chain.THORChain]: [\"https://thornode.ninerealms.com\", NODE_URLS[Chain.THORChain]],\n [StagenetChain.THORChain]: [],\n [StagenetChain.Harbor]: [],\n [Chain.Solana]: [\"https://api.mainnet-beta.solana.com\", \"https://solana-mainnet.rpc.extrnode.com\"],\n [Chain.Tron]: [\"https://api.tronstack.io\", \"https://api.tron.network\"],\n [Chain.Zcash]: [],\n};\n\n/**\n * Note: EXPLORER_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const explorerUrl = EXPLORER_URLS[Chain.Ethereum];\n * +const { explorerUrl } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const EXPLORER_URLS: Record<Chain, string> = {\n [Chain.Arbitrum]: \"https://arbiscan.io\",\n [Chain.Aurora]: \"https://explorer.mainnet.aurora.dev\",\n [Chain.Avalanche]: \"https://snowtrace.io\",\n [Chain.Base]: \"https://basescan.org\",\n [Chain.Berachain]: \"https://berascan.com\",\n [Chain.BinanceSmartChain]: \"https://bscscan.com\",\n [Chain.Bitcoin]: \"https://blockchair.com/bitcoin\",\n [Chain.BitcoinCash]: \"https://www.blockchair.com/bitcoin-cash\",\n [Chain.Chainflip]: \"https://explorer.polkascan.io/polkadot\",\n [Chain.Cosmos]: \"https://www.mintscan.io/cosmos\",\n [Chain.Dash]: \"https://blockchair.com/dash\",\n [Chain.Dogecoin]: \"https://blockchair.com/dogecoin\",\n [Chain.Ethereum]: \"https://etherscan.io\",\n [Chain.Gnosis]: \"https://gnosisscan.io\",\n [Chain.Harbor]: \"\",\n [Chain.Kujira]: \"https://finder.kujira.network/kaiyo-1\",\n [Chain.Litecoin]: \"https://blockchair.com/litecoin\",\n [Chain.Maya]: \"https://www.mayascan.org\",\n [Chain.Near]: \"https://nearblocks.io\",\n [Chain.Noble]: \"https://www.mintscan.io/noble\",\n [Chain.Optimism]: \"https://optimistic.etherscan.io\",\n [Chain.Polkadot]: \"https://polkadot.subscan.io\",\n [Chain.Polygon]: \"https://polygonscan.com\",\n [Chain.Radix]: \"https://dashboard.radixdlt.com\",\n [Chain.Ripple]: \"https://livenet.xrpl.org/\",\n [Chain.THORChain]: \"https://runescan.io\",\n [Chain.Solana]: \"https://solscan.io\",\n [Chain.Tron]: \"https://tronscan.org\",\n [Chain.Zcash]: \"https://blockchair.com/zcash\",\n};\n",
|
|
10
10
|
"import type { Chain } from \"@swapkit/types\";\n\nexport enum ContractAddress {\n ARB = \"0x0000000000000000000000000000000000000000\",\n AURORA = \"0x0000000000000000000000000000000000000000\",\n AVAX = \"0x0000000000000000000000000000000000000000\",\n BASE = \"0x0000000000000000000000000000000000000000\",\n BERA = \"0x0000000000000000000000000000000000000000\",\n ETH = \"0x0000000000000000000000000000000000000000\",\n BSC = \"0x0000000000000000000000000000000000000000\",\n GNO = \"0x0000000000000000000000000000000000000000\",\n MATIC = \"0x0000000000000000000000000000000000001010\",\n OP = \"0x4200000000000000000000000000000000000042\",\n}\n\nexport type DerivationPathArray = [number, number, number, number, number?];\n\nexport const NetworkDerivationPath: Record<Chain, DerivationPathArray> = {\n ARB: [44, 60, 0, 0, 0],\n AURORA: [44, 60, 0, 0, 0],\n AVAX: [44, 60, 0, 0, 0],\n BASE: [44, 60, 0, 0, 0],\n BCH: [44, 145, 0, 0, 0],\n BERA: [44, 60, 0, 0, 0],\n BSC: [44, 60, 0, 0, 0],\n BTC: [84, 0, 0, 0, 0],\n DASH: [44, 5, 0, 0, 0],\n DOGE: [44, 3, 0, 0, 0],\n DOT: [0, 0, 0, 0, 0],\n ETH: [44, 60, 0, 0, 0],\n FLIP: [0, 0, 0, 0, 0],\n GAIA: [44, 118, 0, 0, 0],\n GNO: [44, 60, 0, 0, 0],\n HARBOR: [44, 931, 0, 0, 0],\n KUJI: [44, 118, 0, 0, 0],\n LTC: [84, 2, 0, 0, 0],\n MAYA: [44, 931, 0, 0, 0],\n NEAR: [44, 397, 0, 0, 0],\n NOBLE: [44, 118, 0, 0, 0],\n OP: [44, 60, 0, 0, 0],\n POL: [44, 60, 0, 0, 0],\n SOL: [44, 501, 0, 0, 0],\n THOR: [44, 931, 0, 0, 0],\n TRON: [44, 195, 0, 0, 0],\n XRD: [0, 0, 0, 0, 0],\n XRP: [44, 144, 0, 0, 0],\n ZEC: [44, 133, 0, 0, 0],\n};\n",
|
|
11
11
|
"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}\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}\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}\n",
|
|
12
12
|
"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",
|
package/dist/index.js.map
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"import type { TokenListName, TokenNames, TokenTax } from \"@swapkit/tokens\";\nimport { Chain, type ChainId, type EVMChain, EVMChains, getChainConfig } from \"@swapkit/types\";\nimport { getAddress } from \"ethers\";\nimport { match } from \"ts-pattern\";\nimport {\n assetFromString,\n type CommonAssetString,\n getAssetType,\n getCommonAssetInfo,\n getDecimal,\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 { SwapKitError } from \"./swapKitError\";\nimport type { SwapKitValueType } from \"./swapKitNumber\";\n\nconst CASE_SENSITIVE_CHAINS: Chain[] = [Chain.Solana, Chain.Tron, Chain.Near];\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\ntype ConditionalAssetValueReturn<T extends { asyncTokenLookup?: boolean }> = T[\"asyncTokenLookup\"] extends true\n ? Promise<AssetValue>\n : AssetValue;\n\ntype AssetIdentifier = { asset: CommonAssetString | TokenNames } | { asset: string } | { chain: Chain };\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 SwapKitError({ 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 const { identifier: unsafeIdentifier, decimal: commonAssetDecimal } = getCommonAssetInfo(\n assetOrChain as CommonAssetString,\n );\n const { chain, isSynthetic, isTradeAsset } = 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 const tokenDecimal = token?.decimal || commonAssetDecimal;\n\n warnOnce({\n condition: !(asyncTokenLookup || tokenDecimal),\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 @swapkit/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 = asyncTokenLookup\n ? createAssetValue(identifier, fromBaseDecimal ? adjustedValue : parsedValue)\n : isSynthetic || isTradeAsset\n ? createSyntheticAssetValue(identifier, adjustedValue)\n : new AssetValue({ 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(\"@swapkit/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 staticTokensMap.set(tokenKey, { decimal: tokenDecimal, identifier });\n }\n }\n\n return true;\n }\n\n static setStaticAssets(\n tokenMap: Map<\n string,\n { tax?: TokenTax; identifier: string; chain: Chain } & ({ decimal: number } | { decimals: number })\n >,\n ) {\n staticTokensMap.clear();\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 staticTokensMap.set(key, { ...value, decimal: tokenDecimal, identifier: tokenKey });\n }\n return true;\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 createAssetValue(identifier: string, value: NumberPrimitives = 0) {\n validateIdentifier(identifier);\n\n const isCaseSensitiveChain = identifier.includes(\"SOL.\");\n\n const modifiedIdentifier = isCaseSensitiveChain\n ? (identifier as TokenNames)\n : (identifier.toUpperCase() as TokenNames);\n\n const staticToken = staticTokensMap.get(modifiedIdentifier);\n const decimal = staticToken?.decimal || (await getDecimal(getAssetInfo(identifier)));\n if (!staticToken) {\n staticTokensMap.set(modifiedIdentifier, { decimal, identifier });\n }\n\n return new AssetValue({ decimal, identifier, 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 SwapKitError({ 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\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 SKConfig chains once we support it throughout sdk\n if (!Object.values(Chain).includes(chain.toUpperCase() as Chain)) {\n throw new SwapKitError({\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) return assetOrChain.chain;\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 SwapKitError({ 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 (_error) {\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 // Apply case-sensitivity rules after parsing\n const finalAddress = address && !CASE_SENSITIVE_CHAINS.includes(chain) ? address.toLowerCase() : address;\n\n return { address: finalAddress, ticker };\n}\n",
|
|
7
7
|
"import type { TokenNames } from \"@swapkit/tokens\";\nimport { Chain, type EVMChain, EVMChains, getChainConfig, UTXOChains } from \"@swapkit/types\";\nimport { match } from \"ts-pattern\";\nimport type { AssetValue } from \"../modules/assetValue\";\nimport { RequestClient } from \"../modules/requestClient\";\nimport type { RadixCoreStateResourceDTO } from \"../types/radix\";\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\nconst ethGasChains = [Chain.Arbitrum, Chain.Aurora, Chain.Base, Chain.Ethereum, Chain.Optimism] as const;\n\nasync function getContractDecimals({ chain, to }: { chain: EVMChain; to: string }) {\n const getDecimalMethodHex = \"0x313ce567\";\n const { baseDecimal } = getChainConfig(chain);\n\n try {\n const rpcUrl = await getRPCUrl(chain);\n\n const { result } = await RequestClient.post<{ result: string }>(rpcUrl, {\n body: JSON.stringify({\n id: 44,\n jsonrpc: \"2.0\",\n method: \"eth_call\",\n params: [{ data: getDecimalMethodHex, to: to.toLowerCase() }, \"latest\"],\n }),\n headers: { accept: \"*/*\", \"cache-control\": \"no-cache\", \"content-type\": \"application/json\" },\n });\n\n return Number.parseInt(BigInt(result || baseDecimal).toString(), 10);\n } catch (error) {\n console.error(`Failed to fetch contract decimals for ${to} on ${chain}:`, error);\n return baseDecimal;\n }\n}\n\nasync function getRadixAssetDecimal(symbol: string) {\n const { baseDecimal } = getChainConfig(Chain.Radix);\n\n if (symbol === Chain.Radix) return baseDecimal;\n\n try {\n const resourceAddress = symbol.split(\"-\")[1]?.toLowerCase();\n const rpcUrl = await getRPCUrl(Chain.Radix);\n\n const { manager } = await RequestClient.post<RadixCoreStateResourceDTO>(`${rpcUrl}/state/resource`, {\n body: JSON.stringify({ network: \"mainnet\", resource_address: resourceAddress }),\n headers: { Accept: \"*/*\", \"Content-Type\": \"application/json\" },\n });\n\n return manager.divisibility.value.divisibility;\n } catch (error) {\n console.error(`Failed to fetch Radix asset decimal for ${symbol}:`, error);\n return baseDecimal;\n }\n}\n\nasync function getEVMAssetDecimal({ chain, symbol }: { chain: EVMChain; symbol: string }) {\n const { baseDecimal } = getChainConfig(chain);\n\n if (EVMChains.includes(symbol as EVMChain)) return baseDecimal;\n\n const splitSymbol = symbol.split(\"-\");\n const address = splitSymbol.length === 1 ? undefined : splitSymbol[splitSymbol.length - 1]?.toLowerCase();\n\n const decimal = await (address?.startsWith(\"0x\") ? getContractDecimals({ chain, to: address }) : baseDecimal);\n\n return decimal;\n}\n\nexport function getDecimal({ chain, symbol }: { chain: Chain; symbol: string }) {\n const { baseDecimal } = getChainConfig(chain);\n\n return match(chain)\n .with(...EVMChains, (chain) => getEVMAssetDecimal({ chain, symbol }))\n .with(Chain.Radix, () => getRadixAssetDecimal(symbol))\n .otherwise(() => baseDecimal);\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\")\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.Avalanche, (asset) => ({ decimal, identifier: `${asset}.AVAX` }))\n .with(Chain.Gnosis, (asset) => ({ decimal, identifier: `${asset}.XDAI` }))\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.THORChain, () => symbol === \"RUNE\")\n .with(Chain.Tron, () => symbol === \"TRX\")\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
8
|
"import { Chain } from \"@swapkit/types\";\nimport { createStore } from \"zustand/vanilla\";\nimport { EXPLORER_URLS, FALLBACK_URLS, NODE_URLS, RPC_URLS, WalletOption } from \"../types\";\nimport type { FeeMultiplierConfig } from \"./feeMultiplier\";\n\nexport type SKConfigIntegrations = {\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 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\nconst initialState = {\n apiKeys: { blockchair: \"\", keepKey: \"\", swapKit: \"\", walletConnectProjectId: \"\", xaman: \"\" },\n // TODO: figure out how to type apis without using toolbox directly\n // Maybe move rpc/toolbox apis to helpers?\n apis: {} as { [key in Chain]: any },\n chains: Object.values(Chain),\n\n envs: {\n apiUrl: \"https://api.swapkit.dev\",\n devApiUrl: \"https://dev-api.swapkit.dev\",\n isDev: false,\n isStagenet: false,\n },\n explorerUrls: EXPLORER_URLS,\n fallbackRpcUrls: FALLBACK_URLS,\n\n feeMultipliers: undefined as FeeMultiplierConfig | undefined,\n\n integrations: {\n radix: {\n applicationName: \"Swapkit Playground\",\n applicationVersion: \"0.0.1\",\n dAppDefinitionAddress: \"account_rdx128r289p58222hcvev7frs6kue76pl7pdcnw8725aw658v0zggkh9ws\",\n network: { dashboardBase: \"https://dashboard.radixdlt.com\", networkId: 1, networkName: \"mainnet\" },\n },\n } as SKConfigIntegrations,\n nodeUrls: NODE_URLS,\n\n requestOptions: { retry: { backoffMultiplier: 2, baseDelay: 300, maxDelay: 5000, maxRetries: 3 }, timeoutMs: 30000 },\n rpcUrls: RPC_URLS,\n wallets: Object.values(WalletOption),\n};\ntype SKState = typeof initialState;\n\nexport type SKConfigState = {\n apiKeys?: Partial<SKState[\"apiKeys\"]>;\n chains?: SKState[\"chains\"];\n envs?: Partial<SKState[\"envs\"]>;\n explorerUrls?: Partial<SKState[\"explorerUrls\"]>;\n integrations?: Partial<SKConfigIntegrations>;\n nodeUrls?: Partial<SKState[\"nodeUrls\"]>;\n rpcUrls?: Partial<SKState[\"rpcUrls\"]>;\n fallbackRpcUrls?: Partial<SKState[\"fallbackRpcUrls\"]>;\n wallets?: SKState[\"wallets\"];\n feeMultipliers?: FeeMultiplierConfig;\n};\n\ntype SwapKitConfigStore = SKState & {\n setApiKey: (key: keyof SKState[\"apiKeys\"], apiKey: string) => void;\n setConfig: (config: SKConfigState) => void;\n setEnv: <T extends keyof SKState[\"envs\"]>(key: T, value: SKState[\"envs\"][T]) => void;\n setExplorerUrl: (chain: keyof SKState[\"explorerUrls\"], url: string) => void;\n setNodeUrl: (chain: keyof SKState[\"nodeUrls\"], url: string) => void;\n setRpcUrl: (chain: keyof SKState[\"rpcUrls\"], url: string) => void;\n setRequestOptions: (options: Partial<SKState[\"requestOptions\"]>) => void;\n setFallbackRpcUrls: <T extends keyof SKState[\"fallbackRpcUrls\"]>(\n chain: T,\n urls: SKState[\"fallbackRpcUrls\"][T],\n ) => void;\n setIntegrationConfig: (\n integration: keyof SKState[\"integrations\"],\n config: SKConfigIntegrations[keyof SKConfigIntegrations],\n ) => void;\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => void;\n};\n\nconst swapKitState = createStore<SwapKitConfigStore>((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 envs: { ...s.envs, ...config.envs },\n explorerUrls: { ...s.explorerUrls, ...config.explorerUrls },\n feeMultipliers: config.feeMultipliers || s.feeMultipliers,\n integrations: { ...s.integrations, ...config.integrations },\n nodeUrls: { ...s.nodeUrls, ...config.nodeUrls } as typeof s.nodeUrls,\n rpcUrls: { ...s.rpcUrls, ...config.rpcUrls },\n wallets: s.wallets.concat(config.wallets || []),\n })),\n setEnv: (key, value) => set((s) => ({ envs: { ...s.envs, [key]: value } })),\n setExplorerUrl: (chain, url) => set((s) => ({ explorerUrls: { ...s.explorerUrls, [chain]: url } })),\n setFallbackRpcUrls: (chain, urls) => set((s) => ({ fallbackRpcUrls: { ...s.fallbackRpcUrls, [chain]: urls } })),\n setFeeMultipliers: (multipliers) => set(() => ({ feeMultipliers: multipliers })),\n setIntegrationConfig: (integration, config) =>\n set((s) => ({ integrations: { ...s.integrations, [integration]: config } })),\n setNodeUrl: (chain, url) => set((s) => ({ nodeUrls: { ...s.nodeUrls, [chain]: url } as typeof s.nodeUrls })),\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 SKConfig = {\n get: <T extends keyof SKState>(key: T) => swapKitState.getState()[key],\n getState: swapKitState.getState,\n set: <T extends SKConfigState>(config: T) => swapKitState.getState().setConfig(config),\n\n setApiKey: <T extends keyof SKState[\"apiKeys\"]>(key: T, apiKey: string) =>\n swapKitState.getState().setApiKey(key, apiKey),\n setEnv: <T extends keyof SKState[\"envs\"]>(key: T, value: SKState[\"envs\"][T]) =>\n swapKitState.getState().setEnv(key, value),\n setExplorerUrl: <T extends keyof SKState[\"explorerUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setExplorerUrl(chain, url),\n setFallbackRpcUrls: <T extends keyof SKState[\"fallbackRpcUrls\"]>(chain: T, urls: SKState[\"fallbackRpcUrls\"][T]) =>\n swapKitState.getState().setFallbackRpcUrls(chain, urls),\n setFeeMultipliers: (multipliers: FeeMultiplierConfig) => swapKitState.getState().setFeeMultipliers(multipliers),\n setIntegrationConfig: <T extends keyof SKState[\"integrations\"]>(integration: T, config: SKConfigIntegrations[T]) =>\n swapKitState.getState().setIntegrationConfig(integration, config),\n setNodeUrl: <T extends keyof SKState[\"nodeUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setNodeUrl(chain, url),\n setRequestOptions: (options: SKState[\"requestOptions\"]) => swapKitState.getState().setRequestOptions(options),\n setRpcUrl: <T extends keyof SKState[\"rpcUrls\"]>(chain: T, url: string) =>\n swapKitState.getState().setRpcUrl(chain, url),\n};\n",
|
|
9
|
-
"import { Chain, getChainConfig, StagenetChain } from \"@swapkit/types\";\n\n/**\n * Note: RPC_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const rpcUrl = RPC_URLS[Chain.Ethereum];\n * +const { rpcUrls: [rpcUrl] } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const RPC_URLS: Record<Chain | StagenetChain, string> = {\n [Chain.Arbitrum]: \"https://arb1.arbitrum.io/rpc\",\n [Chain.Aurora]: \"https://aurora-rpc.publicnode.com\",\n [Chain.Avalanche]: \"https://api.avax.network/ext/bc/C/rpc\",\n [Chain.Base]: \"https://base-rpc.publicnode.com\",\n [Chain.Berachain]: \"https://berachain-rpc.publicnode.com\",\n [Chain.BinanceSmartChain]: \"https://bsc-dataseed.binance.org\",\n [Chain.BitcoinCash]: \"https://node-router.thorswap.net/bitcoin-cash\",\n [Chain.Bitcoin]: \"https://bitcoin-rpc.publicnode.com\",\n [Chain.Chainflip]: \"wss://mainnet-archive.chainflip.io\",\n [Chain.Cosmos]: \"https://cosmos-rpc.publicnode.com:443\",\n [Chain.Dash]: \"https://dash-rpc.publicnode.com\",\n [Chain.Dogecoin]: \"https://node-router.thorswap.net/dogecoin\",\n [Chain.Ethereum]: \"https://ethereum-rpc.publicnode.com\",\n [Chain.Gnosis]: \"https://gnosis-rpc.publicnode.com\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [Chain.Kujira]: \"https://kujira-rpc.ibs.team\",\n [Chain.Litecoin]: \"https://node-router.thorswap.net/litecoin\",\n [Chain.Maya]: \"https://tendermint.mayachain.info\",\n [Chain.Near]: \"https://rpc.mainnet.near.org\",\n [Chain.Noble]: \"https://noble-rpc.polkachu.com\",\n [Chain.Optimism]: \"https://mainnet.optimism.io\",\n [Chain.Polkadot]: \"wss://rpc.polkadot.io\",\n [Chain.Polygon]: \"https://polygon-rpc.com\",\n // TODO - Update Radix RPC URL when available\n [Chain.Radix]: \"https://radix-mainnet.rpc.grove.city/v1/326002fc/core\",\n [Chain.Ripple]: \"wss://xrpl.ws/\",\n [Chain.Solana]: \"https://solana-rpc.publicnode.com\",\n [Chain.THORChain]: \"https://rpc.ninerealms.com\",\n [Chain.Tron]: \"https://tron-rpc.publicnode.com\",\n [Chain.Zcash]:\n \"https://api.tatum.io/v3/blockchain/node/zcash-mainnet/t-6894a2ae7fc90cccfd3ce71b-2fce88aa7f4a41a5b1e93874\",\n [StagenetChain.Maya]: \"\",\n [StagenetChain.THORChain]: \"https://stagenet-rpc.ninerealms.com\",\n // WIP - might change\n [StagenetChain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n};\n\nexport const NODE_URLS = {\n [Chain.THORChain]: \"https://thornode.ninerealms.com\",\n [Chain.Maya]: \"https://mayanode.mayachain.info\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [StagenetChain.THORChain]: \"https://stagenet-thornode.ninerealms.com\",\n [StagenetChain.Maya]: \"https://stagenet.mayanode.mayachain.info\",\n};\n\n/**\n * Note: FALLBACK_URLS has been removed in favor of supporting multiple RPC URLs.\n * This export will be discontinued in future versions.\n */\nexport const FALLBACK_URLS: Record<Chain | StagenetChain, string[]> = {\n [Chain.Arbitrum]: [\"https://arb-mainnet.g.alchemy.com/v2/demo\", \"https://arbitrum.blockpi.network/v1/rpc/public\"],\n [Chain.Aurora]: [\"https://1rpc.io/aurora\", \"https://mainnet.aurora.dev\"],\n [Chain.Avalanche]: [\"https://api.avax.network/ext/bc/C/rpc\", \"https://avalanche-c-chain-rpc.publicnode.com\"],\n [Chain.Base]: [\"https://base.blockpi.network/v1/rpc/public\", \"https://1rpc.io/base\"],\n [Chain.BinanceSmartChain]: [\"https://bsc-rpc.gateway.pokt.network\", \"https://bsc-dataseed2.binance.org\"],\n [Chain.Berachain]: [\"https://rpc.berachain.com\", \"https://berachain.drpc.org\"],\n [Chain.Bitcoin]: [\"https://bitcoin.publicnode.com\"],\n [Chain.BitcoinCash]: [\"https://bch-dataseed.binance.org\", \"https://bch.getblock.io/mainnet\"],\n [Chain.Chainflip]: [\"wss://archive-1.mainnet.chainflip.io\", \"wss://archive-2.mainnet.chainflip.io\"],\n [Chain.Cosmos]: [\"https://cosmos-rpc.publicnode.com\"],\n [Chain.Dash]: [\"https://dash-rpc.publicnode.com\"],\n [Chain.Dogecoin]: [\"https://doge.getblock.io/mainnet\", \"https://dogecoin.publicnode.com\"],\n [Chain.Ethereum]: [\"https://eth.llamarpc.com\", \"https://cloudflare-eth.com\"],\n [Chain.Gnosis]: [\"https://gnosis.drpc.org\", \"https://rpc.ankr.com/gnosis\"],\n [Chain.Harbor]: [],\n [Chain.Kujira]: [\"https://kujira-rpc.polkachu.com\", \"https://rpc-kujira.synergynodes.com/\"],\n [Chain.Litecoin]: [\"https://ltc.getblock.io/mainnet\", \"https://litecoin.publicnode.com\"],\n [Chain.Maya]: [\"https://tendermint.mayachain.info\", \"https://maya-tendermint.publicnode.com\"],\n [StagenetChain.Maya]: [],\n [Chain.Near]: [\n \"https://1rpc.io/near\",\n \"https://near.lava.build\",\n \"https://near-mainnet.infura.io/v3/3cbfcafa5e1e48b7bb0ea41f2fbc4abf\",\n ],\n [Chain.Noble]: [\"https://rpc.noble.xyz\", \"https://rpc.cosmos.directory/noble\"],\n [Chain.Optimism]: [\"https://optimism.llamarpc.com\", \"https://1rpc.io/op\"],\n [Chain.Polkadot]: [\"wss://polkadot-rpc.dwellir.com\", \"wss://polkadot.api.onfinality.io/public-ws\"],\n [Chain.Polygon]: [\"https://polygon.llamarpc.com\", \"https://polygon-bor-rpc.publicnode.com\"],\n [Chain.Radix]: [\"https://mainnet.radixdlt.com\", \"https://radix-mainnet.rpc.grove.city/v1\"],\n [Chain.Ripple]: [\"wss://s1.ripple.com/\", \"wss://s2.ripple.com/\"],\n [Chain.THORChain]: [\"https://thornode.ninerealms.com\", NODE_URLS[Chain.THORChain]],\n [StagenetChain.THORChain]: [],\n [StagenetChain.Harbor]: [],\n [Chain.Solana]: [\"https://api.mainnet-beta.solana.com\", \"https://solana-mainnet.rpc.extrnode.com\"],\n [Chain.Tron]: [\"https://api.tronstack.io\", \"https://api.tron.network\"],\n [Chain.Zcash]: [],\n};\n\n/**\n * Note: EXPLORER_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const explorerUrl = EXPLORER_URLS[Chain.Ethereum];\n * +const {
|
|
9
|
+
"import { Chain, getChainConfig, StagenetChain } from \"@swapkit/types\";\n\n/**\n * Note: RPC_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const rpcUrl = RPC_URLS[Chain.Ethereum];\n * +const { rpcUrls: [rpcUrl] } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const RPC_URLS: Record<Chain | StagenetChain, string> = {\n [Chain.Arbitrum]: \"https://arb1.arbitrum.io/rpc\",\n [Chain.Aurora]: \"https://aurora-rpc.publicnode.com\",\n [Chain.Avalanche]: \"https://api.avax.network/ext/bc/C/rpc\",\n [Chain.Base]: \"https://base-rpc.publicnode.com\",\n [Chain.Berachain]: \"https://berachain-rpc.publicnode.com\",\n [Chain.BinanceSmartChain]: \"https://bsc-dataseed.binance.org\",\n [Chain.BitcoinCash]: \"https://node-router.thorswap.net/bitcoin-cash\",\n [Chain.Bitcoin]: \"https://bitcoin-rpc.publicnode.com\",\n [Chain.Chainflip]: \"wss://mainnet-archive.chainflip.io\",\n [Chain.Cosmos]: \"https://cosmos-rpc.publicnode.com:443\",\n [Chain.Dash]: \"https://dash-rpc.publicnode.com\",\n [Chain.Dogecoin]: \"https://node-router.thorswap.net/dogecoin\",\n [Chain.Ethereum]: \"https://ethereum-rpc.publicnode.com\",\n [Chain.Gnosis]: \"https://gnosis-rpc.publicnode.com\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [Chain.Kujira]: \"https://kujira-rpc.ibs.team\",\n [Chain.Litecoin]: \"https://node-router.thorswap.net/litecoin\",\n [Chain.Maya]: \"https://tendermint.mayachain.info\",\n [Chain.Near]: \"https://rpc.mainnet.near.org\",\n [Chain.Noble]: \"https://noble-rpc.polkachu.com\",\n [Chain.Optimism]: \"https://mainnet.optimism.io\",\n [Chain.Polkadot]: \"wss://rpc.polkadot.io\",\n [Chain.Polygon]: \"https://polygon-rpc.com\",\n // TODO - Update Radix RPC URL when available\n [Chain.Radix]: \"https://radix-mainnet.rpc.grove.city/v1/326002fc/core\",\n [Chain.Ripple]: \"wss://xrpl.ws/\",\n [Chain.Solana]: \"https://solana-rpc.publicnode.com\",\n [Chain.THORChain]: \"https://rpc.ninerealms.com\",\n [Chain.Tron]: \"https://tron-rpc.publicnode.com\",\n [Chain.Zcash]:\n \"https://api.tatum.io/v3/blockchain/node/zcash-mainnet/t-6894a2ae7fc90cccfd3ce71b-2fce88aa7f4a41a5b1e93874\",\n [StagenetChain.Maya]: \"\",\n [StagenetChain.THORChain]: \"https://stagenet-rpc.ninerealms.com\",\n // WIP - might change\n [StagenetChain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n};\n\nexport const NODE_URLS = {\n [Chain.THORChain]: \"https://thornode.ninerealms.com\",\n [Chain.Maya]: \"https://mayanode.mayachain.info\",\n // WIP - might change\n [Chain.Harbor]: getChainConfig(Chain.Harbor).rpcUrl,\n [StagenetChain.THORChain]: \"https://stagenet-thornode.ninerealms.com\",\n [StagenetChain.Maya]: \"https://stagenet.mayanode.mayachain.info\",\n};\n\n/**\n * Note: FALLBACK_URLS has been removed in favor of supporting multiple RPC URLs.\n * This export will be discontinued in future versions.\n */\nexport const FALLBACK_URLS: Record<Chain | StagenetChain, string[]> = {\n [Chain.Arbitrum]: [\"https://arb-mainnet.g.alchemy.com/v2/demo\", \"https://arbitrum.blockpi.network/v1/rpc/public\"],\n [Chain.Aurora]: [\"https://1rpc.io/aurora\", \"https://mainnet.aurora.dev\"],\n [Chain.Avalanche]: [\"https://api.avax.network/ext/bc/C/rpc\", \"https://avalanche-c-chain-rpc.publicnode.com\"],\n [Chain.Base]: [\"https://base.blockpi.network/v1/rpc/public\", \"https://1rpc.io/base\"],\n [Chain.BinanceSmartChain]: [\"https://bsc-rpc.gateway.pokt.network\", \"https://bsc-dataseed2.binance.org\"],\n [Chain.Berachain]: [\"https://rpc.berachain.com\", \"https://berachain.drpc.org\"],\n [Chain.Bitcoin]: [\"https://bitcoin.publicnode.com\"],\n [Chain.BitcoinCash]: [\"https://bch-dataseed.binance.org\", \"https://bch.getblock.io/mainnet\"],\n [Chain.Chainflip]: [\"wss://archive-1.mainnet.chainflip.io\", \"wss://archive-2.mainnet.chainflip.io\"],\n [Chain.Cosmos]: [\"https://cosmos-rpc.publicnode.com\"],\n [Chain.Dash]: [\"https://dash-rpc.publicnode.com\"],\n [Chain.Dogecoin]: [\"https://doge.getblock.io/mainnet\", \"https://dogecoin.publicnode.com\"],\n [Chain.Ethereum]: [\"https://eth.llamarpc.com\", \"https://cloudflare-eth.com\"],\n [Chain.Gnosis]: [\"https://gnosis.drpc.org\", \"https://rpc.ankr.com/gnosis\"],\n [Chain.Harbor]: [],\n [Chain.Kujira]: [\"https://kujira-rpc.polkachu.com\", \"https://rpc-kujira.synergynodes.com/\"],\n [Chain.Litecoin]: [\"https://ltc.getblock.io/mainnet\", \"https://litecoin.publicnode.com\"],\n [Chain.Maya]: [\"https://tendermint.mayachain.info\", \"https://maya-tendermint.publicnode.com\"],\n [StagenetChain.Maya]: [],\n [Chain.Near]: [\n \"https://1rpc.io/near\",\n \"https://near.lava.build\",\n \"https://near-mainnet.infura.io/v3/3cbfcafa5e1e48b7bb0ea41f2fbc4abf\",\n ],\n [Chain.Noble]: [\"https://rpc.noble.xyz\", \"https://rpc.cosmos.directory/noble\"],\n [Chain.Optimism]: [\"https://optimism.llamarpc.com\", \"https://1rpc.io/op\"],\n [Chain.Polkadot]: [\"wss://polkadot-rpc.dwellir.com\", \"wss://polkadot.api.onfinality.io/public-ws\"],\n [Chain.Polygon]: [\"https://polygon.llamarpc.com\", \"https://polygon-bor-rpc.publicnode.com\"],\n [Chain.Radix]: [\"https://mainnet.radixdlt.com\", \"https://radix-mainnet.rpc.grove.city/v1\"],\n [Chain.Ripple]: [\"wss://s1.ripple.com/\", \"wss://s2.ripple.com/\"],\n [Chain.THORChain]: [\"https://thornode.ninerealms.com\", NODE_URLS[Chain.THORChain]],\n [StagenetChain.THORChain]: [],\n [StagenetChain.Harbor]: [],\n [Chain.Solana]: [\"https://api.mainnet-beta.solana.com\", \"https://solana-mainnet.rpc.extrnode.com\"],\n [Chain.Tron]: [\"https://api.tronstack.io\", \"https://api.tron.network\"],\n [Chain.Zcash]: [],\n};\n\n/**\n * Note: EXPLORER_URLS will be discontinued in future versions.\n * Please use getChainConfig instead.\n * @example\n * ```diff\n * -const explorerUrl = EXPLORER_URLS[Chain.Ethereum];\n * +const { explorerUrl } = getChainConfig(Chain.Ethereum);\n * ```\n */\nexport const EXPLORER_URLS: Record<Chain, string> = {\n [Chain.Arbitrum]: \"https://arbiscan.io\",\n [Chain.Aurora]: \"https://explorer.mainnet.aurora.dev\",\n [Chain.Avalanche]: \"https://snowtrace.io\",\n [Chain.Base]: \"https://basescan.org\",\n [Chain.Berachain]: \"https://berascan.com\",\n [Chain.BinanceSmartChain]: \"https://bscscan.com\",\n [Chain.Bitcoin]: \"https://blockchair.com/bitcoin\",\n [Chain.BitcoinCash]: \"https://www.blockchair.com/bitcoin-cash\",\n [Chain.Chainflip]: \"https://explorer.polkascan.io/polkadot\",\n [Chain.Cosmos]: \"https://www.mintscan.io/cosmos\",\n [Chain.Dash]: \"https://blockchair.com/dash\",\n [Chain.Dogecoin]: \"https://blockchair.com/dogecoin\",\n [Chain.Ethereum]: \"https://etherscan.io\",\n [Chain.Gnosis]: \"https://gnosisscan.io\",\n [Chain.Harbor]: \"\",\n [Chain.Kujira]: \"https://finder.kujira.network/kaiyo-1\",\n [Chain.Litecoin]: \"https://blockchair.com/litecoin\",\n [Chain.Maya]: \"https://www.mayascan.org\",\n [Chain.Near]: \"https://nearblocks.io\",\n [Chain.Noble]: \"https://www.mintscan.io/noble\",\n [Chain.Optimism]: \"https://optimistic.etherscan.io\",\n [Chain.Polkadot]: \"https://polkadot.subscan.io\",\n [Chain.Polygon]: \"https://polygonscan.com\",\n [Chain.Radix]: \"https://dashboard.radixdlt.com\",\n [Chain.Ripple]: \"https://livenet.xrpl.org/\",\n [Chain.THORChain]: \"https://runescan.io\",\n [Chain.Solana]: \"https://solscan.io\",\n [Chain.Tron]: \"https://tronscan.org\",\n [Chain.Zcash]: \"https://blockchair.com/zcash\",\n};\n",
|
|
10
10
|
"import type { Chain } from \"@swapkit/types\";\n\nexport enum ContractAddress {\n ARB = \"0x0000000000000000000000000000000000000000\",\n AURORA = \"0x0000000000000000000000000000000000000000\",\n AVAX = \"0x0000000000000000000000000000000000000000\",\n BASE = \"0x0000000000000000000000000000000000000000\",\n BERA = \"0x0000000000000000000000000000000000000000\",\n ETH = \"0x0000000000000000000000000000000000000000\",\n BSC = \"0x0000000000000000000000000000000000000000\",\n GNO = \"0x0000000000000000000000000000000000000000\",\n MATIC = \"0x0000000000000000000000000000000000001010\",\n OP = \"0x4200000000000000000000000000000000000042\",\n}\n\nexport type DerivationPathArray = [number, number, number, number, number?];\n\nexport const NetworkDerivationPath: Record<Chain, DerivationPathArray> = {\n ARB: [44, 60, 0, 0, 0],\n AURORA: [44, 60, 0, 0, 0],\n AVAX: [44, 60, 0, 0, 0],\n BASE: [44, 60, 0, 0, 0],\n BCH: [44, 145, 0, 0, 0],\n BERA: [44, 60, 0, 0, 0],\n BSC: [44, 60, 0, 0, 0],\n BTC: [84, 0, 0, 0, 0],\n DASH: [44, 5, 0, 0, 0],\n DOGE: [44, 3, 0, 0, 0],\n DOT: [0, 0, 0, 0, 0],\n ETH: [44, 60, 0, 0, 0],\n FLIP: [0, 0, 0, 0, 0],\n GAIA: [44, 118, 0, 0, 0],\n GNO: [44, 60, 0, 0, 0],\n HARBOR: [44, 931, 0, 0, 0],\n KUJI: [44, 118, 0, 0, 0],\n LTC: [84, 2, 0, 0, 0],\n MAYA: [44, 931, 0, 0, 0],\n NEAR: [44, 397, 0, 0, 0],\n NOBLE: [44, 118, 0, 0, 0],\n OP: [44, 60, 0, 0, 0],\n POL: [44, 60, 0, 0, 0],\n SOL: [44, 501, 0, 0, 0],\n THOR: [44, 931, 0, 0, 0],\n TRON: [44, 195, 0, 0, 0],\n XRD: [0, 0, 0, 0, 0],\n XRP: [44, 144, 0, 0, 0],\n ZEC: [44, 133, 0, 0, 0],\n};\n",
|
|
11
11
|
"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}\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}\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}\n",
|
|
12
12
|
"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",
|
|
@@ -27,7 +27,7 @@ export declare const FALLBACK_URLS: Record<Chain | StagenetChain, string[]>;
|
|
|
27
27
|
* @example
|
|
28
28
|
* ```diff
|
|
29
29
|
* -const explorerUrl = EXPLORER_URLS[Chain.Ethereum];
|
|
30
|
-
* +const {
|
|
30
|
+
* +const { explorerUrl } = getChainConfig(Chain.Ethereum);
|
|
31
31
|
* ```
|
|
32
32
|
*/
|
|
33
33
|
export declare const EXPLORER_URLS: Record<Chain, string>;
|
package/package.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"author": "swapkit-oss",
|
|
3
3
|
"dependencies": {
|
|
4
4
|
"@swapkit/contracts": "4.0.1",
|
|
5
|
-
"@swapkit/tokens": "4.0.
|
|
6
|
-
"@swapkit/types": "0.1.
|
|
5
|
+
"@swapkit/tokens": "4.0.27",
|
|
6
|
+
"@swapkit/types": "0.1.4",
|
|
7
7
|
"ethers": "^6.14.0",
|
|
8
8
|
"ts-pattern": "^5.7.0",
|
|
9
9
|
"zod": "^3.25.74",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"description": "SwapKit - Helpers",
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"@swapkit/toolboxes": "4.0.
|
|
14
|
+
"@swapkit/toolboxes": "4.0.27",
|
|
15
15
|
"ethers": "6.15.0",
|
|
16
16
|
"ts-pattern": "5.8.0",
|
|
17
17
|
"zod": "3.25.74",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"type-check:go": "tsgo"
|
|
48
48
|
},
|
|
49
49
|
"type": "module",
|
|
50
|
-
"version": "4.0.
|
|
50
|
+
"version": "4.0.27"
|
|
51
51
|
}
|