@xchainjs/xchain-bitcoin 0.23.2 → 0.23.4

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/lib/client.d.ts CHANGED
@@ -14,6 +14,10 @@ declare class Client extends UTXOClient {
14
14
  * @param {UtxoClientParams} params
15
15
  */
16
16
  constructor(params?: UtxoClientParams);
17
+ /**
18
+ * @deprecated this function eventually will be removed use getAddressAsync instead
19
+ */
20
+ getAddress(index?: number): Address;
17
21
  /**
18
22
  * Get the current address.
19
23
  *
@@ -25,7 +29,7 @@ declare class Client extends UTXOClient {
25
29
  * @throws {"Phrase must be provided"} Thrown if phrase has not been set before.
26
30
  * @throws {"Address not defined"} Thrown if failed creating account from phrase.
27
31
  */
28
- getAddress(index?: number): Address;
32
+ getAddressAsync(index?: number): Promise<string>;
29
33
  /**
30
34
  *
31
35
  * @returns BTC asset info
package/lib/index.esm.js CHANGED
@@ -185,15 +185,7 @@ class Client extends UTXOClient {
185
185
  });
186
186
  }
187
187
  /**
188
- * Get the current address.
189
- *
190
- * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)
191
- * The address is then decoded into type P2WPKH and returned.
192
- *
193
- * @returns {Address} The current address.
194
- *
195
- * @throws {"Phrase must be provided"} Thrown if phrase has not been set before.
196
- * @throws {"Address not defined"} Thrown if failed creating account from phrase.
188
+ * @deprecated this function eventually will be removed use getAddressAsync instead
197
189
  */
198
190
  getAddress(index = 0) {
199
191
  if (index < 0) {
@@ -213,6 +205,22 @@ class Client extends UTXOClient {
213
205
  }
214
206
  throw new Error('Phrase must be provided');
215
207
  }
208
+ /**
209
+ * Get the current address.
210
+ *
211
+ * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)
212
+ * The address is then decoded into type P2WPKH and returned.
213
+ *
214
+ * @returns {Address} The current address.
215
+ *
216
+ * @throws {"Phrase must be provided"} Thrown if phrase has not been set before.
217
+ * @throws {"Address not defined"} Thrown if failed creating account from phrase.
218
+ */
219
+ getAddressAsync(index = 0) {
220
+ return __awaiter(this, void 0, void 0, function* () {
221
+ return this.getAddress(index);
222
+ });
223
+ }
216
224
  /**
217
225
  *
218
226
  * @returns BTC asset info
@@ -314,7 +322,7 @@ class Client extends UTXOClient {
314
322
  const feeRate = params.feeRate || (yield this.getFeeRates())[FeeOption.Fast];
315
323
  checkFeeBounds(this.feeBounds, feeRate);
316
324
  const fromAddressIndex = (params === null || params === void 0 ? void 0 : params.walletIndex) || 0;
317
- const { rawUnsignedTx } = yield this.prepareTx(Object.assign(Object.assign({}, params), { sender: this.getAddress(fromAddressIndex), feeRate }));
325
+ const { rawUnsignedTx } = yield this.prepareTx(Object.assign(Object.assign({}, params), { sender: yield this.getAddressAsync(fromAddressIndex), feeRate }));
318
326
  const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
319
327
  const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx);
320
328
  psbt.signAllInputs(btcKeys); // Sign all inputs
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts"],"sourcesContent":["import { ExplorerProvider, Network, UtxoOnlineDataProviders } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n HaskoinNetwork,\n HaskoinProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\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\n\nexport const BTC_DECIMAL = 8\n\nexport const LOWER_FEE_BOUND = 1\nexport const UPPER_FEE_BOUND = 500\nexport const BTC_SYMBOL = '₿'\nexport const BTC_SATOSHI_SYMBOL = '⚡'\n\n/**\n * Chain identifier for Bitcoin mainnet\n *\n */\nexport const BTCChain = 'BTC' as const\n\n/**\n * Base \"chain\" asset on bitcoin main net.\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetBTC: Asset = { chain: BTCChain, symbol: 'BTC', ticker: 'BTC', synth: false }\n\nconst BTC_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/',\n 'https://blockstream.info/address/%%ADDRESS%%',\n 'https://blockstream.info/tx/%%TX_ID%%',\n)\nconst BTC_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/testnet/',\n 'https://blockstream.info/testnet/address/%%ADDRESS%%',\n 'https://blockstream.info/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: BTC_TESTNET_EXPLORER,\n [Network.Stagenet]: BTC_MAINNET_EXPLORER,\n [Network.Mainnet]: BTC_MAINNET_EXPLORER,\n}\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTCTEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTC,\n)\nexport const SochainDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n//======================\n// haskoin\n//======================\nconst testnetHaskoinProvider = new HaskoinProvider(\n 'https://api.haskoin.com',\n BTCChain,\n AssetBTC,\n 8,\n HaskoinNetwork.BTCTEST,\n)\n\nconst mainnetHaskoinProvider = new HaskoinProvider('https://api.haskoin.com', BTCChain, AssetBTC, 8, HaskoinNetwork.BTC)\nexport const HaskoinDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetHaskoinProvider,\n [Network.Stagenet]: mainnetHaskoinProvider,\n [Network.Mainnet]: mainnetHaskoinProvider,\n}\n//======================\n// Blockcypher\n//======================\nconst testnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTCTEST,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTC,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const BlockcypherDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetBlockcypherProvider,\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network, UTXO } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport const inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo?.script ? input.witnessUtxo?.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport const arrayAverage = (array: number[]): number => {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Bitcoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Bitcoin.Network} The BTC network.\n */\nexport const btcNetwork = (network: Network): Bitcoin.Network => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return Bitcoin.networks.bitcoin\n case Network.Testnet:\n return Bitcoin.networks.testnet\n }\n}\n\n/**\n * Validate the BTC address.\n *\n * @param {Address} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Bitcoin.address.toOutputScript(address, btcNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return 'bc1'\n case Network.Testnet:\n return 'tb1'\n }\n}\n","import {\n AssetInfo,\n FeeOption,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Bitcoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetBTC,\n BTCChain,\n BTC_DECIMAL,\n BlockcypherDataProviders,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockstreamExplorerProviders,\n} from './const'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 127\n\nexport const defaultBTCParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [BlockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `84'/0'/0'/0/`, //note this isn't bip44 compliant, but it keeps the wallets generated compatible to pre HD wallets\n [Network.Testnet]: `84'/1'/0'/0/`,\n [Network.Stagenet]: `84'/0'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Bitcoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n *\n * @param {UtxoClientParams} params\n */\n constructor(params = defaultBTCParams) {\n super(BTCChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const btcNetwork = Utils.btcNetwork(this.network)\n const btcKeys = this.getBtcKeys(this.phrase, index)\n\n const { address } = Bitcoin.payments.p2wpkh({\n pubkey: btcKeys.publicKey,\n network: btcNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns BTC asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetBTC,\n decimal: BTC_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating BTC keys from the given phrase\n * */\n private getBtcKeys(phrase: string, index = 0): Bitcoin.ECPair.ECPairInterface {\n const btcNetwork = Utils.btcNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Bitcoin.bip32.fromSeed(seed, btcNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Bitcoin.ECPair.fromPrivateKey(master.privateKey, { network: btcNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n //use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n try {\n const response = await axios.get('https://app.bitgo.com/api/v2/btc/tx/fee')\n return response.data.feePerKb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + Utils.inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n\n /**\n * Transfer BTC.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n *\n * @throws {\"memo too long\"} Thrown if memo longer than 80 chars.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n // set the default fee rate to `fast`\n const feeRate = params.feeRate || (await this.getFeeRates())[FeeOption.Fast]\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({ ...params, sender: this.getAddress(fromAddressIndex), feeRate })\n\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx)\n\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n const txHash = psbt.extractTransaction().getId()\n try {\n const txId = await this.roundRobinBroadcastTx(txHex)\n return txId\n } catch (err) {\n const error = `Server error, please check explorer for tx confirmation ${this.explorerProviders[\n this.network\n ].getExplorerTxUrl(txHash)}`\n return error\n }\n }\n\n /**\n *\n * @param param0\n * @deprecated\n */\n async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n spendPendingUTXO?: boolean\n withTxHex?: boolean\n }): Promise<{ psbt: Bitcoin.Psbt; utxos: UTXO[]; inputs: UTXO[] }> {\n if (memo && memo.length > 80) {\n throw new Error('memo too long, must not be longer than 80 chars.')\n }\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n // search only confirmed UTXOs if pending UTXO is not allowed\n const confirmedOnly = !spendPendingUTXO\n const utxos = await this.scanUTXOs(sender, confirmedOnly)\n if (utxos.length === 0) throw new Error('Insufficient Balance for transaction')\n const feeRateWhole = Math.ceil(feeRate)\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n\n //1. add output amount and recipient to targets\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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\n const psbt = new Bitcoin.Psbt({ network: Utils.btcNetwork(this.network) }) // Network-specific\n\n // psbt add input from accumulative inputs\n inputs.forEach((utxo: UTXO) =>\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n witnessUtxo: utxo.witnessUtxo,\n }),\n )\n\n // psbt add outputs from accumulative outputs\n outputs.forEach((output: Bitcoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change ddress\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos, inputs }\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n spendPendingUTXO = true,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n spendPendingUTXO,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n}\n\nexport { Client }\n"],"names":["btcNetwork","Utils.btcNetwork","Utils.validateAddress","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts"],"sourcesContent":["import { ExplorerProvider, Network, UtxoOnlineDataProviders } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n HaskoinNetwork,\n HaskoinProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\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\n\nexport const BTC_DECIMAL = 8\n\nexport const LOWER_FEE_BOUND = 1\nexport const UPPER_FEE_BOUND = 500\nexport const BTC_SYMBOL = '₿'\nexport const BTC_SATOSHI_SYMBOL = '⚡'\n\n/**\n * Chain identifier for Bitcoin mainnet\n *\n */\nexport const BTCChain = 'BTC' as const\n\n/**\n * Base \"chain\" asset on bitcoin main net.\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetBTC: Asset = { chain: BTCChain, symbol: 'BTC', ticker: 'BTC', synth: false }\n\nconst BTC_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/',\n 'https://blockstream.info/address/%%ADDRESS%%',\n 'https://blockstream.info/tx/%%TX_ID%%',\n)\nconst BTC_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/testnet/',\n 'https://blockstream.info/testnet/address/%%ADDRESS%%',\n 'https://blockstream.info/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: BTC_TESTNET_EXPLORER,\n [Network.Stagenet]: BTC_MAINNET_EXPLORER,\n [Network.Mainnet]: BTC_MAINNET_EXPLORER,\n}\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTCTEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTC,\n)\nexport const SochainDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n//======================\n// haskoin\n//======================\nconst testnetHaskoinProvider = new HaskoinProvider(\n 'https://api.haskoin.com',\n BTCChain,\n AssetBTC,\n 8,\n HaskoinNetwork.BTCTEST,\n)\n\nconst mainnetHaskoinProvider = new HaskoinProvider('https://api.haskoin.com', BTCChain, AssetBTC, 8, HaskoinNetwork.BTC)\nexport const HaskoinDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetHaskoinProvider,\n [Network.Stagenet]: mainnetHaskoinProvider,\n [Network.Mainnet]: mainnetHaskoinProvider,\n}\n//======================\n// Blockcypher\n//======================\nconst testnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTCTEST,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTC,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const BlockcypherDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetBlockcypherProvider,\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network, UTXO } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport const inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo?.script ? input.witnessUtxo?.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport const arrayAverage = (array: number[]): number => {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Bitcoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Bitcoin.Network} The BTC network.\n */\nexport const btcNetwork = (network: Network): Bitcoin.Network => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return Bitcoin.networks.bitcoin\n case Network.Testnet:\n return Bitcoin.networks.testnet\n }\n}\n\n/**\n * Validate the BTC address.\n *\n * @param {Address} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Bitcoin.address.toOutputScript(address, btcNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return 'bc1'\n case Network.Testnet:\n return 'tb1'\n }\n}\n","import {\n AssetInfo,\n FeeOption,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Bitcoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetBTC,\n BTCChain,\n BTC_DECIMAL,\n BlockcypherDataProviders,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockstreamExplorerProviders,\n} from './const'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 127\n\nexport const defaultBTCParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [BlockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `84'/0'/0'/0/`, //note this isn't bip44 compliant, but it keeps the wallets generated compatible to pre HD wallets\n [Network.Testnet]: `84'/1'/0'/0/`,\n [Network.Stagenet]: `84'/0'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Bitcoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n *\n * @param {UtxoClientParams} params\n */\n constructor(params = defaultBTCParams) {\n super(BTCChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * @deprecated this function eventually will be removed use getAddressAsync instead\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const btcNetwork = Utils.btcNetwork(this.network)\n const btcKeys = this.getBtcKeys(this.phrase, index)\n\n const { address } = Bitcoin.payments.p2wpkh({\n pubkey: btcKeys.publicKey,\n network: btcNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n async getAddressAsync(index = 0): Promise<string> {\n return this.getAddress(index)\n }\n\n /**\n *\n * @returns BTC asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetBTC,\n decimal: BTC_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating BTC keys from the given phrase\n * */\n private getBtcKeys(phrase: string, index = 0): Bitcoin.ECPair.ECPairInterface {\n const btcNetwork = Utils.btcNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Bitcoin.bip32.fromSeed(seed, btcNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Bitcoin.ECPair.fromPrivateKey(master.privateKey, { network: btcNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n //use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n try {\n const response = await axios.get('https://app.bitgo.com/api/v2/btc/tx/fee')\n return response.data.feePerKb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + Utils.inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n\n /**\n * Transfer BTC.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n *\n * @throws {\"memo too long\"} Thrown if memo longer than 80 chars.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n // set the default fee rate to `fast`\n const feeRate = params.feeRate || (await this.getFeeRates())[FeeOption.Fast]\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n sender: await this.getAddressAsync(fromAddressIndex),\n feeRate,\n })\n\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx)\n\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n const txHash = psbt.extractTransaction().getId()\n try {\n const txId = await this.roundRobinBroadcastTx(txHex)\n return txId\n } catch (err) {\n const error = `Server error, please check explorer for tx confirmation ${this.explorerProviders[\n this.network\n ].getExplorerTxUrl(txHash)}`\n return error\n }\n }\n\n /**\n *\n * @param param0\n * @deprecated\n */\n async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n spendPendingUTXO?: boolean\n withTxHex?: boolean\n }): Promise<{ psbt: Bitcoin.Psbt; utxos: UTXO[]; inputs: UTXO[] }> {\n if (memo && memo.length > 80) {\n throw new Error('memo too long, must not be longer than 80 chars.')\n }\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n // search only confirmed UTXOs if pending UTXO is not allowed\n const confirmedOnly = !spendPendingUTXO\n const utxos = await this.scanUTXOs(sender, confirmedOnly)\n if (utxos.length === 0) throw new Error('Insufficient Balance for transaction')\n const feeRateWhole = Math.ceil(feeRate)\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n\n //1. add output amount and recipient to targets\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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\n const psbt = new Bitcoin.Psbt({ network: Utils.btcNetwork(this.network) }) // Network-specific\n\n // psbt add input from accumulative inputs\n inputs.forEach((utxo: UTXO) =>\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n witnessUtxo: utxo.witnessUtxo,\n }),\n )\n\n // psbt add outputs from accumulative outputs\n outputs.forEach((output: Bitcoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change ddress\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos, inputs }\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n spendPendingUTXO = true,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n spendPendingUTXO,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n}\n\nexport { Client }\n"],"names":["btcNetwork","Utils.btcNetwork","Utils.validateAddress","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -213,15 +213,7 @@ class Client extends xchainClient.UTXOClient {
213
213
  });
214
214
  }
215
215
  /**
216
- * Get the current address.
217
- *
218
- * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)
219
- * The address is then decoded into type P2WPKH and returned.
220
- *
221
- * @returns {Address} The current address.
222
- *
223
- * @throws {"Phrase must be provided"} Thrown if phrase has not been set before.
224
- * @throws {"Address not defined"} Thrown if failed creating account from phrase.
216
+ * @deprecated this function eventually will be removed use getAddressAsync instead
225
217
  */
226
218
  getAddress(index = 0) {
227
219
  if (index < 0) {
@@ -241,6 +233,22 @@ class Client extends xchainClient.UTXOClient {
241
233
  }
242
234
  throw new Error('Phrase must be provided');
243
235
  }
236
+ /**
237
+ * Get the current address.
238
+ *
239
+ * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)
240
+ * The address is then decoded into type P2WPKH and returned.
241
+ *
242
+ * @returns {Address} The current address.
243
+ *
244
+ * @throws {"Phrase must be provided"} Thrown if phrase has not been set before.
245
+ * @throws {"Address not defined"} Thrown if failed creating account from phrase.
246
+ */
247
+ getAddressAsync(index = 0) {
248
+ return __awaiter(this, void 0, void 0, function* () {
249
+ return this.getAddress(index);
250
+ });
251
+ }
244
252
  /**
245
253
  *
246
254
  * @returns BTC asset info
@@ -342,7 +350,7 @@ class Client extends xchainClient.UTXOClient {
342
350
  const feeRate = params.feeRate || (yield this.getFeeRates())[xchainClient.FeeOption.Fast];
343
351
  xchainClient.checkFeeBounds(this.feeBounds, feeRate);
344
352
  const fromAddressIndex = (params === null || params === void 0 ? void 0 : params.walletIndex) || 0;
345
- const { rawUnsignedTx } = yield this.prepareTx(Object.assign(Object.assign({}, params), { sender: this.getAddress(fromAddressIndex), feeRate }));
353
+ const { rawUnsignedTx } = yield this.prepareTx(Object.assign(Object.assign({}, params), { sender: yield this.getAddressAsync(fromAddressIndex), feeRate }));
346
354
  const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
347
355
  const psbt = Bitcoin__namespace.Psbt.fromBase64(rawUnsignedTx);
348
356
  psbt.signAllInputs(btcKeys); // Sign all inputs
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts"],"sourcesContent":["import { ExplorerProvider, Network, UtxoOnlineDataProviders } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n HaskoinNetwork,\n HaskoinProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\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\n\nexport const BTC_DECIMAL = 8\n\nexport const LOWER_FEE_BOUND = 1\nexport const UPPER_FEE_BOUND = 500\nexport const BTC_SYMBOL = '₿'\nexport const BTC_SATOSHI_SYMBOL = '⚡'\n\n/**\n * Chain identifier for Bitcoin mainnet\n *\n */\nexport const BTCChain = 'BTC' as const\n\n/**\n * Base \"chain\" asset on bitcoin main net.\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetBTC: Asset = { chain: BTCChain, symbol: 'BTC', ticker: 'BTC', synth: false }\n\nconst BTC_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/',\n 'https://blockstream.info/address/%%ADDRESS%%',\n 'https://blockstream.info/tx/%%TX_ID%%',\n)\nconst BTC_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/testnet/',\n 'https://blockstream.info/testnet/address/%%ADDRESS%%',\n 'https://blockstream.info/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: BTC_TESTNET_EXPLORER,\n [Network.Stagenet]: BTC_MAINNET_EXPLORER,\n [Network.Mainnet]: BTC_MAINNET_EXPLORER,\n}\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTCTEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTC,\n)\nexport const SochainDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n//======================\n// haskoin\n//======================\nconst testnetHaskoinProvider = new HaskoinProvider(\n 'https://api.haskoin.com',\n BTCChain,\n AssetBTC,\n 8,\n HaskoinNetwork.BTCTEST,\n)\n\nconst mainnetHaskoinProvider = new HaskoinProvider('https://api.haskoin.com', BTCChain, AssetBTC, 8, HaskoinNetwork.BTC)\nexport const HaskoinDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetHaskoinProvider,\n [Network.Stagenet]: mainnetHaskoinProvider,\n [Network.Mainnet]: mainnetHaskoinProvider,\n}\n//======================\n// Blockcypher\n//======================\nconst testnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTCTEST,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTC,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const BlockcypherDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetBlockcypherProvider,\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network, UTXO } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport const inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo?.script ? input.witnessUtxo?.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport const arrayAverage = (array: number[]): number => {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Bitcoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Bitcoin.Network} The BTC network.\n */\nexport const btcNetwork = (network: Network): Bitcoin.Network => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return Bitcoin.networks.bitcoin\n case Network.Testnet:\n return Bitcoin.networks.testnet\n }\n}\n\n/**\n * Validate the BTC address.\n *\n * @param {Address} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Bitcoin.address.toOutputScript(address, btcNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return 'bc1'\n case Network.Testnet:\n return 'tb1'\n }\n}\n","import {\n AssetInfo,\n FeeOption,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Bitcoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetBTC,\n BTCChain,\n BTC_DECIMAL,\n BlockcypherDataProviders,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockstreamExplorerProviders,\n} from './const'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 127\n\nexport const defaultBTCParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [BlockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `84'/0'/0'/0/`, //note this isn't bip44 compliant, but it keeps the wallets generated compatible to pre HD wallets\n [Network.Testnet]: `84'/1'/0'/0/`,\n [Network.Stagenet]: `84'/0'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Bitcoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n *\n * @param {UtxoClientParams} params\n */\n constructor(params = defaultBTCParams) {\n super(BTCChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const btcNetwork = Utils.btcNetwork(this.network)\n const btcKeys = this.getBtcKeys(this.phrase, index)\n\n const { address } = Bitcoin.payments.p2wpkh({\n pubkey: btcKeys.publicKey,\n network: btcNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns BTC asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetBTC,\n decimal: BTC_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating BTC keys from the given phrase\n * */\n private getBtcKeys(phrase: string, index = 0): Bitcoin.ECPair.ECPairInterface {\n const btcNetwork = Utils.btcNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Bitcoin.bip32.fromSeed(seed, btcNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Bitcoin.ECPair.fromPrivateKey(master.privateKey, { network: btcNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n //use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n try {\n const response = await axios.get('https://app.bitgo.com/api/v2/btc/tx/fee')\n return response.data.feePerKb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + Utils.inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n\n /**\n * Transfer BTC.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n *\n * @throws {\"memo too long\"} Thrown if memo longer than 80 chars.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n // set the default fee rate to `fast`\n const feeRate = params.feeRate || (await this.getFeeRates())[FeeOption.Fast]\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({ ...params, sender: this.getAddress(fromAddressIndex), feeRate })\n\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx)\n\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n const txHash = psbt.extractTransaction().getId()\n try {\n const txId = await this.roundRobinBroadcastTx(txHex)\n return txId\n } catch (err) {\n const error = `Server error, please check explorer for tx confirmation ${this.explorerProviders[\n this.network\n ].getExplorerTxUrl(txHash)}`\n return error\n }\n }\n\n /**\n *\n * @param param0\n * @deprecated\n */\n async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n spendPendingUTXO?: boolean\n withTxHex?: boolean\n }): Promise<{ psbt: Bitcoin.Psbt; utxos: UTXO[]; inputs: UTXO[] }> {\n if (memo && memo.length > 80) {\n throw new Error('memo too long, must not be longer than 80 chars.')\n }\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n // search only confirmed UTXOs if pending UTXO is not allowed\n const confirmedOnly = !spendPendingUTXO\n const utxos = await this.scanUTXOs(sender, confirmedOnly)\n if (utxos.length === 0) throw new Error('Insufficient Balance for transaction')\n const feeRateWhole = Math.ceil(feeRate)\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n\n //1. add output amount and recipient to targets\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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\n const psbt = new Bitcoin.Psbt({ network: Utils.btcNetwork(this.network) }) // Network-specific\n\n // psbt add input from accumulative inputs\n inputs.forEach((utxo: UTXO) =>\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n witnessUtxo: utxo.witnessUtxo,\n }),\n )\n\n // psbt add outputs from accumulative outputs\n outputs.forEach((output: Bitcoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change ddress\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos, inputs }\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n spendPendingUTXO = true,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n spendPendingUTXO,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n}\n\nexport { Client }\n"],"names":["ExplorerProvider","Network","SochainProvider","SochainNetwork","HaskoinProvider","HaskoinNetwork","BlockcypherProvider","BlockcypherNetwork","Bitcoin","UTXOClient","btcNetwork","Utils.btcNetwork","getSeed","Utils.validateAddress","axios","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH","FeeOption","checkFeeBounds","accumulative"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts"],"sourcesContent":["import { ExplorerProvider, Network, UtxoOnlineDataProviders } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n HaskoinNetwork,\n HaskoinProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\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\n\nexport const BTC_DECIMAL = 8\n\nexport const LOWER_FEE_BOUND = 1\nexport const UPPER_FEE_BOUND = 500\nexport const BTC_SYMBOL = '₿'\nexport const BTC_SATOSHI_SYMBOL = '⚡'\n\n/**\n * Chain identifier for Bitcoin mainnet\n *\n */\nexport const BTCChain = 'BTC' as const\n\n/**\n * Base \"chain\" asset on bitcoin main net.\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetBTC: Asset = { chain: BTCChain, symbol: 'BTC', ticker: 'BTC', synth: false }\n\nconst BTC_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/',\n 'https://blockstream.info/address/%%ADDRESS%%',\n 'https://blockstream.info/tx/%%TX_ID%%',\n)\nconst BTC_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockstream.info/testnet/',\n 'https://blockstream.info/testnet/address/%%ADDRESS%%',\n 'https://blockstream.info/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: BTC_TESTNET_EXPLORER,\n [Network.Stagenet]: BTC_MAINNET_EXPLORER,\n [Network.Mainnet]: BTC_MAINNET_EXPLORER,\n}\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTCTEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n BTCChain,\n AssetBTC,\n 8,\n SochainNetwork.BTC,\n)\nexport const SochainDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n//======================\n// haskoin\n//======================\nconst testnetHaskoinProvider = new HaskoinProvider(\n 'https://api.haskoin.com',\n BTCChain,\n AssetBTC,\n 8,\n HaskoinNetwork.BTCTEST,\n)\n\nconst mainnetHaskoinProvider = new HaskoinProvider('https://api.haskoin.com', BTCChain, AssetBTC, 8, HaskoinNetwork.BTC)\nexport const HaskoinDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetHaskoinProvider,\n [Network.Stagenet]: mainnetHaskoinProvider,\n [Network.Mainnet]: mainnetHaskoinProvider,\n}\n//======================\n// Blockcypher\n//======================\nconst testnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTCTEST,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n BTCChain,\n AssetBTC,\n 8,\n BlockcypherNetwork.BTC,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const BlockcypherDataProviders: UtxoOnlineDataProviders = {\n [Network.Testnet]: testnetBlockcypherProvider,\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network, UTXO } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport const inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo?.script ? input.witnessUtxo?.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport const arrayAverage = (array: number[]): number => {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Bitcoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Bitcoin.Network} The BTC network.\n */\nexport const btcNetwork = (network: Network): Bitcoin.Network => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return Bitcoin.networks.bitcoin\n case Network.Testnet:\n return Bitcoin.networks.testnet\n }\n}\n\n/**\n * Validate the BTC address.\n *\n * @param {Address} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Bitcoin.address.toOutputScript(address, btcNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return 'bc1'\n case Network.Testnet:\n return 'tb1'\n }\n}\n","import {\n AssetInfo,\n FeeOption,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Bitcoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetBTC,\n BTCChain,\n BTC_DECIMAL,\n BlockcypherDataProviders,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockstreamExplorerProviders,\n} from './const'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 127\n\nexport const defaultBTCParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [BlockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `84'/0'/0'/0/`, //note this isn't bip44 compliant, but it keeps the wallets generated compatible to pre HD wallets\n [Network.Testnet]: `84'/1'/0'/0/`,\n [Network.Stagenet]: `84'/0'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Bitcoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n *\n * @param {UtxoClientParams} params\n */\n constructor(params = defaultBTCParams) {\n super(BTCChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * @deprecated this function eventually will be removed use getAddressAsync instead\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const btcNetwork = Utils.btcNetwork(this.network)\n const btcKeys = this.getBtcKeys(this.phrase, index)\n\n const { address } = Bitcoin.payments.p2wpkh({\n pubkey: btcKeys.publicKey,\n network: btcNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n async getAddressAsync(index = 0): Promise<string> {\n return this.getAddress(index)\n }\n\n /**\n *\n * @returns BTC asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetBTC,\n decimal: BTC_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating BTC keys from the given phrase\n * */\n private getBtcKeys(phrase: string, index = 0): Bitcoin.ECPair.ECPairInterface {\n const btcNetwork = Utils.btcNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Bitcoin.bip32.fromSeed(seed, btcNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Bitcoin.ECPair.fromPrivateKey(master.privateKey, { network: btcNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n //use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n try {\n const response = await axios.get('https://app.bitgo.com/api/v2/btc/tx/fee')\n return response.data.feePerKb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + Utils.inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n\n /**\n * Transfer BTC.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n *\n * @throws {\"memo too long\"} Thrown if memo longer than 80 chars.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n // set the default fee rate to `fast`\n const feeRate = params.feeRate || (await this.getFeeRates())[FeeOption.Fast]\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n sender: await this.getAddressAsync(fromAddressIndex),\n feeRate,\n })\n\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx)\n\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n const txHash = psbt.extractTransaction().getId()\n try {\n const txId = await this.roundRobinBroadcastTx(txHex)\n return txId\n } catch (err) {\n const error = `Server error, please check explorer for tx confirmation ${this.explorerProviders[\n this.network\n ].getExplorerTxUrl(txHash)}`\n return error\n }\n }\n\n /**\n *\n * @param param0\n * @deprecated\n */\n async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n spendPendingUTXO?: boolean\n withTxHex?: boolean\n }): Promise<{ psbt: Bitcoin.Psbt; utxos: UTXO[]; inputs: UTXO[] }> {\n if (memo && memo.length > 80) {\n throw new Error('memo too long, must not be longer than 80 chars.')\n }\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n // search only confirmed UTXOs if pending UTXO is not allowed\n const confirmedOnly = !spendPendingUTXO\n const utxos = await this.scanUTXOs(sender, confirmedOnly)\n if (utxos.length === 0) throw new Error('Insufficient Balance for transaction')\n const feeRateWhole = Math.ceil(feeRate)\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n\n //1. add output amount and recipient to targets\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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\n const psbt = new Bitcoin.Psbt({ network: Utils.btcNetwork(this.network) }) // Network-specific\n\n // psbt add input from accumulative inputs\n inputs.forEach((utxo: UTXO) =>\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n witnessUtxo: utxo.witnessUtxo,\n }),\n )\n\n // psbt add outputs from accumulative outputs\n outputs.forEach((output: Bitcoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change ddress\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos, inputs }\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n spendPendingUTXO = true,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n spendPendingUTXO,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n}\n\nexport { Client }\n"],"names":["ExplorerProvider","Network","SochainProvider","SochainNetwork","HaskoinProvider","HaskoinNetwork","BlockcypherProvider","BlockcypherNetwork","Bitcoin","UTXOClient","btcNetwork","Utils.btcNetwork","getSeed","Utils.validateAddress","axios","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH","FeeOption","checkFeeBounds","accumulative"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA;;;;AAIG;AACI,MAAM,UAAU,GAAG,KAAI;AAEvB,MAAM,WAAW,GAAG,EAAC;AAErB,MAAM,eAAe,GAAG,EAAC;AACzB,MAAM,eAAe,GAAG,IAAG;AAC3B,MAAM,UAAU,GAAG,IAAG;AACtB,MAAM,kBAAkB,GAAG,IAAG;AAErC;;;AAGG;AACI,MAAM,QAAQ,GAAG,MAAc;AAEtC;;;;;AAKG;MACU,QAAQ,GAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE;AAE9F,MAAM,oBAAoB,GAAG,IAAIA,6BAAgB,CAC/C,2BAA2B,EAC3B,8CAA8C,EAC9C,uCAAuC,CACxC,CAAA;AACD,MAAM,oBAAoB,GAAG,IAAIA,6BAAgB,CAC/C,mCAAmC,EACnC,sDAAsD,EACtD,+CAA+C,CAChD,CAAA;AACY,MAAA,4BAA4B,GAAG;AAC1C,IAAA,CAACC,oBAAO,CAAC,OAAO,GAAG,oBAAoB;AACvC,IAAA,CAACA,oBAAO,CAAC,QAAQ,GAAG,oBAAoB;AACxC,IAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,oBAAoB;EACxC;AACD;AACA;AACA;AAEA,MAAM,sBAAsB,GAAG,IAAIC,mCAAe,CAChD,4BAA4B,EAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACpC,QAAQ,EACR,QAAQ,EACR,CAAC,EACDC,kCAAc,CAAC,OAAO,CACvB,CAAA;AACD,MAAM,sBAAsB,GAAG,IAAID,mCAAe,CAChD,4BAA4B,EAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,EACpC,QAAQ,EACR,QAAQ,EACR,CAAC,EACDC,kCAAc,CAAC,GAAG,CACnB,CAAA;AACY,MAAA,oBAAoB,GAA4B;AAC3D,IAAA,CAACF,oBAAO,CAAC,OAAO,GAAG,sBAAsB;AACzC,IAAA,CAACA,oBAAO,CAAC,QAAQ,GAAG,sBAAsB;AAC1C,IAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,sBAAsB;EAC1C;AACD;AACA;AACA;AACA,MAAM,sBAAsB,GAAG,IAAIG,mCAAe,CAChD,yBAAyB,EACzB,QAAQ,EACR,QAAQ,EACR,CAAC,EACDC,kCAAc,CAAC,OAAO,CACvB,CAAA;AAED,MAAM,sBAAsB,GAAG,IAAID,mCAAe,CAAC,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAEC,kCAAc,CAAC,GAAG,CAAC,CAAA;AAC3G,MAAA,oBAAoB,GAA4B;AAC3D,IAAA,CAACJ,oBAAO,CAAC,OAAO,GAAG,sBAAsB;AACzC,IAAA,CAACA,oBAAO,CAAC,QAAQ,GAAG,sBAAsB;AAC1C,IAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,sBAAsB;EAC1C;AACD;AACA;AACA;AACA,MAAM,0BAA0B,GAAG,IAAIK,uCAAmB,CACxD,gCAAgC,EAChC,QAAQ,EACR,QAAQ,EACR,CAAC,EACDC,sCAAkB,CAAC,OAAO,EAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CACzC,CAAA;AAED,MAAM,0BAA0B,GAAG,IAAID,uCAAmB,CACxD,gCAAgC,EAChC,QAAQ,EACR,QAAQ,EACR,CAAC,EACDC,sCAAkB,CAAC,GAAG,EACtB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CACzC,CAAA;AACY,MAAA,wBAAwB,GAA4B;AAC/D,IAAA,CAACN,oBAAO,CAAC,OAAO,GAAG,0BAA0B;AAC7C,IAAA,CAACA,oBAAO,CAAC,QAAQ,GAAG,0BAA0B;AAC9C,IAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,0BAA0B;;;ACnHxC,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACnC,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAC/B,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAA;AAC5B,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAE/B,MAAM,UAAU,GAAG,CAAC,KAAW,KAAY;;IAChD,OAAO,aAAa,IAAI,CAAA,CAAA,EAAA,GAAA,KAAK,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,IAAG,MAAA,KAAK,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAA;AAC7G,CAAC,CAAA;AAcD;;;;;AAKG;AACI,MAAM,UAAU,GAAG,CAAC,OAAgB,KAAqB;AAC9D,IAAA,QAAQ,OAAO;QACb,KAAKA,oBAAO,CAAC,OAAO,CAAC;QACrB,KAAKA,oBAAO,CAAC,QAAQ;AACnB,YAAA,OAAOO,kBAAO,CAAC,QAAQ,CAAC,OAAO,CAAA;QACjC,KAAKP,oBAAO,CAAC,OAAO;AAClB,YAAA,OAAOO,kBAAO,CAAC,QAAQ,CAAC,OAAO,CAAA;AAClC,KAAA;AACH,CAAC,CAAA;AAED;;;;;;AAMG;MACU,eAAe,GAAG,CAAC,OAAgB,EAAE,OAAgB,KAAa;IAC7E,IAAI;AACF,QAAAA,kBAAO,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;AAC5D,QAAA,OAAO,IAAI,CAAA;AACZ,KAAA;AAAC,IAAA,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,KAAK,CAAA;AACb,KAAA;AACH,EAAC;AAED;;;;;;AAMI;AACS,MAAA,SAAS,GAAG,CAAC,OAAgB,KAAI;AAC5C,IAAA,QAAQ,OAAO;QACb,KAAKP,oBAAO,CAAC,OAAO,CAAC;QACrB,KAAKA,oBAAO,CAAC,QAAQ;AACnB,YAAA,OAAO,KAAK,CAAA;QACd,KAAKA,oBAAO,CAAC,OAAO;AAClB,YAAA,OAAO,KAAK,CAAA;AACf,KAAA;AACH;;AC1CA,MAAM,iCAAiC,GAAG,GAAG,CAAA;AAEhC,MAAA,gBAAgB,GAAqB;IAChD,OAAO,EAAEA,oBAAO,CAAC,OAAO;AACxB,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,iBAAiB,EAAE,4BAA4B;IAC/C,aAAa,EAAE,CAAC,wBAAwB,CAAC;AACzC,IAAA,mBAAmB,EAAE;AACnB,QAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,CAAc,YAAA,CAAA;AACjC,QAAA,CAACA,oBAAO,CAAC,OAAO,GAAG,CAAc,YAAA,CAAA;AACjC,QAAA,CAACA,oBAAO,CAAC,QAAQ,GAAG,CAAc,YAAA,CAAA;AACnC,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,KAAK,EAAE,eAAe;AACvB,KAAA;EACF;AACD;;AAEG;AACH,MAAM,MAAO,SAAQQ,uBAAU,CAAA;AAC7B;;;;;AAKG;IACH,WAAY,CAAA,MAAM,GAAG,gBAAgB,EAAA;QACnC,KAAK,CAAC,QAAQ,EAAE;YACd,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,aAAa,EAAE,MAAM,CAAC,aAAa;AACpC,SAAA,CAAC,CAAA;KACH;AAED;;AAEG;IACH,UAAU,CAAC,KAAK,GAAG,CAAC,EAAA;QAClB,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;AACnD,SAAA;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAMC,YAAU,GAAGC,UAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACjD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAEnD,MAAM,EAAE,OAAO,EAAE,GAAGH,kBAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC1C,MAAM,EAAE,OAAO,CAAC,SAAS;AACzB,gBAAA,OAAO,EAAEE,YAAU;AACpB,aAAA,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;AACvC,aAAA;AACD,YAAA,OAAO,OAAO,CAAA;AACf,SAAA;AACD,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;KAC3C;AAED;;;;;;;;;;AAUG;IACG,eAAe,CAAC,KAAK,GAAG,CAAC,EAAA;;AAC7B,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;SAC9B,CAAA,CAAA;AAAA,KAAA;AAED;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,SAAS,GAAc;AAC3B,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,WAAW;SACrB,CAAA;AACD,QAAA,OAAO,SAAS,CAAA;KACjB;AAED;;;;;;;;;;AAUK;AACG,IAAA,UAAU,CAAC,MAAc,EAAE,KAAK,GAAG,CAAC,EAAA;QAC1C,MAAMA,YAAU,GAAGC,UAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAEjD,QAAA,MAAM,IAAI,GAAGC,oBAAO,CAAC,MAAM,CAAC,CAAA;QAC5B,MAAM,MAAM,GAAGJ,kBAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAEE,YAAU,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAA;AAErG,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;AACzD,SAAA;AAED,QAAA,OAAOF,kBAAO,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,EAAEE,YAAU,EAAE,CAAC,CAAA;KACjF;AAED;;;;;AAKG;AACH,IAAA,eAAe,CAAC,OAAe,EAAA;QAC7B,OAAOG,eAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;KACpD;IAEe,mBAAmB,GAAA;;;;YAGjC,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAMC,yBAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;gBAC3E,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;AACrC,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,iCAAiC,CAAA;AACzC,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAED;;;;;AAKG;AACO,IAAA,WAAW,CAAC,IAAY,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACtC,QAAA,OAAON,kBAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAACA,kBAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;KACjE;AAED;;;;;;;AAOG;AACO,IAAA,eAAe,CAAC,MAAc,EAAE,OAAgB,EAAE,OAAsB,IAAI,EAAA;AACpF,QAAA,MAAM,sBAAsB,GAC1B,MAAM,CAAC,MAAM,GAAG,CAAC;AACf,cAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAGO,UAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM;cACnE,CAAC,CAAA;AACP,QAAA,IAAI,GAAG,GACLC,aAAmB;YACnB,sBAAsB;AACtB,YAAAC,cAAoB;AACpB,YAAAC,oBAA0B;AAC1B,YAAAD,cAAoB;YACpBC,oBAA0B,CAAA;AAE5B,QAAA,IAAI,IAAI,EAAE;YACR,GAAG,IAAID,cAAoB,GAAG,IAAI,CAAC,MAAM,CAAA;AAC1C,SAAA;AACD,QAAA,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,CAAA;QACzB,OAAO,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,UAAU,CAAA;KAC3C;AAED;;;;;;;AAOG;AACG,IAAA,QAAQ,CAAC,MAAwC,EAAA;;;AAErD,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAEE,sBAAS,CAAC,IAAI,CAAC,CAAA;AAC5E,YAAAC,2BAAc,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAEvC,YAAA,MAAM,gBAAgB,GAAG,CAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,WAAW,KAAI,CAAC,CAAA;YACjD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACzC,MAAM,CAAA,EAAA,EACT,MAAM,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,EACpD,OAAO,EAAA,CAAA,CACP,CAAA;AAEF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YAC9D,MAAM,IAAI,GAAGZ,kBAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AAEnD,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AAC3B,YAAA,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAExB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,CAAA;YAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,CAAA;YAChD,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACpD,gBAAA,OAAO,IAAI,CAAA;AACZ,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,CAAA,wDAAA,EAA2D,IAAI,CAAC,iBAAiB,CAC7F,IAAI,CAAC,OAAO,CACb,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAA;AAC5B,gBAAA,OAAO,KAAK,CAAA;AACb,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAED;;;;AAIG;AACG,IAAA,OAAO,CAAC,EACZ,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,MAAM,EACN,gBAAgB,GAAG,IAAI,GAMxB,EAAA;;AACC,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE;AAC5B,gBAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;AACpE,aAAA;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;;AAExE,YAAA,MAAM,aAAa,GAAG,CAAC,gBAAgB,CAAA;YACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AACzD,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;YAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACvC,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAEzD,MAAM,aAAa,GAAG,EAAE,CAAA;;YAGxB,aAAa,CAAC,IAAI,CAAC;AACjB,gBAAA,OAAO,EAAE,SAAS;AAClB,gBAAA,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAClC,aAAA,CAAC,CAAA;;AAEF,YAAA,IAAI,YAAY,EAAE;AAChB,gBAAA,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;AACvD,aAAA;AACD,YAAA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAGa,gCAAY,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;;AAG5E,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;YAEhF,MAAM,IAAI,GAAG,IAAIb,kBAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAEG,UAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;;YAG1E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAU,KACxB,IAAI,CAAC,QAAQ,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,aAAA,CAAC,CACH,CAAA;;AAGD,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAA4B,KAAI;AAC/C,gBAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;AAEnB,oBAAA,MAAM,CAAC,OAAO,GAAG,MAAM,CAAA;AACxB,iBAAA;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AACvB,iBAAA;AAAM,qBAAA;;;AAGL,oBAAA,IAAI,YAAY,EAAE;AAChB,wBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;AACnD,qBAAA;AACF,iBAAA;AACH,aAAC,CAAC,CAAA;AAEF,YAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;SAC/B,CAAA,CAAA;AAAA,KAAA;AAED;;;;;AAKG;AACG,IAAA,SAAS,CAAC,EACd,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,EACT,gBAAgB,GAAG,IAAI,EACvB,OAAO,GAKR,EAAA;;YACC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;gBAClC,MAAM;gBACN,SAAS;gBACT,MAAM;gBACN,OAAO;gBACP,IAAI;gBACJ,gBAAgB;AACjB,aAAA,CAAC,CAAA;YAEF,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;SAC1C,CAAA,CAAA;AAAA,KAAA;AACF;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xchainjs/xchain-bitcoin",
3
- "version": "0.23.2",
3
+ "version": "0.23.4",
4
4
  "description": "Custom Bitcoin client and utilities used by XChainJS clients",
5
5
  "keywords": [
6
6
  "XChain",
@@ -34,10 +34,10 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/wif": "^2.0.2",
37
- "@xchainjs/xchain-client": "^0.15.1",
37
+ "@xchainjs/xchain-client": "^0.15.3",
38
38
  "@xchainjs/xchain-crypto": "^0.3.0",
39
39
  "@xchainjs/xchain-util": "^0.13.1",
40
- "@xchainjs/xchain-utxo-providers": "^0.2.5",
40
+ "@xchainjs/xchain-utxo-providers": "^0.2.7",
41
41
  "axios": "^1.3.6",
42
42
  "axios-mock-adapter": "^1.20.0",
43
43
  "bitcoinjs-lib": "5.2.0",
@@ -45,10 +45,10 @@
45
45
  "wif": "^2.0.6"
46
46
  },
47
47
  "peerDependencies": {
48
- "@xchainjs/xchain-client": "^0.15.1",
48
+ "@xchainjs/xchain-client": "^0.15.3",
49
49
  "@xchainjs/xchain-crypto": "^0.3.0",
50
50
  "@xchainjs/xchain-util": "^0.13.1",
51
- "@xchainjs/xchain-utxo-providers": "^0.2.5",
51
+ "@xchainjs/xchain-utxo-providers": "^0.2.7",
52
52
  "axios": "^1.3.6",
53
53
  "bitcoinjs-lib": "5.2.0",
54
54
  "coinselect": "^3.1.12",