@swapkit/core 1.0.0-rc.17 → 1.0.0-rc.171

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.
Files changed (35) hide show
  1. package/dist/index.js +3 -0
  2. package/dist/index.js.map +12 -0
  3. package/package.json +28 -49
  4. package/src/__tests__/helpers.test.ts +65 -0
  5. package/src/client.ts +457 -0
  6. package/src/helpers/explorerUrls.ts +45 -0
  7. package/src/index.ts +6 -4
  8. package/src/types.ts +44 -0
  9. package/LICENSE +0 -201
  10. package/dist/index-9e36735e.cjs +0 -1
  11. package/dist/index-cf1865cd.js +0 -649
  12. package/dist/index.cjs +0 -2
  13. package/dist/index.d.ts +0 -216
  14. package/dist/index.es.js +0 -4181
  15. package/src/aggregator/contracts/avaxGeneric.ts +0 -92
  16. package/src/aggregator/contracts/avaxWoofi.ts +0 -145
  17. package/src/aggregator/contracts/bscGeneric.ts +0 -106
  18. package/src/aggregator/contracts/ethGeneric.ts +0 -92
  19. package/src/aggregator/contracts/index.ts +0 -74
  20. package/src/aggregator/contracts/pancakeV2.ts +0 -145
  21. package/src/aggregator/contracts/pangolin.ts +0 -120
  22. package/src/aggregator/contracts/sushiswap.ts +0 -120
  23. package/src/aggregator/contracts/traderJoe.ts +0 -120
  24. package/src/aggregator/contracts/uniswapV2.ts +0 -120
  25. package/src/aggregator/contracts/uniswapV2Leg.ts +0 -128
  26. package/src/aggregator/contracts/uniswapV3_100.ts +0 -128
  27. package/src/aggregator/contracts/uniswapV3_10000.ts +0 -128
  28. package/src/aggregator/contracts/uniswapV3_3000.ts +0 -128
  29. package/src/aggregator/contracts/uniswapV3_500.ts +0 -128
  30. package/src/aggregator/getSwapParams.ts +0 -70
  31. package/src/client/__tests__/helpers.test.ts +0 -69
  32. package/src/client/explorerUrls.ts +0 -62
  33. package/src/client/index.ts +0 -699
  34. package/src/client/thornode.ts +0 -31
  35. package/src/client/types.ts +0 -103
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export*from"@swapkit/api";export*from"@swapkit/helpers";import{stripToCashAddress as Ix} from"@swapkit/toolbox-utxo";import{lowercasedContractAbiMapping as M} from"@swapkit/contracts";import{ApproveMode as j,AssetValue as G,Chain as k,EVMChains as l,ProviderName as e,SwapKitError as q,isGasAsset as a} from"@swapkit/helpers";import{estimateTransactionFee as xx,cosmosValidateAddress as ox} from"@swapkit/toolbox-cosmos";import{evmValidateAddress as Tx} from"@swapkit/toolbox-evm";import{substrateValidateAddress as $x} from"@swapkit/toolbox-substrate";import{utxoValidateAddress as kx} from"@swapkit/toolbox-utxo";import{Chain as y,ChainToExplorerUrl as F,SwapKitError as s} from"@swapkit/helpers";function O({chain:J,txHash:_}){const L=F[J];switch(J){case y.Binance:case y.Maya:case y.Kujira:case y.Cosmos:case y.THORChain:case y.Solana:return`${L}/tx/${_.startsWith("0x")?_.slice(2):_}`;case y.Arbitrum:case y.Avalanche:case y.BinanceSmartChain:case y.Ethereum:case y.Optimism:case y.Polkadot:case y.Polygon:return`${L}/tx/${_.startsWith("0x")?_:`0x${_}`}`;case y.Litecoin:case y.Bitcoin:case y.BitcoinCash:case y.Dogecoin:return`${L}/transaction/${_.toLowerCase()}`;default:throw new s({errorKey:"core_explorer_unsupported_chain",info:{chain:J}})}}function S({chain:J,address:_}){const L=F[J];switch(J){case y.Solana:return`${L}/account/${_}`;default:return`${L}/address/${_}`}}function Jx({apis:J={},config:_={},plugins:L,rpcUrls:m={},stagenet:W=!1,wallets:I}){const v=Array.isArray(L)?L.reduce((x,o)=>{const{name:T,plugin:$}=Object.values(o)?.[0]||{};return x[T]=$,x},{}):L,N=Array.isArray(I)?I.reduce((x,o)=>{const[T,$]=Object.entries(o)?.[0]||{};return x[T]=$,x},{}):I,X={},Q=Object.entries(v).reduce((x,[o,{plugin:T,config:$}])=>{const B=T({wallets:X,stagenet:W,config:$??_});return x[o]=B,x},{}),K=Object.entries(N).reduce((x,[o,T])=>{const $=T({addChain:w,config:_,apis:J,rpcUrls:m});return x[o]=$,x},{});function A(x){const o=Q[x]||Object.values(Q)[0];if(!o)throw new q("core_plugin_not_found","Could not find the requested plugin");return o}function V(x){const o=Object.values(Q).find((T)=>T.supportedSwapkitProviders?.includes(x));if(!o)throw new q("core_plugin_not_found","Could not find the requested plugin");return o}function w(x){X[x.chain]=x}function f({assetValue:x,type:o="checkOnly",contractAddress:T}){const $=Q[T];if($){if(o===j.CheckOnly&&"isAssetValueApproved"in $)return $.isAssetValueApproved({assetValue:x});if(o===j.Approve&&"approveAssetValue"in $)return $.approveAssetValue({assetValue:x});throw new q("core_approve_asset_target_invalid",`Target ${String(T)} cannot be used for approve operation`)}const{address:B,chain:R,isGasAsset:U,isSynthetic:P}=x,z=l.includes(R);if(z&&U||!z||P)return Promise.resolve(o==="checkOnly"?!0:"approved");const Z=X[R],b=o==="checkOnly"?Z?.isApproved:Z?.approve;if(!b)throw new q("core_wallet_connection_not_found");const D=C(R);if(!(B&&D&&typeof T==="string"))throw new q("core_approve_asset_address_or_from_not_found");return b({amount:x.getBaseValue("bigint"),assetAddress:B,from:D,spenderAddress:T})}function Y(x){return X[x]}function h(){return{...X}}function C(x){return Y(x)?.address||""}function r({address:x,chain:o}){switch(o){case k.Arbitrum:case k.Avalanche:case k.Optimism:case k.BinanceSmartChain:case k.Polygon:case k.Ethereum:return Tx({address:x});case k.Polkadot:return $x({address:x,chain:o});case k.Litecoin:case k.Dash:case k.Dogecoin:case k.BitcoinCash:case k.Bitcoin:return kx({address:x,chain:o});case k.Cosmos:case k.Kujira:case k.Maya:case k.THORChain:return ox({address:x,chain:o})}return!1}function g(x,o){if(o)return E(x).then((T)=>T.balance);return Y(x)?.balance||[]}async function E(x,o=!0){const T=[G.fromChainOrSignature(x)],$=Y(x);if(!$)throw new q("core_wallet_connection_not_found");if("getBalance"in $){const B=await $.getBalance($.address,o);$.balance=B?.length?B:T}return $}function u(x,o){return f({assetValue:x,contractAddress:o,type:j.Approve})}function p(x,o){return f({assetValue:x,contractAddress:o,type:j.CheckOnly})}function d({route:x,pluginName:o,...T}){const $=o&&A(o)||V(x.providers[0]);if(!$)throw new q("core_swap_route_not_complete");if("swap"in $)return $.swap({...T,route:x});throw new q("core_plugin_swap_not_found")}function c({from:x,recipient:o,assetValue:T,feeOptionKey:$}){const B=T.chain,R=X[B];if(!R)throw new q("core_wallet_connection_not_found");return R.transfer({from:x,recipient:o,assetValue:T,feeOptionKey:$})}function i(){for(let x of Object.keys(X)){const o=X[x];if("disconnect"in o)o.disconnect();delete X[x]}}function t(x){const T=X[x]?.disconnect;if(T)T();delete X[x]}async function n({type:x,feeOptionKey:o,params:T}){const{assetValue:$}=T,B=T.assetValue.chain;if(!X[B])throw new q("core_wallet_connection_not_found");const R=G.fromChainOrSignature(B,0);switch(B){case k.Arbitrum:case k.Avalanche:case k.Ethereum:case k.BinanceSmartChain:case k.Polygon:{const U=X[B];switch(x){case"transfer":{const P=await U.createTransferTx(T);return U.estimateTransactionFee(P,o)}case"approve":{if(a($))return R;return U.estimateTransactionFee(await U.createApprovalTx({assetAddress:$.address,spenderAddress:T.contractAddress,amount:$.getBaseValue("bigint"),from:U.address}),o)}case"swap":{if(T.route.providers[0]===e.CHAINFLIP){const Z=await U.createTransferTx({from:U.address,recipient:U.address,assetValue:$});return U.estimateTransactionFee(Z,o)}const{evmTransactionDetails:z}=T.route;if(!(z&&M[z.contractAddress]))return;const H=await U.estimateCall({contractAddress:z.contractAddress,abi:M[z.contractAddress],funcName:z.contractMethod,funcParams:z.contractParams});return G.fromChainOrSignature(B,H)}default:return R}}case k.Bitcoin:case k.BitcoinCash:case k.Dogecoin:case k.Dash:case k.Litecoin:{const{estimateMaxSendableAmount:U,address:P}=X[B];return U({...T,feeOptionKey:o,from:P,recipient:P})}case k.THORChain:case k.Maya:case k.Kujira:case k.Cosmos:return xx(T);case k.Polkadot:{const U=X[B];return U.estimateTransactionFee({...T,recipient:U.address})}default:return R}}return{...Q,...K,approveAssetValue:u,getAddress:C,getBalance:g,getExplorerAddressUrl:S,getExplorerTxUrl:O,getWallet:Y,getAllWallets:h,getWalletWithBalance:E,isAssetValueApproved:p,estimateTransactionFee:n,swap:d,transfer:c,validateAddress:r,disconnectAll:i,disconnectChain:t}}export{Ix as stripToCashAddress,Jx as SwapKit};
2
+
3
+ //# debugId=C3F79993405C735C64756E2164756E21
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/client.ts", "../src/helpers/explorerUrls.ts"],
4
+ "sourcesContent": [
5
+ "export * from \"@swapkit/api\";\nexport * from \"@swapkit/helpers\";\nexport { stripToCashAddress } from \"@swapkit/toolbox-utxo\";\n\nexport * from \"./client.ts\";\nexport * from \"./types.ts\";\n",
6
+ "import { lowercasedContractAbiMapping } from \"@swapkit/contracts\";\nimport {\n type AddChainWalletParams,\n ApproveMode,\n type ApproveReturnType,\n AssetValue,\n Chain,\n type ConnectConfig,\n type EVMChain,\n EVMChains,\n type FeeOption,\n ProviderName as PluginNameEnum,\n SwapKitError,\n type SwapParams,\n type UTXOChain,\n type WalletChain,\n isGasAsset,\n} from \"@swapkit/helpers\";\nimport {\n type TransferParams as CosmosTransferParams,\n estimateTransactionFee as cosmosTransactionFee,\n cosmosValidateAddress,\n} from \"@swapkit/toolbox-cosmos\";\nimport {\n type BaseEVMWallet,\n type TransferParams as EVMTransferParams,\n evmValidateAddress,\n} from \"@swapkit/toolbox-evm\";\nimport { substrateValidateAddress } from \"@swapkit/toolbox-substrate\";\nimport { type UTXOTransferParams, utxoValidateAddress } from \"@swapkit/toolbox-utxo\";\n\nimport {\n getExplorerAddressUrl as getAddressUrl,\n getExplorerTxUrl as getTxUrl,\n} from \"./helpers/explorerUrls.ts\";\nimport type { Apis, SwapKitPluginInterface, SwapKitWallet, Wallet } from \"./types.ts\";\n\nexport function SwapKit<\n Plugins extends { [key in string]: SwapKitPluginInterface<{ [key in string]: Todo }> },\n Wallets extends { [key in string]: SwapKitWallet<NotWorth[]> },\n>({\n apis = {},\n config = {},\n plugins,\n rpcUrls = {},\n stagenet = false,\n wallets,\n}: {\n apis?: Apis;\n config?: ConnectConfig;\n plugins: Plugins;\n rpcUrls?: { [key in Chain]?: string };\n stagenet?: boolean;\n wallets: Wallets;\n}) {\n type PluginName = keyof Plugins;\n\n /**\n * @REMOVE (V1)\n * Compatibility layer for plugins and wallets for easier migration and backwards compatibility\n */\n const compatPlugins: Plugins = Array.isArray(plugins)\n ? plugins.reduce((acc, pluginInterface) => {\n // @ts-ignore Ignore until we remove the compatibility layer\n const { name, plugin } = Object.values(pluginInterface)?.[0] || {};\n acc[name] = plugin;\n return acc;\n }, {})\n : plugins;\n const compatWallets: Wallets = Array.isArray(wallets)\n ? wallets.reduce((acc, wallet) => {\n // @ts-ignore Ignore until we remove the compatibility layer\n const [walletName, connectWallet] = Object.entries(wallet)?.[0] || {};\n acc[walletName] = connectWallet;\n return acc;\n }, {})\n : wallets;\n\n const connectedWallets = {} as Wallet;\n const availablePlugins = Object.entries(compatPlugins).reduce(\n (acc, [pluginName, { plugin, config: pluginConfig }]) => {\n const methods = plugin({\n wallets: connectedWallets,\n stagenet,\n config: pluginConfig ?? config,\n });\n\n // @ts-expect-error\n acc[pluginName] = methods;\n return acc;\n },\n {} as { [key in PluginName]: ReturnType<Plugins[key][\"plugin\"]> },\n );\n\n const connectWalletMethods = Object.entries(compatWallets).reduce(\n (acc, [walletName, wallet]) => {\n const connectWallet = wallet({ addChain, config, apis, rpcUrls });\n\n // @ts-expect-error\n acc[walletName] = connectWallet;\n return acc;\n },\n {} as { [key in keyof Wallets]: ReturnType<Wallets[key]> },\n );\n\n /**\n * @Private\n */\n function getSwapKitPlugin<T extends PluginName>(pluginName: T) {\n const plugin = availablePlugins[pluginName] || Object.values(availablePlugins)[0];\n\n if (!plugin) {\n throw new SwapKitError(\"core_plugin_not_found\", \"Could not find the requested plugin\");\n }\n\n return plugin;\n }\n\n /**\n * @Private\n */\n function getSwapKitPluginForSKProvider(pluginName: PluginNameEnum): Plugins[keyof Plugins] {\n const plugin = Object.values(availablePlugins).find((plugin) =>\n plugin.supportedSwapkitProviders?.includes(pluginName),\n );\n\n if (!plugin) {\n throw new SwapKitError(\"core_plugin_not_found\", \"Could not find the requested plugin\");\n }\n\n return plugin;\n }\n\n function addChain<T extends Chain>(connectWallet: AddChainWalletParams<T>) {\n // @ts-expect-error: TODO\n connectedWallets[connectWallet.chain] = connectWallet;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n function approve<T extends ApproveMode>({\n assetValue,\n type = \"checkOnly\" as T,\n contractAddress: spenderAddress,\n }: {\n type: T;\n assetValue: AssetValue;\n contractAddress: string | PluginName;\n }) {\n const plugin = availablePlugins[spenderAddress];\n\n if (plugin) {\n if (type === ApproveMode.CheckOnly && \"isAssetValueApproved\" in plugin) {\n return plugin.isAssetValueApproved({ assetValue }) as ApproveReturnType<T>;\n }\n if (type === ApproveMode.Approve && \"approveAssetValue\" in plugin) {\n return plugin.approveAssetValue({ assetValue }) as ApproveReturnType<T>;\n }\n\n throw new SwapKitError(\n \"core_approve_asset_target_invalid\",\n `Target ${String(spenderAddress)} cannot be used for approve operation`,\n );\n }\n\n const { address, chain, isGasAsset, isSynthetic } = assetValue;\n const isEVMChain = EVMChains.includes(chain as EVMChain);\n const isNativeEVM = isEVMChain && isGasAsset;\n\n if (isNativeEVM || !isEVMChain || isSynthetic) {\n return Promise.resolve(type === \"checkOnly\" ? true : \"approved\") as ApproveReturnType<T>;\n }\n\n const walletMethods = connectedWallets[chain] as BaseEVMWallet;\n const walletAction = type === \"checkOnly\" ? walletMethods?.isApproved : walletMethods?.approve;\n if (!walletAction) throw new SwapKitError(\"core_wallet_connection_not_found\");\n\n const from = getAddress(chain);\n if (!(address && from && typeof spenderAddress === \"string\")) {\n throw new SwapKitError(\"core_approve_asset_address_or_from_not_found\");\n }\n\n return walletAction({\n amount: assetValue.getBaseValue(\"bigint\"),\n assetAddress: address,\n from,\n spenderAddress,\n }) as ApproveReturnType<T>;\n }\n\n /**\n * @Public\n */\n function getWallet<T extends Chain>(chain: T) {\n return connectedWallets[chain];\n }\n function getAllWallets() {\n return { ...connectedWallets };\n }\n function getAddress<T extends Chain>(chain: T) {\n return getWallet(chain)?.address || \"\";\n }\n\n function validateAddress({ address, chain }: { address: string; chain: Chain }) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Avalanche:\n case Chain.Optimism:\n case Chain.BinanceSmartChain:\n case Chain.Polygon:\n case Chain.Ethereum: {\n return evmValidateAddress({ address });\n }\n case Chain.Polkadot: {\n return substrateValidateAddress({ address, chain });\n }\n case Chain.Litecoin:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.BitcoinCash:\n case Chain.Bitcoin: {\n return utxoValidateAddress({ address, chain });\n }\n case Chain.Cosmos:\n case Chain.Kujira:\n case Chain.Maya:\n case Chain.THORChain: {\n return cosmosValidateAddress({ address, chain });\n }\n }\n return false;\n }\n\n function getBalance<T extends Chain>(chain: T, refresh?: boolean) {\n if (refresh) {\n return getWalletWithBalance(chain).then((wallet) => wallet.balance);\n }\n\n return getWallet(chain)?.balance || [];\n }\n\n async function getWalletWithBalance<T extends Chain>(chain: T, potentialScamFilter = true) {\n const defaultBalance = [AssetValue.fromChainOrSignature(chain)];\n const wallet = getWallet(chain);\n\n if (!wallet) {\n throw new SwapKitError(\"core_wallet_connection_not_found\");\n }\n\n if (\"getBalance\" in wallet) {\n // @ts-expect-error TODO add getBalance to radix\n const balance = await wallet.getBalance(wallet.address, potentialScamFilter);\n wallet.balance = balance?.length ? balance : defaultBalance;\n }\n\n return wallet;\n }\n\n function approveAssetValue(assetValue: AssetValue, contractAddress: string | PluginName) {\n return approve({ assetValue, contractAddress, type: ApproveMode.Approve });\n }\n\n function isAssetValueApproved(assetValue: AssetValue, contractAddress: string | PluginName) {\n return approve({ assetValue, contractAddress, type: ApproveMode.CheckOnly });\n }\n\n function swap<T extends PluginName>({ route, pluginName, ...rest }: SwapParams<T>) {\n const plugin =\n (pluginName && getSwapKitPlugin(pluginName)) ||\n getSwapKitPluginForSKProvider(route.providers[0] as PluginNameEnum);\n if (!plugin) throw new SwapKitError(\"core_swap_route_not_complete\");\n\n if (\"swap\" in plugin) {\n return plugin.swap({ ...rest, route });\n }\n\n throw new SwapKitError(\"core_plugin_swap_not_found\");\n }\n\n function transfer({\n from,\n recipient,\n assetValue,\n feeOptionKey,\n }: UTXOTransferParams | EVMTransferParams | CosmosTransferParams) {\n const chain = assetValue.chain as WalletChain;\n const wallet = connectedWallets[chain];\n if (!wallet) throw new SwapKitError(\"core_wallet_connection_not_found\");\n\n return wallet.transfer({ from, recipient, assetValue, feeOptionKey });\n }\n\n function disconnectAll() {\n for (const chain of Object.keys(connectedWallets)) {\n // @ts-expect-error: TODO\n const wallet = connectedWallets[chain];\n if (\"disconnect\" in wallet) {\n wallet.disconnect();\n }\n // @ts-expect-error: TODO\n delete connectedWallets[chain];\n }\n }\n\n function disconnectChain(chain: Chain) {\n const wallet = connectedWallets[chain];\n const disconnect = wallet?.disconnect;\n if (disconnect) {\n disconnect();\n }\n delete connectedWallets[chain];\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO clean this up\n async function estimateTransactionFee<T extends PluginName>({\n type,\n feeOptionKey,\n params,\n }: (\n | { type: \"swap\"; params: SwapParams<T> & { assetValue: AssetValue } }\n | {\n type: \"transfer\";\n params: UTXOTransferParams | EVMTransferParams | CosmosTransferParams;\n }\n | {\n type: \"approve\";\n params: {\n assetValue: AssetValue;\n contractAddress: string | PluginName;\n feeOptionKey?: FeeOption;\n };\n }\n ) & {\n feeOptionKey: FeeOption;\n }): Promise<AssetValue | undefined> {\n const { assetValue } = params;\n const chain = params.assetValue.chain as WalletChain;\n if (!connectedWallets[chain]) throw new SwapKitError(\"core_wallet_connection_not_found\");\n\n const baseValue = AssetValue.fromChainOrSignature(chain, 0);\n\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Avalanche:\n case Chain.Ethereum:\n case Chain.BinanceSmartChain:\n case Chain.Polygon: {\n const wallet = connectedWallets[chain as Exclude<EVMChain, Chain.Optimism>];\n switch (type) {\n case \"transfer\": {\n const txObject = await wallet.createTransferTx(params);\n return wallet.estimateTransactionFee(txObject, feeOptionKey);\n }\n\n case \"approve\": {\n if (isGasAsset(assetValue)) return baseValue;\n\n return wallet.estimateTransactionFee(\n await wallet.createApprovalTx({\n assetAddress: assetValue.address as string,\n spenderAddress: params.contractAddress as string,\n amount: assetValue.getBaseValue(\"bigint\"),\n from: wallet.address,\n }),\n feeOptionKey,\n );\n }\n\n case \"swap\": {\n const plugin = params.route.providers[0] as PluginNameEnum;\n if (plugin === PluginNameEnum.CHAINFLIP) {\n const txObject = await wallet.createTransferTx({\n from: wallet.address,\n recipient: wallet.address,\n assetValue,\n });\n return wallet.estimateTransactionFee(txObject, feeOptionKey);\n }\n const { evmTransactionDetails } = params.route;\n\n if (\n !(\n evmTransactionDetails &&\n lowercasedContractAbiMapping[evmTransactionDetails.contractAddress]\n )\n ) {\n return undefined;\n }\n\n const estimate = await wallet.estimateCall({\n contractAddress: evmTransactionDetails.contractAddress,\n // biome-ignore lint/style/noNonNullAssertion: TS cant infer the type\n abi: lowercasedContractAbiMapping[evmTransactionDetails.contractAddress]!,\n funcName: evmTransactionDetails.contractMethod,\n funcParams: evmTransactionDetails.contractParams,\n });\n\n return AssetValue.fromChainOrSignature(chain, estimate);\n }\n\n default:\n return baseValue;\n }\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dogecoin:\n case Chain.Dash:\n case Chain.Litecoin: {\n const { estimateMaxSendableAmount, address } = connectedWallets[chain as UTXOChain];\n\n return estimateMaxSendableAmount({\n ...params,\n feeOptionKey,\n from: address,\n recipient: address,\n });\n }\n\n case Chain.THORChain:\n case Chain.Maya:\n case Chain.Kujira:\n case Chain.Cosmos: {\n return cosmosTransactionFee(params);\n }\n\n case Chain.Polkadot: {\n const wallet = connectedWallets[chain as Chain.Polkadot];\n return wallet.estimateTransactionFee({ ...params, recipient: wallet.address });\n }\n\n default:\n return baseValue;\n }\n }\n\n return {\n ...availablePlugins,\n ...connectWalletMethods,\n\n approveAssetValue,\n getAddress,\n getBalance,\n getExplorerAddressUrl: getAddressUrl,\n getExplorerTxUrl: getTxUrl,\n getWallet,\n getAllWallets,\n getWalletWithBalance,\n isAssetValueApproved,\n estimateTransactionFee,\n swap,\n transfer,\n validateAddress,\n disconnectAll,\n disconnectChain,\n };\n}\n",
7
+ "import { Chain, ChainToExplorerUrl, SwapKitError } from \"@swapkit/helpers\";\n\nexport function getExplorerTxUrl({ chain, txHash }: { txHash: string; chain: Chain }) {\n const baseUrl = ChainToExplorerUrl[chain];\n\n switch (chain) {\n case Chain.Binance:\n case Chain.Maya:\n case Chain.Kujira:\n case Chain.Cosmos:\n case Chain.THORChain:\n case Chain.Solana:\n return `${baseUrl}/tx/${txHash.startsWith(\"0x\") ? txHash.slice(2) : txHash}`;\n\n case Chain.Arbitrum:\n case Chain.Avalanche:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Optimism:\n case Chain.Polkadot:\n case Chain.Polygon:\n return `${baseUrl}/tx/${txHash.startsWith(\"0x\") ? txHash : `0x${txHash}`}`;\n\n case Chain.Litecoin:\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dogecoin:\n return `${baseUrl}/transaction/${txHash.toLowerCase()}`;\n\n default:\n throw new SwapKitError({ errorKey: \"core_explorer_unsupported_chain\", info: { chain } });\n }\n}\n\nexport function getExplorerAddressUrl({ chain, address }: { address: string; chain: Chain }) {\n const baseUrl = ChainToExplorerUrl[chain];\n\n switch (chain) {\n case Chain.Solana:\n return `${baseUrl}/account/${address}`;\n\n default:\n return `${baseUrl}/address/${address}`;\n }\n}\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "C3F79993405C735C64756E2164756E21",
11
+ "names": []
12
+ }
package/package.json CHANGED
@@ -1,63 +1,42 @@
1
1
  {
2
- "author": "swapkit-oss-team",
2
+ "author": "swapkit-oss",
3
3
  "dependencies": {
4
- "@swapkit/types": "1.0.0-rc.6",
5
- "@swapkit/helpers": "1.0.0-rc.12"
4
+ "@swapkit/api": "undefined",
5
+ "@swapkit/contracts": "undefined",
6
+ "@swapkit/helpers": "undefined",
7
+ "@swapkit/plugin-evm": "1.0.0-rc.16",
8
+ "@swapkit/toolbox-cosmos": "1.0.0-rc.143",
9
+ "@swapkit/toolbox-evm": "1.0.0-rc.123",
10
+ "@swapkit/toolbox-solana": "1.0.0-rc.4",
11
+ "@swapkit/toolbox-substrate": "1.0.0-rc.51",
12
+ "@swapkit/toolbox-utxo": "1.0.0-rc.127"
6
13
  },
7
- "description": "SwapKit Lib core",
8
14
  "devDependencies": {
9
- "@vitest/coverage-istanbul": "0.34.4",
10
- "ethers": "6.7.1",
11
- "vite": "4.4.9",
12
- "vite-plugin-top-level-await": "1.3.1",
13
- "vite-plugin-wasm": "3.2.2",
14
- "vitest": "0.34.4",
15
- "@internal/config": "0.0.0-internal.0",
16
- "@swapkit/api": "1.0.0-rc.6",
17
- "@swapkit/tokens": "1.0.0-rc.6",
18
- "@swapkit/toolbox-cosmos": "1.0.0-rc.14",
19
- "@swapkit/toolbox-evm": "1.0.0-rc.13",
20
- "@swapkit/toolbox-utxo": "1.0.0-rc.13"
21
- },
22
- "peerDependencies": {
23
- "@swapkit/api": "1.0.0-rc.6",
24
- "@swapkit/tokens": "1.0.0-rc.6",
25
- "@swapkit/toolbox-cosmos": "1.0.0-rc.14",
26
- "@swapkit/toolbox-evm": "1.0.0-rc.13",
27
- "@swapkit/toolbox-utxo": "1.0.0-rc.13"
28
- },
29
- "eslintConfig": {
30
- "extends": "../../../internal/eslint-config"
31
- },
32
- "exports": {
33
- ".": {
34
- "import": "./dist/index.es.js",
35
- "require": "./dist/index.cjs",
36
- "types": "./dist/index.d.ts"
37
- }
15
+ "@swapkit/tokens": "undefined"
38
16
  },
17
+ "description": "SwapKit - Core",
39
18
  "files": [
40
19
  "src/",
41
20
  "dist/"
42
21
  ],
43
22
  "homepage": "https://github.com/thorswap/SwapKit",
44
23
  "license": "Apache-2.0",
45
- "main": "./dist/index.cjs",
46
- "module": "./dist/index.es.js",
24
+ "main": "./dist/index.js",
47
25
  "name": "@swapkit/core",
48
- "publishConfig": {
49
- "access": "public"
50
- },
51
26
  "react-native": "./src/index.ts",
52
- "repository": "https://github.com/thorswap/SwapKit.git",
53
- "type": "module",
54
- "types": "./dist/index.d.ts",
55
- "version": "1.0.0-rc.17",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/thorswap/SwapKit.git"
30
+ },
56
31
  "scripts": {
57
- "build": "NODE_OPTIONS=--max_old_space_size=16384 vite build",
58
- "clean": "rm -rf dist vite.config.ts.* .turbo node_modules",
59
- "lint": "eslint ./ --ext .ts,.tsx --fix; tsc --noEmit",
60
- "test": "vitest --run",
61
- "test:coverage": "vitest run --coverage"
62
- }
63
- }
32
+ "build": "bun run ./build.ts",
33
+ "clean": "rm -rf dist node_modules *.tsbuildinfo",
34
+ "lint": "biome check --write ./src",
35
+ "test": "echo 'bun test'",
36
+ "test:coverage": "bun test --coverage",
37
+ "type-check": "tsc --noEmit"
38
+ },
39
+ "type": "module",
40
+ "types": "./src/index.ts",
41
+ "version": "1.0.0-rc.171"
42
+ }
@@ -0,0 +1,65 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Chain, ChainToExplorerUrl, CosmosChains, EVMChains, UTXOChains } from "@swapkit/helpers";
3
+ import { getExplorerAddressUrl, getExplorerTxUrl } from "../helpers/explorerUrls.ts";
4
+
5
+ describe("Explorer URLs", () => {
6
+ describe("CosmosChains", () => {
7
+ for (const chain of CosmosChains) {
8
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
9
+ expect(getExplorerTxUrl({ chain, txHash: "0x123456789" })).toBe(
10
+ `${ChainToExplorerUrl[chain]}/tx/123456789`,
11
+ );
12
+
13
+ expect(getExplorerAddressUrl({ chain, address: "asdfg" })).toBe(
14
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
15
+ );
16
+ });
17
+ }
18
+ });
19
+
20
+ describe("EVMChains & SubstrateChains", () => {
21
+ for (const chain of [...EVMChains, Chain.Polkadot]) {
22
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
23
+ expect(getExplorerTxUrl({ chain, txHash: "0x123456789" })).toBe(
24
+ `${ChainToExplorerUrl[chain]}/tx/0x123456789`,
25
+ );
26
+
27
+ expect(getExplorerAddressUrl({ chain, address: "asdfg" })).toBe(
28
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
29
+ );
30
+ });
31
+ }
32
+
33
+ test("getExplorerTxUrl adds 0x for EVM like chains", () => {
34
+ expect(getExplorerTxUrl({ chain: Chain.Ethereum, txHash: "12345" })).toBe(
35
+ "https://etherscan.io/tx/0x12345",
36
+ );
37
+ });
38
+ });
39
+
40
+ describe("UTXOChains", () => {
41
+ for (const chain of UTXOChains.filter((c) => c !== Chain.Dash)) {
42
+ test(`getExplorerTxUrl returns correct URL for ${chain}`, () => {
43
+ expect(getExplorerTxUrl({ chain, txHash: "0x123456789" })).toBe(
44
+ `${ChainToExplorerUrl[chain]}/transaction/0x123456789`,
45
+ );
46
+
47
+ expect(getExplorerAddressUrl({ chain, address: "asdfg" })).toBe(
48
+ `${ChainToExplorerUrl[chain]}/address/asdfg`,
49
+ );
50
+ });
51
+ }
52
+ });
53
+
54
+ describe("Solana", () => {
55
+ test("getExplorerTxUrl returns correct URL for Solana", () => {
56
+ expect(getExplorerTxUrl({ chain: Chain.Solana, txHash: "b123456789" })).toBe(
57
+ "https://solscan.io/tx/b123456789",
58
+ );
59
+
60
+ expect(getExplorerAddressUrl({ chain: Chain.Solana, address: "asdfg" })).toBe(
61
+ "https://solscan.io/account/asdfg",
62
+ );
63
+ });
64
+ });
65
+ });