@swapkit/toolboxes 1.0.0-beta.1 → 1.0.0-beta.11
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/cosmos/index.cjs +2 -2
- package/dist/cosmos/index.cjs.map +6 -6
- package/dist/cosmos/index.js +2 -2
- package/dist/cosmos/index.js.map +6 -6
- package/dist/evm/index.cjs +2 -2
- package/dist/evm/index.cjs.map +3 -3
- package/dist/evm/index.js +2 -2
- package/dist/evm/index.js.map +3 -3
- package/dist/ripple/index.cjs +2 -2
- package/dist/ripple/index.cjs.map +3 -3
- package/dist/ripple/index.js +2 -2
- package/dist/ripple/index.js.map +3 -3
- package/dist/utxo/index.cjs +2 -2
- package/dist/utxo/index.cjs.map +2 -2
- package/dist/utxo/index.js +2 -2
- package/dist/utxo/index.js.map +2 -2
- package/package.json +5 -7
- package/src/cosmos/thorchainUtils/registry.ts +3 -3
- package/src/cosmos/toolbox/cosmos.ts +5 -5
- package/src/cosmos/toolbox/thorchain.ts +8 -7
- package/src/cosmos/util.ts +3 -3
- package/src/evm/toolbox/baseEVMToolbox.ts +3 -1
- package/src/ripple/index.ts +1 -5
- package/src/utxo/toolbox/bitcoinCash.ts +1 -1
- package/src/utxo/types.ts +2 -0
package/dist/evm/index.js.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { type EVMChain, SKConfig, warnOnce } from \"@swapkit/helpers\";\nimport { getBalance } from \"../utils\";\n\nexport function getEvmApi(chain: EVMChain) {\n const customEvmApi = SKConfig.get(\"apis\")[chain];\n\n if (customEvmApi) {\n warnOnce(true, \"Using custom EVM API. Be sure to implement all methods to avoid issues.\");\n return customEvmApi as ReturnType<typeof evmApi>;\n }\n\n return evmApi(chain);\n}\n\nexport function createCustomEvmApi(methods: ReturnType<typeof getEvmApi>) {\n return methods;\n}\n\nfunction evmApi(chain: EVMChain) {\n return { getBalance: getBalance(chain) };\n}\n",
|
|
6
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} from \"@swapkit/helpers\";\nimport type { BrowserProvider, Provider } from \"ethers\";\n\nimport { getEstimateGasPrices } from \"./toolbox/baseEVMToolbox\";\nimport type { EIP1559TxParams, EVMMaxSendableAmountsParams } from \"./types\";\n\nexport async function getProvider(chain: EVMChain, customUrl?: string) {\n const { JsonRpcProvider } = await import(\"ethers\");\n\n return new JsonRpcProvider(customUrl || SKConfig.get(\"rpcUrls\")[chain]);\n}\n\n/**\n * @deprecated\n */\nexport const estimateMaxSendableAmount = async ({\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 { getEvmToolbox } = await import(\"@swapkit/toolboxes/evm\");\n const toolbox = await getEvmToolbox(assetValue.chain as EVMChain);\n\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 sender: from,\n recipient: from,\n memo,\n assetValue,\n });\n\n const isFeeEIP1559Compatible = \"maxFeePerGas\" in gasRate;\n const isFeeEVMLegacyCompatible = \"gasPrice\" in gasRate && gasRate.gasPrice !== undefined;\n\n if (!(gasRate && (isFeeEVMLegacyCompatible || isFeeEIP1559Compatible))) {\n throw new Error(\"Could not fetch fee data\");\n }\n\n const gasPrice = isFeeEIP1559Compatible\n ? (gasRate.maxFeePerGas || 1n) + (gasRate.maxPriorityFeePerGas || 1n)\n : gasRate.gasPrice || 1n;\n\n const fee = gasLimit * 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 getEstimateTransactionFee({\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider | BrowserProvider; isEIP1559Compatible?: boolean; chain: EVMChain }) {\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, chain });\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 type ChainSigner,\n ContractAddress,\n type EVMChain,\n FeeOption,\n SwapKitError,\n SwapKitNumber,\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 { getL1GasPriceFetcher, toHexString } from \"../index\";\nimport type {\n ApproveParams,\n CallParams,\n EIP1559TxParams,\n EVMCreateTransactionParams,\n EVMTransferParams,\n EVMTxParams,\n EstimateCallParams,\n IsApprovedParams,\n LegacyEVMTxParams,\n} from \"../types\";\n\ntype ToolboxWrapParams<P = Provider | BrowserProvider, T = {}> = T & {\n isEIP1559Compatible?: boolean;\n provider: P;\n signer?: Signer;\n chain: EVMChain;\n};\n\nexport const MAX_APPROVAL = BigInt(\n \"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n);\n\nexport function BaseEVMToolbox<\n P extends Provider | BrowserProvider,\n S extends\n | (ChainSigner<EVMTransferParams, string> & Signer)\n | JsonRpcSigner\n | HDNodeWallet\n | undefined,\n>({\n chain = Chain.Ethereum,\n provider,\n signer,\n isEIP1559Compatible = true,\n}: { signer: S; provider: P; isEIP1559Compatible?: boolean; chain?: EVMChain }) {\n return {\n getAddress: () => {\n return signer ? signer.getAddress() : undefined;\n },\n call: getCall({ provider, signer, isEIP1559Compatible, chain }),\n estimateCall: getEstimateCall({ provider, signer }),\n EIP1193SendTransaction: getEIP1193SendTransaction(provider),\n approve: getApprove({ provider, signer, isEIP1559Compatible, chain }),\n approvedAmount: getApprovedAmount({ provider, chain }),\n broadcastTransaction: provider.broadcastTransaction,\n createApprovalTx: getCreateApprovalTx({ provider, signer, chain }),\n createContract: getCreateContract({ provider, chain }),\n createContractTxObject: getCreateContractTxObject({ provider, chain }),\n createTransferTx: getCreateTransferTx({ provider, signer, chain }),\n createTransaction: getCreateTransferTx({ provider, signer, chain }),\n estimateGasLimit: getEstimateGasLimit({ provider, signer, chain }),\n estimateGasPrices: getEstimateGasPrices({ chain, provider, isEIP1559Compatible }),\n isApproved: getIsApproved({ provider, chain }),\n sendTransaction: getSendTransaction({ provider, signer, isEIP1559Compatible, chain }),\n signMessage: signer?.signMessage,\n transfer: getTransfer({ provider, signer, isEIP1559Compatible, chain }),\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 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\nconst stateMutable = [\"payable\", \"nonpayable\"];\n// const nonStateMutable = ['view', 'pure'];\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\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\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};\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\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\nexport function getEstimateGasPrices({\n chain,\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider; isEIP1559Compatible?: boolean; chain: EVMChain }): () => Promise<{\n [key in FeeOption]: {\n l1GasPrice?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n };\n}> {\n if (chain === Chain.Arbitrum) {\n return 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\n if (chain === Chain.Optimism) {\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: price,\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\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 getCall({ provider, isEIP1559Compatible, signer, chain }: 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 // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO reduce complexity\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, chain });\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({\n provider,\n isEIP1559Compatible,\n chain: chain as Chain.Ethereum,\n });\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\nfunction getApprovedAmount({ provider, chain }: ToolboxWrapParams) {\n return function approveAmount({ assetAddress, spenderAddress, from }: IsApprovedParams) {\n const call = getCall({ provider, isEIP1559Compatible: true, chain });\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, chain }: ToolboxWrapParams) {\n return async function isApproved({\n assetAddress,\n spenderAddress,\n from,\n amount = MAX_APPROVAL,\n }: IsApprovedParams) {\n const approvedAmount = await getApprovedAmount({ provider, chain })({\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, chain }: ToolboxWrapParams) {\n return async function approve({\n assetAddress,\n spenderAddress,\n feeOptionKey = FeeOption.Fast,\n amount,\n gasLimitFallback,\n from: fromParam,\n nonce,\n }: ApproveParams) {\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n const from = (await signer?.getAddress()) || fromParam;\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, chain });\n const sendTx = getEIP1193SendTransaction(provider);\n const txObject = await createTx(functionCallParams);\n\n return sendTx(txObject);\n }\n\n const call = getCall({ provider, isEIP1559Compatible, signer, chain });\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 sender,\n // data,\n // from: fromOverride,\n // maxFeePerGas,\n // maxPriorityFeePerGas,\n // gasPrice,\n ...tx\n }: EVMTransferParams) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = sender || (await signer?.getAddress());\n const sendTx = getSendTransaction({ provider, signer, isEIP1559Compatible, chain });\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (assetValue.isGasAsset) {\n const transaction = {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: hexlify(toUtf8Bytes(memo || \"\")),\n feeOptionKey,\n };\n\n return sendTx(transaction);\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 const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = (\n await getEstimateGasPrices({\n provider,\n isEIP1559Compatible,\n chain,\n })()\n )[feeOptionKey];\n\n const transaction = await getCreateTransferTx({ provider, signer, chain })({\n assetValue,\n memo,\n recipient,\n data: hexlify(toUtf8Bytes(memo || \"\")),\n sender: from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n });\n\n return sendTx(transaction);\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 sender,\n funcName,\n funcParams,\n txOverrides,\n }: EVMTransferParams & {\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: sender,\n to: recipient,\n value,\n data: memo ? hexlify(toUtf8Bytes(memo)) : undefined,\n });\n };\n}\n\nconst isEIP1559Transaction = (tx: EVMTxParams) =>\n (tx as EIP1559TxParams).type === 2 ||\n !!(tx as EIP1559TxParams).maxFeePerGas ||\n !!(tx as EIP1559TxParams).maxPriorityFeePerGas;\n\nfunction getSendTransaction({\n provider,\n signer,\n isEIP1559Compatible = true,\n chain,\n}: ToolboxWrapParams) {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO reduce complexity\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, chain });\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\nfunction getCreateTransferTx({ provider, signer }: ToolboxWrapParams) {\n return async function createTransferTx({\n assetValue,\n memo,\n recipient,\n data,\n sender: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: EVMCreateTransactionParams) {\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, chain: assetValue.chain as EVMChain });\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, signer, chain }: ToolboxWrapParams) {\n return async function createApprovalTx({\n assetAddress,\n spenderAddress,\n amount,\n from: fromParam,\n }: ApproveParams) {\n const from = (await signer?.getAddress()) || fromParam;\n\n const createTx = getCreateContractTxObject({ provider, chain });\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",
|
|
7
|
+
"import {\n type Asset,\n type AssetValue,\n Chain,\n type ChainSigner,\n ContractAddress,\n type EVMChain,\n FeeOption,\n SwapKitError,\n SwapKitNumber,\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 { getL1GasPriceFetcher, toHexString } from \"../index\";\nimport type {\n ApproveParams,\n CallParams,\n EIP1559TxParams,\n EVMCreateTransactionParams,\n EVMTransferParams,\n EVMTxParams,\n EstimateCallParams,\n IsApprovedParams,\n LegacyEVMTxParams,\n} from \"../types\";\n\ntype ToolboxWrapParams<P = Provider | BrowserProvider, T = {}> = T & {\n isEIP1559Compatible?: boolean;\n provider: P;\n signer?: Signer;\n chain: EVMChain;\n};\n\nexport const MAX_APPROVAL = BigInt(\n \"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\n);\n\nexport function BaseEVMToolbox<\n P extends Provider | BrowserProvider,\n S extends\n | (ChainSigner<EVMTransferParams, string> & Signer)\n | JsonRpcSigner\n | HDNodeWallet\n | undefined,\n>({\n chain = Chain.Ethereum,\n provider,\n signer,\n isEIP1559Compatible = true,\n}: { signer: S; provider: P; isEIP1559Compatible?: boolean; chain?: EVMChain }) {\n return {\n getAddress: () => {\n return signer ? signer.getAddress() : undefined;\n },\n call: getCall({ provider, signer, isEIP1559Compatible, chain }),\n estimateCall: getEstimateCall({ provider, signer }),\n EIP1193SendTransaction: getEIP1193SendTransaction(provider),\n approve: getApprove({ provider, signer, isEIP1559Compatible, chain }),\n approvedAmount: getApprovedAmount({ provider, chain }),\n broadcastTransaction: provider.broadcastTransaction,\n createApprovalTx: getCreateApprovalTx({ provider, signer, chain }),\n createContract: getCreateContract({ provider, chain }),\n createContractTxObject: getCreateContractTxObject({ provider, chain }),\n createTransferTx: getCreateTransferTx({ provider, signer, chain }),\n createTransaction: getCreateTransferTx({ provider, signer, chain }),\n estimateGasLimit: getEstimateGasLimit({ provider, signer, chain }),\n estimateGasPrices: getEstimateGasPrices({ chain, provider, isEIP1559Compatible }),\n isApproved: getIsApproved({ provider, chain }),\n sendTransaction: getSendTransaction({ provider, signer, isEIP1559Compatible, chain }),\n signMessage: signer?.signMessage,\n transfer: getTransfer({ provider, signer, isEIP1559Compatible, chain }),\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 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\nconst stateMutable = [\"payable\", \"nonpayable\"];\n// const nonStateMutable = ['view', 'pure'];\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\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\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};\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\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\nexport function getEstimateGasPrices({\n chain,\n provider,\n isEIP1559Compatible = true,\n}: { provider: Provider; isEIP1559Compatible?: boolean; chain: EVMChain }): () => Promise<{\n [key in FeeOption]: {\n l1GasPrice?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n };\n}> {\n if (chain === Chain.Arbitrum) {\n return 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\n if (chain === Chain.Optimism) {\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: price,\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\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 getCall({ provider, isEIP1559Compatible, signer, chain }: 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 // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO reduce complexity\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, chain });\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({\n provider,\n isEIP1559Compatible,\n chain: chain as Chain.Ethereum,\n });\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\nfunction getApprovedAmount({ provider, chain }: ToolboxWrapParams) {\n return function approveAmount({ assetAddress, spenderAddress, from }: IsApprovedParams) {\n const call = getCall({ provider, isEIP1559Compatible: true, chain });\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, chain }: ToolboxWrapParams) {\n return async function isApproved({\n assetAddress,\n spenderAddress,\n from,\n amount = MAX_APPROVAL,\n }: IsApprovedParams) {\n const approvedAmount = await getApprovedAmount({ provider, chain })({\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, chain }: ToolboxWrapParams) {\n return async function approve({\n assetAddress,\n spenderAddress,\n feeOptionKey = FeeOption.Fast,\n amount,\n gasLimitFallback,\n from: fromParam,\n nonce,\n }: ApproveParams) {\n const funcParams = [spenderAddress, BigInt(amount || MAX_APPROVAL)];\n const from = (await signer?.getAddress()) || fromParam;\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, chain });\n const sendTx = getEIP1193SendTransaction(provider);\n const txObject = await createTx(functionCallParams);\n\n return sendTx(txObject);\n }\n\n const call = getCall({ provider, isEIP1559Compatible, signer, chain });\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 sender,\n // data,\n // from: fromOverride,\n // maxFeePerGas,\n // maxPriorityFeePerGas,\n // gasPrice,\n ...tx\n }: EVMTransferParams) {\n const { hexlify, toUtf8Bytes } = await import(\"ethers\");\n const txAmount = assetValue.getBaseValue(\"bigint\");\n const chain = assetValue.chain as EVMChain;\n const from = sender || (await signer?.getAddress());\n const sendTx = getSendTransaction({ provider, signer, isEIP1559Compatible, chain });\n\n if (!from) throw new SwapKitError(\"toolbox_evm_no_from_address\");\n\n if (assetValue.isGasAsset) {\n const transaction = {\n ...tx,\n from,\n to: recipient,\n value: txAmount,\n data: hexlify(toUtf8Bytes(memo || \"\")),\n feeOptionKey,\n };\n\n return sendTx(transaction);\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 const { maxFeePerGas, maxPriorityFeePerGas, gasPrice } = (\n await getEstimateGasPrices({\n provider,\n isEIP1559Compatible,\n chain,\n })()\n )[feeOptionKey];\n\n const transaction = await getCreateTransferTx({ provider, signer, chain })({\n assetValue,\n memo,\n recipient,\n data: hexlify(toUtf8Bytes(memo || \"\")),\n sender: from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n });\n\n return sendTx(transaction);\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 data,\n sender,\n funcName,\n funcParams,\n txOverrides,\n }: EVMTransferParams & {\n assetValue: AssetValue;\n funcName?: string;\n funcParams?: unknown[];\n txOverrides?: EVMTxParams;\n data?: string;\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: sender,\n to: recipient,\n value,\n data: data ? data : memo ? hexlify(toUtf8Bytes(memo)) : undefined,\n });\n };\n}\n\nconst isEIP1559Transaction = (tx: EVMTxParams) =>\n (tx as EIP1559TxParams).type === 2 ||\n !!(tx as EIP1559TxParams).maxFeePerGas ||\n !!(tx as EIP1559TxParams).maxPriorityFeePerGas;\n\nfunction getSendTransaction({\n provider,\n signer,\n isEIP1559Compatible = true,\n chain,\n}: ToolboxWrapParams) {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO reduce complexity\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, chain });\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\nfunction getCreateTransferTx({ provider, signer }: ToolboxWrapParams) {\n return async function createTransferTx({\n assetValue,\n memo,\n recipient,\n data,\n sender: fromOverride,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n ...tx\n }: EVMCreateTransactionParams) {\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, chain: assetValue.chain as EVMChain });\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, signer, chain }: ToolboxWrapParams) {\n return async function createApprovalTx({\n assetAddress,\n spenderAddress,\n amount,\n from: fromParam,\n }: ApproveParams) {\n const from = (await signer?.getAddress()) || fromParam;\n\n const createTx = getCreateContractTxObject({ provider, chain });\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
8
|
"import type {\n AssetValue,\n ChainSigner,\n DerivationPathArray,\n FeeOption,\n GenericCreateTransactionParams,\n GenericTransferParams,\n} from \"@swapkit/helpers\";\nimport { Chain } from \"@swapkit/helpers\";\nimport type {\n BigNumberish,\n BrowserProvider,\n JsonFragment,\n JsonRpcProvider,\n JsonRpcSigner,\n Signer,\n Transaction,\n} from \"ethers\";\nimport type {\n ARBToolbox,\n AVAXToolbox,\n BASEToolbox,\n BSCToolbox,\n ETHToolbox,\n MATICToolbox,\n OPToolbox,\n} from \"./toolbox\";\n\nimport type { getProvider } 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?: Awaited<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 EVMTransferParams = GenericTransferParams & {\n sender?: string;\n};\n\nexport type EVMCreateTransactionParams = Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n gasLimit?: bigint;\n gasPrice?: bigint;\n maxFeePerGas?: bigint;\n maxPriorityFeePerGas?: bigint;\n data?: string;\n nonce?: number;\n};\n\nexport type EVMMaxSendableAmountsParams = {\n from: string;\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\nexport type EVMToolboxParams = {\n provider?: BrowserProvider | JsonRpcProvider;\n} & (\n | {\n signer?: (ChainSigner<EVMTransferParams, string> & Signer) | JsonRpcSigner;\n }\n | {\n phrase?: string;\n derivationPath?: DerivationPathArray;\n index?: number;\n }\n);\n\nexport type EVMToolboxes = {\n [Chain.Arbitrum]: Awaited<ReturnType<typeof ARBToolbox>>;\n [Chain.Avalanche]: Awaited<ReturnType<typeof AVAXToolbox>>;\n [Chain.Base]: Awaited<ReturnType<typeof BASEToolbox>>;\n [Chain.BinanceSmartChain]: Awaited<ReturnType<typeof BSCToolbox>>;\n [Chain.Ethereum]: Awaited<ReturnType<typeof ETHToolbox>>;\n [Chain.Optimism]: Awaited<ReturnType<typeof OPToolbox>>;\n [Chain.Polygon]: Awaited<ReturnType<typeof MATICToolbox>>;\n};\n",
|
|
9
9
|
"import { Chain, type EVMChain } from \"@swapkit/helpers\";\n\nimport { getProvider } from \"../helpers\";\nimport type { EVMToolboxParams } from \"../types\";\nimport { ARBToolbox, AVAXToolbox, BASEToolbox, BSCToolbox, ETHToolbox, MATICToolbox } from \"./evm\";\nimport { OPToolbox } from \"./op\";\n\nexport async function getEvmToolbox<T extends EVMChain>(chain: T, params?: EVMToolboxParams) {\n const toolboxParams = {\n ...params,\n provider: params?.provider || (await getProvider(chain)),\n };\n\n switch (chain) {\n case Chain.Avalanche:\n return AVAXToolbox(toolboxParams);\n case Chain.Arbitrum:\n return ARBToolbox(toolboxParams);\n case Chain.Base:\n return BASEToolbox(toolboxParams);\n case Chain.Optimism:\n return OPToolbox(toolboxParams);\n case Chain.Polygon:\n return MATICToolbox(toolboxParams);\n case Chain.BinanceSmartChain:\n return BSCToolbox(toolboxParams);\n case Chain.Ethereum:\n return ETHToolbox(toolboxParams);\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n}\n\nexport * from \"./baseEVMToolbox\";\nexport * from \"./evm\";\nexport * from \"./op\";\n",
|
|
10
10
|
"import { Chain, type EVMChain, FeeOption, SKConfig } from \"@swapkit/helpers\";\nimport { HDNodeWallet } from \"ethers\";\nimport { P, match } from \"ts-pattern\";\nimport { getEvmApi } from \"../api\";\nimport { multicallAbi } from \"../contracts/eth/multicall\";\nimport {\n getEstimateTransactionFee,\n getIsEIP1559Compatible,\n getNetworkParams,\n getProvider,\n} from \"../helpers\";\nimport type { EVMToolboxParams } from \"../types\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nexport async function ETHToolbox({ provider, ...signer }: EVMToolboxParams) {\n const evmToolbox = await 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 const ARBToolbox = createEvmToolbox(Chain.Arbitrum);\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 async function createEvmToolbox({\n provider: providerParam,\n ...toolboxSignerParams\n }: EVMToolboxParams) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n\n const provider = providerParam || (await getProvider(chain, rpcUrl));\n\n const isEIP1559Compatible = getIsEIP1559Compatible(chain);\n const signer = match(toolboxSignerParams)\n .with({ phrase: P.string }, ({ phrase }) => HDNodeWallet.fromPhrase(phrase).connect(provider))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n const evmToolbox = BaseEVMToolbox({ provider, signer, isEIP1559Compatible, chain });\n\n return {\n ...evmToolbox,\n estimateTransactionFee: getEstimateTransactionFee({ provider, isEIP1559Compatible, chain }),\n getNetworkParams: getNetworkParams(chain),\n getBalance: getEvmApi(chain).getBalance,\n };\n };\n}\n",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"import { BaseDecimal, Chain, ChainId, ChainToExplorerUrl, SKConfig } from \"@swapkit/helpers\";\nimport type { BrowserProvider, JsonRpcProvider, Provider, TransactionRequest } from \"ethers\";\nimport { Contract, HDNodeWallet } from \"ethers\";\n\nimport { P } from \"ts-pattern\";\nimport { match } from \"ts-pattern\";\nimport { getEvmApi } from \"../api\";\nimport { gasOracleAbi } from \"../contracts/op/gasOracle\";\nimport { getProvider } from \"../helpers\";\nimport type { EVMToolboxParams } from \"../types\";\nimport { BaseEVMToolbox } from \"./baseEVMToolbox\";\n\nconst GAS_PRICE_ORACLE_ADDRESS = \"0x420000000000000000000000000000000000000f\";\n\nfunction connectGasPriceOracle<P extends Provider>(provider: P) {\n return new Contract(GAS_PRICE_ORACLE_ADDRESS, gasOracleAbi, provider);\n}\n\nexport function getL1GasPriceFetcher<P extends Provider>(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\nexport async function OPToolbox({\n provider: providerParam,\n ...toolboxSignerParams\n}: EVMToolboxParams) {\n const chain = Chain.Optimism;\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const provider = providerParam || (await getProvider(chain, rpcUrl));\n const signer = match(toolboxSignerParams)\n .with({ phrase: P.string }, ({ phrase }) => HDNodeWallet.fromPhrase(phrase).connect(provider))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n const evmToolbox = BaseEVMToolbox({ provider, signer });\n const getL1GasPrice = getL1GasPriceFetcher(provider);\n\n return {\n ...evmToolbox,\n estimateL1Gas: estimateL1Gas(provider),\n estimateL1GasCost: estimateL1GasCost(provider),\n estimateL2GasCost: estimateL2GasCost(provider),\n estimateTotalGasCost: estimateTotalGasCost(provider),\n getBalance: getEvmApi(Chain.Optimism).getBalance,\n getL1GasPrice,\n getNetworkParams,\n };\n}\n",
|
|
13
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
14
|
],
|
|
15
|
-
"mappings": "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",
|
|
16
|
-
"debugId": "
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "7594586E355B241664756E2164756E21",
|
|
17
17
|
"names": []
|
|
18
18
|
}
|
package/dist/ripple/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var f={};O(f,{rippleValidateAddress:()=>R,getRippleToolbox:()=>W});module.exports=N(f);var j=require("@swapkit/helpers"),I=require("xrpl");function $(
|
|
1
|
+
var f={};O(f,{rippleValidateAddress:()=>R,getRippleToolbox:()=>W});module.exports=N(f);var j=require("@swapkit/helpers"),I=require("xrpl");function $(y){let z=I.Wallet.fromMnemonic(y);return{getAddress:()=>Promise.resolve(z.address),signTransaction:(M)=>Promise.resolve(z.sign(M))}}function R(y){return I.isValidAddress(y)}var W=async(y={})=>{let z="signer"in y&&y.signer?y.signer:("phrase"in y)&&y.phrase?$(y.phrase):void 0,M=j.SKConfig.get("rpcUrls")[j.Chain.Ripple];if(!M)throw new j.SwapKitError({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:j.Chain.Ripple}});let L=new I.Client(M);await L.connect();let P=()=>{if(!z)throw new j.SwapKitError({errorKey:"toolbox_ripple_signer_not_found"});return z.getAddress()},k=async(v)=>{let G=v||await P();try{await L.connect();let J=(await L.request({command:"account_info",account:G})).result.account_data.Balance;return[j.AssetValue.from({chain:j.Chain.Ripple,value:J,fromBaseDecimal:j.BaseDecimal[j.Chain.Ripple]})]}catch(q){if(q.data.error_code===19)return[j.AssetValue.from({chain:j.Chain.Ripple,value:0})];throw new j.SwapKitError("toolbox_ripple_get_balance_error",{info:{address:G,error:q}})}},F=async()=>{let G=(await L.request({command:"fee"})).result.drops.open_ledger_fee;return j.AssetValue.from({chain:j.Chain.Ripple,value:j.SwapKitNumber.fromBigInt(BigInt(G),j.BaseDecimal[j.Chain.Ripple])})},X=async({assetValue:v,recipient:G,memo:q,sender:J})=>{if(!R(G))throw new j.SwapKitError({errorKey:"core_transaction_invalid_recipient_address"});let Q=J||await P();if(!v.isGasAsset||v.chain!==j.Chain.Ripple)throw new j.SwapKitError({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:v.toString()}});let _={TransactionType:"Payment",Account:Q,Amount:I.xrpToDrops(v.getValue("string")),Destination:G};if(q)_.Memos=[{Memo:{MemoData:Buffer.from(q).toString("hex")}}];return await L.autofill(_)},Y=(v)=>{if(!z)throw new j.SwapKitError({errorKey:"toolbox_ripple_signer_not_found"});return z.signTransaction(v)},Z=async(v)=>{let q=(await L.submitAndWait(v)).result;if(q.engine_result==="tesSUCCESS"||q.engine_result==="terQUEUED")return q.tx_json?.hash||q.hash;let J=q.engine_result_message||"Unknown error",Q=q.engine_result||"Unknown code";throw new j.SwapKitError({errorKey:"toolbox_ripple_broadcast_error",info:{chain:j.Chain.Ripple,message:J,code:Q,result:q}})};return{signer:z,createSigner:$,getAddress:P,validateAddress:R,getBalance:k,createTransaction:X,signTransaction:Y,broadcastTransaction:Z,transfer:async(v)=>{if(!z)throw new j.SwapKitError({errorKey:"toolbox_ripple_signer_not_found"});let G=await z.getAddress(),q=await X({...v,sender:G}),J=await Y(q);return Z(J.tx_blob)},estimateTransactionFee:F}};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=030A6CAB97355B8F64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ripple/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type
|
|
5
|
+
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, type Payment, Wallet, isValidAddress, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase: string }\n | { signer: ChainSigner<Transaction, { tx_blob: string; hash: string }> }\n | {};\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Ripple];\n if (!rpcUrl) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_rpc_not_configured\",\n info: { chain: Chain.Ripple },\n });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n\n try {\n await client.connect();\n const accountInfo = await client.request({\n command: \"account_info\",\n account: addr,\n });\n\n const balance = accountInfo.result.account_data.Balance;\n\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: balance,\n fromBaseDecimal: BaseDecimal[Chain.Ripple],\n }),\n ];\n } catch (error) {\n // empty account\n if ((error as any).data.error_code === 19) {\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: 0,\n }),\n ];\n }\n throw new SwapKitError(\"toolbox_ripple_get_balance_error\", {\n info: { address: addr, error },\n });\n }\n };\n\n const estimateTransactionFee = async () => {\n const feeResponse = await client.request({ command: \"fee\" });\n const feeDrops = feeResponse.result.drops.open_ledger_fee; // Fee in drops\n\n return AssetValue.from({\n chain: Chain.Ripple,\n value: SwapKitNumber.fromBigInt(BigInt(feeDrops), BaseDecimal[Chain.Ripple]),\n });\n };\n\n const createTransaction = async ({\n assetValue,\n recipient,\n memo,\n sender,\n }: { assetValue: AssetValue; recipient: string; sender?: string; memo?: string }) => {\n if (!rippleValidateAddress(recipient)) {\n throw new SwapKitError({ errorKey: \"core_transaction_invalid_recipient_address\" });\n }\n\n const senderAddress = sender || (await getAddress());\n\n if (!assetValue.isGasAsset || assetValue.chain !== Chain.Ripple) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_asset_not_supported\",\n info: { asset: assetValue.toString() },\n });\n }\n\n const transaction: Payment = {\n TransactionType: \"Payment\",\n Account: senderAddress,\n Amount: xrpToDrops(assetValue.getValue(\"string\")),\n Destination: recipient,\n };\n\n if (memo) {\n transaction.Memos = [{ Memo: { MemoData: Buffer.from(memo).toString(\"hex\") } }];\n }\n\n const preparedTx = await client.autofill(transaction);\n return preparedTx;\n };\n\n const signTransaction = (tx: Transaction) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.signTransaction(tx);\n };\n\n const broadcastTransaction = async (signedTxHex: string) => {\n const submitResult = await client.submitAndWait(signedTxHex);\n // Cast result to any to bypass potential type mismatches in xrpl.js definitions\n const result: any = submitResult.result;\n\n // Check engine_result directly on result\n if (result.engine_result === \"tesSUCCESS\" || result.engine_result === \"terQUEUED\") {\n // Access hash from tx_json if available, otherwise fallback to result.hash\n return result.tx_json?.hash || result.hash;\n }\n\n const message = result.engine_result_message || \"Unknown error\";\n const code = result.engine_result || \"Unknown code\";\n\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_broadcast_error\",\n info: { chain: Chain.Ripple, message, code, result },\n // Remove explicit message when using object format\n });\n };\n\n const transfer = async (params: GenericTransferParams) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n const sender = await signer.getAddress();\n const tx = await createTransaction({ ...params, sender });\n const signedTx = await signTransaction(tx);\n return broadcastTransaction(signedTx.tx_blob);\n };\n\n // Disconnect client on demand or handle elsewhere?\n // For now, let's assume connection is managed outside or persists.\n // const disconnect = () => client.disconnect();\n\n return {\n // Signer related\n signer, // Expose the signer instance if created/provided\n createSigner, // Expose the helper\n // Core methods\n getAddress,\n validateAddress: rippleValidateAddress,\n getBalance,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n transfer,\n estimateTransactionFee,\n // disconnect, // Optional: expose disconnect\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "030A6CAB97355B8F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/ripple/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"../chunk-p1kdg37m.js";import{AssetValue as R,BaseDecimal as $,Chain as G,SKConfig as W,SwapKitError as I,SwapKitNumber as f}from"@swapkit/helpers";import{Client as H,Wallet as U,isValidAddress as B,xrpToDrops as b}from"xrpl";function k(
|
|
1
|
+
import"../chunk-p1kdg37m.js";import{AssetValue as R,BaseDecimal as $,Chain as G,SKConfig as W,SwapKitError as I,SwapKitNumber as f}from"@swapkit/helpers";import{Client as H,Wallet as U,isValidAddress as B,xrpToDrops as b}from"xrpl";function k(v){let y=U.fromMnemonic(v);return{getAddress:()=>Promise.resolve(y.address),signTransaction:(M)=>Promise.resolve(y.sign(M))}}function F(v){return B(v)}var C=async(v={})=>{let y="signer"in v&&v.signer?v.signer:("phrase"in v)&&v.phrase?k(v.phrase):void 0,M=W.get("rpcUrls")[G.Ripple];if(!M)throw new I({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:G.Ripple}});let L=new H(M);await L.connect();let P=()=>{if(!y)throw new I({errorKey:"toolbox_ripple_signer_not_found"});return y.getAddress()},N=async(q)=>{let z=q||await P();try{await L.connect();let J=(await L.request({command:"account_info",account:z})).result.account_data.Balance;return[R.from({chain:G.Ripple,value:J,fromBaseDecimal:$[G.Ripple]})]}catch(j){if(j.data.error_code===19)return[R.from({chain:G.Ripple,value:0})];throw new I("toolbox_ripple_get_balance_error",{info:{address:z,error:j}})}},O=async()=>{let z=(await L.request({command:"fee"})).result.drops.open_ledger_fee;return R.from({chain:G.Ripple,value:f.fromBigInt(BigInt(z),$[G.Ripple])})},X=async({assetValue:q,recipient:z,memo:j,sender:J})=>{if(!F(z))throw new I({errorKey:"core_transaction_invalid_recipient_address"});let Q=J||await P();if(!q.isGasAsset||q.chain!==G.Ripple)throw new I({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:q.toString()}});let _={TransactionType:"Payment",Account:Q,Amount:b(q.getValue("string")),Destination:z};if(j)_.Memos=[{Memo:{MemoData:Buffer.from(j).toString("hex")}}];return await L.autofill(_)},Y=(q)=>{if(!y)throw new I({errorKey:"toolbox_ripple_signer_not_found"});return y.signTransaction(q)},Z=async(q)=>{let j=(await L.submitAndWait(q)).result;if(j.engine_result==="tesSUCCESS"||j.engine_result==="terQUEUED")return j.tx_json?.hash||j.hash;let J=j.engine_result_message||"Unknown error",Q=j.engine_result||"Unknown code";throw new I({errorKey:"toolbox_ripple_broadcast_error",info:{chain:G.Ripple,message:J,code:Q,result:j}})};return{signer:y,createSigner:k,getAddress:P,validateAddress:F,getBalance:N,createTransaction:X,signTransaction:Y,broadcastTransaction:Z,transfer:async(q)=>{if(!y)throw new I({errorKey:"toolbox_ripple_signer_not_found"});let z=await y.getAddress(),j=await X({...q,sender:z}),J=await Y(j);return Z(J.tx_blob)},estimateTransactionFee:O}};export{F as rippleValidateAddress,C as getRippleToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=93BB2E78E5142B8564756E2164756E21
|
package/dist/ripple/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ripple/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type
|
|
5
|
+
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, type Payment, Wallet, isValidAddress, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase: string }\n | { signer: ChainSigner<Transaction, { tx_blob: string; hash: string }> }\n | {};\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Ripple];\n if (!rpcUrl) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_rpc_not_configured\",\n info: { chain: Chain.Ripple },\n });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n\n try {\n await client.connect();\n const accountInfo = await client.request({\n command: \"account_info\",\n account: addr,\n });\n\n const balance = accountInfo.result.account_data.Balance;\n\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: balance,\n fromBaseDecimal: BaseDecimal[Chain.Ripple],\n }),\n ];\n } catch (error) {\n // empty account\n if ((error as any).data.error_code === 19) {\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: 0,\n }),\n ];\n }\n throw new SwapKitError(\"toolbox_ripple_get_balance_error\", {\n info: { address: addr, error },\n });\n }\n };\n\n const estimateTransactionFee = async () => {\n const feeResponse = await client.request({ command: \"fee\" });\n const feeDrops = feeResponse.result.drops.open_ledger_fee; // Fee in drops\n\n return AssetValue.from({\n chain: Chain.Ripple,\n value: SwapKitNumber.fromBigInt(BigInt(feeDrops), BaseDecimal[Chain.Ripple]),\n });\n };\n\n const createTransaction = async ({\n assetValue,\n recipient,\n memo,\n sender,\n }: { assetValue: AssetValue; recipient: string; sender?: string; memo?: string }) => {\n if (!rippleValidateAddress(recipient)) {\n throw new SwapKitError({ errorKey: \"core_transaction_invalid_recipient_address\" });\n }\n\n const senderAddress = sender || (await getAddress());\n\n if (!assetValue.isGasAsset || assetValue.chain !== Chain.Ripple) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_asset_not_supported\",\n info: { asset: assetValue.toString() },\n });\n }\n\n const transaction: Payment = {\n TransactionType: \"Payment\",\n Account: senderAddress,\n Amount: xrpToDrops(assetValue.getValue(\"string\")),\n Destination: recipient,\n };\n\n if (memo) {\n transaction.Memos = [{ Memo: { MemoData: Buffer.from(memo).toString(\"hex\") } }];\n }\n\n const preparedTx = await client.autofill(transaction);\n return preparedTx;\n };\n\n const signTransaction = (tx: Transaction) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.signTransaction(tx);\n };\n\n const broadcastTransaction = async (signedTxHex: string) => {\n const submitResult = await client.submitAndWait(signedTxHex);\n // Cast result to any to bypass potential type mismatches in xrpl.js definitions\n const result: any = submitResult.result;\n\n // Check engine_result directly on result\n if (result.engine_result === \"tesSUCCESS\" || result.engine_result === \"terQUEUED\") {\n // Access hash from tx_json if available, otherwise fallback to result.hash\n return result.tx_json?.hash || result.hash;\n }\n\n const message = result.engine_result_message || \"Unknown error\";\n const code = result.engine_result || \"Unknown code\";\n\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_broadcast_error\",\n info: { chain: Chain.Ripple, message, code, result },\n // Remove explicit message when using object format\n });\n };\n\n const transfer = async (params: GenericTransferParams) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n const sender = await signer.getAddress();\n const tx = await createTransaction({ ...params, sender });\n const signedTx = await signTransaction(tx);\n return broadcastTransaction(signedTx.tx_blob);\n };\n\n // Disconnect client on demand or handle elsewhere?\n // For now, let's assume connection is managed outside or persists.\n // const disconnect = () => client.disconnect();\n\n return {\n // Signer related\n signer, // Expose the signer instance if created/provided\n createSigner, // Expose the helper\n // Core methods\n getAddress,\n validateAddress: rippleValidateAddress,\n getBalance,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n transfer,\n estimateTransactionFee,\n // disconnect, // Optional: expose disconnect\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "6BAAA,qBACE,iBACA,WACA,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "93BB2E78E5142B8564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/utxo/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var uX={};pX(uX,{toLegacyAddress:()=>A,toCashAddress:()=>f,stripToCashAddress:()=>V,stripPrefix:()=>R,nonSegwitChains:()=>l,isValidAddress:()=>XX,getUtxoToolbox:()=>hX,getUtxoNetwork:()=>P,getUtxoApi:()=>_,getUTXOAddressValidator:()=>MX,getScriptTypeForAddress:()=>x,getOutputSize:()=>g,getInputSize:()=>y,getDustThreshold:()=>o,getCreateKeysForPath:()=>c,detectAddressNetwork:()=>GX,createUTXOToolbox:()=>h,createCustomUtxoApi:()=>wX,createBCHToolbox:()=>QX,compileMemo:()=>O,calculateTxSize:()=>S,bchValidateAddress:()=>E,addressFromKeysGetter:()=>JX,accumulative:()=>N,UtxoNetwork:()=>e,UTXOScriptType:()=>r,TX_OVERHEAD:()=>$X,OutputSizes:()=>m,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>EX,InputSizes:()=>n});module.exports=cX(uX);var b=require("@swapkit/helpers");var F=require("@swapkit/helpers");var M=require("@swapkit/helpers");async function vX({chain:X,txHash:G}){let $=M.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:WX()}),Q=await M.RequestClient.post($,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new Error(`failed to broadcast a transaction: ${Q.error?.message}`);if(Q.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Q.result}function i(X){return`https://api.blockchair.com/${YX(X)}`}function LX(X){switch(X){case M.Chain.Bitcoin:return 5;case M.Chain.Dogecoin:return 1e4;case M.Chain.Litecoin:return 1;default:return 2}}function YX(X){switch(X){case M.Chain.BitcoinCash:return"bitcoin-cash";case M.Chain.Litecoin:return"litecoin";case M.Chain.Dash:return"dash";case M.Chain.Dogecoin:return"dogecoin";case M.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function _X(X){try{let{feePerKb:G}=await M.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,LX(X))}catch(G){return LX(X)}}async function a(X,G){try{let $=await M.RequestClient.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await M.RequestClient.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function DX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await a(`${i(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function IX({address:X,chain:G,apiKey:$}){return(await DX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function qX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await a(`${i(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function PX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){return(await a(`${i(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Q}&offset=${J}`,$)).filter(({is_spent:j})=>!j).map(({script_hex:j,block_id:W,transaction_hash:D,index:q,value:U,spending_signature_hex:T})=>({hash:D,index:q,value:U,txHex:T,script_hex:j,is_confirmed:W!==-1}))}async function jX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){if(!G)throw new Error("address is required");try{let L=await PX({chain:X,address:G,apiKey:$,offset:J,limit:Q});if(L.length<=Q)return L;let Z=await jX({chain:X,address:G,apiKey:$,offset:J+Q,limit:Q});return[...L,...Z]}catch(L){return console.error(L),[]}}async function FX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Q=await jX({chain:G,address:X,apiKey:$}),L=[];for(let{hash:Z,index:j,script_hex:W,value:D}of Q){let q;if(J)q=await qX({txHash:Z,chain:G,apiKey:$});L.push({address:X,hash:Z,index:j,txHex:q,value:D,witnessUtxo:{value:D,script:Buffer.from(W,"hex")}})}return L}function KX(X){let G=M.SKConfig.get("apiKeys").blockchair||"";return M.warnOnce(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>vX({txHash:$,chain:X}),getRawTx:($)=>qX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>_X(X),getBalance:($)=>IX({address:$,chain:X,apiKey:G}),getAddressData:($)=>DX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>FX({...$,chain:X,apiKey:G})}}function wX(X){return X}function _(X){let G=M.SKConfig.get("apis")[X];if(G)return M.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return KX(X)}async function P(){let X=await import("coininfo"),{networks:G}=await import("bitcoinjs-lib");return function $(J){switch(J){case M.Chain.Bitcoin:return G.bitcoin;case M.Chain.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case M.Chain.Dash:return X.dash.main.toBitcoinJS();case M.Chain.Litecoin:return X.litecoin.main.toBitcoinJS();case M.Chain.Dogecoin:{let Q={private:70615956,public:70617039},L=X.dogecoin.test;return L.versions.bip32=Q,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var s=Y(require("bs58check")),t=Y(require("cashaddrjs"));var e;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(e||={});var C={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function XX(X){try{return u(X),!0}catch(G){return!1}}function GX(X){return u(X)?.network}function A(X){let G=u(X);if(G?.format==="legacy")return X;return OX(G)}function f(X){let G=u(X);return kX(G)}function u(X){try{return yX(X)}catch(G){}try{return NX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function yX(X){try{let G=s.default.decode(X);if(G.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let $=G[0],J=Array.prototype.slice.call(G,1);switch($){case C.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case C.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case C.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case C.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case C.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case C.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function NX(X){if(X.indexOf(":")!==-1)try{return UX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return UX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function UX(X){try{let{hash:G,prefix:$,type:J}=t.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(G,0),network:$==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function OX(X){let G=C.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),s.default.encode($)}function kX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return t.default.encode(G,$,J)}var k=require("@swapkit/helpers");var o=(X)=>{switch(X){case k.Chain.Bitcoin:case k.Chain.BitcoinCash:return 550;case k.Chain.Dash:case k.Chain.Litecoin:return 5500;case k.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},N=({inputs:X,outputs:G,feeRate:$=1,chain:J=k.Chain.Bitcoin})=>{let Q=Math.ceil($),L=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Z=X.filter((T)=>y(T)*Q<=T.value),j=$X+G.reduce((T,v)=>T+g(v,L),0),W=G.reduce((T,v)=>T+v.value,0),D=j*Q,q=0,U=[];for(let T of Z){let v=y(T),z=Q*v;D+=z,q+=T.value,U.push(T);let H=D+W;if(q<H)continue;let K=q-H,w=Q*g({address:"",value:0},L);if(K>w){let p=w+D,ZX=q-(W+p);if(ZX>Math.max(y({})*Q,o(J)))return{inputs:U,outputs:G.concat({value:ZX,address:""}),fee:p}}return{inputs:U,outputs:G,fee:D}}return{fee:Q*S({inputs:X,outputs:G,feeRate:Q})}};var EX=1000,$X=10,VX=10;async function O(X){let{script:G,opcodes:$}=await import("bitcoinjs-lib"),J=Buffer.from(X,"utf8");return G.compile([$.OP_RETURN,J])}var r;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(r||={});var n={["P2PKH"]:148,["P2WPKH"]:68},m={["P2PKH"]:34,["P2WPKH"]:31},x=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},S=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Q=X.filter((Z)=>Z.value>=n["type"in Z?Z.type:"P2PKH"]*Math.ceil($)).reduce((Z,j)=>Z+y(j),0),L=G?.reduce((Z,j)=>Z+g(j),0)||m[J];return 10+Q+L},y=(X)=>{if("type"in X)return n[X.type];if("address"in X&&X.address)return n[x(X.address)];return 148},g=(X,G)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if(G)return m[G];return m.P2PKH};var B=require("@swapkit/helpers");var l=[B.Chain.Dash,B.Chain.Dogecoin];async function AX({inputs:X,outputs:G,chain:$,psbt:J,sender:Q,compiledMemo:L}){for(let W of X){let D=!!W.witnessUtxo&&!l.includes($)&&{witnessUtxo:W.witnessUtxo},q=l.includes($)&&{nonWitnessUtxo:W.txHex?Buffer.from(W.txHex,"hex"):void 0};J.addInput({hash:W.hash,index:W.index,...D,...q})}let{initEccLib:Z}=await import("bitcoinjs-lib"),j=await import("@bitcoinerlab/secp256k1");for(let W of G){let D="address"in W&&W.address?W.address:Q,q=W.script;if(q&&!L)continue;let U=q?{script:L,value:0}:{address:D,value:W.value};Z(j),J.addOutput(U)}return{psbt:J,inputs:X}}async function TX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q,fetchTxHex:L=!1}){let Z=X.chain,{Psbt:j}=await import("bitcoinjs-lib"),W=$?await O($):null,D=await HX({assetValue:X,recipient:G,memo:$,sender:Q,fetchTxHex:L}),{inputs:q,outputs:U}=N({...D,feeRate:J,chain:Z});if(!(q&&U))throw new Error("Insufficient Balance for transaction");let T=await P(),v=new j({network:T(Z)});if(Z===B.Chain.Dogecoin)v.setMaximumFeeRate(650000000);let{psbt:z,inputs:H}=await AX({inputs:q,outputs:U,chain:Z,psbt:v,sender:Q,compiledMemo:W});return{psbt:z,utxos:D.inputs,inputs:H}}async function MX(){let X=await import("@bitcoinerlab/secp256k1"),{initEccLib:G,address:$}=await import("bitcoinjs-lib"),J=await P();return function Q({address:L,chain:Z}){if(Z===B.Chain.BitcoinCash)return E(L);try{return G(X),$.toOutputScript(L,J(Z)),!0}catch(j){return!1}}}async function SX({chain:X,phrase:G,derivationPath:$}){let J=(await c(X))({phrase:G,derivationPath:$});async function Q(Z){return await Z.signAllInputs(J),Z}async function L(){return(await JX(X))(J)}return{getAddress:L,signTransaction:Q}}async function h({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Q=B.derivationPathToString("derivationPath"in G&&G.derivationPath?G.derivationPath:B.updateDerivationPath(B.NetworkDerivationPath[X],{index:J})),L=$?await SX({chain:X,phrase:$,derivationPath:Q}):("signer"in G)?G.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let j=await JX(X),W=await MX(),D=await c(X);return{accumulative:N,calculateTxSize:S,getAddressFromKeys:j,getAddress:Z,validateAddress:(q)=>W({address:q,chain:X}),broadcastTx:(q)=>_(X).broadcastTx(q),createTransaction:TX,createKeysForPath:D,getFeeRates:()=>d(X),getInputsOutputsFee:CX,transfer:fX(L),getPrivateKeyFromMnemonic:(q)=>{return D(q).toWIF()},getBalance:BX(X),estimateTransactionFee:bX(X),estimateMaxSendableAmount:RX(X)}}async function CX({assetValue:X,feeOptionKey:G=B.FeeOption.Fast,feeRate:$,memo:J,sender:Q,recipient:L}){let Z=X.chain,j=await HX({assetValue:X,sender:Q,memo:J,recipient:L}),W=$?Math.floor($):(await d(Z))[G];return N({...j,feeRate:W,chain:Z})}function RX(X){return async function G({from:$,memo:J,feeRate:Q,feeOptionKey:L=B.FeeOption.Fast,recipients:Z=1}){let j=await _(X).getAddressData($),W=Q?Math.ceil(Q):(await d(X))[L],D=j?.utxo.map((z)=>({...z,type:"P2PKH",hash:""})).filter((z)=>z.value>Math.max(o(X),y(z)*W));if(!D?.length)return B.AssetValue.from({chain:X});let q=B.AssetValue.from({chain:X,value:D.reduce((z,H)=>z+H.value,0)}),U=typeof Z==="number"?Array.from({length:Z},()=>({address:$,value:0})):Z;if(J){let z=await O(J);U.push({address:$,script:z,value:0})}let v=S({inputs:D,outputs:U,feeRate:W})*W;return q.sub(v)}}function bX(X){return async(G)=>{let $=await CX(G);return B.AssetValue.from({chain:X,value:B.SwapKitNumber.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function c(X){let{ECPairFactory:G}=await import("ecpair"),$=await import("@bitcoinerlab/secp256k1"),{HDKey:J}=await import("@scure/bip32"),{mnemonicToSeedSync:Q}=await import("@scure/bip39"),L=await P(),{HDNode:Z,ECPair:j}=await import("@psf/bitcoincashjs-lib");switch(X){case B.Chain.BitcoinCash:return function W({phrase:D,derivationPath:q=`${B.DerivationPath.BCH}/0`,wif:U}){let T=L(X);if(U)return j.fromWIF(U,T);if(!D)throw new Error("No phrase provided");return Z.fromSeedBuffer(Buffer.from(Q(D)),T).derivePath(q).keyPair};case B.Chain.Bitcoin:case B.Chain.Dogecoin:case B.Chain.Litecoin:case B.Chain.Dash:return function W({phrase:D,wif:q,derivationPath:U}){if(!(q||D))throw new Error("Either phrase or wif must be provided");let T=G($),v=L(X);if(q)return T.fromWIF(q,v);let z=Q(D),H=J.fromMasterSeed(z,v).derive(U);if(!H.privateKey)throw new Error("Could not get private key from phrase");return T.fromPrivateKey(Buffer.from(H.privateKey),{network:v})};default:throw new Error(`Chain ${X} is not supported`)}}async function JX(X){let{payments:G}=await import("bitcoinjs-lib"),$=await P();return function J(Q){if(!Q)throw new Error("Keys must be provided");let L=l.includes(X)?G.p2pkh:G.p2wpkh,{address:Z}=L({pubkey:Q.publicKey,network:$(X)});if(!Z)throw new Error("Address not defined");return Z}}function fX(X){return async function G({memo:$,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:Z}){let j=await X?.getAddress(),W=Z.chain;if(!(X&&j))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let D=L||(await d(W))[Q||B.FeeOption.Fast],{psbt:q}=await TX({recipient:J,feeRate:D,sender:j,assetValue:Z,memo:$}),U=await X.signTransaction(q);return U.finalizeAllInputs(),_(W).broadcastTx(U.extractTransaction().toHex())}}async function d(X){let G=await _(X).getSuggestedTxFee();return{[B.FeeOption.Average]:G,[B.FeeOption.Fast]:G*1.5,[B.FeeOption.Fastest]:G*2}}async function HX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Q=!1}){let L=X.chain,Z=Q||l.includes(L);return{inputs:await _(L).scanUTXOs({address:J,fetchTxHex:Z}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await O($),value:0}]:[]]}}var I=F.Chain.BitcoinCash;function R(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let G=R(X);return XX(G)&&GX(G)==="mainnet"}function V(X){return R(f(X))}async function gX(X){async function G({builder:J,utxos:Q}){return Q.forEach((L,Z)=>{J.sign(Z,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:G}}async function QX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=F.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:F.updateDerivationPath(F.NetworkDerivationPath[I],{index:$})),Q=(await c(I))({phrase:G,derivationPath:J}),L=Q?await gX(Q):("signer"in X)?X.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let{getBalance:j,getFeeRates:W,broadcastTx:D,...q}=await h({chain:I});function U(T,v=!0){return j(R(f(T)))}return{...q,getAddress:Z,broadcastTx:D,createTransaction:zX,buildTx:mX,getAddressFromKeys:lX,getBalance:U,getFeeRates:W,stripPrefix:R,stripToCashAddress:V,validateAddress:E,transfer:xX({getFeeRates:W,broadcastTx:D,signer:L})}}async function zX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Transaction:L,TransactionBuilder:Z,address:j}=await import("@psf/bitcoincashjs-lib");if(!E(G))throw new Error("Invalid address");let W=await _(I).scanUTXOs({address:V(Q),fetchTxHex:!0}),D=$?await O($):null,q=[];q.push({address:G,value:X.getBaseValue("number")});let{inputs:U,outputs:T}=N({inputs:W,outputs:q,feeRate:J,chain:I});if(!(U&&T))throw new Error("Balance insufficient for transaction");let v=await P(),z=new Z(v(I));await Promise.all(U.map(async(H)=>{let K=await _(I).getRawTx(H.hash);z.addInput(L.fromBuffer(Buffer.from(K,"hex")),H.index)}));for(let H of T){let K="address"in H&&H.address?H.address:A(Q),w=await P(),p=j.toOutputScript(A(K),w(I));z.addOutput(p,H.value)}if(D)z.addOutput(D,0);return{builder:z,utxos:U}}function xX({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Q,assetValue:L,feeOptionKey:Z=F.FeeOption.Fast,...j}){let W=await $?.getAddress();if(!($&&W))throw new Error("Signer must provider address");if(!Q)throw new Error("Recipient address must be provided");let D=j.feeRate||(await G())[Z],{builder:q,utxos:U}=await zX({...j,assetValue:L,feeRate:D,recipient:Q,sender:W}),v=(await $.signTransaction({builder:q,utxos:U})).toHex();return X(v)}}async function mX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Psbt:L}=await import("bitcoinjs-lib"),Z=f(G);if(!E(Z))throw new Error("Invalid address");let j=await _(I).scanUTXOs({address:V(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),D=$?await O($):null,q=[];if(q.push({address:A(G),value:X.getBaseValue("number")}),D)q.push({script:D,value:0});let{inputs:U,outputs:T}=N({inputs:j,outputs:q,feeRate:W,chain:I});if(!(U&&T))throw new Error("Balance insufficient for transaction");let v=await P(),z=new L({network:v(I)});for(let{hash:H,index:K,witnessUtxo:w}of U)z.addInput({hash:H,index:K,witnessUtxo:w});for(let H of T){let K="address"in H&&H.address?H.address:A(Q),w=H.script?D?{script:D,value:0}:void 0:{address:K,value:H.value};if(w)z.addOutput(w)}return{psbt:z,utxos:j,inputs:U}}function lX(X){let G=X.getAddress(0);return V(G)}async function hX(X,G){switch(X){case b.Chain.BitcoinCash:return await QX(G);case b.Chain.Bitcoin:case b.Chain.Dogecoin:case b.Chain.Litecoin:case b.Chain.Dash:return await h({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}
|
|
1
|
+
var uX={};pX(uX,{toLegacyAddress:()=>S,toCashAddress:()=>f,stripToCashAddress:()=>V,stripPrefix:()=>b,nonSegwitChains:()=>l,isValidAddress:()=>XX,getUtxoToolbox:()=>hX,getUtxoNetwork:()=>P,getUtxoApi:()=>I,getUTXOAddressValidator:()=>vX,getScriptTypeForAddress:()=>x,getOutputSize:()=>g,getInputSize:()=>y,getDustThreshold:()=>r,getCreateKeysForPath:()=>c,detectAddressNetwork:()=>GX,createUTXOToolbox:()=>h,createCustomUtxoApi:()=>wX,createBCHToolbox:()=>QX,compileMemo:()=>O,calculateTxSize:()=>A,bchValidateAddress:()=>E,addressFromKeysGetter:()=>JX,accumulative:()=>N,UtxoNetwork:()=>e,UTXOScriptType:()=>o,TX_OVERHEAD:()=>$X,OutputSizes:()=>m,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>EX,InputSizes:()=>n});module.exports=cX(uX);var R=require("@swapkit/helpers");var F=require("@swapkit/helpers");var v=require("@swapkit/helpers");async function zX({chain:X,txHash:G}){let $=v.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:WX()}),Q=await v.RequestClient.post($,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new Error(`failed to broadcast a transaction: ${Q.error?.message}`);if(Q.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Q.result}function i(X){return`https://api.blockchair.com/${YX(X)}`}function LX(X){switch(X){case v.Chain.Bitcoin:return 5;case v.Chain.Dogecoin:return 1e4;case v.Chain.Litecoin:return 1;default:return 2}}function YX(X){switch(X){case v.Chain.BitcoinCash:return"bitcoin-cash";case v.Chain.Litecoin:return"litecoin";case v.Chain.Dash:return"dash";case v.Chain.Dogecoin:return"dogecoin";case v.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function IX(X){try{let{feePerKb:G}=await v.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,LX(X))}catch(G){return LX(X)}}async function a(X,G){try{let $=await v.RequestClient.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await v.RequestClient.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function qX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await a(`${i(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function _X({address:X,chain:G,apiKey:$}){return(await qX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function DX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await a(`${i(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function PX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){return(await a(`${i(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Q}&offset=${J}`,$)).filter(({is_spent:j})=>!j).map(({script_hex:j,block_id:W,transaction_hash:q,index:D,value:B,spending_signature_hex:T})=>({hash:q,index:D,value:B,txHex:T,script_hex:j,is_confirmed:W!==-1}))}async function jX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){if(!G)throw new Error("address is required");try{let L=await PX({chain:X,address:G,apiKey:$,offset:J,limit:Q});if(L.length<=Q)return L;let Z=await jX({chain:X,address:G,apiKey:$,offset:J+Q,limit:Q});return[...L,...Z]}catch(L){return console.error(L),[]}}async function FX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Q=await jX({chain:G,address:X,apiKey:$}),L=[];for(let{hash:Z,index:j,script_hex:W,value:q}of Q){let D;if(J)D=await DX({txHash:Z,chain:G,apiKey:$});L.push({address:X,hash:Z,index:j,txHex:D,value:q,witnessUtxo:{value:q,script:Buffer.from(W,"hex")}})}return L}function KX(X){let G=v.SKConfig.get("apiKeys").blockchair||"";return v.warnOnce(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>zX({txHash:$,chain:X}),getRawTx:($)=>DX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>IX(X),getBalance:($)=>_X({address:$,chain:X,apiKey:G}),getAddressData:($)=>qX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>FX({...$,chain:X,apiKey:G})}}function wX(X){return X}function I(X){let G=v.SKConfig.get("apis")[X];if(G)return v.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return KX(X)}async function P(){let X=await import("coininfo"),{networks:G}=await import("bitcoinjs-lib");return function $(J){switch(J){case v.Chain.Bitcoin:return G.bitcoin;case v.Chain.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case v.Chain.Dash:return X.dash.main.toBitcoinJS();case v.Chain.Litecoin:return X.litecoin.main.toBitcoinJS();case v.Chain.Dogecoin:{let Q={private:70615956,public:70617039},L=X.dogecoin.test;return L.versions.bip32=Q,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var s=Y(require("bs58check")),t=Y(require("cashaddrjs"));var e;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(e||={});var M={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function XX(X){try{return u(X),!0}catch(G){return!1}}function GX(X){return u(X)?.network}function S(X){let G=u(X);if(G?.format==="legacy")return X;return OX(G)}function f(X){let G=u(X);return kX(G)}function u(X){try{return yX(X)}catch(G){}try{return NX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function yX(X){try{let G=s.default.decode(X);if(G.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let $=G[0],J=Array.prototype.slice.call(G,1);switch($){case M.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case M.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case M.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case M.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case M.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case M.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function NX(X){if(X.indexOf(":")!==-1)try{return BX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return BX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function BX(X){try{let{hash:G,prefix:$,type:J}=t.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(G,0),network:$==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function OX(X){let G=M.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),s.default.encode($)}function kX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return t.default.encode(G,$,J)}var k=require("@swapkit/helpers");var r=(X)=>{switch(X){case k.Chain.Bitcoin:case k.Chain.BitcoinCash:return 550;case k.Chain.Dash:case k.Chain.Litecoin:return 5500;case k.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},N=({inputs:X,outputs:G,feeRate:$=1,chain:J=k.Chain.Bitcoin})=>{let Q=Math.ceil($),L=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Z=X.filter((T)=>y(T)*Q<=T.value),j=$X+G.reduce((T,z)=>T+g(z,L),0),W=G.reduce((T,z)=>T+z.value,0),q=j*Q,D=0,B=[];for(let T of Z){let z=y(T),C=Q*z;q+=C,D+=T.value,B.push(T);let H=q+W;if(D<H)continue;let K=D-H,w=Q*g({address:"",value:0},L);if(K>w){let p=w+q,ZX=D-(W+p);if(ZX>Math.max(y({})*Q,r(J)))return{inputs:B,outputs:G.concat({value:ZX,address:""}),fee:p}}return{inputs:B,outputs:G,fee:q}}return{fee:Q*A({inputs:X,outputs:G,feeRate:Q})}};var EX=1000,$X=10,VX=10;async function O(X){let{script:G,opcodes:$}=await import("bitcoinjs-lib"),J=Buffer.from(X,"utf8");return G.compile([$.OP_RETURN,J])}var o;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(o||={});var n={["P2PKH"]:148,["P2WPKH"]:68},m={["P2PKH"]:34,["P2WPKH"]:31},x=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},A=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Q=X.filter((Z)=>Z.value>=n["type"in Z?Z.type:"P2PKH"]*Math.ceil($)).reduce((Z,j)=>Z+y(j),0),L=G?.reduce((Z,j)=>Z+g(j),0)||m[J];return 10+Q+L},y=(X)=>{if("type"in X)return n[X.type];if("address"in X&&X.address)return n[x(X.address)];return 148},g=(X,G)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if(G)return m[G];return m.P2PKH};var U=require("@swapkit/helpers");var l=[U.Chain.Dash,U.Chain.Dogecoin];async function SX({inputs:X,outputs:G,chain:$,psbt:J,sender:Q,compiledMemo:L}){for(let W of X){let q=!!W.witnessUtxo&&!l.includes($)&&{witnessUtxo:W.witnessUtxo},D=l.includes($)&&{nonWitnessUtxo:W.txHex?Buffer.from(W.txHex,"hex"):void 0};J.addInput({hash:W.hash,index:W.index,...q,...D})}let{initEccLib:Z}=await import("bitcoinjs-lib"),j=await import("@bitcoinerlab/secp256k1");for(let W of G){let q="address"in W&&W.address?W.address:Q,D=W.script;if(D&&!L)continue;let B=D?{script:L,value:0}:{address:q,value:W.value};Z(j),J.addOutput(B)}return{psbt:J,inputs:X}}async function TX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q,fetchTxHex:L=!1}){let Z=X.chain,{Psbt:j}=await import("bitcoinjs-lib"),W=$?await O($):null,q=await HX({assetValue:X,recipient:G,memo:$,sender:Q,fetchTxHex:L}),{inputs:D,outputs:B}=N({...q,feeRate:J,chain:Z});if(!(D&&B))throw new Error("Insufficient Balance for transaction");let T=await P(),z=new j({network:T(Z)});if(Z===U.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:C,inputs:H}=await SX({inputs:D,outputs:B,chain:Z,psbt:z,sender:Q,compiledMemo:W});return{psbt:C,utxos:q.inputs,inputs:H}}async function vX(){let X=await import("@bitcoinerlab/secp256k1"),{initEccLib:G,address:$}=await import("bitcoinjs-lib"),J=await P();return function Q({address:L,chain:Z}){if(Z===U.Chain.BitcoinCash)return E(L);try{return G(X),$.toOutputScript(L,J(Z)),!0}catch(j){return!1}}}async function AX({chain:X,phrase:G,derivationPath:$}){let J=(await c(X))({phrase:G,derivationPath:$});async function Q(Z){return await Z.signAllInputs(J),Z}async function L(){return(await JX(X))(J)}return{getAddress:L,signTransaction:Q}}async function h({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Q=U.derivationPathToString("derivationPath"in G&&G.derivationPath?G.derivationPath:U.updateDerivationPath(U.NetworkDerivationPath[X],{index:J})),L=$?await AX({chain:X,phrase:$,derivationPath:Q}):("signer"in G)?G.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let j=await JX(X),W=await vX(),q=await c(X);return{accumulative:N,calculateTxSize:A,getAddressFromKeys:j,getAddress:Z,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>I(X).broadcastTx(D),createTransaction:TX,createKeysForPath:q,getFeeRates:()=>d(X),getInputsOutputsFee:MX,transfer:fX(L),getPrivateKeyFromMnemonic:(D)=>{return q(D).toWIF()},getBalance:UX(X),estimateTransactionFee:RX(X),estimateMaxSendableAmount:bX(X)}}async function MX({assetValue:X,feeOptionKey:G=U.FeeOption.Fast,feeRate:$,memo:J,sender:Q,recipient:L}){let Z=X.chain,j=await HX({assetValue:X,sender:Q,memo:J,recipient:L}),W=$?Math.floor($):(await d(Z))[G];return N({...j,feeRate:W,chain:Z})}function bX(X){return async function G({from:$,memo:J,feeRate:Q,feeOptionKey:L=U.FeeOption.Fast,recipients:Z=1}){let j=await I(X).getAddressData($),W=Q?Math.ceil(Q):(await d(X))[L],q=j?.utxo.map((C)=>({...C,type:"P2PKH",hash:""})).filter((C)=>C.value>Math.max(r(X),y(C)*W));if(!q?.length)return U.AssetValue.from({chain:X});let D=U.AssetValue.from({chain:X,value:q.reduce((C,H)=>C+H.value,0)}),B=typeof Z==="number"?Array.from({length:Z},()=>({address:$,value:0})):Z;if(J){let C=await O(J);B.push({address:$,script:C,value:0})}let z=A({inputs:q,outputs:B,feeRate:W})*W;return D.sub(z)}}function RX(X){return async(G)=>{let $=await MX(G);return U.AssetValue.from({chain:X,value:U.SwapKitNumber.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function c(X){let{ECPairFactory:G}=await import("ecpair"),$=await import("@bitcoinerlab/secp256k1"),{HDKey:J}=await import("@scure/bip32"),{mnemonicToSeedSync:Q}=await import("@scure/bip39"),L=await P(),{HDNode:Z,ECPair:j}=await import("@psf/bitcoincashjs-lib");switch(X){case U.Chain.BitcoinCash:return function W({phrase:q,derivationPath:D=`${U.DerivationPath.BCH}/0`,wif:B}){let T=L(X);if(B)return j.fromWIF(B,T);if(!q)throw new Error("No phrase provided");return Z.fromSeedBuffer(Buffer.from(Q(q)),T).derivePath(D).keyPair};case U.Chain.Bitcoin:case U.Chain.Dogecoin:case U.Chain.Litecoin:case U.Chain.Dash:return function W({phrase:q,wif:D,derivationPath:B}){if(!(D||q))throw new Error("Either phrase or wif must be provided");let T=G($),z=L(X);if(D)return T.fromWIF(D,z);let C=Q(q),H=J.fromMasterSeed(C,z).derive(B);if(!H.privateKey)throw new Error("Could not get private key from phrase");return T.fromPrivateKey(Buffer.from(H.privateKey),{network:z})};default:throw new Error(`Chain ${X} is not supported`)}}async function JX(X){let{payments:G}=await import("bitcoinjs-lib"),$=await P();return function J(Q){if(!Q)throw new Error("Keys must be provided");let L=l.includes(X)?G.p2pkh:G.p2wpkh,{address:Z}=L({pubkey:Q.publicKey,network:$(X)});if(!Z)throw new Error("Address not defined");return Z}}function fX(X){return async function G({memo:$,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:Z}){let j=await X?.getAddress(),W=Z.chain;if(!(X&&j))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let q=L||(await d(W))[Q||U.FeeOption.Fast],{psbt:D}=await TX({recipient:J,feeRate:q,sender:j,assetValue:Z,memo:$}),B=await X.signTransaction(D);return B.finalizeAllInputs(),I(W).broadcastTx(B.extractTransaction().toHex())}}async function d(X){let G=await I(X).getSuggestedTxFee();return{[U.FeeOption.Average]:G,[U.FeeOption.Fast]:G*1.5,[U.FeeOption.Fastest]:G*2}}async function HX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Q=!1}){let L=X.chain,Z=Q||l.includes(L);return{inputs:await I(L).scanUTXOs({address:J,fetchTxHex:Z}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await O($),value:0}]:[]]}}var _=F.Chain.BitcoinCash;function b(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let G=b(X);return XX(G)&&GX(G)==="mainnet"}function V(X){return b(f(X))}async function gX(X){async function G({builder:J,utxos:Q}){return Q.forEach((L,Z)=>{J.sign(Z,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:G}}async function QX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=F.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:F.updateDerivationPath(F.NetworkDerivationPath[_],{index:$})),Q=(await c(_))({phrase:G,derivationPath:J}),L=Q?await gX(Q):("signer"in X)?X.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let{getBalance:j,getFeeRates:W,broadcastTx:q,...D}=await h({chain:_});function B(T,z=!0){return j(b(f(T)))}return{...D,getAddress:Z,broadcastTx:q,createTransaction:CX,buildTx:mX,getAddressFromKeys:lX,getBalance:B,getFeeRates:W,stripPrefix:b,stripToCashAddress:V,validateAddress:E,transfer:xX({getFeeRates:W,broadcastTx:q,signer:L})}}async function CX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Transaction:L,TransactionBuilder:Z,address:j}=await import("@psf/bitcoincashjs-lib");if(!E(G))throw new Error("Invalid address");let W=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),q=$?await O($):null,D=[];D.push({address:G,value:X.getBaseValue("number")});let{inputs:B,outputs:T}=N({inputs:W,outputs:D,feeRate:J,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new Z(z(_));await Promise.all(B.map(async(H)=>{let K=await I(_).getRawTx(H.hash);C.addInput(L.fromBuffer(Buffer.from(K,"hex")),H.index)}));for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=await P(),p=j.toOutputScript(S(K),w(_));C.addOutput(p,H.value)}if(q)C.addOutput(q,0);return{builder:C,utxos:B}}function xX({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Q,assetValue:L,feeOptionKey:Z=F.FeeOption.Fast,...j}){let W=await $?.getAddress();if(!($&&W))throw new Error("Signer must provider address");if(!Q)throw new Error("Recipient address must be provided");let q=j.feeRate||(await G())[Z],{builder:D,utxos:B}=await CX({...j,assetValue:L,feeRate:q,recipient:Q,sender:W}),z=(await $.signTransaction({builder:D,utxos:B})).toHex();return X(z)}}async function mX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Psbt:L}=await import("bitcoinjs-lib"),Z=f(G);if(!E(Z))throw new Error("Invalid address");let j=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=$?await O($):null,D=[];if(D.push({address:S(G),value:X.getBaseValue("number")}),q)D.push({script:q,value:0});let{inputs:B,outputs:T}=N({inputs:j,outputs:D,feeRate:W,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new L({network:z(_)});for(let{hash:H,index:K,witnessUtxo:w}of B)C.addInput({hash:H,index:K,witnessUtxo:w});for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=H.script?q?{script:q,value:0}:void 0:{address:K,value:H.value};if(w)C.addOutput(w)}return{psbt:C,utxos:j,inputs:B}}function lX(X){let G=X.getAddress(0);return V(G)}async function hX(X,G){switch(X){case R.Chain.BitcoinCash:return await QX(G);case R.Chain.Bitcoin:case R.Chain.Dogecoin:case R.Chain.Litecoin:case R.Chain.Dash:return await h({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=07C373AE3814952E64756E2164756E21
|