@swapkit/toolboxes 4.0.0-beta.35 → 4.0.0-beta.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/chunk-4yap1fvd.js +1 -0
  2. package/dist/chunk-5yxc1e69.js +1 -0
  3. package/dist/chunk-6f98phv2.js +1 -0
  4. package/dist/chunk-9bqegm61.js +1 -0
  5. package/dist/chunk-fazw0jvt.js +1 -0
  6. package/dist/chunk-s47y8512.js +1 -0
  7. package/dist/chunk-vtd17cje.js +1 -0
  8. package/dist/chunk-zcdeg6h9.js +1 -0
  9. package/dist/src/cosmos/index.cjs +1 -0
  10. package/dist/src/cosmos/index.cjs.map +1 -1
  11. package/dist/src/cosmos/index.js +1 -0
  12. package/dist/src/cosmos/index.js.map +1 -1
  13. package/dist/src/evm/index.cjs +1 -0
  14. package/dist/src/evm/index.js +1 -0
  15. package/dist/src/index.cjs +3 -2
  16. package/dist/src/index.cjs.map +3 -3
  17. package/dist/src/index.js +3 -2
  18. package/dist/src/index.js.map +3 -3
  19. package/dist/src/near/index.cjs +3 -2
  20. package/dist/src/near/index.cjs.map +4 -4
  21. package/dist/src/near/index.js +3 -2
  22. package/dist/src/near/index.js.map +4 -4
  23. package/dist/src/radix/index.cjs +1 -0
  24. package/dist/src/radix/index.js +1 -0
  25. package/dist/src/ripple/index.cjs +1 -0
  26. package/dist/src/ripple/index.js +1 -0
  27. package/dist/src/solana/index.cjs +1 -0
  28. package/dist/src/solana/index.js +1 -0
  29. package/dist/src/substrate/index.cjs +1 -0
  30. package/dist/src/substrate/index.js +1 -0
  31. package/dist/src/tron/index.cjs +3 -2
  32. package/dist/src/tron/index.cjs.map +3 -3
  33. package/dist/src/tron/index.js +3 -2
  34. package/dist/src/tron/index.js.map +3 -3
  35. package/dist/src/utxo/index.cjs +1 -0
  36. package/dist/src/utxo/index.js +1 -0
  37. package/package.json +3 -3
  38. package/src/cosmos/util.ts +1 -1
  39. package/src/index.ts +3 -2
  40. package/src/near/helpers/core.ts +12 -10
  41. package/src/near/toolbox.ts +16 -5
  42. package/src/near/types.ts +2 -2
  43. package/src/tron/index.ts +1 -0
  44. package/src/tron/toolbox.ts +157 -9
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/tron/toolbox.ts", "../src/tron/helpers/trc20.abi.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 type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\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}: {\n phrase: string;\n derivationPath: string;\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 // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.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 }) => createKeysForPath({ phrase, derivationPath }))\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 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\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 const feeLimit = calculateFeeLimit();\n const contract = await tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .send({\n from,\n feeLimit,\n callValue: 0,\n });\n\n if (!txid) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = ({ assetValue }: TronTransferParams) => {\n const isNative = assetValue.isGasAsset;\n\n if (isNative) {\n // Native TRX transfers typically consume bandwidth, which is free up to daily limit\n // Return a minimal fee estimation for bandwidth cost\n return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX\n }\n\n // TRC20 transfers consume energy, estimate higher fee\n return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX\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 // 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 return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
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 type {\n TronCreateTransactionParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types.js\";\n\nimport { TronWeb } from \"tronweb\";\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}: {\n phrase: string;\n derivationPath: string;\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 // Create TronWeb instance with the derived private key\n const tronWebWithKey = new TronWeb({\n fullHost: SKConfig.get(\"rpcUrls\")[Chain.Tron],\n privateKey: privateKeyHex,\n });\n\n const address = tronWebWithKey.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWebWithKey.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 }) => createKeysForPath({ phrase, derivationPath }))\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 // Constants for TRON resource calculation\n const TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\n const TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\n const TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\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 const getBalance = async (address: string, scamFilter = true) => {\n const { getBalance: getBalanceFromApi } = await import(\"../utils.js\");\n\n try {\n // Use SwapKit API for comprehensive balance fetching (includes TRX + TRC20 tokens)\n const apiBalances = await getBalanceFromApi(Chain.Tron)(address, scamFilter);\n\n // If API returns balances, use those\n if (apiBalances.length > 0) {\n return apiBalances;\n }\n\n // Fallback to on-chain TRX balance if API fails or returns empty\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6, // TRX has 6 decimals\n }),\n ];\n } catch (error) {\n warnOnce(\n true,\n `Failed to get Tron balance for ${address}: ${error instanceof Error ? error.message : error}`,\n );\n\n // Final fallback: try to get just the native TRX balance\n try {\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n return [\n AssetValue.from({\n chain: Chain.Tron,\n value: trxBalanceInSun,\n fromBaseDecimal: 6,\n }),\n ];\n } catch (fallbackError) {\n warnOnce(\n true,\n `Failed to get native TRX balance for ${address}: ${fallbackError instanceof Error ? fallbackError.message : fallbackError}`,\n );\n return [];\n }\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 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\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 const feeLimit = calculateFeeLimit();\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.transfer) {\n throw new SwapKitError(\"toolbox_tron_token_transfer_failed\");\n }\n\n const txid = await contract.methods\n .transfer(recipient, assetValue.getBaseValue(\"string\"))\n .send({\n from,\n feeLimit,\n callValue: 0,\n });\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 // 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 return {\n tronWeb,\n getAddress,\n validateAddress: await getTronAddressValidator(),\n getBalance,\n transfer,\n estimateTransactionFee,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n };\n};\n",
6
6
  "export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\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 type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n type: \"function\",\n },\n] as const;\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "8289008D961D587464756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "EED46AFEC48D42F464756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -3,3 +3,4 @@ var OZ={};FZ(OZ,{validateZcashAddress:()=>XX,toLegacyAddress:()=>x,toCashAddress
3
3
  `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function _(){return function X(Z){switch(Z){case D.Chain.Bitcoin:return _X.networks.bitcoin;case D.Chain.BitcoinCash:return E.default.bitcoincash.main.toBitcoinJS();case D.Chain.Dash:return E.default.dash.main.toBitcoinJS();case D.Chain.Litecoin:return E.default.litecoin.main.toBitcoinJS();case D.Chain.Dogecoin:{let G={private:70615956,public:70617039},J=E.default.dogecoin.test;return J.versions.bip32=G,E.default.dogecoin.main.toBitcoinJS()}case D.Chain.Zcash:{let{isStagenet:G}=D.SKConfig.get("envs");return G?tX:sX}default:throw new D.SwapKitError("toolbox_utxo_not_supported",{chain:Z})}}}var b=require("@swapkit/helpers"),LX=S(require("bs58check")),WX=S(require("cashaddrjs"));var qX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(qX||={});var T={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function jX(X){try{return r(X),!0}catch(Z){return!1}}function BX(X){return r(X)?.network}function x(X){let Z=r(X);if(Z?.format==="legacy")return X;return ZZ(Z)}function c(X){let Z=r(X);return GZ(Z)}function r(X){try{return eX(X)}catch(Z){}try{return XZ(X)}catch(Z){}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function eX(X){try{let Z=LX.default.decode(X);if(Z.length!==21)throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case T.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case T.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case T.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case T.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case T.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case T.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function XZ(X){if(X.indexOf(":")!==-1)try{return yX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return yX(`${G}:${X}`)}catch(J){}}throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}function yX(X){try{let{hash:Z,prefix:G,type:J}=WX.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){throw new b.SwapKitError("toolbox_utxo_invalid_address",{address:X})}}function ZZ(X){let Z=T.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),LX.default.encode(G)}function GZ(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return WX.default.encode(Z,G,J)}var N=require("@swapkit/helpers");var i=(X)=>{switch(X){case N.Chain.Bitcoin:case N.Chain.BitcoinCash:return 550;case N.Chain.Dash:case N.Chain.Litecoin:return 5500;case N.Chain.Dogecoin:return 1e5;case N.Chain.Zcash:return 546;default:throw new N.SwapKitError("toolbox_utxo_not_supported",{chain:X})}},A=({inputs:X,outputs:Z,feeRate:G=1,chain:J=N.Chain.Bitcoin})=>{let Q=Math.ceil(G),L=X[0]&&"address"in X[0]&&X[0].address?p(X[0].address):"P2PKH",$=X.filter((z)=>k(z)*Q<=z.value),W=a+Z.reduce((z,H)=>z+u(H,L),0),q=Z.reduce((z,H)=>z+H.value,0),B=W*Q,U=0,M=[];for(let z of $){let H=k(z),Y=Q*H;B+=Y,U+=z.value,M.push(z);let I=B+q;if(U<I)continue;let V=U-I,YX=Q*u({address:"",value:0},L);if(V>YX){let HX=YX+B,CX=U-(q+HX);if(CX>Math.max(k({})*Q,i(J)))return{inputs:M,outputs:Z.concat({value:CX,address:""}),fee:HX}}return{inputs:M,outputs:Z,fee:B}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};var PX=require("@swapkit/helpers"),e=require("bitcoinjs-lib"),JZ=1000,a=10,VX=10,QZ=41,$Z=107;function R(X){let Z=Buffer.from(X,"utf8");return e.script.compile([e.opcodes.OP_RETURN,Z])}var s;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(s||={});var t={["P2PKH"]:148,["P2WPKH"]:68},o={["P2PKH"]:34,["P2WPKH"]:31},p=(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 PX.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?p(X[0].address):"P2PKH",Q=X.filter(($)=>$.value>=t["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,W)=>$+k(W),0),L=Z?.reduce(($,W)=>$+u(W),0)||o[J];return a+Q+L},k=(X)=>{if("type"in X)return t[X.type];if("address"in X&&X.address)return t[p(X.address)];return QZ+$Z},u=(X,Z)=>{if(X?.script)return VX+X.script.length+(X.script.length>=74?2:1);if(Z)return o[Z];return o.P2PKH};var j=require("@swapkit/helpers"),y=require("bitcoinjs-lib"),EX=require("ecpair");var ZX=S(require("@bitcoinerlab/secp256k1")),GX=require("@psf/bitcoincashjs-lib"),SX=require("@scure/bip32"),zX=require("@scure/bip39");var kX=S(require("@bitcoinerlab/secp256k1")),AX=require("@scure/bip32"),RX=require("@scure/bip39"),C=require("@swapkit/helpers"),bX=require("bitcoinjs-lib/src/crypto"),DX=S(require("bs58check")),wX=require("ecpair"),m=require("ts-pattern");var LZ=C.Chain.Zcash,KX=_()(LZ);function WZ(X,Z=!1){let G=bX.hash160(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return DX.default.encode(Q)}function XX(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}=C.SKConfig.get("envs");if(Z&&J||G&&!J)return!1;return qZ(X,KX)}catch{return!1}}function qZ(X,Z){try{let G=DX.default.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var jZ=wX.ECPairFactory(kX.default);async function BZ({phrase:X,derivationPathString:Z}){let G=RX.mnemonicToSeedSync(X),Q=AX.HDKey.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let L=jZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:KX}),{isStagenet:$}=C.SKConfig.get("envs"),W=WZ(L.publicKey,$);return{getAddress(){return Promise.resolve(W)},signTransaction(q){for(let B=0;B<q.inputCount;B++)q.signInput(B,L);return Promise.resolve(q)}}}async function UX(X){let Z=await m.match(X).with({signer:m.P.not(m.P.nullish)},({signer:W})=>Promise.resolve(W)).with({phrase:m.P.string},({phrase:W,derivationPath:q,index:B=0})=>{let U=q||C.NetworkDerivationPath[C.Chain.Zcash]||[44,133,0,0,0],M=C.updateDerivationPath(U,{index:B}),z=C.derivationPathToString(M);return BZ({phrase:W,derivationPathString:z})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await w({chain:C.Chain.Zcash,signer:Z});function L(W){return W.getAddress()}async function $({recipient:W,assetValue:q,feeOptionKey:B=C.FeeOption.Fast,...U}){let M=await Z?.getAddress();if(!(Z&&M))throw new C.SwapKitError("toolbox_utxo_no_signer");let z=U.feeRate||(await G())[B],H={...U,assetValue:q,feeRate:z,recipient:W,sender:M},{psbt:Y}=await Q.createTransaction(H),I=await Z.signTransaction(Y);I.finalizeAllInputs();let V=I.extractTransaction().toHex();return J(V)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:L,validateAddress:XX}}var n=[j.Chain.Dash,j.Chain.Dogecoin];function DZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:L}){for(let $ of X){let W=!!$.witnessUtxo&&!n.includes(G)&&{witnessUtxo:$.witnessUtxo},q=n.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...W,...q})}for(let $ of Z){let W="address"in $&&$.address?$.address:Q,q=$.script;if(q&&!L)continue;let B=q?{script:L,value:0}:{address:W,value:$.value};y.initEccLib(ZX.default),J.addOutput(B)}return{psbt:J,inputs:X}}async function xX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:L=!1}){let $=X.chain,W=G?await R(G):null,q=await lX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:L}),{inputs:B,outputs:U}=A({...q,feeRate:J,chain:$});if(!(B&&U))throw new j.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let M=await _(),z=new y.Psbt({network:M($)});if($===j.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:H,inputs:Y}=await DZ({inputs:B,outputs:U,chain:$,psbt:z,sender:Q,compiledMemo:W});return{psbt:H,utxos:q.inputs,inputs:Y}}async function gX(){let X=await _();return function Z({address:G,chain:J}){if(J===j.Chain.BitcoinCash)return K(G);if(J===j.Chain.Zcash)return XX(G);try{return y.initEccLib(ZX.default),y.address.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function UZ({chain:X,phrase:Z,derivationPath:G}){let J=(await d(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function L(){return(await MX(X))(J)}return{getAddress:L,signTransaction:Q}}async function w({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})),L=G?await UZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let W=await MX(X),q=await gX(),B=await d(X);return{accumulative:A,calculateTxSize:g,getAddressFromKeys:W,getAddress:$,validateAddress:(U)=>q({address:U,chain:X}),broadcastTx:(U)=>F(X).broadcastTx(U),createTransaction:xX,createKeysForPath:B,getFeeRates:()=>JX(X),getInputsOutputsFee:mX,transfer:TZ(L),getPrivateKeyFromMnemonic:(U)=>{return B(U).toWIF()},getBalance:fX(X),estimateTransactionFee:MZ(X),estimateMaxSendableAmount:zZ(X)}}async function mX({assetValue:X,feeOptionKey:Z=j.FeeOption.Fast,feeRate:G,memo:J,sender:Q,recipient:L}){let $=X.chain,W=await lX({assetValue:X,sender:Q,memo:J,recipient:L}),q=G?Math.floor(G):(await JX($))[Z];return A({...W,feeRate:q,chain:$})}function zZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:L=j.FeeOption.Fast,recipients:$=1}){let W=await F(X).getAddressData(G),q=Q?Math.ceil(Q):(await JX(X))[L],B=W?.utxo.map((Y)=>({...Y,type:"P2PKH",hash:""})).filter((Y)=>Y.value>Math.max(i(X),k(Y)*q));if(!B?.length)return j.AssetValue.from({chain:X});let U=j.AssetValue.from({chain:X,value:B.reduce((Y,I)=>Y+I.value,0)}),M=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let Y=await R(J);M.push({address:G,script:Y,value:0})}let H=g({inputs:B,outputs:M,feeRate:q})*q;return U.sub(H)}}function MZ(X){return async(Z)=>{let G=await mX(Z);return j.AssetValue.from({chain:X,value:j.SwapKitNumber.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function d(X){let Z=await _();switch(X){case j.Chain.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${j.DerivationPath.BCH}/0`,wif:L}){let $=Z(X);if(L)return GX.ECPair.fromWIF(L,$);if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return GX.HDNode.fromSeedBuffer(Buffer.from(zX.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:L}){if(!(Q||J))throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=EX.ECPairFactory(ZX.default),W=Z(X);if(Q)return $.fromWIF(Q,W);let q=zX.mnemonicToSeedSync(J),B=SX.HDKey.fromMasterSeed(q,W).derive(L);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:W})};default:throw new j.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}async function MX(X){let Z=await _();return function G(J){if(!J)throw new j.SwapKitError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=n.includes(X)?y.payments.p2pkh:y.payments.p2wpkh,{address:L}=Q({pubkey:J.publicKey,network:Z(X)});if(!L)throw new j.SwapKitError("toolbox_utxo_invalid_address",{error:"Address not defined"});return L}}function TZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:$}){let W=await X?.getAddress(),q=$.chain;if(!(X&&W))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=L||(await JX(q))[Q||j.FeeOption.Fast],{psbt:U}=await xX({recipient:J,feeRate:B,sender:W,assetValue:$,memo:G}),M=await X.signTransaction(U);return M.finalizeAllInputs(),F(q).broadcastTx(M.extractTransaction().toHex())}}async function JX(X){let Z=await F(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 lX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let L=X.chain,$=Q||n.includes(L);return{inputs:await F(L).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await R(G),value:0}]:[]]}}var O=v.Chain.BitcoinCash;function l(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function K(X){let Z=l(X);return jX(Z)&&BX(Z)==="mainnet"}function f(X){return l(c(X))}async function YZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((L,$)=>{J.sign($,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function TX(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=(await d(O))({phrase:Z,derivationPath:J}),L=Q?await YZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let{getBalance:W,getFeeRates:q,broadcastTx:B,...U}=await w({chain:O});function M(z,H=!0){return W(l(c(z)))}return{...U,getAddress:$,broadcastTx:B,createTransaction:cX,buildTx:CZ,getAddressFromKeys:vZ,getBalance:M,getFeeRates:q,stripPrefix:l,stripToCashAddress:f,validateAddress:K,transfer:HZ({getFeeRates:q,broadcastTx:B,signer:L})}}async function cX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!K(Z))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:Z});let L=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await R(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:q,outputs:B}=A({inputs:L,outputs:W,feeRate:J,chain:O});if(!(q&&B))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let U=await _(),M=new h.TransactionBuilder(U(O));await Promise.all(q.map(async(z)=>{let H=await F(O).getRawTx(z.hash);M.addInput(h.Transaction.fromBuffer(Buffer.from(H,"hex")),z.index)}));for(let z of B){let H="address"in z&&z.address?z.address:x(Q),Y=await _(),I=h.address.toOutputScript(x(H),Y(O));M.addOutput(I,z.value)}if($)M.addOutput($,0);return{builder:M,utxos:q}}function HZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:L,feeOptionKey:$=v.FeeOption.Fast,...W}){let q=await G?.getAddress();if(!(G&&q))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=W.feeRate||(await Z())[$],{builder:U,utxos:M}=await cX({...W,assetValue:L,feeRate:B,recipient:Q,sender:q}),H=(await G.signTransaction({builder:U,utxos:M})).toHex();return X(H)}}async function CZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let L=c(Z);if(!K(L))throw new v.SwapKitError("toolbox_utxo_invalid_address",{address:L});let $=await F(O).scanUTXOs({address:f(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=G?await R(G):null,B=[];if(B.push({address:x(Z),value:X.getBaseValue("number")}),q)B.push({script:q,value:0});let{inputs:U,outputs:M}=A({inputs:$,outputs:B,feeRate:W,chain:O});if(!(U&&M))throw new v.SwapKitError("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let z=await _(),H=new hX.Psbt({network:z(O)});for(let{hash:Y,index:I,witnessUtxo:V}of U)H.addInput({hash:Y,index:I,witnessUtxo:V});for(let Y of M){let I="address"in Y&&Y.address?Y.address:x(Q),V=Y.script?q?{script:q,value:0}:void 0:{address:I,value:Y.value};if(V)H.addOutput(V)}return{psbt:H,utxos:$,inputs:U}}function vZ(X){let Z=X.getAddress(0);return f(Z)}async function IZ(X,Z){switch(X){case P.Chain.BitcoinCash:return await TX(Z);case P.Chain.Zcash:return await UX(Z);case P.Chain.Bitcoin:case P.Chain.Dogecoin:case P.Chain.Litecoin:case P.Chain.Dash:return await w({chain:X,...Z});default:throw new P.SwapKitError("toolbox_utxo_not_supported",{chain:X})}}
4
4
 
5
5
  //# debugId=988C4CBF716921D464756E2164756E21
6
+ //# sourceMappingURL=index.cjs.map
@@ -3,3 +3,4 @@ import{a as DX,b as AX}from"../../chunk-6f98phv2.js";import"../../chunk-s47y8512
3
3
  `,bech32:"ztestsapling",bip32:{public:70617039,private:70615956},pubKeyHash:29,scriptHash:28,wif:239};function C(){return function X(Z){switch(Z){case Y.Bitcoin:return xX.bitcoin;case Y.BitcoinCash:return S.bitcoincash.main.toBitcoinJS();case Y.Dash:return S.dash.main.toBitcoinJS();case Y.Litecoin:return S.litecoin.main.toBitcoinJS();case Y.Dogecoin:{let G={private:70615956,public:70617039},J=S.dogecoin.test;return J.versions.bip32=G,S.dogecoin.main.toBitcoinJS()}case Y.Zcash:{let{isStagenet:G}=h.get("envs");return G?nX:oX}default:throw new N("toolbox_utxo_not_supported",{chain:Z})}}}import{SwapKitError as R}from"@swapkit/helpers";import HX from"bs58check";import CX from"cashaddrjs";var vX;((G)=>{G.Mainnet="mainnet";G.Testnet="testnet"})(vX||={});var z={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function IX(X){try{return u(X),!0}catch(Z){return!1}}function _X(X){return u(X)?.network}function x(X){let Z=u(X);if(Z?.format==="legacy")return X;return iX(Z)}function c(X){let Z=u(X);return aX(Z)}function u(X){try{return dX(X)}catch(Z){}try{return rX(X)}catch(Z){}throw new R("toolbox_utxo_invalid_address",{address:X})}function dX(X){try{let Z=HX.decode(X);if(Z.length!==21)throw new R("toolbox_utxo_invalid_address",{address:X});let G=Z[0],J=Array.prototype.slice.call(Z,1);switch(G){case z.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case z.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case z.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case z.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case z.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case z.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new R("toolbox_utxo_invalid_address",{address:X})}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function rX(X){if(X.indexOf(":")!==-1)try{return YX(X)}catch(Z){}else{let Z=["bitcoincash","bchtest","bchreg"];for(let G of Z)try{return YX(`${G}:${X}`)}catch(J){}}throw new R("toolbox_utxo_invalid_address",{address:X})}function YX(X){try{let{hash:Z,prefix:G,type:J}=CX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(Z,0),network:G==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(Z){throw new R("toolbox_utxo_invalid_address",{address:X})}}function iX(X){let Z=z.legacy[X.network][X.type],G=Buffer.alloc(1+X.hash.length);return G[0]=Z,G.set(X.hash,1),HX.encode(G)}function aX(X){let Z=X.network==="mainnet"?"bitcoincash":"bchtest",G=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return CX.encode(Z,G,J)}import{Chain as P,SwapKitError as sX}from"@swapkit/helpers";var t=(X)=>{switch(X){case P.Bitcoin:case P.BitcoinCash:return 550;case P.Dash:case P.Litecoin:return 5500;case P.Dogecoin:return 1e5;case P.Zcash:return 546;default:throw new sX("toolbox_utxo_not_supported",{chain:X})}},k=({inputs:X,outputs:Z,feeRate:G=1,chain:J=P.Bitcoin})=>{let Q=Math.ceil(G),L=X[0]&&"address"in X[0]&&X[0].address?o(X[0].address):"P2PKH",$=X.filter((D)=>V(D)*Q<=D.value),W=e+Z.reduce((D,T)=>D+p(T,L),0),q=Z.reduce((D,T)=>D+T.value,0),j=W*Q,B=0,U=[];for(let D of $){let T=V(D),M=Q*T;j+=M,B+=D.value,U.push(D);let H=j+q;if(B<H)continue;let O=B-H,WX=Q*p({address:"",value:0},L);if(O>WX){let qX=WX+j,jX=B-(q+qX);if(jX>Math.max(V({})*Q,t(J)))return{inputs:U,outputs:Z.concat({value:jX,address:""}),fee:qX}}return{inputs:U,outputs:Z,fee:j}}return{fee:Q*g({inputs:X,outputs:Z,feeRate:Q})}};import{SwapKitError as tX}from"@swapkit/helpers";import{opcodes as eX,script as XZ}from"bitcoinjs-lib";var UG=1000,e=10,ZZ=10,GZ=41,JZ=107;function A(X){let Z=Buffer.from(X,"utf8");return XZ.compile([eX.OP_RETURN,Z])}var XX;((G)=>{G.P2PKH="P2PKH";G.P2WPKH="P2WPKH"})(XX||={});var ZX={["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 tX("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>=ZX["type"in $?$.type:"P2PKH"]*Math.ceil(G)).reduce(($,W)=>$+V(W),0),L=Z?.reduce(($,W)=>$+p(W),0)||n[J];return e+Q+L},V=(X)=>{if("type"in X)return ZX[X.type];if("address"in X&&X.address)return ZX[o(X.address)];return GZ+JZ},p=(X,Z)=>{if(X?.script)return ZZ+X.script.length+(X.script.length>=74?2:1);if(Z)return n[Z];return n.P2PKH};import{AssetValue as $X,Chain as v,DerivationPath as IZ,FeeOption as y,NetworkDerivationPath as _Z,SwapKitError as F,SwapKitNumber as FZ,applyFeeMultiplier as PX,derivationPathToString as OZ,updateDerivationPath as NZ}from"@swapkit/helpers";import{Psbt as yZ,address as PZ,initEccLib as RX,payments as VX}from"bitcoinjs-lib";import{ECPairFactory as VZ}from"ecpair";import LX from"@bitcoinerlab/secp256k1";import{ECPair as kZ,HDNode as AZ}from"@psf/bitcoincashjs-lib";import{HDKey as RZ}from"@scure/bip32";import{mnemonicToSeedSync as kX}from"@scure/bip39";import QZ from"@bitcoinerlab/secp256k1";import{HDKey as $Z}from"@scure/bip32";import{mnemonicToSeedSync as LZ}from"@scure/bip39";import{Chain as JX,FeeOption as WZ,NetworkDerivationPath as qZ,SKConfig as FX,SwapKitError as jZ,derivationPathToString as BZ,updateDerivationPath as DZ}from"@swapkit/helpers";import{hash160 as UZ}from"bitcoinjs-lib/src/crypto";import OX from"bs58check";import{ECPairFactory as zZ}from"ecpair";import{P as GX,match as MZ}from"ts-pattern";var TZ=JX.Zcash,NX=C()(TZ);function YZ(X,Z=!1){let G=UZ(X),J=Z?Buffer.from([28,186]):Buffer.from([28,184]),Q=Buffer.concat([J,G]);return OX.encode(Q)}function QX(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}=FX.get("envs");if(Z&&J||G&&!J)return!1;return HZ(X,NX)}catch{return!1}}function HZ(X,Z){try{let G=OX.decode(X);if(G.length<21)return!1;let J=G[0];return J===Z.pubKeyHash||J===Z.scriptHash}catch{return!1}}var CZ=zZ(QZ);async function vZ({phrase:X,derivationPathString:Z}){let G=LZ(X),Q=$Z.fromMasterSeed(G).derive(Z);if(!Q.privateKey)throw new Error("Unable to derive private key");let L=CZ.fromPrivateKey(Buffer.from(Q.privateKey),{network:NX}),{isStagenet:$}=FX.get("envs"),W=YZ(L.publicKey,$);return{getAddress(){return Promise.resolve(W)},signTransaction(q){for(let j=0;j<q.inputCount;j++)q.signInput(j,L);return Promise.resolve(q)}}}async function yX(X){let Z=await MZ(X).with({signer:GX.not(GX.nullish)},({signer:W})=>Promise.resolve(W)).with({phrase:GX.string},({phrase:W,derivationPath:q,index:j=0})=>{let B=q||qZ[JX.Zcash]||[44,133,0,0,0],U=DZ(B,{index:j}),D=BZ(U);return vZ({phrase:W,derivationPathString:D})}).otherwise(()=>Promise.resolve(void 0)),{getFeeRates:G,broadcastTx:J,...Q}=await b({chain:JX.Zcash,signer:Z});function L(W){return W.getAddress()}async function $({recipient:W,assetValue:q,feeOptionKey:j=WZ.Fast,...B}){let U=await Z?.getAddress();if(!(Z&&U))throw new jZ("toolbox_utxo_no_signer");let D=B.feeRate||(await G())[j],T={...B,assetValue:q,feeRate:D,recipient:W,sender:U},{psbt:M}=await Q.createTransaction(T),H=await Z.signTransaction(M);H.finalizeAllInputs();let O=H.extractTransaction().toHex();return J(O)}return{...Q,broadcastTx:J,getFeeRates:G,transfer:$,getAddressFromKeys:L,validateAddress:QX}}var d=[v.Dash,v.Dogecoin];function bZ({inputs:X,outputs:Z,chain:G,psbt:J,sender:Q,compiledMemo:L}){for(let $ of X){let W=!!$.witnessUtxo&&!d.includes(G)&&{witnessUtxo:$.witnessUtxo},q=d.includes(G)&&{nonWitnessUtxo:$.txHex?Buffer.from($.txHex,"hex"):void 0};J.addInput({hash:$.hash,index:$.index,...W,...q})}for(let $ of Z){let W="address"in $&&$.address?$.address:Q,q=$.script;if(q&&!L)continue;let j=q?{script:L,value:0}:{address:W,value:$.value};RX(LX),J.addOutput(j)}return{psbt:J,inputs:X}}async function bX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q,fetchTxHex:L=!1}){let $=X.chain,W=G?await A(G):null,q=await fX({assetValue:X,recipient:Z,memo:G,sender:Q,fetchTxHex:L}),{inputs:j,outputs:B}=k({...q,feeRate:J,chain:$});if(!(j&&B))throw new F("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let U=await C(),D=new yZ({network:U($)});if($===v.Dogecoin)D.setMaximumFeeRate(650000000);let{psbt:T,inputs:M}=await bZ({inputs:j,outputs:B,chain:$,psbt:D,sender:Q,compiledMemo:W});return{psbt:T,utxos:q.inputs,inputs:M}}async function wZ(){let X=await C();return function Z({address:G,chain:J}){if(J===v.BitcoinCash)return w(G);if(J===v.Zcash)return QX(G);try{return RX(LX),PZ.toOutputScript(G,X(J)),!0}catch(Q){return!1}}}async function KZ({chain:X,phrase:Z,derivationPath:G}){let J=(await r(X))({phrase:Z,derivationPath:G});async function Q($){return await $.signAllInputs(J),$}async function L(){return(await KX(X))(J)}return{getAddress:L,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=OZ("derivationPath"in Z&&Z.derivationPath?Z.derivationPath:NZ(_Z[X],{index:J})),L=G?await KZ({chain:X,phrase:G,derivationPath:Q}):("signer"in Z)?Z.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let W=await KX(X),q=await wZ(),j=await r(X);return{accumulative:k,calculateTxSize:g,getAddressFromKeys:W,getAddress:$,validateAddress:(B)=>q({address:B,chain:X}),broadcastTx:(B)=>_(X).broadcastTx(B),createTransaction:bX,createKeysForPath:j,getFeeRates:()=>i(X),getInputsOutputsFee:wX,transfer:SZ(L),getPrivateKeyFromMnemonic:(B)=>{return j(B).toWIF()},getBalance:AX(X),estimateTransactionFee:EZ(X),estimateMaxSendableAmount:fZ(X)}}async function wX({assetValue:X,feeOptionKey:Z=y.Fast,feeRate:G,memo:J,sender:Q,recipient:L}){let $=X.chain,W=await fX({assetValue:X,sender:Q,memo:J,recipient:L}),q=G?Math.floor(G):(await i($))[Z];return k({...W,feeRate:q,chain:$})}function fZ(X){return async function Z({from:G,memo:J,feeRate:Q,feeOptionKey:L=y.Fast,recipients:$=1}){let W=await _(X).getAddressData(G),q=Q?Math.ceil(Q):(await i(X))[L],j=W?.utxo.map((M)=>({...M,type:"P2PKH",hash:""})).filter((M)=>M.value>Math.max(t(X),V(M)*q));if(!j?.length)return $X.from({chain:X});let B=$X.from({chain:X,value:j.reduce((M,H)=>M+H.value,0)}),U=typeof $==="number"?Array.from({length:$},()=>({address:G,value:0})):$;if(J){let M=await A(J);U.push({address:G,script:M,value:0})}let T=g({inputs:j,outputs:U,feeRate:q})*q;return B.sub(T)}}function EZ(X){return async(Z)=>{let G=await wX(Z);return $X.from({chain:X,value:FZ.fromBigInt(BigInt(G.fee),8).getValue("string")})}}async function r(X){let Z=await C();switch(X){case v.BitcoinCash:return function G({phrase:J,derivationPath:Q=`${IZ.BCH}/0`,wif:L}){let $=Z(X);if(L)return kZ.fromWIF(L,$);if(!J)throw new F("toolbox_utxo_invalid_params",{error:"No phrase provided"});return AZ.fromSeedBuffer(Buffer.from(kX(J)),$).derivePath(Q).keyPair};case v.Bitcoin:case v.Dogecoin:case v.Litecoin:case v.Zcash:case v.Dash:return function G({phrase:J,wif:Q,derivationPath:L}){if(!(Q||J))throw new F("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let $=VZ(LX),W=Z(X);if(Q)return $.fromWIF(Q,W);let q=kX(J),j=RZ.fromMasterSeed(q,W).derive(L);if(!j.privateKey)throw new F("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return $.fromPrivateKey(Buffer.from(j.privateKey),{network:W})};default:throw new F("toolbox_utxo_not_supported",{chain:X})}}async function KX(X){let Z=await C();return function G(J){if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let Q=d.includes(X)?VX.p2pkh:VX.p2wpkh,{address:L}=Q({pubkey:J.publicKey,network:Z(X)});if(!L)throw new F("toolbox_utxo_invalid_address",{error:"Address not defined"});return L}}function SZ(X){return async function Z({memo:G,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:$}){let W=await X?.getAddress(),q=$.chain;if(!(X&&W))throw new F("toolbox_utxo_no_signer");if(!J)throw new F("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=L||(await i(q))[Q||y.Fast],{psbt:B}=await bX({recipient:J,feeRate:j,sender:W,assetValue:$,memo:G}),U=await X.signTransaction(B);return U.finalizeAllInputs(),_(q).broadcastTx(U.extractTransaction().toHex())}}async function i(X){let Z=await _(X).getSuggestedTxFee();return{[y.Average]:Z,[y.Fast]:PX(Z,y.Fast),[y.Fastest]:PX(Z,y.Fastest)}}async function fX({assetValue:X,recipient:Z,memo:G,sender:J,fetchTxHex:Q=!1}){let L=X.chain,$=Q||d.includes(L);return{inputs:await _(L).scanUTXOs({address:J,fetchTxHex:$}),outputs:[{address:Z,value:Number(X.bigIntValue)},...G?[{address:"",script:await A(G),value:0}]:[]]}}var I=lZ.BitcoinCash;function m(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function w(X){let Z=m(X);return IX(Z)&&_X(Z)==="mainnet"}function f(X){return m(c(X))}async function nZ(X){async function Z({builder:J,utxos:Q}){return Q.forEach((L,$)=>{J.sign($,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(f(J))},signTransaction:Z}}async function EX(X){let Z="phrase"in X?X.phrase:void 0,G="index"in X?X.index||0:0,J=uZ("derivationPath"in X&&X.derivationPath?X.derivationPath:pZ(cZ[I],{index:G})),Q=(await r(I))({phrase:Z,derivationPath:J}),L=Q?await nZ(Q):("signer"in X)?X.signer:void 0;function $(){return Promise.resolve(L?.getAddress())}let{getBalance:W,getFeeRates:q,broadcastTx:j,...B}=await b({chain:I});function U(D,T=!0){return W(m(c(D)))}return{...B,getAddress:$,broadcastTx:j,createTransaction:SX,buildTx:rZ,getAddressFromKeys:iZ,getBalance:U,getFeeRates:q,stripPrefix:m,stripToCashAddress:f,validateAddress:w,transfer:dZ({getFeeRates:q,broadcastTx:j,signer:L})}}async function SX({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){if(!w(Z))throw new K("toolbox_utxo_invalid_address",{address:Z});let L=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),$=G?await A(G):null,W=[];W.push({address:Z,value:X.getBaseValue("number")});let{inputs:q,outputs:j}=k({inputs:L,outputs:W,feeRate:J,chain:I});if(!(q&&j))throw new K("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let B=await C(),U=new gZ(B(I));await Promise.all(q.map(async(D)=>{let T=await _(I).getRawTx(D.hash);U.addInput(xZ.fromBuffer(Buffer.from(T,"hex")),D.index)}));for(let D of j){let T="address"in D&&D.address?D.address:x(Q),M=await C(),H=mZ.toOutputScript(x(T),M(I));U.addOutput(H,D.value)}if($)U.addOutput($,0);return{builder:U,utxos:q}}function dZ({broadcastTx:X,getFeeRates:Z,signer:G}){return async function J({recipient:Q,assetValue:L,feeOptionKey:$=hZ.Fast,...W}){let q=await G?.getAddress();if(!(G&&q))throw new K("toolbox_utxo_no_signer");if(!Q)throw new K("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let j=W.feeRate||(await Z())[$],{builder:B,utxos:U}=await SX({...W,assetValue:L,feeRate:j,recipient:Q,sender:q}),T=(await G.signTransaction({builder:B,utxos:U})).toHex();return X(T)}}async function rZ({assetValue:X,recipient:Z,memo:G,feeRate:J,sender:Q}){let L=c(Z);if(!w(L))throw new K("toolbox_utxo_invalid_address",{address:L});let $=await _(I).scanUTXOs({address:f(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=G?await A(G):null,j=[];if(j.push({address:x(Z),value:X.getBaseValue("number")}),q)j.push({script:q,value:0});let{inputs:B,outputs:U}=k({inputs:$,outputs:j,feeRate:W,chain:I});if(!(B&&U))throw new K("toolbox_utxo_insufficient_balance",{sender:Q,assetValue:X});let D=await C(),T=new oZ({network:D(I)});for(let{hash:M,index:H,witnessUtxo:O}of B)T.addInput({hash:M,index:H,witnessUtxo:O});for(let M of U){let H="address"in M&&M.address?M.address:x(Q),O=M.script?q?{script:q,value:0}:void 0:{address:H,value:M.value};if(O)T.addOutput(O)}return{psbt:T,utxos:$,inputs:B}}function iZ(X){let Z=X.getAddress(0);return f(Z)}async function tG(X,Z){switch(X){case E.BitcoinCash:return await EX(Z);case E.Zcash:return await yX(Z);case E.Bitcoin:case E.Dogecoin:case E.Litecoin:case E.Dash:return await b({chain:X,...Z});default:throw new aZ("toolbox_utxo_not_supported",{chain:X})}}export{QX as validateZcashAddress,x as toLegacyAddress,c as toCashAddress,f as stripToCashAddress,m as stripPrefix,d as nonSegwitChains,IX as isValidAddress,tG as getUtxoToolbox,C as getUtxoNetwork,_ as getUtxoApi,wZ as getUTXOAddressValidator,o as getScriptTypeForAddress,p as getOutputSize,V as getInputSize,t as getDustThreshold,r as getCreateKeysForPath,_X as detectAddressNetwork,yX as createZcashToolbox,b as createUTXOToolbox,ZG as createCustomUtxoApi,EX as createBCHToolbox,A as compileMemo,g as calculateTxSize,w as bchValidateAddress,KX as addressFromKeysGetter,k as accumulative,vX as UtxoNetwork,XX as UTXOScriptType,e as TX_OVERHEAD,n as OutputSizes,ZZ as OP_RETURN_OVERHEAD,UG as MIN_TX_FEE,ZX as InputSizes};
4
4
 
5
5
  //# debugId=57E42E1F305AB10A64756E2164756E21
6
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "@solana/spl-memo": "^0.2.5",
19
19
  "@solana/spl-token": "^0.4.13",
20
20
  "@solana/web3.js": "^1.98.0",
21
- "@swapkit/helpers": "^4.0.0-beta.24",
21
+ "@swapkit/helpers": "^4.0.0-beta.25",
22
22
  "base64-js": "^1.5.1",
23
23
  "bitcoinjs-lib": "^6.1.0",
24
24
  "bs58check": "^4.0.0",
@@ -59,7 +59,7 @@
59
59
  "@solana/spl-memo": "0.2.5",
60
60
  "@solana/spl-token": "0.4.13",
61
61
  "@solana/web3.js": "1.98.2",
62
- "@swapkit/helpers": "4.0.0-beta.24",
62
+ "@swapkit/helpers": "4.0.0-beta.25",
63
63
  "@types/bn.js": "5.2.0",
64
64
  "@types/crypto-js": "4.2.2",
65
65
  "@types/elliptic": "6.4.18",
@@ -154,5 +154,5 @@
154
154
  "type-check:go": "tsgo"
155
155
  },
156
156
  "type": "module",
157
- "version": "4.0.0-beta.35"
157
+ "version": "4.0.0-beta.37"
158
158
  }
@@ -94,7 +94,7 @@ export async function createStargateClient(url: string) {
94
94
 
95
95
  export async function createSigningStargateClient(
96
96
  url: string,
97
- signer: any,
97
+ signer: OfflineSigner,
98
98
  optionsOrBaseGas: string | SigningStargateClientOptions = {},
99
99
  ) {
100
100
  const { SigningStargateClient, GasPrice } = (await import("@cosmjs/stargate")).default;
package/src/index.ts CHANGED
@@ -27,7 +27,7 @@ export async function getAddressValidator() {
27
27
  const { substrateValidateAddress } = await import("@swapkit/toolboxes/substrate");
28
28
  const { getUTXOAddressValidator } = await import("@swapkit/toolboxes/utxo");
29
29
  const { getSolanaAddressValidator } = await import("@swapkit/toolboxes/solana");
30
- const { validateNearAddress } = await import("@swapkit/toolboxes/near");
30
+ const { getValidateNearAddress } = await import("@swapkit/toolboxes/near");
31
31
  const { rippleValidateAddress } = await import("@swapkit/toolboxes/ripple");
32
32
  const { radixValidateAddress } = await import("@swapkit/toolboxes/radix");
33
33
  const { getTronAddressValidator } = await import("@swapkit/toolboxes/tron");
@@ -35,6 +35,7 @@ export async function getAddressValidator() {
35
35
  const solanaValidateAddress = await getSolanaAddressValidator();
36
36
  const utxoValidateAddress = await getUTXOAddressValidator();
37
37
  const tronValidateAddress = await getTronAddressValidator();
38
+ const nearValidateAddress = await getValidateNearAddress();
38
39
 
39
40
  return function validateAddress({ address, chain }: { address: string; chain: Chain }) {
40
41
  const isValid = match(chain)
@@ -58,7 +59,7 @@ export async function getAddressValidator() {
58
59
  substrateValidateAddress({ address, chain: chain as SubstrateChain }),
59
60
  )
60
61
  .with(Chain.Radix, () => radixValidateAddress(address))
61
- .with(Chain.Near, () => validateNearAddress(address))
62
+ .with(Chain.Near, () => nearValidateAddress(address))
62
63
  .with(Chain.Ripple, () => rippleValidateAddress(address))
63
64
  .with(Chain.Solana, () => solanaValidateAddress(address))
64
65
  .with(Chain.Tron, () => tronValidateAddress(address))
@@ -3,16 +3,18 @@ import { type DerivationPathArray, SwapKitError, derivationPathToString } from "
3
3
  import { type KeyPair, KeyPairSigner } from "near-api-js";
4
4
  import type { NearSigner } from "../types";
5
5
 
6
- export async function validateNearAddress(address: string) {
7
- // Use the official NEAR SDK validation function if available
8
- try {
9
- const { validateAccountId } = await import("near-sdk-js");
10
- return validateAccountId(address);
11
- } catch {
12
- const ACCOUNT_ID_REGEX = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
13
-
14
- return address.length >= 2 && address.length <= 64 && ACCOUNT_ID_REGEX.test(address);
15
- }
6
+ export async function getValidateNearAddress() {
7
+ const { validateAccountId } = await import("near-sdk-js");
8
+ return (address: string) => {
9
+ // Use the official NEAR SDK validation function if available
10
+ try {
11
+ return validateAccountId(address);
12
+ } catch {
13
+ const ACCOUNT_ID_REGEX = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
14
+
15
+ return address.length >= 2 && address.length <= 64 && ACCOUNT_ID_REGEX.test(address);
16
+ }
17
+ };
16
18
  }
17
19
 
18
20
  export async function getNearSignerFromPhrase(params: {
@@ -12,7 +12,7 @@ import {
12
12
  getFullAccessPublicKey,
13
13
  getNearSignerFromPhrase,
14
14
  getNearSignerFromPrivateKey,
15
- validateNearAddress,
15
+ getValidateNearAddress,
16
16
  } from "./helpers";
17
17
  import {
18
18
  GAS_COSTS,
@@ -74,7 +74,9 @@ export async function getNearToolbox(toolboxParams?: NearToolboxParams) {
74
74
 
75
75
  const { recipient, assetValue } = params;
76
76
 
77
- if (!validateNearAddress(recipient)) {
77
+ const nearValidateAddress = await getValidateNearAddress();
78
+
79
+ if (!nearValidateAddress(recipient)) {
78
80
  throw new SwapKitError("toolbox_near_invalid_address");
79
81
  }
80
82
 
@@ -108,7 +110,7 @@ export async function getNearToolbox(toolboxParams?: NearToolboxParams) {
108
110
  amount: transferAmount,
109
111
  });
110
112
 
111
- return result.transaction.hash;
113
+ return result.transaction_outcome.id;
112
114
  } catch (error) {
113
115
  throw new SwapKitError("toolbox_near_transfer_failed", { error });
114
116
  }
@@ -116,6 +118,15 @@ export async function getNearToolbox(toolboxParams?: NearToolboxParams) {
116
118
 
117
119
  async function createTransaction(params: NearCreateTransactionParams) {
118
120
  const { recipient, assetValue, memo, feeRate: gas, attachedDeposit, sender: signerId } = params;
121
+ const validateNearAddress = await getValidateNearAddress();
122
+
123
+ if (!validateNearAddress(recipient)) {
124
+ throw new SwapKitError("toolbox_near_invalid_address", { address: recipient });
125
+ }
126
+
127
+ if (!validateNearAddress(signerId)) {
128
+ throw new SwapKitError("toolbox_near_invalid_address", { address: signerId });
129
+ }
119
130
 
120
131
  // Handle NEP-141 token transfers
121
132
  if (!assetValue.isGasAsset) {
@@ -333,7 +344,7 @@ export async function getNearToolbox(toolboxParams?: NearToolboxParams) {
333
344
  actions: [functionAction],
334
345
  });
335
346
 
336
- return result.transaction.hash;
347
+ return result.transaction_outcome.id;
337
348
  } catch (error) {
338
349
  throw new SwapKitError("toolbox_near_transfer_failed", { error });
339
350
  }
@@ -480,7 +491,7 @@ export async function getNearToolbox(toolboxParams?: NearToolboxParams) {
480
491
  broadcastTransaction,
481
492
  signTransaction,
482
493
  getBalance,
483
- validateAddress: validateNearAddress,
494
+ validateAddress: await getValidateNearAddress(),
484
495
  getSignerFromPhrase: (params: {
485
496
  phrase: string;
486
497
  derivationPath?: DerivationPathArray;
package/src/near/types.ts CHANGED
@@ -9,14 +9,14 @@ import type { KeyPairSigner, Signer, transactions } from "near-api-js";
9
9
  interface NearKeyPairSigner
10
10
  extends KeyPairSigner,
11
11
  Omit<
12
- ChainSigner<transactions.Transaction, transactions.SignedTransaction>,
12
+ ChainSigner<typeof transactions.Transaction, typeof transactions.SignedTransaction>,
13
13
  "signTransaction"
14
14
  > {}
15
15
 
16
16
  interface NearGeneralSigner
17
17
  extends Signer,
18
18
  Omit<
19
- ChainSigner<transactions.Transaction, transactions.SignedTransaction>,
19
+ ChainSigner<typeof transactions.Transaction, typeof transactions.SignedTransaction>,
20
20
  "signTransaction"
21
21
  > {}
22
22
 
package/src/tron/index.ts CHANGED
@@ -9,6 +9,7 @@ export type {
9
9
  TronTransferParams,
10
10
  TronContract,
11
11
  TronTransaction,
12
+ TronSignedTransaction,
12
13
  } from "./types";
13
14
  export { trc20ABI } from "./helpers/trc20.abi";
14
15
 
@@ -131,6 +131,77 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
131
131
  return 100_000_000; // 100 TRX in SUN
132
132
  };
133
133
 
134
+ // Constants for TRON resource calculation
135
+ const TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer
136
+ const TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer
137
+ const TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer
138
+
139
+ /**
140
+ * Get current chain parameters including resource prices
141
+ */
142
+ const getChainParameters = async () => {
143
+ try {
144
+ const parameters = await tronWeb.trx.getChainParameters();
145
+ const paramMap: Record<string, number> = {};
146
+
147
+ for (const param of parameters) {
148
+ paramMap[param.key] = param.value;
149
+ }
150
+
151
+ return {
152
+ energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit
153
+ bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit
154
+ createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN
155
+ };
156
+ } catch {
157
+ // Return default values if unable to fetch
158
+ return {
159
+ energyFee: 420,
160
+ bandwidthFee: 1000,
161
+ createAccountFee: 100000,
162
+ };
163
+ }
164
+ };
165
+
166
+ /**
167
+ * Check if an address exists on the blockchain
168
+ */
169
+ const accountExists = async (address: string) => {
170
+ try {
171
+ const account = await tronWeb.trx.getAccount(address);
172
+ return account && Object.keys(account).length > 0;
173
+ } catch {
174
+ return false;
175
+ }
176
+ };
177
+
178
+ /**
179
+ * Get account resources (bandwidth and energy)
180
+ */
181
+ const getAccountResources = async (address: string) => {
182
+ try {
183
+ const resources = await tronWeb.trx.getAccountResources(address);
184
+
185
+ return {
186
+ bandwidth: {
187
+ free: resources.freeNetLimit - resources.freeNetUsed,
188
+ total: resources.NetLimit || 0,
189
+ used: resources.NetUsed || 0,
190
+ },
191
+ energy: {
192
+ total: resources.EnergyLimit || 0,
193
+ used: resources.EnergyUsed || 0,
194
+ },
195
+ };
196
+ } catch {
197
+ // Return default structure if unable to fetch
198
+ return {
199
+ bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily
200
+ energy: { total: 0, used: 0 },
201
+ };
202
+ }
203
+ };
204
+
134
205
  const getBalance = async (address: string, scamFilter = true) => {
135
206
  const { getBalance: getBalanceFromApi } = await import("../utils.js");
136
207
 
@@ -218,7 +289,7 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
218
289
  }
219
290
 
220
291
  const feeLimit = calculateFeeLimit();
221
- const contract = await tronWeb.contract(trc20ABI, contractAddress);
292
+ const contract = tronWeb.contract(trc20ABI, contractAddress);
222
293
 
223
294
  if (!contract.methods?.transfer) {
224
295
  throw new SwapKitError("toolbox_tron_token_transfer_failed");
@@ -239,17 +310,94 @@ export const createTronToolbox = async (options: TronToolboxOptions = {}) => {
239
310
  return txid;
240
311
  };
241
312
 
242
- const estimateTransactionFee = ({ assetValue }: TronTransferParams) => {
313
+ const estimateTransactionFee = async ({
314
+ assetValue,
315
+ recipient,
316
+ sender,
317
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>
318
+ }: TronTransferParams & { sender?: string }) => {
243
319
  const isNative = assetValue.isGasAsset;
244
320
 
245
- if (isNative) {
246
- // Native TRX transfers typically consume bandwidth, which is free up to daily limit
247
- // Return a minimal fee estimation for bandwidth cost
248
- return AssetValue.from({ chain: Chain.Tron, value: 1 }); // 1 TRX
249
- }
321
+ try {
322
+ // Get sender address
323
+ const senderAddress = sender ? sender : signer ? await getAddress() : undefined;
324
+ if (!senderAddress) {
325
+ // If no signer, return conservative estimate
326
+ return isNative
327
+ ? AssetValue.from({ chain: Chain.Tron, value: 0.1, fromBaseDecimal: 0 })
328
+ : AssetValue.from({ chain: Chain.Tron, value: 15, fromBaseDecimal: 0 });
329
+ }
250
330
 
251
- // TRC20 transfers consume energy, estimate higher fee
252
- return AssetValue.from({ chain: Chain.Tron, value: 10 }); // 10 TRX
331
+ // Get chain parameters for current resource prices
332
+ const chainParams = await getChainParameters();
333
+
334
+ // Check if recipient account exists (new accounts require activation fee)
335
+ const recipientExists = await accountExists(recipient);
336
+ const activationFee = recipientExists ? 0 : chainParams.createAccountFee;
337
+
338
+ // Get account resources
339
+ const resources = await getAccountResources(senderAddress);
340
+
341
+ if (isNative) {
342
+ // Calculate bandwidth needed for TRX transfer
343
+ const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;
344
+ const availableBandwidth =
345
+ resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);
346
+
347
+ let bandwidthFee = 0;
348
+ if (bandwidthNeeded > availableBandwidth) {
349
+ // Need to burn TRX for bandwidth
350
+ const bandwidthToBuy = bandwidthNeeded - availableBandwidth;
351
+ bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;
352
+ }
353
+
354
+ // Total fee in SUN
355
+ const totalFeeSun = activationFee + bandwidthFee;
356
+
357
+ return AssetValue.from({
358
+ chain: Chain.Tron,
359
+ value: totalFeeSun,
360
+ fromBaseDecimal: 6, // SUN to TRX
361
+ });
362
+ }
363
+
364
+ // TRC20 Transfer - needs both bandwidth and energy
365
+ const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;
366
+ const energyNeeded = TRC20_TRANSFER_ENERGY;
367
+
368
+ const availableBandwidth =
369
+ resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);
370
+ const availableEnergy = resources.energy.total - resources.energy.used;
371
+
372
+ let bandwidthFee = 0;
373
+ if (bandwidthNeeded > availableBandwidth) {
374
+ const bandwidthToBuy = bandwidthNeeded - availableBandwidth;
375
+ bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;
376
+ }
377
+
378
+ let energyFee = 0;
379
+ if (energyNeeded > availableEnergy) {
380
+ const energyToBuy = energyNeeded - availableEnergy;
381
+ energyFee = energyToBuy * chainParams.energyFee;
382
+ }
383
+
384
+ // Total fee in SUN
385
+ const totalFeeSun = activationFee + bandwidthFee + energyFee;
386
+
387
+ return AssetValue.from({
388
+ chain: Chain.Tron,
389
+ value: totalFeeSun,
390
+ fromBaseDecimal: 6, // SUN to TRX
391
+ });
392
+ } catch (error) {
393
+ // Fallback to conservative estimates if calculation fails
394
+ warnOnce(
395
+ true,
396
+ `Failed to calculate exact fee, using conservative estimate: ${error instanceof Error ? error.message : error}`,
397
+ );
398
+
399
+ throw new SwapKitError("toolbox_tron_fee_estimation_failed", { error });
400
+ }
253
401
  };
254
402
 
255
403
  const createTransaction = async (params: TronCreateTransactionParams) => {