@swapkit/toolboxes 0.0.0-nightly-20250304130539
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/chunk-fazw0jvt.js +3 -0
- package/dist/chunk-fazw0jvt.js.map +9 -0
- package/dist/chunk-tvrdndbw.js +4 -0
- package/dist/chunk-tvrdndbw.js.map +9 -0
- package/dist/cosmos/index.cjs +3 -0
- package/dist/cosmos/index.cjs.map +19 -0
- package/dist/cosmos/index.js +3 -0
- package/dist/cosmos/index.js.map +19 -0
- package/dist/evm/index.cjs +3 -0
- package/dist/evm/index.cjs.map +18 -0
- package/dist/evm/index.js +3 -0
- package/dist/evm/index.js.map +18 -0
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +9 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +9 -0
- package/dist/radix/index.cjs +3 -0
- package/dist/radix/index.cjs.map +10 -0
- package/dist/radix/index.js +3 -0
- package/dist/radix/index.js.map +10 -0
- package/dist/solana/index.cjs +3 -0
- package/dist/solana/index.cjs.map +10 -0
- package/dist/solana/index.js +3 -0
- package/dist/solana/index.js.map +10 -0
- package/dist/substrate/index.cjs +3 -0
- package/dist/substrate/index.cjs.map +12 -0
- package/dist/substrate/index.js +3 -0
- package/dist/substrate/index.js.map +12 -0
- package/dist/utxo/index.cjs +3 -0
- package/dist/utxo/index.cjs.map +17 -0
- package/dist/utxo/index.js +3 -0
- package/dist/utxo/index.js.map +17 -0
- package/package.json +102 -0
- package/src/cosmos/index.ts +8 -0
- package/src/cosmos/thorchainUtils/addressFormat.ts +23 -0
- package/src/cosmos/thorchainUtils/index.ts +4 -0
- package/src/cosmos/thorchainUtils/messages.ts +244 -0
- package/src/cosmos/thorchainUtils/registry.ts +47 -0
- package/src/cosmos/thorchainUtils/types/client-types.ts +79 -0
- package/src/cosmos/thorchainUtils/types/index.ts +1 -0
- package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.js +2806 -0
- package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.ts +2802 -0
- package/src/cosmos/thorchainUtils/util.ts +46 -0
- package/src/cosmos/toolbox/BaseCosmosToolbox.ts +257 -0
- package/src/cosmos/toolbox/gaia.ts +39 -0
- package/src/cosmos/toolbox/getToolboxByChain.ts +29 -0
- package/src/cosmos/toolbox/kujira.ts +61 -0
- package/src/cosmos/toolbox/thorchain.ts +305 -0
- package/src/cosmos/types.ts +42 -0
- package/src/cosmos/util.ts +230 -0
- package/src/evm/__tests__/ethereum.test.ts +147 -0
- package/src/evm/api.ts +157 -0
- package/src/evm/contracts/eth/multicall.ts +165 -0
- package/src/evm/contracts/op/gasOracle.ts +151 -0
- package/src/evm/helpers.ts +213 -0
- package/src/evm/index.ts +15 -0
- package/src/evm/toolbox/baseEVMToolbox.ts +670 -0
- package/src/evm/toolbox/evm.ts +89 -0
- package/src/evm/toolbox/getToolboxByChain.ts +37 -0
- package/src/evm/toolbox/op.ts +152 -0
- package/src/evm/types.ts +110 -0
- package/src/index.ts +0 -0
- package/src/radix/index.ts +151 -0
- package/src/radix/toolbox.ts +693 -0
- package/src/solana/index.ts +49 -0
- package/src/solana/toolbox.ts +271 -0
- package/src/substrate/index.ts +3 -0
- package/src/substrate/toolbox/baseSubstrateToolbox.ts +288 -0
- package/src/substrate/toolbox/index.ts +40 -0
- package/src/substrate/types/index.ts +2 -0
- package/src/substrate/types/network.ts +42 -0
- package/src/substrate/types/wallet.ts +78 -0
- package/src/utxo/helpers/api.ts +431 -0
- package/src/utxo/helpers/bchaddrjs.ts +177 -0
- package/src/utxo/helpers/coinselect.ts +96 -0
- package/src/utxo/helpers/index.ts +5 -0
- package/src/utxo/helpers/txSize.ts +103 -0
- package/src/utxo/helpers/utils.ts +48 -0
- package/src/utxo/index.ts +7 -0
- package/src/utxo/toolbox/bitcoinCash.ts +268 -0
- package/src/utxo/toolbox/index.ts +41 -0
- package/src/utxo/toolbox/utxo.ts +372 -0
- package/src/utxo/types.ts +51 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/evm/api.ts", "../src/evm/helpers.ts", "../src/evm/toolbox/baseEVMToolbox.ts", "../src/evm/types.ts", "../src/evm/toolbox/getToolboxByChain.ts", "../src/evm/toolbox/evm.ts", "../src/evm/contracts/eth/multicall.ts", "../src/evm/toolbox/op.ts", "../src/evm/contracts/op/gasOracle.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n Chain,\n ChainToChainId,\n type EVMChain,\n RequestClient,\n SKConfig,\n formatBigIntToSafeValue,\n warnOnce,\n} from \"@swapkit/helpers\";\n\nasync function getEthplorerBalance({ address }: { address: string }) {\n const apiKey = SKConfig.get(\"apiKeys\").ethplorer || \"freekey\";\n\n const { tokens = [] } = await RequestClient.get<AddressInfo>(\n `https://api.ethplorer.io/getAddressInfo/${address}`,\n { searchParams: { apiKey } },\n );\n\n return tokens\n .filter(({ tokenInfo: { symbol }, rawBalance }) => symbol && rawBalance !== \"0\")\n .map(({ tokenInfo: { symbol, decimals, address: tokenAddress }, rawBalance }) => ({\n chain: Chain.Ethereum,\n decimal: Number.parseInt(decimals),\n symbol: tokenAddress ? `${symbol}-${tokenAddress}` : symbol,\n value: formatBigIntToSafeValue({\n value: BigInt(rawBalance),\n decimal: Number.parseInt(decimals),\n bigIntDecimal: Number.parseInt(decimals),\n }),\n }));\n}\n\nasync function getCovalentBalance({ chain, address }: { chain: Chain; address: string }) {\n const apiKey = SKConfig.get(\"apiKeys\").covalent;\n\n if (!apiKey) {\n warnOnce(true, \"No covalent api key found. Use SKConfig.setApiKey('your-api-key')\");\n return [];\n }\n\n const { data } = await RequestClient.get<{ data: CovalentBalanceResponse }>(\n `https://api.covalenthq.com/v1/${ChainToChainId[chain]}/address/${address}/balances_v2/`,\n { searchParams: { key: apiKey } },\n );\n\n return (data?.items || [])\n .filter(({ is_spam }) => !is_spam)\n .map(\n ({ balance, contract_decimals, contract_ticker_symbol, contract_address, native_token }) => ({\n value: formatBigIntToSafeValue({\n value: BigInt(balance),\n decimal: contract_decimals,\n bigIntDecimal: contract_decimals,\n }),\n decimal: contract_decimals,\n chain,\n symbol: `${contract_ticker_symbol || \"Unknown\"}${native_token ? \"\" : `-${contract_address}`}`,\n }),\n );\n}\n\nexport function getEvmApi(chain: EVMChain) {\n const getBalance = chain === Chain.Ethereum ? getEthplorerBalance : getCovalentBalance;\n return { getBalance: (address: string) => getBalance({ address, chain }) };\n}\n\nexport function createCustomEvmApi(methods: ReturnType<typeof getEvmApi>) {\n return methods;\n}\n\ntype CovalentBalanceResponse = {\n address: string;\n updated_at: string;\n next_updated_at: string;\n quote_currency: string;\n items: {\n is_spam: boolean;\n contract_decimals: number;\n contract_name: string;\n contract_ticker_symbol: string;\n contract_address: string;\n logo_url: string;\n last_transferred_at: string;\n native_token: boolean;\n type: string;\n balance: number;\n balance_24h: number;\n quote_rate: number;\n quote_rate_24h: number;\n quote: number;\n quote_24h: number;\n }[];\n};\n\ntype PriceInfo = {\n rate: number;\n diff: number;\n diff7d?: number;\n ts: number;\n marketCapUsd?: number;\n availableSupply?: number;\n volume24h?: number;\n diff30d?: number;\n volDiff1?: number;\n volDiff7?: number;\n volDiff30?: number;\n currency?: string;\n};\n\ntype TokenInfo = {\n address: string;\n decimals: string;\n name: string;\n owner: string;\n symbol: string;\n totalSupply: string;\n lastUpdated: number;\n issuancesCount: number;\n holdersCount: number;\n image?: string;\n description?: string;\n website?: string;\n twitter?: string;\n facebook?: string;\n coingecko?: string;\n ethTransfersCount: number;\n price: boolean | PriceInfo | unknown;\n publicTags?: string[];\n txsCount?: number;\n transfersCount?: number;\n};\n\ntype TokenBalance = {\n tokenInfo: TokenInfo;\n balance: number;\n rawBalance: string;\n totalIn?: number;\n totalOut?: number;\n};\n\nexport type AddressInfo = {\n address: string;\n ETH: {\n balance: number;\n totalIn?: number;\n totalOut?: number;\n price: PriceInfo;\n };\n contractInfo?: {\n creatorAddress: string;\n transactionHash: string;\n timestamp: string;\n };\n tokenInfo?: TokenInfo;\n tokens?: TokenBalance[];\n countTxs: number;\n};\n",
|
|
6
|
+
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n ChainToExplorerUrl,\n ChainToHexChainId,\n type EVMChain,\n FeeOption,\n type NetworkParams,\n SKConfig,\n SwapKitNumber,\n filterAssets,\n formatBigIntToSafeValue,\n isGasAsset,\n} from \"@swapkit/helpers\";\nimport { type BrowserProvider, JsonRpcProvider, type Provider } from \"ethers\";\n\nimport { getEvmApi } from \"./api\";\nimport { getEstimateGasPrices } from \"./toolbox/baseEVMToolbox\";\nimport type { EIP1559TxParams, EVMMaxSendableAmountsParams } from \"./types\";\n\nexport const getProvider = (chain: EVMChain, customUrl?: string) => {\n return new JsonRpcProvider(customUrl || SKConfig.get(\"rpcUrls\")[chain]);\n};\n\n/**\n * @deprecated\n */\nexport const estimateMaxSendableAmount = async ({\n toolbox,\n from,\n memo = \"\",\n feeOptionKey = FeeOption.Fastest,\n assetValue,\n abi,\n funcName,\n funcParams,\n contractAddress,\n txOverrides,\n}: EVMMaxSendableAmountsParams): Promise<AssetValue> => {\n const balances = await toolbox.getBalance(from);\n const balance = balances.find(({ symbol, chain }) =>\n assetValue ? symbol === assetValue.symbol : symbol === AssetValue.from({ chain })?.symbol,\n );\n\n const gasRate = (await toolbox.estimateGasPrices())[feeOptionKey];\n\n if (!balance) return AssetValue.from({ chain: assetValue.chain });\n\n if (assetValue && (balance.chain !== assetValue.chain || balance.symbol !== assetValue?.symbol)) {\n return balance;\n }\n\n const gasLimit =\n abi && funcName && funcParams && contractAddress\n ? await toolbox.estimateCall({\n contractAddress,\n abi,\n funcName,\n funcParams,\n txOverrides,\n })\n : await toolbox.estimateGasLimit({\n from,\n recipient: from,\n memo,\n assetValue,\n });\n\n const isFeeEIP1559Compatible = \"maxFeePerGas\" in gasRate;\n const isFeeEVMLegacyCompatible = \"gasPrice\" in gasRate;\n\n if (!(isFeeEVMLegacyCompatible || isFeeEIP1559Compatible)) {\n throw new Error(\"Could not fetch fee data\");\n }\n\n const fee =\n gasLimit *\n (isFeeEIP1559Compatible\n ? (gasRate.maxFeePerGas || 1n) + (gasRate.maxPriorityFeePerGas || 1n)\n : gasRate.gasPrice);\n const maxSendableAmount = SwapKitNumber.fromBigInt(balance.getBaseValue(\"bigint\")).sub(\n fee.toString(),\n );\n\n return AssetValue.from({ chain: balance.chain, value: maxSendableAmount.getValue(\"string\") });\n};\n\nexport function toHexString(value: bigint) {\n return value > 0n ? `0x${value.toString(16)}` : \"0x0\";\n}\n\nexport function getBalance<C extends EVMChain>({\n provider: toolboxProvider,\n chain,\n}: { provider?: BrowserProvider | JsonRpcProvider; chain: C }) {\n return async function getBalance(\n address: string,\n scamFilter = true,\n overwriteProvider?: BrowserProvider | JsonRpcProvider,\n ) {\n const provider = overwriteProvider || toolboxProvider;\n const tokenBalances = await getEvmApi(chain).getBalance(address);\n const evmGasTokenBalance = (await provider?.getBalance(address)) || 0n;\n\n const balances = [\n {\n chain,\n decimal: BaseDecimal[chain],\n symbol: AssetValue.from({ chain }).symbol,\n value: formatBigIntToSafeValue({\n value: BigInt(evmGasTokenBalance),\n decimal: BaseDecimal[chain],\n bigIntDecimal: BaseDecimal[chain],\n }),\n },\n ...tokenBalances.filter((token) => !isGasAsset(token)),\n ];\n\n const filteredBalances = scamFilter ? filterAssets(balances) : balances;\n\n return filteredBalances.map(\n ({ symbol, value, decimal }) =>\n new AssetValue({\n decimal: decimal || BaseDecimal[chain],\n value,\n identifier: `${chain}.${symbol}`,\n }),\n );\n };\n}\n\nexport function getEstimateTransactionFee({\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider | BrowserProvider; isEIP1559Compatible?: boolean }) {\n return async function estimateTransactionFee({\n feeOption = FeeOption.Fast,\n chain,\n ...txObject\n }: EIP1559TxParams & { feeOption: FeeOption; chain: EVMChain }) {\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n const gasPrices = await estimateGasPrices();\n const gasLimit = await provider.estimateGas(txObject);\n\n const assetValue = AssetValue.from({ chain });\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = gasPrices[feeOption];\n\n if (!isEIP1559Compatible && gasPrice) {\n return assetValue.set(SwapKitNumber.fromBigInt(gasPrice * gasLimit, assetValue.decimal));\n }\n\n if (maxFeePerGas && maxPriorityFeePerGas) {\n const fee = (maxFeePerGas + maxPriorityFeePerGas) * gasLimit;\n\n return assetValue.set(SwapKitNumber.fromBigInt(fee, assetValue.decimal));\n }\n\n throw new Error(\"No gas price found\");\n };\n}\n\nexport function getNetworkParams<C extends EVMChain>(chain: C) {\n return () =>\n (Chain.Ethereum === chain\n ? undefined\n : {\n ...getNetworkInfo({ chain }),\n chainId: ChainToHexChainId[chain],\n rpcUrls: [SKConfig.get(\"rpcUrls\")[chain]],\n blockExplorerUrls: [ChainToExplorerUrl[chain]],\n }) as C extends Chain.Ethereum ? undefined : NetworkParams;\n}\n\nexport function getIsEIP1559Compatible<C extends EVMChain>(chain: C) {\n const notCompatible = [Chain.Arbitrum, Chain.BinanceSmartChain];\n\n return !notCompatible.includes(chain);\n}\n\nfunction getNetworkInfo<C extends EVMChain>({ chain }: { chain: C }) {\n const decimals = BaseDecimal[chain];\n\n switch (chain) {\n case Chain.Arbitrum:\n return {\n chainName: \"Arbitrum One\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals },\n };\n case Chain.Avalanche:\n return {\n chainName: \"Avalanche Network\",\n nativeCurrency: { name: \"Avalanche\", symbol: chain, decimals },\n };\n case Chain.Base:\n return {\n chainName: \"Base Mainnet\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals },\n };\n case Chain.BinanceSmartChain:\n return {\n chainName: \"BNB Chain\",\n nativeCurrency: { name: \"Binance Coin\", symbol: \"BNB\", decimals },\n };\n case Chain.Polygon:\n return {\n chainName: \"Polygon Mainnet\",\n nativeCurrency: { name: \"Polygon\", symbol: Chain.Polygon, decimals },\n };\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n}\n",
|
|
7
|
+
"import {\n type Asset,\n type AssetValue,\n Chain,\n ContractAddress,\n type EVMChain,\n FeeOption,\n SwapKitError,\n SwapKitNumber,\n type WalletTxParams,\n isGasAsset,\n} from \"@swapkit/helpers\";\nimport { erc20ABI } from \"@swapkit/helpers/contracts\";\nimport {\n BrowserProvider,\n Contract,\n type ContractTransaction,\n type Fragment,\n type HDNodeWallet,\n Interface,\n type JsonFragment,\n type JsonRpcSigner,\n type Provider,\n type Signer,\n getAddress,\n} from \"ethers\";\n\nimport {\n type ARBToolbox,\n type AVAXToolbox,\n type BASEToolbox,\n type BSCToolbox,\n type ETHToolbox,\n type MATICToolbox,\n type OPToolbox,\n toHexString,\n} from \"../index\";\nimport type {\n ApproveParams,\n CallParams,\n EIP1559TxParams,\n EVMTxParams,\n EstimateCallParams,\n IsApprovedParams,\n LegacyEVMTxParams,\n TransferParams,\n} from \"../types\";\n\nexport const MAX_APPROVAL = BigInt(\n \"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n);\n\nexport function BaseEVMToolbox<\n P extends Provider | BrowserProvider,\n S extends Signer | JsonRpcSigner | HDNodeWallet | undefined,\n>({\n provider,\n signer,\n isEIP1559Compatible = true,\n}: { signer: S; provider: P; isEIP1559Compatible?: boolean }) {\n return {\n call: getCall({ provider, signer, isEIP1559Compatible }),\n estimateCall: getEstimateCall({ provider, signer }),\n EIP1193SendTransaction: getEIP1193SendTransaction(provider),\n approve: getApprove({ provider, signer, isEIP1559Compatible }),\n approvedAmount: getApprovedAmount({ provider }),\n broadcastTransaction: provider.broadcastTransaction,\n createApprovalTx: getCreateApprovalTx(provider),\n createContract: getCreateContract({ provider }),\n createContractTxObject: getCreateContractTxObject(provider),\n createTransferTx: getCreateTransferTx({ provider, signer }),\n estimateGasLimit: getEstimateGasLimit({ provider, signer }),\n estimateGasPrices: getEstimateGasPrices({ provider, isEIP1559Compatible }),\n isApproved: getIsApproved({ provider }),\n sendTransaction: getSendTransaction({ provider, signer, isEIP1559Compatible }),\n signMessage: signer?.signMessage,\n transfer: getTransfer({ provider, signer, isEIP1559Compatible }),\n validateAddress: (address: string) => evmValidateAddress({ address }),\n };\n}\n\nexport function evmValidateAddress({ address }: { address: string }) {\n try {\n getAddress(address);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nexport type EVMWallet = ReturnType<typeof BaseEVMToolbox>;\nexport type EVMWalletType = {\n [Chain.Arbitrum]: ReturnType<typeof ARBToolbox>;\n [Chain.Avalanche]: ReturnType<typeof AVAXToolbox>;\n [Chain.Base]: ReturnType<typeof BASEToolbox>;\n [Chain.BinanceSmartChain]: ReturnType<typeof BSCToolbox>;\n [Chain.Ethereum]: ReturnType<typeof ETHToolbox>;\n [Chain.Optimism]: ReturnType<typeof OPToolbox>;\n [Chain.Polygon]: ReturnType<typeof MATICToolbox>;\n};\n\nexport type EVMWallets = {\n [chain in EVMChain]: EVMWallet & EVMWalletType[chain];\n};\n\nconst baseAssetAddress: Record<EVMChain, string> = {\n [Chain.Arbitrum]: ContractAddress.ARB,\n [Chain.Avalanche]: ContractAddress.AVAX,\n [Chain.Base]: ContractAddress.BASE,\n [Chain.BinanceSmartChain]: ContractAddress.BSC,\n [Chain.Ethereum]: ContractAddress.ETH,\n [Chain.Optimism]: ContractAddress.OP,\n [Chain.Polygon]: ContractAddress.MATIC,\n};\n\nconst stateMutable = [\"payable\", \"nonpayable\"];\n// const nonStateMutable = ['view', 'pure'];\n\nconst isEIP1559Transaction = (tx: EVMTxParams) =>\n (tx as EIP1559TxParams).type === 2 ||\n !!(tx as EIP1559TxParams).maxFeePerGas ||\n !!(tx as EIP1559TxParams).maxPriorityFeePerGas;\n\ntype ToolboxWrapParams<P = Provider | BrowserProvider, T = {}> = T & {\n isEIP1559Compatible?: boolean;\n provider: P;\n signer?: Signer;\n};\n\nexport function isBrowserProvider(provider: any) {\n return provider instanceof BrowserProvider;\n}\n\nexport function createContract(\n address: string,\n abi: readonly (JsonFragment | Fragment)[],\n provider: Provider,\n) {\n return new Contract(address, Interface.from(abi), provider);\n}\n\nexport function getCreateContract({ provider }: ToolboxWrapParams) {\n return function createContract(address: string, abi: readonly (JsonFragment | Fragment)[]) {\n return new Contract(address, Interface.from(abi), provider);\n };\n}\n\nexport function isStateChangingCall({\n abi,\n funcName,\n}: { abi: readonly JsonFragment[]; funcName: string }) {\n const abiFragment = abi.find((fragment: any) => fragment.name === funcName) as any;\n if (!abiFragment) throw new SwapKitError(\"toolbox_evm_no_abi_fragment\", { funcName });\n return abiFragment.stateMutability && stateMutable.includes(abiFragment.stateMutability);\n}\n\nfunction getCall({ provider, isEIP1559Compatible, signer }: ToolboxWrapParams) {\n /**\n * @info call contract function\n * When using this method to make a non state changing call to the blockchain, like a isApproved call,\n * the signer needs to be set to undefined\n */\n return async function call<T>({\n callProvider,\n contractAddress,\n abi,\n funcName,\n funcParams = [],\n txOverrides = {},\n feeOption = FeeOption.Fast,\n }: CallParams): Promise<T> {\n const contractProvider = callProvider || provider;\n if (!contractAddress) throw new Error(\"contractAddress must be provided\");\n\n const isStateChanging = isStateChangingCall({ abi, funcName });\n\n if (isStateChanging && isBrowserProvider(contractProvider) && signer) {\n const createTx = getCreateContractTxObject({ provider: contractProvider });\n const from = txOverrides?.from || (await signer?.getAddress());\n const txObject = await createTx({\n contractAddress,\n abi,\n funcName,\n funcParams,\n txOverrides: { ...txOverrides, from },\n });\n const sendTx = getEIP1193SendTransaction(contractProvider);\n\n return sendTx(txObject) as Promise<T>;\n }\n const contract = createContract(contractAddress, abi, contractProvider);\n\n // only use signer if the contract function is state changing\n if (isStateChanging) {\n if (!signer) throw new SwapKitError(\"toolbox_evm_no_signer\");\n\n const from = txOverrides?.from || (await signer.getAddress());\n if (!from) throw new SwapKitError(\"toolbox_evm_no_signer_address\");\n\n const connectedContract = contract.connect(signer);\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = (await estimateGasPrices())[\n feeOption\n ];\n\n const gasLimit = await contract.getFunction(funcName).estimateGas(...funcParams, txOverrides);\n\n // @ts-expect-error\n const result = await connectedContract[funcName](...funcParams, {\n ...txOverrides,\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n /**\n * nonce must be set due to a possible bug with ethers.js,\n * expecting a synchronous nonce while the JsonRpcProvider delivers Promise\n */\n nonce: txOverrides?.nonce || (await contractProvider.getTransactionCount(from)),\n });\n\n return typeof result?.hash === \"string\" ? result?.hash : result;\n }\n\n const result = await contract[funcName]?.(...funcParams);\n\n return typeof result?.hash === \"string\" ? result?.hash : result;\n };\n}\n\nexport function getCreateContractTxObject({ provider }: ToolboxWrapParams) {\n return async ({ contractAddress, abi, funcName, funcParams = [], txOverrides }: CallParams) =>\n createContract(contractAddress, abi, provider)\n .getFunction(funcName)\n .populateTransaction(\n ...funcParams.concat(txOverrides).filter((p) => typeof p !== \"undefined\"),\n );\n}\n\nfunction getApprovedAmount({ provider }: ToolboxWrapParams) {\n return function approveAmount({ assetAddress, spenderAddress, from }: IsApprovedParams) {\n const call = getCall({ provider, isEIP1559Compatible: true });\n\n return call<bigint>({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"allowance\",\n funcParams: [from, spenderAddress],\n });\n };\n}\n\nfunction getIsApproved({ provider }: ToolboxWrapParams) {\n return async function isApproved({\n assetAddress,\n spenderAddress,\n from,\n amount = MAX_APPROVAL,\n }: IsApprovedParams) {\n const approvedAmount = await getApprovedAmount({ provider })({\n assetAddress,\n spenderAddress,\n from,\n });\n\n return SwapKitNumber.fromBigInt(approvedAmount).gte(SwapKitNumber.fromBigInt(BigInt(amount)));\n };\n}\n\nfunction getApprove({ signer, isEIP1559Compatible = true, provider }: ToolboxWrapParams) {\n return async function approve({\n assetAddress,\n spenderAddress,\n feeOptionKey = FeeOption.Fast,\n amount,\n gasLimitFallback,\n from,\n nonce,\n }: ApproveParams) {\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n\n const functionCallParams = {\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"approve\",\n funcParams,\n signer,\n txOverrides: { from },\n };\n\n if (isBrowserProvider(provider)) {\n const createTx = getCreateContractTxObject(provider);\n const sendTx = getEIP1193SendTransaction(provider);\n const txObject = await createTx(functionCallParams);\n\n return sendTx(txObject);\n }\n\n const call = getCall({ provider, isEIP1559Compatible });\n\n return call<string>({\n ...functionCallParams,\n funcParams,\n txOverrides: {\n from,\n nonce,\n gasLimit: gasLimitFallback ? BigInt(gasLimitFallback.toString()) : undefined,\n },\n feeOption: feeOptionKey,\n });\n };\n}\n\nfunction getTransfer({ signer, isEIP1559Compatible = true, provider }: ToolboxWrapParams) {\n return async function transfer({\n assetValue,\n memo,\n recipient,\n feeOptionKey = FeeOption.Fast,\n data,\n from: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: TransferParams) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = fromOverride || (await signer?.getAddress());\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (assetValue.isGasAsset) {\n const sendTx = getSendTransaction({ provider, signer, isEIP1559Compatible });\n const txObject = {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: data || hexlify(toUtf8Bytes(memo || \"\")),\n feeOptionKey,\n };\n\n return sendTx(txObject);\n }\n\n const call = getCall({ signer, provider, isEIP1559Compatible });\n const contractAddress = getTokenAddress(assetValue, chain);\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n\n return call<string>({\n contractAddress,\n abi: erc20ABI,\n funcName: \"transfer\",\n funcParams: [recipient, txAmount],\n txOverrides: { from, maxFeePerGas, maxPriorityFeePerGas, gasPrice },\n feeOption: feeOptionKey,\n });\n };\n}\n\nexport function getEstimateGasPrices({\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider; isEIP1559Compatible?: boolean }) {\n return async function estimateGasPrices() {\n try {\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = await provider.getFeeData();\n\n if (isEIP1559Compatible) {\n if (maxFeePerGas === null || maxPriorityFeePerGas === null)\n throw new SwapKitError(\"toolbox_evm_no_fee_data\");\n\n return {\n [FeeOption.Average]: { maxFeePerGas, maxPriorityFeePerGas },\n [FeeOption.Fast]: {\n maxFeePerGas: (maxFeePerGas * 15n) / 10n,\n maxPriorityFeePerGas: (maxPriorityFeePerGas * 15n) / 10n,\n },\n [FeeOption.Fastest]: {\n maxFeePerGas: maxFeePerGas * 2n,\n maxPriorityFeePerGas: maxPriorityFeePerGas * 2n,\n },\n };\n }\n if (!gasPrice) throw new SwapKitError(\"toolbox_evm_no_gas_price\");\n\n return {\n [FeeOption.Average]: { gasPrice },\n [FeeOption.Fast]: { gasPrice: (gasPrice * 15n) / 10n },\n [FeeOption.Fastest]: { gasPrice: gasPrice * 2n },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n };\n}\n\nfunction getEstimateCall({ provider, signer }: { signer?: Signer; provider: Provider }) {\n return function estimateCall({\n contractAddress,\n abi,\n funcName,\n funcParams = [],\n txOverrides,\n }: EstimateCallParams) {\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n\n const contract = createContract(contractAddress, abi, provider);\n return signer\n ? contract\n .connect(signer)\n .getFunction(funcName)\n .estimateGas(...funcParams, txOverrides)\n : contract.getFunction(funcName).estimateGas(...funcParams, txOverrides);\n };\n}\n\nfunction getEstimateGasLimit({ provider, signer }: ToolboxWrapParams) {\n return async function estimateGasLimit({\n assetValue,\n recipient,\n memo,\n from,\n funcName,\n funcParams,\n txOverrides,\n }: WalletTxParams & {\n assetValue: AssetValue;\n funcName?: string;\n funcParams?: unknown[];\n txOverrides?: EVMTxParams;\n }) {\n // const value = assetValue.getBaseValue(\"bigint\");\n const value = assetValue.bigIntValue;\n\n const assetAddress = assetValue.isGasAsset\n ? null\n : getTokenAddress(assetValue, assetValue.chain as EVMChain);\n\n if (assetAddress && funcName) {\n const estimateCall = getEstimateCall({ provider, signer });\n // ERC20 gas estimate\n return estimateCall({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName,\n funcParams,\n txOverrides,\n });\n }\n\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n\n return provider.estimateGas({\n from,\n to: recipient,\n value,\n data: memo ? hexlify(toUtf8Bytes(memo)) : undefined,\n });\n };\n}\n\nfunction getSendTransaction({ provider, signer, isEIP1559Compatible = true }: ToolboxWrapParams) {\n return async function sendTransaction({\n feeOptionKey = FeeOption.Fast,\n ...tx\n }: EVMTxParams & { feeOptionKey?: FeeOption }) {\n const { from, to, data, value, ...transaction } = tx;\n\n if (!signer) throw new SwapKitError(\"toolbox_evm_no_signer\");\n if (!to) throw new SwapKitError(\"toolbox_evm_no_to_address\");\n\n const parsedTxObject = {\n ...transaction,\n data: data || \"0x\",\n to,\n from,\n value: BigInt(value || 0),\n };\n\n // early return to skip gas estimation if provider is EIP-1193\n if (isBrowserProvider(provider)) {\n const sendTx = getEIP1193SendTransaction(provider);\n return sendTx(parsedTxObject);\n }\n\n const address = from || (await signer.getAddress());\n const nonce = tx.nonce || (await provider.getTransactionCount(address));\n const chainId = (await provider.getNetwork()).chainId;\n\n const isEIP1559 = isEIP1559Transaction(parsedTxObject) || isEIP1559Compatible;\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n\n const feeData =\n (isEIP1559 &&\n !(\n (parsedTxObject as EIP1559TxParams).maxFeePerGas &&\n (parsedTxObject as EIP1559TxParams).maxPriorityFeePerGas\n )) ||\n !(parsedTxObject as LegacyEVMTxParams).gasPrice\n ? Object.entries((await estimateGasPrices())[feeOptionKey]).reduce(\n // biome-ignore lint/performance/noAccumulatingSpread: this is a small object\n (acc, [k, v]) => ({ ...acc, [k]: toHexString(BigInt(v)) }),\n {} as {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n gasPrice?: string;\n },\n )\n : {};\n let gasLimit: string;\n try {\n gasLimit = toHexString(\n parsedTxObject.gasLimit || ((await provider.estimateGas(parsedTxObject)) * 11n) / 10n,\n );\n } catch (error) {\n throw new SwapKitError(\"toolbox_evm_error_estimating_gas_limit\", { error });\n }\n\n try {\n const txObject = {\n ...parsedTxObject,\n chainId,\n type: isEIP1559 ? 2 : 0,\n gasLimit,\n nonce,\n ...feeData,\n };\n\n try {\n const response = await signer.sendTransaction(txObject);\n return response.hash;\n } catch (_error) {\n const txHex = await signer.signTransaction({\n ...txObject,\n from: address,\n });\n const response = await provider.broadcastTransaction(txHex);\n return response.hash;\n }\n } catch (error) {\n throw new SwapKitError(\"toolbox_evm_error_sending_transaction\", { error });\n }\n };\n}\n\n/**\n * Exported helper functions\n */\nexport function toChecksumAddress(address: string) {\n return getAddress(address);\n}\n\nexport function getEIP1193SendTransaction(provider: Provider | BrowserProvider) {\n return function EIP1193SendTransaction({\n value,\n ...params\n }: EVMTxParams | ContractTransaction): Promise<string> {\n if (!isBrowserProvider(provider)) {\n throw new SwapKitError(\"toolbox_evm_provider_not_eip1193_compatible\");\n }\n\n return (provider as BrowserProvider).send(\"eth_sendTransaction\", [\n { value: toHexString(BigInt(value || 0)), ...params } as any,\n ]);\n };\n}\n\nexport function getChecksumAddressFromAsset(asset: Asset, chain: EVMChain) {\n const assetAddress = getTokenAddress(asset, chain);\n\n if (assetAddress) {\n return getAddress(assetAddress.toLowerCase());\n }\n\n throw new SwapKitError(\"toolbox_evm_invalid_gas_asset_address\");\n}\n\nexport function getTokenAddress({ chain, symbol, ticker }: Asset, baseAssetChain: EVMChain) {\n try {\n const isBSCBNB = chain === Chain.BinanceSmartChain && symbol === \"BNB\" && ticker === \"BNB\";\n const isBaseAsset =\n chain === baseAssetChain && symbol === baseAssetChain && ticker === baseAssetChain;\n const isEVMAsset =\n [Chain.Arbitrum, Chain.Base].includes(chain) && symbol === \"ETH\" && ticker === \"ETH\";\n\n if (isBaseAsset || isBSCBNB || isEVMAsset) {\n return baseAssetAddress[baseAssetChain];\n }\n\n // strip 0X only - 0x is still valid\n return getAddress(symbol.slice(ticker.length + 1).replace(/^0X/, \"\"));\n } catch (_error) {\n return null;\n }\n}\n\nfunction getCreateTransferTx({\n provider,\n signer,\n}: { provider: Provider | BrowserProvider; signer?: Signer }) {\n return async function createTransferTx({\n assetValue,\n memo,\n recipient,\n feeOptionKey = FeeOption.Fast,\n data,\n from: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: TransferParams) {\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = fromOverride || (await signer?.getAddress());\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (isGasAsset(assetValue)) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n\n return {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: data || hexlify(toUtf8Bytes(memo || \"\")),\n };\n }\n\n const contractAddress = getTokenAddress(assetValue, chain);\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n const createTx = getCreateContractTxObject(provider);\n\n return createTx({\n contractAddress,\n abi: erc20ABI,\n funcName: \"transfer\",\n funcParams: [recipient, txAmount],\n txOverrides: { from, maxFeePerGas, maxPriorityFeePerGas, gasPrice },\n });\n };\n}\n\nfunction getCreateApprovalTx(provider: Provider) {\n return async function createApprovalTx({\n assetAddress,\n spenderAddress,\n amount,\n from,\n }: ApproveParams) {\n const createTx = getCreateContractTxObject(provider);\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n\n const txObject = await createTx({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"approve\",\n funcParams,\n txOverrides: { from },\n });\n\n return txObject;\n };\n}\n",
|
|
8
|
+
"import type { AssetValue, FeeOption, WalletTxParams } from \"@swapkit/helpers\";\nimport type { BigNumberish, JsonFragment, Transaction } from \"ethers\";\n\nimport type {\n ARBToolbox,\n AVAXToolbox,\n BASEToolbox,\n BSCToolbox,\n ETHToolbox,\n MATICToolbox,\n OPToolbox,\n getProvider,\n} from \"./index\";\n\nexport enum EthNetwork {\n Test = \"goerli\",\n Main = \"homestead\",\n}\n\nexport type ApproveParams = {\n assetAddress: string;\n spenderAddress: string;\n feeOptionKey?: FeeOption;\n amount?: BigNumberish;\n from: string;\n // Optional fallback in case estimation for gas limit fails\n gasLimitFallback?: BigNumberish;\n nonce?: number;\n};\n\nexport type ApprovedParams = {\n assetAddress: string;\n spenderAddress: string;\n from: string;\n};\n\nexport type IsApprovedParams = ApprovedParams & {\n amount?: BigNumberish;\n};\n\nexport type CallParams = {\n callProvider?: ReturnType<typeof getProvider>;\n contractAddress: string;\n abi: readonly JsonFragment[];\n funcName: string;\n funcParams?: unknown[];\n txOverrides?: Partial<Transaction>;\n feeOption?: FeeOption;\n};\n\nexport type EstimateCallParams = Pick<\n CallParams,\n \"contractAddress\" | \"abi\" | \"funcName\" | \"funcParams\" | \"txOverrides\"\n>;\n\nexport type TransferParams = WalletTxParams & {\n gasLimit?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n data?: string;\n from: string;\n nonce?: number;\n assetValue: AssetValue;\n};\n\nexport type BaseEVMToolboxType = ReturnType<\n | typeof ARBToolbox\n | typeof AVAXToolbox\n | typeof BASEToolbox\n | typeof BSCToolbox\n | typeof ETHToolbox\n | typeof MATICToolbox\n | typeof OPToolbox\n>;\n\nexport type EVMMaxSendableAmountsParams = {\n from: string;\n toolbox: BaseEVMToolboxType;\n assetValue: AssetValue;\n feeOptionKey?: FeeOption;\n memo?: string;\n abi?: readonly JsonFragment[];\n funcName?: string;\n contractAddress?: string;\n funcParams?: unknown[];\n txOverrides?: Partial<Transaction>;\n};\n\nexport type EVMTxBaseParams<T = bigint> = {\n to?: string;\n from?: string;\n nonce?: number;\n gasLimit?: T;\n data?: string;\n value?: T;\n chainId?: T;\n};\n\nexport type EIP1559TxParams<T = bigint> = EVMTxBaseParams<T> & {\n type?: number;\n maxFeePerGas?: T;\n maxPriorityFeePerGas?: T;\n};\n\nexport type LegacyEVMTxParams<T = bigint> = EVMTxBaseParams<T> & {\n gasPrice?: T;\n};\n\nexport type EVMTxParams = EIP1559TxParams | LegacyEVMTxParams;\n",
|
|
9
|
+
"import { Chain } from \"@swapkit/helpers\";\n\nimport { ARBToolbox, AVAXToolbox, BASEToolbox, BSCToolbox, ETHToolbox, MATICToolbox } from \"./evm\";\nimport { OPToolbox } from \"./op\";\n\ntype ToolboxType = {\n ARB: typeof ARBToolbox;\n AVAX: typeof AVAXToolbox;\n BASE: typeof BASEToolbox;\n BSC: typeof BSCToolbox;\n ETH: typeof ETHToolbox;\n MATIC: typeof MATICToolbox;\n OP: typeof OPToolbox;\n};\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(chain: T): ToolboxType[T] => {\n switch (chain) {\n case Chain.Avalanche:\n return AVAXToolbox as ToolboxType[T];\n case Chain.Arbitrum:\n return ARBToolbox as ToolboxType[T];\n case Chain.Base:\n return BASEToolbox as ToolboxType[T];\n case Chain.Optimism:\n return OPToolbox as ToolboxType[T];\n case Chain.Polygon:\n return MATICToolbox as ToolboxType[T];\n case Chain.BinanceSmartChain:\n return BSCToolbox as ToolboxType[T];\n case Chain.Ethereum:\n return ETHToolbox as ToolboxType[T];\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n\nexport { evmValidateAddress } from \"./baseEVMToolbox\";\n",
|
|
10
|
+
"import { Chain, type EVMChain, FeeOption } from \"@swapkit/helpers\";\nimport type { BrowserProvider, JsonRpcProvider, Signer } from \"ethers\";\nimport { multicallAbi } from \"../contracts/eth/multicall\";\nimport {\n getBalance,\n getEstimateTransactionFee,\n getIsEIP1559Compatible,\n getNetworkParams,\n} from \"../helpers\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nexport function ETHToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const evmToolbox = createEvmToolbox(Chain.Ethereum)({\n provider,\n signer,\n });\n async function multicall(\n callTuples: { address: string; data: string }[],\n multicallAddress = \"0x5ba1e12693dc8f9c48aad8770482f4739beed696\",\n funcName = \"aggregate\",\n feeOptionKey: FeeOption = FeeOption.Fast,\n ) {\n const txObject = await evmToolbox.createContractTxObject({\n contractAddress: multicallAddress,\n abi: multicallAbi,\n funcName,\n funcParams: [callTuples],\n });\n\n return evmToolbox.sendTransaction({ ...txObject, feeOptionKey });\n }\n\n return { ...evmToolbox, multicall };\n}\n\nexport function ARBToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const { estimateGasPrices: _, ...evmToolbox } = createEvmToolbox(Chain.Arbitrum)({\n provider,\n signer,\n });\n\n async function estimateGasPrices() {\n try {\n const { gasPrice } = await provider.getFeeData();\n\n if (!gasPrice) throw new Error(\"No fee data available\");\n\n return {\n [FeeOption.Average]: { gasPrice },\n [FeeOption.Fast]: { gasPrice },\n [FeeOption.Fastest]: { gasPrice },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n }\n\n return { ...evmToolbox, estimateGasPrices };\n}\n\nexport const AVAXToolbox = createEvmToolbox(Chain.Avalanche);\nexport const BASEToolbox = createEvmToolbox(Chain.Base);\nexport const BSCToolbox = createEvmToolbox(Chain.BinanceSmartChain);\nexport const MATICToolbox = createEvmToolbox(Chain.Polygon);\n\nfunction createEvmToolbox<C extends EVMChain>(chain: C) {\n return function createEvmToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n }: { provider: P; signer?: S }) {\n const isEIP1559Compatible = getIsEIP1559Compatible(chain);\n const evmToolbox = BaseEVMToolbox({ provider, signer, isEIP1559Compatible });\n\n return {\n ...evmToolbox,\n estimateTransactionFee: getEstimateTransactionFee({ provider, isEIP1559Compatible }),\n getNetworkParams: getNetworkParams(chain),\n getBalance: getBalance({ provider, chain }),\n };\n };\n}\n",
|
|
11
|
+
"export const multicallAbi = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"aggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes[]\", name: \"returnData\", type: \"bytes[]\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"blockAndAggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" },\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" }],\n name: \"getBlockHash\",\n outputs: [{ internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getBlockNumber\",\n outputs: [{ internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockCoinbase\",\n outputs: [{ internalType: \"address\", name: \"coinbase\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockDifficulty\",\n outputs: [{ internalType: \"uint256\", name: \"difficulty\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockGasLimit\",\n outputs: [{ internalType: \"uint256\", name: \"gaslimit\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockTimestamp\",\n outputs: [{ internalType: \"uint256\", name: \"timestamp\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"addr\", type: \"address\" }],\n name: \"getEthBalance\",\n outputs: [{ internalType: \"uint256\", name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getLastBlockHash\",\n outputs: [{ internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"bool\", name: \"requireSuccess\", type: \"bool\" },\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"tryAggregate\",\n outputs: [\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"bool\", name: \"requireSuccess\", type: \"bool\" },\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"tryBlockAndAggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" },\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n];\n",
|
|
12
|
+
"import {\n BaseDecimal,\n Chain,\n ChainId,\n ChainToExplorerUrl,\n FeeOption,\n SKConfig,\n} from \"@swapkit/helpers\";\nimport type { BrowserProvider, JsonRpcProvider, Signer, TransactionRequest } from \"ethers\";\nimport { Contract } from \"ethers\";\n\nimport { gasOracleAbi } from \"../contracts/op/gasOracle\";\nimport { getBalance } from \"../helpers\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nconst GAS_PRICE_ORACLE_ADDRESS = \"0x420000000000000000000000000000000000000f\";\n\nfunction connectGasPriceOracle<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return new Contract(GAS_PRICE_ORACLE_ADDRESS, gasOracleAbi, provider);\n}\n\nfunction getL1GasPriceFetcher<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return function getL1GasPrice() {\n const gasPriceOracle = connectGasPriceOracle(provider);\n\n if (gasPriceOracle && \"l1BaseFee\" in gasPriceOracle) {\n return gasPriceOracle?.l1BaseFee() as unknown as bigint;\n }\n\n return undefined;\n };\n}\n\nfunction serializeTx<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function serializeTx({ from, to, nonce, ...tx }: TransactionRequest) {\n const { Transaction } = await import(\"ethers\");\n\n if (!to) throw new Error(\"Missing to address\");\n const txParams = {\n ...tx,\n to: to as string,\n nonce: nonce ? nonce : from ? await provider.getTransactionCount(from) : 0,\n };\n\n return Transaction.from(txParams).serialized;\n };\n}\n\nfunction estimateL1GasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL1GasCost(tx: TransactionRequest) {\n const gasPriceOracle = connectGasPriceOracle(provider);\n const serializedTx = await serializeTx(provider)(tx);\n\n if (gasPriceOracle && \"getL1Fee\" in gasPriceOracle) {\n return gasPriceOracle.getL1Fee(serializedTx);\n }\n };\n}\n\nfunction estimateL2GasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL2GasCost(tx: TransactionRequest) {\n const l2GasPrice = await provider.send(\"eth_gasPrice\", []);\n const l2GasCost = await provider.estimateGas(tx);\n return l2GasPrice.mul(l2GasCost);\n };\n}\n\nfunction estimateTotalGasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateTotalGasCost(tx: TransactionRequest) {\n const l1GasCost = await estimateL1GasCost(provider)(tx);\n const l2GasCost = await estimateL2GasCost(provider)(tx);\n return l1GasCost.add(l2GasCost);\n };\n}\n\nexport function estimateL1Gas<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL1Gas(tx: TransactionRequest) {\n const gasPriceOracle = connectGasPriceOracle(provider);\n const serializedTx = await serializeTx(provider)(tx);\n\n if (gasPriceOracle && \"getL1GasUsed\" in gasPriceOracle) {\n return gasPriceOracle.getL1GasUsed(serializedTx);\n }\n };\n}\n\nconst getNetworkParams = () => ({\n chainId: ChainId.OptimismHex,\n chainName: \"Optimism\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals: BaseDecimal.ETH },\n rpcUrls: [SKConfig.get(\"rpcUrls\")[Chain.Optimism]],\n blockExplorerUrls: [ChainToExplorerUrl[Chain.Optimism]],\n});\n\nfunction estimateGasPrices<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateGasPrices() {\n try {\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = await provider.getFeeData();\n const l1GasPrice = getL1GasPriceFetcher(provider)();\n const price = gasPrice as bigint;\n\n if (!(maxFeePerGas && maxPriorityFeePerGas)) {\n throw new Error(\"No fee data available\");\n }\n\n return {\n [FeeOption.Average]: {\n l1GasPrice,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n [FeeOption.Fast]: {\n l1GasPrice: ((l1GasPrice || 0n) * 15n) / 10n,\n gasPrice: (price * 15n) / 10n,\n maxFeePerGas,\n maxPriorityFeePerGas: (maxPriorityFeePerGas * 15n) / 10n,\n },\n [FeeOption.Fastest]: {\n l1GasPrice: (l1GasPrice || 0n) * 2n,\n gasPrice: price * 2n,\n maxFeePerGas,\n maxPriorityFeePerGas: maxPriorityFeePerGas * 2n,\n },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n };\n}\n\nexport function OPToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const evmToolbox = BaseEVMToolbox({ provider, signer });\n const getL1GasPrice = getL1GasPriceFetcher(provider);\n\n return {\n ...evmToolbox,\n estimateGasPrices: estimateGasPrices(provider),\n estimateL1Gas: estimateL1Gas(provider),\n estimateL1GasCost: estimateL1GasCost(provider),\n estimateL2GasCost: estimateL2GasCost(provider),\n estimateTotalGasCost: estimateTotalGasCost(provider),\n getBalance: getBalance({ provider, chain: Chain.Optimism }),\n getL1GasPrice,\n getNetworkParams,\n };\n}\n",
|
|
13
|
+
"export const gasOracleAbi = [\n {\n inputs: [{ internalType: \"address\", name: \"_owner\", type: \"address\" }],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"DecimalsUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"GasPriceUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"L1BaseFeeUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"OverheadUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"address\", name: \"previousOwner\", type: \"address\" },\n { indexed: true, internalType: \"address\", name: \"newOwner\", type: \"address\" },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"ScalarUpdated\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"gasPrice\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"bytes\", name: \"_data\", type: \"bytes\" }],\n name: \"getL1Fee\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"bytes\", name: \"_data\", type: \"bytes\" }],\n name: \"getL1GasUsed\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"l1BaseFee\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"overhead\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"scalar\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_decimals\", type: \"uint256\" }],\n name: \"setDecimals\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_gasPrice\", type: \"uint256\" }],\n name: \"setGasPrice\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_baseFee\", type: \"uint256\" }],\n name: \"setL1BaseFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_overhead\", type: \"uint256\" }],\n name: \"setOverhead\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_scalar\", type: \"uint256\" }],\n name: \"setScalar\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"newOwner\", type: \"address\" }],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n];\n"
|
|
14
|
+
],
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "A99A8EB0B0D32D8B64756E2164756E21",
|
|
17
|
+
"names": []
|
|
18
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as I,b as F}from"../chunk-tvrdndbw.js";import{Chain as d,ChainToChainId as St,RequestClient as tt,SKConfig as nt,formatBigIntToSafeValue as et,warnOnce as Ut}from"@swapkit/helpers";async function Jt({address:t}){let e=nt.get("apiKeys").ethplorer||"freekey",{tokens:n=[]}=await tt.get(`https://api.ethplorer.io/getAddressInfo/${t}`,{searchParams:{apiKey:e}});return n.filter(({tokenInfo:{symbol:a},rawBalance:o})=>a&&o!=="0").map(({tokenInfo:{symbol:a,decimals:o,address:u},rawBalance:i})=>({chain:d.Ethereum,decimal:Number.parseInt(o),symbol:u?`${a}-${u}`:a,value:et({value:BigInt(i),decimal:Number.parseInt(o),bigIntDecimal:Number.parseInt(o)})}))}async function Lt({chain:t,address:e}){let n=nt.get("apiKeys").covalent;if(!n)return Ut(!0,"No covalent api key found. Use SKConfig.setApiKey('your-api-key')"),[];let{data:a}=await tt.get(`https://api.covalenthq.com/v1/${St[t]}/address/${e}/balances_v2/`,{searchParams:{key:n}});return(a?.items||[]).filter(({is_spam:o})=>!o).map(({balance:o,contract_decimals:u,contract_ticker_symbol:i,contract_address:y,native_token:s})=>({value:et({value:BigInt(o),decimal:u,bigIntDecimal:u}),decimal:u,chain:t,symbol:`${i||"Unknown"}${s?"":`-${y}`}`}))}function at(t){let e=t===d.Ethereum?Jt:Lt;return{getBalance:(n)=>e({address:n,chain:t})}}function cn(t){return t}import{AssetValue as U,BaseDecimal as $,Chain as M,ChainToExplorerUrl as Vt,ChainToHexChainId as _t,FeeOption as mt,SKConfig as ct,SwapKitNumber as O,filterAssets as jt,formatBigIntToSafeValue as Kt,isGasAsset as Ot}from"@swapkit/helpers";import{JsonRpcProvider as At}from"ethers";import{Chain as R,ContractAddress as C,FeeOption as h,SwapKitError as f,SwapKitNumber as ot,isGasAsset as qt}from"@swapkit/helpers";import{erc20ABI as S}from"@swapkit/helpers/contracts";import{BrowserProvider as Et,Contract as ut,Interface as it,getAddress as z}from"ethers";var j=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function Q({provider:t,signer:e,isEIP1559Compatible:n=!0}){return{call:X({provider:t,signer:e,isEIP1559Compatible:n}),estimateCall:st({provider:t,signer:e}),EIP1193SendTransaction:Y(t),approve:Wt({provider:t,signer:e,isEIP1559Compatible:n}),approvedAmount:yt({provider:t}),broadcastTransaction:t.broadcastTransaction,createApprovalTx:Nt(t),createContract:Ft({provider:t}),createContractTxObject:q(t),createTransferTx:Zt({provider:t,signer:e}),estimateGasLimit:Yt({provider:t,signer:e}),estimateGasPrices:E({provider:t,isEIP1559Compatible:n}),isApproved:Qt({provider:t}),sendTransaction:pt({provider:t,signer:e,isEIP1559Compatible:n}),signMessage:e?.signMessage,transfer:Xt({provider:t,signer:e,isEIP1559Compatible:n}),validateAddress:(a)=>lt({address:a})}}function lt({address:t}){try{return z(t),!0}catch(e){return!1}}var $t={[R.Arbitrum]:C.ARB,[R.Avalanche]:C.AVAX,[R.Base]:C.BASE,[R.BinanceSmartChain]:C.BSC,[R.Ethereum]:C.ETH,[R.Optimism]:C.OP,[R.Polygon]:C.MATIC},Ht=["payable","nonpayable"],It=(t)=>t.type===2||!!t.maxFeePerGas||!!t.maxPriorityFeePerGas;function W(t){return t instanceof Et}function K(t,e,n){return new ut(t,it.from(e),n)}function Ft({provider:t}){return function e(n,a){return new ut(n,it.from(a),t)}}function zt({abi:t,funcName:e}){let n=t.find((a)=>a.name===e);if(!n)throw new f("toolbox_evm_no_abi_fragment",{funcName:e});return n.stateMutability&&Ht.includes(n.stateMutability)}function X({provider:t,isEIP1559Compatible:e,signer:n}){return async function a({callProvider:o,contractAddress:u,abi:i,funcName:y,funcParams:s=[],txOverrides:p={},feeOption:r=h.Fast}){let l=o||t;if(!u)throw new Error("contractAddress must be provided");let m=zt({abi:i,funcName:y});if(m&&W(l)&&n){let T=q({provider:l}),B=p?.from||await n?.getAddress(),x=await T({contractAddress:u,abi:i,funcName:y,funcParams:s,txOverrides:{...p,from:B}});return Y(l)(x)}let c=K(u,i,l);if(m){if(!n)throw new f("toolbox_evm_no_signer");let T=p?.from||await n.getAddress();if(!T)throw new f("toolbox_evm_no_signer_address");let B=c.connect(n),x=E({provider:t,isEIP1559Compatible:e}),{maxFeePerGas:g,maxPriorityFeePerGas:b,gasPrice:P}=(await x())[r],k=await c.getFunction(y).estimateGas(...s,p),D=await B[y](...s,{...p,gasLimit:k,maxFeePerGas:g,maxPriorityFeePerGas:b,gasPrice:P,nonce:p?.nonce||await l.getTransactionCount(T)});return typeof D?.hash==="string"?D?.hash:D}let w=await c[y]?.(...s);return typeof w?.hash==="string"?w?.hash:w}}function q({provider:t}){return async({contractAddress:e,abi:n,funcName:a,funcParams:o=[],txOverrides:u})=>K(e,n,t).getFunction(a).populateTransaction(...o.concat(u).filter((i)=>typeof i!=="undefined"))}function yt({provider:t}){return function e({assetAddress:n,spenderAddress:a,from:o}){return X({provider:t,isEIP1559Compatible:!0})({contractAddress:n,abi:S,funcName:"allowance",funcParams:[o,a]})}}function Qt({provider:t}){return async function e({assetAddress:n,spenderAddress:a,from:o,amount:u=j}){let i=await yt({provider:t})({assetAddress:n,spenderAddress:a,from:o});return ot.fromBigInt(i).gte(ot.fromBigInt(BigInt(u)))}}function Wt({signer:t,isEIP1559Compatible:e=!0,provider:n}){return async function a({assetAddress:o,spenderAddress:u,feeOptionKey:i=h.Fast,amount:y,gasLimitFallback:s,from:p,nonce:r}){let l=[u,BigInt(y||j)],m={contractAddress:o,abi:S,funcName:"approve",funcParams:l,signer:t,txOverrides:{from:p}};if(W(n)){let w=q(n),T=Y(n),B=await w(m);return T(B)}return X({provider:n,isEIP1559Compatible:e})({...m,funcParams:l,txOverrides:{from:p,nonce:r,gasLimit:s?BigInt(s.toString()):void 0},feeOption:i})}}function Xt({signer:t,isEIP1559Compatible:e=!0,provider:n}){return async function a({assetValue:o,memo:u,recipient:i,feeOptionKey:y=h.Fast,data:s,from:p,maxFeePerGas:r,maxPriorityFeePerGas:l,gasPrice:m,...c}){let{hexlify:w,toUtf8Bytes:T}=await import("ethers"),B=o.getBaseValue("bigint"),x=o.chain,g=p||await t?.getAddress();if(!g)throw new f("toolbox_evm_no_from_address");if(o.isGasAsset){let k=pt({provider:n,signer:t,isEIP1559Compatible:e}),D={...c,from:g,to:i,value:B,data:s||w(T(u||"")),feeOptionKey:y};return k(D)}let b=X({signer:t,provider:n,isEIP1559Compatible:e}),P=Z(o,x);if(!P)throw new f("toolbox_evm_no_contract_address");return b({contractAddress:P,abi:S,funcName:"transfer",funcParams:[i,B],txOverrides:{from:g,maxFeePerGas:r,maxPriorityFeePerGas:l,gasPrice:m},feeOption:y})}}function E({provider:t,isEIP1559Compatible:e=!0}){return async function n(){try{let{maxFeePerGas:a,maxPriorityFeePerGas:o,gasPrice:u}=await t.getFeeData();if(e){if(a===null||o===null)throw new f("toolbox_evm_no_fee_data");return{[h.Average]:{maxFeePerGas:a,maxPriorityFeePerGas:o},[h.Fast]:{maxFeePerGas:a*15n/10n,maxPriorityFeePerGas:o*15n/10n},[h.Fastest]:{maxFeePerGas:a*2n,maxPriorityFeePerGas:o*2n}}}if(!u)throw new f("toolbox_evm_no_gas_price");return{[h.Average]:{gasPrice:u},[h.Fast]:{gasPrice:u*15n/10n},[h.Fastest]:{gasPrice:u*2n}}}catch(a){throw new Error(`Failed to estimate gas price: ${a.msg??a.toString()}`)}}}function st({provider:t,signer:e}){return function n({contractAddress:a,abi:o,funcName:u,funcParams:i=[],txOverrides:y}){if(!a)throw new f("toolbox_evm_no_contract_address");let s=K(a,o,t);return e?s.connect(e).getFunction(u).estimateGas(...i,y):s.getFunction(u).estimateGas(...i,y)}}function Yt({provider:t,signer:e}){return async function n({assetValue:a,recipient:o,memo:u,from:i,funcName:y,funcParams:s,txOverrides:p}){let r=a.bigIntValue,l=a.isGasAsset?null:Z(a,a.chain);if(l&&y)return st({provider:t,signer:e})({contractAddress:l,abi:S,funcName:y,funcParams:s,txOverrides:p});let{hexlify:m,toUtf8Bytes:c}=await import("ethers");return t.estimateGas({from:i,to:o,value:r,data:u?m(c(u)):void 0})}}function pt({provider:t,signer:e,isEIP1559Compatible:n=!0}){return async function a({feeOptionKey:o=h.Fast,...u}){let{from:i,to:y,data:s,value:p,...r}=u;if(!e)throw new f("toolbox_evm_no_signer");if(!y)throw new f("toolbox_evm_no_to_address");let l={...r,data:s||"0x",to:y,from:i,value:BigInt(p||0)};if(W(t))return Y(t)(l);let m=i||await e.getAddress(),c=u.nonce||await t.getTransactionCount(m),w=(await t.getNetwork()).chainId,T=It(l)||n,B=E({provider:t,isEIP1559Compatible:n}),x=T&&!(l.maxFeePerGas&&l.maxPriorityFeePerGas)||!l.gasPrice?Object.entries((await B())[o]).reduce((b,[P,k])=>({...b,[P]:H(BigInt(k))}),{}):{},g;try{g=H(l.gasLimit||await t.estimateGas(l)*11n/10n)}catch(b){throw new f("toolbox_evm_error_estimating_gas_limit",{error:b})}try{let b={...l,chainId:w,type:T?2:0,gasLimit:g,nonce:c,...x};try{return(await e.sendTransaction(b)).hash}catch(P){let k=await e.signTransaction({...b,from:m});return(await t.broadcastTransaction(k)).hash}}catch(b){throw new f("toolbox_evm_error_sending_transaction",{error:b})}}}function Bn(t){return z(t)}function Y(t){return function e({value:n,...a}){if(!W(t))throw new f("toolbox_evm_provider_not_eip1193_compatible");return t.send("eth_sendTransaction",[{value:H(BigInt(n||0)),...a}])}}function gn(t,e){let n=Z(t,e);if(n)return z(n.toLowerCase());throw new f("toolbox_evm_invalid_gas_asset_address")}function Z({chain:t,symbol:e,ticker:n},a){try{let o=t===R.BinanceSmartChain&&e==="BNB"&&n==="BNB",u=t===a&&e===a&&n===a,i=[R.Arbitrum,R.Base].includes(t)&&e==="ETH"&&n==="ETH";if(u||o||i)return $t[a];return z(e.slice(n.length+1).replace(/^0X/,""))}catch(o){return null}}function Zt({provider:t,signer:e}){return async function n({assetValue:a,memo:o,recipient:u,feeOptionKey:i=h.Fast,data:y,from:s,maxFeePerGas:p,maxPriorityFeePerGas:r,gasPrice:l,...m}){let c=a.getBaseValue("bigint"),w=a.chain,T=s||await e?.getAddress();if(!T)throw new f("toolbox_evm_no_from_address");if(qt(a)){let{hexlify:g,toUtf8Bytes:b}=await import("ethers");return{...m,from:T,to:u,value:c,data:y||g(b(o||""))}}let B=Z(a,w);if(!B)throw new f("toolbox_evm_no_contract_address");return q(t)({contractAddress:B,abi:S,funcName:"transfer",funcParams:[u,c],txOverrides:{from:T,maxFeePerGas:p,maxPriorityFeePerGas:r,gasPrice:l}})}}function Nt(t){return async function e({assetAddress:n,spenderAddress:a,amount:o,from:u}){let i=q(t),y=[a,BigInt(o||j)];return await i({contractAddress:n,abi:S,funcName:"approve",funcParams:y,txOverrides:{from:u}})}}var kn=(t,e)=>{return new At(e||ct.get("rpcUrls")[t])},Cn=async({toolbox:t,from:e,memo:n="",feeOptionKey:a=mt.Fastest,assetValue:o,abi:u,funcName:i,funcParams:y,contractAddress:s,txOverrides:p})=>{let l=(await t.getBalance(e)).find(({symbol:g,chain:b})=>o?g===o.symbol:g===U.from({chain:b})?.symbol),m=(await t.estimateGasPrices())[a];if(!l)return U.from({chain:o.chain});if(o&&(l.chain!==o.chain||l.symbol!==o?.symbol))return l;let c=u&&i&&y&&s?await t.estimateCall({contractAddress:s,abi:u,funcName:i,funcParams:y,txOverrides:p}):await t.estimateGasLimit({from:e,recipient:e,memo:n,assetValue:o}),w="maxFeePerGas"in m;if(!(("gasPrice"in m)||w))throw new Error("Could not fetch fee data");let B=c*(w?(m.maxFeePerGas||1n)+(m.maxPriorityFeePerGas||1n):m.gasPrice),x=O.fromBigInt(l.getBaseValue("bigint")).sub(B.toString());return U.from({chain:l.chain,value:x.getValue("string")})};function H(t){return t>0n?`0x${t.toString(16)}`:"0x0"}function N({provider:t,chain:e}){return async function n(a,o=!0,u){let i=u||t,y=await at(e).getBalance(a),s=await i?.getBalance(a)||0n,p=[{chain:e,decimal:$[e],symbol:U.from({chain:e}).symbol,value:Kt({value:BigInt(s),decimal:$[e],bigIntDecimal:$[e]})},...y.filter((l)=>!Ot(l))];return(o?jt(p):p).map(({symbol:l,value:m,decimal:c})=>new U({decimal:c||$[e],value:m,identifier:`${e}.${l}`}))}}function bt({provider:t,isEIP1559Compatible:e=!0}){return async function n({feeOption:a=mt.Fast,chain:o,...u}){let y=await E({provider:t,isEIP1559Compatible:e})(),s=await t.estimateGas(u),p=U.from({chain:o}),{gasPrice:r,maxFeePerGas:l,maxPriorityFeePerGas:m}=y[a];if(!e&&r)return p.set(O.fromBigInt(r*s,p.decimal));if(l&&m){let c=(l+m)*s;return p.set(O.fromBigInt(c,p.decimal))}throw new Error("No gas price found")}}function rt(t){return()=>M.Ethereum===t?void 0:{...vt({chain:t}),chainId:_t[t],rpcUrls:[ct.get("rpcUrls")[t]],blockExplorerUrls:[Vt[t]]}}function Tt(t){return![M.Arbitrum,M.BinanceSmartChain].includes(t)}function vt({chain:t}){let e=$[t];switch(t){case M.Arbitrum:return{chainName:"Arbitrum One",nativeCurrency:{name:"Ethereum",symbol:M.Ethereum,decimals:e}};case M.Avalanche:return{chainName:"Avalanche Network",nativeCurrency:{name:"Avalanche",symbol:t,decimals:e}};case M.Base:return{chainName:"Base Mainnet",nativeCurrency:{name:"Ethereum",symbol:M.Ethereum,decimals:e}};case M.BinanceSmartChain:return{chainName:"BNB Chain",nativeCurrency:{name:"Binance Coin",symbol:"BNB",decimals:e}};case M.Polygon:return{chainName:"Polygon Mainnet",nativeCurrency:{name:"Polygon",symbol:M.Polygon,decimals:e}};default:throw new Error(`Chain ${t} is not supported`)}}var dt;((n)=>{n.Test="goerli";n.Main="homestead"})(dt||={});import{Chain as G}from"@swapkit/helpers";import{Chain as J,FeeOption as V}from"@swapkit/helpers";var ft=[{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall2.Call[]",name:"calls",type:"tuple[]"}],name:"aggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes[]",name:"returnData",type:"bytes[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall2.Call[]",name:"calls",type:"tuple[]"}],name:"blockAndAggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes32",name:"blockHash",type:"bytes32"},{components:[{internalType:"bool",name:"success",type:"bool"},{internalType:"bytes",name:"returnData",type:"bytes"}],internalType:"struct Multicall2.Result[]",name:"returnData",type:"tuple[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"}],name:"getBlockHash",outputs:[{internalType:"bytes32",name:"blockHash",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"getBlockNumber",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentBlockCoinbase",outputs:[{internalType:"address",name:"coinbase",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentBlockDifficulty",outputs:[{internalType:"uint256",name:"difficulty",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentBlockGasLimit",outputs:[{internalType:"uint256",name:"gaslimit",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getCurrentBlockTimestamp",outputs:[{internalType:"uint256",name:"timestamp",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"addr",type:"address"}],name:"getEthBalance",outputs:[{internalType:"uint256",name:"balance",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"getLastBlockHash",outputs:[{internalType:"bytes32",name:"blockHash",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bool",name:"requireSuccess",type:"bool"},{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall2.Call[]",name:"calls",type:"tuple[]"}],name:"tryAggregate",outputs:[{components:[{internalType:"bool",name:"success",type:"bool"},{internalType:"bytes",name:"returnData",type:"bytes"}],internalType:"struct Multicall2.Result[]",name:"returnData",type:"tuple[]"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bool",name:"requireSuccess",type:"bool"},{components:[{internalType:"address",name:"target",type:"address"},{internalType:"bytes",name:"callData",type:"bytes"}],internalType:"struct Multicall2.Call[]",name:"calls",type:"tuple[]"}],name:"tryBlockAndAggregate",outputs:[{internalType:"uint256",name:"blockNumber",type:"uint256"},{internalType:"bytes32",name:"blockHash",type:"bytes32"},{components:[{internalType:"bool",name:"success",type:"bool"},{internalType:"bytes",name:"returnData",type:"bytes"}],internalType:"struct Multicall2.Result[]",name:"returnData",type:"tuple[]"}],stateMutability:"nonpayable",type:"function"}];function wt({provider:t,signer:e}){let n=L(J.Ethereum)({provider:t,signer:e});async function a(o,u="0x5ba1e12693dc8f9c48aad8770482f4739beed696",i="aggregate",y=V.Fast){let s=await n.createContractTxObject({contractAddress:u,abi:ft,funcName:i,funcParams:[o]});return n.sendTransaction({...s,feeOptionKey:y})}return{...n,multicall:a}}function Bt({provider:t,signer:e}){let{estimateGasPrices:n,...a}=L(J.Arbitrum)({provider:t,signer:e});async function o(){try{let{gasPrice:u}=await t.getFeeData();if(!u)throw new Error("No fee data available");return{[V.Average]:{gasPrice:u},[V.Fast]:{gasPrice:u},[V.Fastest]:{gasPrice:u}}}catch(u){throw new Error(`Failed to estimate gas price: ${u.msg??u.toString()}`)}}return{...a,estimateGasPrices:o}}var gt=L(J.Avalanche),Mt=L(J.Base),ht=L(J.BinanceSmartChain),xt=L(J.Polygon);function L(t){return function e({provider:n,signer:a}){let o=Tt(t);return{...Q({provider:n,signer:a,isEIP1559Compatible:o}),estimateTransactionFee:bt({provider:n,isEIP1559Compatible:o}),getNetworkParams:rt(t),getBalance:N({provider:n,chain:t})}}}import{BaseDecimal as tn,Chain as _,ChainId as nn,ChainToExplorerUrl as en,FeeOption as A,SKConfig as an}from"@swapkit/helpers";import{Contract as on}from"ethers";var Rt=[{inputs:[{internalType:"address",name:"_owner",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"",type:"uint256"}],name:"DecimalsUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"",type:"uint256"}],name:"GasPriceUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"",type:"uint256"}],name:"L1BaseFeeUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"",type:"uint256"}],name:"OverheadUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"",type:"uint256"}],name:"ScalarUpdated",type:"event"},{inputs:[],name:"decimals",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"gasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"_data",type:"bytes"}],name:"getL1Fee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"_data",type:"bytes"}],name:"getL1GasUsed",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"l1BaseFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"overhead",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"scalar",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_decimals",type:"uint256"}],name:"setDecimals",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_gasPrice",type:"uint256"}],name:"setGasPrice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_baseFee",type:"uint256"}],name:"setL1BaseFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_overhead",type:"uint256"}],name:"setOverhead",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_scalar",type:"uint256"}],name:"setScalar",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"}];var un="0x420000000000000000000000000000000000000f";function v(t){return new on(un,Rt,t)}function Pt(t){return function e(){let n=v(t);if(n&&"l1BaseFee"in n)return n?.l1BaseFee();return}}function kt(t){return async function e({from:n,to:a,nonce:o,...u}){let{Transaction:i}=await import("ethers");if(!a)throw new Error("Missing to address");let y={...u,to:a,nonce:o?o:n?await t.getTransactionCount(n):0};return i.from(y).serialized}}function Ct(t){return async function e(n){let a=v(t),o=await kt(t)(n);if(a&&"getL1Fee"in a)return a.getL1Fee(o)}}function Gt(t){return async function e(n){let a=await t.send("eth_gasPrice",[]),o=await t.estimateGas(n);return a.mul(o)}}function ln(t){return async function e(n){let a=await Ct(t)(n),o=await Gt(t)(n);return a.add(o)}}function yn(t){return async function e(n){let a=v(t),o=await kt(t)(n);if(a&&"getL1GasUsed"in a)return a.getL1GasUsed(o)}}var sn=()=>({chainId:nn.OptimismHex,chainName:"Optimism",nativeCurrency:{name:"Ethereum",symbol:_.Ethereum,decimals:tn.ETH},rpcUrls:[an.get("rpcUrls")[_.Optimism]],blockExplorerUrls:[en[_.Optimism]]});function pn(t){return async function e(){try{let{maxFeePerGas:n,maxPriorityFeePerGas:a,gasPrice:o}=await t.getFeeData(),u=Pt(t)(),i=o;if(!(n&&a))throw new Error("No fee data available");return{[A.Average]:{l1GasPrice:u,gasPrice:o,maxFeePerGas:n,maxPriorityFeePerGas:a},[A.Fast]:{l1GasPrice:(u||0n)*15n/10n,gasPrice:i*15n/10n,maxFeePerGas:n,maxPriorityFeePerGas:a*15n/10n},[A.Fastest]:{l1GasPrice:(u||0n)*2n,gasPrice:i*2n,maxFeePerGas:n,maxPriorityFeePerGas:a*2n}}}catch(n){throw new Error(`Failed to estimate gas price: ${n.msg??n.toString()}`)}}}function Dt({provider:t,signer:e}){let n=Q({provider:t,signer:e}),a=Pt(t);return{...n,estimateGasPrices:pn(t),estimateL1Gas:yn(t),estimateL1GasCost:Ct(t),estimateL2GasCost:Gt(t),estimateTotalGasCost:ln(t),getBalance:N({provider:t,chain:_.Optimism}),getL1GasPrice:a,getNetworkParams:sn}}var Nn=(t)=>{switch(t){case G.Avalanche:return gt;case G.Arbitrum:return Bt;case G.Base:return Mt;case G.Optimism:return Dt;case G.Polygon:return xt;case G.BinanceSmartChain:return ht;case G.Ethereum:return wt;default:throw new Error(`Chain ${t} is not supported`)}};export{H as toHexString,Bn as toChecksumAddress,zt as isStateChangingCall,W as isBrowserProvider,Nn as getToolboxByChain,Z as getTokenAddress,kn as getProvider,rt as getNetworkParams,Tt as getIsEIP1559Compatible,at as getEvmApi,bt as getEstimateTransactionFee,E as getEstimateGasPrices,Y as getEIP1193SendTransaction,q as getCreateContractTxObject,Ft as getCreateContract,gn as getChecksumAddressFromAsset,N as getBalance,lt as evmValidateAddress,Cn as estimateMaxSendableAmount,yn as estimateL1Gas,cn as createCustomEvmApi,K as createContract,Dt as OPToolbox,j as MAX_APPROVAL,xt as MATICToolbox,dt as EthNetwork,wt as ETHToolbox,Q as BaseEVMToolbox,ht as BSCToolbox,Mt as BASEToolbox,gt as AVAXToolbox,Bt as ARBToolbox};
|
|
2
|
+
|
|
3
|
+
//# debugId=B6654C5D24F7B87A64756E2164756E21
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/evm/api.ts", "../src/evm/helpers.ts", "../src/evm/toolbox/baseEVMToolbox.ts", "../src/evm/types.ts", "../src/evm/toolbox/getToolboxByChain.ts", "../src/evm/toolbox/evm.ts", "../src/evm/contracts/eth/multicall.ts", "../src/evm/toolbox/op.ts", "../src/evm/contracts/op/gasOracle.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n Chain,\n ChainToChainId,\n type EVMChain,\n RequestClient,\n SKConfig,\n formatBigIntToSafeValue,\n warnOnce,\n} from \"@swapkit/helpers\";\n\nasync function getEthplorerBalance({ address }: { address: string }) {\n const apiKey = SKConfig.get(\"apiKeys\").ethplorer || \"freekey\";\n\n const { tokens = [] } = await RequestClient.get<AddressInfo>(\n `https://api.ethplorer.io/getAddressInfo/${address}`,\n { searchParams: { apiKey } },\n );\n\n return tokens\n .filter(({ tokenInfo: { symbol }, rawBalance }) => symbol && rawBalance !== \"0\")\n .map(({ tokenInfo: { symbol, decimals, address: tokenAddress }, rawBalance }) => ({\n chain: Chain.Ethereum,\n decimal: Number.parseInt(decimals),\n symbol: tokenAddress ? `${symbol}-${tokenAddress}` : symbol,\n value: formatBigIntToSafeValue({\n value: BigInt(rawBalance),\n decimal: Number.parseInt(decimals),\n bigIntDecimal: Number.parseInt(decimals),\n }),\n }));\n}\n\nasync function getCovalentBalance({ chain, address }: { chain: Chain; address: string }) {\n const apiKey = SKConfig.get(\"apiKeys\").covalent;\n\n if (!apiKey) {\n warnOnce(true, \"No covalent api key found. Use SKConfig.setApiKey('your-api-key')\");\n return [];\n }\n\n const { data } = await RequestClient.get<{ data: CovalentBalanceResponse }>(\n `https://api.covalenthq.com/v1/${ChainToChainId[chain]}/address/${address}/balances_v2/`,\n { searchParams: { key: apiKey } },\n );\n\n return (data?.items || [])\n .filter(({ is_spam }) => !is_spam)\n .map(\n ({ balance, contract_decimals, contract_ticker_symbol, contract_address, native_token }) => ({\n value: formatBigIntToSafeValue({\n value: BigInt(balance),\n decimal: contract_decimals,\n bigIntDecimal: contract_decimals,\n }),\n decimal: contract_decimals,\n chain,\n symbol: `${contract_ticker_symbol || \"Unknown\"}${native_token ? \"\" : `-${contract_address}`}`,\n }),\n );\n}\n\nexport function getEvmApi(chain: EVMChain) {\n const getBalance = chain === Chain.Ethereum ? getEthplorerBalance : getCovalentBalance;\n return { getBalance: (address: string) => getBalance({ address, chain }) };\n}\n\nexport function createCustomEvmApi(methods: ReturnType<typeof getEvmApi>) {\n return methods;\n}\n\ntype CovalentBalanceResponse = {\n address: string;\n updated_at: string;\n next_updated_at: string;\n quote_currency: string;\n items: {\n is_spam: boolean;\n contract_decimals: number;\n contract_name: string;\n contract_ticker_symbol: string;\n contract_address: string;\n logo_url: string;\n last_transferred_at: string;\n native_token: boolean;\n type: string;\n balance: number;\n balance_24h: number;\n quote_rate: number;\n quote_rate_24h: number;\n quote: number;\n quote_24h: number;\n }[];\n};\n\ntype PriceInfo = {\n rate: number;\n diff: number;\n diff7d?: number;\n ts: number;\n marketCapUsd?: number;\n availableSupply?: number;\n volume24h?: number;\n diff30d?: number;\n volDiff1?: number;\n volDiff7?: number;\n volDiff30?: number;\n currency?: string;\n};\n\ntype TokenInfo = {\n address: string;\n decimals: string;\n name: string;\n owner: string;\n symbol: string;\n totalSupply: string;\n lastUpdated: number;\n issuancesCount: number;\n holdersCount: number;\n image?: string;\n description?: string;\n website?: string;\n twitter?: string;\n facebook?: string;\n coingecko?: string;\n ethTransfersCount: number;\n price: boolean | PriceInfo | unknown;\n publicTags?: string[];\n txsCount?: number;\n transfersCount?: number;\n};\n\ntype TokenBalance = {\n tokenInfo: TokenInfo;\n balance: number;\n rawBalance: string;\n totalIn?: number;\n totalOut?: number;\n};\n\nexport type AddressInfo = {\n address: string;\n ETH: {\n balance: number;\n totalIn?: number;\n totalOut?: number;\n price: PriceInfo;\n };\n contractInfo?: {\n creatorAddress: string;\n transactionHash: string;\n timestamp: string;\n };\n tokenInfo?: TokenInfo;\n tokens?: TokenBalance[];\n countTxs: number;\n};\n",
|
|
6
|
+
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n ChainToExplorerUrl,\n ChainToHexChainId,\n type EVMChain,\n FeeOption,\n type NetworkParams,\n SKConfig,\n SwapKitNumber,\n filterAssets,\n formatBigIntToSafeValue,\n isGasAsset,\n} from \"@swapkit/helpers\";\nimport { type BrowserProvider, JsonRpcProvider, type Provider } from \"ethers\";\n\nimport { getEvmApi } from \"./api\";\nimport { getEstimateGasPrices } from \"./toolbox/baseEVMToolbox\";\nimport type { EIP1559TxParams, EVMMaxSendableAmountsParams } from \"./types\";\n\nexport const getProvider = (chain: EVMChain, customUrl?: string) => {\n return new JsonRpcProvider(customUrl || SKConfig.get(\"rpcUrls\")[chain]);\n};\n\n/**\n * @deprecated\n */\nexport const estimateMaxSendableAmount = async ({\n toolbox,\n from,\n memo = \"\",\n feeOptionKey = FeeOption.Fastest,\n assetValue,\n abi,\n funcName,\n funcParams,\n contractAddress,\n txOverrides,\n}: EVMMaxSendableAmountsParams): Promise<AssetValue> => {\n const balances = await toolbox.getBalance(from);\n const balance = balances.find(({ symbol, chain }) =>\n assetValue ? symbol === assetValue.symbol : symbol === AssetValue.from({ chain })?.symbol,\n );\n\n const gasRate = (await toolbox.estimateGasPrices())[feeOptionKey];\n\n if (!balance) return AssetValue.from({ chain: assetValue.chain });\n\n if (assetValue && (balance.chain !== assetValue.chain || balance.symbol !== assetValue?.symbol)) {\n return balance;\n }\n\n const gasLimit =\n abi && funcName && funcParams && contractAddress\n ? await toolbox.estimateCall({\n contractAddress,\n abi,\n funcName,\n funcParams,\n txOverrides,\n })\n : await toolbox.estimateGasLimit({\n from,\n recipient: from,\n memo,\n assetValue,\n });\n\n const isFeeEIP1559Compatible = \"maxFeePerGas\" in gasRate;\n const isFeeEVMLegacyCompatible = \"gasPrice\" in gasRate;\n\n if (!(isFeeEVMLegacyCompatible || isFeeEIP1559Compatible)) {\n throw new Error(\"Could not fetch fee data\");\n }\n\n const fee =\n gasLimit *\n (isFeeEIP1559Compatible\n ? (gasRate.maxFeePerGas || 1n) + (gasRate.maxPriorityFeePerGas || 1n)\n : gasRate.gasPrice);\n const maxSendableAmount = SwapKitNumber.fromBigInt(balance.getBaseValue(\"bigint\")).sub(\n fee.toString(),\n );\n\n return AssetValue.from({ chain: balance.chain, value: maxSendableAmount.getValue(\"string\") });\n};\n\nexport function toHexString(value: bigint) {\n return value > 0n ? `0x${value.toString(16)}` : \"0x0\";\n}\n\nexport function getBalance<C extends EVMChain>({\n provider: toolboxProvider,\n chain,\n}: { provider?: BrowserProvider | JsonRpcProvider; chain: C }) {\n return async function getBalance(\n address: string,\n scamFilter = true,\n overwriteProvider?: BrowserProvider | JsonRpcProvider,\n ) {\n const provider = overwriteProvider || toolboxProvider;\n const tokenBalances = await getEvmApi(chain).getBalance(address);\n const evmGasTokenBalance = (await provider?.getBalance(address)) || 0n;\n\n const balances = [\n {\n chain,\n decimal: BaseDecimal[chain],\n symbol: AssetValue.from({ chain }).symbol,\n value: formatBigIntToSafeValue({\n value: BigInt(evmGasTokenBalance),\n decimal: BaseDecimal[chain],\n bigIntDecimal: BaseDecimal[chain],\n }),\n },\n ...tokenBalances.filter((token) => !isGasAsset(token)),\n ];\n\n const filteredBalances = scamFilter ? filterAssets(balances) : balances;\n\n return filteredBalances.map(\n ({ symbol, value, decimal }) =>\n new AssetValue({\n decimal: decimal || BaseDecimal[chain],\n value,\n identifier: `${chain}.${symbol}`,\n }),\n );\n };\n}\n\nexport function getEstimateTransactionFee({\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider | BrowserProvider; isEIP1559Compatible?: boolean }) {\n return async function estimateTransactionFee({\n feeOption = FeeOption.Fast,\n chain,\n ...txObject\n }: EIP1559TxParams & { feeOption: FeeOption; chain: EVMChain }) {\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n const gasPrices = await estimateGasPrices();\n const gasLimit = await provider.estimateGas(txObject);\n\n const assetValue = AssetValue.from({ chain });\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = gasPrices[feeOption];\n\n if (!isEIP1559Compatible && gasPrice) {\n return assetValue.set(SwapKitNumber.fromBigInt(gasPrice * gasLimit, assetValue.decimal));\n }\n\n if (maxFeePerGas && maxPriorityFeePerGas) {\n const fee = (maxFeePerGas + maxPriorityFeePerGas) * gasLimit;\n\n return assetValue.set(SwapKitNumber.fromBigInt(fee, assetValue.decimal));\n }\n\n throw new Error(\"No gas price found\");\n };\n}\n\nexport function getNetworkParams<C extends EVMChain>(chain: C) {\n return () =>\n (Chain.Ethereum === chain\n ? undefined\n : {\n ...getNetworkInfo({ chain }),\n chainId: ChainToHexChainId[chain],\n rpcUrls: [SKConfig.get(\"rpcUrls\")[chain]],\n blockExplorerUrls: [ChainToExplorerUrl[chain]],\n }) as C extends Chain.Ethereum ? undefined : NetworkParams;\n}\n\nexport function getIsEIP1559Compatible<C extends EVMChain>(chain: C) {\n const notCompatible = [Chain.Arbitrum, Chain.BinanceSmartChain];\n\n return !notCompatible.includes(chain);\n}\n\nfunction getNetworkInfo<C extends EVMChain>({ chain }: { chain: C }) {\n const decimals = BaseDecimal[chain];\n\n switch (chain) {\n case Chain.Arbitrum:\n return {\n chainName: \"Arbitrum One\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals },\n };\n case Chain.Avalanche:\n return {\n chainName: \"Avalanche Network\",\n nativeCurrency: { name: \"Avalanche\", symbol: chain, decimals },\n };\n case Chain.Base:\n return {\n chainName: \"Base Mainnet\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals },\n };\n case Chain.BinanceSmartChain:\n return {\n chainName: \"BNB Chain\",\n nativeCurrency: { name: \"Binance Coin\", symbol: \"BNB\", decimals },\n };\n case Chain.Polygon:\n return {\n chainName: \"Polygon Mainnet\",\n nativeCurrency: { name: \"Polygon\", symbol: Chain.Polygon, decimals },\n };\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n}\n",
|
|
7
|
+
"import {\n type Asset,\n type AssetValue,\n Chain,\n ContractAddress,\n type EVMChain,\n FeeOption,\n SwapKitError,\n SwapKitNumber,\n type WalletTxParams,\n isGasAsset,\n} from \"@swapkit/helpers\";\nimport { erc20ABI } from \"@swapkit/helpers/contracts\";\nimport {\n BrowserProvider,\n Contract,\n type ContractTransaction,\n type Fragment,\n type HDNodeWallet,\n Interface,\n type JsonFragment,\n type JsonRpcSigner,\n type Provider,\n type Signer,\n getAddress,\n} from \"ethers\";\n\nimport {\n type ARBToolbox,\n type AVAXToolbox,\n type BASEToolbox,\n type BSCToolbox,\n type ETHToolbox,\n type MATICToolbox,\n type OPToolbox,\n toHexString,\n} from \"../index\";\nimport type {\n ApproveParams,\n CallParams,\n EIP1559TxParams,\n EVMTxParams,\n EstimateCallParams,\n IsApprovedParams,\n LegacyEVMTxParams,\n TransferParams,\n} from \"../types\";\n\nexport const MAX_APPROVAL = BigInt(\n \"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n);\n\nexport function BaseEVMToolbox<\n P extends Provider | BrowserProvider,\n S extends Signer | JsonRpcSigner | HDNodeWallet | undefined,\n>({\n provider,\n signer,\n isEIP1559Compatible = true,\n}: { signer: S; provider: P; isEIP1559Compatible?: boolean }) {\n return {\n call: getCall({ provider, signer, isEIP1559Compatible }),\n estimateCall: getEstimateCall({ provider, signer }),\n EIP1193SendTransaction: getEIP1193SendTransaction(provider),\n approve: getApprove({ provider, signer, isEIP1559Compatible }),\n approvedAmount: getApprovedAmount({ provider }),\n broadcastTransaction: provider.broadcastTransaction,\n createApprovalTx: getCreateApprovalTx(provider),\n createContract: getCreateContract({ provider }),\n createContractTxObject: getCreateContractTxObject(provider),\n createTransferTx: getCreateTransferTx({ provider, signer }),\n estimateGasLimit: getEstimateGasLimit({ provider, signer }),\n estimateGasPrices: getEstimateGasPrices({ provider, isEIP1559Compatible }),\n isApproved: getIsApproved({ provider }),\n sendTransaction: getSendTransaction({ provider, signer, isEIP1559Compatible }),\n signMessage: signer?.signMessage,\n transfer: getTransfer({ provider, signer, isEIP1559Compatible }),\n validateAddress: (address: string) => evmValidateAddress({ address }),\n };\n}\n\nexport function evmValidateAddress({ address }: { address: string }) {\n try {\n getAddress(address);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nexport type EVMWallet = ReturnType<typeof BaseEVMToolbox>;\nexport type EVMWalletType = {\n [Chain.Arbitrum]: ReturnType<typeof ARBToolbox>;\n [Chain.Avalanche]: ReturnType<typeof AVAXToolbox>;\n [Chain.Base]: ReturnType<typeof BASEToolbox>;\n [Chain.BinanceSmartChain]: ReturnType<typeof BSCToolbox>;\n [Chain.Ethereum]: ReturnType<typeof ETHToolbox>;\n [Chain.Optimism]: ReturnType<typeof OPToolbox>;\n [Chain.Polygon]: ReturnType<typeof MATICToolbox>;\n};\n\nexport type EVMWallets = {\n [chain in EVMChain]: EVMWallet & EVMWalletType[chain];\n};\n\nconst baseAssetAddress: Record<EVMChain, string> = {\n [Chain.Arbitrum]: ContractAddress.ARB,\n [Chain.Avalanche]: ContractAddress.AVAX,\n [Chain.Base]: ContractAddress.BASE,\n [Chain.BinanceSmartChain]: ContractAddress.BSC,\n [Chain.Ethereum]: ContractAddress.ETH,\n [Chain.Optimism]: ContractAddress.OP,\n [Chain.Polygon]: ContractAddress.MATIC,\n};\n\nconst stateMutable = [\"payable\", \"nonpayable\"];\n// const nonStateMutable = ['view', 'pure'];\n\nconst isEIP1559Transaction = (tx: EVMTxParams) =>\n (tx as EIP1559TxParams).type === 2 ||\n !!(tx as EIP1559TxParams).maxFeePerGas ||\n !!(tx as EIP1559TxParams).maxPriorityFeePerGas;\n\ntype ToolboxWrapParams<P = Provider | BrowserProvider, T = {}> = T & {\n isEIP1559Compatible?: boolean;\n provider: P;\n signer?: Signer;\n};\n\nexport function isBrowserProvider(provider: any) {\n return provider instanceof BrowserProvider;\n}\n\nexport function createContract(\n address: string,\n abi: readonly (JsonFragment | Fragment)[],\n provider: Provider,\n) {\n return new Contract(address, Interface.from(abi), provider);\n}\n\nexport function getCreateContract({ provider }: ToolboxWrapParams) {\n return function createContract(address: string, abi: readonly (JsonFragment | Fragment)[]) {\n return new Contract(address, Interface.from(abi), provider);\n };\n}\n\nexport function isStateChangingCall({\n abi,\n funcName,\n}: { abi: readonly JsonFragment[]; funcName: string }) {\n const abiFragment = abi.find((fragment: any) => fragment.name === funcName) as any;\n if (!abiFragment) throw new SwapKitError(\"toolbox_evm_no_abi_fragment\", { funcName });\n return abiFragment.stateMutability && stateMutable.includes(abiFragment.stateMutability);\n}\n\nfunction getCall({ provider, isEIP1559Compatible, signer }: ToolboxWrapParams) {\n /**\n * @info call contract function\n * When using this method to make a non state changing call to the blockchain, like a isApproved call,\n * the signer needs to be set to undefined\n */\n return async function call<T>({\n callProvider,\n contractAddress,\n abi,\n funcName,\n funcParams = [],\n txOverrides = {},\n feeOption = FeeOption.Fast,\n }: CallParams): Promise<T> {\n const contractProvider = callProvider || provider;\n if (!contractAddress) throw new Error(\"contractAddress must be provided\");\n\n const isStateChanging = isStateChangingCall({ abi, funcName });\n\n if (isStateChanging && isBrowserProvider(contractProvider) && signer) {\n const createTx = getCreateContractTxObject({ provider: contractProvider });\n const from = txOverrides?.from || (await signer?.getAddress());\n const txObject = await createTx({\n contractAddress,\n abi,\n funcName,\n funcParams,\n txOverrides: { ...txOverrides, from },\n });\n const sendTx = getEIP1193SendTransaction(contractProvider);\n\n return sendTx(txObject) as Promise<T>;\n }\n const contract = createContract(contractAddress, abi, contractProvider);\n\n // only use signer if the contract function is state changing\n if (isStateChanging) {\n if (!signer) throw new SwapKitError(\"toolbox_evm_no_signer\");\n\n const from = txOverrides?.from || (await signer.getAddress());\n if (!from) throw new SwapKitError(\"toolbox_evm_no_signer_address\");\n\n const connectedContract = contract.connect(signer);\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = (await estimateGasPrices())[\n feeOption\n ];\n\n const gasLimit = await contract.getFunction(funcName).estimateGas(...funcParams, txOverrides);\n\n // @ts-expect-error\n const result = await connectedContract[funcName](...funcParams, {\n ...txOverrides,\n gasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n /**\n * nonce must be set due to a possible bug with ethers.js,\n * expecting a synchronous nonce while the JsonRpcProvider delivers Promise\n */\n nonce: txOverrides?.nonce || (await contractProvider.getTransactionCount(from)),\n });\n\n return typeof result?.hash === \"string\" ? result?.hash : result;\n }\n\n const result = await contract[funcName]?.(...funcParams);\n\n return typeof result?.hash === \"string\" ? result?.hash : result;\n };\n}\n\nexport function getCreateContractTxObject({ provider }: ToolboxWrapParams) {\n return async ({ contractAddress, abi, funcName, funcParams = [], txOverrides }: CallParams) =>\n createContract(contractAddress, abi, provider)\n .getFunction(funcName)\n .populateTransaction(\n ...funcParams.concat(txOverrides).filter((p) => typeof p !== \"undefined\"),\n );\n}\n\nfunction getApprovedAmount({ provider }: ToolboxWrapParams) {\n return function approveAmount({ assetAddress, spenderAddress, from }: IsApprovedParams) {\n const call = getCall({ provider, isEIP1559Compatible: true });\n\n return call<bigint>({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"allowance\",\n funcParams: [from, spenderAddress],\n });\n };\n}\n\nfunction getIsApproved({ provider }: ToolboxWrapParams) {\n return async function isApproved({\n assetAddress,\n spenderAddress,\n from,\n amount = MAX_APPROVAL,\n }: IsApprovedParams) {\n const approvedAmount = await getApprovedAmount({ provider })({\n assetAddress,\n spenderAddress,\n from,\n });\n\n return SwapKitNumber.fromBigInt(approvedAmount).gte(SwapKitNumber.fromBigInt(BigInt(amount)));\n };\n}\n\nfunction getApprove({ signer, isEIP1559Compatible = true, provider }: ToolboxWrapParams) {\n return async function approve({\n assetAddress,\n spenderAddress,\n feeOptionKey = FeeOption.Fast,\n amount,\n gasLimitFallback,\n from,\n nonce,\n }: ApproveParams) {\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n\n const functionCallParams = {\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"approve\",\n funcParams,\n signer,\n txOverrides: { from },\n };\n\n if (isBrowserProvider(provider)) {\n const createTx = getCreateContractTxObject(provider);\n const sendTx = getEIP1193SendTransaction(provider);\n const txObject = await createTx(functionCallParams);\n\n return sendTx(txObject);\n }\n\n const call = getCall({ provider, isEIP1559Compatible });\n\n return call<string>({\n ...functionCallParams,\n funcParams,\n txOverrides: {\n from,\n nonce,\n gasLimit: gasLimitFallback ? BigInt(gasLimitFallback.toString()) : undefined,\n },\n feeOption: feeOptionKey,\n });\n };\n}\n\nfunction getTransfer({ signer, isEIP1559Compatible = true, provider }: ToolboxWrapParams) {\n return async function transfer({\n assetValue,\n memo,\n recipient,\n feeOptionKey = FeeOption.Fast,\n data,\n from: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: TransferParams) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = fromOverride || (await signer?.getAddress());\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (assetValue.isGasAsset) {\n const sendTx = getSendTransaction({ provider, signer, isEIP1559Compatible });\n const txObject = {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: data || hexlify(toUtf8Bytes(memo || \"\")),\n feeOptionKey,\n };\n\n return sendTx(txObject);\n }\n\n const call = getCall({ signer, provider, isEIP1559Compatible });\n const contractAddress = getTokenAddress(assetValue, chain);\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n\n return call<string>({\n contractAddress,\n abi: erc20ABI,\n funcName: \"transfer\",\n funcParams: [recipient, txAmount],\n txOverrides: { from, maxFeePerGas, maxPriorityFeePerGas, gasPrice },\n feeOption: feeOptionKey,\n });\n };\n}\n\nexport function getEstimateGasPrices({\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider; isEIP1559Compatible?: boolean }) {\n return async function estimateGasPrices() {\n try {\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = await provider.getFeeData();\n\n if (isEIP1559Compatible) {\n if (maxFeePerGas === null || maxPriorityFeePerGas === null)\n throw new SwapKitError(\"toolbox_evm_no_fee_data\");\n\n return {\n [FeeOption.Average]: { maxFeePerGas, maxPriorityFeePerGas },\n [FeeOption.Fast]: {\n maxFeePerGas: (maxFeePerGas * 15n) / 10n,\n maxPriorityFeePerGas: (maxPriorityFeePerGas * 15n) / 10n,\n },\n [FeeOption.Fastest]: {\n maxFeePerGas: maxFeePerGas * 2n,\n maxPriorityFeePerGas: maxPriorityFeePerGas * 2n,\n },\n };\n }\n if (!gasPrice) throw new SwapKitError(\"toolbox_evm_no_gas_price\");\n\n return {\n [FeeOption.Average]: { gasPrice },\n [FeeOption.Fast]: { gasPrice: (gasPrice * 15n) / 10n },\n [FeeOption.Fastest]: { gasPrice: gasPrice * 2n },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n };\n}\n\nfunction getEstimateCall({ provider, signer }: { signer?: Signer; provider: Provider }) {\n return function estimateCall({\n contractAddress,\n abi,\n funcName,\n funcParams = [],\n txOverrides,\n }: EstimateCallParams) {\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n\n const contract = createContract(contractAddress, abi, provider);\n return signer\n ? contract\n .connect(signer)\n .getFunction(funcName)\n .estimateGas(...funcParams, txOverrides)\n : contract.getFunction(funcName).estimateGas(...funcParams, txOverrides);\n };\n}\n\nfunction getEstimateGasLimit({ provider, signer }: ToolboxWrapParams) {\n return async function estimateGasLimit({\n assetValue,\n recipient,\n memo,\n from,\n funcName,\n funcParams,\n txOverrides,\n }: WalletTxParams & {\n assetValue: AssetValue;\n funcName?: string;\n funcParams?: unknown[];\n txOverrides?: EVMTxParams;\n }) {\n // const value = assetValue.getBaseValue(\"bigint\");\n const value = assetValue.bigIntValue;\n\n const assetAddress = assetValue.isGasAsset\n ? null\n : getTokenAddress(assetValue, assetValue.chain as EVMChain);\n\n if (assetAddress && funcName) {\n const estimateCall = getEstimateCall({ provider, signer });\n // ERC20 gas estimate\n return estimateCall({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName,\n funcParams,\n txOverrides,\n });\n }\n\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n\n return provider.estimateGas({\n from,\n to: recipient,\n value,\n data: memo ? hexlify(toUtf8Bytes(memo)) : undefined,\n });\n };\n}\n\nfunction getSendTransaction({ provider, signer, isEIP1559Compatible = true }: ToolboxWrapParams) {\n return async function sendTransaction({\n feeOptionKey = FeeOption.Fast,\n ...tx\n }: EVMTxParams & { feeOptionKey?: FeeOption }) {\n const { from, to, data, value, ...transaction } = tx;\n\n if (!signer) throw new SwapKitError(\"toolbox_evm_no_signer\");\n if (!to) throw new SwapKitError(\"toolbox_evm_no_to_address\");\n\n const parsedTxObject = {\n ...transaction,\n data: data || \"0x\",\n to,\n from,\n value: BigInt(value || 0),\n };\n\n // early return to skip gas estimation if provider is EIP-1193\n if (isBrowserProvider(provider)) {\n const sendTx = getEIP1193SendTransaction(provider);\n return sendTx(parsedTxObject);\n }\n\n const address = from || (await signer.getAddress());\n const nonce = tx.nonce || (await provider.getTransactionCount(address));\n const chainId = (await provider.getNetwork()).chainId;\n\n const isEIP1559 = isEIP1559Transaction(parsedTxObject) || isEIP1559Compatible;\n const estimateGasPrices = getEstimateGasPrices({ provider, isEIP1559Compatible });\n\n const feeData =\n (isEIP1559 &&\n !(\n (parsedTxObject as EIP1559TxParams).maxFeePerGas &&\n (parsedTxObject as EIP1559TxParams).maxPriorityFeePerGas\n )) ||\n !(parsedTxObject as LegacyEVMTxParams).gasPrice\n ? Object.entries((await estimateGasPrices())[feeOptionKey]).reduce(\n // biome-ignore lint/performance/noAccumulatingSpread: this is a small object\n (acc, [k, v]) => ({ ...acc, [k]: toHexString(BigInt(v)) }),\n {} as {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n gasPrice?: string;\n },\n )\n : {};\n let gasLimit: string;\n try {\n gasLimit = toHexString(\n parsedTxObject.gasLimit || ((await provider.estimateGas(parsedTxObject)) * 11n) / 10n,\n );\n } catch (error) {\n throw new SwapKitError(\"toolbox_evm_error_estimating_gas_limit\", { error });\n }\n\n try {\n const txObject = {\n ...parsedTxObject,\n chainId,\n type: isEIP1559 ? 2 : 0,\n gasLimit,\n nonce,\n ...feeData,\n };\n\n try {\n const response = await signer.sendTransaction(txObject);\n return response.hash;\n } catch (_error) {\n const txHex = await signer.signTransaction({\n ...txObject,\n from: address,\n });\n const response = await provider.broadcastTransaction(txHex);\n return response.hash;\n }\n } catch (error) {\n throw new SwapKitError(\"toolbox_evm_error_sending_transaction\", { error });\n }\n };\n}\n\n/**\n * Exported helper functions\n */\nexport function toChecksumAddress(address: string) {\n return getAddress(address);\n}\n\nexport function getEIP1193SendTransaction(provider: Provider | BrowserProvider) {\n return function EIP1193SendTransaction({\n value,\n ...params\n }: EVMTxParams | ContractTransaction): Promise<string> {\n if (!isBrowserProvider(provider)) {\n throw new SwapKitError(\"toolbox_evm_provider_not_eip1193_compatible\");\n }\n\n return (provider as BrowserProvider).send(\"eth_sendTransaction\", [\n { value: toHexString(BigInt(value || 0)), ...params } as any,\n ]);\n };\n}\n\nexport function getChecksumAddressFromAsset(asset: Asset, chain: EVMChain) {\n const assetAddress = getTokenAddress(asset, chain);\n\n if (assetAddress) {\n return getAddress(assetAddress.toLowerCase());\n }\n\n throw new SwapKitError(\"toolbox_evm_invalid_gas_asset_address\");\n}\n\nexport function getTokenAddress({ chain, symbol, ticker }: Asset, baseAssetChain: EVMChain) {\n try {\n const isBSCBNB = chain === Chain.BinanceSmartChain && symbol === \"BNB\" && ticker === \"BNB\";\n const isBaseAsset =\n chain === baseAssetChain && symbol === baseAssetChain && ticker === baseAssetChain;\n const isEVMAsset =\n [Chain.Arbitrum, Chain.Base].includes(chain) && symbol === \"ETH\" && ticker === \"ETH\";\n\n if (isBaseAsset || isBSCBNB || isEVMAsset) {\n return baseAssetAddress[baseAssetChain];\n }\n\n // strip 0X only - 0x is still valid\n return getAddress(symbol.slice(ticker.length + 1).replace(/^0X/, \"\"));\n } catch (_error) {\n return null;\n }\n}\n\nfunction getCreateTransferTx({\n provider,\n signer,\n}: { provider: Provider | BrowserProvider; signer?: Signer }) {\n return async function createTransferTx({\n assetValue,\n memo,\n recipient,\n feeOptionKey = FeeOption.Fast,\n data,\n from: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: TransferParams) {\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = fromOverride || (await signer?.getAddress());\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (isGasAsset(assetValue)) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n\n return {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: data || hexlify(toUtf8Bytes(memo || \"\")),\n };\n }\n\n const contractAddress = getTokenAddress(assetValue, chain);\n if (!contractAddress) throw new SwapKitError(\"toolbox_evm_no_contract_address\");\n const createTx = getCreateContractTxObject(provider);\n\n return createTx({\n contractAddress,\n abi: erc20ABI,\n funcName: \"transfer\",\n funcParams: [recipient, txAmount],\n txOverrides: { from, maxFeePerGas, maxPriorityFeePerGas, gasPrice },\n });\n };\n}\n\nfunction getCreateApprovalTx(provider: Provider) {\n return async function createApprovalTx({\n assetAddress,\n spenderAddress,\n amount,\n from,\n }: ApproveParams) {\n const createTx = getCreateContractTxObject(provider);\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n\n const txObject = await createTx({\n contractAddress: assetAddress,\n abi: erc20ABI,\n funcName: \"approve\",\n funcParams,\n txOverrides: { from },\n });\n\n return txObject;\n };\n}\n",
|
|
8
|
+
"import type { AssetValue, FeeOption, WalletTxParams } from \"@swapkit/helpers\";\nimport type { BigNumberish, JsonFragment, Transaction } from \"ethers\";\n\nimport type {\n ARBToolbox,\n AVAXToolbox,\n BASEToolbox,\n BSCToolbox,\n ETHToolbox,\n MATICToolbox,\n OPToolbox,\n getProvider,\n} from \"./index\";\n\nexport enum EthNetwork {\n Test = \"goerli\",\n Main = \"homestead\",\n}\n\nexport type ApproveParams = {\n assetAddress: string;\n spenderAddress: string;\n feeOptionKey?: FeeOption;\n amount?: BigNumberish;\n from: string;\n // Optional fallback in case estimation for gas limit fails\n gasLimitFallback?: BigNumberish;\n nonce?: number;\n};\n\nexport type ApprovedParams = {\n assetAddress: string;\n spenderAddress: string;\n from: string;\n};\n\nexport type IsApprovedParams = ApprovedParams & {\n amount?: BigNumberish;\n};\n\nexport type CallParams = {\n callProvider?: ReturnType<typeof getProvider>;\n contractAddress: string;\n abi: readonly JsonFragment[];\n funcName: string;\n funcParams?: unknown[];\n txOverrides?: Partial<Transaction>;\n feeOption?: FeeOption;\n};\n\nexport type EstimateCallParams = Pick<\n CallParams,\n \"contractAddress\" | \"abi\" | \"funcName\" | \"funcParams\" | \"txOverrides\"\n>;\n\nexport type TransferParams = WalletTxParams & {\n gasLimit?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n data?: string;\n from: string;\n nonce?: number;\n assetValue: AssetValue;\n};\n\nexport type BaseEVMToolboxType = ReturnType<\n | typeof ARBToolbox\n | typeof AVAXToolbox\n | typeof BASEToolbox\n | typeof BSCToolbox\n | typeof ETHToolbox\n | typeof MATICToolbox\n | typeof OPToolbox\n>;\n\nexport type EVMMaxSendableAmountsParams = {\n from: string;\n toolbox: BaseEVMToolboxType;\n assetValue: AssetValue;\n feeOptionKey?: FeeOption;\n memo?: string;\n abi?: readonly JsonFragment[];\n funcName?: string;\n contractAddress?: string;\n funcParams?: unknown[];\n txOverrides?: Partial<Transaction>;\n};\n\nexport type EVMTxBaseParams<T = bigint> = {\n to?: string;\n from?: string;\n nonce?: number;\n gasLimit?: T;\n data?: string;\n value?: T;\n chainId?: T;\n};\n\nexport type EIP1559TxParams<T = bigint> = EVMTxBaseParams<T> & {\n type?: number;\n maxFeePerGas?: T;\n maxPriorityFeePerGas?: T;\n};\n\nexport type LegacyEVMTxParams<T = bigint> = EVMTxBaseParams<T> & {\n gasPrice?: T;\n};\n\nexport type EVMTxParams = EIP1559TxParams | LegacyEVMTxParams;\n",
|
|
9
|
+
"import { Chain } from \"@swapkit/helpers\";\n\nimport { ARBToolbox, AVAXToolbox, BASEToolbox, BSCToolbox, ETHToolbox, MATICToolbox } from \"./evm\";\nimport { OPToolbox } from \"./op\";\n\ntype ToolboxType = {\n ARB: typeof ARBToolbox;\n AVAX: typeof AVAXToolbox;\n BASE: typeof BASEToolbox;\n BSC: typeof BSCToolbox;\n ETH: typeof ETHToolbox;\n MATIC: typeof MATICToolbox;\n OP: typeof OPToolbox;\n};\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(chain: T): ToolboxType[T] => {\n switch (chain) {\n case Chain.Avalanche:\n return AVAXToolbox as ToolboxType[T];\n case Chain.Arbitrum:\n return ARBToolbox as ToolboxType[T];\n case Chain.Base:\n return BASEToolbox as ToolboxType[T];\n case Chain.Optimism:\n return OPToolbox as ToolboxType[T];\n case Chain.Polygon:\n return MATICToolbox as ToolboxType[T];\n case Chain.BinanceSmartChain:\n return BSCToolbox as ToolboxType[T];\n case Chain.Ethereum:\n return ETHToolbox as ToolboxType[T];\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n\nexport { evmValidateAddress } from \"./baseEVMToolbox\";\n",
|
|
10
|
+
"import { Chain, type EVMChain, FeeOption } from \"@swapkit/helpers\";\nimport type { BrowserProvider, JsonRpcProvider, Signer } from \"ethers\";\nimport { multicallAbi } from \"../contracts/eth/multicall\";\nimport {\n getBalance,\n getEstimateTransactionFee,\n getIsEIP1559Compatible,\n getNetworkParams,\n} from \"../helpers\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nexport function ETHToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const evmToolbox = createEvmToolbox(Chain.Ethereum)({\n provider,\n signer,\n });\n async function multicall(\n callTuples: { address: string; data: string }[],\n multicallAddress = \"0x5ba1e12693dc8f9c48aad8770482f4739beed696\",\n funcName = \"aggregate\",\n feeOptionKey: FeeOption = FeeOption.Fast,\n ) {\n const txObject = await evmToolbox.createContractTxObject({\n contractAddress: multicallAddress,\n abi: multicallAbi,\n funcName,\n funcParams: [callTuples],\n });\n\n return evmToolbox.sendTransaction({ ...txObject, feeOptionKey });\n }\n\n return { ...evmToolbox, multicall };\n}\n\nexport function ARBToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const { estimateGasPrices: _, ...evmToolbox } = createEvmToolbox(Chain.Arbitrum)({\n provider,\n signer,\n });\n\n async function estimateGasPrices() {\n try {\n const { gasPrice } = await provider.getFeeData();\n\n if (!gasPrice) throw new Error(\"No fee data available\");\n\n return {\n [FeeOption.Average]: { gasPrice },\n [FeeOption.Fast]: { gasPrice },\n [FeeOption.Fastest]: { gasPrice },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n }\n\n return { ...evmToolbox, estimateGasPrices };\n}\n\nexport const AVAXToolbox = createEvmToolbox(Chain.Avalanche);\nexport const BASEToolbox = createEvmToolbox(Chain.Base);\nexport const BSCToolbox = createEvmToolbox(Chain.BinanceSmartChain);\nexport const MATICToolbox = createEvmToolbox(Chain.Polygon);\n\nfunction createEvmToolbox<C extends EVMChain>(chain: C) {\n return function createEvmToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n }: { provider: P; signer?: S }) {\n const isEIP1559Compatible = getIsEIP1559Compatible(chain);\n const evmToolbox = BaseEVMToolbox({ provider, signer, isEIP1559Compatible });\n\n return {\n ...evmToolbox,\n estimateTransactionFee: getEstimateTransactionFee({ provider, isEIP1559Compatible }),\n getNetworkParams: getNetworkParams(chain),\n getBalance: getBalance({ provider, chain }),\n };\n };\n}\n",
|
|
11
|
+
"export const multicallAbi = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"aggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes[]\", name: \"returnData\", type: \"bytes[]\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"blockAndAggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" },\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" }],\n name: \"getBlockHash\",\n outputs: [{ internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getBlockNumber\",\n outputs: [{ internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockCoinbase\",\n outputs: [{ internalType: \"address\", name: \"coinbase\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockDifficulty\",\n outputs: [{ internalType: \"uint256\", name: \"difficulty\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockGasLimit\",\n outputs: [{ internalType: \"uint256\", name: \"gaslimit\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getCurrentBlockTimestamp\",\n outputs: [{ internalType: \"uint256\", name: \"timestamp\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"addr\", type: \"address\" }],\n name: \"getEthBalance\",\n outputs: [{ internalType: \"uint256\", name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getLastBlockHash\",\n outputs: [{ internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"bool\", name: \"requireSuccess\", type: \"bool\" },\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"tryAggregate\",\n outputs: [\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"bool\", name: \"requireSuccess\", type: \"bool\" },\n {\n components: [\n { internalType: \"address\", name: \"target\", type: \"address\" },\n { internalType: \"bytes\", name: \"callData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Call[]\",\n name: \"calls\",\n type: \"tuple[]\",\n },\n ],\n name: \"tryBlockAndAggregate\",\n outputs: [\n { internalType: \"uint256\", name: \"blockNumber\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"blockHash\", type: \"bytes32\" },\n {\n components: [\n { internalType: \"bool\", name: \"success\", type: \"bool\" },\n { internalType: \"bytes\", name: \"returnData\", type: \"bytes\" },\n ],\n internalType: \"struct Multicall2.Result[]\",\n name: \"returnData\",\n type: \"tuple[]\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n];\n",
|
|
12
|
+
"import {\n BaseDecimal,\n Chain,\n ChainId,\n ChainToExplorerUrl,\n FeeOption,\n SKConfig,\n} from \"@swapkit/helpers\";\nimport type { BrowserProvider, JsonRpcProvider, Signer, TransactionRequest } from \"ethers\";\nimport { Contract } from \"ethers\";\n\nimport { gasOracleAbi } from \"../contracts/op/gasOracle\";\nimport { getBalance } from \"../helpers\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nconst GAS_PRICE_ORACLE_ADDRESS = \"0x420000000000000000000000000000000000000f\";\n\nfunction connectGasPriceOracle<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return new Contract(GAS_PRICE_ORACLE_ADDRESS, gasOracleAbi, provider);\n}\n\nfunction getL1GasPriceFetcher<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return function getL1GasPrice() {\n const gasPriceOracle = connectGasPriceOracle(provider);\n\n if (gasPriceOracle && \"l1BaseFee\" in gasPriceOracle) {\n return gasPriceOracle?.l1BaseFee() as unknown as bigint;\n }\n\n return undefined;\n };\n}\n\nfunction serializeTx<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function serializeTx({ from, to, nonce, ...tx }: TransactionRequest) {\n const { Transaction } = await import(\"ethers\");\n\n if (!to) throw new Error(\"Missing to address\");\n const txParams = {\n ...tx,\n to: to as string,\n nonce: nonce ? nonce : from ? await provider.getTransactionCount(from) : 0,\n };\n\n return Transaction.from(txParams).serialized;\n };\n}\n\nfunction estimateL1GasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL1GasCost(tx: TransactionRequest) {\n const gasPriceOracle = connectGasPriceOracle(provider);\n const serializedTx = await serializeTx(provider)(tx);\n\n if (gasPriceOracle && \"getL1Fee\" in gasPriceOracle) {\n return gasPriceOracle.getL1Fee(serializedTx);\n }\n };\n}\n\nfunction estimateL2GasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL2GasCost(tx: TransactionRequest) {\n const l2GasPrice = await provider.send(\"eth_gasPrice\", []);\n const l2GasCost = await provider.estimateGas(tx);\n return l2GasPrice.mul(l2GasCost);\n };\n}\n\nfunction estimateTotalGasCost<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateTotalGasCost(tx: TransactionRequest) {\n const l1GasCost = await estimateL1GasCost(provider)(tx);\n const l2GasCost = await estimateL2GasCost(provider)(tx);\n return l1GasCost.add(l2GasCost);\n };\n}\n\nexport function estimateL1Gas<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateL1Gas(tx: TransactionRequest) {\n const gasPriceOracle = connectGasPriceOracle(provider);\n const serializedTx = await serializeTx(provider)(tx);\n\n if (gasPriceOracle && \"getL1GasUsed\" in gasPriceOracle) {\n return gasPriceOracle.getL1GasUsed(serializedTx);\n }\n };\n}\n\nconst getNetworkParams = () => ({\n chainId: ChainId.OptimismHex,\n chainName: \"Optimism\",\n nativeCurrency: { name: \"Ethereum\", symbol: Chain.Ethereum, decimals: BaseDecimal.ETH },\n rpcUrls: [SKConfig.get(\"rpcUrls\")[Chain.Optimism]],\n blockExplorerUrls: [ChainToExplorerUrl[Chain.Optimism]],\n});\n\nfunction estimateGasPrices<P extends JsonRpcProvider | BrowserProvider>(provider: P) {\n return async function estimateGasPrices() {\n try {\n const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = await provider.getFeeData();\n const l1GasPrice = getL1GasPriceFetcher(provider)();\n const price = gasPrice as bigint;\n\n if (!(maxFeePerGas && maxPriorityFeePerGas)) {\n throw new Error(\"No fee data available\");\n }\n\n return {\n [FeeOption.Average]: {\n l1GasPrice,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n [FeeOption.Fast]: {\n l1GasPrice: ((l1GasPrice || 0n) * 15n) / 10n,\n gasPrice: (price * 15n) / 10n,\n maxFeePerGas,\n maxPriorityFeePerGas: (maxPriorityFeePerGas * 15n) / 10n,\n },\n [FeeOption.Fastest]: {\n l1GasPrice: (l1GasPrice || 0n) * 2n,\n gasPrice: price * 2n,\n maxFeePerGas,\n maxPriorityFeePerGas: maxPriorityFeePerGas * 2n,\n },\n };\n } catch (error) {\n throw new Error(\n `Failed to estimate gas price: ${(error as any).msg ?? (error as any).toString()}`,\n );\n }\n };\n}\n\nexport function OPToolbox<P extends JsonRpcProvider | BrowserProvider, S extends Signer>({\n provider,\n signer,\n}: { signer?: S; provider: P }) {\n const evmToolbox = BaseEVMToolbox({ provider, signer });\n const getL1GasPrice = getL1GasPriceFetcher(provider);\n\n return {\n ...evmToolbox,\n estimateGasPrices: estimateGasPrices(provider),\n estimateL1Gas: estimateL1Gas(provider),\n estimateL1GasCost: estimateL1GasCost(provider),\n estimateL2GasCost: estimateL2GasCost(provider),\n estimateTotalGasCost: estimateTotalGasCost(provider),\n getBalance: getBalance({ provider, chain: Chain.Optimism }),\n getL1GasPrice,\n getNetworkParams,\n };\n}\n",
|
|
13
|
+
"export const gasOracleAbi = [\n {\n inputs: [{ internalType: \"address\", name: \"_owner\", type: \"address\" }],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"DecimalsUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"GasPriceUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"L1BaseFeeUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"OverheadUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: \"address\", name: \"previousOwner\", type: \"address\" },\n { indexed: true, internalType: \"address\", name: \"newOwner\", type: \"address\" },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n name: \"ScalarUpdated\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"gasPrice\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"bytes\", name: \"_data\", type: \"bytes\" }],\n name: \"getL1Fee\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"bytes\", name: \"_data\", type: \"bytes\" }],\n name: \"getL1GasUsed\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"l1BaseFee\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"overhead\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [{ internalType: \"address\", name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"scalar\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_decimals\", type: \"uint256\" }],\n name: \"setDecimals\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_gasPrice\", type: \"uint256\" }],\n name: \"setGasPrice\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_baseFee\", type: \"uint256\" }],\n name: \"setL1BaseFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_overhead\", type: \"uint256\" }],\n name: \"setOverhead\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"uint256\", name: \"_scalar\", type: \"uint256\" }],\n name: \"setScalar\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ internalType: \"address\", name: \"newOwner\", type: \"address\" }],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n];\n"
|
|
14
|
+
],
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "B6654C5D24F7B87A64756E2164756E21",
|
|
17
|
+
"names": []
|
|
18
|
+
}
|
package/dist/index.cjs
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var I={};$(I,{validateAddress:()=>Y,RadixToolbox:()=>B});module.exports=_(I);var Q=require("@swapkit/helpers");function Y(j){return j.startsWith("account_rdx1")&&j.length===66}function q({networkApi:j}){return async function J(K){let M=await G({address:K,networkApi:j});return v({resources:M,networkApi:j})}}async function G({address:j,networkApi:J}){let K=!0,M,H=[],L=await x(J);while(K){let U={address:j,limit_per_page:100,cursor:M,at_ledger_state:{state_version:L}},N=await J.state.innerClient.entityFungiblesPage({stateEntityFungiblesPageRequest:U});if(H=H.concat(N.items),N.next_cursor)M=N.next_cursor;else K=!1}return H}async function v({resources:j,networkApi:J}){let K=[],M=50,H=[];for(let L=0;L<j.length;L+=50)H.push(j.slice(L,L+50));for(let L of H){let U=L.map((z)=>z.resource_address),N=await J.state.getEntityDetailsVaultAggregated(U),W=new Map;for(let z of N)if(z.details!==void 0){let O=z.metadata?.items.find((Z)=>Z.key==="symbol"),V=O?.value.typed.type==="String"?O.value.typed.value:"?";if(z.details.type==="FungibleResource")W.set(z.address,{decimals:z.details.divisibility,symbol:V})}for(let z of L)if(z.aggregation_level==="Global"){let O=W.get(z.resource_address)||{decimals:0,symbol:"?"},V=Q.AssetValue.from({asset:O.symbol!==Q.Chain.Radix?`${Q.Chain.Radix}.${O.symbol}-${z.resource_address}`:"XRD.XRD",value:z.amount});K.push(V)}}return K}async function x(j){return j.status.getCurrent().then((J)=>J.ledger_state.state_version)}var B=async({dappConfig:j})=>{let{RadixDappToolkit:J}=await import("@radixdlt/radix-dapp-toolkit"),{GatewayApiClient:K}=await import("@radixdlt/babylon-gateway-api-sdk"),M=J({...j,networkId:j.network?.networkId||1}),H=K.initialize(M.gatewayApi.clientConfig);return{getAddress:()=>"",getBalance:q({networkApi:H}),networkApi:H,validateAddress:Y,signAndBroadcast:()=>{throw new Error("Not implemented")}}};
|
|
2
|
+
|
|
3
|
+
//# debugId=508D57A610BAAFF564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/radix/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type {\n FungibleResourcesCollectionItem,\n GatewayApiClient,\n StateEntityDetailsVaultResponseItem,\n StateEntityFungiblesPageRequest,\n StateEntityFungiblesPageResponse,\n} from \"@radixdlt/babylon-gateway-api-sdk\";\nimport { AssetValue, Chain, type SKConfigIntegrations } from \"@swapkit/helpers\";\n\nexport type RadixWallets = {\n [Chain.Radix]: Awaited<ReturnType<typeof RadixToolbox>>;\n};\n\ntype RadixGetBalanceParams = {\n address: string;\n networkApi: GatewayApiClient;\n};\n// Could not find anything sync in SDK, ask Radix team\nexport function validateAddress(address: string) {\n return address.startsWith(\"account_rdx1\") && address.length === 66;\n}\n\nfunction getBalance({ networkApi }: { networkApi: GatewayApiClient }) {\n return async function getBalance(address: string) {\n const fungibleResources = await fetchFungibleResources({ address, networkApi });\n const fungibleBalances = convertResourcesToBalances({\n resources: fungibleResources,\n networkApi,\n });\n return fungibleBalances;\n };\n}\n\nasync function fetchFungibleResources({\n address,\n networkApi,\n}: RadixGetBalanceParams): Promise<FungibleResourcesCollectionItem[]> {\n let hasNextPage = true;\n let nextCursor: string | undefined;\n let fungibleResources: FungibleResourcesCollectionItem[] = [];\n const stateVersion = await currentStateVersion(networkApi);\n while (hasNextPage) {\n const stateEntityFungiblesPageRequest: StateEntityFungiblesPageRequest = {\n address: address,\n limit_per_page: 100,\n cursor: nextCursor,\n at_ledger_state: {\n state_version: stateVersion,\n },\n };\n\n const stateEntityFungiblesPageResponse: StateEntityFungiblesPageResponse =\n await networkApi.state.innerClient.entityFungiblesPage({\n stateEntityFungiblesPageRequest: stateEntityFungiblesPageRequest,\n });\n\n fungibleResources = fungibleResources.concat(stateEntityFungiblesPageResponse.items);\n if (stateEntityFungiblesPageResponse.next_cursor) {\n nextCursor = stateEntityFungiblesPageResponse.next_cursor;\n } else {\n hasNextPage = false;\n }\n }\n return fungibleResources;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\nasync function convertResourcesToBalances({\n resources,\n networkApi,\n}: {\n resources: FungibleResourcesCollectionItem[]; //| NonFungibleResourcesCollectionItem[];\n networkApi: GatewayApiClient;\n}): Promise<AssetValue[]> {\n const balances: AssetValue[] = [];\n const BATCH_SIZE = 50;\n\n // Split resources into batches of up to 50 items\n const resourceBatches: FungibleResourcesCollectionItem[][] = [];\n for (let i = 0; i < resources.length; i += BATCH_SIZE) {\n resourceBatches.push(resources.slice(i, i + BATCH_SIZE));\n }\n\n for (const batch of resourceBatches) {\n const addresses = batch.map((item) => item.resource_address);\n const response: StateEntityDetailsVaultResponseItem[] =\n await networkApi.state.getEntityDetailsVaultAggregated(addresses);\n\n const divisibilities = new Map<string, { decimals: number; symbol: string }>();\n\n for (const result of response) {\n if (result.details !== undefined) {\n const metaDataSymbol = result.metadata?.items.find((item) => item.key === \"symbol\");\n const symbol =\n metaDataSymbol?.value.typed.type === \"String\" ? metaDataSymbol.value.typed.value : \"?\";\n\n if (result.details.type === \"FungibleResource\") {\n divisibilities.set(result.address, {\n decimals: result.details.divisibility,\n symbol,\n });\n }\n }\n }\n\n for (const item of batch) {\n if (item.aggregation_level === \"Global\") {\n const assetInfo = divisibilities.get(item.resource_address) || { decimals: 0, symbol: \"?\" };\n\n const balance = AssetValue.from({\n asset:\n assetInfo.symbol !== Chain.Radix\n ? `${Chain.Radix}.${assetInfo.symbol}-${item.resource_address}`\n : \"XRD.XRD\",\n value: item.amount,\n });\n balances.push(balance);\n }\n }\n }\n\n return balances;\n}\n\nasync function currentStateVersion(networkApi: GatewayApiClient) {\n return networkApi.status.getCurrent().then((status) => status.ledger_state.state_version);\n}\n\nexport const RadixToolbox = async ({\n dappConfig,\n}: { dappConfig: SKConfigIntegrations[\"radix\"] }) => {\n const { RadixDappToolkit } = await import(\"@radixdlt/radix-dapp-toolkit\");\n const { GatewayApiClient } = await import(\"@radixdlt/babylon-gateway-api-sdk\");\n\n const radixToolkit = RadixDappToolkit({\n ...dappConfig,\n networkId: dappConfig.network?.networkId || 1,\n });\n\n const networkApi = GatewayApiClient.initialize(radixToolkit.gatewayApi.clientConfig);\n\n return {\n getAddress: () => \"\",\n getBalance: getBalance({ networkApi }),\n networkApi,\n validateAddress,\n signAndBroadcast: (() => {\n throw new Error(\"Not implemented\");\n }) as (params: any) => Promise<string>,\n };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "6EAO6D,IAA7D,8BAWO,SAAS,CAAe,CAAC,EAAiB,CAC/C,OAAO,EAAQ,WAAW,cAAc,GAAK,EAAQ,SAAW,GAGlE,SAAS,CAAU,EAAG,cAAgD,CACpE,OAAO,eAAe,CAAU,CAAC,EAAiB,CAChD,IAAM,EAAoB,MAAM,EAAuB,CAAE,UAAS,YAAW,CAAC,EAK9E,OAJyB,EAA2B,CAClD,UAAW,EACX,YACF,CAAC,GAKL,eAAe,CAAsB,EACnC,UACA,cACoE,CACpE,IAAI,EAAc,GACd,EACA,EAAuD,CAAC,EACtD,EAAe,MAAM,EAAoB,CAAU,EACzD,MAAO,EAAa,CAClB,IAAM,EAAmE,CACvE,QAAS,EACT,eAAgB,IAChB,OAAQ,EACR,gBAAiB,CACf,cAAe,CACjB,CACF,EAEM,EACJ,MAAM,EAAW,MAAM,YAAY,oBAAoB,CACrD,gCAAiC,CACnC,CAAC,EAGH,GADA,EAAoB,EAAkB,OAAO,EAAiC,KAAK,EAC/E,EAAiC,YACnC,EAAa,EAAiC,YAE9C,OAAc,GAGlB,OAAO,EAIT,eAAe,CAA0B,EACvC,YACA,cAIwB,CACxB,IAAM,EAAyB,CAAC,EAC1B,EAAa,GAGb,EAAuD,CAAC,EAC9D,QAAS,EAAI,EAAG,EAAI,EAAU,OAAQ,GAJnB,GAKjB,EAAgB,KAAK,EAAU,MAAM,EAAG,EALvB,EAKqC,CAAC,EAGzD,QAAW,KAAS,EAAiB,CACnC,IAAM,EAAY,EAAM,IAAI,CAAC,IAAS,EAAK,gBAAgB,EACrD,EACJ,MAAM,EAAW,MAAM,gCAAgC,CAAS,EAE5D,EAAiB,IAAI,IAE3B,QAAW,KAAU,EACnB,GAAI,EAAO,UAAY,OAAW,CAChC,IAAM,EAAiB,EAAO,UAAU,MAAM,KAAK,CAAC,IAAS,EAAK,MAAQ,QAAQ,EAC5E,EACJ,GAAgB,MAAM,MAAM,OAAS,SAAW,EAAe,MAAM,MAAM,MAAQ,IAErF,GAAI,EAAO,QAAQ,OAAS,mBAC1B,EAAe,IAAI,EAAO,QAAS,CACjC,SAAU,EAAO,QAAQ,aACzB,QACF,CAAC,EAKP,QAAW,KAAQ,EACjB,GAAI,EAAK,oBAAsB,SAAU,CACvC,IAAM,EAAY,EAAe,IAAI,EAAK,gBAAgB,GAAK,CAAE,SAAU,EAAG,OAAQ,GAAI,EAEpF,EAAU,aAAW,KAAK,CAC9B,MACE,EAAU,SAAW,QAAM,MACvB,GAAG,QAAM,SAAS,EAAU,UAAU,EAAK,mBAC3C,UACN,MAAO,EAAK,MACd,CAAC,EACD,EAAS,KAAK,CAAO,GAK3B,OAAO,EAGT,eAAe,CAAmB,CAAC,EAA8B,CAC/D,OAAO,EAAW,OAAO,WAAW,EAAE,KAAK,CAAC,IAAW,EAAO,aAAa,aAAa,EAGnF,IAAM,EAAe,OAC1B,gBACmD,CACnD,IAAQ,oBAAqB,KAAa,yCAClC,oBAAqB,KAAa,6CAEpC,EAAe,EAAiB,IACjC,EACH,UAAW,EAAW,SAAS,WAAa,CAC9C,CAAC,EAEK,EAAa,EAAiB,WAAW,EAAa,WAAW,YAAY,EAEnF,MAAO,CACL,WAAY,IAAM,GAClB,WAAY,EAAW,CAAE,YAAW,CAAC,EACrC,aACA,kBACA,iBAAmB,IAAM,CACvB,MAAM,IAAI,MAAM,iBAAiB,EAErC",
|
|
8
|
+
"debugId": "508D57A610BAAFF564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as W,b as X}from"../chunk-tvrdndbw.js";import{AssetValue as _,Chain as Y}from"@swapkit/helpers";function $(j){return j.startsWith("account_rdx1")&&j.length===66}function q({networkApi:j}){return async function J(K){let M=await G({address:K,networkApi:j});return v({resources:M,networkApi:j})}}async function G({address:j,networkApi:J}){let K=!0,M,H=[],L=await x(J);while(K){let Q={address:j,limit_per_page:100,cursor:M,at_ledger_state:{state_version:L}},N=await J.state.innerClient.entityFungiblesPage({stateEntityFungiblesPageRequest:Q});if(H=H.concat(N.items),N.next_cursor)M=N.next_cursor;else K=!1}return H}async function v({resources:j,networkApi:J}){let K=[],M=50,H=[];for(let L=0;L<j.length;L+=50)H.push(j.slice(L,L+50));for(let L of H){let Q=L.map((z)=>z.resource_address),N=await J.state.getEntityDetailsVaultAggregated(Q),V=new Map;for(let z of N)if(z.details!==void 0){let O=z.metadata?.items.find((Z)=>Z.key==="symbol"),U=O?.value.typed.type==="String"?O.value.typed.value:"?";if(z.details.type==="FungibleResource")V.set(z.address,{decimals:z.details.divisibility,symbol:U})}for(let z of L)if(z.aggregation_level==="Global"){let O=V.get(z.resource_address)||{decimals:0,symbol:"?"},U=_.from({asset:O.symbol!==Y.Radix?`${Y.Radix}.${O.symbol}-${z.resource_address}`:"XRD.XRD",value:z.amount});K.push(U)}}return K}async function x(j){return j.status.getCurrent().then((J)=>J.ledger_state.state_version)}var I=async({dappConfig:j})=>{let{RadixDappToolkit:J}=await import("@radixdlt/radix-dapp-toolkit"),{GatewayApiClient:K}=await import("@radixdlt/babylon-gateway-api-sdk"),M=J({...j,networkId:j.network?.networkId||1}),H=K.initialize(M.gatewayApi.clientConfig);return{getAddress:()=>"",getBalance:q({networkApi:H}),networkApi:H,validateAddress:$,signAndBroadcast:()=>{throw new Error("Not implemented")}}};export{$ as validateAddress,I as RadixToolbox};
|
|
2
|
+
|
|
3
|
+
//# debugId=36FB779D5F92A01764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/radix/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type {\n FungibleResourcesCollectionItem,\n GatewayApiClient,\n StateEntityDetailsVaultResponseItem,\n StateEntityFungiblesPageRequest,\n StateEntityFungiblesPageResponse,\n} from \"@radixdlt/babylon-gateway-api-sdk\";\nimport { AssetValue, Chain, type SKConfigIntegrations } from \"@swapkit/helpers\";\n\nexport type RadixWallets = {\n [Chain.Radix]: Awaited<ReturnType<typeof RadixToolbox>>;\n};\n\ntype RadixGetBalanceParams = {\n address: string;\n networkApi: GatewayApiClient;\n};\n// Could not find anything sync in SDK, ask Radix team\nexport function validateAddress(address: string) {\n return address.startsWith(\"account_rdx1\") && address.length === 66;\n}\n\nfunction getBalance({ networkApi }: { networkApi: GatewayApiClient }) {\n return async function getBalance(address: string) {\n const fungibleResources = await fetchFungibleResources({ address, networkApi });\n const fungibleBalances = convertResourcesToBalances({\n resources: fungibleResources,\n networkApi,\n });\n return fungibleBalances;\n };\n}\n\nasync function fetchFungibleResources({\n address,\n networkApi,\n}: RadixGetBalanceParams): Promise<FungibleResourcesCollectionItem[]> {\n let hasNextPage = true;\n let nextCursor: string | undefined;\n let fungibleResources: FungibleResourcesCollectionItem[] = [];\n const stateVersion = await currentStateVersion(networkApi);\n while (hasNextPage) {\n const stateEntityFungiblesPageRequest: StateEntityFungiblesPageRequest = {\n address: address,\n limit_per_page: 100,\n cursor: nextCursor,\n at_ledger_state: {\n state_version: stateVersion,\n },\n };\n\n const stateEntityFungiblesPageResponse: StateEntityFungiblesPageResponse =\n await networkApi.state.innerClient.entityFungiblesPage({\n stateEntityFungiblesPageRequest: stateEntityFungiblesPageRequest,\n });\n\n fungibleResources = fungibleResources.concat(stateEntityFungiblesPageResponse.items);\n if (stateEntityFungiblesPageResponse.next_cursor) {\n nextCursor = stateEntityFungiblesPageResponse.next_cursor;\n } else {\n hasNextPage = false;\n }\n }\n return fungibleResources;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\nasync function convertResourcesToBalances({\n resources,\n networkApi,\n}: {\n resources: FungibleResourcesCollectionItem[]; //| NonFungibleResourcesCollectionItem[];\n networkApi: GatewayApiClient;\n}): Promise<AssetValue[]> {\n const balances: AssetValue[] = [];\n const BATCH_SIZE = 50;\n\n // Split resources into batches of up to 50 items\n const resourceBatches: FungibleResourcesCollectionItem[][] = [];\n for (let i = 0; i < resources.length; i += BATCH_SIZE) {\n resourceBatches.push(resources.slice(i, i + BATCH_SIZE));\n }\n\n for (const batch of resourceBatches) {\n const addresses = batch.map((item) => item.resource_address);\n const response: StateEntityDetailsVaultResponseItem[] =\n await networkApi.state.getEntityDetailsVaultAggregated(addresses);\n\n const divisibilities = new Map<string, { decimals: number; symbol: string }>();\n\n for (const result of response) {\n if (result.details !== undefined) {\n const metaDataSymbol = result.metadata?.items.find((item) => item.key === \"symbol\");\n const symbol =\n metaDataSymbol?.value.typed.type === \"String\" ? metaDataSymbol.value.typed.value : \"?\";\n\n if (result.details.type === \"FungibleResource\") {\n divisibilities.set(result.address, {\n decimals: result.details.divisibility,\n symbol,\n });\n }\n }\n }\n\n for (const item of batch) {\n if (item.aggregation_level === \"Global\") {\n const assetInfo = divisibilities.get(item.resource_address) || { decimals: 0, symbol: \"?\" };\n\n const balance = AssetValue.from({\n asset:\n assetInfo.symbol !== Chain.Radix\n ? `${Chain.Radix}.${assetInfo.symbol}-${item.resource_address}`\n : \"XRD.XRD\",\n value: item.amount,\n });\n balances.push(balance);\n }\n }\n }\n\n return balances;\n}\n\nasync function currentStateVersion(networkApi: GatewayApiClient) {\n return networkApi.status.getCurrent().then((status) => status.ledger_state.state_version);\n}\n\nexport const RadixToolbox = async ({\n dappConfig,\n}: { dappConfig: SKConfigIntegrations[\"radix\"] }) => {\n const { RadixDappToolkit } = await import(\"@radixdlt/radix-dapp-toolkit\");\n const { GatewayApiClient } = await import(\"@radixdlt/babylon-gateway-api-sdk\");\n\n const radixToolkit = RadixDappToolkit({\n ...dappConfig,\n networkId: dappConfig.network?.networkId || 1,\n });\n\n const networkApi = GatewayApiClient.initialize(radixToolkit.gatewayApi.clientConfig);\n\n return {\n getAddress: () => \"\",\n getBalance: getBalance({ networkApi }),\n networkApi,\n validateAddress,\n signAndBroadcast: (() => {\n throw new Error(\"Not implemented\");\n }) as (params: any) => Promise<string>,\n };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "gDAOA,qBAAS,WAAY,yBAWd,SAAS,CAAe,CAAC,EAAiB,CAC/C,OAAO,EAAQ,WAAW,cAAc,GAAK,EAAQ,SAAW,GAGlE,SAAS,CAAU,EAAG,cAAgD,CACpE,OAAO,eAAe,CAAU,CAAC,EAAiB,CAChD,IAAM,EAAoB,MAAM,EAAuB,CAAE,UAAS,YAAW,CAAC,EAK9E,OAJyB,EAA2B,CAClD,UAAW,EACX,YACF,CAAC,GAKL,eAAe,CAAsB,EACnC,UACA,cACoE,CACpE,IAAI,EAAc,GACd,EACA,EAAuD,CAAC,EACtD,EAAe,MAAM,EAAoB,CAAU,EACzD,MAAO,EAAa,CAClB,IAAM,EAAmE,CACvE,QAAS,EACT,eAAgB,IAChB,OAAQ,EACR,gBAAiB,CACf,cAAe,CACjB,CACF,EAEM,EACJ,MAAM,EAAW,MAAM,YAAY,oBAAoB,CACrD,gCAAiC,CACnC,CAAC,EAGH,GADA,EAAoB,EAAkB,OAAO,EAAiC,KAAK,EAC/E,EAAiC,YACnC,EAAa,EAAiC,YAE9C,OAAc,GAGlB,OAAO,EAIT,eAAe,CAA0B,EACvC,YACA,cAIwB,CACxB,IAAM,EAAyB,CAAC,EAC1B,EAAa,GAGb,EAAuD,CAAC,EAC9D,QAAS,EAAI,EAAG,EAAI,EAAU,OAAQ,GAJnB,GAKjB,EAAgB,KAAK,EAAU,MAAM,EAAG,EALvB,EAKqC,CAAC,EAGzD,QAAW,KAAS,EAAiB,CACnC,IAAM,EAAY,EAAM,IAAI,CAAC,IAAS,EAAK,gBAAgB,EACrD,EACJ,MAAM,EAAW,MAAM,gCAAgC,CAAS,EAE5D,EAAiB,IAAI,IAE3B,QAAW,KAAU,EACnB,GAAI,EAAO,UAAY,OAAW,CAChC,IAAM,EAAiB,EAAO,UAAU,MAAM,KAAK,CAAC,IAAS,EAAK,MAAQ,QAAQ,EAC5E,EACJ,GAAgB,MAAM,MAAM,OAAS,SAAW,EAAe,MAAM,MAAM,MAAQ,IAErF,GAAI,EAAO,QAAQ,OAAS,mBAC1B,EAAe,IAAI,EAAO,QAAS,CACjC,SAAU,EAAO,QAAQ,aACzB,QACF,CAAC,EAKP,QAAW,KAAQ,EACjB,GAAI,EAAK,oBAAsB,SAAU,CACvC,IAAM,EAAY,EAAe,IAAI,EAAK,gBAAgB,GAAK,CAAE,SAAU,EAAG,OAAQ,GAAI,EAEpF,EAAU,EAAW,KAAK,CAC9B,MACE,EAAU,SAAW,EAAM,MACvB,GAAG,EAAM,SAAS,EAAU,UAAU,EAAK,mBAC3C,UACN,MAAO,EAAK,MACd,CAAC,EACD,EAAS,KAAK,CAAO,GAK3B,OAAO,EAGT,eAAe,CAAmB,CAAC,EAA8B,CAC/D,OAAO,EAAW,OAAO,WAAW,EAAE,KAAK,CAAC,IAAW,EAAO,aAAa,aAAa,EAGnF,IAAM,EAAe,OAC1B,gBACmD,CACnD,IAAQ,oBAAqB,KAAa,yCAClC,oBAAqB,KAAa,6CAEpC,EAAe,EAAiB,IACjC,EACH,UAAW,EAAW,SAAS,WAAa,CAC9C,CAAC,EAEK,EAAa,EAAiB,WAAW,EAAa,WAAW,YAAY,EAEnF,MAAO,CACL,WAAY,IAAM,GAClB,WAAY,EAAW,CAAE,YAAW,CAAC,EACrC,aACA,kBACA,iBAAmB,IAAM,CACvB,MAAM,IAAI,MAAM,iBAAiB,EAErC",
|
|
8
|
+
"debugId": "36FB779D5F92A01764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var I={};B(I,{getAddressValidator:()=>Z,createSolanaTokenTransaction:()=>$,SOLToolbox:()=>M});module.exports=D(I);var q=require("@swapkit/helpers");async function Z(){let{PublicKey:T}=await import("@solana/web3.js");return(p)=>{try{let h=new T(p);return T.isOnCurve(h.toBytes())}catch(h){return!1}}}async function $({tokenAddress:T,recipient:p,from:h,connection:S,amount:W,decimals:j}){let{getAssociatedTokenAddress:R,getAccount:z,createAssociatedTokenAccountInstruction:U,createTransferCheckedInstruction:g}=await import("@solana/spl-token"),{Transaction:L,PublicKey:E}=await import("@solana/web3.js"),x=new L,w=new E(T),J=await R(w,h),F=new E(p),Q=await R(w,F),X=!1;try{await z(S,Q),X=!0}catch(Y){}if(!X)x.add(U(h,Q,F,w));return x.add(g(J,w,Q,h,W,j)),x}var M=()=>{async function T(){let{Connection:p}=await import("@solana/web3.js");return new p(q.SKConfig.get("rpcUrls").SOL,"confirmed")}return{getConnection:T,createKeysForPath:H,getAddressFromKeys:_,createSolanaTransaction:v(T),getBalance:y(T),transfer:N(T),broadcastTransaction:b(T),getAddressValidator:Z}};function v(T){return async({recipient:p,assetValue:h,fromPublicKey:S,memo:W,isProgramDerivedAddress:j})=>{let{createMemoInstruction:R}=await import("@solana/spl-memo"),{Transaction:z,PublicKey:U,SystemProgram:g}=await import("@solana/web3.js"),L=await Z();if(!(j||L(p)))throw new q.SwapKitError("core_transaction_invalid_recipient_address");let E=await T(),x=h.isGasAsset?new z().add(g.transfer({fromPubkey:S,lamports:h.getBaseValue("number"),toPubkey:new U(p)})):h.address?await $({amount:h.getBaseValue("number"),connection:E,decimals:h.decimal,from:S,recipient:p,tokenAddress:h.address}):void 0;if(!x)throw new q.SwapKitError("core_transaction_invalid_sender_address");if(W)x.add(R(W));let w=await E.getLatestBlockhash();return x.recentBlockhash=w.blockhash,x.feePayer=S,x}}function N(T){return async({recipient:p,assetValue:h,fromKeypair:S,memo:W,isProgramDerivedAddress:j})=>{let{sendAndConfirmTransaction:R}=await import("@solana/web3.js"),z=await T(),U=await v(T)({recipient:p,assetValue:h,memo:W,fromPublicKey:S.publicKey,isProgramDerivedAddress:j});return R(z,U,[S])}}function b(T){return async(p)=>{return(await T()).sendRawTransaction(p.serialize())}}async function H({phrase:T,derivationPath:p=q.DerivationPath.SOL}){let{HDKey:h}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:S}=await import("@scure/bip39"),{Keypair:W}=await import("@solana/web3.js"),j=S(T),R=h.fromMasterSeed(j);return W.fromSeed(R.derive(p,!0).privateKey)}function _(T){return T.publicKey.toString()}async function P({connection:T,address:p}){let{PublicKey:h}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:S}=await import("@solana/spl-token"),{TokenListProvider:W}=await import("@solana/spl-token-registry"),j=await T.getParsedTokenAccountsByOwner(new h(p),{programId:S}),U=(await new W().resolve()).filterByChainId(101).getList(),g=new Map;for await(let E of j.value){let x=E.account.data.parsed.info,w=x.mint,J=x.tokenAmount.decimals,F=BigInt(x.tokenAmount.amount);if(F<=BigInt(0))continue;let X=U.find((G)=>G.address===w)?.symbol??"UNKNOWN",Y=g.get(w);g.set(w,{amount:Y?Y.amount+F:F,decimal:J,symbol:X})}return Array.from(g.entries()).map(([E,{amount:x,decimal:w,symbol:J}])=>new q.AssetValue({value:q.SwapKitNumber.fromBigInt(x,w),decimal:w,identifier:`${q.Chain.Solana}.${J}${E?`-${E.toString()}`:""}`}))}function y(T){return async(p)=>{let{PublicKey:h}=await import("@solana/web3.js"),S=await T(),W=await S.getBalance(new h(p)),j=await P({connection:S,address:p});return[q.AssetValue.from({chain:q.Chain.Solana,value:BigInt(W)}),...j]}}
|
|
2
|
+
|
|
3
|
+
//# debugId=857DCD4407AD404264756E2164756E21
|