@swapkit/toolboxes 4.0.0-beta.50 → 4.0.0-beta.52
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 +10 -6
- package/dist/src/cosmos/index.js +2 -2
- package/dist/src/cosmos/index.js.map +10 -6
- package/dist/src/evm/index.cjs +2 -2
- package/dist/src/evm/index.cjs.map +10 -8
- package/dist/src/evm/index.js +2 -2
- package/dist/src/evm/index.js.map +10 -8
- package/dist/src/index.cjs +4 -2
- package/dist/src/index.cjs.map +54 -4
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +54 -4
- package/dist/src/near/index.cjs +2 -2
- package/dist/src/near/index.cjs.map +7 -5
- package/dist/src/near/index.js +2 -2
- package/dist/src/near/index.js.map +7 -5
- package/dist/src/radix/index.cjs +2 -2
- package/dist/src/radix/index.cjs.map +2 -2
- package/dist/src/radix/index.js +2 -2
- package/dist/src/radix/index.js.map +2 -2
- package/dist/src/ripple/index.cjs +2 -2
- package/dist/src/ripple/index.cjs.map +2 -2
- package/dist/src/ripple/index.js +2 -2
- package/dist/src/ripple/index.js.map +2 -2
- package/dist/src/solana/index.cjs +2 -2
- package/dist/src/solana/index.cjs.map +5 -4
- package/dist/src/solana/index.js +2 -2
- package/dist/src/solana/index.js.map +5 -4
- package/dist/src/substrate/index.cjs +2 -2
- package/dist/src/substrate/index.cjs.map +6 -5
- package/dist/src/substrate/index.js +2 -2
- package/dist/src/substrate/index.js.map +6 -5
- package/dist/src/tron/index.cjs +2 -2
- package/dist/src/tron/index.cjs.map +6 -5
- package/dist/src/tron/index.js +2 -2
- package/dist/src/tron/index.js.map +6 -5
- package/dist/src/utxo/index.cjs +4 -4
- package/dist/src/utxo/index.cjs.map +10 -7
- package/dist/src/utxo/index.js +4 -4
- package/dist/src/utxo/index.js.map +10 -7
- package/{src/cosmos/index.ts → dist/types/cosmos/index.d.ts} +1 -0
- package/dist/types/cosmos/index.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts +5 -0
- package/dist/types/cosmos/thorchainUtils/addressFormat.d.ts.map +1 -0
- package/{src/cosmos/thorchainUtils/index.ts → dist/types/cosmos/thorchainUtils/index.d.ts} +1 -0
- package/dist/types/cosmos/thorchainUtils/index.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/messages.d.ts +208 -0
- package/dist/types/cosmos/thorchainUtils/messages.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/registry.d.ts +4 -0
- package/dist/types/cosmos/thorchainUtils/registry.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/types/MsgCompiled.d.ts +2 -0
- package/dist/types/cosmos/thorchainUtils/types/MsgCompiled.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/types/client-types.d.ts +66 -0
- package/dist/types/cosmos/thorchainUtils/types/client-types.d.ts.map +1 -0
- package/dist/types/cosmos/thorchainUtils/types/index.d.ts +2 -0
- package/dist/types/cosmos/thorchainUtils/types/index.d.ts.map +1 -0
- package/dist/types/cosmos/toolbox/cosmos.d.ts +93 -0
- package/dist/types/cosmos/toolbox/cosmos.d.ts.map +1 -0
- package/dist/types/cosmos/toolbox/index.d.ts +14 -0
- package/dist/types/cosmos/toolbox/index.d.ts.map +1 -0
- package/dist/types/cosmos/toolbox/thorchain.d.ts +158 -0
- package/dist/types/cosmos/toolbox/thorchain.d.ts.map +1 -0
- package/{src/cosmos/types.ts → dist/types/cosmos/types.d.ts} +24 -29
- package/dist/types/cosmos/types.d.ts.map +1 -0
- package/dist/types/cosmos/util.d.ts +68 -0
- package/dist/types/cosmos/util.d.ts.map +1 -0
- package/dist/types/evm/api.d.ts +8 -0
- package/dist/types/evm/api.d.ts.map +1 -0
- package/dist/types/evm/contracts/eth/multicall.d.ts +36 -0
- package/dist/types/evm/contracts/eth/multicall.d.ts.map +1 -0
- package/dist/types/evm/contracts/op/gasOracle.d.ts +40 -0
- package/dist/types/evm/contracts/op/gasOracle.d.ts.map +1 -0
- package/dist/types/evm/helpers.d.ts +20 -0
- package/dist/types/evm/helpers.d.ts.map +1 -0
- package/{src/evm/index.ts → dist/types/evm/index.d.ts} +1 -0
- package/dist/types/evm/index.d.ts.map +1 -0
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts +82 -0
- package/dist/types/evm/toolbox/baseEVMToolbox.d.ts.map +1 -0
- package/dist/types/evm/toolbox/evm.d.ts +367 -0
- package/dist/types/evm/toolbox/evm.d.ts.map +1 -0
- package/dist/types/evm/toolbox/index.d.ts +89 -0
- package/dist/types/evm/toolbox/index.d.ts.map +1 -0
- package/dist/types/evm/toolbox/op.d.ts +62 -0
- package/dist/types/evm/toolbox/op.d.ts.map +1 -0
- package/dist/types/evm/types.d.ts +98 -0
- package/dist/types/evm/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/near/helpers/core.d.ts +15 -0
- package/dist/types/near/helpers/core.d.ts.map +1 -0
- package/dist/types/near/helpers/gasEstimation.d.ts +41 -0
- package/dist/types/near/helpers/gasEstimation.d.ts.map +1 -0
- package/dist/types/near/helpers/nep141.d.ts +72 -0
- package/dist/types/near/helpers/nep141.d.ts.map +1 -0
- package/dist/types/near/index.d.ts +10 -0
- package/dist/types/near/index.d.ts.map +1 -0
- package/dist/types/near/toolbox.d.ts +4 -0
- package/dist/types/near/toolbox.d.ts.map +1 -0
- package/dist/types/near/types/contract.d.ts +38 -0
- package/dist/types/near/types/contract.d.ts.map +1 -0
- package/dist/types/near/types/nep141.d.ts +56 -0
- package/dist/types/near/types/nep141.d.ts.map +1 -0
- package/dist/types/near/types/toolbox.d.ts +57 -0
- package/dist/types/near/types/toolbox.d.ts.map +1 -0
- package/dist/types/near/types.d.ts +44 -0
- package/dist/types/near/types.d.ts.map +1 -0
- package/dist/types/radix/index.d.ts +14 -0
- package/dist/types/radix/index.d.ts.map +1 -0
- package/dist/types/ripple/index.d.ts +43 -0
- package/dist/types/ripple/index.d.ts.map +1 -0
- package/dist/types/solana/index.d.ts +37 -0
- package/dist/types/solana/index.d.ts.map +1 -0
- package/dist/types/solana/toolbox.d.ts +41 -0
- package/dist/types/solana/toolbox.d.ts.map +1 -0
- package/dist/types/substrate/balance.d.ts +17 -0
- package/dist/types/substrate/balance.d.ts.map +1 -0
- package/{src/substrate/index.ts → dist/types/substrate/index.d.ts} +1 -0
- package/dist/types/substrate/index.d.ts.map +1 -0
- package/dist/types/substrate/substrate.d.ts +148 -0
- package/dist/types/substrate/substrate.d.ts.map +1 -0
- package/dist/types/substrate/types.d.ts +100 -0
- package/dist/types/substrate/types.d.ts.map +1 -0
- package/dist/types/tron/helpers/trc20.abi.d.ts +156 -0
- package/dist/types/tron/helpers/trc20.abi.d.ts.map +1 -0
- package/dist/types/tron/helpers/trongrid.d.ts +8 -0
- package/dist/types/tron/helpers/trongrid.d.ts.map +1 -0
- package/dist/types/tron/index.d.ts +6 -0
- package/dist/types/tron/index.d.ts.map +1 -0
- package/dist/types/tron/toolbox.d.ts +26 -0
- package/dist/types/tron/toolbox.d.ts.map +1 -0
- package/dist/types/tron/types.d.ts +101 -0
- package/dist/types/tron/types.d.ts.map +1 -0
- package/dist/types/types.d.ts +18 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils.d.ts +4 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utxo/helpers/api.d.ts +133 -0
- package/dist/types/utxo/helpers/api.d.ts.map +1 -0
- package/dist/types/utxo/helpers/bchaddrjs.d.ts +10 -0
- package/dist/types/utxo/helpers/bchaddrjs.d.ts.map +1 -0
- package/dist/types/utxo/helpers/coinselect.d.ts +16 -0
- package/dist/types/utxo/helpers/coinselect.d.ts.map +1 -0
- package/{src/utxo/helpers/index.ts → dist/types/utxo/helpers/index.d.ts} +1 -0
- package/dist/types/utxo/helpers/index.d.ts.map +1 -0
- package/dist/types/utxo/helpers/txSize.d.ts +21 -0
- package/dist/types/utxo/helpers/txSize.d.ts.map +1 -0
- package/{src/utxo/index.ts → dist/types/utxo/index.d.ts} +1 -0
- package/dist/types/utxo/index.d.ts.map +1 -0
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts +104 -0
- package/dist/types/utxo/toolbox/bitcoinCash.d.ts.map +1 -0
- package/dist/types/utxo/toolbox/index.d.ts +50 -0
- package/dist/types/utxo/toolbox/index.d.ts.map +1 -0
- package/dist/types/utxo/toolbox/utxo.d.ts +102 -0
- package/dist/types/utxo/toolbox/utxo.d.ts.map +1 -0
- package/dist/types/utxo/toolbox/zcash.d.ts +83 -0
- package/dist/types/utxo/toolbox/zcash.d.ts.map +1 -0
- package/dist/types/utxo/types.d.ts +46 -0
- package/dist/types/utxo/types.d.ts.map +1 -0
- package/package.json +15 -18
- package/dist/chunk-0h4xdrwz.js +0 -5
- package/dist/chunk-0h4xdrwz.js.map +0 -10
- package/dist/chunk-4yap1fvd.js +0 -4
- package/dist/chunk-4yap1fvd.js.map +0 -10
- package/dist/chunk-9bqegm61.js +0 -4
- package/dist/chunk-9bqegm61.js.map +0 -10
- package/dist/chunk-fazw0jvt.js +0 -4
- package/dist/chunk-fazw0jvt.js.map +0 -9
- package/dist/chunk-fjfxga2v.js +0 -4
- package/dist/chunk-fjfxga2v.js.map +0 -10
- package/dist/chunk-s47y8512.js +0 -5
- package/dist/chunk-s47y8512.js.map +0 -9
- package/dist/chunk-vtd17cje.js +0 -4
- package/dist/chunk-vtd17cje.js.map +0 -10
- package/dist/chunk-zcdeg6h9.js +0 -5
- package/dist/chunk-zcdeg6h9.js.map +0 -10
- package/src/cosmos/thorchainUtils/addressFormat.ts +0 -26
- package/src/cosmos/thorchainUtils/messages.ts +0 -262
- package/src/cosmos/thorchainUtils/registry.ts +0 -44
- package/src/cosmos/thorchainUtils/types/MsgCompiled.ts +0 -2800
- package/src/cosmos/thorchainUtils/types/client-types.ts +0 -73
- package/src/cosmos/thorchainUtils/types/index.ts +0 -1
- package/src/cosmos/toolbox/cosmos.ts +0 -375
- package/src/cosmos/toolbox/index.ts +0 -33
- package/src/cosmos/toolbox/thorchain.ts +0 -313
- package/src/cosmos/util.ts +0 -266
- package/src/evm/__tests__/address-validation.test.ts +0 -86
- package/src/evm/__tests__/ethereum.test.ts +0 -141
- package/src/evm/api.ts +0 -21
- package/src/evm/contracts/eth/multicall.ts +0 -165
- package/src/evm/contracts/op/gasOracle.ts +0 -151
- package/src/evm/helpers.ts +0 -194
- package/src/evm/toolbox/baseEVMToolbox.ts +0 -762
- package/src/evm/toolbox/evm.ts +0 -66
- package/src/evm/toolbox/index.ts +0 -52
- package/src/evm/toolbox/op.ts +0 -131
- package/src/evm/types.ts +0 -146
- package/src/index.ts +0 -263
- package/src/near/__tests__/core.test.ts +0 -80
- package/src/near/helpers/contractFactory.ts +0 -22
- package/src/near/helpers/core.ts +0 -91
- package/src/near/helpers/gasEstimation.ts +0 -110
- package/src/near/helpers/index.ts +0 -5
- package/src/near/helpers/nep141.ts +0 -110
- package/src/near/index.ts +0 -24
- package/src/near/toolbox.ts +0 -509
- package/src/near/types/contract.ts +0 -48
- package/src/near/types/nep141.ts +0 -66
- package/src/near/types.ts +0 -57
- package/src/radix/index.ts +0 -156
- package/src/ripple/index.ts +0 -192
- package/src/solana/index.ts +0 -55
- package/src/solana/toolbox.ts +0 -433
- package/src/substrate/balance.ts +0 -92
- package/src/substrate/substrate.ts +0 -320
- package/src/substrate/types.ts +0 -120
- package/src/tron/__tests__/toolbox.test.ts +0 -147
- package/src/tron/helpers/trc20.abi.ts +0 -107
- package/src/tron/helpers/trongrid.ts +0 -54
- package/src/tron/index.ts +0 -17
- package/src/tron/toolbox.ts +0 -650
- package/src/tron/types.ts +0 -120
- package/src/utils.ts +0 -27
- package/src/utxo/__tests__/zcash-integration.test.ts +0 -114
- package/src/utxo/helpers/api.ts +0 -560
- package/src/utxo/helpers/bchaddrjs.ts +0 -183
- package/src/utxo/helpers/coinselect.ts +0 -98
- package/src/utxo/helpers/txSize.ts +0 -104
- package/src/utxo/toolbox/bitcoinCash.ts +0 -320
- package/src/utxo/toolbox/index.ts +0 -90
- package/src/utxo/toolbox/utxo.ts +0 -525
- package/src/utxo/toolbox/zcash.ts +0 -208
- package/src/utxo/types.ts +0 -57
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/tron/
|
|
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
|
-
"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 { trc20ABI } from \"./helpers/trc20.abi.js\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid.js\";\nimport type {\n ApproveParams,\n ApprovedParams,\n IsApprovedParams,\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\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 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 (options: TronToolboxOptions = {}) => {\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: `TRX.${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: `TRX.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 }: ApprovedParams) => {\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 ({ assetAddress, spenderAddress, from, amount }: IsApprovedParams) => {\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 }: ApproveParams) => {\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",
|
|
6
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",
|
|
7
|
-
"import { SwapKitError } from \"@swapkit/helpers\";\nimport
|
|
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 {\n balance: account.balance,\n trc20: account.trc20 || [],\n };\n } catch (error) {\n throw new SwapKitError(\"toolbox_tron_trongrid_api_error\", {\n message: error instanceof Error ? error.message : \"Unknown error\",\n address,\n });\n }\n}\n",
|
|
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 ApproveParams,\n ApprovedParams,\n IsApprovedParams,\n TronCreateTransactionParams,\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<any>;\n signTransaction: (transaction: any) => Promise<any>;\n broadcastTransaction: (signedTransaction: any) => Promise<string>;\n approve: (params: ApproveParams) => Promise<string>;\n isApproved: (params: IsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: ApprovedParams) => 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: `TRX.${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: `TRX.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 }: ApprovedParams) => {\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 ({ assetAddress, spenderAddress, from, amount }: IsApprovedParams) => {\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 }: ApproveParams) => {\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 TronSigner,\n TronToolboxOptions,\n TronTransferParams,\n TronContract,\n TronTransaction,\n TronSignedTransaction,\n TronCreateTransactionParams,\n ApproveParams,\n ApprovedParams,\n IsApprovedParams,\n} from \"./types\";\nexport { trc20ABI } from \"./helpers/trc20.abi\";\n\nimport type { createTronToolbox } from \"./toolbox\";\nexport type TronWallet = Awaited<ReturnType<typeof createTronToolbox>>;\n"
|
|
8
9
|
],
|
|
9
|
-
"mappings": "
|
|
10
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "35F0B6920861785D64756E2164756E21",
|
|
11
12
|
"names": []
|
|
12
13
|
}
|
package/dist/src/utxo/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
`,bech32:"zc",bip32:{public:76067358,private:76066276},pubKeyHash:28,scriptHash:28,wif:128},
|
|
3
|
-
`,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function F(){return function X(Z){switch(Z){case U.Chain.Bitcoin:return FX.networks.bitcoin;case U.Chain.BitcoinCash:return S.default.bitcoincash.main.toBitcoinJS();case U.Chain.Dash:return S.default.dash.main.toBitcoinJS();case U.Chain.Litecoin:return S.default.litecoin.main.toBitcoinJS();case U.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=S.default.dogecoin.test;return J.versions.bip32=G,S.default.dogecoin.main.toBitcoinJS()}case U.Chain.Zcash:{let{isStagenet:G}=U.SKConfig.get("envs");return G?XZ:eX}default:throw new U.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var LX=require("@swapkit/helpers"),WX=x(require("bs58check")),jX=x(require("cashaddrjs"));var BX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(BX||={});var H={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function DX(X){try{return a(X),!0}catch(Z){return!1}}function UX(X){return a(X)?.network}function m(X){let Z=a(X);if(Z?.format==="legacy")return X;return JZ(Z)}function p(X){let Z=a(X);return QZ(Z)}function a(X){try{let Z=ZZ(X);if(Z)return Z}catch(Z){}try{let Z=GZ(X);if(Z)return Z}catch(Z){}throw new LX.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function ZZ(X){try{let Z=WX.default.decode(X);if(Z.length!==21)throw new LX.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case H.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case H.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case H.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case H.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case H.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case H.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:return}}catch(Z){return}}function GZ(X){if(X.indexOf(":")!==-1)try{return PX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return PX(`${G}:${X}`)}catch(J){}}return}function PX(X){try{let{hash:Z,prefix:G,type:J}=jX.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 JZ(X){let Z=H.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),WX.default.encode(G)}function QZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return jX.default.encode(Z,G,J)}var y=require("@swapkit/helpers");var s=(X)=>{switch(X){case y.Chain.Bitcoin:case y.Chain.BitcoinCash:return 550;case y.Chain.Dash:case y.Chain.Litecoin:return 5500;case y.Chain.Dogecoin:return 1e5;case y.Chain.Zcash:return 546;default:throw new y.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},K=({inputs:X,outputs:Z,feeRate:G=1,chain:J=y.Chain.Bitcoin})=>{let Q=Math.ceil(G),q=X[0]&&"address"in X[0]&&X[0].address?o(X[0].address):"P2PKH",$=X.filter((z)=>k(z)*Q<=z.value),L=t+Z.reduce((z,Y)=>z+u(Y,q),0),W=Z.reduce((z,Y)=>z+Y.value,0),B=L*Q,D=0,M=[];for(let z of $){let Y=k(z),C=Q*Y;B+=C,D+=z.value,M.push(z);let I=B+W;if(D<I)continue;let _=D-I,f=Q*u({address:"",value:0},q);if(_>f){let R=f+B,TX=D-(W+R);if(TX>Math.max(k({})*Q,s(J)))return{inputs:M,outputs:Z.concat({value:TX,address:""}),fee:R}}return{inputs:M,outputs:Z,fee:B}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};var AX=require("@swapkit/helpers"),ZX=require("bitcoinjs-lib"),$Z=1000,t=10,kX=10,qZ=41,LZ=107;function w(X){let Z=Buffer.from(X,"utf8");return ZX.script.compile([ZX.opcodes.OP_RETURN,Z])}var e;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(e||={});var XX={["P2PKH"]:148,["P2WPKH"]:68},n={["P2PKH"]:34,["P2WPKH"]:31},o=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new AX.SwapKitError("toolbox_utxo_invalid_address",{address:X})},g=({inputs:X,outputs:Z,feeRate:G})=>{let J=X[0]&&"address"in X[0]&&X[0].address?o(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=XX["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,L)=>$+k(L),0),q=Z?.reduce(($,L)=>$+u(L),0)||n[J];return t+Q+q},k=(X)=>{if("type"in X)return XX[X.type];if("address"in X&&X.address)return XX[o(X.address)];return qZ+LZ},u=(X,Z)=>{if(X?.script)return kX+X.script.length+(X.script.length>=74?2:1);if(Z)return n[Z];return n.P2PKH};var j=require("@swapkit/helpers"),P=require("bitcoinjs-lib"),SX=require("ecpair");var JX=x(require("@bitcoinerlab/secp256k1")),QX=require("@psf/bitcoincashjs-lib"),xX=require("@scure/bip32"),YX=require("@scure/bip39");var KX=x(require("@bitcoinerlab/secp256k1")),wX=require("@scure/bip32"),RX=require("@scure/bip39"),T=require("@swapkit/helpers"),bX=require("bitcoinjs-lib/src/crypto"),zX=x(require("bs58check")),EX=require("ecpair"),l=require("ts-pattern");var WZ=T.Chain.Zcash,VX=F()(WZ);function jZ(X,Z=!1){let G=bX.hash160(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return zX.default.encode(Q)}function GX(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=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=T.SKConfig.get("envs");if(Z&&J||G&&!J)return!1;return BZ(X,VX)}catch{return!1}}function BZ(X,Z){try{let G=zX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var DZ=EX.ECPairFactory(KX.default);async function UZ({phrase:X,derivationPathString:Z}){let G=RX.mnemonicToSeedSync(X),Q=wX.HDKey.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let q=DZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:VX}),{isStagenet:$}=T.SKConfig.get("envs"),L=jZ(q.publicKey,$);return{getAddress(){return Promise.resolve(L)},signTransaction(W){for(let B=0;B<W.inputCount;B++)W.signInput(B,q);return Promise.resolve(W)}}}async function MX(X){let Z=await l.match(X).with({signer:l.P.not(l.P.nullish)},({signer:L})=>Promise.resolve(L)).with({phrase:l.P.string},({phrase:L,derivationPath:W,index:B=0})=>{let D=W||T.NetworkDerivationPath[T.Chain.Zcash]||[44,133,0,0,0],M=T.updateDerivationPath(D,{index:B}),z=T.derivationPathToString(M);return UZ({phrase:L,derivationPathString:z})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await b({chain:T.Chain.Zcash,signer:Z});function q(L){return L.getAddress()}async function $({recipient:L,assetValue:W,feeOptionKey:B=T.FeeOption.Fast,...D}){let M=await Z?.getAddress();if(!(Z&&M))throw new T.SwapKitError("toolbox_utxo_no_signer");let z=D.feeRate||(await G())[B],Y={...D,assetValue:W,feeRate:z,recipient:L,sender:M},{psbt:C}=await Q.createTransaction(Y),I=await Z.signTransaction(C);I.finalizeAllInputs();let _=I.extractTransaction().toHex();return J(_)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:q,validateAddress:GX}}var d=[j.Chain.Dash,j.Chain.Dogecoin];function zZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:q}){for(let $ of X){let L=!!$.witnessUtxo&&!d.includes(G)&&{witnessUtxo:$.witnessUtxo},W=d.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...L,...W})}for(let $ of Z){let L="address"in $&&$.address?$.address:Q,W=$.script;if(W&&!q)continue;let B=W?{script:q,value:0}:{address:L,value:$.value};P.initEccLib(JX.default),J.addOutput(B)}return{psbt:J,inputs:X}}async function mX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:q=!1}){let $=X.chain,L=G?await w(G):null,W=await hX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:q}),{inputs:B,outputs:D}=K({...W,feeRate:J,chain:$});if(!(B&&D))throw new j.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await F(),z=new P.Psbt({network:M($)});if($===j.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:Y,inputs:C}=await zZ({inputs:B,outputs:D,chain:$,psbt:z,sender:Q,compiledMemo:L});return{psbt:Y,utxos:W.inputs,inputs:C}}async function gX(){let X=await F();return function Z({address:G,chain:J}){if(J===j.Chain.BitcoinCash)return E(G);if(J===j.Chain.Zcash)return GX(G);try{return P.initEccLib(JX.default),P.address.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function MZ({chain:X,phrase:Z,derivationPath:G}){let J=(await r(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function q(){return(await HX(X))(J)}return{getAddress:q,signTransaction:Q}}async function b({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=j.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:j.updateDerivationPath(j.NetworkDerivationPath[X],{index:J})),q=G?await MZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let L=await HX(X),W=await gX(),B=await r(X);return{accumulative:K,calculateTxSize:g,getAddressFromKeys:L,getAddress:$,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>N(X).broadcastTx(D),createTransaction:mX,createKeysForPath:B,getFeeRates:()=>i(X),getInputsOutputsFee:lX,transfer:CZ(q),getPrivateKeyFromMnemonic:(D)=>{return B(D).toWIF()},getBalance:fX(X),estimateTransactionFee:HZ(X),estimateMaxSendableAmount:YZ(X)}}async function lX({assetValue:X,feeOptionKey:Z=j.FeeOption.Fast,feeRate:G,memo:J,sender:Q,recipient:q}){let $=X.chain,L=await hX({assetValue:X,sender:Q,memo:J,recipient:q}),W=G?Math.floor(G):(await i($))[Z];return K({...L,feeRate:W,chain:$})}function YZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:q=j.FeeOption.Fast,recipients:$=1}){let L=await N(X).getAddressData(G),W=Q?Math.ceil(Q):(await i(X))[q],B=L?.utxo.map((C)=>({...C,type:"P2PKH",hash:""})).filter((C)=>C.value>Math.max(s(X),k(C)*W));if(!B?.length)return j.AssetValue.from({chain:X});let D=j.AssetValue.from({chain:X,value:B.reduce((C,I)=>C+I.value,0)}),M=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let C=await w(J);M.push({address:G,script:C,value:0})}let Y=g({inputs:B,outputs:M,feeRate:W})*W;return D.sub(Y)}}function HZ(X){return async(Z)=>{let G=await lX(Z);return j.AssetValue.from({chain:X,value:j.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function r(X){let Z=await F();switch(X){case j.Chain.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${j.DerivationPath.BCH}/0`,wif:q}){let $=Z(X);if(q)return QX.ECPair.fromWIF(q,$);if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return QX.HDNode.fromSeedBuffer(Buffer.from(YX.mnemonicToSeedSync(J)),$).derivePath(Q).keyPair};case j.Chain.Bitcoin:case j.Chain.Dogecoin:case j.Chain.Litecoin:case j.Chain.Zcash:case j.Chain.Dash:return function G({phrase:J,wif:Q,derivationPath:q}){if(!(Q||J))throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=SX.ECPairFactory(JX.default),L=Z(X);if(Q)return $.fromWIF(Q,L);let W=YX.mnemonicToSeedSync(J),B=xX.HDKey.fromMasterSeed(W,L).derive(q);if(!B.privateKey)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(B.privateKey),{network:L})};default:throw new j.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function HX(X){let Z=await F();return function G(J){if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=d.includes(X)?P.payments.p2pkh:P.payments.p2wpkh,{address:q}=Q({pubkey:J.publicKey,network:Z(X)});if(!q)throw new j.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return q}}function CZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:q,assetValue:$}){let L=await X?.getAddress(),W=$.chain;if(!(X&&L))throw new j.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=q||(await i(W))[Q||j.FeeOption.Fast],{psbt:D}=await mX({recipient:J,feeRate:B,sender:L,assetValue:$,memo:G}),M=await X.signTransaction(D);return M.finalizeAllInputs(),N(W).broadcastTx(M.extractTransaction().toHex())}}async function i(X){let Z=await N(X).getSuggestedTxFee();return{[j.FeeOption.Average]:Z,[j.FeeOption.Fast]:j.applyFeeMultiplier(Z,j.FeeOption.Fast),[j.FeeOption.Fastest]:j.applyFeeMultiplier(Z,j.FeeOption.Fastest)}}async function hX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let q=X.chain,$=(await i(q))[j.FeeOption.Fastest],L=Q||d.includes(q),W=X.getBaseValue("number"),B=Math.ceil(W+$*5000);return{inputs:await N(q).getUtxos({address:J,fetchTxHex:L,targetValue:B}),outputs:[{address:Z,value:W},...G?[{address:"",script:await w(G),value:0}]:[]]}}var O=v.Chain.BitcoinCash;function h(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let Z=h(X);return DX(Z)&&UX(Z)==="mainnet"}function V(X){return h(p(X))}async function TZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((q,$)=>{J.sign($,X,void 0,65,q.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:Z}}async function CX(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})),Q=Z?(await r(O))({phrase:Z,derivationPath:J}):void 0,q=Q?await TZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let{getBalance:L,getFeeRates:W,broadcastTx:B,...D}=await b({chain:O});function M(z,Y=!0){return L(h(p(z)))}return{...D,getAddress:$,broadcastTx:B,createTransaction:pX,buildTx:IZ,getAddressFromKeys:_Z,getBalance:M,getFeeRates:W,stripPrefix:h,stripToCashAddress:V,validateAddress:E,transfer:vZ({getFeeRates:W,broadcastTx:B,signer:q})}}async function pX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!E(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let q=Math.ceil(X.getBaseValue("number")+J*7500),$=await N(O).getUtxos({address:V(Q),fetchTxHex:!0,targetValue:q}),L=G?await w(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:B,outputs:D}=K({inputs:$,outputs:W,feeRate:J,chain:O});if(!(B&&D))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await F(),z=new c.TransactionBuilder(M(O));await Promise.all(B.map(async(Y)=>{let C=await N(O).getRawTx(Y.hash);z.addInput(c.Transaction.fromBuffer(Buffer.from(C,"hex")),Y.index)}));for(let Y of D){let C="address"in Y&&Y.address?Y.address:m(Q),I=await F(),_=c.address.toOutputScript(m(C),I(O));z.addOutput(_,Y.value)}if(L)z.addOutput(L,0);return{builder:z,utxos:B}}function vZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:q,feeOptionKey:$=v.FeeOption.Fast,...L}){let W=await G?.getAddress();if(!(G&&W))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!Q)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=L.feeRate||(await Z())[$],{builder:D,utxos:M}=await pX({...L,assetValue:q,feeRate:B,recipient:Q,sender:W}),Y=(await G.signTransaction({builder:D,utxos:M})).toHex();return X(Y)}}async function IZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,setSigHashType:q}){let $=p(Z);if(!E($))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:$});let L=Math.ceil(X.getBaseValue("number")+J*7500),W=await N(O).getUtxos({address:V(Q),fetchTxHex:!1,targetValue:L}),B=Number(J.toFixed(0)),D=G?await w(G):null,M=[];if(M.push({address:m(Z),value:X.getBaseValue("number")}),D)M.push({script:D,value:0});let{inputs:z,outputs:Y}=K({inputs:W,outputs:M,feeRate:B,chain:O});if(!(z&&Y))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let C=await F(),I=new cX.Psbt({network:C(O)});for(let{hash:_,index:f,witnessUtxo:R}of z)I.addInput({hash:_,index:f,witnessUtxo:R,sighashType:q?65:void 0});for(let _ of Y){let f="address"in _&&_.address?_.address:m(Q),R=_.script?D?{script:D,value:0}:void 0:{address:f,value:_.value};if(R)I.addOutput(R)}return{psbt:I,utxos:W,inputs:z}}function _Z(X){let Z=X.getAddress(0);return V(Z)}async function FZ(X,Z){switch(X){case A.Chain.BitcoinCash:return await CX(Z||{});case A.Chain.Zcash:return await MX(Z);case A.Chain.Bitcoin:case A.Chain.Dogecoin:case A.Chain.Litecoin:case A.Chain.Dash:return await b({chain:X,...Z});default:throw new A.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}
|
|
1
|
+
var WZ=Object.create;var{getPrototypeOf:jZ,defineProperty:o,getOwnPropertyNames:wX,getOwnPropertyDescriptor:BZ}=Object,KX=Object.prototype.hasOwnProperty;var x=(X,Z,G)=>{G=X!=null?WZ(jZ(X)):{};let J=Z||!X||!X.__esModule?o(G,"default",{value:X,enumerable:!0}):G;for(let Q of wX(X))if(!KX.call(J,Q))o(J,Q,{get:()=>X[Q],enumerable:!0});return J},kX=new WeakMap,DZ=(X)=>{var Z=kX.get(X),G;if(Z)return Z;if(Z=o({},"__esModule",{value:!0}),X&&typeof X==="object"||typeof X==="function")wX(X).map((J)=>!KX.call(Z,J)&&o(Z,J,{get:()=>X[J],enumerable:!(G=BZ(X,J))||G.enumerable}));return kX.set(X,Z),Z};var UZ=(X,Z)=>{for(var G in Z)o(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 RX(){function X(){let Z=Date.now(),G=UX||Z;return UX=G,Z>UX?Z:G+1}return zZ+X().toString(36)}function EX(X){return async function Z(G,J=!0){return(await bX.SwapKitApi.getChainBalance({chain:X,address:G,scamFilter:J})).map(({identifier:q,value:$,decimal:L})=>{return new ZX.AssetValue({decimal:L||ZX.BaseDecimal[X],value:$,identifier:q})})}}var ZX,bX,zZ,UX=0;var zX=N(()=>{ZX=require("@swapkit/helpers"),bX=require("@swapkit/helpers/api"),zZ=typeof process!=="undefined"&&process.pid?process.pid.toString(36):""});async function MZ({chain:X,txHash:Z}){let G=U.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[Z],id:RX()}),Q=await U.RequestClient.post(G,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new U.SwapKitError("toolbox_utxo_broadcast_failed",{error:Q.error?.message});if(Q.result.includes('"code":-26'))throw new U.SwapKitError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Q.result}function MX(X){return`https://api.blockchair.com/${YZ(X)}`}function fX(X){switch(X){case U.Chain.Bitcoin:return 5;case U.Chain.Dogecoin:return 1e4;case U.Chain.Litecoin:return 1;case U.Chain.Zcash:return 1;default:return 2}}function YZ(X){switch(X){case U.Chain.BitcoinCash:return"bitcoin-cash";case U.Chain.Litecoin:return"litecoin";case U.Chain.Dash:return"dash";case U.Chain.Dogecoin:return"dogecoin";case U.Chain.Zcash:return"zcash";case U.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function CZ(X){try{let{feePerKb:Z}=await U.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),G=Z/1000;return Math.max(G,fX(X))}catch(Z){return fX(X)}}async function YX(X,Z){let G=await U.RequestClient.get(`${X}${Z?`${X.includes("?")?"&":"?"}key=${Z}`:""}`);if(!G||G.context.code!==200)throw new U.SwapKitError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return G.data}async function xX({address:X,chain:Z,apiKey:G}){if(!X)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await YX(`${MX(Z)}/dashboards/address/${X}?transaction_details=true`,G))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function HZ({address:X,chain:Z,apiKey:G}){return(await xX({address:X,chain:Z,apiKey:G}))?.address.balance||0}async function mX({chain:X,apiKey:Z,txHash:G}){if(!G)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await YX(`${MX(X)}/raw/transaction/${G}`,Z))?.[G]?.raw_transaction||""}catch(J){return console.error("Failed to fetch raw transaction:",J),""}}async function TZ({chain:X,address:Z,apiKey:G,offset:J=0,limit:Q=30}){return(await YX(`${MX(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=${Q}&offset=${J}`,G)).map(({is_spent:W,script_hex:B,block_id:D,transaction_hash:M,index:z,value:Y,spending_signature_hex:H})=>({hash:M,index:z,value:Y,txHex:H,script_hex:B,is_confirmed:D!==-1,is_spent:W}))}function vZ(X){return X.reduce((Z,G)=>Z+G.value,0)}function VX(X,Z){let G=[...X].sort((J,Q)=>Q.value-J.value);if(Z){let J=[],Q=0;for(let q of G)if(J.push(q),Q+=q.value,Q>=Z)break;return J}return G}async function gX({chain:X,address:Z,apiKey:G,targetValue:J,accumulativeValue:Q=0,offset:q=0,limit:$=30}){if(!Z)throw new U.SwapKitError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let L=await TZ({targetValue:J,chain:X,address:Z,apiKey:G,offset:q,limit:$}),B=L.length<$,D=L.filter(({is_spent:_})=>!_),M=vZ(D),z=Q+M,Y=J&&z>=J;if(B||Y)return VX(D,J);let H=await gX({chain:X,address:Z,apiKey:G,offset:q+$,limit:$,accumulativeValue:z,targetValue:J}),I=[...D,...H];return VX(I,J)}catch(L){return console.error("Failed to fetch unspent UTXOs:",L),[]}}async function IZ({address:X,chain:Z,apiKey:G,fetchTxHex:J=!0,targetValue:Q}){let q=await gX({chain:Z,address:X,apiKey:G,targetValue:Q}),$=[];for(let{hash:L,index:W,script_hex:B,value:D}of q){let M;if(J)M=await mX({txHash:L,chain:Z,apiKey:G});$.push({address:X,hash:L,index:W,txHex:M,value:D,witnessUtxo:{value:D,script:Buffer.from(B,"hex")}})}return $}function _Z(X){let Z=U.SKConfig.get("apiKeys").blockchair||"";return U.warnOnce(!Z,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(G)=>MZ({txHash:G,chain:X}),getRawTx:(G)=>mX({txHash:G,chain:X,apiKey:Z}),getSuggestedTxFee:()=>CZ(X),getBalance:(G)=>HZ({address:G,chain:X,apiKey:Z}),getAddressData:(G)=>xX({address:G,chain:X,apiKey:Z}),getUtxos:(G)=>IZ({...G,chain:X,apiKey:Z})}}function FZ(X){return X}function O(X){let Z=U.SKConfig.get("apis")[X];if(Z)return U.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),Z;return _Z(X)}function F(){return function X(Z){switch(Z){case U.Chain.Bitcoin:return SX.networks.bitcoin;case U.Chain.BitcoinCash:return m.default.bitcoincash.main.toBitcoinJS();case U.Chain.Dash:return m.default.dash.main.toBitcoinJS();case U.Chain.Litecoin:return m.default.litecoin.main.toBitcoinJS();case U.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=m.default.dogecoin.test;return J.versions.bip32=G,m.default.dogecoin.main.toBitcoinJS()}case U.Chain.Zcash:{let{isStagenet:G}=U.SKConfig.get("envs");return G?OZ:NZ}default:throw new U.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var U,SX,m,NZ,OZ;var lX=N(()=>{U=require("@swapkit/helpers"),SX=require("bitcoinjs-lib");zX();m=x(require("coininfo"));NZ={messagePrefix:`\x19Zcash Signed Message:
|
|
2
|
+
`,bech32:"zc",bip32:{public:76067358,private:76066276},pubKeyHash:28,scriptHash:28,wif:128},OZ={messagePrefix:`\x19Zcash Signed Message:
|
|
3
|
+
`,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239}});function IX(X){try{return GX(X),!0}catch(Z){return!1}}function _X(X){return GX(X)?.network}function g(X){let Z=GX(X);if(Z?.format==="legacy")return X;return AZ(Z)}function n(X){let Z=GX(X);return kZ(Z)}function GX(X){try{let Z=yZ(X);if(Z)return Z}catch(Z){}try{let Z=PZ(X);if(Z)return Z}catch(Z){}throw new CX.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function yZ(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 PZ(X){if(X.indexOf(":")!==-1)try{return hX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return hX(`${G}:${X}`)}catch(J){}}return}function hX(X){try{let{hash:Z,prefix:G,type:J}=TX.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 AZ(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 TX.default.encode(Z,G,J)}var CX,HX,TX,vX,C;var cX=N(()=>{CX=require("@swapkit/helpers"),HX=x(require("bs58check")),TX=x(require("cashaddrjs"));((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(vX||={});C={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}}});var P,JX=(X)=>{switch(X){case P.Chain.Bitcoin:case P.Chain.BitcoinCash:return 550;case P.Chain.Dash:case P.Chain.Litecoin:return 5500;case P.Chain.Dogecoin:return 1e5;case P.Chain.Zcash:return 546;default:throw new P.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},K=({inputs:X,outputs:Z,feeRate:G=1,chain:J=P.Chain.Bitcoin})=>{let Q=Math.ceil(G),q=X[0]&&"address"in X[0]&&X[0].address?d(X[0].address):"P2PKH",$=X.filter((z)=>w(z)*Q<=z.value),L=QX+Z.reduce((z,Y)=>z+r(Y,q),0),W=Z.reduce((z,Y)=>z+Y.value,0),B=L*Q,D=0,M=[];for(let z of $){let Y=w(z),H=Q*Y;B+=H,D+=z.value,M.push(z);let I=B+W;if(D<I)continue;let _=D-I,S=Q*r({address:"",value:0},q);if(_>S){let R=S+B,AX=D-(W+R);if(AX>Math.max(w({})*Q,JX(J)))return{inputs:M,outputs:Z.concat({value:AX,address:""}),fee:R}}return{inputs:M,outputs:Z,fee:B}}return{fee:Q*l({inputs:X,outputs:Z,feeRate:Q})}};var pX=N(()=>{P=require("@swapkit/helpers");h()});function b(X){let Z=Buffer.from(X,"utf8");return LX.script.compile([LX.opcodes.OP_RETURN,Z])}var uX,LX,wZ=1000,QX=10,oX=10,KZ=41,bZ=107,$X,qX,i,d=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new uX.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?d(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=qX["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,L)=>$+w(L),0),q=Z?.reduce(($,L)=>$+r(L),0)||i[J];return QX+Q+q},w=(X)=>{if("type"in X)return qX[X.type];if("address"in X&&X.address)return qX[d(X.address)];return KZ+bZ},r=(X,Z)=>{if(X?.script)return oX+X.script.length+(X.script.length>=74?2:1);if(Z)return i[Z];return i.P2PKH};var nX=N(()=>{uX=require("@swapkit/helpers"),LX=require("bitcoinjs-lib");((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})($X||={});qX={["P2PKH"]:148,["P2WPKH"]:68},i={["P2PKH"]:34,["P2WPKH"]:31}});var h=N(()=>{lX();cX();pX();nX()});function EZ(X,Z=!1){let G=aX.hash160(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return FX.default.encode(Q)}function WX(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=X.startsWith("t1"),G=X.startsWith("t3");if(!(Z||G))return!1;let{isStagenet:J}=T.SKConfig.get("envs");if(Z&&J||G&&!J)return!1;return fZ(X,tX)}catch{return!1}}function fZ(X,Z){try{let G=FX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}async function SZ({phrase:X,derivationPathString:Z}){let G=iX.mnemonicToSeedSync(X),Q=dX.HDKey.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let q=VZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:tX}),{isStagenet:$}=T.SKConfig.get("envs"),L=EZ(q.publicKey,$);return{getAddress(){return Promise.resolve(L)},signTransaction(W){for(let B=0;B<W.inputCount;B++)W.signInput(B,q);return Promise.resolve(W)}}}async function NX(X){let Z=await c.match(X).with({signer:c.P.not(c.P.nullish)},({signer:L})=>Promise.resolve(L)).with({phrase:c.P.string},({phrase:L,derivationPath:W,index:B=0})=>{let D=W||T.NetworkDerivationPath[T.Chain.Zcash]||[44,133,0,0,0],M=T.updateDerivationPath(D,{index:B}),z=T.derivationPathToString(M);return SZ({phrase:L,derivationPathString:z})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await E({chain:T.Chain.Zcash,signer:Z});function q(L){return L.getAddress()}async function $({recipient:L,assetValue:W,feeOptionKey:B=T.FeeOption.Fast,...D}){let M=await Z?.getAddress();if(!(Z&&M))throw new T.SwapKitError("toolbox_utxo_no_signer");let z=D.feeRate||(await G())[B],Y={...D,assetValue:W,feeRate:z,recipient:L,sender:M},{psbt:H}=await Q.createTransaction(Y),I=await Z.signTransaction(H);I.finalizeAllInputs();let _=I.extractTransaction().toHex();return J(_)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:q,validateAddress:WX}}var rX,dX,iX,T,aX,FX,sX,c,RZ,tX,VZ;var jX=N(()=>{rX=x(require("@bitcoinerlab/secp256k1")),dX=require("@scure/bip32"),iX=require("@scure/bip39"),T=require("@swapkit/helpers"),aX=require("bitcoinjs-lib/src/crypto"),FX=x(require("bs58check")),sX=require("ecpair"),c=require("ts-pattern");h();a();RZ=T.Chain.Zcash,tX=F()(RZ);VZ=sX.ECPairFactory(rX.default)});function xZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:q}){for(let $ of X){let L=!!$.witnessUtxo&&!s.includes(G)&&{witnessUtxo:$.witnessUtxo},W=s.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...L,...W})}for(let $ of Z){let L="address"in $&&$.address?$.address:Q,W=$.script;if(W&&!q)continue;let B=W?{script:q,value:0}:{address:L,value:$.value};A.initEccLib(BX.default),J.addOutput(B)}return{psbt:J,inputs:X}}async function ZZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:q=!1}){let $=X.chain,L=G?await b(G):null,W=await QZ({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:q}),{inputs:B,outputs:D}=K({...W,feeRate:J,chain:$});if(!(B&&D))throw new j.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await F(),z=new A.Psbt({network:M($)});if($===j.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:Y,inputs:H}=await xZ({inputs:B,outputs:D,chain:$,psbt:z,sender:Q,compiledMemo:L});return{psbt:Y,utxos:W.inputs,inputs:H}}async function GZ(){let X=await F();return function Z({address:G,chain:J}){if(J===j.Chain.BitcoinCash)return f(G);if(J===j.Chain.Zcash)return WX(G);try{return A.initEccLib(BX.default),A.address.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function mZ({chain:X,phrase:Z,derivationPath:G}){let J=(await t(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function q(){return(await yX(X))(J)}return{getAddress:q,signTransaction:Q}}async function E({chain:X,...Z}){let G="phrase"in Z?Z.phrase:void 0,J="index"in Z?Z.index||0:0,Q=j.derivationPathToString("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:j.updateDerivationPath(j.NetworkDerivationPath[X],{index:J})),q=G?await mZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let L=await yX(X),W=await GZ(),B=await t(X);return{accumulative:K,calculateTxSize:l,getAddressFromKeys:L,getAddress:$,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>O(X).broadcastTx(D),createTransaction:ZZ,createKeysForPath:B,getFeeRates:()=>e(X),getInputsOutputsFee:JZ,transfer:hZ(q),getPrivateKeyFromMnemonic:(D)=>{return B(D).toWIF()},getBalance:EX(X),estimateTransactionFee:lZ(X),estimateMaxSendableAmount:gZ(X)}}async function JZ({assetValue:X,feeOptionKey:Z=j.FeeOption.Fast,feeRate:G,memo:J,sender:Q,recipient:q}){let $=X.chain,L=await QZ({assetValue:X,sender:Q,memo:J,recipient:q}),W=G?Math.floor(G):(await e($))[Z];return K({...L,feeRate:W,chain:$})}function gZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:q=j.FeeOption.Fast,recipients:$=1}){let L=await O(X).getAddressData(G),W=Q?Math.ceil(Q):(await e(X))[q],B=L?.utxo.map((H)=>({...H,type:"P2PKH",hash:""})).filter((H)=>H.value>Math.max(JX(X),w(H)*W));if(!B?.length)return j.AssetValue.from({chain:X});let D=j.AssetValue.from({chain:X,value:B.reduce((H,I)=>H+I.value,0)}),M=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let H=await b(J);M.push({address:G,script:H,value:0})}let Y=l({inputs:B,outputs:M,feeRate:W})*W;return D.sub(Y)}}function lZ(X){return async(Z)=>{let G=await JZ(Z);return j.AssetValue.from({chain:X,value:j.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function t(X){let Z=await F();switch(X){case j.Chain.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${j.DerivationPath.BCH}/0`,wif:q}){let $=Z(X);if(q)return DX.ECPair.fromWIF(q,$);if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return DX.HDNode.fromSeedBuffer(Buffer.from(OX.mnemonicToSeedSync(J)),$).derivePath(Q).keyPair};case j.Chain.Bitcoin:case j.Chain.Dogecoin:case j.Chain.Litecoin:case j.Chain.Zcash:case j.Chain.Dash:return function G({phrase:J,wif:Q,derivationPath:q}){if(!(Q||J))throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=eX.ECPairFactory(BX.default),L=Z(X);if(Q)return $.fromWIF(Q,L);let W=OX.mnemonicToSeedSync(J),B=XZ.HDKey.fromMasterSeed(W,L).derive(q);if(!B.privateKey)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(B.privateKey),{network:L})};default:throw new j.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function yX(X){let Z=await F();return function G(J){if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=s.includes(X)?A.payments.p2pkh:A.payments.p2wpkh,{address:q}=Q({pubkey:J.publicKey,network:Z(X)});if(!q)throw new j.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return q}}function hZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:q,assetValue:$}){let L=await X?.getAddress(),W=$.chain;if(!(X&&L))throw new j.SwapKitError("toolbox_utxo_no_signer");if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=q||(await e(W))[Q||j.FeeOption.Fast],{psbt:D}=await ZZ({recipient:J,feeRate:B,sender:L,assetValue:$,memo:G}),M=await X.signTransaction(D);return M.finalizeAllInputs(),O(W).broadcastTx(M.extractTransaction().toHex())}}async function e(X){let Z=await O(X).getSuggestedTxFee();return{[j.FeeOption.Average]:Z,[j.FeeOption.Fast]:j.applyFeeMultiplier(Z,j.FeeOption.Fast),[j.FeeOption.Fastest]:j.applyFeeMultiplier(Z,j.FeeOption.Fastest)}}async function QZ({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let q=X.chain,$=(await e(q))[j.FeeOption.Fastest],L=Q||s.includes(q),W=X.getBaseValue("number"),B=Math.ceil(W+$*5000);return{inputs:await O(q).getUtxos({address:J,fetchTxHex:L,targetValue:B}),outputs:[{address:Z,value:W},...G?[{address:"",script:await b(G),value:0}]:[]]}}var j,A,eX,BX,DX,XZ,OX,s;var a=N(()=>{j=require("@swapkit/helpers"),A=require("bitcoinjs-lib"),eX=require("ecpair");zX();h();XX();BX=x(require("@bitcoinerlab/secp256k1")),DX=require("@psf/bitcoincashjs-lib"),XZ=require("@scure/bip32"),OX=require("@scure/bip39");jX();s=[j.Chain.Dash,j.Chain.Dogecoin]});function p(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function f(X){let Z=p(X);return IX(Z)&&_X(Z)==="mainnet"}function V(X){return p(n(X))}async function cZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((q,$)=>{J.sign($,X,void 0,65,q.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:Z}}async function PX(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[y],{index:G})),Q=Z?(await t(y))({phrase:Z,derivationPath:J}):void 0,q=Q?await cZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(q?.getAddress())}let{getBalance:L,getFeeRates:W,broadcastTx:B,...D}=await E({chain:y});function M(z,Y=!0){return L(p(n(z)))}return{...D,getAddress:$,broadcastTx:B,createTransaction:qZ,buildTx:uZ,getAddressFromKeys:oZ,getBalance:M,getFeeRates:W,stripPrefix:p,stripToCashAddress:V,validateAddress:f,transfer:pZ({getFeeRates:W,broadcastTx:B,signer:q})}}async function qZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!f(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let q=Math.ceil(X.getBaseValue("number")+J*7500),$=await O(y).getUtxos({address:V(Q),fetchTxHex:!0,targetValue:q}),L=G?await b(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:B,outputs:D}=K({inputs:$,outputs:W,feeRate:J,chain:y});if(!(B&&D))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await F(),z=new u.TransactionBuilder(M(y));await Promise.all(B.map(async(Y)=>{let H=await O(y).getRawTx(Y.hash);z.addInput(u.Transaction.fromBuffer(Buffer.from(H,"hex")),Y.index)}));for(let Y of D){let H="address"in Y&&Y.address?Y.address:g(Q),I=await F(),_=u.address.toOutputScript(g(H),I(y));z.addOutput(_,Y.value)}if(L)z.addOutput(L,0);return{builder:z,utxos:B}}function pZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:q,feeOptionKey:$=v.FeeOption.Fast,...L}){let W=await G?.getAddress();if(!(G&&W))throw new v.SwapKitError("toolbox_utxo_no_signer");if(!Q)throw new v.SwapKitError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let B=L.feeRate||(await Z())[$],{builder:D,utxos:M}=await qZ({...L,assetValue:q,feeRate:B,recipient:Q,sender:W}),Y=(await G.signTransaction({builder:D,utxos:M})).toHex();return X(Y)}}async function uZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,setSigHashType:q}){let $=n(Z);if(!f($))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:$});let L=Math.ceil(X.getBaseValue("number")+J*7500),W=await O(y).getUtxos({address:V(Q),fetchTxHex:!1,targetValue:L}),B=Number(J.toFixed(0)),D=G?await b(G):null,M=[];if(M.push({address:g(Z),value:X.getBaseValue("number")}),D)M.push({script:D,value:0});let{inputs:z,outputs:Y}=K({inputs:W,outputs:M,feeRate:B,chain:y});if(!(z&&Y))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let H=await F(),I=new $Z.Psbt({network:H(y)});for(let{hash:_,index:S,witnessUtxo:R}of z)I.addInput({hash:_,index:S,witnessUtxo:R,sighashType:q?65:void 0});for(let _ of Y){let S="address"in _&&_.address?_.address:g(Q),R=_.script?D?{script:D,value:0}:void 0:{address:S,value:_.value};if(R)I.addOutput(R)}return{psbt:I,utxos:W,inputs:z}}function oZ(X){let Z=X.getAddress(0);return V(Z)}var u,v,$Z,y;var XX=N(()=>{u=require("@psf/bitcoincashjs-lib"),v=require("@swapkit/helpers"),$Z=require("bitcoinjs-lib");h();a();y=v.Chain.BitcoinCash});async function nZ(X,Z){switch(X){case k.Chain.BitcoinCash:return await PX(Z||{});case k.Chain.Zcash:return await NX(Z);case k.Chain.Bitcoin:case k.Chain.Dogecoin:case k.Chain.Litecoin:case k.Chain.Dash:return await E({chain:X,...Z});default:throw new k.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}var k;var LZ=N(()=>{k=require("@swapkit/helpers");XX();a();jX();XX()});var dZ={};UZ(dZ,{validateZcashAddress:()=>WX,toLegacyAddress:()=>g,toCashAddress:()=>n,stripToCashAddress:()=>V,stripPrefix:()=>p,nonSegwitChains:()=>s,isValidAddress:()=>IX,getUtxoToolbox:()=>nZ,getUtxoNetwork:()=>F,getUtxoApi:()=>O,getUTXOAddressValidator:()=>GZ,getScriptTypeForAddress:()=>d,getOutputSize:()=>r,getInputSize:()=>w,getDustThreshold:()=>JX,getCreateKeysForPath:()=>t,detectAddressNetwork:()=>_X,createZcashToolbox:()=>NX,createUTXOToolbox:()=>E,createCustomUtxoApi:()=>FZ,createBCHToolbox:()=>PX,compileMemo:()=>b,calculateTxSize:()=>l,bchValidateAddress:()=>f,addressFromKeysGetter:()=>yX,accumulative:()=>K,UtxoNetwork:()=>vX,UTXOScriptType:()=>$X,TX_OVERHEAD:()=>QX,OutputSizes:()=>i,OP_RETURN_OVERHEAD:()=>oX,MIN_TX_FEE:()=>wZ,InputSizes:()=>qX});module.exports=DZ(dZ);var iZ=N(()=>{LZ();XX();a();jX();h()});iZ();
|
|
4
4
|
|
|
5
|
-
//# debugId=
|
|
5
|
+
//# debugId=3CEAE294645E3C7164756E2164756E21
|
|
6
6
|
//# sourceMappingURL=index.cjs.map
|