@tcswap/toolboxes 4.3.15 → 4.3.16
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/cardano/index.cjs +4 -0
- package/dist/cardano/index.cjs.map +11 -0
- package/dist/cardano/index.js +4 -0
- package/dist/cardano/index.js.map +11 -0
- package/dist/cosmos/index.cjs +4 -0
- package/dist/cosmos/index.cjs.map +20 -0
- package/dist/cosmos/index.js +4 -0
- package/dist/cosmos/index.js.map +20 -0
- package/dist/evm/index.cjs +4 -0
- package/dist/evm/index.cjs.map +20 -0
- package/dist/evm/index.js +4 -0
- package/dist/evm/index.js.map +20 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +67 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +67 -0
- package/dist/near/index.cjs +4 -0
- package/dist/near/index.cjs.map +16 -0
- package/dist/near/index.js +4 -0
- package/dist/near/index.js.map +16 -0
- package/dist/radix/index.cjs +4 -0
- package/dist/radix/index.cjs.map +10 -0
- package/dist/radix/index.js +4 -0
- package/dist/radix/index.js.map +10 -0
- package/dist/ripple/index.cjs +4 -0
- package/dist/ripple/index.cjs.map +10 -0
- package/dist/ripple/index.js +4 -0
- package/dist/ripple/index.js.map +10 -0
- package/dist/solana/index.cjs +4 -0
- package/dist/solana/index.cjs.map +11 -0
- package/dist/solana/index.js +4 -0
- package/dist/solana/index.js.map +11 -0
- package/dist/substrate/index.cjs +4 -0
- package/dist/substrate/index.cjs.map +13 -0
- package/dist/substrate/index.js +4 -0
- package/dist/substrate/index.js.map +13 -0
- package/dist/sui/index.cjs +4 -0
- package/dist/sui/index.cjs.map +11 -0
- package/dist/sui/index.js +4 -0
- package/dist/sui/index.js.map +11 -0
- package/dist/ton/index.cjs +4 -0
- package/dist/ton/index.cjs.map +11 -0
- package/dist/ton/index.js +4 -0
- package/dist/ton/index.js.map +11 -0
- package/dist/tron/index.cjs +4 -0
- package/dist/tron/index.cjs.map +13 -0
- package/dist/tron/index.js +4 -0
- package/dist/tron/index.js.map +13 -0
- package/dist/types/solana/toolbox.d.ts.map +1 -1
- package/dist/utxo/index.cjs +5 -0
- package/dist/utxo/index.cjs.map +21 -0
- package/dist/utxo/index.js +5 -0
- package/dist/utxo/index.js.map +21 -0
- package/package.json +28 -28
- package/src/solana/toolbox.ts +14 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tron/helpers/trc20.abi.ts", "../src/tron/helpers/trongrid.ts", "../src/tron/toolbox.ts", "../src/tron/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export const trc20ABI = [\n {\n constant: true,\n inputs: [{ name: \"_owner\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transfer\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n { name: \"_owner\", type: \"address\" },\n { name: \"_spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_spender\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n { name: \"_from\", type: \"address\" },\n { name: \"_to\", type: \"address\" },\n { name: \"_value\", type: \"uint256\" },\n ],\n name: \"transferFrom\",\n outputs: [{ name: \"success\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_from\", type: \"address\" },\n { indexed: true, name: \"_to\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: \"_owner\", type: \"address\" },\n { indexed: true, name: \"_spender\", type: \"address\" },\n { indexed: false, name: \"_value\", type: \"uint256\" },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n] as const;\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { USwapError } from \"@tcswap/helpers\";\nimport type { TronGridAccountResponse } from \"../types\";\n\nconst TRONGRID_API_BASE = \"https://api.trongrid.io\";\n\n/**\n * Fetch account information including TRC20 balances from TronGrid API\n */\nexport async function fetchAccountFromTronGrid(address: string) {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n try {\n const response = await fetch(`${TRONGRID_API_BASE}/v1/accounts/${address}`);\n\n if (!response.ok) {\n throw new Error(`TronGrid API error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as TronGridAccountResponse;\n\n if (!(data.success && data.data) || data.data.length === 0) {\n throw new Error(\"Invalid response from TronGrid API\");\n }\n\n // Convert search address to hex format for comparison\n let searchAddressHex: string;\n try {\n // If address is base58, convert to hex\n searchAddressHex = TronWeb.address.toHex(address).toLowerCase();\n } catch {\n // If conversion fails, assume it's already hex\n searchAddressHex = address.toLowerCase();\n }\n\n // Find the account that matches the requested address\n const account = data.data.find((acc) => {\n return acc.address.toLowerCase() === searchAddressHex;\n });\n\n if (!account) {\n return;\n }\n\n // Return simplified object with balance and trc20 array\n return { balance: account.balance, trc20: account.trc20 || [] };\n } catch (error) {\n throw new USwapError(\"toolbox_tron_trongrid_api_error\", {\n address,\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n}\n",
|
|
7
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n derivationPathToString,\n getRPCUrl,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n warnOnce,\n} from \"@tcswap/helpers\";\nimport type { TronWeb } from \"tronweb\";\nimport { match, P } from \"ts-pattern\";\nimport { trc20ABI } from \"./helpers/trc20.abi\";\nimport { fetchAccountFromTronGrid } from \"./helpers/trongrid\";\nimport type {\n TronApprovedParams,\n TronApproveParams,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\n// Constants for TRON resource calculation\nconst TRX_TRANSFER_BANDWIDTH = 268; // Bandwidth consumed by a TRX transfer\nconst TRC20_TRANSFER_ENERGY = 13000; // Average energy consumed by TRC20 transfer\nconst TRC20_TRANSFER_BANDWIDTH = 345; // Bandwidth consumed by TRC20 transfer\n\n// Known TRON tokens\nconst TRON_USDT_CONTRACT = \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\";\n\nconst MAX_APPROVAL = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport async function getTronAddressValidator() {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n return (address: string) => {\n return TronWeb.isAddress(address);\n };\n}\n\nexport async function getTronPrivateKeyFromMnemonic({\n phrase,\n derivationPath: customPath,\n index,\n}: {\n phrase: string;\n derivationPath?: string;\n index?: number;\n}) {\n const derivationPathToUse =\n customPath ||\n derivationPathToString(updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index: index || 0 }));\n\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n const derived = hdKey.derive(derivationPathToUse);\n\n if (!derived.privateKey) {\n throw new USwapError(\"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 USwapError(\"toolbox_tron_no_signer\");\n }\n\n // Convert private key to hex string for TronWeb\n const privateKeyHex = Buffer.from(derived.privateKey).toString(\"hex\");\n\n tronWeb.setPrivateKey(privateKeyHex);\n\n const address = tronWeb?.address.fromPrivateKey(privateKeyHex);\n\n return {\n getAddress: () => Promise.resolve(typeof address === \"string\" ? address : \"\"),\n signTransaction: async (transaction: TronTransaction) => {\n const signedTx = await tronWeb.trx.sign(transaction, privateKeyHex);\n return signedTx;\n },\n };\n}\n\nexport const createTronToolbox = async (\n options: TronToolboxOptions = {},\n): Promise<{\n tronWeb: TronWeb;\n getAddress: () => Promise<string>;\n validateAddress: (address: string) => boolean;\n getBalance: (address: string) => Promise<AssetValue[]>;\n transfer: (params: TronTransferParams) => Promise<string>;\n estimateTransactionFee: (params: TronTransferParams & { sender?: string }) => Promise<AssetValue>;\n createTransaction: (params: TronCreateTransactionParams) => Promise<TronTransaction>;\n signTransaction: (transaction: TronTransaction) => Promise<TronSignedTransaction>;\n broadcastTransaction: (signedTransaction: TronSignedTransaction) => Promise<string>;\n approve: (params: TronApproveParams) => Promise<string>;\n isApproved: (params: TronIsApprovedParams) => Promise<boolean>;\n getApprovedAmount: (params: TronApprovedParams) => Promise<bigint>;\n}> => {\n const TW = await import(\"tronweb\");\n const TronWeb = TW.TronWeb ?? TW.default?.TronWeb;\n\n const rpcUrl = await getRPCUrl(Chain.Tron);\n // Note: TRON API key support can be added to USwapConfig apiKeys when needed\n const headers = undefined; // No API key needed for basic TronGrid access\n\n const tronWeb = new TronWeb({ fullHost: rpcUrl, headers });\n\n // Handle derivation path and index\n const index = \"index\" in options ? options.index || 0 : 0;\n const derivationPath = derivationPathToString(\n \"derivationPath\" in options && options.derivationPath\n ? options.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Tron], { index }),\n );\n\n // Create signer based on options using pattern matching\n const signer: TronSigner | undefined = await match(options)\n .with({ phrase: P.string }, async ({ phrase }) => createKeysForPath({ derivationPath, phrase, tronWeb }))\n .with({ signer: P.any }, ({ signer }) => Promise.resolve(signer as TronSigner))\n .otherwise(() => Promise.resolve(undefined));\n\n const getAddress = async () => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n return await signer.getAddress();\n };\n\n const calculateFeeLimit = () => {\n return 100_000_000; // 100 TRX in SUN\n };\n\n /**\n * Get current chain parameters including resource prices\n */\n const getChainParameters = async () => {\n try {\n const parameters = await tronWeb.trx.getChainParameters();\n const paramMap: Record<string, number> = {};\n\n for (const param of parameters) {\n paramMap[param.key] = param.value;\n }\n\n return {\n bandwidthFee: paramMap.getTransactionFee || 1000, // SUN per bandwidth unit\n createAccountFee: paramMap.getCreateAccountFee || 100000, // 0.1 TRX in SUN\n energyFee: paramMap.getEnergyFee || 420, // SUN per energy unit\n };\n } catch {\n // Return default values if unable to fetch\n return { bandwidthFee: 1000, createAccountFee: 100000, energyFee: 420 };\n }\n };\n\n /**\n * Check if an address exists on the blockchain\n */\n const accountExists = async (address: string) => {\n try {\n const account = await tronWeb.trx.getAccount(address);\n return account && Object.keys(account).length > 0;\n } catch {\n return false;\n }\n };\n\n /**\n * Get account resources (bandwidth and energy)\n */\n const getAccountResources = async (address: string) => {\n try {\n const resources = await tronWeb.trx.getAccountResources(address);\n\n return {\n bandwidth: {\n free: resources.freeNetLimit - resources.freeNetUsed,\n total: resources.NetLimit || 0,\n used: resources.NetUsed || 0,\n },\n energy: { total: resources.EnergyLimit || 0, used: resources.EnergyUsed || 0 },\n };\n } catch {\n // Return default structure if unable to fetch\n return {\n bandwidth: { free: 600, total: 0, used: 0 }, // 600 free bandwidth daily\n energy: { total: 0, used: 0 },\n };\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenBalance = async (address: string, contractAddress: string) => {\n try {\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n if (!contract.methods?.balanceOf) {\n return 0n;\n }\n\n const [balance] = await contract.methods.balanceOf(address).call();\n\n return balance ? (typeof balance === \"bigint\" ? balance : BigInt(balance)) : 0n;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n console.warn(`balanceOf() failed for ${contractAddress}: ${errorMessage}`);\n return 0n;\n }\n };\n\n /**\n * Get token balance and info directly from contract\n */\n const fetchTokenMetadata = async (contractAddress: string, address: string) => {\n try {\n tronWeb.setAddress(address); // Set address for contract calls\n const contract = tronWeb.contract(trc20ABI, contractAddress);\n\n const [symbolRaw, decimalsRaw] = await Promise.all([\n contract\n .symbol()\n .call()\n .catch(() => \"UNKNOWN\"),\n contract\n .decimals()\n .call()\n .catch(() => \"18\"),\n ]);\n\n return { decimals: Number(decimalsRaw ?? 18), symbol: symbolRaw ?? \"UNKNOWN\" };\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_token_metadata_failed\",\n warning: `Failed to get token metadata for ${contractAddress}: ${\n error instanceof Error ? error.message : error\n }`,\n });\n return null;\n }\n };\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n const getBalance = async (address: string, _scamFilter = true) => {\n const fallbackBalance = [AssetValue.from({ chain: Chain.Tron })];\n // Try primary source (TronGrid)\n try {\n const accountData = await fetchAccountFromTronGrid(address);\n if (accountData) {\n const balances: AssetValue[] = [];\n\n // Add TRX balance\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: accountData.balance }));\n\n // Add TRC20 balances\n\n for (const token of accountData.trc20) {\n const [contractAddress, balance] = Object.entries(token)[0] || [];\n\n if (!(contractAddress && balance)) continue;\n\n const tokenMetaData = await fetchTokenMetadata(contractAddress, address);\n\n if (!tokenMetaData) continue;\n\n balances.push(\n AssetValue.from({\n asset: `TRON.${tokenMetaData.symbol}-${contractAddress}`,\n fromBaseDecimal: tokenMetaData.decimals,\n value: BigInt(balance || 0),\n }),\n );\n }\n\n return balances;\n }\n return fallbackBalance;\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_get_balance_failed\",\n warning: `Tron API getBalance failed: ${error instanceof Error ? error.message : error}`,\n });\n\n try {\n const balances: AssetValue[] = [];\n\n const trxBalanceInSun = await tronWeb.trx.getBalance(address);\n if (trxBalanceInSun && Number(trxBalanceInSun) > 0) {\n balances.push(AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 6, value: trxBalanceInSun }));\n }\n\n const usdtBalance = await fetchTokenBalance(address, TRON_USDT_CONTRACT);\n if (usdtBalance) {\n balances.push(\n AssetValue.from({ asset: `TRON.USDT-${TRON_USDT_CONTRACT}`, fromBaseDecimal: 6, value: usdtBalance }),\n );\n }\n\n if (balances.length === 0) {\n return fallbackBalance;\n }\n\n return balances;\n } catch (fallbackError) {\n const errorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);\n console.error(`Tron balance fetch failed: ${errorMessage}`);\n return fallbackBalance;\n }\n }\n };\n\n const transfer = async ({ recipient, assetValue, memo, expiration }: TronTransferParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const from = await getAddress();\n tronWeb.setAddress(from);\n const transaction = await createTransaction({ assetValue, expiration, memo, recipient, sender: from });\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_token_transfer_failed\");\n }\n\n return txid;\n };\n\n const estimateTransactionFee = async ({\n assetValue,\n recipient,\n sender,\n }: // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO\n TronTransferParams & { sender?: string }) => {\n const isNative = assetValue.isGasAsset;\n\n try {\n const senderAddress = sender ? sender : signer ? await getAddress() : undefined;\n if (!senderAddress) {\n return isNative\n ? AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 0.1 })\n : AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: 0, value: 15 });\n }\n\n const chainParams = await getChainParameters();\n\n const recipientExists = await accountExists(recipient);\n const activationFee = recipientExists ? 0 : chainParams.createAccountFee;\n\n const resources = await getAccountResources(senderAddress);\n\n if (isNative) {\n const bandwidthNeeded = TRX_TRANSFER_BANDWIDTH;\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n }\n\n const bandwidthNeeded = TRC20_TRANSFER_BANDWIDTH;\n const energyNeeded = TRC20_TRANSFER_ENERGY;\n\n const availableBandwidth = resources.bandwidth.free + (resources.bandwidth.total - resources.bandwidth.used);\n const availableEnergy = resources.energy.total - resources.energy.used;\n\n let bandwidthFee = 0;\n if (bandwidthNeeded > availableBandwidth) {\n const bandwidthToBuy = bandwidthNeeded - availableBandwidth;\n bandwidthFee = bandwidthToBuy * chainParams.bandwidthFee;\n }\n\n let energyFee = 0;\n if (energyNeeded > availableEnergy) {\n const energyToBuy = energyNeeded - availableEnergy;\n energyFee = energyToBuy * chainParams.energyFee;\n }\n\n const totalFeeSun = activationFee + bandwidthFee + energyFee;\n\n return AssetValue.from({ chain: Chain.Tron, fromBaseDecimal: BaseDecimal.TRON, value: totalFeeSun });\n } catch (error) {\n warnOnce({\n condition: true,\n id: \"tron_toolbox_fee_estimation_failed\",\n warning: `Failed to calculate exact fee, using conservative estimate: ${\n error instanceof Error ? error.message : error\n }`,\n });\n\n throw new USwapError(\"toolbox_tron_fee_estimation_failed\", { error });\n }\n };\n\n const createTransaction = async (params: TronCreateTransactionParams) => {\n const { recipient, assetValue, memo, sender, expiration } = params;\n const isNative = assetValue.isGasAsset;\n\n const addTxData = async ({\n transaction,\n memo,\n expiration,\n }: {\n transaction: TronTransaction;\n memo?: string;\n expiration?: number;\n }) => {\n const transactionWithMemo = memo\n ? await tronWeb.transactionBuilder.addUpdateData(transaction, memo, \"utf8\")\n : transaction;\n\n const transactionFinal = expiration\n ? await tronWeb.transactionBuilder.extendExpiration(transactionWithMemo, expiration)\n : transactionWithMemo;\n\n return transactionFinal;\n };\n\n if (isNative) {\n const transaction = await tronWeb.transactionBuilder.sendTrx(\n recipient,\n assetValue.getBaseValue(\"number\"),\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n }\n\n tronWeb.setAddress(sender);\n const contractAddress = assetValue.address;\n if (!contractAddress) {\n throw new USwapError(\"toolbox_tron_invalid_token_identifier\", { identifier: assetValue.toString() });\n }\n\n try {\n const functionSelector = \"transfer(address,uint256)\";\n const parameter = [\n { type: \"address\", value: recipient },\n { type: \"uint256\", value: assetValue.getBaseValue(\"string\") },\n ];\n\n const options = { callValue: 0, feeLimit: calculateFeeLimit() };\n\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n functionSelector,\n options,\n parameter,\n sender,\n );\n\n const txWithData = addTxData({ expiration, memo, transaction });\n return txWithData;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_transaction_creation_failed\", {\n message: \"Failed to create TRC20 transaction.\",\n originalError: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const signTransaction = async (transaction: TronTransaction) => {\n if (!signer) throw new USwapError(\"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 const getApprovedAmount = async ({ assetAddress, spenderAddress, from }: TronApprovedParams) => {\n try {\n const contract = tronWeb.contract(trc20ABI, assetAddress);\n\n if (!contract.methods?.allowance) {\n throw new USwapError(\"toolbox_tron_invalid_token_contract\");\n }\n\n const [allowance] = await contract.methods.allowance(from, spenderAddress).call();\n\n return allowance ? (typeof allowance === \"bigint\" ? allowance : BigInt(allowance)) : 0n;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_allowance_check_failed\", { error });\n }\n };\n\n const isApproved = async ({ assetAddress, spenderAddress, from, amount }: TronIsApprovedParams) => {\n const allowance = await getApprovedAmount({ assetAddress, from, spenderAddress });\n\n if (!amount) {\n return allowance > 0n;\n }\n\n const amountBigInt = BigInt(amount);\n return allowance >= amountBigInt;\n };\n\n const approve = async ({ assetAddress, spenderAddress, amount, from }: TronApproveParams) => {\n if (!signer) throw new USwapError(\"toolbox_tron_no_signer\");\n\n const fromAddress = from || (await getAddress());\n const approvalAmount = amount !== undefined ? BigInt(amount).toString() : MAX_APPROVAL;\n\n const functionSelector = \"approve(address,uint256)\";\n const parameter = [\n { type: \"address\", value: spenderAddress },\n { type: \"uint256\", value: approvalAmount },\n ];\n\n const feeLimit = calculateFeeLimit();\n const options = { callValue: 0, feeLimit };\n\n try {\n const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(\n assetAddress,\n functionSelector,\n options,\n parameter,\n fromAddress,\n );\n\n const signedTx = await signer.signTransaction(transaction);\n const { txid } = await tronWeb.trx.sendRawTransaction(signedTx);\n\n if (!txid) {\n throw new USwapError(\"toolbox_tron_approve_failed\");\n }\n\n return txid;\n } catch (error) {\n throw new USwapError(\"toolbox_tron_approve_failed\", { error });\n }\n };\n\n return {\n approve,\n broadcastTransaction,\n createTransaction,\n estimateTransactionFee,\n getAddress,\n getApprovedAmount,\n getBalance,\n isApproved,\n signTransaction,\n transfer,\n tronWeb,\n validateAddress: await getTronAddressValidator(),\n };\n};\n",
|
|
8
|
+
"export { trc20ABI } from \"./helpers/trc20.abi\";\nexport {\n createTronToolbox,\n getTronAddressValidator,\n getTronPrivateKeyFromMnemonic,\n} from \"./toolbox\";\nexport type {\n TronApprovedParams,\n TronApproveParams,\n TronContract,\n TronCreateTransactionParams,\n TronIsApprovedParams,\n TronSignedTransaction,\n TronSigner,\n TronToolboxOptions,\n TronTransaction,\n TronTransferParams,\n} from \"./types\";\n\nimport type { createTronToolbox } from \"./toolbox\";\nexport type TronWallet = Awaited<ReturnType<typeof createTronToolbox>>;\n"
|
|
9
|
+
],
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "BF339A744C54B91064756E2164756E21",
|
|
12
|
+
"names": []
|
|
13
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbox.d.ts","sourceRoot":"","sources":["../../../src/solana/toolbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,MAAM,EACN,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EAGV,KAAK,mBAAmB,EAExB,KAAK,8BAA8B,EAMpC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,6BAA6B,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEnG,KAAK,YAAY,GAAG,cAAc,GAAG,MAAM,CAAC;AAE5C,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0B3F;AAiCD,wBAAsB,yBAAyB,sBAG5B,MAAM,cAQxB;AAED,wBAAsB,gBAAgB,CACpC,aAAa,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,mBAAmB,CAAA;CAAE;wCAqP1F,WAAW,GAAG,oBAAoB;;0FA5EmB,6BAA6B;;gGAzH1G,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC,GAAG;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE;;;;gCA9BvD,MAAM;;;
|
|
1
|
+
{"version":3,"file":"toolbox.d.ts","sourceRoot":"","sources":["../../../src/solana/toolbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,MAAM,EACN,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EAGV,KAAK,mBAAmB,EAExB,KAAK,8BAA8B,EAMpC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,6BAA6B,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEnG,KAAK,YAAY,GAAG,cAAc,GAAG,MAAM,CAAC;AAE5C,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0B3F;AAiCD,wBAAsB,yBAAyB,sBAG5B,MAAM,cAQxB;AAED,wBAAsB,gBAAgB,CACpC,aAAa,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,mBAAmB,CAAA;CAAE;wCAqP1F,WAAW,GAAG,oBAAoB;;0FA5EmB,6BAA6B;;gGAzH1G,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC,GAAG;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE;;;;gCA9BvD,MAAM;;;mCAuPd,WAAW,GAAG,oBAAoB;yEA/CW,oBAAoB;GAnL7F;AAiCD,iBAAe,aAAa,wBAI3B;AA6HD,iBAAe,iCAAiC,CAAC,EAC/C,YAAY,GACb,EAAE;IACD,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,wBASA;AA0ED,wBAAsB,iBAAiB,CAAC,EACtC,MAAM,EACN,cAAmC,GACpC,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,8CAQA;AAED,iBAAS,oBAAoB,CAAC,SAAS,EAAE,SAAS,UAEjD;AAED,iBAAe,oBAAoB,CAAC,OAAO,EAAE,MAAM,sBAGlD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var MB=Object.create;var{getPrototypeOf:_B,defineProperty:r,getOwnPropertyNames:gX,getOwnPropertyDescriptor:HB}=Object,mX=Object.prototype.hasOwnProperty;function lX(X){return this[X]}var vB,NB,g=(X,B,Z)=>{var G=X!=null&&typeof X==="object";if(G){var $=B?vB??=new WeakMap:NB??=new WeakMap,Q=$.get(X);if(Q)return Q}Z=X!=null?MB(_B(X)):{};let J=B||!X||!X.__esModule?r(Z,"default",{value:X,enumerable:!0}):Z;for(let j of gX(X))if(!mX.call(J,j))r(J,j,{get:lX.bind(X,j),enumerable:!0});if(G)$.set(X,J);return J},yB=(X)=>{var B=(xX??=new WeakMap).get(X),Z;if(B)return B;if(B=r({},"__esModule",{value:!0}),X&&typeof X==="object"||typeof X==="function"){for(var G of gX(X))if(!mX.call(B,G))r(B,G,{get:lX.bind(X,G),enumerable:!(Z=HB(X,G))||Z.enumerable})}return xX.set(X,B),B},xX;var OB=(X)=>X;function UB(X,B){this[X]=OB.bind(null,B)}var KB=(X,B)=>{for(var Z in B)r(X,Z,{get:B[Z],enumerable:!0,configurable:!0,set:UB.bind(B,Z)})};var y=(X,B)=>()=>(X&&(B=X(X=0)),B);function cX(){function X(){let B=Date.now(),Z=CX||B;return CX=Z,B>CX?B:Z+1}return kB+X().toString(36)}function pX(X){return async function(Z,G=!0){let $=await hX.USwapApi.getChainBalance({address:Z,chain:X,scamFilter:G}),{baseDecimal:Q}=d.getChainConfig(X),J=$.map(({identifier:q,value:W,decimal:Y})=>{return new d.AssetValue({decimal:Y||Q,identifier:q,value:W})});if(!J.some((q)=>q.isGasAsset))return[d.AssetValue.from({chain:X}),...J];return J}}var d,hX,kB,CX=0;var IX=y(()=>{d=require("@tcswap/helpers"),hX=require("@tcswap/helpers/api"),kB=typeof process<"u"&&process.pid?process.pid.toString(36):""});async function AB({chain:X,txHash:B}){let Z=`${GX(X)}/push/transaction`,G=JSON.stringify({data:B});try{let $=await z.RequestClient.post(Z,{body:G,headers:{"Content-Type":"application/json"}});if($.context.code!==200)throw new z.USwapError("toolbox_utxo_broadcast_failed",{error:$.context.error||"Transaction broadcast failed"});return $.data?.transaction_hash||B}catch($){let Q=await z.getRPCUrl(X);if(Q){let J=JSON.stringify({id:cX(),jsonrpc:"2.0",method:"sendrawtransaction",params:[B]}),j=await z.RequestClient.post(Q,{body:J,headers:{"Content-Type":"application/json"}});if(j.error)throw new z.USwapError("toolbox_utxo_broadcast_failed",{error:j.error?.message});if(j.result.includes('"code":-26'))throw new z.USwapError("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return j.result}throw $}}function GX(X){return`https://api.blockchair.com/${FB(X)}`}function oX(X){switch(X){case z.Chain.Bitcoin:return 5;case z.Chain.Dogecoin:return 1e4;case z.Chain.Litecoin:return 1;case z.Chain.Zcash:return 1;default:return 2}}function FB(X){switch(X){case z.Chain.BitcoinCash:return"bitcoin-cash";case z.Chain.Litecoin:return"litecoin";case z.Chain.Dash:return"dash";case z.Chain.Dogecoin:return"dogecoin";case z.Chain.Zcash:return"zcash";case z.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function EB(X){try{let{feePerKb:B}=await z.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),Z=B/1000;return Math.max(Z,oX(X))}catch{return oX(X)}}async function MX(X,B){let Z=await z.RequestClient.get(`${X}${B?`${X.includes("?")?"&":"?"}key=${B}`:""}`);if(!Z||Z.context.code!==200)throw new z.USwapError("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return Z.data}async function dX({address:X,chain:B,apiKey:Z}){if(!X)throw new z.USwapError("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await MX(`${GX(B)}/dashboards/address/${X}?transaction_details=true`,Z))[X]}catch{return{address:{balance:0,transaction_count:0},utxo:[]}}}async function fB({address:X,chain:B,apiKey:Z}){return(await dX({address:X,apiKey:Z,chain:B}))?.address.balance||0}async function iX({chain:X,apiKey:B,txHash:Z}){if(!Z)throw new z.USwapError("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await MX(`${GX(X)}/raw/transaction/${Z}`,B))?.[Z]?.raw_transaction||""}catch(G){let $=G instanceof Error?G.message:String(G);return console.error(`Failed to fetch raw transaction: ${$}`),""}}async function RB({chain:X,address:B,apiKey:Z,offset:G=0,limit:$=30}){return(await MX(`${GX(X)}/outputs?q=recipient(${B}),is_spent(false),value(..2000000000000000)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${$}&offset=${G}`,Z)).map(({is_spent:q,script_hex:W,block_id:Y,transaction_hash:T,index:C,value:D,spending_signature_hex:I})=>({hash:T,index:C,is_confirmed:Y!==-1,is_spent:q,script_hex:W,txHex:I,value:D}))}function PB(X){return X.reduce((B,Z)=>B+Z.value,0)}function nX(X,B){let Z=[...X].sort((G,$)=>$.value-G.value);if(B){let G=[],$=0;for(let Q of Z)if(G.push(Q),$+=Q.value,$>=B)break;return G}return Z}async function sX({chain:X,address:B,apiKey:Z,targetValue:G,accumulativeValue:$=0,offset:Q=0,limit:J=30}){if(!B)throw new z.USwapError("toolbox_utxo_invalid_params",{error:"Address is required"});try{let j=await RB({address:B,apiKey:Z,chain:X,limit:J,offset:Q,targetValue:G}),W=j.length<J,Y=j.filter(({is_spent:H})=>!H),T=PB(Y),C=$+T,D=G&&C>=G;if(W||D)return nX(Y,G);let I=await sX({accumulativeValue:C,address:B,apiKey:Z,chain:X,limit:J,offset:Q+J,targetValue:G}),v=[...Y,...I];return nX(v,G)}catch(j){let q=j instanceof Error?j.message:String(j);return console.error(`Failed to fetch unspent UTXOs: ${q}`),[]}}async function VB({address:X,chain:B,apiKey:Z,fetchTxHex:G=!0,targetValue:$}){let Q=await sX({address:X,apiKey:Z,chain:B,targetValue:$}),J=[];for(let{hash:j,index:q,script_hex:W,value:Y}of Q){let T;if(G)T=await iX({apiKey:Z,chain:B,txHash:j});J.push({address:X,hash:j,index:q,txHex:T,value:Y,witnessUtxo:{script:Buffer.from(W,"hex"),value:Y}})}return J}function N(X){let B=z.USwapConfig.get("apiKeys").blockchair||"";return z.warnOnce({condition:!B,id:"no_blockchair_api_key_warning",warning:"No Blockchair API key found. Functionality will be limited."}),{broadcastTx:(Z)=>AB({chain:X,txHash:Z}),getAddressData:(Z)=>dX({address:Z,apiKey:B,chain:X}),getBalance:(Z)=>fB({address:Z,apiKey:B,chain:X}),getRawTx:(Z)=>iX({apiKey:B,chain:X,txHash:Z}),getSuggestedTxFee:()=>EB(X),getUtxos:(Z)=>VB({...Z,apiKey:B,chain:X})}}function SB(X){return X}function K(){return function(B){switch(B){case z.Chain.Bitcoin:return rX.networks.bitcoin;case z.Chain.BitcoinCash:return m.default.bitcoincash.main.toBitcoinJS();case z.Chain.Dash:return m.default.dash.main.toBitcoinJS();case z.Chain.Litecoin:return m.default.litecoin.main.toBitcoinJS();case z.Chain.Dogecoin:{let Z={private:70615956,public:70617039},G=m.default.dogecoin.test;return G.versions.bip32=Z,m.default.dogecoin.main.toBitcoinJS()}case z.Chain.Zcash:return uX.networks.zcash;default:throw new z.USwapError("toolbox_utxo_not_supported",{chain:B})}}}var uX,z,rX,m;var aX=y(()=>{IX();uX=require("@bitgo/utxo-lib"),z=require("@tcswap/helpers"),rX=require("bitcoinjs-lib"),m=g(require("coininfo"))});function yX(X){try{return JX(X),!0}catch{return!1}}function OX(X){return JX(X)?.network}function l(X){let B=JX(X);if(B?.format==="legacy")return X;return xB(B)}function i(X){let B=JX(X);return gB(B)}function JX(X){try{let B=wB(X);if(B)return B}catch{}try{let B=bB(X);if(B)return B}catch{}throw new _X.USwapError("toolbox_utxo_invalid_address",{address:X})}function wB(X){try{let B=HX.default.decode(X);if(B.length!==21)throw new _X.USwapError("toolbox_utxo_invalid_address",{address:X});let Z=B[0],G=Array.prototype.slice.call(B,1);switch(Z){case S.legacy.mainnet.p2pkh:return{format:"legacy",hash:G,network:"mainnet",type:"p2pkh"};case S.legacy.mainnet.p2sh:return{format:"legacy",hash:G,network:"mainnet",type:"p2sh"};case S.legacy.testnet.p2pkh:return{format:"legacy",hash:G,network:"testnet",type:"p2pkh"};case S.legacy.testnet.p2sh:return{format:"legacy",hash:G,network:"testnet",type:"p2sh"};case S.bitpay.mainnet.p2pkh:return{format:"bitpay",hash:G,network:"mainnet",type:"p2pkh"};case S.bitpay.mainnet.p2sh:return{format:"bitpay",hash:G,network:"mainnet",type:"p2sh"};default:return}}catch{return}}function bB(X){if(X.indexOf(":")!==-1)try{return tX(X)}catch{}else{let B=["bitcoincash","bchtest","bchreg"];for(let Z of B)try{return tX(`${Z}:${X}`)}catch{}}return}function tX(X){try{let{hash:B,prefix:Z,type:G}=vX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(B,0),network:Z==="bitcoincash"?"mainnet":"testnet",type:G==="P2PKH"?"p2pkh":"p2sh"}}catch{return}}function xB(X){let B=S.legacy[X.network][X.type],Z=Buffer.alloc(1+X.hash.length);return Z[0]=B,Z.set(X.hash,1),HX.default.encode(Z)}function gB(X){let B=X.network==="mainnet"?"bitcoincash":"bchtest",Z=X.type==="p2pkh"?"P2PKH":"P2SH",G=new Uint8Array(X.hash);return vX.default.encode(B,Z,G)}var _X,HX,vX,NX,S;var eX=y(()=>{_X=require("@tcswap/helpers"),HX=g(require("bs58check")),vX=g(require("cashaddrjs"));((Z)=>{Z.Mainnet="mainnet";Z.Testnet="testnet"})(NX||={});S={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}}});function k(X){let B=Buffer.from(X,"utf8");return jX.script.compile([jX.opcodes.OP_RETURN,B])}var XB,jX,mB=1000,qX=10,BB=10,lB=41,hB=107,WX,QX,$X,s=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new XB.USwapError("toolbox_utxo_invalid_address",{address:X})},h=({inputs:X,outputs:B,feeRate:Z})=>{let G=X[0]&&"address"in X[0]&&X[0].address?s(X[0].address):"P2PKH",$=X.filter((J)=>J.value>=QX["type"in J?J.type:"P2PKH"]*Math.ceil(Z)).reduce((J,j)=>J+R(j),0),Q=B?.reduce((J,j)=>J+a(j),0)||$X[G];return qX+$+Q},R=(X)=>{if("type"in X)return QX[X.type];if("address"in X&&X.address)return QX[s(X.address)];return lB+hB},a=(X,B)=>{if(X?.script)return BB+X.script.length+(X.script.length>=74?2:1);if(B)return $X[B];return $X.P2PKH};var UX=y(()=>{XB=require("@tcswap/helpers"),jX=require("bitcoinjs-lib");((Z)=>{Z.P2PKH="P2PKH";Z.P2WPKH="P2WPKH"})(WX||={});QX={["P2PKH"]:148,["P2WPKH"]:68},$X={["P2PKH"]:34,["P2WPKH"]:31}});function LX(X){switch(X){case A.Chain.Bitcoin:case A.Chain.BitcoinCash:return 550;case A.Chain.Dash:case A.Chain.Litecoin:return 5500;case A.Chain.Dogecoin:return 1e5;case A.Chain.Zcash:return 546;default:throw new A.USwapError("toolbox_utxo_not_supported",{chain:X})}}function F({inputs:X,outputs:B,feeRate:Z=1,chain:G=A.Chain.Bitcoin,changeAddress:$=""}){let Q=Math.ceil(Z),J=X[0]&&"address"in X[0]&&X[0].address?s(X[0].address):"P2PKH",j=X.filter((D)=>R(D)*Q<=D.value),q=qX+B.reduce((D,I)=>D+a(I,J),0),W=B.reduce((D,I)=>D+I.value,0),Y=q*Q,T=0,C=[];for(let D of j){let I=R(D),v=Q*I;Y+=v,T+=D.value,C.push(D);let H=Y+W;if(T<H)continue;let u=T-H,V=Q*a({address:"",value:0},J);if(u>V){let wX=V+Y,bX=T-(W+wX);if(bX>Math.max(R({})*Q,LX(G)))return{fee:wX,inputs:C,outputs:B.concat({address:$,value:bX})}}return{fee:Y,inputs:C,outputs:B}}return{fee:Q*h({feeRate:Q,inputs:X,outputs:B})}}var A;var ZB=y(()=>{UX();A=require("@tcswap/helpers")});var c=y(()=>{aX();eX();ZB();UX()});function w(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function P(X){let B=w(X);return yX(B)&&OX(B)==="mainnet"}function p(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 B=YX.networks.zcash;try{return YX.address.toOutputScript(X,B),!0}catch{let Z=GB.default.decode(X);if(Z.length<21)return!1;let G=Z[0];return G===B.pubKeyHash||G===B.scriptHash}}catch{return!1}}var YX,GB;var t=y(()=>{c();YX=require("@bitgo/utxo-lib"),GB=g(require("bs58check"))});function $B({inputs:X,outputs:B,chain:Z,psbt:G,sender:$,compiledMemo:Q}){for(let J of X){let j=!!J.witnessUtxo&&!e.includes(Z)&&{witnessUtxo:J.witnessUtxo},q=e.includes(Z)&&{nonWitnessUtxo:J.txHex?Buffer.from(J.txHex,"hex"):void 0};G.addInput({hash:J.hash,index:J.index,...j,...q})}for(let J of B){let j="address"in J&&J.address?J.address:$,q=J.script;if(q&&!Q)continue;let W=q?{script:Q,value:0}:{address:j,value:J.value};E.initEccLib(TX.default),G.addOutput(W)}return{inputs:X,psbt:G}}async function jB({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$,fetchTxHex:Q=!1}){let J=X.chain,j=Z?await k(Z):null,q=await LB({assetValue:X,fetchTxHex:Q,memo:Z,recipient:B,sender:$}),{inputs:W,outputs:Y}=F({...q,chain:J,feeRate:G});if(!(W&&Y))throw new L.USwapError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let T=await K(),C=new E.Psbt({network:T(J)});if(J===L.Chain.Dogecoin)C.setMaximumFeeRate(650000000);let{psbt:D,inputs:I}=await $B({chain:J,compiledMemo:j,inputs:W,outputs:Y,psbt:C,sender:$});return{inputs:I,psbt:D,utxos:q.inputs}}async function qB(){let X=await K();return function({address:Z,chain:G}){if(G===L.Chain.BitcoinCash)return P(Z);if(G===L.Chain.Zcash)return p(Z);try{return E.initEccLib(TX.default),E.address.toOutputScript(Z,X(G)),!0}catch{return!1}}}async function cB({chain:X,phrase:B,derivationPath:Z}){let G=(await XX(X))({derivationPath:Z,phrase:B});async function $(J){return await J.signAllInputs(G),J}function Q(){return kX(X)(G)}return{getAddress:Q,signTransaction:$}}async function b({chain:X,...B}){let Z="phrase"in B?B.phrase:void 0,G="index"in B?B.index||0:0,$=L.derivationPathToString("derivationPath"in B&&B.derivationPath?B.derivationPath:L.updateDerivationPath(L.NetworkDerivationPath[X],{index:G})),Q=Z?await cB({chain:X,derivationPath:$,phrase:Z}):("signer"in B)?B.signer:void 0;function J(){return Promise.resolve(Q?.getAddress())}let j=await qB(),q=await XX(X);return{accumulative:F,broadcastTx:(W)=>N(X).broadcastTx(W),calculateTxSize:h,createKeysForPath:q,createTransaction:jB,estimateMaxSendableAmount:pB(X),estimateTransactionFee:oB(X),getAddress:J,getAddressFromKeys:kX(X),getBalance:pX(X),getFeeRates:()=>BX(X),getInputsOutputsFee:WB,getPrivateKeyFromMnemonic:(W)=>{return q(W).toWIF()},transfer:nB(Q),validateAddress:(W)=>j({address:W,chain:X})}}async function WB({assetValue:X,feeOptionKey:B=L.FeeOption.Fast,feeRate:Z,memo:G,sender:$,recipient:Q}){let J=X.chain,j=await LB({assetValue:X,memo:G,recipient:Q,sender:$}),q=Z?Math.floor(Z):(await BX(J))[B];return F({...j,chain:J,feeRate:q})}function pB(X){return async function({from:Z,memo:G,feeRate:$,feeOptionKey:Q=L.FeeOption.Fast,recipients:J=1}){let j=await N(X).getAddressData(Z),q=$?Math.ceil($):(await BX(X))[Q],W=j?.utxo.map((I)=>({...I,hash:"",type:"P2PKH"})).filter((I)=>I.value>Math.max(LX(X),R(I)*q));if(!W?.length)return L.AssetValue.from({chain:X});let Y=L.AssetValue.from({chain:X,value:W.reduce((I,v)=>I+v.value,0)}),T=typeof J==="number"?Array.from({length:J},()=>({address:Z,value:0})):J;if(G){let I=await k(G);T.push({address:Z,script:I,value:0})}let D=h({feeRate:q,inputs:W,outputs:T})*q;return Y.sub(D)}}function oB(X){return async(B)=>{let Z=await WB(B);return L.AssetValue.from({chain:X,value:L.USwapNumber.fromBigInt(BigInt(Z.fee),8).getValue("string")})}}async function XX(X){let B=await K();switch(X){case L.Chain.BitcoinCash:return function({phrase:G,derivationPath:$=`${L.DerivationPath.BCH}/0`,wif:Q}){let J=B(X);if(Q)return DX.ECPair.fromWIF(Q,J);if(!G)throw new L.USwapError("toolbox_utxo_invalid_params",{error:"No phrase provided"});return DX.HDNode.fromSeedBuffer(Buffer.from(KX.mnemonicToSeedSync(G)),J).derivePath($).keyPair};case L.Chain.Bitcoin:case L.Chain.Dogecoin:case L.Chain.Litecoin:case L.Chain.Zcash:case L.Chain.Dash:return function({phrase:G,wif:$,derivationPath:Q}){if(!($||G))throw new L.USwapError("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let J=QB.ECPairFactory(TX.default),j=B(X);if($)return J.fromWIF($,j);let q=KX.mnemonicToSeedSync(G),W=JB.HDKey.fromMasterSeed(q,j).derive(Q);if(!W.privateKey)throw new L.USwapError("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return J.fromPrivateKey(Buffer.from(W.privateKey),{network:j})};default:throw new L.USwapError("toolbox_utxo_not_supported",{chain:X})}}function kX(X){let B=K();return function(G){if(!G)throw new L.USwapError("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let $=e.includes(X)?E.payments.p2pkh:E.payments.p2wpkh,{address:Q}=$({network:B(X),pubkey:G.publicKey});if(!Q)throw new L.USwapError("toolbox_utxo_invalid_address",{error:"Address not defined"});return Q}}function nB(X){return async function({memo:Z,recipient:G,feeOptionKey:$,feeRate:Q,assetValue:J}){let j=await X?.getAddress(),q=J.chain;if(!(X&&j))throw new L.USwapError("toolbox_utxo_no_signer");if(!G)throw new L.USwapError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let W=Q||(await BX(q))[$||L.FeeOption.Fast],{psbt:Y}=await jB({assetValue:J,feeRate:W,memo:Z,recipient:G,sender:j}),T=await X.signTransaction(Y);return T.finalizeAllInputs(),N(q).broadcastTx(T.extractTransaction().toHex())}}async function BX(X){let B=await N(X).getSuggestedTxFee();return{[L.FeeOption.Average]:B,[L.FeeOption.Fast]:L.applyFeeMultiplier(B,L.FeeOption.Fast),[L.FeeOption.Fastest]:L.applyFeeMultiplier(B,L.FeeOption.Fastest)}}async function LB({assetValue:X,recipient:B,memo:Z,sender:G,fetchTxHex:$=!1}){let Q=X.chain,J=(await BX(Q))[L.FeeOption.Fastest],j=$||e.includes(Q),q=X.getBaseValue("number"),W=Math.ceil(q+J*5000);return{inputs:await N(Q).getUtxos({address:G,fetchTxHex:j,targetValue:W}),outputs:[{address:B,value:q},...Z?[{address:"",script:await k(Z),value:0}]:[]]}}var TX,DX,JB,KX,L,E,QB,e;var ZX=y(()=>{IX();c();t();TX=g(require("@bitcoinerlab/secp256k1")),DX=require("@psf/bitcoincashjs-lib"),JB=require("@scure/bip32"),KX=require("@scure/bip39"),L=require("@tcswap/helpers"),E=require("bitcoinjs-lib"),QB=require("ecpair"),e=[L.Chain.Dash,L.Chain.Dogecoin,L.Chain.Zcash,L.Chain.BitcoinCash]});function x(X){return w(i(X))}function uB(X){function B({builder:G,utxos:$}){return $.forEach((Q,J)=>{G.sign(J,X,void 0,65,Q.witnessUtxo?.value)}),G.build()}return{getAddress:()=>{let G=X.getAddress(0);return Promise.resolve(x(G))},signTransaction:B}}async function AX(X){let B="phrase"in X?X.phrase:void 0,Z="index"in X?X.index||0:0,G=_.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:_.updateDerivationPath(_.NetworkDerivationPath[O],{index:Z})),$=B?(await XX(O))({derivationPath:G,phrase:B}):void 0,Q=$?uB($):("signer"in X)?X.signer:void 0;function J(){return Promise.resolve(Q?.getAddress())}let{getBalance:j,getFeeRates:q,broadcastTx:W,...Y}=await b({chain:O});function T(C,D=!0){return j(w(i(C)))}return{...Y,broadcastTx:W,buildTx:dB,createTransaction:TB,getAddress:J,getAddressFromKeys:iB,getBalance:T,getFeeRates:q,stripPrefix:w,stripToCashAddress:x,transfer:rB({broadcastTx:W,getFeeRates:q,signer:Q}),validateAddress:P}}async function TB({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$}){if(!P(B))throw new _.USwapError("toolbox_utxo_invalid_address",{address:B});let Q=Math.ceil(X.getBaseValue("number")+G*7500),J=await N(O).getUtxos({address:x($),fetchTxHex:!0,targetValue:Q}),j=Z?await k(Z):null,q=[];q.push({address:B,value:X.getBaseValue("number")});let{inputs:W,outputs:Y}=F({chain:O,feeRate:G,inputs:J,outputs:q});if(!(W&&Y))throw new _.USwapError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let T=await K(),C=new o.TransactionBuilder(T(O));await Promise.all(W.map(async(D)=>{let I=await N(O).getRawTx(D.hash);C.addInput(o.Transaction.fromBuffer(Buffer.from(I,"hex")),D.index)}));for(let D of Y){let I="address"in D&&D.address?D.address:l($),v=await K(),H=o.address.toOutputScript(l(I),v(O));C.addOutput(H,D.value)}if(j)C.addOutput(j,0);return{builder:C,utxos:W}}function rB({broadcastTx:X,getFeeRates:B,signer:Z}){return async function({recipient:$,assetValue:Q,feeOptionKey:J=_.FeeOption.Fast,...j}){let q=await Z?.getAddress();if(!(Z&&q))throw new _.USwapError("toolbox_utxo_no_signer");if(!$)throw new _.USwapError("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let W=j.feeRate||(await B())[J],{builder:Y,utxos:T}=await TB({...j,assetValue:Q,feeRate:W,recipient:$,sender:q}),D=(await Z.signTransaction({builder:Y,utxos:T})).toHex();return X(D)}}async function dB({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$,setSigHashType:Q}){let J=i(B);if(!P(J))throw new _.USwapError("toolbox_utxo_invalid_address",{address:J});let j=Math.ceil(X.getBaseValue("number")+G*7500),q=await N(O).getUtxos({address:x($),fetchTxHex:!1,targetValue:j}),W=Number(G.toFixed(0)),Y=Z?await k(Z):null,T=[];if(T.push({address:l(B),value:X.getBaseValue("number")}),Y)T.push({script:Y,value:0});let{inputs:C,outputs:D}=F({chain:O,feeRate:W,inputs:q,outputs:T});if(!(C&&D))throw new _.USwapError("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let I=await K(),v=new YB.Psbt({network:I(O)});for(let{hash:H,index:u,witnessUtxo:V}of C)v.addInput({hash:H,index:u,sighashType:Q?65:void 0,witnessUtxo:V});for(let H of D){let u="address"in H&&H.address?H.address:l($),V=H.script?Y?{script:Y,value:0}:void 0:{address:u,value:H.value};if(V)v.addOutput(V)}return{inputs:C,psbt:v,utxos:q}}function iB(X){let B=X.getAddress(0);return x(B)}var o,_,YB,O;var zX=y(()=>{c();ZX();t();o=require("@psf/bitcoincashjs-lib"),_=require("@tcswap/helpers"),YB=require("bitcoinjs-lib"),O=_.Chain.BitcoinCash});function EX(){return U.networks.zcash}function CB(){return{bech32:void 0,bip32:{private:76066276,public:76067358},messagePrefix:`\x18ZCash Signed Message:
|
|
2
|
+
`,pubKeyHash:28,scriptHash:28,wif:128}}function sB({phrase:X,derivationPath:B}){let Z=RX.mnemonicToSeedSync(X),$=fX.HDKey.fromMasterSeed(Z).derive(B);if(!$.privateKey)throw new M.USwapError("toolbox_utxo_invalid_params");let Q=CB(),J=U.ECPair.fromPrivateKey(Buffer.from($.privateKey),{network:Q}),j=U.crypto.hash160(J.publicKey),{isStagenet:q}=M.USwapConfig.get("envs"),W=q?Buffer.from([29,37]):Buffer.from([28,184]),Y=Buffer.concat([W,j]),T=zB.default.encode(Y);return{getAddress:()=>Promise.resolve(T),signTransaction:(C)=>{let D=C.signAllInputs(J);return Promise.resolve(D)}}}function aB({inputs:X,outputs:B,psbt:Z,sender:G,compiledMemo:$}){for(let Q of X){let J=!!Q.witnessUtxo&&{witnessUtxo:{...Q.witnessUtxo,value:BigInt(Q.value)}},j=!Q.witnessUtxo&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};Z.addInput({hash:Q.hash,index:Q.index,...J,...j})}for(let Q of B){let J="address"in Q&&Q.address?Q.address:G,j=Q.script;if(j&&!$)continue;let q=j?{script:$,value:0n}:{script:U.address.toOutputScript(J,EX()),value:BigInt(Q.value)};Z.addOutput(q)}return{inputs:X,psbt:Z}}async function DB(X){let{assetValue:B,recipient:Z,memo:G,feeRate:$,sender:Q,fetchTxHex:J}=X,j=G?k(G):null,q=await N(M.Chain.Zcash).getUtxos({address:Q,fetchTxHex:J!==!1}),W=[{address:Z,value:Number(B.getBaseValue("string"))},...j?[{script:j,value:0}]:[]],{inputs:Y,outputs:T}=F({chain:M.Chain.Zcash,changeAddress:Q,feeRate:$,inputs:q,outputs:W});if(!(Y&&T))throw new M.USwapError("toolbox_utxo_insufficient_balance",{assetValue:B,sender:Q});let C=U.bitgo.createPsbtForNetwork({network:EX()},{version:FX.ZcashTransaction.VERSION4_BRANCH_NU6_1}),{psbt:D,inputs:I}=await aB({compiledMemo:j,inputs:Y,outputs:T,psbt:C,sender:Q});return D.setDefaultsForVersion(EX(),FX.ZcashTransaction.VERSION4_BRANCH_NU6_1),{inputs:I,outputs:T,psbt:D}}async function PX(X){let B=await n.match(X).with({signer:n.P.not(n.P.nullish)},({signer:J})=>Promise.resolve(J)).with({phrase:n.P.string},({phrase:J,derivationPath:j,index:q=0})=>{let W=j||M.NetworkDerivationPath[M.Chain.Zcash]||[44,133,0,0,0],Y=M.updateDerivationPath(W,{index:q}),T=M.derivationPathToString(Y);return sB({derivationPath:T,phrase:J})}).otherwise(()=>Promise.resolve(void 0)),Z=await b({chain:M.Chain.Zcash,signer:B});async function G({recipient:J,assetValue:j,feeOptionKey:q=M.FeeOption.Fast,...W}){let Y=await B?.getAddress();if(!(B&&Y))throw new M.USwapError("toolbox_utxo_no_signer");let T=W.feeRate||(await Z.getFeeRates())[q],{psbt:C}=await DB({...W,assetValue:j,feeRate:T,recipient:J,sender:Y}),D=await B.signTransaction(C);D.validateSignaturesOfAllInputs(),D.finalizeAllInputs();let v=D.extractTransaction().toHex();return Z.broadcastTx(v)}function $({phrase:J,derivationPath:j="m/44'/133'/0'/0/0"}){let q=RX.mnemonicToSeedSync(J),Y=fX.HDKey.fromMasterSeed(q).derive(j);if(!Y.privateKey)throw new M.USwapError("toolbox_utxo_invalid_params");let T=CB();return U.ECPair.fromPrivateKey(Buffer.from(Y.privateKey),{network:T})}function Q({phrase:J,derivationPath:j="m/44'/133'/0'/0/0"}){return $({derivationPath:j,phrase:J}).toWIF()}return{...Z,createKeysForPath:$,createTransaction:DB,getPrivateKeyFromMnemonic:Q,transfer:G,validateAddress:p}}var U,FX,fX,RX,M,zB,n;var VX=y(()=>{c();ZX();t();U=require("@bitgo/utxo-lib"),FX=require("@bitgo/utxo-lib/dist/src/bitgo"),fX=require("@scure/bip32"),RX=require("@scure/bip39"),M=require("@tcswap/helpers"),zB=g(require("bs58check")),n=require("ts-pattern")});async function tB(X,B){switch(X){case f.Chain.BitcoinCash:return await AX(B||{});case f.Chain.Zcash:return await PX(B);case f.Chain.Bitcoin:case f.Chain.Dogecoin:case f.Chain.Litecoin:case f.Chain.Dash:return await b({chain:X,...B});default:throw new f.USwapError("toolbox_utxo_not_supported",{chain:X})}}var f;var IB=y(()=>{zX();ZX();VX();zX();t();f=require("@tcswap/helpers")});var eB={};KB(eB,{validateZcashAddress:()=>p,toLegacyAddress:()=>l,toCashAddress:()=>i,stripToCashAddress:()=>x,stripPrefix:()=>w,nonSegwitChains:()=>e,isValidAddress:()=>yX,getUtxoToolbox:()=>tB,getUtxoNetwork:()=>K,getUtxoApi:()=>N,getUTXOAddressValidator:()=>qB,getScriptTypeForAddress:()=>s,getOutputSize:()=>a,getInputSize:()=>R,getDustThreshold:()=>LX,getCreateKeysForPath:()=>XX,detectAddressNetwork:()=>OX,createZcashToolbox:()=>PX,createUTXOToolbox:()=>b,createCustomUtxoApi:()=>SB,createBCHToolbox:()=>AX,compileMemo:()=>k,calculateTxSize:()=>h,bchValidateAddress:()=>P,addressFromKeysGetter:()=>kX,addInputsAndOutputs:()=>$B,accumulative:()=>F,UtxoNetwork:()=>NX,UTXOScriptType:()=>WX,TX_OVERHEAD:()=>qX,OutputSizes:()=>$X,OP_RETURN_OVERHEAD:()=>BB,MIN_TX_FEE:()=>mB,InputSizes:()=>QX});module.exports=yB(eB);var XZ=y(()=>{c();IB();zX();ZX();VX()});XZ();
|
|
3
|
+
|
|
4
|
+
//# debugId=0DE91A6D08842D3B64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils.ts", "../src/utxo/helpers/api.ts", "../src/utxo/helpers/bchaddrjs.ts", "../src/utxo/helpers/txSize.ts", "../src/utxo/helpers/coinselect.ts", "../src/utxo/helpers/index.ts", "../src/utxo/toolbox/validators.ts", "../src/utxo/toolbox/utxo.ts", "../src/utxo/toolbox/bitcoinCash.ts", "../src/utxo/toolbox/zcash.ts", "../src/utxo/toolbox/index.ts", "../src/utxo/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { AssetValue, type Chain, getChainConfig } from \"@tcswap/helpers\";\nimport { USwapApi } from \"@tcswap/helpers/api\";\n\nconst pid = typeof process !== \"undefined\" && process.pid ? process.pid.toString(36) : \"\";\n\nlet last = 0;\nexport function uniqid() {\n function now() {\n const time = Date.now();\n const lastTime = last || time;\n last = lastTime;\n\n return time > last ? time : lastTime + 1;\n }\n\n return pid + now().toString(36);\n}\n\nexport function getBalance<T extends Chain>(chain: T) {\n return async function getBalance(address: string, scamFilter = true) {\n const balances = await USwapApi.getChainBalance({ address, chain, scamFilter });\n const { baseDecimal } = getChainConfig(chain);\n const assetValues = balances.map(({ identifier, value, decimal }) => {\n return new AssetValue({ decimal: decimal || baseDecimal, identifier, value });\n });\n\n const hasNativeAsset = assetValues.some((asset) => asset.isGasAsset);\n if (!hasNativeAsset) {\n return [AssetValue.from({ chain }), ...assetValues];\n }\n\n return assetValues;\n };\n}\n",
|
|
6
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { networks as zcashNetworks } from \"@bitgo/utxo-lib\";\nimport { Chain, getRPCUrl, RequestClient, USwapConfig, USwapError, type UTXOChain, warnOnce } from \"@tcswap/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\n// @ts-expect-error\nimport coininfo from \"coininfo\";\nimport { uniqid } from \"../../utils\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n targetValue?: number;\n accumulativeValue?: number;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n // Use Blockchair's push transaction endpoint (no API key needed)\n const url = `${baseUrl(chain)}/push/transaction`;\n const body = JSON.stringify({ data: txHash });\n\n try {\n const response = await RequestClient.post<{\n data: { transaction_hash: string } | null;\n context: { code: number; error?: string };\n }>(url, { body, headers: { \"Content-Type\": \"application/json\" } });\n\n if (response.context.code !== 200) {\n throw new USwapError(\"toolbox_utxo_broadcast_failed\", {\n error: response.context.error || \"Transaction broadcast failed\",\n });\n }\n\n return response.data?.transaction_hash || txHash;\n } catch (error) {\n // Fallback to RPC if Blockchair fails\n const rpcUrl = await getRPCUrl(chain);\n if (rpcUrl) {\n const rpcBody = JSON.stringify({ id: uniqid(), jsonrpc: \"2.0\", method: \"sendrawtransaction\", params: [txHash] });\n\n const rpcResponse = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { body: rpcBody, headers: { \"Content-Type\": \"application/json\" } });\n\n if (rpcResponse.error) {\n throw new USwapError(\"toolbox_utxo_broadcast_failed\", { error: rpcResponse.error?.message });\n }\n\n if (rpcResponse.result.includes('\"code\":-26')) {\n throw new USwapError(\"toolbox_utxo_invalid_transaction\", { error: \"Transaction amount was too low\" });\n }\n\n return rpcResponse.result;\n }\n\n throw error;\n }\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n case Chain.Zcash:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Zcash:\n return \"zcash\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `${url.includes(\"?\") ? \"&\" : \"?\"}key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200)\n throw new USwapError(\"toolbox_utxo_api_error\", { error: `Failed to query ${url}` });\n\n return response.data as T;\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address) throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch {\n return { address: { balance: 0, transaction_count: 0 }, utxo: [] };\n }\n}\n\nasync function getUnconfirmedBalance({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, apiKey, chain });\n\n return response?.address.balance || 0;\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash) throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"TxHash is required\" });\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Failed to fetch raw transaction: ${errorMessage}`);\n return \"\";\n }\n}\n\nasync function fetchUtxosBatch({ chain, address, apiKey, offset = 0, limit = 30 }: BlockchairFetchUnspentUtxoParams) {\n // Only fetch the fields we need to reduce payload size\n const fields = \"is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex\";\n\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n // TODO - remove max value limit once we updated bitcoinjs-lib to support larger values\n `${baseUrl(chain)}/outputs?q=recipient(${address}),is_spent(false),value(..2000000000000000)&s=value(desc)&fields=${fields}&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response.map(\n ({ is_spent, script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n is_confirmed: block_id !== -1,\n is_spent,\n script_hex,\n txHex: spending_signature_hex,\n value,\n }),\n );\n\n return txs;\n}\n\nfunction getTxsValue(txs: Awaited<ReturnType<typeof fetchUtxosBatch>>) {\n return txs.reduce((total, tx) => total + tx.value, 0);\n}\n\nfunction pickMostValuableTxs(\n txs: Awaited<ReturnType<typeof fetchUtxosBatch>>,\n targetValue?: number,\n): Awaited<ReturnType<typeof fetchUtxosBatch>> {\n const sortedTxs = [...txs].sort((a, b) => b.value - a.value);\n\n if (targetValue) {\n const result = [];\n let accumulated = 0;\n\n for (const utxo of sortedTxs) {\n result.push(utxo);\n accumulated += utxo.value;\n if (accumulated >= targetValue) break;\n }\n\n return result;\n }\n\n return sortedTxs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n targetValue,\n accumulativeValue = 0,\n offset = 0,\n limit = 30,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUtxosBatch>>> {\n if (!address) throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Address is required\" });\n\n try {\n const utxos = await fetchUtxosBatch({ address, apiKey, chain, limit, offset, targetValue });\n const utxosCount = utxos.length;\n const isComplete = utxosCount < limit;\n\n const unspentUtxos = utxos.filter(({ is_spent }) => !is_spent);\n\n const unspentUtxosValue = getTxsValue(unspentUtxos);\n const totalCurrentValue = accumulativeValue + unspentUtxosValue;\n\n const limitReached = targetValue && totalCurrentValue >= targetValue;\n\n if (isComplete || limitReached) {\n return pickMostValuableTxs(unspentUtxos, targetValue);\n }\n\n const nextBatch = await getUnspentUtxos({\n accumulativeValue: totalCurrentValue,\n address,\n apiKey,\n chain,\n limit,\n offset: offset + limit,\n targetValue,\n });\n\n const allUtxos = [...unspentUtxos, ...nextBatch];\n\n return pickMostValuableTxs(allUtxos, targetValue);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Failed to fetch unspent UTXOs: ${errorMessage}`);\n return [];\n }\n}\n\nasync function getUtxos({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n targetValue,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean; targetValue?: number }>) {\n const utxos = await getUnspentUtxos({ address, apiKey, chain, targetValue });\n\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ apiKey, chain, txHash: hash });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { script: Buffer.from(script_hex, \"hex\"), value },\n });\n }\n return results;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const apiKey = USwapConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce({\n condition: !apiKey,\n id: \"no_blockchair_api_key_warning\",\n warning: \"No Blockchair API key found. Functionality will be limited.\",\n });\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ chain, txHash }),\n getAddressData: (address: string) => getAddressData({ address, apiKey, chain }),\n getBalance: (address: string) => getUnconfirmedBalance({ address, apiKey, chain }),\n getRawTx: (txHash: string) => getRawTx({ apiKey, chain, txHash }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getUtxos: (params: { address: string; fetchTxHex?: boolean; targetValue?: number }) =>\n getUtxos({ ...params, apiKey, chain }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof getUtxoApi>) {\n return methods;\n}\n\nexport function getUtxoNetwork() {\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n\n case Chain.Zcash: {\n return zcashNetworks.zcash;\n }\n\n default:\n throw new USwapError(\"toolbox_utxo_not_supported\", { chain });\n }\n };\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: { asm: string; hex: string };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: { asm: string; hex: string; address: string; type: string; addresses: string[]; reqSigs: number };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: { address: BlockchairAddressCoreData; transactions: BlockchairTransaction[]; utxo: BlockchairUtxo[] };\n}\n\ninterface BlockchairOutputsResponse extends BlockchairSpendingBlockData, BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: { live: boolean; duration: number; since: string; until: string; time: any };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
|
|
7
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { USwapError } from \"@tcswap/helpers\";\nimport base58check from \"bs58check\";\n// @ts-expect-error\nimport cashaddr from \"cashaddrjs\";\n\nenum Format {\n Legacy = \"legacy\",\n Bitpay = \"bitpay\",\n Cashaddr = \"cashaddr\",\n}\nenum UtxoNetwork {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [UtxoNetwork.Mainnet]: { [Type.P2PKH]: 0, [Type.P2SH]: 5 },\n [UtxoNetwork.Testnet]: { [Type.P2PKH]: 111, [Type.P2SH]: 196 },\n },\n [Format.Bitpay]: {\n [UtxoNetwork.Mainnet]: { [Type.P2PKH]: 28, [Type.P2SH]: 40 },\n [UtxoNetwork.Testnet]: { [Type.P2PKH]: 111, [Type.P2SH]: 196 },\n },\n};\n\ntype DecodedType = { format: Format; network: UtxoNetwork; type: Type; hash: any };\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectAddressNetwork(address: string) {\n return decodeAddress(address)?.network;\n}\n\nfunction toLegacyAddress(address: string): string {\n const decoded = decodeAddress(address);\n if (decoded?.format === Format.Legacy) {\n return address;\n }\n return encodeAsLegacy(decoded);\n}\n\nfunction toCashAddress(address: string): string {\n const decoded = decodeAddress(address);\n return encodeAsCashaddr(decoded);\n}\n\nfunction decodeAddress(address: string) {\n try {\n const decoded = decodeBase58Address(address);\n if (decoded) {\n return decoded;\n }\n } catch {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n const decoded = decodeCashAddress(address);\n if (decoded) {\n return decoded;\n }\n } catch {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new USwapError(\"toolbox_utxo_invalid_address\", { address });\n}\n\nfunction decodeBase58Address(address: string) {\n try {\n const payload = base58check.decode(address);\n\n // BASE_58_CHECK_PAYLOAD_LENGTH\n if (payload.length !== 21) throw new USwapError(\"toolbox_utxo_invalid_address\", { address });\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { format: Format.Legacy, hash, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Mainnet][Type.P2SH]:\n return { format: Format.Legacy, hash, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2PKH]:\n return { format: Format.Legacy, hash, network: UtxoNetwork.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][UtxoNetwork.Testnet][Type.P2SH]:\n return { format: Format.Legacy, hash, network: UtxoNetwork.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2PKH]:\n return { format: Format.Bitpay, hash, network: UtxoNetwork.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][UtxoNetwork.Mainnet][Type.P2SH]:\n return { format: Format.Bitpay, hash, network: UtxoNetwork.Mainnet, type: Type.P2SH };\n\n default:\n return;\n }\n } catch {\n return;\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch {\n // Try to decode as legacy if cashaddr decoding fails.\n }\n } else {\n const prefixes = [\"bitcoincash\", \"bchtest\", \"bchreg\"];\n for (const prefix of prefixes) {\n try {\n return decodeCashAddressWithPrefix(`${prefix}:${address}`);\n } catch {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n return;\n}\n\nfunction decodeCashAddressWithPrefix(address: string) {\n try {\n const { hash, prefix, type } = cashaddr.decode(address);\n\n return {\n format: Format.Cashaddr,\n hash: Array.prototype.slice.call(hash, 0),\n network: prefix === \"bitcoincash\" ? UtxoNetwork.Mainnet : UtxoNetwork.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch {\n return;\n }\n}\n\nfunction encodeAsLegacy(decoded: DecodedType) {\n const versionByte = VERSION_BYTE[Format.Legacy][decoded.network][decoded.type];\n const buffer = Buffer.alloc(1 + decoded.hash.length);\n buffer[0] = versionByte;\n buffer.set(decoded.hash, 1);\n return base58check.encode(buffer);\n}\n\nfunction encodeAsCashaddr(decoded: DecodedType) {\n const prefix = decoded.network === UtxoNetwork.Mainnet ? \"bitcoincash\" : \"bchtest\";\n const type = decoded.type === Type.P2PKH ? \"P2PKH\" : \"P2SH\";\n const hash = new Uint8Array(decoded.hash);\n return cashaddr.encode(prefix, type, hash);\n}\n\nexport { detectAddressNetwork, isValidAddress, UtxoNetwork, toCashAddress, toLegacyAddress };\n",
|
|
8
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { USwapError } from \"@tcswap/helpers\";\nimport { opcodes, script } from \"bitcoinjs-lib\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOInputWithScriptType, UTXOType } from \"../types\";\n\n/**\n * Minimum transaction fee\n * 1000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/bitcoin/bitcoin/blob/db88db47278d2e7208c50d16ab10cb355067d071/src/validation.h#L56\n */\nexport const MIN_TX_FEE = 1000;\nexport const TX_OVERHEAD = 4 + 1 + 1 + 4; //10\nexport const OP_RETURN_OVERHEAD = 1 + 8 + 1; //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4; // 41\nconst TX_INPUT_PUBKEYHASH = 107;\n\nexport function compileMemo(memo: string) {\n const data = Buffer.from(memo, \"utf8\"); // converts MEMO to buffer\n return script.compile([opcodes.OP_RETURN as number, data]); // Compile OP_RETURN script\n}\n\nexport enum UTXOScriptType {\n P2PKH = \"P2PKH\", // legacy\n // P2SH = 'P2SH', // multisig\n P2WPKH = \"P2WPKH\", // bech32 - native segwit\n // P2TR = \"P2TR\", // taproot\n}\n\nexport const InputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 148,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 68,\n};\n\nexport const OutputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 34,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 31,\n};\n\nexport const getScriptTypeForAddress = (address: string) => {\n // Native SegWit (Bech32) addresses - P2WPKH\n // Bitcoin: bc1 (mainnet), tb1 (testnet)\n // Litecoin: ltc1 (mainnet), tltc1 (testnet)\n if (\n address.startsWith(\"bc1\") ||\n address.startsWith(\"tb1\") ||\n address.startsWith(\"ltc1\") ||\n address.startsWith(\"tltc1\")\n ) {\n // Note: bc1p/tb1p are Taproot (P2TR) addresses, but we're treating them as P2WPKH for now\n // since P2TR is not yet implemented\n return UTXOScriptType.P2WPKH;\n }\n\n // P2SH addresses (Pay-to-Script-Hash) - Currently commented out but kept for future use\n // Bitcoin: 3 (mainnet), 2 (testnet)\n // Litecoin: M or 2 (mainnet), Q (testnet)\n // Dash: 7 (mainnet)\n // if (address.startsWith('3') || address.startsWith('2') ||\n // address.startsWith('M') || address.startsWith('Q') ||\n // address.startsWith('7')) {\n // return UTXOScriptType.P2SH;\n // }\n\n // Legacy P2PKH addresses\n // Bitcoin: 1 (mainnet), m/n (testnet)\n // Bitcoin Cash: bitcoincash:q (CashAddr format), q (legacy), 1 (legacy)\n // Litecoin: L (mainnet), m/n (testnet)\n // Dogecoin: D (mainnet), n (testnet)\n // Dash: X (mainnet), y (testnet)\n // Zcash: t1 (transparent mainnet), tm (testnet)\n if (\n // Bitcoin legacy\n address.startsWith(\"1\") ||\n address.startsWith(\"m\") ||\n address.startsWith(\"n\") ||\n // Bitcoin Cash\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"bitcoincash:p\") ||\n address.startsWith(\"q\") ||\n address.startsWith(\"p\") ||\n // Litecoin legacy (also uses 3 for P2SH but treating as P2PKH for now)\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"3\") ||\n // Dogecoin\n address.startsWith(\"D\") ||\n address.startsWith(\"A\") ||\n address.startsWith(\"9\") ||\n // Dash\n address.startsWith(\"X\") ||\n address.startsWith(\"7\") ||\n address.startsWith(\"y\") ||\n // Zcash transparent addresses\n address.startsWith(\"t1\") ||\n address.startsWith(\"t3\") ||\n address.startsWith(\"tm\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n\n throw new USwapError(\"toolbox_utxo_invalid_address\", { address });\n};\n\nexport const calculateTxSize = ({ inputs, outputs, feeRate }: UTXOCalculateTxSizeParams) => {\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n const inputSize = inputs\n .filter((utxo) => utxo.value >= InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate))\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize = outputs?.reduce((total, output) => total + getOutputSize(output), 0) || OutputSizes[newTxType];\n\n return TX_OVERHEAD + inputSize + outputSize;\n};\n\nexport const getInputSize = (input: UTXOInputWithScriptType | UTXOType) => {\n if (\"type\" in input) {\n return InputSizes[input.type];\n }\n if (\"address\" in input && input.address) {\n return InputSizes[getScriptTypeForAddress(input.address as string)];\n }\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;\n};\n\nexport const getOutputSize = (output: TargetOutput, scriptType?: UTXOScriptType) => {\n if (output?.script) {\n return OP_RETURN_OVERHEAD + output.script.length + (output.script.length >= 74 ? 2 : 1);\n }\n if (scriptType) {\n return OutputSizes[scriptType];\n }\n return OutputSizes[UTXOScriptType.P2PKH];\n};\n",
|
|
9
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { Chain, USwapError, type UTXOChain } from \"@tcswap/helpers\";\n\nimport {\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n TX_OVERHEAD,\n UTXOScriptType,\n} from \"../helpers/txSize\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport function getDustThreshold(chain: UTXOChain) {\n switch (chain) {\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n return 550;\n case Chain.Dash:\n case Chain.Litecoin:\n return 5500;\n case Chain.Dogecoin:\n return 100000;\n case Chain.Zcash:\n return 546;\n default:\n throw new USwapError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport function accumulative({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n changeAddress = \"\",\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain; changeAddress?: string }) {\n const feeRate = Math.ceil(initialFeeRate);\n\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n // skip input if adding it would cost more than input is worth\n const filteredInputs = inputs.filter((input) => getInputSize(input) * feeRate <= input.value);\n\n const txSizeWithoutInputs =\n TX_OVERHEAD + outputs.reduce((total, output) => total + getOutputSize(output, newTxType), 0);\n\n const amountToSend = outputs.reduce((total, output) => total + output.value, 0);\n\n let fees = txSizeWithoutInputs * feeRate;\n let inputsValue = 0;\n const inputsToUse: typeof inputs = [];\n\n for (const input of filteredInputs) {\n const inputSize = getInputSize(input);\n const inputFee = feeRate * inputSize;\n\n fees += inputFee;\n inputsValue += input.value;\n\n inputsToUse.push(input);\n\n const totalCost = fees + amountToSend;\n\n // we need more inputs\n if (inputsValue < totalCost) continue;\n\n const remainder = inputsValue - totalCost;\n\n const feeForExtraOutput = feeRate * getOutputSize({ address: \"\", value: 0 }, newTxType);\n\n // potential change address\n if (remainder > feeForExtraOutput) {\n const feeAfterExtraOutput = feeForExtraOutput + fees;\n const remainderAfterExtraOutput = inputsValue - (amountToSend + feeAfterExtraOutput);\n\n // is it worth a change output aka can we send it in the future?\n if (remainderAfterExtraOutput > Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))) {\n return {\n fee: feeAfterExtraOutput,\n inputs: inputsToUse,\n outputs: outputs.concat({ address: changeAddress, value: remainderAfterExtraOutput }),\n };\n }\n }\n return { fee: fees, inputs: inputsToUse, outputs };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ feeRate, inputs, outputs }) };\n}\n",
|
|
10
|
+
"export * from \"./api\";\nexport * from \"./bchaddrjs\";\nexport * from \"./coinselect\";\nexport * from \"./txSize\";\n",
|
|
11
|
+
"import { networks, address as zcashAddress } from \"@bitgo/utxo-lib\";\nimport bs58check from \"bs58check\";\nimport { UtxoNetwork as bchNetwork, detectAddressNetwork, isValidAddress } from \"../helpers\";\n\nexport function stripPrefix(address: string) {\n return address.replace(/(bchtest:|bitcoincash:)/, \"\");\n}\n\nexport function bchValidateAddress(address: string) {\n const strippedAddress = stripPrefix(address);\n return isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet;\n}\n\nexport function validateZcashAddress(address: string): boolean {\n try {\n if (address.startsWith(\"z\")) {\n console.warn(\"Shielded Zcash addresses (z-addresses) are not supported. Use transparent addresses (t1/t3) only.\");\n return false;\n }\n\n const network = networks.zcash;\n\n try {\n zcashAddress.toOutputScript(address, network);\n return true;\n } catch {\n const decoded = bs58check.decode(address);\n if (decoded.length < 21) return false;\n\n const version = decoded[0];\n return version === network.pubKeyHash || version === network.scriptHash;\n }\n } catch {\n return false;\n }\n}\n",
|
|
12
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport secp256k1 from \"@bitcoinerlab/secp256k1\";\n// @ts-expect-error\nimport { ECPair, HDNode } from \"@psf/bitcoincashjs-lib\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n AssetValue,\n applyFeeMultiplier,\n Chain,\n type ChainSigner,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n NetworkDerivationPath,\n USwapError,\n USwapNumber,\n type UTXOChain,\n updateDerivationPath,\n} from \"@tcswap/helpers\";\nimport { address as btcLibAddress, initEccLib, Psbt, payments } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\nimport { ECPairFactory } from \"ecpair\";\nimport { getBalance } from \"../../utils\";\nimport {\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getUtxoApi,\n getUtxoNetwork,\n UTXOScriptType,\n} from \"../helpers\";\nimport type { BchECPair, TargetOutput, UTXOBuildTxParams, UTXOTransferParams, UTXOType } from \"../types\";\nimport type { UtxoToolboxParams } from \"./params\";\nimport { bchValidateAddress, validateZcashAddress } from \"./validators\";\n\nexport const nonSegwitChains: UTXOChain[] = [Chain.Dash, Chain.Dogecoin, Chain.Zcash, Chain.BitcoinCash];\n\nexport function addInputsAndOutputs({\n inputs,\n outputs,\n chain,\n psbt,\n sender,\n compiledMemo,\n}: {\n inputs: UTXOType[];\n outputs: TargetOutput[];\n chain: UTXOChain;\n psbt: Psbt;\n sender: string;\n compiledMemo: Buffer<ArrayBufferLike> | null;\n}) {\n for (const utxo of inputs) {\n const witnessInfo = !!utxo.witnessUtxo && !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo };\n\n const nonWitnessInfo = nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n };\n\n psbt.addInput({ hash: utxo.hash, index: utxo.index, ...witnessInfo, ...nonWitnessInfo });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const hasOutputScript = output.script;\n\n if (hasOutputScript && !compiledMemo) {\n continue;\n }\n\n const mappedOutput = hasOutputScript\n ? { script: compiledMemo as Buffer<ArrayBufferLike>, value: 0 }\n : { address, value: output.value };\n\n initEccLib(secp256k1);\n psbt.addOutput(mappedOutput);\n }\n\n return { inputs, psbt };\n}\n\nasync function createTransaction({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n}: UTXOBuildTxParams): Promise<{ psbt: Psbt; utxos: UTXOType[]; inputs: UTXOType[] }> {\n const chain = assetValue.chain as UTXOChain;\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({ assetValue, fetchTxHex, memo, recipient, sender });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, chain, feeRate });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new USwapError(\"toolbox_utxo_insufficient_balance\", { assetValue, sender });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n const { psbt: mappedPsbt, inputs: mappedInputs } = await addInputsAndOutputs({\n chain,\n compiledMemo,\n inputs,\n outputs,\n psbt,\n sender,\n });\n\n return { inputs: mappedInputs, psbt: mappedPsbt, utxos: inputsAndOutputs.inputs };\n}\n\nexport async function getUTXOAddressValidator() {\n const getNetwork = await getUtxoNetwork();\n\n return function validateAddress({ address, chain }: { address: string; chain: UTXOChain }) {\n if (chain === Chain.BitcoinCash) {\n return bchValidateAddress(address);\n }\n\n if (chain === Chain.Zcash) {\n return validateZcashAddress(address);\n }\n\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch {\n return false;\n }\n };\n}\n\nasync function createSignerWithKeys({\n chain,\n phrase,\n derivationPath,\n}: {\n chain: UTXOChain;\n phrase: string;\n derivationPath: string;\n}) {\n const keyPair = (await getCreateKeysForPath(chain as typeof Chain.Bitcoin))({ derivationPath, phrase });\n\n async function signTransaction(psbt: Psbt) {\n await psbt.signAllInputs(keyPair);\n return psbt;\n }\n\n function getAddress() {\n const addressGetter = addressFromKeysGetter(chain);\n return addressGetter(keyPair);\n }\n\n return { getAddress, signTransaction };\n}\n\nexport async function createUTXOToolbox<T extends UTXOChain>({\n chain,\n ...toolboxParams\n}: (UtxoToolboxParams[T] | { phrase?: string; derivationPath?: DerivationPathArray; index?: number }) & { chain: T }) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const signer = phrase\n ? await createSignerWithKeys({ chain, derivationPath, phrase })\n : \"signer\" in toolboxParams\n ? toolboxParams.signer\n : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n // const { signer } = params || {};\n const validateAddress = await getUTXOAddressValidator();\n const createKeysForPath = await getCreateKeysForPath(chain);\n\n return {\n accumulative,\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n calculateTxSize,\n createKeysForPath,\n createTransaction,\n estimateMaxSendableAmount: estimateMaxSendableAmount(chain),\n estimateTransactionFee: estimateTransactionFee(chain),\n getAddress,\n getAddressFromKeys: addressFromKeysGetter(chain),\n\n getBalance: getBalance(chain),\n getFeeRates: () => getFeeRates(chain),\n getInputsOutputsFee,\n getPrivateKeyFromMnemonic: (params: { phrase: string; derivationPath: string }) => {\n const keys = createKeysForPath(params);\n return keys.toWIF();\n },\n transfer: transfer(signer as UtxoToolboxParams[\"BTC\"][\"signer\"]),\n validateAddress: (address: string) => validateAddress({ address, chain }),\n };\n}\n\nasync function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n memo,\n sender,\n recipient,\n}: Omit<UTXOBuildTxParams, \"feeRate\"> & { feeOptionKey?: FeeOption; feeRate?: number }) {\n const chain = assetValue.chain as UTXOChain;\n\n const inputsAndOutputs = await getInputsAndTargetOutputs({ assetValue, memo, recipient, sender });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, chain, feeRate: feeRateWhole });\n}\n\nfunction estimateMaxSendableAmount(chain: UTXOChain) {\n return async function estimateMaxSendableAmount({\n from,\n memo,\n feeRate,\n feeOptionKey = FeeOption.Fast,\n recipients = 1,\n }: {\n from: string;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n recipients?: number | TargetOutput[];\n }) {\n const addressData = await getUtxoApi(chain).getAddressData(from);\n const feeRateWhole = feeRate ? Math.ceil(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n const inputs = addressData?.utxo\n .map((utxo) => ({\n ...utxo,\n hash: \"\",\n // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n }))\n .filter((utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole));\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({ chain, value: inputs.reduce((sum, utxo) => sum + utxo.value, 0) });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({ address: from, value: 0 })) as TargetOutput[])\n : recipients;\n\n if (memo) {\n const script = await compileMemo(memo);\n outputs.push({ address: from, script, value: 0 });\n }\n\n const txSize = calculateTxSize({ feeRate: feeRateWhole, inputs, outputs });\n\n const fee = txSize * feeRateWhole;\n\n return balance.sub(fee);\n };\n}\n\nfunction estimateTransactionFee(chain: UTXOChain) {\n return async (params: {\n assetValue: AssetValue;\n recipient: string;\n sender: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const inputFees = await getInputsOutputsFee(params);\n\n return AssetValue.from({ chain, value: USwapNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\") });\n };\n}\n\ntype CreateKeysForPathReturnType = {\n [Chain.BitcoinCash]: BchECPair;\n [Chain.Bitcoin]: ECPairInterface;\n [Chain.Dash]: ECPairInterface;\n [Chain.Dogecoin]: ECPairInterface;\n [Chain.Litecoin]: ECPairInterface;\n [Chain.Zcash]: ECPairInterface;\n};\n\nexport async function getCreateKeysForPath<T extends keyof CreateKeysForPathReturnType>(\n chain: T,\n): Promise<(params: { wif?: string; phrase?: string; derivationPath?: string }) => CreateKeysForPathReturnType[T]> {\n const getNetwork = await getUtxoNetwork();\n\n switch (chain) {\n case Chain.BitcoinCash: {\n return function createKeysForPath({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n }: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) {\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPair.fromWIF(wif, network) as BchECPair;\n }\n if (!phrase) throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"No phrase provided\" });\n\n const masterHDNode = HDNode.fromSeedBuffer(Buffer.from(mnemonicToSeedSync(phrase)), network);\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n\n return keyPair as BchECPair;\n } as (params: { wif?: string; phrase?: string; derivationPath?: string }) => CreateKeysForPathReturnType[T];\n }\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Zcash:\n case Chain.Dash: {\n return function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n }: {\n phrase?: string;\n wif?: string;\n derivationPath: string;\n }) {\n if (!(wif || phrase))\n throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Either phrase or wif must be provided\" });\n\n const factory = ECPairFactory(secp256k1);\n const network = getNetwork(chain);\n\n if (wif) return factory.fromWIF(wif, network);\n\n const seed = mnemonicToSeedSync(phrase as string);\n const master = HDKey.fromMasterSeed(seed, network).derive(derivationPath);\n if (!master.privateKey)\n throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Could not get private key from phrase\" });\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n } as (params: { wif?: string; phrase?: string; derivationPath?: string }) => CreateKeysForPathReturnType[T];\n }\n default:\n throw new USwapError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport function addressFromKeysGetter(chain: UTXOChain) {\n const getNetwork = getUtxoNetwork();\n\n return function getAddressFromKeys(keys: ECPairInterface | BchECPair) {\n if (!keys) throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Keys must be provided\" });\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ network: getNetwork(chain), pubkey: keys.publicKey as Buffer });\n if (!address) throw new USwapError(\"toolbox_utxo_invalid_address\", { error: \"Address not defined\" });\n\n return address;\n };\n}\n\nfunction transfer(signer?: ChainSigner<Psbt, Psbt>) {\n return async function transfer({ memo, recipient, feeOptionKey, feeRate, assetValue }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n\n const chain = assetValue.chain as UTXOChain;\n\n if (!(signer && from)) throw new USwapError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Recipient address must be provided\" });\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await createTransaction({ assetValue, feeRate: txFeeRate, memo, recipient, sender: from });\n const signedPsbt = await signer.signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return getUtxoApi(chain).broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return {\n [FeeOption.Average]: suggestedFeeRate,\n [FeeOption.Fast]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fast),\n [FeeOption.Fastest]: applyFeeMultiplier(suggestedFeeRate, FeeOption.Fastest),\n };\n}\n\nasync function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex: fetchTxOverwrite = false,\n}: Omit<UTXOBuildTxParams, \"feeRate\">) {\n const chain = assetValue.chain as UTXOChain;\n const feeRate = (await getFeeRates(chain))[FeeOption.Fastest];\n\n const fetchTxHex = fetchTxOverwrite || nonSegwitChains.includes(chain);\n\n const amountToSend = assetValue.getBaseValue(\"number\");\n\n // Overestimate by 5000 byte * highest feeRate to ensure we have enough UTXOs for fees and change\n const targetValue = Math.ceil(amountToSend + feeRate * 5000);\n\n const inputs = await getUtxoApi(chain).getUtxos({ address: sender, fetchTxHex, targetValue });\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: amountToSend },\n ...(memo ? [{ address: \"\", script: await compileMemo(memo), value: 0 }] : []),\n ],\n };\n}\n",
|
|
13
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport {\n address as bchAddress,\n Transaction,\n TransactionBuilder,\n // @ts-expect-error\n} from \"@psf/bitcoincashjs-lib\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n NetworkDerivationPath,\n USwapError,\n updateDerivationPath,\n} from \"@tcswap/helpers\";\nimport { Psbt } from \"bitcoinjs-lib\";\nimport { accumulative, compileMemo, getUtxoApi, getUtxoNetwork, toCashAddress, toLegacyAddress } from \"../helpers\";\nimport type {\n BchECPair,\n TargetOutput,\n TransactionBuilderType,\n TransactionType,\n UTXOBuildTxParams,\n UTXOTransferParams,\n UTXOType,\n} from \"../types\";\nimport type { UtxoToolboxParams } from \"./params\";\nimport { createUTXOToolbox, getCreateKeysForPath } from \"./utxo\";\nimport { bchValidateAddress, stripPrefix } from \"./validators\";\n\nconst chain = Chain.BitcoinCash;\n\nexport function stripToCashAddress(address: string) {\n return stripPrefix(toCashAddress(address));\n}\n\nfunction createSignerWithKeys(keys: BchECPair) {\n function signTransaction({ builder, utxos }: { builder: TransactionBuilderType; utxos: UTXOType[] }) {\n utxos.forEach((utxo, index) => {\n builder.sign(index, keys, undefined, 0x41, utxo.witnessUtxo?.value);\n });\n\n return builder.build();\n }\n\n const getAddress = () => {\n const address = keys.getAddress(0);\n return Promise.resolve(stripToCashAddress(address));\n };\n\n return { getAddress, signTransaction };\n}\n\nexport async function createBCHToolbox<T extends typeof Chain.BitcoinCash>(\n toolboxParams: UtxoToolboxParams[T] | { phrase?: string; derivationPath?: DerivationPathArray; index?: number },\n) {\n const phrase = \"phrase\" in toolboxParams ? toolboxParams.phrase : undefined;\n\n const index = \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n\n const derivationPath = derivationPathToString(\n \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[chain], { index }),\n );\n\n const keys = phrase ? (await getCreateKeysForPath(chain))({ derivationPath, phrase }) : undefined;\n\n const signer = keys ? createSignerWithKeys(keys) : \"signer\" in toolboxParams ? toolboxParams.signer : undefined;\n\n function getAddress() {\n return Promise.resolve(signer?.getAddress());\n }\n\n const { getBalance, getFeeRates, broadcastTx, ...toolbox } = await createUTXOToolbox({ chain });\n\n function handleGetBalance(address: string, _scamFilter = true) {\n return getBalance(stripPrefix(toCashAddress(address)));\n }\n\n return {\n ...toolbox,\n broadcastTx,\n buildTx,\n createTransaction,\n getAddress,\n getAddressFromKeys,\n getBalance: handleGetBalance,\n getFeeRates,\n stripPrefix,\n stripToCashAddress,\n transfer: transfer({ broadcastTx, getFeeRates, signer }),\n validateAddress: bchValidateAddress,\n };\n}\n\nasync function createTransaction({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n if (!bchValidateAddress(recipient)) throw new USwapError(\"toolbox_utxo_invalid_address\", { address: recipient });\n\n // Overestimate by 7500 byte * feeRate to ensure we have enough UTXOs for fees and change\n const targetValue = Math.ceil(assetValue.getBaseValue(\"number\") + feeRate * 7500);\n\n const utxos = await getUtxoApi(chain).getUtxos({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n targetValue,\n });\n\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs: TargetOutput[] = [];\n // output to recipient\n targetOutputs.push({ address: recipient, value: assetValue.getBaseValue(\"number\") });\n const { inputs, outputs } = accumulative({ chain, feeRate, inputs: utxos, outputs: targetOutputs });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new USwapError(\"toolbox_utxo_insufficient_balance\", { assetValue, sender });\n const getNetwork = await getUtxoNetwork();\n const builder = new TransactionBuilder(getNetwork(chain)) as TransactionBuilderType;\n\n await Promise.all(\n inputs.map(async (utxo: UTXOType) => {\n const txHex = await getUtxoApi(chain).getRawTx(utxo.hash);\n\n builder.addInput(Transaction.fromBuffer(Buffer.from(txHex, \"hex\")), utxo.index);\n }),\n );\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const getNetwork = await getUtxoNetwork();\n const outputScript = bchAddress.toOutputScript(toLegacyAddress(address), getNetwork(chain));\n\n builder.addOutput(outputScript, output.value);\n }\n\n // add output for memo\n if (compiledMemo) {\n builder.addOutput(compiledMemo, 0); // Add OP_RETURN {script, value}\n }\n\n return { builder, utxos: inputs };\n}\n\nfunction transfer({\n broadcastTx,\n getFeeRates,\n signer,\n}: {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n signer?: ChainSigner<{ builder: TransactionBuilderType; utxos: UTXOType[] }, TransactionType>;\n}) {\n return async function transfer({\n recipient,\n assetValue,\n feeOptionKey = FeeOption.Fast,\n ...rest\n }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) throw new USwapError(\"toolbox_utxo_no_signer\");\n if (!recipient)\n throw new USwapError(\"toolbox_utxo_invalid_params\", { error: \"Recipient address must be provided\" });\n\n const feeRate = rest.feeRate || (await getFeeRates())[feeOptionKey];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await createTransaction({ ...rest, assetValue, feeRate, recipient, sender: from });\n\n const tx = await signer.signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n };\n}\n\nasync function buildTx({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n setSigHashType,\n}: UTXOBuildTxParams & { setSigHashType?: boolean }) {\n const recipientCashAddress = toCashAddress(recipient);\n if (!bchValidateAddress(recipientCashAddress))\n throw new USwapError(\"toolbox_utxo_invalid_address\", { address: recipientCashAddress });\n\n // Overestimate by 7500 byte * feeRate to ensure we have enough UTXOs for fees and change\n const targetValue = Math.ceil(assetValue.getBaseValue(\"number\") + feeRate * 7500);\n\n const utxos = await getUtxoApi(chain).getUtxos({\n address: stripToCashAddress(sender),\n fetchTxHex: false,\n targetValue,\n });\n\n const feeRateWhole = Number(feeRate.toFixed(0));\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs = [] as TargetOutput[];\n\n // output to recipient\n targetOutputs.push({ address: toLegacyAddress(recipient), value: assetValue.getBaseValue(\"number\") });\n\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 });\n }\n\n const { inputs, outputs } = accumulative({ chain, feeRate: feeRateWhole, inputs: utxos, outputs: targetOutputs });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new USwapError(\"toolbox_utxo_insufficient_balance\", { assetValue, sender });\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) }); // Network-specific\n\n for (const { hash, index, witnessUtxo } of inputs) {\n psbt.addInput({ hash, index, sighashType: setSigHashType ? 0x41 : undefined, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n psbt.addOutput(params);\n }\n }\n\n return { inputs: inputs as UTXOType[], psbt, utxos };\n}\n\nfunction getAddressFromKeys(keys: { getAddress: (index?: number) => string }) {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n}\n",
|
|
14
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { bitgo, crypto, ECPair, networks, address as zcashAddress } from \"@bitgo/utxo-lib\";\nimport { type ZcashPsbt, ZcashTransaction } from \"@bitgo/utxo-lib/dist/src/bitgo\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n Chain,\n type ChainSigner,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n NetworkDerivationPath,\n USwapConfig,\n USwapError,\n updateDerivationPath,\n} from \"@tcswap/helpers\";\nimport bs58check from \"bs58check\";\nimport { match, P } from \"ts-pattern\";\nimport { accumulative, compileMemo, getUtxoApi } from \"../helpers\";\nimport type { TargetOutput, UTXOBuildTxParams, UTXOTransferParams, UTXOType } from \"../types\";\nimport { createUTXOToolbox } from \"./utxo\";\nimport { validateZcashAddress } from \"./validators\";\n\nfunction getZcashNetwork() {\n return networks.zcash;\n}\n\nfunction getECPairNetwork() {\n return {\n bech32: undefined,\n bip32: { private: 0x0488ade4, public: 0x0488b21e },\n messagePrefix: \"\\x18ZCash Signed Message:\\n\",\n pubKeyHash: 0x1c,\n scriptHash: 0x1c,\n wif: 0x80,\n };\n}\n\ntype ZcashSigner = ChainSigner<ZcashPsbt, ZcashPsbt>;\n\nfunction createZcashSignerFromPhrase({\n phrase,\n derivationPath,\n}: {\n phrase: string;\n derivationPath: string;\n}): ZcashSigner {\n const seed = mnemonicToSeedSync(phrase);\n const root = HDKey.fromMasterSeed(seed);\n const node = root.derive(derivationPath);\n\n if (!node.privateKey) {\n throw new USwapError(\"toolbox_utxo_invalid_params\");\n }\n\n // Create key pair using BitGo's ECPair with ECPair-compatible network\n const ecpairNetwork = getECPairNetwork();\n const keyPair = ECPair.fromPrivateKey(Buffer.from(node.privateKey), { network: ecpairNetwork });\n\n const pubKeyHash = crypto.hash160(keyPair.publicKey);\n const { isStagenet } = USwapConfig.get(\"envs\");\n\n const prefix = isStagenet\n ? Buffer.from([0x1d, 0x25]) // testnet prefix (results in tm... addresses)\n : Buffer.from([0x1c, 0xb8]); // mainnet prefix (results in t1... addresses)\n\n const payload = Buffer.concat([prefix, pubKeyHash]);\n\n const address = bs58check.encode(payload);\n\n return {\n getAddress: () => Promise.resolve(address),\n\n signTransaction: (psbt) => {\n const signedPsbt = psbt.signAllInputs(keyPair);\n\n return Promise.resolve(signedPsbt);\n },\n };\n}\n\nfunction addInputsAndOutputs({\n inputs,\n outputs,\n psbt,\n sender,\n compiledMemo,\n}: {\n inputs: UTXOType[];\n outputs: TargetOutput[];\n psbt: ZcashPsbt;\n sender: string;\n compiledMemo: Buffer<ArrayBufferLike> | null;\n}) {\n for (const utxo of inputs) {\n const witnessInfo = !!utxo.witnessUtxo && { witnessUtxo: { ...utxo.witnessUtxo, value: BigInt(utxo.value) } };\n\n const nonWitnessInfo = !utxo.witnessUtxo && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n };\n\n psbt.addInput({ hash: utxo.hash, index: utxo.index, ...witnessInfo, ...nonWitnessInfo });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const hasOutputScript = output.script;\n\n if (hasOutputScript && !compiledMemo) {\n continue;\n }\n\n const mappedOutput = hasOutputScript\n ? { script: compiledMemo as Buffer<ArrayBufferLike>, value: 0n }\n : { script: zcashAddress.toOutputScript(address, getZcashNetwork()), value: BigInt(output.value) };\n\n psbt.addOutput(mappedOutput);\n }\n\n return { inputs, psbt };\n}\n\nasync function createTransaction(buildTxParams: UTXOBuildTxParams) {\n const { assetValue, recipient, memo, feeRate, sender, fetchTxHex } = buildTxParams;\n\n const compiledMemo = memo ? compileMemo(memo) : null;\n\n const utxos = await getUtxoApi(Chain.Zcash).getUtxos({ address: sender, fetchTxHex: fetchTxHex !== false });\n\n const targetOutputs = [\n { address: recipient, value: Number(assetValue.getBaseValue(\"string\")) },\n ...(compiledMemo ? [{ script: compiledMemo, value: 0 }] : []),\n ];\n\n const { inputs, outputs } = accumulative({\n chain: Chain.Zcash,\n changeAddress: sender, // Overwrite change address to sender\n feeRate,\n inputs: utxos,\n outputs: targetOutputs,\n });\n\n if (!(inputs && outputs)) {\n throw new USwapError(\"toolbox_utxo_insufficient_balance\", { assetValue, sender });\n }\n\n const psbt = bitgo.createPsbtForNetwork(\n { network: getZcashNetwork() },\n { version: ZcashTransaction.VERSION4_BRANCH_NU6_1 },\n ) as ZcashPsbt;\n\n const { psbt: mappedPsbt, inputs: mappedInputs } = await addInputsAndOutputs({\n compiledMemo,\n inputs,\n outputs,\n psbt,\n sender,\n });\n\n mappedPsbt.setDefaultsForVersion(getZcashNetwork(), ZcashTransaction.VERSION4_BRANCH_NU6_1);\n\n return { inputs: mappedInputs, outputs, psbt: mappedPsbt };\n}\n\nexport async function createZcashToolbox(\n toolboxParams: { signer?: ZcashSigner } | { phrase?: string; derivationPath?: DerivationPathArray; index?: number },\n) {\n const signer = await match(toolboxParams)\n .with({ signer: P.not(P.nullish) }, ({ signer }) => Promise.resolve(signer))\n .with({ phrase: P.string }, ({ phrase, derivationPath, index = 0 }) => {\n const baseDerivationPath = derivationPath || NetworkDerivationPath[Chain.Zcash] || [44, 133, 0, 0, 0];\n const updatedPath = updateDerivationPath(baseDerivationPath, { index });\n const pathString = derivationPathToString(updatedPath);\n\n return createZcashSignerFromPhrase({ derivationPath: pathString, phrase });\n })\n .otherwise(() => Promise.resolve(undefined));\n\n const baseToolbox = await createUTXOToolbox({ chain: Chain.Zcash, signer });\n\n async function transfer({ recipient, assetValue, feeOptionKey = FeeOption.Fast, ...rest }: UTXOTransferParams) {\n const from = await signer?.getAddress();\n if (!(signer && from)) {\n throw new USwapError(\"toolbox_utxo_no_signer\");\n }\n\n const feeRate = rest.feeRate || (await baseToolbox.getFeeRates())[feeOptionKey];\n\n const { psbt } = await createTransaction({ ...rest, assetValue, feeRate, recipient, sender: from });\n\n const signedPsbt = await signer.signTransaction(psbt);\n\n signedPsbt.validateSignaturesOfAllInputs();\n\n signedPsbt.finalizeAllInputs();\n\n const finalTx = signedPsbt.extractTransaction();\n const txHex = finalTx.toHex();\n\n return baseToolbox.broadcastTx(txHex);\n }\n\n function createKeysForPath({\n phrase,\n derivationPath = \"m/44'/133'/0'/0/0\",\n }: {\n phrase: string;\n derivationPath?: string;\n }) {\n const seed = mnemonicToSeedSync(phrase);\n const root = HDKey.fromMasterSeed(seed);\n const node = root.derive(derivationPath);\n\n if (!node.privateKey) {\n throw new USwapError(\"toolbox_utxo_invalid_params\");\n }\n\n const ecpairNetwork = getECPairNetwork();\n const keyPair = ECPair.fromPrivateKey(Buffer.from(node.privateKey), { network: ecpairNetwork });\n\n return keyPair;\n }\n\n function getPrivateKeyFromMnemonic({\n phrase,\n derivationPath = \"m/44'/133'/0'/0/0\",\n }: {\n phrase: string;\n derivationPath: string;\n }) {\n const keys = createKeysForPath({ derivationPath, phrase });\n return keys.toWIF();\n }\n\n return {\n ...baseToolbox,\n createKeysForPath,\n createTransaction,\n getPrivateKeyFromMnemonic,\n transfer,\n validateAddress: validateZcashAddress,\n };\n}\n",
|
|
15
|
+
"/**\n * Modifications © 2025 Horizontal Systems.\n */\n\nimport { Chain, type DerivationPathArray, USwapError, type UTXOChain } from \"@tcswap/helpers\";\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport type { UtxoToolboxParams } from \"./params\";\nimport { createUTXOToolbox } from \"./utxo\";\nimport { createZcashToolbox } from \"./zcash\";\n\ntype BCHToolbox = Awaited<ReturnType<typeof createBCHToolbox>>;\ntype CommonUTXOToolbox = Awaited<\n ReturnType<typeof createUTXOToolbox<Exclude<UTXOChain, typeof Chain.BitcoinCash | typeof Chain.Zcash>>>\n>;\ntype ZcashToolbox = Awaited<ReturnType<typeof createZcashToolbox>>;\n\nexport type UTXOToolboxes = {\n [Chain.BitcoinCash]: BCHToolbox;\n [Chain.Bitcoin]: CommonUTXOToolbox;\n [Chain.Dogecoin]: CommonUTXOToolbox;\n [Chain.Litecoin]: CommonUTXOToolbox;\n [Chain.Dash]: CommonUTXOToolbox;\n [Chain.Zcash]: ZcashToolbox;\n};\n\nexport type UTXOWallets = {\n [key in keyof UTXOToolboxes]: UTXOToolboxes[key];\n};\n\nexport async function getUtxoToolbox<T extends keyof UTXOToolboxes>(\n chain: T,\n params?: UtxoToolboxParams[T] | { phrase?: string; derivationPath?: DerivationPathArray; index?: number },\n): Promise<UTXOToolboxes[T]> {\n switch (chain) {\n case Chain.BitcoinCash: {\n const toolbox = await createBCHToolbox((params as UtxoToolboxParams[typeof Chain.BitcoinCash]) || {});\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Zcash: {\n const toolbox = await createZcashToolbox(params as UtxoToolboxParams[typeof Chain.Zcash]);\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Dash: {\n const toolbox = await createUTXOToolbox({\n chain,\n ...(params as UtxoToolboxParams[Exclude<T, typeof Chain.BitcoinCash | typeof Chain.Zcash>]),\n });\n return toolbox as UTXOToolboxes[Exclude<T, typeof Chain.BitcoinCash | typeof Chain.Zcash>];\n }\n\n default:\n throw new USwapError(\"toolbox_utxo_not_supported\", { chain });\n }\n}\n\nexport { stripToCashAddress } from \"./bitcoinCash\";\nexport * from \"./params\";\nexport { bchValidateAddress, stripPrefix, validateZcashAddress } from \"./validators\";\n",
|
|
16
|
+
"export * from \"./helpers\";\nexport * from \"./toolbox\";\nexport * from \"./toolbox/bitcoinCash\";\nexport * from \"./toolbox/utxo\";\nexport * from \"./toolbox/zcash\";\nexport * from \"./types\";\n"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "0DE91A6D08842D3B64756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var $B=Object.defineProperty;var jB=(X)=>X;function qB(X,B){this[X]=jB.bind(null,B)}var WB=(X,B)=>{for(var Z in B)$B(X,Z,{get:B[Z],enumerable:!0,configurable:!0,set:qB.bind(B,Z)})};var v=(X,B)=>()=>(X&&(B=X(X=0)),B);var RZ=((X)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(X,{get:(B,Z)=>(typeof require<"u"?require:B)[Z]}):X)(function(X){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+X+'" is not supported')});import{AssetValue as AX,getChainConfig as LB}from"@tcswap/helpers";import{USwapApi as YB}from"@tcswap/helpers/api";function FX(){function X(){let B=Date.now(),Z=WX||B;return WX=Z,B>WX?B:Z+1}return TB+X().toString(36)}function EX(X){return async function(Z,G=!0){let $=await YB.getChainBalance({address:Z,chain:X,scamFilter:G}),{baseDecimal:Q}=LB(X),J=$.map(({identifier:q,value:W,decimal:L})=>{return new AX({decimal:L||Q,identifier:q,value:W})});if(!J.some((q)=>q.isGasAsset))return[AX.from({chain:X}),...J];return J}}var TB,WX=0;var LX=v(()=>{TB=typeof process<"u"&&process.pid?process.pid.toString(36):""});import{networks as DB}from"@bitgo/utxo-lib";import{Chain as C,getRPCUrl as zB,RequestClient as t,USwapConfig as CB,USwapError as A,warnOnce as IB}from"@tcswap/helpers";import{networks as MB}from"bitcoinjs-lib";import p from"coininfo";async function _B({chain:X,txHash:B}){let Z=`${e(X)}/push/transaction`,G=JSON.stringify({data:B});try{let $=await t.post(Z,{body:G,headers:{"Content-Type":"application/json"}});if($.context.code!==200)throw new A("toolbox_utxo_broadcast_failed",{error:$.context.error||"Transaction broadcast failed"});return $.data?.transaction_hash||B}catch($){let Q=await zB(X);if(Q){let J=JSON.stringify({id:FX(),jsonrpc:"2.0",method:"sendrawtransaction",params:[B]}),j=await t.post(Q,{body:J,headers:{"Content-Type":"application/json"}});if(j.error)throw new A("toolbox_utxo_broadcast_failed",{error:j.error?.message});if(j.result.includes('"code":-26'))throw new A("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return j.result}throw $}}function e(X){return`https://api.blockchair.com/${HB(X)}`}function fX(X){switch(X){case C.Bitcoin:return 5;case C.Dogecoin:return 1e4;case C.Litecoin:return 1;case C.Zcash:return 1;default:return 2}}function HB(X){switch(X){case C.BitcoinCash:return"bitcoin-cash";case C.Litecoin:return"litecoin";case C.Dash:return"dash";case C.Dogecoin:return"dogecoin";case C.Zcash:return"zcash";case C.Polkadot:return"polkadot";default:return"bitcoin"}}async function vB(X){try{let{feePerKb:B}=await t.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),Z=B/1000;return Math.max(Z,fX(X))}catch{return fX(X)}}async function YX(X,B){let Z=await t.get(`${X}${B?`${X.includes("?")?"&":"?"}key=${B}`:""}`);if(!Z||Z.context.code!==200)throw new A("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return Z.data}async function PX({address:X,chain:B,apiKey:Z}){if(!X)throw new A("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await YX(`${e(B)}/dashboards/address/${X}?transaction_details=true`,Z))[X]}catch{return{address:{balance:0,transaction_count:0},utxo:[]}}}async function NB({address:X,chain:B,apiKey:Z}){return(await PX({address:X,apiKey:Z,chain:B}))?.address.balance||0}async function VX({chain:X,apiKey:B,txHash:Z}){if(!Z)throw new A("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await YX(`${e(X)}/raw/transaction/${Z}`,B))?.[Z]?.raw_transaction||""}catch(G){let $=G instanceof Error?G.message:String(G);return console.error(`Failed to fetch raw transaction: ${$}`),""}}async function yB({chain:X,address:B,apiKey:Z,offset:G=0,limit:$=30}){return(await YX(`${e(X)}/outputs?q=recipient(${B}),is_spent(false),value(..2000000000000000)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${$}&offset=${G}`,Z)).map(({is_spent:q,script_hex:W,block_id:L,transaction_hash:Y,index:D,value:T,spending_signature_hex:z})=>({hash:Y,index:D,is_confirmed:L!==-1,is_spent:q,script_hex:W,txHex:z,value:T}))}function OB(X){return X.reduce((B,Z)=>B+Z.value,0)}function RX(X,B){let Z=[...X].sort((G,$)=>$.value-G.value);if(B){let G=[],$=0;for(let Q of Z)if(G.push(Q),$+=Q.value,$>=B)break;return G}return Z}async function SX({chain:X,address:B,apiKey:Z,targetValue:G,accumulativeValue:$=0,offset:Q=0,limit:J=30}){if(!B)throw new A("toolbox_utxo_invalid_params",{error:"Address is required"});try{let j=await yB({address:B,apiKey:Z,chain:X,limit:J,offset:Q,targetValue:G}),W=j.length<J,L=j.filter(({is_spent:I})=>!I),Y=OB(L),D=$+Y,T=G&&D>=G;if(W||T)return RX(L,G);let z=await SX({accumulativeValue:D,address:B,apiKey:Z,chain:X,limit:J,offset:Q+J,targetValue:G}),M=[...L,...z];return RX(M,G)}catch(j){let q=j instanceof Error?j.message:String(j);return console.error(`Failed to fetch unspent UTXOs: ${q}`),[]}}async function UB({address:X,chain:B,apiKey:Z,fetchTxHex:G=!0,targetValue:$}){let Q=await SX({address:X,apiKey:Z,chain:B,targetValue:$}),J=[];for(let{hash:j,index:q,script_hex:W,value:L}of Q){let Y;if(G)Y=await VX({apiKey:Z,chain:B,txHash:j});J.push({address:X,hash:j,index:q,txHex:Y,value:L,witnessUtxo:{script:Buffer.from(W,"hex"),value:L}})}return J}function _(X){let B=CB.get("apiKeys").blockchair||"";return IB({condition:!B,id:"no_blockchair_api_key_warning",warning:"No Blockchair API key found. Functionality will be limited."}),{broadcastTx:(Z)=>_B({chain:X,txHash:Z}),getAddressData:(Z)=>PX({address:Z,apiKey:B,chain:X}),getBalance:(Z)=>NB({address:Z,apiKey:B,chain:X}),getRawTx:(Z)=>VX({apiKey:B,chain:X,txHash:Z}),getSuggestedTxFee:()=>vB(X),getUtxos:(Z)=>UB({...Z,apiKey:B,chain:X})}}function KB(X){return X}function y(){return function(B){switch(B){case C.Bitcoin:return MB.bitcoin;case C.BitcoinCash:return p.bitcoincash.main.toBitcoinJS();case C.Dash:return p.dash.main.toBitcoinJS();case C.Litecoin:return p.litecoin.main.toBitcoinJS();case C.Dogecoin:{let Z={private:70615956,public:70617039},G=p.dogecoin.test;return G.versions.bip32=Z,p.dogecoin.main.toBitcoinJS()}case C.Zcash:return DB.zcash;default:throw new A("toolbox_utxo_not_supported",{chain:B})}}}var wX=v(()=>{LX()});import{USwapError as xX}from"@tcswap/helpers";import gX from"bs58check";import mX from"cashaddrjs";function DX(X){try{return XX(X),!0}catch{return!1}}function zX(X){return XX(X)?.network}function b(X){let B=XX(X);if(B?.format==="legacy")return X;return FB(B)}function o(X){let B=XX(X);return EB(B)}function XX(X){try{let B=kB(X);if(B)return B}catch{}try{let B=AB(X);if(B)return B}catch{}throw new xX("toolbox_utxo_invalid_address",{address:X})}function kB(X){try{let B=gX.decode(X);if(B.length!==21)throw new xX("toolbox_utxo_invalid_address",{address:X});let Z=B[0],G=Array.prototype.slice.call(B,1);switch(Z){case R.legacy.mainnet.p2pkh:return{format:"legacy",hash:G,network:"mainnet",type:"p2pkh"};case R.legacy.mainnet.p2sh:return{format:"legacy",hash:G,network:"mainnet",type:"p2sh"};case R.legacy.testnet.p2pkh:return{format:"legacy",hash:G,network:"testnet",type:"p2pkh"};case R.legacy.testnet.p2sh:return{format:"legacy",hash:G,network:"testnet",type:"p2sh"};case R.bitpay.mainnet.p2pkh:return{format:"bitpay",hash:G,network:"mainnet",type:"p2pkh"};case R.bitpay.mainnet.p2sh:return{format:"bitpay",hash:G,network:"mainnet",type:"p2sh"};default:return}}catch{return}}function AB(X){if(X.indexOf(":")!==-1)try{return bX(X)}catch{}else{let B=["bitcoincash","bchtest","bchreg"];for(let Z of B)try{return bX(`${Z}:${X}`)}catch{}}return}function bX(X){try{let{hash:B,prefix:Z,type:G}=mX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(B,0),network:Z==="bitcoincash"?"mainnet":"testnet",type:G==="P2PKH"?"p2pkh":"p2sh"}}catch{return}}function FB(X){let B=R.legacy[X.network][X.type],Z=Buffer.alloc(1+X.hash.length);return Z[0]=B,Z.set(X.hash,1),gX.encode(Z)}function EB(X){let B=X.network==="mainnet"?"bitcoincash":"bchtest",Z=X.type==="p2pkh"?"P2PKH":"P2SH",G=new Uint8Array(X.hash);return mX.encode(B,Z,G)}var TX,R;var lX=v(()=>{((Z)=>{Z.Mainnet="mainnet";Z.Testnet="testnet"})(TX||={});R={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}}});import{USwapError as fB}from"@tcswap/helpers";import{opcodes as RB,script as PB}from"bitcoinjs-lib";function O(X){let B=Buffer.from(X,"utf8");return PB.compile([RB.OP_RETURN,B])}var VB=1000,GX=10,hX=10,SB=41,wB=107,JX,BX,ZX,n=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new fB("toolbox_utxo_invalid_address",{address:X})},x=({inputs:X,outputs:B,feeRate:Z})=>{let G=X[0]&&"address"in X[0]&&X[0].address?n(X[0].address):"P2PKH",$=X.filter((J)=>J.value>=BX["type"in J?J.type:"P2PKH"]*Math.ceil(Z)).reduce((J,j)=>J+F(j),0),Q=B?.reduce((J,j)=>J+u(j),0)||ZX[G];return GX+$+Q},F=(X)=>{if("type"in X)return BX[X.type];if("address"in X&&X.address)return BX[n(X.address)];return SB+wB},u=(X,B)=>{if(X?.script)return hX+X.script.length+(X.script.length>=74?2:1);if(B)return ZX[B];return ZX.P2PKH};var CX=v(()=>{((Z)=>{Z.P2PKH="P2PKH";Z.P2WPKH="P2WPKH"})(JX||={});BX={["P2PKH"]:148,["P2WPKH"]:68},ZX={["P2PKH"]:34,["P2WPKH"]:31}});import{Chain as P,USwapError as bB}from"@tcswap/helpers";function QX(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 bB("toolbox_utxo_not_supported",{chain:X})}}function U({inputs:X,outputs:B,feeRate:Z=1,chain:G=P.Bitcoin,changeAddress:$=""}){let Q=Math.ceil(Z),J=X[0]&&"address"in X[0]&&X[0].address?n(X[0].address):"P2PKH",j=X.filter((T)=>F(T)*Q<=T.value),q=GX+B.reduce((T,z)=>T+u(z,J),0),W=B.reduce((T,z)=>T+z.value,0),L=q*Q,Y=0,D=[];for(let T of j){let z=F(T),M=Q*z;L+=M,Y+=T.value,D.push(T);let I=L+W;if(Y<I)continue;let c=Y-I,f=Q*u({address:"",value:0},J);if(c>f){let KX=f+L,kX=Y-(W+KX);if(kX>Math.max(F({})*Q,QX(G)))return{fee:KX,inputs:D,outputs:B.concat({address:$,value:kX})}}return{fee:L,inputs:D,outputs:B}}return{fee:Q*x({feeRate:Q,inputs:X,outputs:B})}}var cX=v(()=>{CX()});var g=v(()=>{wX();lX();cX();CX()});import{networks as xB,address as gB}from"@bitgo/utxo-lib";import mB from"bs58check";function V(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let B=V(X);return DX(B)&&zX(B)==="mainnet"}function m(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 B=xB.zcash;try{return gB.toOutputScript(X,B),!0}catch{let Z=mB.decode(X);if(Z.length<21)return!1;let G=Z[0];return G===B.pubKeyHash||G===B.scriptHash}}catch{return!1}}var r=v(()=>{g()});import MX from"@bitcoinerlab/secp256k1";import{ECPair as lB,HDNode as hB}from"@psf/bitcoincashjs-lib";import{HDKey as cB}from"@scure/bip32";import{mnemonicToSeedSync as pX}from"@scure/bip39";import{AssetValue as IX,applyFeeMultiplier as oX,Chain as H,DerivationPath as pB,derivationPathToString as oB,FeeOption as K,NetworkDerivationPath as nB,USwapError as k,USwapNumber as uB,updateDerivationPath as rB}from"@tcswap/helpers";import{address as dB,initEccLib as uX,Psbt as iB,payments as nX}from"bitcoinjs-lib";import{ECPairFactory as sB}from"ecpair";function rX({inputs:X,outputs:B,chain:Z,psbt:G,sender:$,compiledMemo:Q}){for(let J of X){let j=!!J.witnessUtxo&&!d.includes(Z)&&{witnessUtxo:J.witnessUtxo},q=d.includes(Z)&&{nonWitnessUtxo:J.txHex?Buffer.from(J.txHex,"hex"):void 0};G.addInput({hash:J.hash,index:J.index,...j,...q})}for(let J of B){let j="address"in J&&J.address?J.address:$,q=J.script;if(q&&!Q)continue;let W=q?{script:Q,value:0}:{address:j,value:J.value};uX(MX),G.addOutput(W)}return{inputs:X,psbt:G}}async function dX({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$,fetchTxHex:Q=!1}){let J=X.chain,j=Z?await O(Z):null,q=await aX({assetValue:X,fetchTxHex:Q,memo:Z,recipient:B,sender:$}),{inputs:W,outputs:L}=U({...q,chain:J,feeRate:G});if(!(W&&L))throw new k("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let Y=await y(),D=new iB({network:Y(J)});if(J===H.Dogecoin)D.setMaximumFeeRate(650000000);let{psbt:T,inputs:z}=await rX({chain:J,compiledMemo:j,inputs:W,outputs:L,psbt:D,sender:$});return{inputs:z,psbt:T,utxos:q.inputs}}async function iX(){let X=await y();return function({address:Z,chain:G}){if(G===H.BitcoinCash)return E(Z);if(G===H.Zcash)return m(Z);try{return uX(MX),dB.toOutputScript(Z,X(G)),!0}catch{return!1}}}async function aB({chain:X,phrase:B,derivationPath:Z}){let G=(await i(X))({derivationPath:Z,phrase:B});async function $(J){return await J.signAllInputs(G),J}function Q(){return _X(X)(G)}return{getAddress:Q,signTransaction:$}}async function S({chain:X,...B}){let Z="phrase"in B?B.phrase:void 0,G="index"in B?B.index||0:0,$=oB("derivationPath"in B&&B.derivationPath?B.derivationPath:rB(nB[X],{index:G})),Q=Z?await aB({chain:X,derivationPath:$,phrase:Z}):("signer"in B)?B.signer:void 0;function J(){return Promise.resolve(Q?.getAddress())}let j=await iX(),q=await i(X);return{accumulative:U,broadcastTx:(W)=>_(X).broadcastTx(W),calculateTxSize:x,createKeysForPath:q,createTransaction:dX,estimateMaxSendableAmount:tB(X),estimateTransactionFee:eB(X),getAddress:J,getAddressFromKeys:_X(X),getBalance:EX(X),getFeeRates:()=>s(X),getInputsOutputsFee:sX,getPrivateKeyFromMnemonic:(W)=>{return q(W).toWIF()},transfer:XZ(Q),validateAddress:(W)=>j({address:W,chain:X})}}async function sX({assetValue:X,feeOptionKey:B=K.Fast,feeRate:Z,memo:G,sender:$,recipient:Q}){let J=X.chain,j=await aX({assetValue:X,memo:G,recipient:Q,sender:$}),q=Z?Math.floor(Z):(await s(J))[B];return U({...j,chain:J,feeRate:q})}function tB(X){return async function({from:Z,memo:G,feeRate:$,feeOptionKey:Q=K.Fast,recipients:J=1}){let j=await _(X).getAddressData(Z),q=$?Math.ceil($):(await s(X))[Q],W=j?.utxo.map((z)=>({...z,hash:"",type:"P2PKH"})).filter((z)=>z.value>Math.max(QX(X),F(z)*q));if(!W?.length)return IX.from({chain:X});let L=IX.from({chain:X,value:W.reduce((z,M)=>z+M.value,0)}),Y=typeof J==="number"?Array.from({length:J},()=>({address:Z,value:0})):J;if(G){let z=await O(G);Y.push({address:Z,script:z,value:0})}let T=x({feeRate:q,inputs:W,outputs:Y})*q;return L.sub(T)}}function eB(X){return async(B)=>{let Z=await sX(B);return IX.from({chain:X,value:uB.fromBigInt(BigInt(Z.fee),8).getValue("string")})}}async function i(X){let B=await y();switch(X){case H.BitcoinCash:return function({phrase:G,derivationPath:$=`${pB.BCH}/0`,wif:Q}){let J=B(X);if(Q)return lB.fromWIF(Q,J);if(!G)throw new k("toolbox_utxo_invalid_params",{error:"No phrase provided"});return hB.fromSeedBuffer(Buffer.from(pX(G)),J).derivePath($).keyPair};case H.Bitcoin:case H.Dogecoin:case H.Litecoin:case H.Zcash:case H.Dash:return function({phrase:G,wif:$,derivationPath:Q}){if(!($||G))throw new k("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let J=sB(MX),j=B(X);if($)return J.fromWIF($,j);let q=pX(G),W=cB.fromMasterSeed(q,j).derive(Q);if(!W.privateKey)throw new k("toolbox_utxo_invalid_params",{error:"Could not get private key from phrase"});return J.fromPrivateKey(Buffer.from(W.privateKey),{network:j})};default:throw new k("toolbox_utxo_not_supported",{chain:X})}}function _X(X){let B=y();return function(G){if(!G)throw new k("toolbox_utxo_invalid_params",{error:"Keys must be provided"});let $=d.includes(X)?nX.p2pkh:nX.p2wpkh,{address:Q}=$({network:B(X),pubkey:G.publicKey});if(!Q)throw new k("toolbox_utxo_invalid_address",{error:"Address not defined"});return Q}}function XZ(X){return async function({memo:Z,recipient:G,feeOptionKey:$,feeRate:Q,assetValue:J}){let j=await X?.getAddress(),q=J.chain;if(!(X&&j))throw new k("toolbox_utxo_no_signer");if(!G)throw new k("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let W=Q||(await s(q))[$||K.Fast],{psbt:L}=await dX({assetValue:J,feeRate:W,memo:Z,recipient:G,sender:j}),Y=await X.signTransaction(L);return Y.finalizeAllInputs(),_(q).broadcastTx(Y.extractTransaction().toHex())}}async function s(X){let B=await _(X).getSuggestedTxFee();return{[K.Average]:B,[K.Fast]:oX(B,K.Fast),[K.Fastest]:oX(B,K.Fastest)}}async function aX({assetValue:X,recipient:B,memo:Z,sender:G,fetchTxHex:$=!1}){let Q=X.chain,J=(await s(Q))[K.Fastest],j=$||d.includes(Q),q=X.getBaseValue("number"),W=Math.ceil(q+J*5000);return{inputs:await _(Q).getUtxos({address:G,fetchTxHex:j,targetValue:W}),outputs:[{address:B,value:q},...Z?[{address:"",script:await O(Z),value:0}]:[]]}}var d;var a=v(()=>{LX();g();r();d=[H.Dash,H.Dogecoin,H.Zcash,H.BitcoinCash]});import{address as BZ,Transaction as ZZ,TransactionBuilder as GZ}from"@psf/bitcoincashjs-lib";import{Chain as JZ,derivationPathToString as QZ,FeeOption as $Z,NetworkDerivationPath as jZ,USwapError as l,updateDerivationPath as qZ}from"@tcswap/helpers";import{Psbt as WZ}from"bitcoinjs-lib";function w(X){return V(o(X))}function LZ(X){function B({builder:G,utxos:$}){return $.forEach((Q,J)=>{G.sign(J,X,void 0,65,Q.witnessUtxo?.value)}),G.build()}return{getAddress:()=>{let G=X.getAddress(0);return Promise.resolve(w(G))},signTransaction:B}}async function HX(X){let B="phrase"in X?X.phrase:void 0,Z="index"in X?X.index||0:0,G=QZ("derivationPath"in X&&X.derivationPath?X.derivationPath:qZ(jZ[N],{index:Z})),$=B?(await i(N))({derivationPath:G,phrase:B}):void 0,Q=$?LZ($):("signer"in X)?X.signer:void 0;function J(){return Promise.resolve(Q?.getAddress())}let{getBalance:j,getFeeRates:q,broadcastTx:W,...L}=await S({chain:N});function Y(D,T=!0){return j(V(o(D)))}return{...L,broadcastTx:W,buildTx:TZ,createTransaction:tX,getAddress:J,getAddressFromKeys:DZ,getBalance:Y,getFeeRates:q,stripPrefix:V,stripToCashAddress:w,transfer:YZ({broadcastTx:W,getFeeRates:q,signer:Q}),validateAddress:E}}async function tX({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$}){if(!E(B))throw new l("toolbox_utxo_invalid_address",{address:B});let Q=Math.ceil(X.getBaseValue("number")+G*7500),J=await _(N).getUtxos({address:w($),fetchTxHex:!0,targetValue:Q}),j=Z?await O(Z):null,q=[];q.push({address:B,value:X.getBaseValue("number")});let{inputs:W,outputs:L}=U({chain:N,feeRate:G,inputs:J,outputs:q});if(!(W&&L))throw new l("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let Y=await y(),D=new GZ(Y(N));await Promise.all(W.map(async(T)=>{let z=await _(N).getRawTx(T.hash);D.addInput(ZZ.fromBuffer(Buffer.from(z,"hex")),T.index)}));for(let T of L){let z="address"in T&&T.address?T.address:b($),M=await y(),I=BZ.toOutputScript(b(z),M(N));D.addOutput(I,T.value)}if(j)D.addOutput(j,0);return{builder:D,utxos:W}}function YZ({broadcastTx:X,getFeeRates:B,signer:Z}){return async function({recipient:$,assetValue:Q,feeOptionKey:J=$Z.Fast,...j}){let q=await Z?.getAddress();if(!(Z&&q))throw new l("toolbox_utxo_no_signer");if(!$)throw new l("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let W=j.feeRate||(await B())[J],{builder:L,utxos:Y}=await tX({...j,assetValue:Q,feeRate:W,recipient:$,sender:q}),T=(await Z.signTransaction({builder:L,utxos:Y})).toHex();return X(T)}}async function TZ({assetValue:X,recipient:B,memo:Z,feeRate:G,sender:$,setSigHashType:Q}){let J=o(B);if(!E(J))throw new l("toolbox_utxo_invalid_address",{address:J});let j=Math.ceil(X.getBaseValue("number")+G*7500),q=await _(N).getUtxos({address:w($),fetchTxHex:!1,targetValue:j}),W=Number(G.toFixed(0)),L=Z?await O(Z):null,Y=[];if(Y.push({address:b(B),value:X.getBaseValue("number")}),L)Y.push({script:L,value:0});let{inputs:D,outputs:T}=U({chain:N,feeRate:W,inputs:q,outputs:Y});if(!(D&&T))throw new l("toolbox_utxo_insufficient_balance",{assetValue:X,sender:$});let z=await y(),M=new WZ({network:z(N)});for(let{hash:I,index:c,witnessUtxo:f}of D)M.addInput({hash:I,index:c,sighashType:Q?65:void 0,witnessUtxo:f});for(let I of T){let c="address"in I&&I.address?I.address:b($),f=I.script?L?{script:L,value:0}:void 0:{address:c,value:I.value};if(f)M.addOutput(f)}return{inputs:D,psbt:M,utxos:q}}function DZ(X){let B=X.getAddress(0);return w(B)}var N;var $X=v(()=>{g();a();r();N=JZ.BitcoinCash});import{bitgo as zZ,crypto as CZ,ECPair as BB,networks as IZ,address as MZ}from"@bitgo/utxo-lib";import{ZcashTransaction as eX}from"@bitgo/utxo-lib/dist/src/bitgo";import{HDKey as ZB}from"@scure/bip32";import{mnemonicToSeedSync as GB}from"@scure/bip39";import{Chain as jX,derivationPathToString as _Z,FeeOption as HZ,NetworkDerivationPath as vZ,USwapConfig as NZ,USwapError as qX,updateDerivationPath as yZ}from"@tcswap/helpers";import OZ from"bs58check";import{match as UZ,P as vX}from"ts-pattern";function NX(){return IZ.zcash}function JB(){return{bech32:void 0,bip32:{private:76066276,public:76067358},messagePrefix:`\x18ZCash Signed Message:
|
|
2
|
+
`,pubKeyHash:28,scriptHash:28,wif:128}}function KZ({phrase:X,derivationPath:B}){let Z=GB(X),$=ZB.fromMasterSeed(Z).derive(B);if(!$.privateKey)throw new qX("toolbox_utxo_invalid_params");let Q=JB(),J=BB.fromPrivateKey(Buffer.from($.privateKey),{network:Q}),j=CZ.hash160(J.publicKey),{isStagenet:q}=NZ.get("envs"),W=q?Buffer.from([29,37]):Buffer.from([28,184]),L=Buffer.concat([W,j]),Y=OZ.encode(L);return{getAddress:()=>Promise.resolve(Y),signTransaction:(D)=>{let T=D.signAllInputs(J);return Promise.resolve(T)}}}function kZ({inputs:X,outputs:B,psbt:Z,sender:G,compiledMemo:$}){for(let Q of X){let J=!!Q.witnessUtxo&&{witnessUtxo:{...Q.witnessUtxo,value:BigInt(Q.value)}},j=!Q.witnessUtxo&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};Z.addInput({hash:Q.hash,index:Q.index,...J,...j})}for(let Q of B){let J="address"in Q&&Q.address?Q.address:G,j=Q.script;if(j&&!$)continue;let q=j?{script:$,value:0n}:{script:MZ.toOutputScript(J,NX()),value:BigInt(Q.value)};Z.addOutput(q)}return{inputs:X,psbt:Z}}async function XB(X){let{assetValue:B,recipient:Z,memo:G,feeRate:$,sender:Q,fetchTxHex:J}=X,j=G?O(G):null,q=await _(jX.Zcash).getUtxos({address:Q,fetchTxHex:J!==!1}),W=[{address:Z,value:Number(B.getBaseValue("string"))},...j?[{script:j,value:0}]:[]],{inputs:L,outputs:Y}=U({chain:jX.Zcash,changeAddress:Q,feeRate:$,inputs:q,outputs:W});if(!(L&&Y))throw new qX("toolbox_utxo_insufficient_balance",{assetValue:B,sender:Q});let D=zZ.createPsbtForNetwork({network:NX()},{version:eX.VERSION4_BRANCH_NU6_1}),{psbt:T,inputs:z}=await kZ({compiledMemo:j,inputs:L,outputs:Y,psbt:D,sender:Q});return T.setDefaultsForVersion(NX(),eX.VERSION4_BRANCH_NU6_1),{inputs:z,outputs:Y,psbt:T}}async function yX(X){let B=await UZ(X).with({signer:vX.not(vX.nullish)},({signer:J})=>Promise.resolve(J)).with({phrase:vX.string},({phrase:J,derivationPath:j,index:q=0})=>{let W=j||vZ[jX.Zcash]||[44,133,0,0,0],L=yZ(W,{index:q}),Y=_Z(L);return KZ({derivationPath:Y,phrase:J})}).otherwise(()=>Promise.resolve(void 0)),Z=await S({chain:jX.Zcash,signer:B});async function G({recipient:J,assetValue:j,feeOptionKey:q=HZ.Fast,...W}){let L=await B?.getAddress();if(!(B&&L))throw new qX("toolbox_utxo_no_signer");let Y=W.feeRate||(await Z.getFeeRates())[q],{psbt:D}=await XB({...W,assetValue:j,feeRate:Y,recipient:J,sender:L}),T=await B.signTransaction(D);T.validateSignaturesOfAllInputs(),T.finalizeAllInputs();let M=T.extractTransaction().toHex();return Z.broadcastTx(M)}function $({phrase:J,derivationPath:j="m/44'/133'/0'/0/0"}){let q=GB(J),L=ZB.fromMasterSeed(q).derive(j);if(!L.privateKey)throw new qX("toolbox_utxo_invalid_params");let Y=JB();return BB.fromPrivateKey(Buffer.from(L.privateKey),{network:Y})}function Q({phrase:J,derivationPath:j="m/44'/133'/0'/0/0"}){return $({derivationPath:j,phrase:J}).toWIF()}return{...Z,createKeysForPath:$,createTransaction:XB,getPrivateKeyFromMnemonic:Q,transfer:G,validateAddress:m}}var OX=v(()=>{g();a();r()});import{Chain as h,USwapError as AZ}from"@tcswap/helpers";async function FZ(X,B){switch(X){case h.BitcoinCash:return await HX(B||{});case h.Zcash:return await yX(B);case h.Bitcoin:case h.Dogecoin:case h.Litecoin:case h.Dash:return await S({chain:X,...B});default:throw new AZ("toolbox_utxo_not_supported",{chain:X})}}var QB=v(()=>{$X();a();OX();$X();r()});var EZ={};WB(EZ,{validateZcashAddress:()=>m,toLegacyAddress:()=>b,toCashAddress:()=>o,stripToCashAddress:()=>w,stripPrefix:()=>V,nonSegwitChains:()=>d,isValidAddress:()=>DX,getUtxoToolbox:()=>FZ,getUtxoNetwork:()=>y,getUtxoApi:()=>_,getUTXOAddressValidator:()=>iX,getScriptTypeForAddress:()=>n,getOutputSize:()=>u,getInputSize:()=>F,getDustThreshold:()=>QX,getCreateKeysForPath:()=>i,detectAddressNetwork:()=>zX,createZcashToolbox:()=>yX,createUTXOToolbox:()=>S,createCustomUtxoApi:()=>KB,createBCHToolbox:()=>HX,compileMemo:()=>O,calculateTxSize:()=>x,bchValidateAddress:()=>E,addressFromKeysGetter:()=>_X,addInputsAndOutputs:()=>rX,accumulative:()=>U,UtxoNetwork:()=>TX,UTXOScriptType:()=>JX,TX_OVERHEAD:()=>GX,OutputSizes:()=>ZX,OP_RETURN_OVERHEAD:()=>hX,MIN_TX_FEE:()=>VB,InputSizes:()=>BX});var fZ=v(()=>{g();QB();$X();a();OX()});fZ();export{m as validateZcashAddress,b as toLegacyAddress,o as toCashAddress,w as stripToCashAddress,V as stripPrefix,d as nonSegwitChains,DX as isValidAddress,FZ as getUtxoToolbox,y as getUtxoNetwork,_ as getUtxoApi,iX as getUTXOAddressValidator,n as getScriptTypeForAddress,u as getOutputSize,F as getInputSize,QX as getDustThreshold,i as getCreateKeysForPath,zX as detectAddressNetwork,yX as createZcashToolbox,S as createUTXOToolbox,KB as createCustomUtxoApi,HX as createBCHToolbox,O as compileMemo,x as calculateTxSize,E as bchValidateAddress,_X as addressFromKeysGetter,rX as addInputsAndOutputs,U as accumulative,TX as UtxoNetwork,JX as UTXOScriptType,GX as TX_OVERHEAD,ZX as OutputSizes,hX as OP_RETURN_OVERHEAD,VB as MIN_TX_FEE,BX as InputSizes};
|
|
3
|
+
|
|
4
|
+
//# debugId=3DEE7D7C4602178E64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=index.js.map
|