@swapkit/toolboxes 0.0.0-nightly-20250304130539

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/chunk-fazw0jvt.js +3 -0
  2. package/dist/chunk-fazw0jvt.js.map +9 -0
  3. package/dist/chunk-tvrdndbw.js +4 -0
  4. package/dist/chunk-tvrdndbw.js.map +9 -0
  5. package/dist/cosmos/index.cjs +3 -0
  6. package/dist/cosmos/index.cjs.map +19 -0
  7. package/dist/cosmos/index.js +3 -0
  8. package/dist/cosmos/index.js.map +19 -0
  9. package/dist/evm/index.cjs +3 -0
  10. package/dist/evm/index.cjs.map +18 -0
  11. package/dist/evm/index.js +3 -0
  12. package/dist/evm/index.js.map +18 -0
  13. package/dist/index.cjs +3 -0
  14. package/dist/index.cjs.map +9 -0
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +9 -0
  17. package/dist/radix/index.cjs +3 -0
  18. package/dist/radix/index.cjs.map +10 -0
  19. package/dist/radix/index.js +3 -0
  20. package/dist/radix/index.js.map +10 -0
  21. package/dist/solana/index.cjs +3 -0
  22. package/dist/solana/index.cjs.map +10 -0
  23. package/dist/solana/index.js +3 -0
  24. package/dist/solana/index.js.map +10 -0
  25. package/dist/substrate/index.cjs +3 -0
  26. package/dist/substrate/index.cjs.map +12 -0
  27. package/dist/substrate/index.js +3 -0
  28. package/dist/substrate/index.js.map +12 -0
  29. package/dist/utxo/index.cjs +3 -0
  30. package/dist/utxo/index.cjs.map +17 -0
  31. package/dist/utxo/index.js +3 -0
  32. package/dist/utxo/index.js.map +17 -0
  33. package/package.json +102 -0
  34. package/src/cosmos/index.ts +8 -0
  35. package/src/cosmos/thorchainUtils/addressFormat.ts +23 -0
  36. package/src/cosmos/thorchainUtils/index.ts +4 -0
  37. package/src/cosmos/thorchainUtils/messages.ts +244 -0
  38. package/src/cosmos/thorchainUtils/registry.ts +47 -0
  39. package/src/cosmos/thorchainUtils/types/client-types.ts +79 -0
  40. package/src/cosmos/thorchainUtils/types/index.ts +1 -0
  41. package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.js +2806 -0
  42. package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.ts +2802 -0
  43. package/src/cosmos/thorchainUtils/util.ts +46 -0
  44. package/src/cosmos/toolbox/BaseCosmosToolbox.ts +257 -0
  45. package/src/cosmos/toolbox/gaia.ts +39 -0
  46. package/src/cosmos/toolbox/getToolboxByChain.ts +29 -0
  47. package/src/cosmos/toolbox/kujira.ts +61 -0
  48. package/src/cosmos/toolbox/thorchain.ts +305 -0
  49. package/src/cosmos/types.ts +42 -0
  50. package/src/cosmos/util.ts +230 -0
  51. package/src/evm/__tests__/ethereum.test.ts +147 -0
  52. package/src/evm/api.ts +157 -0
  53. package/src/evm/contracts/eth/multicall.ts +165 -0
  54. package/src/evm/contracts/op/gasOracle.ts +151 -0
  55. package/src/evm/helpers.ts +213 -0
  56. package/src/evm/index.ts +15 -0
  57. package/src/evm/toolbox/baseEVMToolbox.ts +670 -0
  58. package/src/evm/toolbox/evm.ts +89 -0
  59. package/src/evm/toolbox/getToolboxByChain.ts +37 -0
  60. package/src/evm/toolbox/op.ts +152 -0
  61. package/src/evm/types.ts +110 -0
  62. package/src/index.ts +0 -0
  63. package/src/radix/index.ts +151 -0
  64. package/src/radix/toolbox.ts +693 -0
  65. package/src/solana/index.ts +49 -0
  66. package/src/solana/toolbox.ts +271 -0
  67. package/src/substrate/index.ts +3 -0
  68. package/src/substrate/toolbox/baseSubstrateToolbox.ts +288 -0
  69. package/src/substrate/toolbox/index.ts +40 -0
  70. package/src/substrate/types/index.ts +2 -0
  71. package/src/substrate/types/network.ts +42 -0
  72. package/src/substrate/types/wallet.ts +78 -0
  73. package/src/utxo/helpers/api.ts +431 -0
  74. package/src/utxo/helpers/bchaddrjs.ts +177 -0
  75. package/src/utxo/helpers/coinselect.ts +96 -0
  76. package/src/utxo/helpers/index.ts +5 -0
  77. package/src/utxo/helpers/txSize.ts +103 -0
  78. package/src/utxo/helpers/utils.ts +48 -0
  79. package/src/utxo/index.ts +7 -0
  80. package/src/utxo/toolbox/bitcoinCash.ts +268 -0
  81. package/src/utxo/toolbox/index.ts +41 -0
  82. package/src/utxo/toolbox/utxo.ts +372 -0
  83. package/src/utxo/types.ts +51 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utxo/toolbox/index.ts", "../src/utxo/toolbox/bitcoinCash.ts", "../src/utxo/helpers/api.ts", "../src/utxo/helpers/utils.ts", "../src/utxo/helpers/bchaddrjs.ts", "../src/utxo/helpers/coinselect.ts", "../src/utxo/helpers/txSize.ts", "../src/utxo/toolbox/utxo.ts"],
