@swapkit/toolboxes 4.0.0-beta.67 → 4.0.1
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/src/cosmos/index.cjs +2 -2
- package/dist/src/cosmos/index.cjs.map +8 -8
- package/dist/src/cosmos/index.js +2 -2
- package/dist/src/cosmos/index.js.map +8 -8
- package/dist/src/evm/index.cjs +2 -2
- package/dist/src/evm/index.cjs.map +13 -13
- package/dist/src/evm/index.js +2 -2
- package/dist/src/evm/index.js.map +13 -13
- package/dist/src/index.cjs +3 -3
- package/dist/src/index.cjs.map +46 -45
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +46 -45
- package/dist/src/near/index.cjs +2 -2
- package/dist/src/near/index.cjs.map +8 -8
- package/dist/src/near/index.js +2 -2
- package/dist/src/near/index.js.map +8 -8
- package/dist/src/radix/index.cjs +2 -2
- package/dist/src/radix/index.cjs.map +3 -3
- package/dist/src/radix/index.js +2 -2
- package/dist/src/radix/index.js.map +3 -3
- package/dist/src/ripple/index.cjs +2 -2
- package/dist/src/ripple/index.cjs.map +3 -3
- package/dist/src/ripple/index.js +2 -2
- package/dist/src/ripple/index.js.map +3 -3
- package/dist/src/solana/index.cjs +2 -2
- package/dist/src/solana/index.cjs.map +4 -4
- package/dist/src/solana/index.js +2 -2
- package/dist/src/solana/index.js.map +4 -4
- package/dist/src/substrate/index.cjs +2 -2
- package/dist/src/substrate/index.cjs.map +5 -5
- package/dist/src/substrate/index.js +2 -2
- package/dist/src/substrate/index.js.map +5 -5
- package/dist/src/tron/index.cjs +2 -2
- package/dist/src/tron/index.cjs.map +5 -5
- package/dist/src/tron/index.js +2 -2
- package/dist/src/tron/index.js.map +5 -5
- package/dist/src/utxo/index.cjs +3 -3
- package/dist/src/utxo/index.cjs.map +14 -13
- package/dist/src/utxo/index.js +3 -3
- package/dist/src/utxo/index.js.map +14 -13
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/messages.d.ts +58 -58
- package/dist/types/cosmos/thorchainUtils/messages.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/registry.d.ts.map +1 -1
- package/dist/types/cosmos/thorchainUtils/types/client-types.d.ts +2 -5
- package/dist/types/cosmos/thorchainUtils/types/client-types.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/cosmos.d.ts +19 -41
- package/dist/types/cosmos/toolbox/cosmos.d.ts.map +1 -1
- package/dist/types/cosmos/toolbox/thorchain.d.ts +45 -46
- package/dist/types/cosmos/toolbox/thorchain.d.ts.map +1 -1
- package/dist/types/cosmos/types.d.ts +5 -1
- package/dist/types/cosmos/types.d.ts.map +1 -1
- package/dist/types/cosmos/util.d.ts +12 -13
- package/dist/types/cosmos/util.d.ts.map +1 -1
- package/dist/types/evm/api.d.ts.map +1 -1
- package/dist/types/evm/contracts/op/gasOracle.d.ts.map +1 -1
- package/dist/types/evm/helpers.d.ts +1 -15
- package/dist/types/evm/helpers.d.ts.map +1 -1
- package/dist/types/evm/index.d.ts +1 -1
- package/dist/types/evm/index.d.ts.map +1 -1
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +14 -14
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts.map +1 -1
- package/dist/types/evm/toolbox/evm.d.ts +108 -108
- package/dist/types/evm/toolbox/evm.d.ts.map +1 -1
- package/dist/types/evm/toolbox/index.d.ts +97 -29
- package/dist/types/evm/toolbox/index.d.ts.map +1 -1
- package/dist/types/evm/toolbox/op.d.ts +36 -24
- package/dist/types/evm/toolbox/op.d.ts.map +1 -1
- package/dist/types/evm/types.d.ts +1 -1
- package/dist/types/evm/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/near/helpers/core.d.ts +1 -1
- package/dist/types/near/helpers/core.d.ts.map +1 -1
- package/dist/types/near/helpers/gasEstimation.d.ts +5 -5
- package/dist/types/near/helpers/gasEstimation.d.ts.map +1 -1
- package/dist/types/near/helpers/nep141.d.ts.map +1 -1
- package/dist/types/near/index.d.ts +4 -4
- package/dist/types/near/index.d.ts.map +1 -1
- package/dist/types/near/toolbox.d.ts.map +1 -1
- package/dist/types/near/types/contract.d.ts.map +1 -1
- package/dist/types/near/types/nep141.d.ts.map +1 -1
- package/dist/types/near/types/toolbox.d.ts.map +1 -1
- package/dist/types/near/types.d.ts +2 -2
- package/dist/types/near/types.d.ts.map +1 -1
- package/dist/types/radix/index.d.ts +2 -2
- package/dist/types/radix/index.d.ts.map +1 -1
- package/dist/types/ripple/index.d.ts +14 -11
- package/dist/types/ripple/index.d.ts.map +1 -1
- package/dist/types/solana/index.d.ts.map +1 -1
- package/dist/types/solana/toolbox.d.ts +10 -10
- package/dist/types/solana/toolbox.d.ts.map +1 -1
- package/dist/types/substrate/balance.d.ts.map +1 -1
- package/dist/types/substrate/substrate.d.ts +45 -45
- package/dist/types/substrate/substrate.d.ts.map +1 -1
- package/dist/types/substrate/types.d.ts +12 -12
- package/dist/types/substrate/types.d.ts.map +1 -1
- package/dist/types/tron/helpers/trongrid.d.ts.map +1 -1
- package/dist/types/tron/index.d.ts +2 -2
- package/dist/types/tron/index.d.ts.map +1 -1
- package/dist/types/tron/toolbox.d.ts +1 -1
- package/dist/types/tron/toolbox.d.ts.map +1 -1
- package/dist/types/tron/types.d.ts.map +1 -1
- package/dist/types/utxo/helpers/api.d.ts +15 -15
- package/dist/types/utxo/helpers/api.d.ts.map +1 -1
- package/dist/types/utxo/helpers/bchaddrjs.d.ts.map +1 -1
- package/dist/types/utxo/helpers/coinselect.d.ts +4 -4
- package/dist/types/utxo/helpers/coinselect.d.ts.map +1 -1
- package/dist/types/utxo/helpers/txSize.d.ts.map +1 -1
- package/dist/types/utxo/index.d.ts +1 -1
- package/dist/types/utxo/index.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts +26 -38
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/index.d.ts +3 -3
- package/dist/types/utxo/toolbox/index.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/utxo.d.ts +27 -38
- package/dist/types/utxo/toolbox/utxo.d.ts.map +1 -1
- package/dist/types/utxo/toolbox/validators.d.ts +4 -0
- package/dist/types/utxo/toolbox/validators.d.ts.map +1 -0
- package/dist/types/utxo/toolbox/zcash.d.ts +26 -37
- package/dist/types/utxo/toolbox/zcash.d.ts.map +1 -1
- package/dist/types/utxo/types.d.ts.map +1 -1
- package/package.json +15 -22
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"sources": ["../src/tron/helpers/trc20.abi.ts", "../src/tron/helpers/trongrid.ts", "../src/tron/toolbox.ts", "../src/tron/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n { name: \"_owner\", type: \"address\" },\n { name: \"_spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_spender\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_from\", type: \"address\" },\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_from\", type: \"address\" },\n { indexed: true, name: \"_to\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_owner\", type: \"address\" },\n { indexed: true, name: \"_spender\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n] as const;\n",
|
|
6
|
-
"import { SwapKitError } from \"@swapkit/helpers\";\nimport type { TronGridAccountResponse } from \"../types\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return {
|
|
7
|
-
"import {\n AssetValue,\n Chain,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport { P, match } from \"ts-pattern\";\n\nimport type { TronWeb } from \"tronweb\";\nimport { trc20ABI } from \"./helpers/trc20.abi\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid\";\nimport type {\n TronApproveParams,\n TronApprovedParams,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(\n updateDerivationPath(NetworkDerivationPath[Chain.Tron], {\n index: index || 0,\n }),\n );\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (\n options: TronToolboxOptions = {},\n): Promise<{\n tronWeb: TronWeb;\n getAddress: () => Promise<string>;\n validateAddress: (address: string) => boolean;\n getBalance: (address: string) => Promise<AssetValue[]>;\n transfer: (params: TronTransferParams) => Promise<string>;\n estimateTransactionFee: (params: TronTransferParams & { sender?: string }) => Promise<AssetValue>;\n createTransaction: (params: TronCreateTransactionParams) => Promise<TronTransaction>;\n signTransaction: (transaction: TronTransaction) => Promise<TronSignedTransaction>;\n broadcastTransaction: (signedTransaction: TronSignedTransaction) => Promise<string>;\n approve: (params: TronApproveParams) => Promise<string>;\n isApproved: (params: TronIsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: TronApprovedParams) => Promise<bigint>;\n}> => {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n // Always get configuration from SKConfig\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Tron];\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({\n fullHost: rpcUrl,\n headers,\n });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) =>\n createKeysForPath({ phrase, derivationPath, tronWeb }),\n )\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n };\n } catch {\n // Return default values if unable to fetch\n return {\n energyFee: 420,\n bandwidthFee: 1000,\n createAccountFee: 100000,\n };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: {\n total: resources.EnergyLimit || 0,\n used: resources.EnergyUsed || 0,\n },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const balance = (await contract.methods.balanceOf(address).call())[0] as string;\n\n return BigInt(balance || 0); // Convert to BigInt for consistency\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return {\n symbol: symbolRaw ?? \"UNKNOWN\",\n decimals: Number(decimalsRaw ?? 18),\n };\n } catch (error) {\n warnOnce(\n true,\n `Failed to get token balance for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n );\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [\n AssetValue.from({\n chain: Chain.Tron,\n }),\n ];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: accountData.balance,\n fromBaseDecimal: 6,\n }),\n );\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRON.${tokenMetaData.symbol}-${contractAddress}`,\n value: BigInt(balance || 0),\n fromBaseDecimal: tokenMetaData.decimals,\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce(\n true,\n `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n );\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({\n asset: `TRON.USDT-${TRON_USDT_CONTRACT}`,\n value: usdtBalance,\n fromBaseDecimal: 6,\n }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n from,\n );\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(\n transaction,\n memo,\n \"utf8\",\n );\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer - always use createTransaction + sign pattern\n const transaction = await createTransaction({\n recipient,\n assetValue,\n memo,\n sender: from,\n });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })\n : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth =\n resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n value: totalFeeSun,\n fromBaseDecimal: 6, // SUN to TRX\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce(\n true,\n `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n );\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n tronWeb.setAddress(sender); // Set address for contract calls\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", {\n identifier: assetValue.toString(),\n });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = {\n feeLimit: calculateFeeLimit(),\n callValue: 0,\n };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n /**\n * Check the current allowance for a spender on a token\n */\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: TronApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const allowance = (\n await contract.methods.allowance(from, spenderAddress).call()\n )[0] as string;\n return BigInt(allowance || 0);\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n /**\n * Check if a spender is approved for a specific amount\n */\n const isApproved = async ({\n assetAddress,\n spenderAddress,\n from,\n amount,\n }: TronIsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, spenderAddress, from });\n\n if (!amount) {\n // If no amount specified, check if there's any approval\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n /**\n * Approve a spender to transfer tokens\n */\n const approve = async ({ assetAddress, spenderAddress, amount, from }: TronApproveParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n // Build approve transaction using triggerSmartContract\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = {\n feeLimit,\n callValue: 0,\n };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n approve,\n isApproved,\n getApprovedAmount,\n };\n};\n",
|
|
8
|
-
"export {\n createTronToolbox,\n getTronAddressValidator,\n getTronPrivateKeyFromMnemonic,\n} from \"./toolbox\";\nexport type {\n
|
|
6
|
+
"import { SwapKitError } from \"@swapkit/helpers\";\nimport type { TronGridAccountResponse } from \"../types\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return { balance: account.balance, trc20: account.trc20 || [] };\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_trongrid_api_error\", {\n address,\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n}\n",
|
|
7
|
+
"import {\n AssetValue,\n Chain,\n derivationPathToString,\n getRPCUrl,\n NetworkDerivationPath,\n SwapKitError,\n updateDerivationPath,\n warnOnce,\n} from \"@swapkit/helpers\";\nimport type { TronWeb } from \"tronweb\";\nimport { match, P } from \"ts-pattern\";\nimport { trc20ABI } from \"./helpers/trc20.abi\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid\";\nimport type {\n TronApprovedParams,\n TronApproveParams,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }));\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n return Buffer.from(derived.privateKey).toString(\"hex\");\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath,\n tronWeb,\n}: {\n phrase: string;\n derivationPath: string;\n tronWeb: TronWeb;\n}) {\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPath);\n\n if (!derived.privateKey) {\n throw new SwapKitError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (\n options: TronToolboxOptions = {},\n): Promise<{\n tronWeb: TronWeb;\n getAddress: () => Promise<string>;\n validateAddress: (address: string) => boolean;\n getBalance: (address: string) => Promise<AssetValue[]>;\n transfer: (params: TronTransferParams) => Promise<string>;\n estimateTransactionFee: (params: TronTransferParams & { sender?: string }) => Promise<AssetValue>;\n createTransaction: (params: TronCreateTransactionParams) => Promise<TronTransaction>;\n signTransaction: (transaction: TronTransaction) => Promise<TronSignedTransaction>;\n broadcastTransaction: (signedTransaction: TronSignedTransaction) => Promise<string>;\n approve: (params: TronApproveParams) => Promise<string>;\n isApproved: (params: TronIsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: TronApprovedParams) => Promise<bigint>;\n}> => {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n const rpcUrl = await getRPCUrl(Chain.Tron);\n // Note: TRON API key support can be added to SKConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({ fullHost: rpcUrl, headers });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ derivationPath, phrase, tronWeb }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n };\n } catch {\n // Return default values if unable to fetch\n return { bandwidthFee: 1000, createAccountFee: 100000, energyFee: 420 };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: { total: resources.EnergyLimit || 0, used: resources.EnergyUsed || 0 },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const [balance] = await contract.methods.balanceOf(address).call();\n\n return balance ? (typeof balance === \"bigint\" ? balance : BigInt(balance)) : 0n;\n } catch (err) {\n console.warn(`balanceOf() failed for ${contractAddress}:`, err);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return { decimals: Number(decimalsRaw ?? 18), symbol: symbolRaw ?? \"UNKNOWN\" };\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_token_metadata_failed\",\n warning: `Failed to get token metadata for ${contractAddress}: ${error instanceof Error ? error.message : error}`,\n });\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [AssetValue.from({ chain: Chain.Tron })];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: accountData.balance }));\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRON.${tokenMetaData.symbol}-${contractAddress}`,\n fromBaseDecimal: tokenMetaData.decimals,\n value: BigInt(balance || 0),\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_balance_failed\",\n warning: `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n });\n\n // Fallback: get TRX and USDT directly\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: trxBalanceInSun }));\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({ asset: `TRON.USDT-${TRON_USDT_CONTRACT}`, fromBaseDecimal: 6, value: usdtBalance }),\n );\n }\n\n return balances;\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo }: TronTransferParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX Transfer (amount in SUN - base units)\n const transaction = await tronWeb.transactionBuilder.sendTrx(recipient, assetValue.getBaseValue(\"number\"), from);\n\n // Add memo if provided\n if (memo) {\n const transactionWithMemo = await tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n const signedTx = await signer.signTransaction(transactionWithMemo);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n }\n\n // TRC20 Token Transfer - always use createTransaction + sign pattern\n const transaction = await createTransaction({ assetValue, memo, recipient, sender: from });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n }: TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n // Get sender address\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n // If no signer, return conservative estimate\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 0.1 })\n : AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 15 });\n }\n\n // Get chain parameters for current resource prices\n const chainParams = await getChainParameters();\n\n // Check if recipient account exists (new accounts require activation fee)\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n // Get account resources\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n // Calculate bandwidth needed for TRX transfer\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n // Need to burn TRX for bandwidth\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n fromBaseDecimal: 6, // SUN to TRX\n value: totalFeeSun,\n });\n }\n\n // TRC20 Transfer - needs both bandwidth and energy\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n // Total fee in SUN\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({\n chain: Chain.Tron,\n fromBaseDecimal: 6, // SUN to TRX\n value: totalFeeSun,\n });\n } catch (error) {\n // Fallback to conservative estimates if calculation fails\n warnOnce({\n condition: true,\n id: \"tron_toolbox_fee_estimation_failed\",\n warning: `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,\n });\n\n throw new SwapKitError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender } = params;\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n if (memo) {\n return tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\");\n }\n\n return transaction;\n }\n\n tronWeb.setAddress(sender); // Set address for contract calls\n // For TRC20, we would need to build the transaction manually\n // This is a simplified version - in practice, you'd build the contract call transaction\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_identifier\", { identifier: assetValue.toString() });\n }\n\n // Build TRC20 transfer transaction\n // First, try using triggerSmartContract (might work despite the known bug)\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = { callValue: 0, feeLimit: calculateFeeLimit() };\n\n const result = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n return result.transaction;\n } catch (error) {\n // If both methods fail, throw a descriptive error\n throw new SwapKitError(\"toolbox_tron_transaction_creation_failed\", {\n message:\n \"Failed to create TRC20 transaction. This might be due to TronWeb 6.0.3 bug. Use the transfer method directly instead.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n return await signer.signTransaction(transaction);\n };\n\n const broadcastTransaction = async (signedTx: TronSignedTransaction) => {\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n return txid;\n };\n\n /**\n * Check the current allowance for a spender on a token\n */\n const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: TronApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new SwapKitError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const [allowance] = await contract.methods.allowance(from, spenderAddress).call();\n\n return allowance ? (typeof allowance === \"bigint\" ? allowance : BigInt(allowance)) : 0n;\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n /**\n * Check if a spender is approved for a specific amount\n */\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: TronIsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, from, spenderAddress });\n\n if (!amount) {\n // If no amount specified, check if there's any approval\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n /**\n * Approve a spender to transfer tokens\n */\n const approve = async ({ assetAddress, spenderAddress, amount, from }: TronApproveParams) => {\n if (!signer) throw new SwapKitError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n // Build approve transaction using triggerSmartContract\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = { callValue: 0, feeLimit };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n approve,\n broadcastTransaction,\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getApprovedAmount,\n getBalance,\n isApproved,\n signTransaction,\n transfer,\n tronWeb,\n validateAddress: await getTronAddressValidator(),\n };\n};\n",
|
|
8
|
+
"export { trc20ABI } from \"./helpers/trc20.abi\";\nexport {\n createTronToolbox,\n getTronAddressValidator,\n getTronPrivateKeyFromMnemonic,\n} from \"./toolbox\";\nexport type {\n TronApprovedParams,\n TronApproveParams,\n TronContract,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\nimport type { createTronToolbox } from \"./toolbox\";\nexport type TronWallet = Awaited<ReturnType<typeof createTronToolbox>>;\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "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
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "4975C148100D9C2764756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/src/utxo/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var DZ=Object.create;var{getPrototypeOf:UZ,defineProperty:n,getOwnPropertyNames:EX,getOwnPropertyDescriptor:zZ}=Object,VX=Object.prototype.hasOwnProperty;var o=(X,Z,G)=>{G=X!=null?DZ(UZ(X)):{};let J=Z||!X||!X.__esModule?n(G,"default",{value:X,enumerable:!0}):G;for(let j of EX(X))if(!VX.call(J,j))n(J,j,{get:()=>X[j],enumerable:!0});return J},fX=new WeakMap,YZ=(X)=>{var Z=fX.get(X),G;if(Z)return Z;if(Z=n({},"__esModule",{value:!0}),X&&typeof X==="object"||typeof X==="function")EX(X).map((J)=>!VX.call(Z,J)&&n(Z,J,{get:()=>X[J],enumerable:!(G=zZ(X,J))||G.enumerable}));return fX.set(X,Z),Z};var MZ=(X,Z)=>{for(var G in Z)n(X,G,{get:Z[G],enumerable:!0,configurable:!0,set:(J)=>Z[G]=()=>J})};var N=(X,Z)=>()=>(X&&(Z=X(X=0)),Z);function gX(){function X(){let Z=Date.now(),G=YX||Z;return YX=G,Z>YX?Z:G+1}return TZ+X().toString(36)}function xX(X){return async function Z(G,J=!0){return(await SX.SwapKitApi.getChainBalance({chain:X,address:G,scamFilter:J})).map(({identifier:$,value:Q,decimal:q})=>{return new QX.AssetValue({decimal:q||QX.BaseDecimal[X],value:Q,identifier:$})})}}var QX,SX,TZ,YX=0;var MX=N(()=>{QX=require("@swapkit/helpers"),SX=require("@swapkit/helpers/api"),TZ=typeof process!=="undefined"&&process.pid?process.pid.toString(36):""});async function CZ({chain:X,txHash:Z}){let G=`${$X(X)}/push/transaction`,J=JSON.stringify({data:Z});try{let j=await Y.RequestClient.post(G,{headers:{"Content-Type":"application/json"},body:J});if(j.context.code!==200)throw new Y.SwapKitError("toolbox_utxo_broadcast_failed",{error:j.context.error||"Transaction broadcast failed"});return j.data?.transaction_hash||Z}catch(j){let $=Y.SKConfig.get("rpcUrls")[X];if($){let Q=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:gX()}),q=await Y.RequestClient.post($,{headers:{"Content-Type":"application/json"},body:Q});if(q.error)throw new Y.SwapKitError("toolbox_utxo_broadcast_failed",{error:q.error?.message});if(q.result.includes('"code":-26'))throw new Y.SwapKitError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return q.result}throw j}}function $X(X){return`https://api.blockchair.com/${HZ(X)}`}function mX(X){switch(X){case Y.Chain.Bitcoin:return 5;case Y.Chain.Dogecoin:return 1e4;case Y.Chain.Litecoin:return 1;case Y.Chain.Zcash:return 1;default:return 2}}function HZ(X){switch(X){case Y.Chain.BitcoinCash:return"bitcoin-cash";case Y.Chain.Litecoin:return"litecoin";case Y.Chain.Dash:return"dash";case Y.Chain.Dogecoin:return"dogecoin";case Y.Chain.Zcash:return"zcash";case Y.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function vZ(X){try{let{feePerKb:Z}=await Y.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,mX(X))}catch(Z){return mX(X)}}async function TX(X,Z){let G=await Y.RequestClient.get(`${X}${Z?`${X.includes("?")?"&":"?"}key=${Z}`:""}`);if(!G||G.context.code!==200)throw new Y.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}async function pX({address:X,chain:Z,apiKey:G}){if(!X)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await TX(`${$X(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function IZ({address:X,chain:Z,apiKey:G}){return(await pX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function uX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await TX(`${$X(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function _Z({chain:X,address:Z,apiKey:G,offset:J=0,limit:j=30}){return(await TX(`${$X(X)}/outputs?q=recipient(${Z}),is_spent(false),value(..2000000000000000)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${j}&offset=${J}`,G)).map(({is_spent:L,script_hex:D,block_id:W,transaction_hash:U,index:M,value:z,spending_signature_hex:T})=>({hash:U,index:M,value:z,txHex:T,script_hex:D,is_confirmed:W!==-1,is_spent:L}))}function FZ(X){return X.reduce((Z,G)=>Z+G.value,0)}function lX(X,Z){let G=[...X].sort((J,j)=>j.value-J.value);if(Z){let J=[],j=0;for(let $ of G)if(J.push($),j+=$.value,j>=Z)break;return J}return G}async function nX({chain:X,address:Z,apiKey:G,targetValue:J,accumulativeValue:j=0,offset:$=0,limit:Q=30}){if(!Z)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let q=await _Z({targetValue:J,chain:X,address:Z,apiKey:G,offset:$,limit:Q}),D=q.length<Q,W=q.filter(({is_spent:I})=>!I),U=FZ(W),M=j+U,z=J&&M>=J;if(D||z)return lX(W,J);let T=await nX({chain:X,address:Z,apiKey:G,offset:$+Q,limit:Q,accumulativeValue:M,targetValue:J}),_=[...W,...T];return lX(_,J)}catch(q){return console.error("Failed to fetch unspent UTXOs:",q),[]}}async function yZ({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0,targetValue:j}){let $=await nX({chain:Z,address:X,apiKey:G,targetValue:j}),Q=[];for(let{hash:q,index:L,script_hex:D,value:W}of $){let U;if(J)U=await uX({txHash:q,chain:Z,apiKey:G});Q.push({address:X,hash:q,index:L,txHex:U,value:W,witnessUtxo:{value:W,script:Buffer.from(D,"hex")}})}return Q}function NZ(X){let Z=Y.SKConfig.get("apiKeys").blockchair||"";return Y.warnOnce(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>CZ({txHash:G,chain:X}),getRawTx:(G)=>uX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>vZ(X),getBalance:(G)=>IZ({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>pX({address:G,chain:X,apiKey:Z}),getUtxos:(G)=>yZ({...G,chain:X,apiKey:Z})}}function OZ(X){return X}function F(X){let Z=Y.SKConfig.get("apis")[X];if(Z)return Y.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return NZ(X)}function A(){return function X(Z){switch(Z){case Y.Chain.Bitcoin:return cX.networks.bitcoin;case Y.Chain.BitcoinCash:return x.default.bitcoincash.main.toBitcoinJS();case Y.Chain.Dash:return x.default.dash.main.toBitcoinJS();case Y.Chain.Litecoin:return x.default.litecoin.main.toBitcoinJS();case Y.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=x.default.dogecoin.test;return J.versions.bip32=G,x.default.dogecoin.main.toBitcoinJS()}case Y.Chain.Zcash:return hX.networks.zcash;default:throw new Y.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var hX,Y,cX,x;var oX=N(()=>{hX=require("@bitgo/utxo-lib"),Y=require("@swapkit/helpers"),cX=require("bitcoinjs-lib");MX();x=o(require("coininfo"))});function _X(X){try{return jX(X),!0}catch(Z){return!1}}function FX(X){return jX(X)?.network}function m(X){let Z=jX(X);if(Z?.format==="legacy")return X;return PZ(Z)}function r(X){let Z=jX(X);return KZ(Z)}function jX(X){try{let Z=AZ(X);if(Z)return Z}catch(Z){}try{let Z=kZ(X);if(Z)return Z}catch(Z){}throw new CX.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function AZ(X){try{let Z=HX.default.decode(X);if(Z.length!==21)throw new CX.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){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:return}}catch(Z){return}}function kZ(X){if(X.indexOf(":")!==-1)try{return rX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return rX(`${G}:${X}`)}catch(J){}}return}function rX(X){try{let{hash:Z,prefix:G,type:J}=vX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){return}}function PZ(X){let Z=C.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),HX.default.encode(G)}function KZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return vX.default.encode(Z,G,J)}var CX,HX,vX,IX,C;var dX=N(()=>{CX=require("@swapkit/helpers"),HX=o(require("bs58check")),vX=o(require("cashaddrjs"));((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(IX||={});C={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}}});var k,qX=(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;case k.Chain.Zcash:return 546;default:throw new k.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},P=({inputs:X,outputs:Z,feeRate:G=1,chain:J=k.Chain.Bitcoin,changeAddress:j=""})=>{let $=Math.ceil(G),Q=X[0]&&"address"in X[0]&&X[0].address?i(X[0].address):"P2PKH",q=X.filter((z)=>b(z)*$<=z.value),L=LX+Z.reduce((z,T)=>z+d(T,Q),0),D=Z.reduce((z,T)=>z+T.value,0),W=L*$,U=0,M=[];for(let z of q){let T=b(z),_=$*T;W+=_,U+=z.value,M.push(z);let I=W+D;if(U<I)continue;let f=U-I,E=$*d({address:"",value:0},Q);if(f>E){let RX=E+W,bX=U-(D+RX);if(bX>Math.max(b({})*$,qX(J)))return{inputs:M,outputs:Z.concat({value:bX,address:j}),fee:RX}}return{inputs:M,outputs:Z,fee:W}}return{fee:$*l({inputs:X,outputs:Z,feeRate:$})}};var iX=N(()=>{k=require("@swapkit/helpers");h()});function K(X){let Z=Buffer.from(X,"utf8");return DX.script.compile([DX.opcodes.OP_RETURN,Z])}var aX,DX,wZ=1000,LX=10,sX=10,RZ=41,bZ=107,WX,BX,a,i=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new aX.SwapKitError("toolbox_utxo_invalid_address",{address:X})},l=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?i(X[0].address):"P2PKH",j=X.filter((Q)=>Q.value>=BX["type"in Q?Q.type:"P2PKH"]*Math.ceil(G)).reduce((Q,q)=>Q+b(q),0),$=Z?.reduce((Q,q)=>Q+d(q),0)||a[J];return LX+j+$},b=(X)=>{if("type"in X)return BX[X.type];if("address"in X&&X.address)return BX[i(X.address)];return RZ+bZ},d=(X,Z)=>{if(X?.script)return sX+X.script.length+(X.script.length>=74?2:1);if(Z)return a[Z];return a.P2PKH};var tX=N(()=>{aX=require("@swapkit/helpers"),DX=require("bitcoinjs-lib");((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(WX||={});BX={["P2PKH"]:148,["P2WPKH"]:68},a={["P2PKH"]:34,["P2WPKH"]:31}});var h=N(()=>{oX();dX();iX();tX()});function AX(){return y.networks.zcash}function XZ(){return{messagePrefix:`\x18ZCash Signed Message:
|
|
2
|
-
`,bech32:void 0,bip32:{public:76067358,private:76066276},pubKeyHash:28,scriptHash:28,wif:128}}function s(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=AX();try{return y.address.toOutputScript(X,Z),!0}catch{let G=OX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}}catch{return!1}}function fZ({phrase:X,derivationPath:Z}){let G=NX.mnemonicToSeedSync(X),j=yX.HDKey.fromMasterSeed(G).derive(Z);if(!j.privateKey)throw new H.SwapKitError("toolbox_utxo_invalid_params");let $=XZ(),Q=y.ECPair.fromPrivateKey(Buffer.from(j.privateKey),{network:$}),q=y.crypto.hash160(Q.publicKey),{isStagenet:L}=H.SKConfig.get("envs"),D=L?Buffer.from([29,37]):Buffer.from([28,184]),W=Buffer.concat([D,q]),U=OX.default.encode(W);return{getAddress:()=>Promise.resolve(U),signTransaction:(M)=>{let z=M.signAllInputs(Q);return Promise.resolve(z)}}}function EZ({inputs:X,outputs:Z,psbt:G,sender:J,compiledMemo:j}){for(let $ of X){let Q=!!$.witnessUtxo&&{witnessUtxo:{...$.witnessUtxo,value:BigInt($.value)}},q=!$.witnessUtxo&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};G.addInput({hash:$.hash,index:$.index,...Q,...q})}for(let $ of Z){let Q="address"in $&&$.address?$.address:J,q=$.script;if(q&&!j)continue;let L=q?{script:j,value:0n}:{script:y.address.toOutputScript(Q,AX()),value:BigInt($.value)};G.addOutput(L)}return{psbt:G,inputs:X}}async function eX(X){let{assetValue:Z,recipient:G,memo:J,feeRate:j,sender:$,fetchTxHex:Q}=X,q=J?K(J):null,L=await F(H.Chain.Zcash).getUtxos({address:$,fetchTxHex:Q!==!1}),D=[{address:G,value:Number(Z.getBaseValue("string"))},...q?[{script:q,value:0}]:[]],{inputs:W,outputs:U}=P({inputs:L,outputs:D,feeRate:j,chain:H.Chain.Zcash,changeAddress:$});if(!(W&&U))throw new H.SwapKitError("toolbox_utxo_insufficient_balance",{sender:$,assetValue:Z});let M=y.bitgo.createPsbtForNetwork({network:AX()},{version:455});M.setVersion(4,!0);let z=Buffer.concat([Buffer.of(252),Buffer.of(5),Buffer.from("BITGO"),Buffer.of(0)]),T=3370586197,_=Buffer.allocUnsafe(4);_.writeUInt32LE(T>>>0,0),M.addUnknownKeyValToGlobal({key:z,value:_});let{psbt:I,inputs:f}=await EZ({inputs:W,outputs:U,psbt:M,sender:$,compiledMemo:q});return{inputs:f,outputs:U,psbt:I}}async function kX(X){let Z=await c.match(X).with({signer:c.P.not(c.P.nullish)},({signer:Q})=>Promise.resolve(Q)).with({phrase:c.P.string},({phrase:Q,derivationPath:q,index:L=0})=>{let D=q||H.NetworkDerivationPath[H.Chain.Zcash]||[44,133,0,0,0],W=H.updateDerivationPath(D,{index:L}),U=H.derivationPathToString(W);return fZ({phrase:Q,derivationPath:U})}).otherwise(()=>Promise.resolve(void 0)),G=await V({chain:H.Chain.Zcash,signer:Z});async function J({recipient:Q,assetValue:q,feeOptionKey:L=H.FeeOption.Fast,...D}){let W=await Z?.getAddress();if(!(Z&&W))throw new H.SwapKitError("toolbox_utxo_no_signer");let U=D.feeRate||(await G.getFeeRates())[L],{psbt:M}=await eX({...D,assetValue:q,feeRate:U,recipient:Q,sender:W}),z=await Z.signTransaction(M);return z.finalizeAllInputs(),G.broadcastTx(z.extractTransaction().toHex())}function j({phrase:Q,derivationPath:q="m/44'/133'/0'/0/0"}){let L=NX.mnemonicToSeedSync(Q),W=yX.HDKey.fromMasterSeed(L).derive(q);if(!W.privateKey)throw new H.SwapKitError("toolbox_utxo_invalid_params");let U=XZ();return y.ECPair.fromPrivateKey(Buffer.from(W.privateKey),{network:U})}function $({phrase:Q,derivationPath:q="m/44'/133'/0'/0/0"}){return j({phrase:Q,derivationPath:q}).toWIF()}return{...G,transfer:J,createTransaction:eX,createKeysForPath:j,getPrivateKeyFromMnemonic:$,validateAddress:s}}var y,yX,NX,H,OX,c;var t=N(()=>{y=require("@bitgo/utxo-lib"),yX=require("@scure/bip32"),NX=require("@scure/bip39"),H=require("@swapkit/helpers"),OX=o(require("bs58check")),c=require("ts-pattern");h();e()});function JZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:j,compiledMemo:$}){for(let Q of X){let q=!!Q.witnessUtxo&&!XX.includes(G)&&{witnessUtxo:Q.witnessUtxo},L=XX.includes(G)&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};J.addInput({hash:Q.hash,index:Q.index,...q,...L})}for(let Q of Z){let q="address"in Q&&Q.address?Q.address:j,L=Q.script;if(L&&!$)continue;let D=L?{script:$,value:0}:{address:q,value:Q.value};w.initEccLib(UX.default),J.addOutput(D)}return{psbt:J,inputs:X}}async function QZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j,fetchTxHex:$=!1}){let Q=X.chain,q=G?await K(G):null,L=await qZ({assetValue:X,recipient:Z,memo:G,sender:j,fetchTxHex:$}),{inputs:D,outputs:W}=P({...L,feeRate:J,chain:Q});if(!(D&&W))throw new B.SwapKitError("toolbox_utxo_insufficient_balance",{sender:j,assetValue:X});let U=await A(),M=new w.Psbt({network:U(Q)});if(Q===B.Chain.Dogecoin)M.setMaximumFeeRate(650000000);let{psbt:z,inputs:T}=await JZ({inputs:D,outputs:W,chain:Q,psbt:M,sender:j,compiledMemo:q});return{psbt:z,utxos:L.inputs,inputs:T}}async function $Z(){let X=await A();return function Z({address:G,chain:J}){if(J===B.Chain.BitcoinCash)return S(G);if(J===B.Chain.Zcash)return s(G);try{return w.initEccLib(UX.default),w.address.toOutputScript(G,X(J)),!0}catch(j){return!1}}}async function VZ({chain:X,phrase:Z,derivationPath:G}){let J=(await ZX(X))({phrase:Z,derivationPath:G});async function j(Q){return await Q.signAllInputs(J),Q}async function $(){return(await KX(X))(J)}return{getAddress:$,signTransaction:j}}async function V({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,j=B.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:B.updateDerivationPath(B.NetworkDerivationPath[X],{index:J})),$=G?await VZ({chain:X,phrase:G,derivationPath:j}):("signer"in Z)?Z.signer:void 0;function Q(){return Promise.resolve($?.getAddress())}let q=await KX(X),L=await $Z(),D=await ZX(X);return{accumulative:P,calculateTxSize:l,getAddressFromKeys:q,getAddress:Q,validateAddress:(W)=>L({address:W,chain:X}),broadcastTx:(W)=>F(X).broadcastTx(W),createTransaction:QZ,createKeysForPath:D,getFeeRates:()=>GX(X),getInputsOutputsFee:jZ,transfer:xZ($),getPrivateKeyFromMnemonic:(W)=>{return D(W).toWIF()},getBalance:xX(X),estimateTransactionFee:gZ(X),estimateMaxSendableAmount:SZ(X)}}async function jZ({assetValue:X,feeOptionKey:Z=B.FeeOption.Fast,feeRate:G,memo:J,sender:j,recipient:$}){let Q=X.chain,q=await qZ({assetValue:X,sender:j,memo:J,recipient:$}),L=G?Math.floor(G):(await GX(Q))[Z];return P({...q,feeRate:L,chain:Q})}function SZ(X){return async function Z({from:G,memo:J,feeRate:j,feeOptionKey:$=B.FeeOption.Fast,recipients:Q=1}){let q=await F(X).getAddressData(G),L=j?Math.ceil(j):(await GX(X))[$],D=q?.utxo.map((T)=>({...T,type:"P2PKH",hash:""})).filter((T)=>T.value>Math.max(qX(X),b(T)*L));if(!D?.length)return B.AssetValue.from({chain:X});let W=B.AssetValue.from({chain:X,value:D.reduce((T,_)=>T+_.value,0)}),U=typeof Q==="number"?Array.from({length:Q},()=>({address:G,value:0})):Q;if(J){let T=await K(J);U.push({address:G,script:T,value:0})}let z=l({inputs:D,outputs:U,feeRate:L})*L;return W.sub(z)}}function gZ(X){return async(Z)=>{let G=await jZ(Z);return B.AssetValue.from({chain:X,value:B.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function ZX(X){let Z=await A();switch(X){case B.Chain.BitcoinCash:return function G({phrase:J,derivationPath:j=`${B.DerivationPath.BCH}/0`,wif:$}){let Q=Z(X);if($)return zX.ECPair.fromWIF($,Q);if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return zX.HDNode.fromSeedBuffer(Buffer.from(PX.mnemonicToSeedSync(J)),Q).derivePath(j).keyPair};case B.Chain.Bitcoin:case B.Chain.Dogecoin:case B.Chain.Litecoin:case B.Chain.Zcash:case B.Chain.Dash:return function G({phrase:J,wif:j,derivationPath:$}){if(!(j||J))throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let Q=ZZ.ECPairFactory(UX.default),q=Z(X);if(j)return Q.fromWIF(j,q);let L=PX.mnemonicToSeedSync(J),D=GZ.HDKey.fromMasterSeed(L,q).derive($);if(!D.privateKey)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return Q.fromPrivateKey(Buffer.from(D.privateKey),{network:q})};default:throw new B.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function KX(X){let Z=await A();return function G(J){if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let j=XX.includes(X)?w.payments.p2pkh:w.payments.p2wpkh,{address:$}=j({pubkey:J.publicKey,network:Z(X)});if(!$)throw new B.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return $}}function xZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:j,feeRate:$,assetValue:Q}){let q=await X?.getAddress(),L=Q.chain;if(!(X&&q))throw new B.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let D=$||(await GX(L))[j||B.FeeOption.Fast],{psbt:W}=await QZ({recipient:J,feeRate:D,sender:q,assetValue:Q,memo:G}),U=await X.signTransaction(W);return U.finalizeAllInputs(),F(L).broadcastTx(U.extractTransaction().toHex())}}async function GX(X){let Z=await F(X).getSuggestedTxFee();return{[B.FeeOption.Average]:Z,[B.FeeOption.Fast]:B.applyFeeMultiplier(Z,B.FeeOption.Fast),[B.FeeOption.Fastest]:B.applyFeeMultiplier(Z,B.FeeOption.Fastest)}}async function qZ({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:j=!1}){let $=X.chain,Q=(await GX($))[B.FeeOption.Fastest],q=j||XX.includes($),L=X.getBaseValue("number"),D=Math.ceil(L+Q*5000);return{inputs:await F($).getUtxos({address:J,fetchTxHex:q,targetValue:D}),outputs:[{address:Z,value:L},...G?[{address:"",script:await K(G),value:0}]:[]]}}var B,w,ZZ,UX,zX,GZ,PX,XX;var e=N(()=>{B=require("@swapkit/helpers"),w=require("bitcoinjs-lib"),ZZ=require("ecpair");MX();h();JX();UX=o(require("@bitcoinerlab/secp256k1")),zX=require("@psf/bitcoincashjs-lib"),GZ=require("@scure/bip32"),PX=require("@scure/bip39");t();XX=[B.Chain.Dash,B.Chain.Dogecoin]});function p(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function S(X){let Z=p(X);return _X(Z)&&FX(Z)==="mainnet"}function g(X){return p(r(X))}async function mZ(X){async function Z({builder:J,utxos:j}){return j.forEach(($,Q)=>{J.sign(Q,X,void 0,65,$.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(g(J))},signTransaction:Z}}async function wX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=v.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:v.updateDerivationPath(v.NetworkDerivationPath[O],{index:G})),j=Z?(await ZX(O))({phrase:Z,derivationPath:J}):void 0,$=j?await mZ(j):("signer"in X)?X.signer:void 0;function Q(){return Promise.resolve($?.getAddress())}let{getBalance:q,getFeeRates:L,broadcastTx:D,...W}=await V({chain:O});function U(M,z=!0){return q(p(r(M)))}return{...W,getAddress:Q,broadcastTx:D,createTransaction:WZ,buildTx:hZ,getAddressFromKeys:cZ,getBalance:U,getFeeRates:L,stripPrefix:p,stripToCashAddress:g,validateAddress:S,transfer:lZ({getFeeRates:L,broadcastTx:D,signer:$})}}async function WZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j}){if(!S(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let $=Math.ceil(X.getBaseValue("number")+J*7500),Q=await F(O).getUtxos({address:g(j),fetchTxHex:!0,targetValue:$}),q=G?await K(G):null,L=[];L.push({address:Z,value:X.getBaseValue("number")});let{inputs:D,outputs:W}=P({inputs:Q,outputs:L,feeRate:J,chain:O});if(!(D&&W))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:j,assetValue:X});let U=await A(),M=new u.TransactionBuilder(U(O));await Promise.all(D.map(async(z)=>{let T=await F(O).getRawTx(z.hash);M.addInput(u.Transaction.fromBuffer(Buffer.from(T,"hex")),z.index)}));for(let z of W){let T="address"in z&&z.address?z.address:m(j),_=await A(),I=u.address.toOutputScript(m(T),_(O));M.addOutput(I,z.value)}if(q)M.addOutput(q,0);return{builder:M,utxos:D}}function lZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:j,assetValue:$,feeOptionKey:Q=v.FeeOption.Fast,...q}){let L=await G?.getAddress();if(!(G&&L))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!j)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let D=q.feeRate||(await Z())[Q],{builder:W,utxos:U}=await WZ({...q,assetValue:$,feeRate:D,recipient:j,sender:L}),z=(await G.signTransaction({builder:W,utxos:U})).toHex();return X(z)}}async function hZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j,setSigHashType:$}){let Q=r(Z);if(!S(Q))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Q});let q=Math.ceil(X.getBaseValue("number")+J*7500),L=await F(O).getUtxos({address:g(j),fetchTxHex:!1,targetValue:q}),D=Number(J.toFixed(0)),W=G?await K(G):null,U=[];if(U.push({address:m(Z),value:X.getBaseValue("number")}),W)U.push({script:W,value:0});let{inputs:M,outputs:z}=P({inputs:L,outputs:U,feeRate:D,chain:O});if(!(M&&z))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:j,assetValue:X});let T=await A(),_=new LZ.Psbt({network:T(O)});for(let{hash:I,index:f,witnessUtxo:E}of M)_.addInput({hash:I,index:f,witnessUtxo:E,sighashType:$?65:void 0});for(let I of z){let f="address"in I&&I.address?I.address:m(j),E=I.script?W?{script:W,value:0}:void 0:{address:f,value:I.value};if(E)_.addOutput(E)}return{psbt:_,utxos:L,inputs:M}}function cZ(X){let Z=X.getAddress(0);return g(Z)}var u,v,LZ,O;var JX=N(()=>{u=require("@psf/bitcoincashjs-lib"),v=require("@swapkit/helpers"),LZ=require("bitcoinjs-lib");h();e();O=v.Chain.BitcoinCash});async function pZ(X,Z){switch(X){case R.Chain.BitcoinCash:return await wX(Z||{});case R.Chain.Zcash:return await kX(Z);case R.Chain.Bitcoin:case R.Chain.Dogecoin:case R.Chain.Litecoin:case R.Chain.Dash:return await V({chain:X,...Z});default:throw new R.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}var R;var BZ=N(()=>{R=require("@swapkit/helpers");JX();e();t();JX();t()});var nZ={};MZ(nZ,{validateZcashAddress:()=>s,toLegacyAddress:()=>m,toCashAddress:()=>r,stripToCashAddress:()=>g,stripPrefix:()=>p,nonSegwitChains:()=>XX,isValidAddress:()=>_X,getUtxoToolbox:()=>pZ,getUtxoNetwork:()=>A,getUtxoApi:()=>F,getUTXOAddressValidator:()=>$Z,getScriptTypeForAddress:()=>i,getOutputSize:()=>d,getInputSize:()=>b,getDustThreshold:()=>qX,getCreateKeysForPath:()=>ZX,detectAddressNetwork:()=>FX,createZcashToolbox:()=>kX,createUTXOToolbox:()=>V,createCustomUtxoApi:()=>OZ,createBCHToolbox:()=>wX,compileMemo:()=>K,calculateTxSize:()=>l,bchValidateAddress:()=>S,addressFromKeysGetter:()=>KX,addInputsAndOutputs:()=>JZ,accumulative:()=>P,UtxoNetwork:()=>IX,UTXOScriptType:()=>WX,TX_OVERHEAD:()=>LX,OutputSizes:()=>a,OP_RETURN_OVERHEAD:()=>sX,MIN_TX_FEE:()=>wZ,InputSizes:()=>BX});module.exports=YZ(nZ);var oZ=N(()=>{BZ();JX();e();t();h()});oZ();
|
|
1
|
+
var YZ=Object.create;var{getPrototypeOf:MZ,defineProperty:r,getOwnPropertyNames:VX,getOwnPropertyDescriptor:TZ}=Object,SX=Object.prototype.hasOwnProperty;var m=(X,Z,G)=>{G=X!=null?YZ(MZ(X)):{};let J=Z||!X||!X.__esModule?r(G,"default",{value:X,enumerable:!0}):G;for(let j of VX(X))if(!SX.call(J,j))r(J,j,{get:()=>X[j],enumerable:!0});return J},EX=new WeakMap,CZ=(X)=>{var Z=EX.get(X),G;if(Z)return Z;if(Z=r({},"__esModule",{value:!0}),X&&typeof X==="object"||typeof X==="function")VX(X).map((J)=>!SX.call(Z,J)&&r(Z,J,{get:()=>X[J],enumerable:!(G=TZ(X,J))||G.enumerable}));return EX.set(X,Z),Z};var HZ=(X,Z)=>{for(var G in Z)r(X,G,{get:Z[G],enumerable:!0,configurable:!0,set:(J)=>Z[G]=()=>J})};var y=(X,Z)=>()=>(X&&(Z=X(X=0)),Z);function xX(){function X(){let Z=Date.now(),G=MX||Z;return MX=G,Z>MX?Z:G+1}return vZ+X().toString(36)}function mX(X){return async function Z(G,J=!0){return(await gX.SwapKitApi.getChainBalance({address:G,chain:X,scamFilter:J})).map(({identifier:$,value:Q,decimal:q})=>{return new JX.AssetValue({decimal:q||JX.BaseDecimal[X],identifier:$,value:Q})})}}var JX,gX,vZ,MX=0;var TX=y(()=>{JX=require("@swapkit/helpers"),gX=require("@swapkit/helpers/api"),vZ=typeof process!=="undefined"&&process.pid?process.pid.toString(36):""});async function IZ({chain:X,txHash:Z}){let G=`${QX(X)}/push/transaction`,J=JSON.stringify({data:Z});try{let j=await Y.RequestClient.post(G,{body:J,headers:{"Content-Type":"application/json"}});if(j.context.code!==200)throw new Y.SwapKitError("toolbox_utxo_broadcast_failed",{error:j.context.error||"Transaction broadcast failed"});return j.data?.transaction_hash||Z}catch(j){let $=await Y.getRPCUrl(X);if($){let Q=JSON.stringify({id:xX(),jsonrpc:"2.0",method:"sendrawtransaction",params:[Z]}),q=await Y.RequestClient.post($,{body:Q,headers:{"Content-Type":"application/json"}});if(q.error)throw new Y.SwapKitError("toolbox_utxo_broadcast_failed",{error:q.error?.message});if(q.result.includes('"code":-26'))throw new Y.SwapKitError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return q.result}throw j}}function QX(X){return`https://api.blockchair.com/${_Z(X)}`}function lX(X){switch(X){case Y.Chain.Bitcoin:return 5;case Y.Chain.Dogecoin:return 1e4;case Y.Chain.Litecoin:return 1;case Y.Chain.Zcash:return 1;default:return 2}}function _Z(X){switch(X){case Y.Chain.BitcoinCash:return"bitcoin-cash";case Y.Chain.Litecoin:return"litecoin";case Y.Chain.Dash:return"dash";case Y.Chain.Dogecoin:return"dogecoin";case Y.Chain.Zcash:return"zcash";case Y.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function FZ(X){try{let{feePerKb:Z}=await Y.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,lX(X))}catch(Z){return lX(X)}}async function CX(X,Z){let G=await Y.RequestClient.get(`${X}${Z?`${X.includes("?")?"&":"?"}key=${Z}`:""}`);if(!G||G.context.code!==200)throw new Y.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}async function nX({address:X,chain:Z,apiKey:G}){if(!X)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await CX(`${QX(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{address:{balance:0,transaction_count:0},utxo:[]}}}async function yZ({address:X,chain:Z,apiKey:G}){return(await nX({address:X,apiKey:G,chain:Z}))?.address.balance||0}async function oX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await CX(`${QX(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function NZ({chain:X,address:Z,apiKey:G,offset:J=0,limit:j=30}){return(await CX(`${QX(X)}/outputs?q=recipient(${Z}),is_spent(false),value(..2000000000000000)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${j}&offset=${J}`,G)).map(({is_spent:W,script_hex:D,block_id:L,transaction_hash:z,index:M,value:U,spending_signature_hex:T})=>({hash:z,index:M,is_confirmed:L!==-1,is_spent:W,script_hex:D,txHex:T,value:U}))}function kZ(X){return X.reduce((Z,G)=>Z+G.value,0)}function hX(X,Z){let G=[...X].sort((J,j)=>j.value-J.value);if(Z){let J=[],j=0;for(let $ of G)if(J.push($),j+=$.value,j>=Z)break;return J}return G}async function uX({chain:X,address:Z,apiKey:G,targetValue:J,accumulativeValue:j=0,offset:$=0,limit:Q=30}){if(!Z)throw new Y.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let q=await NZ({address:Z,apiKey:G,chain:X,limit:Q,offset:$,targetValue:J}),D=q.length<Q,L=q.filter(({is_spent:I})=>!I),z=kZ(L),M=j+z,U=J&&M>=J;if(D||U)return hX(L,J);let T=await uX({accumulativeValue:M,address:Z,apiKey:G,chain:X,limit:Q,offset:$+Q,targetValue:J}),_=[...L,...T];return hX(_,J)}catch(q){return console.error("Failed to fetch unspent UTXOs:",q),[]}}async function AZ({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0,targetValue:j}){let $=await uX({address:X,apiKey:G,chain:Z,targetValue:j}),Q=[];for(let{hash:q,index:W,script_hex:D,value:L}of $){let z;if(J)z=await oX({apiKey:G,chain:Z,txHash:q});Q.push({address:X,hash:q,index:W,txHex:z,value:L,witnessUtxo:{script:Buffer.from(D,"hex"),value:L}})}return Q}function OZ(X){let Z=Y.SKConfig.get("apiKeys").blockchair||"";return Y.warnOnce({condition:!Z,id:"no_blockchair_api_key_warning",warning:"No Blockchair API key found. Functionality will be limited."}),{broadcastTx:(G)=>IZ({chain:X,txHash:G}),getAddressData:(G)=>nX({address:G,apiKey:Z,chain:X}),getBalance:(G)=>yZ({address:G,apiKey:Z,chain:X}),getRawTx:(G)=>oX({apiKey:Z,chain:X,txHash:G}),getSuggestedTxFee:()=>FZ(X),getUtxos:(G)=>AZ({...G,apiKey:Z,chain:X})}}function wZ(X){return X}function F(X){let Z=Y.SKConfig.get("apis")[X];if(Z)return Y.warnOnce({condition:!0,id:"custom_utxo_api_warning",warning:"Using custom UTXO API. Be sure to implement all methods to avoid issues."}),Z;return OZ(X)}function A(){return function X(Z){switch(Z){case Y.Chain.Bitcoin:return pX.networks.bitcoin;case Y.Chain.BitcoinCash:return l.default.bitcoincash.main.toBitcoinJS();case Y.Chain.Dash:return l.default.dash.main.toBitcoinJS();case Y.Chain.Litecoin:return l.default.litecoin.main.toBitcoinJS();case Y.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=l.default.dogecoin.test;return J.versions.bip32=G,l.default.dogecoin.main.toBitcoinJS()}case Y.Chain.Zcash:return cX.networks.zcash;default:throw new Y.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var cX,Y,pX,l;var rX=y(()=>{cX=require("@bitgo/utxo-lib"),Y=require("@swapkit/helpers"),pX=require("bitcoinjs-lib"),l=m(require("coininfo"));TX()});function FX(X){try{return $X(X),!0}catch(Z){return!1}}function yX(X){return $X(X)?.network}function h(X){let Z=$X(X);if(Z?.format==="legacy")return X;return KZ(Z)}function d(X){let Z=$X(X);return bZ(Z)}function $X(X){try{let Z=PZ(X);if(Z)return Z}catch(Z){}try{let Z=fZ(X);if(Z)return Z}catch(Z){}throw new HX.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function PZ(X){try{let Z=vX.default.decode(X);if(Z.length!==21)throw new HX.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case C.legacy.mainnet.p2pkh:return{format:"legacy",hash:J,network:"mainnet",type:"p2pkh"};case C.legacy.mainnet.p2sh:return{format:"legacy",hash:J,network:"mainnet",type:"p2sh"};case C.legacy.testnet.p2pkh:return{format:"legacy",hash:J,network:"testnet",type:"p2pkh"};case C.legacy.testnet.p2sh:return{format:"legacy",hash:J,network:"testnet",type:"p2sh"};case C.bitpay.mainnet.p2pkh:return{format:"bitpay",hash:J,network:"mainnet",type:"p2pkh"};case C.bitpay.mainnet.p2sh:return{format:"bitpay",hash:J,network:"mainnet",type:"p2sh"};default:return}}catch(Z){return}}function fZ(X){if(X.indexOf(":")!==-1)try{return dX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return dX(`${G}:${X}`)}catch(J){}}return}function dX(X){try{let{hash:Z,prefix:G,type:J}=IX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){return}}function KZ(X){let Z=C.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),vX.default.encode(G)}function bZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return IX.default.encode(Z,G,J)}var HX,vX,IX,_X,C;var iX=y(()=>{HX=require("@swapkit/helpers"),vX=m(require("bs58check")),IX=m(require("cashaddrjs"));((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(_X||={});C={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}}});function O(X){let Z=Buffer.from(X,"utf8");return qX.script.compile([qX.opcodes.OP_RETURN,Z])}var sX,qX,RZ=1000,WX=10,aX=10,EZ=41,VZ=107,LX,jX,i,s=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new sX.SwapKitError("toolbox_utxo_invalid_address",{address:X})},c=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?s(X[0].address):"P2PKH",j=X.filter((Q)=>Q.value>=jX["type"in Q?Q.type:"P2PKH"]*Math.ceil(G)).reduce((Q,q)=>Q+b(q),0),$=Z?.reduce((Q,q)=>Q+a(q),0)||i[J];return WX+j+$},b=(X)=>{if("type"in X)return jX[X.type];if("address"in X&&X.address)return jX[s(X.address)];return EZ+VZ},a=(X,Z)=>{if(X?.script)return aX+X.script.length+(X.script.length>=74?2:1);if(Z)return i[Z];return i.P2PKH};var NX=y(()=>{sX=require("@swapkit/helpers"),qX=require("bitcoinjs-lib");((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(LX||={});jX={["P2PKH"]:148,["P2WPKH"]:68},i={["P2PKH"]:34,["P2WPKH"]:31}});function BX(X){switch(X){case w.Chain.Bitcoin:case w.Chain.BitcoinCash:return 550;case w.Chain.Dash:case w.Chain.Litecoin:return 5500;case w.Chain.Dogecoin:return 1e5;case w.Chain.Zcash:return 546;default:throw new w.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}function P({inputs:X,outputs:Z,feeRate:G=1,chain:J=w.Chain.Bitcoin,changeAddress:j=""}){let $=Math.ceil(G),Q=X[0]&&"address"in X[0]&&X[0].address?s(X[0].address):"P2PKH",q=X.filter((U)=>b(U)*$<=U.value),W=WX+Z.reduce((U,T)=>U+a(T,Q),0),D=Z.reduce((U,T)=>U+T.value,0),L=W*$,z=0,M=[];for(let U of q){let T=b(U),_=$*T;L+=_,z+=U.value,M.push(U);let I=L+D;if(z<I)continue;let E=z-I,V=$*a({address:"",value:0},Q);if(E>V){let bX=V+L,RX=z-(D+bX);if(RX>Math.max(b({})*$,BX(J)))return{fee:bX,inputs:M,outputs:Z.concat({address:j,value:RX})}}return{fee:L,inputs:M,outputs:Z}}return{fee:$*c({feeRate:$,inputs:X,outputs:Z})}}var w;var tX=y(()=>{w=require("@swapkit/helpers");NX()});var p=y(()=>{rX();iX();tX();NX()});function S(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function R(X){let Z=S(X);return FX(Z)&&yX(Z)==="mainnet"}function n(X){try{if(X.startsWith("z"))return console.warn("Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only."),!1;let Z=DX.networks.zcash;try{return DX.address.toOutputScript(X,Z),!0}catch{let G=eX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}}catch{return!1}}var DX,eX;var t=y(()=>{DX=require("@bitgo/utxo-lib"),eX=m(require("bs58check"));p()});function GZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:j,compiledMemo:$}){for(let Q of X){let q=!!Q.witnessUtxo&&!e.includes(G)&&{witnessUtxo:Q.witnessUtxo},W=e.includes(G)&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};J.addInput({hash:Q.hash,index:Q.index,...q,...W})}for(let Q of Z){let q="address"in Q&&Q.address?Q.address:j,W=Q.script;if(W&&!$)continue;let D=W?{script:$,value:0}:{address:q,value:Q.value};f.initEccLib(zX.default),J.addOutput(D)}return{inputs:X,psbt:J}}async function JZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j,fetchTxHex:$=!1}){let Q=X.chain,q=G?await O(G):null,W=await jZ({assetValue:X,fetchTxHex:$,memo:G,recipient:Z,sender:j}),{inputs:D,outputs:L}=P({...W,chain:Q,feeRate:J});if(!(D&&L))throw new B.SwapKitError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:j});let z=await A(),M=new f.Psbt({network:z(Q)});if(Q===B.Chain.Dogecoin)M.setMaximumFeeRate(650000000);let{psbt:U,inputs:T}=await GZ({chain:Q,compiledMemo:q,inputs:D,outputs:L,psbt:M,sender:j});return{inputs:T,psbt:U,utxos:W.inputs}}async function QZ(){let X=await A();return function Z({address:G,chain:J}){if(J===B.Chain.BitcoinCash)return R(G);if(J===B.Chain.Zcash)return n(G);try{return f.initEccLib(zX.default),f.address.toOutputScript(G,X(J)),!0}catch(j){return!1}}}async function SZ({chain:X,phrase:Z,derivationPath:G}){let J=(await XX(X))({derivationPath:G,phrase:Z});async function j(Q){return await Q.signAllInputs(J),Q}async function $(){return(await AX(X))(J)}return{getAddress:$,signTransaction:j}}async function g({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,j=B.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:B.updateDerivationPath(B.NetworkDerivationPath[X],{index:J})),$=G?await SZ({chain:X,derivationPath:j,phrase:G}):("signer"in Z)?Z.signer:void 0;function Q(){return Promise.resolve($?.getAddress())}let q=await AX(X),W=await QZ(),D=await XX(X);return{accumulative:P,broadcastTx:(L)=>F(X).broadcastTx(L),calculateTxSize:c,createKeysForPath:D,createTransaction:JZ,estimateMaxSendableAmount:gZ(X),estimateTransactionFee:xZ(X),getAddress:Q,getAddressFromKeys:q,getBalance:mX(X),getFeeRates:()=>ZX(X),getInputsOutputsFee:$Z,getPrivateKeyFromMnemonic:(L)=>{return D(L).toWIF()},transfer:mZ($),validateAddress:(L)=>W({address:L,chain:X})}}async function $Z({assetValue:X,feeOptionKey:Z=B.FeeOption.Fast,feeRate:G,memo:J,sender:j,recipient:$}){let Q=X.chain,q=await jZ({assetValue:X,memo:J,recipient:$,sender:j}),W=G?Math.floor(G):(await ZX(Q))[Z];return P({...q,chain:Q,feeRate:W})}function gZ(X){return async function Z({from:G,memo:J,feeRate:j,feeOptionKey:$=B.FeeOption.Fast,recipients:Q=1}){let q=await F(X).getAddressData(G),W=j?Math.ceil(j):(await ZX(X))[$],D=q?.utxo.map((T)=>({...T,hash:"",type:"P2PKH"})).filter((T)=>T.value>Math.max(BX(X),b(T)*W));if(!D?.length)return B.AssetValue.from({chain:X});let L=B.AssetValue.from({chain:X,value:D.reduce((T,_)=>T+_.value,0)}),z=typeof Q==="number"?Array.from({length:Q},()=>({address:G,value:0})):Q;if(J){let T=await O(J);z.push({address:G,script:T,value:0})}let U=c({feeRate:W,inputs:D,outputs:z})*W;return L.sub(U)}}function xZ(X){return async(Z)=>{let G=await $Z(Z);return B.AssetValue.from({chain:X,value:B.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function XX(X){let Z=await A();switch(X){case B.Chain.BitcoinCash:return function G({phrase:J,derivationPath:j=`${B.DerivationPath.BCH}/0`,wif:$}){let Q=Z(X);if($)return UX.ECPair.fromWIF($,Q);if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return UX.HDNode.fromSeedBuffer(Buffer.from(kX.mnemonicToSeedSync(J)),Q).derivePath(j).keyPair};case B.Chain.Bitcoin:case B.Chain.Dogecoin:case B.Chain.Litecoin:case B.Chain.Zcash:case B.Chain.Dash:return function G({phrase:J,wif:j,derivationPath:$}){if(!(j||J))throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let Q=ZZ.ECPairFactory(zX.default),q=Z(X);if(j)return Q.fromWIF(j,q);let W=kX.mnemonicToSeedSync(J),D=XZ.HDKey.fromMasterSeed(W,q).derive($);if(!D.privateKey)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return Q.fromPrivateKey(Buffer.from(D.privateKey),{network:q})};default:throw new B.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function AX(X){let Z=await A();return function G(J){if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let j=e.includes(X)?f.payments.p2pkh:f.payments.p2wpkh,{address:$}=j({network:Z(X),pubkey:J.publicKey});if(!$)throw new B.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return $}}function mZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:j,feeRate:$,assetValue:Q}){let q=await X?.getAddress(),W=Q.chain;if(!(X&&q))throw new B.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new B.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let D=$||(await ZX(W))[j||B.FeeOption.Fast],{psbt:L}=await JZ({assetValue:Q,feeRate:D,memo:G,recipient:J,sender:q}),z=await X.signTransaction(L);return z.finalizeAllInputs(),F(W).broadcastTx(z.extractTransaction().toHex())}}async function ZX(X){let Z=await F(X).getSuggestedTxFee();return{[B.FeeOption.Average]:Z,[B.FeeOption.Fast]:B.applyFeeMultiplier(Z,B.FeeOption.Fast),[B.FeeOption.Fastest]:B.applyFeeMultiplier(Z,B.FeeOption.Fastest)}}async function jZ({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:j=!1}){let $=X.chain,Q=(await ZX($))[B.FeeOption.Fastest],q=j||e.includes($),W=X.getBaseValue("number"),D=Math.ceil(W+Q*5000);return{inputs:await F($).getUtxos({address:J,fetchTxHex:q,targetValue:D}),outputs:[{address:Z,value:W},...G?[{address:"",script:await O(G),value:0}]:[]]}}var zX,UX,XZ,kX,B,f,ZZ,e;var GX=y(()=>{zX=m(require("@bitcoinerlab/secp256k1")),UX=require("@psf/bitcoincashjs-lib"),XZ=require("@scure/bip32"),kX=require("@scure/bip39"),B=require("@swapkit/helpers"),f=require("bitcoinjs-lib"),ZZ=require("ecpair");TX();p();t();e=[B.Chain.Dash,B.Chain.Dogecoin]});function x(X){return S(d(X))}function lZ(X){function Z({builder:J,utxos:j}){return j.forEach(($,Q)=>{J.sign(Q,X,void 0,65,$.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(x(J))},signTransaction:Z}}async function OX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=v.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:v.updateDerivationPath(v.NetworkDerivationPath[N],{index:G})),j=Z?(await XX(N))({derivationPath:J,phrase:Z}):void 0,$=j?lZ(j):("signer"in X)?X.signer:void 0;function Q(){return Promise.resolve($?.getAddress())}let{getBalance:q,getFeeRates:W,broadcastTx:D,...L}=await g({chain:N});function z(M,U=!0){return q(S(d(M)))}return{...L,broadcastTx:D,buildTx:cZ,createTransaction:WZ,getAddress:Q,getAddressFromKeys:pZ,getBalance:z,getFeeRates:W,stripPrefix:S,stripToCashAddress:x,transfer:hZ({broadcastTx:D,getFeeRates:W,signer:$}),validateAddress:R}}async function WZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j}){if(!R(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let $=Math.ceil(X.getBaseValue("number")+J*7500),Q=await F(N).getUtxos({address:x(j),fetchTxHex:!0,targetValue:$}),q=G?await O(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:D,outputs:L}=P({chain:N,feeRate:J,inputs:Q,outputs:W});if(!(D&&L))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:j});let z=await A(),M=new o.TransactionBuilder(z(N));await Promise.all(D.map(async(U)=>{let T=await F(N).getRawTx(U.hash);M.addInput(o.Transaction.fromBuffer(Buffer.from(T,"hex")),U.index)}));for(let U of L){let T="address"in U&&U.address?U.address:h(j),_=await A(),I=o.address.toOutputScript(h(T),_(N));M.addOutput(I,U.value)}if(q)M.addOutput(q,0);return{builder:M,utxos:D}}function hZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:j,assetValue:$,feeOptionKey:Q=v.FeeOption.Fast,...q}){let W=await G?.getAddress();if(!(G&&W))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!j)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let D=q.feeRate||(await Z())[Q],{builder:L,utxos:z}=await WZ({...q,assetValue:$,feeRate:D,recipient:j,sender:W}),U=(await G.signTransaction({builder:L,utxos:z})).toHex();return X(U)}}async function cZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:j,setSigHashType:$}){let Q=d(Z);if(!R(Q))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Q});let q=Math.ceil(X.getBaseValue("number")+J*7500),W=await F(N).getUtxos({address:x(j),fetchTxHex:!1,targetValue:q}),D=Number(J.toFixed(0)),L=G?await O(G):null,z=[];if(z.push({address:h(Z),value:X.getBaseValue("number")}),L)z.push({script:L,value:0});let{inputs:M,outputs:U}=P({chain:N,feeRate:D,inputs:W,outputs:z});if(!(M&&U))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:j});let T=await A(),_=new qZ.Psbt({network:T(N)});for(let{hash:I,index:E,witnessUtxo:V}of M)_.addInput({hash:I,index:E,sighashType:$?65:void 0,witnessUtxo:V});for(let I of U){let E="address"in I&&I.address?I.address:h(j),V=I.script?L?{script:L,value:0}:void 0:{address:E,value:I.value};if(V)_.addOutput(V)}return{inputs:M,psbt:_,utxos:W}}function pZ(X){let Z=X.getAddress(0);return x(Z)}var o,v,qZ,N;var YX=y(()=>{o=require("@psf/bitcoincashjs-lib"),v=require("@swapkit/helpers"),qZ=require("bitcoinjs-lib");p();GX();t();N=v.Chain.BitcoinCash});function DZ(){return k.networks.zcash}function zZ(){return{bech32:void 0,bip32:{private:76066276,public:76067358},messagePrefix:`\x18ZCash Signed Message:
|
|
2
|
+
`,pubKeyHash:28,scriptHash:28,wif:128}}function nZ({phrase:X,derivationPath:Z}){let G=PX.mnemonicToSeedSync(X),j=wX.HDKey.fromMasterSeed(G).derive(Z);if(!j.privateKey)throw new H.SwapKitError("toolbox_utxo_invalid_params");let $=zZ(),Q=k.ECPair.fromPrivateKey(Buffer.from(j.privateKey),{network:$}),q=k.crypto.hash160(Q.publicKey),{isStagenet:W}=H.SKConfig.get("envs"),D=W?Buffer.from([29,37]):Buffer.from([28,184]),L=Buffer.concat([D,q]),z=BZ.default.encode(L);return{getAddress:()=>Promise.resolve(z),signTransaction:(M)=>{let U=M.signAllInputs(Q);return Promise.resolve(U)}}}function oZ({inputs:X,outputs:Z,psbt:G,sender:J,compiledMemo:j}){for(let $ of X){let Q=!!$.witnessUtxo&&{witnessUtxo:{...$.witnessUtxo,value:BigInt($.value)}},q=!$.witnessUtxo&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};G.addInput({hash:$.hash,index:$.index,...Q,...q})}for(let $ of Z){let Q="address"in $&&$.address?$.address:J,q=$.script;if(q&&!j)continue;let W=q?{script:j,value:0n}:{script:k.address.toOutputScript(Q,DZ()),value:BigInt($.value)};G.addOutput(W)}return{inputs:X,psbt:G}}async function LZ(X){let{assetValue:Z,recipient:G,memo:J,feeRate:j,sender:$,fetchTxHex:Q}=X,q=J?O(J):null,W=await F(H.Chain.Zcash).getUtxos({address:$,fetchTxHex:Q!==!1}),D=[{address:G,value:Number(Z.getBaseValue("string"))},...q?[{script:q,value:0}]:[]],{inputs:L,outputs:z}=P({chain:H.Chain.Zcash,changeAddress:$,feeRate:j,inputs:W,outputs:D});if(!(L&&z))throw new H.SwapKitError("toolbox_utxo_insufficient_balance",{assetValue:Z,sender:$});let M=k.bitgo.createPsbtForNetwork({network:DZ()},{version:455});M.setVersion(4,!0);let U=Buffer.concat([Buffer.of(252),Buffer.of(5),Buffer.from("BITGO"),Buffer.of(0)]),T=3370586197,_=Buffer.allocUnsafe(4);_.writeUInt32LE(T>>>0,0),M.addUnknownKeyValToGlobal({key:U,value:_});let{psbt:I,inputs:E}=await oZ({compiledMemo:q,inputs:L,outputs:z,psbt:M,sender:$});return{inputs:E,outputs:z,psbt:I}}async function fX(X){let Z=await u.match(X).with({signer:u.P.not(u.P.nullish)},({signer:Q})=>Promise.resolve(Q)).with({phrase:u.P.string},({phrase:Q,derivationPath:q,index:W=0})=>{let D=q||H.NetworkDerivationPath[H.Chain.Zcash]||[44,133,0,0,0],L=H.updateDerivationPath(D,{index:W}),z=H.derivationPathToString(L);return nZ({derivationPath:z,phrase:Q})}).otherwise(()=>Promise.resolve(void 0)),G=await g({chain:H.Chain.Zcash,signer:Z});async function J({recipient:Q,assetValue:q,feeOptionKey:W=H.FeeOption.Fast,...D}){let L=await Z?.getAddress();if(!(Z&&L))throw new H.SwapKitError("toolbox_utxo_no_signer");let z=D.feeRate||(await G.getFeeRates())[W],{psbt:M}=await LZ({...D,assetValue:q,feeRate:z,recipient:Q,sender:L}),U=await Z.signTransaction(M);return U.finalizeAllInputs(),G.broadcastTx(U.extractTransaction().toHex())}function j({phrase:Q,derivationPath:q="m/44'/133'/0'/0/0"}){let W=PX.mnemonicToSeedSync(Q),L=wX.HDKey.fromMasterSeed(W).derive(q);if(!L.privateKey)throw new H.SwapKitError("toolbox_utxo_invalid_params");let z=zZ();return k.ECPair.fromPrivateKey(Buffer.from(L.privateKey),{network:z})}function $({phrase:Q,derivationPath:q="m/44'/133'/0'/0/0"}){return j({derivationPath:q,phrase:Q}).toWIF()}return{...G,createKeysForPath:j,createTransaction:LZ,getPrivateKeyFromMnemonic:$,transfer:J,validateAddress:n}}var k,wX,PX,H,BZ,u;var KX=y(()=>{k=require("@bitgo/utxo-lib"),wX=require("@scure/bip32"),PX=require("@scure/bip39"),H=require("@swapkit/helpers"),BZ=m(require("bs58check")),u=require("ts-pattern");p();GX();t()});async function uZ(X,Z){switch(X){case K.Chain.BitcoinCash:return await OX(Z||{});case K.Chain.Zcash:return await fX(Z);case K.Chain.Bitcoin:case K.Chain.Dogecoin:case K.Chain.Litecoin:case K.Chain.Dash:return await g({chain:X,...Z});default:throw new K.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}var K;var UZ=y(()=>{K=require("@swapkit/helpers");YX();GX();KX();YX();t()});var dZ={};HZ(dZ,{validateZcashAddress:()=>n,toLegacyAddress:()=>h,toCashAddress:()=>d,stripToCashAddress:()=>x,stripPrefix:()=>S,nonSegwitChains:()=>e,isValidAddress:()=>FX,getUtxoToolbox:()=>uZ,getUtxoNetwork:()=>A,getUtxoApi:()=>F,getUTXOAddressValidator:()=>QZ,getScriptTypeForAddress:()=>s,getOutputSize:()=>a,getInputSize:()=>b,getDustThreshold:()=>BX,getCreateKeysForPath:()=>XX,detectAddressNetwork:()=>yX,createZcashToolbox:()=>fX,createUTXOToolbox:()=>g,createCustomUtxoApi:()=>wZ,createBCHToolbox:()=>OX,compileMemo:()=>O,calculateTxSize:()=>c,bchValidateAddress:()=>R,addressFromKeysGetter:()=>AX,addInputsAndOutputs:()=>GZ,accumulative:()=>P,UtxoNetwork:()=>_X,UTXOScriptType:()=>LX,TX_OVERHEAD:()=>WX,OutputSizes:()=>i,OP_RETURN_OVERHEAD:()=>aX,MIN_TX_FEE:()=>RZ,InputSizes:()=>jX});module.exports=CZ(dZ);var iZ=y(()=>{p();UZ();YX();GX();KX()});iZ();
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=D2EB5343F9747AC264756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|