4
+ "sourcesContent": [
5
+ "import { Chain, type UTXOChain } from \"@swapkit/helpers\";\n\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { createUTXOToolbox } from \"./utxo\";\n\ntype BCHToolbox = Awaited<ReturnType<typeof createBCHToolbox>>;\ntype CommonUTXOToolbox = Awaited<ReturnType<typeof createUTXOToolbox>>;\n\ntype UTXOToolboxes = {\n [Chain.BitcoinCash]: BCHToolbox;\n [Chain.Bitcoin]: CommonUTXOToolbox;\n [Chain.Dogecoin]: CommonUTXOToolbox;\n [Chain.Litecoin]: CommonUTXOToolbox;\n [Chain.Dash]: CommonUTXOToolbox;\n};\n\nexport type UTXOWallets = {\n [key in keyof UTXOToolboxes]: ReturnType<UTXOToolboxes[key]>;\n};\n\nexport async function getToolboxByChain<T extends UTXOChain>(chain: T): Promise<UTXOToolboxes[T]> {\n switch (chain) {\n case Chain.BitcoinCash: {\n const toolbox = await createBCHToolbox();\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(chain);\n return toolbox as UTXOToolboxes[T];\n }\n\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n}\n\nexport { stripToCashAddress, stripPrefix, validateAddress } from \"./bitcoinCash\";\n",
6
+ "import { Chain, DerivationPath, FeeOption, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n accumulative,\n Network as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getUtxoApi,\n getUtxoNetwork,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n TargetOutput,\n TransactionType,\n UTXOBuildTxParams,\n UTXOType,\n UTXOWalletTransferParams,\n} from \"../types\";\nimport { createUTXOToolbox } from \"./utxo\";\n\nconst chain = Chain.BitcoinCash as UTXOChain;\n\nexport function stripPrefix(address: string) {\n return address.replace(/(bchtest:|bitcoincash:)/, \"\");\n}\n\nexport function validateAddress(address: string) {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n}\n\nexport function stripToCashAddress(address: string) {\n return stripPrefix(toCashAddress(address));\n}\n\nexport async function createBCHToolbox() {\n const { getBalance, getFeeRates, broadcastTx, ...toolbox } = (\n await createUTXOToolbox(Chain.BitcoinCash)\n )();\n\n function handleGetBalance(address: string, _scamFilter = true) {\n return getBalance(stripPrefix(toCashAddress(address)));\n }\n\n return function createBCHToolbox() {\n return {\n ...toolbox,\n broadcastTx,\n buildBCHTx,\n buildTx,\n createKeysForPath,\n getAddressFromKeys,\n getBalance: handleGetBalance,\n getFeeRates,\n stripPrefix,\n stripToCashAddress,\n validateAddress,\n transfer: transfer({ getFeeRates, broadcastTx }),\n };\n };\n}\n\nasync function buildBCHTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const {\n Transaction,\n TransactionBuilder,\n address: bchAddress,\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n } = await import(\"@psf/bitcoincashjs-lib\");\n if (!validateAddress(recipient)) throw new Error(\"Invalid address\");\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\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({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\n const getNetwork = await getUtxoNetwork();\n const builder = new TransactionBuilder(getNetwork(chain));\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 =\n \"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}: {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n}) {\n return async function transfer({\n signTransaction,\n from,\n recipient,\n assetValue,\n ...rest\n }: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >) {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"signTransaction must be provided\");\n\n const feeRate = rest.feeRate || (await getFeeRates())[FeeOption.Fast];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await buildBCHTx({\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n });\n\n const tx = await signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n };\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\nasync function buildTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const { Psbt } = await import(\"bitcoinjs-lib\");\n const recipientCashAddress = toCashAddress(recipient);\n if (!validateAddress(recipientCashAddress)) throw new Error(\"Invalid address\");\n\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\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({\n address: toLegacyAddress(recipient),\n value: assetValue.getBaseValue(\"number\"),\n });\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({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate: feeRateWhole,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\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, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address =\n \"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 { psbt, utxos, inputs: inputs as UTXOType[] };\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n}: { wif?: string; phrase?: string; derivationPath?: string }) {\n const { ECPairFactory } = await import(\"ecpair\");\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n const { HDNode } = await import(\"@psf/bitcoincashjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPairFactory(secp256k1).fromWIF(wif, network);\n }\n if (!phrase) throw new Error(\"No phrase provided\");\n\n const masterHDNode = HDNode.fromSeedBuffer(Buffer.from(mnemonicToSeedSync(phrase)), network);\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n // TODO: Figure out same pattern as in BTC\n // const testWif = keyPair.toWIF();\n // const k = ECPairFactory(secp256k1).fromWIF(testWif, network);\n // const a = payments.p2pkh({ pubkey: k.publicKey, network });\n\n return keyPair;\n}\n\nfunction getAddressFromKeys(keys: { getAddress: (index?: number) => string }) {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n}\n\ntype TransactionBuilderType = {\n inputs: any[];\n sign(\n vin: number,\n keyPair: { getAddress: (index?: number) => string },\n redeemScript?: Buffer,\n hashType?: number,\n witnessValue?: number,\n witnessScript?: Buffer,\n signatureAlgorithm?: string,\n ): void;\n build(): TransactionType;\n};\n",
7
+ "import { Chain, RequestClient, SKConfig, type UTXOChain, warnOnce } from \"@swapkit/helpers\";\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}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new Error(`failed to broadcast a transaction: ${response.error?.message}`);\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new Error(\"Invalid transaction: the transaction amount was too low\");\n }\n\n return response.result;\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 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.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 (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n try {\n const response = await RequestClient.get<BlockchairResponse<T>>(url);\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n } catch (error) {\n if (!apiKey) throw error;\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `&key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n }\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address) throw new 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 (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getConfirmedBalance({\n chain,\n address,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const response = await blockchairRequest<BlockchairMultipleBalancesResponse>(\n `${baseUrl(chain)}/addresses/balances?addresses=${address}`,\n apiKey,\n );\n\n return response[address] || 0;\n } catch (_error) {\n return 0;\n }\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash) throw new 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 console.error(error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\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({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getConfirmedBalance: (address: string) => getConfirmedBalance({ chain, address, apiKey }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\ninterface BlockchairMultipleBalancesResponse {\n [key: string]: number;\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\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]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n 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: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\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",
8
+ "import { Chain, FeeOption } from \"@swapkit/helpers\";\n\nconst pid = typeof process !== \"undefined\" && process.pid ? process.pid.toString(36) : \"\";\n\nexport async function getUtxoNetwork() {\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n const { coininfo } = await import(\"coininfo\");\n const { networks } = await import(\"bitcoinjs-lib\");\n\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 default:\n throw new Error(\"Invalid chain\");\n }\n };\n}\n\nexport const standardFeeRates = (rate: number) => ({\n [FeeOption.Average]: rate,\n [FeeOption.Fast]: rate * 1.5,\n [FeeOption.Fastest]: rate * 2.0,\n});\n\nlet last = 0;\nconst now = () => {\n const time = Date.now();\n const lastTime = last || time;\n last = lastTime;\n\n return time > last ? time : lastTime + 1;\n};\n\nexport const uniqid = () => pid + now().toString(36);\n",
9
+ "import 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 Network {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 0,\n [Type.P2SH]: 5,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n [Format.Bitpay]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 28,\n [Type.P2SH]: 40,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n};\n\ntype DecodedType = {\n format: Format;\n network: Network;\n type: Type;\n hash: any;\n};\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch (_error) {\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 return decodeBase58Address(address);\n } catch (_error) {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n return decodeCashAddress(address);\n } catch (_error) {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\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)\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2SH };\n\n default:\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch (_error) {\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 (_error) {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n}\n\nfunction decodeCashAddressWithPrefix(address: string): DecodedType {\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\" ? Network.Mainnet : Network.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\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 === Network.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, Network, toCashAddress, toLegacyAddress };\n",
10
+ "import { Chain, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n TX_OVERHEAD,\n UTXOScriptType,\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport const 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 default:\n throw new Error(\"Invalid Chain\");\n }\n};\n\nexport const accumulative = ({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain }) => {\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 (\n remainderAfterExtraOutput >\n Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))\n ) {\n return {\n inputs: inputsToUse,\n outputs: outputs.concat({ value: remainderAfterExtraOutput, address: \"\" }),\n fee: feeAfterExtraOutput,\n };\n }\n }\n return {\n inputs: inputsToUse,\n outputs,\n fee: fees,\n };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ inputs, outputs, feeRate }) };\n};\n",
11
+ "import type {\n TargetOutput,\n UTXOCalculateTxSizeParams,\n UTXOInputWithScriptType,\n UTXOType,\n} 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 async function compileMemo(memo: string) {\n const { script, opcodes } = await import(\"bitcoinjs-lib\");\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 if (address.startsWith(\"bc1\") || address.startsWith(\"ltc1\")) {\n return UTXOScriptType.P2WPKH;\n }\n // if (address.startsWith('3') || address.startsWith('M')) {\n // return UTXOScriptType.P2SH;\n // }\n if (\n address.startsWith(\"1\") ||\n address.startsWith(\"3\") ||\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"X\") ||\n address.startsWith(\"D\") ||\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"q\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n throw new Error(\"Invalid 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(\n (utxo) =>\n utxo.value >=\n InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate),\n )\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize =\n 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",
12
+ "import {\n AssetValue,\n BaseDecimal,\n Chain,\n FeeOption,\n SwapKitNumber,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\n\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getUtxoApi,\n getUtxoNetwork,\n standardFeeRates,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOBuildTxParams, UTXOType, UTXOWalletTransferParams } from \"../types\";\nimport { validateAddress as validateBCHAddress } from \"./bitcoinCash\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nexport function buildTx(chain: UTXOChain) {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n return async function buildTx({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n }: UTXOBuildTxParams): Promise<{\n psbt: Psbt;\n utxos: UTXOType[];\n inputs: UTXOType[];\n }> {\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { initEccLib, Psbt } = await import(\"bitcoinjs-lib\");\n const compiledMemo = memo ? await compileMemo(memo) : null;\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex,\n });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, feeRate, chain });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Insufficient Balance for transaction\");\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n ...(!!utxo.witnessUtxo &&\n !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo }),\n ...(nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n }),\n });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : 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 initEccLib(secp256k1);\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos: inputsAndOutputs.inputs, inputs };\n };\n}\n\nexport async function getAddressValidator() {\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { initEccLib, address: btcLibAddress } = await import(\"bitcoinjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n return function validateAddress({ chain, address }: { chain: UTXOChain; address: string }) {\n if (chain === Chain.BitcoinCash) {\n return validateBCHAddress(address);\n }\n\n return function validateAddress(address: string) {\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n };\n };\n}\n\nexport async function createUTXOToolbox(chain: UTXOChain) {\n const getAddressFromKeys = await addressFromKeysGetter(chain);\n const validateAddress = await getAddressValidator();\n const createKeysForPath = await getCreateKeysForPath(chain);\n\n return function createUTXOToolbox() {\n return {\n accumulative,\n calculateTxSize,\n getAddressFromKeys,\n validateAddress: (address: string) => validateAddress({ chain, address }),\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n buildTx: buildTx(chain),\n createKeysForPath,\n getFeeRates: () => getFeeRates(chain),\n getInputsOutputsFee: getInputsOutputsFee(chain),\n transfer: transfer(chain),\n getPrivateKeyFromMnemonic: (params: { phrase: string; derivationPath: string }) => {\n const keys = createKeysForPath(params);\n return keys.toWIF();\n },\n\n getBalance: getBalance(chain),\n estimateTransactionFee: estimateTransactionFee(chain),\n estimateMaxSendableAmount: estimateMaxSendableAmount(chain),\n };\n };\n}\n\nfunction getInputsOutputsFee(chain: UTXOChain) {\n return async function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n fetchTxHex = false,\n memo,\n recipient,\n from,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n from: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) {\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender: from,\n fetchTxHex,\n });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, feeRate: feeRateWhole, chain });\n };\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 // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n hash: \"\",\n }))\n .filter(\n (utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole),\n );\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({\n chain,\n value: inputs.reduce((sum, utxo) => sum + utxo.value, 0),\n });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({\n address: from,\n value: 0,\n })) 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({ inputs, outputs, feeRate: feeRateWhole });\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 from: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const getInputsFee = getInputsOutputsFee(chain);\n const inputFees = await getInputsFee(params);\n\n return AssetValue.from({\n chain,\n value: SwapKitNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\"),\n });\n };\n}\n\nasync function getCreateKeysForPath(chain: Chain) {\n const { ECPairFactory } = await import(\"ecpair\");\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const getNetwork = await getUtxoNetwork();\n\n return function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n }: { phrase?: string; wif?: string; derivationPath: string }) {\n if (!(wif || phrase)) throw new 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) throw new Error(\"Could not get private key from phrase\");\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n };\n}\n\nasync function addressFromKeysGetter(chain: UTXOChain) {\n const { payments } = await import(\"bitcoinjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n return function getAddressFromKeys(keys: ECPairInterface) {\n if (!keys) throw new Error(\"Keys must be provided\");\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ pubkey: keys.publicKey, network: getNetwork(chain) });\n if (!address) throw new Error(\"Address not defined\");\n\n return address;\n };\n}\n\nfunction transfer(chain: UTXOChain) {\n return async function transfer({\n signTransaction,\n from,\n memo,\n recipient,\n feeOptionKey,\n broadcastTx,\n feeRate,\n assetValue,\n }: UTXOWalletTransferParams<Psbt, Psbt>) {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"Sign transaction must be provided\");\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await buildTx(chain)({\n recipient,\n feeRate: txFeeRate,\n sender: from,\n fetchTxHex: nonSegwitChains.includes(chain),\n assetValue,\n memo,\n });\n const signedPsbt = await signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nfunction getBalance(chain: UTXOChain) {\n return async function getBalance(address: string, _scamFilter = true) {\n const baseBalance = await getUtxoApi(chain).getBalance(address);\n const balance = SwapKitNumber.fromBigInt(BigInt(baseBalance), BaseDecimal[chain]).getValue(\n \"string\",\n );\n const asset = AssetValue.from({ asset: `${chain}.${chain}`, value: balance });\n\n return [asset];\n };\n}\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return standardFeeRates(suggestedFeeRate);\n}\n\nfunction getInputsAndTargetOutputs(chain: UTXOChain) {\n return async function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex = false,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n sender: string;\n fetchTxHex?: boolean;\n }) {\n const inputs = await getUtxoApi(chain).scanUTXOs({ address: sender, fetchTxHex });\n\n //1. add output amount and recipient to targets\n //2. add output memo to targets (optional)\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: Number(assetValue.bigIntValue) },\n ...(memo ? [{ address: \"\", script: await compileMemo(memo), value: 0 }] : []),\n ],\n };\n };\n}\n"
13
+ ],
14
+ "mappings": "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",
15
+ "debugId": "BA9D6587A2CF2EB364756E2164756E21",
16
+ "names": []
17
+ }
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "description": "SwapKit - Toolboxes",
3
+ "files": [
4
+ "src/",
5
+ "dist/"
6
+ ],
7
+ "dependencies": {
8
+ "@bitcoinerlab/secp256k1": "1.2.0",
9
+ "@cosmjs/amino": "0.33.0",
10
+ "@cosmjs/crypto": "0.33.0",
11
+ "@cosmjs/proto-signing": "0.33.0",
12
+ "@cosmjs/stargate": "0.33.0",
13
+ "@polkadot/api": "15.7.2",
14
+ "@polkadot/keyring": "13.4.3",
15
+ "@polkadot/util": "13.4.3",
16
+ "@polkadot/util-crypto": "13.4.3",
17
+ "@psf/bitcoincashjs-lib": "4.0.3",
18
+ "@radixdlt/babylon-gateway-api-sdk": "1.9.2",
19
+ "@radixdlt/radix-dapp-toolkit": "2.2.1",
20
+ "@scure/base": "1.2.4",
21
+ "@scure/bip32": "1.6.2",
22
+ "@scure/bip39": "1.5.4",
23
+ "@solana/spl-memo": "0.2.5",
24
+ "@solana/spl-token": "0.4.12",
25
+ "@solana/spl-token-registry": "0.2.4574",
26
+ "@solana/web3.js": "1.98.0",
27
+ "@swapkit/helpers": "0.0.0-nightly-20250304130539",
28
+ "base64-js": "1.5.1",
29
+ "bitcoinjs-lib": "6.1.7",
30
+ "bs58check": "4.0.0",
31
+ "cashaddrjs": "0.4.4",
32
+ "coininfo": "5.2.1",
33
+ "cosmjs-types": "0.9.0",
34
+ "ecpair": "2.1.0",
35
+ "ethers": "6.13.5",
36
+ "micro-key-producer": "0.7.5",
37
+ "protobufjs": "7.4.0"
38
+ },
39
+ "devDependencies": {
40
+ "@nomicfoundation/hardhat-ethers": "3.0.8",
41
+ "@nomicfoundation/hardhat-toolbox": "5.0.0",
42
+ "@polkadot/types": "15.7.2",
43
+ "@types/bn.js": "5.1.6",
44
+ "@types/crypto-js": "4.2.2",
45
+ "@types/elliptic": "6.4.18",
46
+ "hardhat": "2.22.19"
47
+ },
48
+ "exports": {
49
+ ".": {
50
+ "default": "./dist/index.js",
51
+ "require": "./dist/index.cjs",
52
+ "types": "./src/index.ts"
53
+ },
54
+ "./cosmos": {
55
+ "default": "./dist/cosmos/index.js",
56
+ "require": "./dist/cosmos/index.cjs",
57
+ "types": "./src/cosmos/index.ts"
58
+ },
59
+ "./evm": {
60
+ "default": "./dist/evm/index.js",
61
+ "require": "./dist/evm/index.cjs",
62
+ "types": "./src/evm/index.ts"
63
+ },
64
+ "./radix": {
65
+ "default": "./dist/radix/index.js",
66
+ "require": "./dist/radix/index.cjs",
67
+ "types": "./src/radix/index.ts"
68
+ },
69
+ "./solana": {
70
+ "default": "./dist/solana/index.js",
71
+ "require": "./dist/solana/index.cjs",
72
+ "types": "./src/solana/index.ts"
73
+ },
74
+ "./substrate": {
75
+ "default": "./dist/substrate/index.js",
76
+ "require": "./dist/substrate/index.cjs",
77
+ "types": "./src/substrate/index.ts"
78
+ },
79
+ "./utxo": {
80
+ "default": "./dist/utxo/index.js",
81
+ "require": "./dist/utxo/index.cjs",
82
+ "types": "./src/utxo/index.ts"
83
+ }
84
+ },
85
+ "homepage": "https://github.com/thorswap/SwapKit",
86
+ "license": "Apache-2.0",
87
+ "name": "@swapkit/toolboxes",
88
+ "repository": {
89
+ "type": "git",
90
+ "url": "git+https://github.com/thorswap/SwapKit.git"
91
+ },
92
+ "scripts": {
93
+ "build": "bun run ./build.ts",
94
+ "clean": "rm -rf dist node_modules *.tsbuildinfo",
95
+ "lint": "biome check --write ./src",
96
+ "test": "echo 'bun test'",
97
+ "test:ci": "bun test --coverage",
98
+ "type-check": "tsc --noEmit"
99
+ },
100
+ "type": "module",
101
+ "version": "0.0.0-nightly-20250304130539"
102
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./thorchainUtils/index";
2
+ export * from "./toolbox/BaseCosmosToolbox";
3
+ export * from "./toolbox/gaia";
4
+ export * from "./toolbox/getToolboxByChain";
5
+ export * from "./toolbox/kujira";
6
+ export * from "./toolbox/thorchain";
7
+ export * from "./types";
8
+ export * from "./util";
@@ -0,0 +1,23 @@
1
+ import { base64, bech32 } from "@scure/base";
2
+ import { fromByteArray, toByteArray } from "base64-js";
3
+
4
+ export function bech32ToBase64(address: string) {
5
+ return base64.encode(
6
+ Uint8Array.from(bech32.fromWords(bech32.decode(address as `${string}1${string}`).words)),
7
+ );
8
+ }
9
+
10
+ export function base64ToBech32(address: string, prefix = "thor") {
11
+ return bech32.encode(prefix, bech32.toWords(base64.decode(address)));
12
+ }
13
+
14
+ export function toBase64(data: Uint8Array) {
15
+ return fromByteArray(data);
16
+ }
17
+
18
+ export function fromBase64(base64String: string) {
19
+ if (!base64String.match(/^[a-zA-Z0-9+/]*={0,2}$/)) {
20
+ throw new Error("Invalid base64 string format");
21
+ }
22
+ return toByteArray(base64String);
23
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./addressFormat";
2
+ export * from "./messages";
3
+ export * from "./registry";
4
+ export * from "./types/index";
@@ -0,0 +1,244 @@
1
+ import type { TxBodyEncodeObject } from "@cosmjs/proto-signing";
2
+ import { AssetValue, Chain, ChainToChainId } from "@swapkit/helpers";
3
+
4
+ import {
5
+ createStargateClient,
6
+ getDefaultChainFee,
7
+ getDenomWithChain,
8
+ getMsgSendDenom,
9
+ } from "../util";
10
+
11
+ import { createDefaultAminoTypes, createDefaultRegistry } from "./registry";
12
+ import type { ThorchainDepositTxParams, ThorchainTransferTxParams } from "./types/client-types";
13
+
14
+ type MsgSend = ReturnType<typeof transferMsgAmino>;
15
+ type MsgDeposit = ReturnType<typeof depositMsgAmino>;
16
+ type DirectMsgSendForBroadcast = ReturnType<typeof parseAminoMessageForDirectSigning<MsgSend>>;
17
+ type DirectMsgDepositForBroadcast = ReturnType<
18
+ typeof parseAminoMessageForDirectSigning<MsgDeposit>
19
+ >;
20
+
21
+ export const THORCHAIN_GAS_VALUE = getDefaultChainFee(Chain.THORChain).gas;
22
+ export const MAYA_GAS_VALUE = getDefaultChainFee(Chain.Maya).gas;
23
+
24
+ export const transferMsgAmino = ({
25
+ from,
26
+ recipient,
27
+ assetValue,
28
+ chain,
29
+ }: {
30
+ from: string;
31
+ recipient?: string;
32
+ assetValue: AssetValue;
33
+ chain: Chain.THORChain | Chain.Maya;
34
+ }) => ({
35
+ type: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgSend` as const,
36
+ value: {
37
+ from_address: from,
38
+ to_address: recipient,
39
+ amount: [
40
+ {
41
+ amount: assetValue.getBaseValue("string"),
42
+ denom: getMsgSendDenom(assetValue.symbol, true),
43
+ },
44
+ ],
45
+ },
46
+ });
47
+
48
+ export const depositMsgAmino = ({
49
+ from,
50
+ assetValue,
51
+ memo = "",
52
+ chain,
53
+ }: {
54
+ from: string;
55
+ assetValue: AssetValue;
56
+ memo?: string;
57
+ chain: Chain.THORChain | Chain.Maya;
58
+ }) => {
59
+ return {
60
+ type: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgDeposit` as const,
61
+ value: {
62
+ coins: [
63
+ {
64
+ amount: assetValue.getBaseValue("string"),
65
+ asset: getDenomWithChain(assetValue),
66
+ },
67
+ ],
68
+ signer: from,
69
+ memo,
70
+ },
71
+ };
72
+ };
73
+
74
+ export const buildAminoMsg = ({
75
+ from,
76
+ recipient,
77
+ assetValue,
78
+ memo,
79
+ chain,
80
+ }: {
81
+ from: string;
82
+ recipient?: string;
83
+ assetValue: AssetValue;
84
+ memo?: string;
85
+ chain: Chain.THORChain | Chain.Maya;
86
+ }) => {
87
+ const isDeposit = !recipient;
88
+ const msg = isDeposit
89
+ ? depositMsgAmino({ from, assetValue, memo, chain })
90
+ : transferMsgAmino({ from, recipient, assetValue, chain });
91
+
92
+ return msg;
93
+ };
94
+
95
+ // TODO I think the msg typing is wrong it should be not prepared for broadcast
96
+ export const convertToSignable = async (
97
+ msg: DirectMsgDepositForBroadcast | DirectMsgSendForBroadcast | MsgSend | MsgDeposit,
98
+ chain: Chain.THORChain | Chain.Maya,
99
+ ) => {
100
+ const aminoTypes = await createDefaultAminoTypes(chain);
101
+
102
+ return aminoTypes.fromAmino(msg);
103
+ };
104
+
105
+ const getAccount = async ({
106
+ rpcUrl,
107
+ from,
108
+ }: {
109
+ from: string;
110
+ rpcUrl: string;
111
+ }) => {
112
+ const client = await createStargateClient(rpcUrl);
113
+
114
+ const account = await client.getAccount(from);
115
+
116
+ if (!account) {
117
+ throw new Error("Account does not exist");
118
+ }
119
+
120
+ return account;
121
+ };
122
+
123
+ export const buildTransferTx =
124
+ (rpcUrl: string) =>
125
+ async ({
126
+ from,
127
+ recipient,
128
+ assetValue,
129
+ memo = "",
130
+ chain,
131
+ asSignable = true,
132
+ asAminoMessage = false,
133
+ }: ThorchainTransferTxParams) => {
134
+ const account = await getAccount({ rpcUrl, from });
135
+
136
+ const transferMsg = transferMsgAmino({
137
+ from,
138
+ recipient,
139
+ assetValue,
140
+ chain,
141
+ });
142
+
143
+ const msg = asSignable
144
+ ? await convertToSignable(
145
+ asAminoMessage ? transferMsg : parseAminoMessageForDirectSigning(transferMsg),
146
+ chain,
147
+ )
148
+ : transferMsg;
149
+
150
+ const transaction = {
151
+ chainId: ChainToChainId[chain],
152
+ accountNumber: account.accountNumber,
153
+ sequence: account.sequence,
154
+ msgs: [msg],
155
+ fee: getDefaultChainFee(assetValue.chain as Chain.THORChain | Chain.Maya),
156
+ memo,
157
+ };
158
+
159
+ return transaction;
160
+ };
161
+
162
+ export const buildDepositTx =
163
+ (rpcUrl: string) =>
164
+ async ({
165
+ from,
166
+ assetValue,
167
+ memo = "",
168
+ chain,
169
+ asSignable = true,
170
+ asAminoMessage = false,
171
+ }: ThorchainDepositTxParams) => {
172
+ const account = await getAccount({ rpcUrl, from });
173
+
174
+ const depositMsg = depositMsgAmino({ from, assetValue, memo, chain });
175
+
176
+ const msg = asSignable
177
+ ? await convertToSignable(
178
+ asAminoMessage ? depositMsg : parseAminoMessageForDirectSigning<MsgDeposit>(depositMsg),
179
+ chain,
180
+ )
181
+ : depositMsg;
182
+
183
+ const transaction = {
184
+ chainId: ChainToChainId[chain],
185
+ accountNumber: account.accountNumber,
186
+ sequence: account.sequence,
187
+ msgs: [msg],
188
+ fee: getDefaultChainFee(assetValue.chain as Chain.THORChain | Chain.Maya),
189
+ memo,
190
+ };
191
+
192
+ return transaction;
193
+ };
194
+
195
+ export function parseAminoMessageForDirectSigning<T extends MsgDeposit | MsgSend>(msg: T) {
196
+ if (msg.type === "thorchain/MsgSend" || msg.type === "mayachain/MsgSend") return msg as MsgSend;
197
+
198
+ return {
199
+ ...msg,
200
+ value: {
201
+ ...msg.value,
202
+ coins: (msg as MsgDeposit).value.coins.map((coin: { asset: string; amount: string }) => {
203
+ const assetValue = AssetValue.from({ asset: coin.asset });
204
+
205
+ const symbol = (
206
+ assetValue.isSynthetic ? assetValue.symbol.split("/")?.[1] : assetValue.symbol
207
+ )?.toUpperCase();
208
+ const chain = (
209
+ assetValue.isSynthetic ? assetValue.symbol.split("/")?.[0] : assetValue.chain
210
+ )?.toUpperCase();
211
+
212
+ return {
213
+ ...coin,
214
+ asset: {
215
+ chain,
216
+ symbol,
217
+ ticker: symbol,
218
+ synth: assetValue.isSynthetic,
219
+ },
220
+ };
221
+ }),
222
+ },
223
+ };
224
+ }
225
+
226
+ export async function buildEncodedTxBody({
227
+ chain,
228
+ memo,
229
+ msgs,
230
+ }: {
231
+ msgs: DirectMsgDepositForBroadcast[] | DirectMsgSendForBroadcast[];
232
+ memo: string;
233
+ chain: Chain.THORChain | Chain.Maya;
234
+ }) {
235
+ const registry = await createDefaultRegistry();
236
+ const aminoTypes = await createDefaultAminoTypes(chain);
237
+
238
+ const signedTxBody: TxBodyEncodeObject = {
239
+ typeUrl: "/cosmos.tx.v1beta1.TxBody",
240
+ value: { memo, messages: msgs.map((msg) => aminoTypes.fromAmino(msg)) },
241
+ };
242
+
243
+ return registry.encode(signedTxBody);
244
+ }
@@ -0,0 +1,47 @@
1
+ import { Chain } from "@swapkit/helpers";
2
+ import * as types from "../thorchainUtils/types/proto/MsgCompiled";
3
+ import { base64ToBech32, bech32ToBase64 } from "./addressFormat";
4
+
5
+ export async function createDefaultRegistry() {
6
+ const { Registry } = await import("@cosmjs/proto-signing");
7
+ const { defaultRegistryTypes } = await import("@cosmjs/stargate");
8
+
9
+ return new Registry([
10
+ ...defaultRegistryTypes,
11
+ ["/types.MsgSend", { ...types.default.types.MsgSend }],
12
+ ["/types.MsgDeposit", { ...types.default.types.MsgDeposit }],
13
+ ]);
14
+ }
15
+
16
+ export async function createDefaultAminoTypes(chain: Chain.THORChain | Chain.Maya) {
17
+ const { AminoTypes } = await import("@cosmjs/stargate");
18
+
19
+ return new AminoTypes({
20
+ "/types.MsgSend": {
21
+ aminoType: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgSend`,
22
+ toAmino: (params: any) => ({
23
+ from_address: base64ToBech32(params.fromAddress),
24
+ to_address: base64ToBech32(params.toAddress),
25
+ amount: [...params.amount],
26
+ }),
27
+ fromAmino: (params: any) => ({
28
+ fromAddress: bech32ToBase64(params.from_address),
29
+ toAddress: bech32ToBase64(params.to_address),
30
+ amount: [...params.amount],
31
+ }),
32
+ },
33
+ "/types.MsgDeposit": {
34
+ aminoType: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgDeposit`,
35
+ toAmino: (params: any) => ({
36
+ signer: base64ToBech32(params.signer),
37
+ memo: params.memo,
38
+ coins: [...params.coins],
39
+ }),
40
+ fromAmino: (params: any) => ({
41
+ signer: bech32ToBase64(params.signer),
42
+ memo: params.memo,
43
+ coins: [...params.coins],
44
+ }),
45
+ },
46
+ });
47
+ }