@xchainjs/xchain-bitcoin 0.22.3 → 0.23.0

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
@@ -1,4 +1,5 @@
1
- import { AssetInfo, Fee, FeeRate, TxHash, TxParams, UTXO, UTXOClient, UtxoClientParams } from '@xchainjs/xchain-client';
1
+ /// <reference types="node" />
2
+ import { AssetInfo, FeeRate, TxHash, TxParams, UTXO, UTXOClient, UtxoClientParams } from '@xchainjs/xchain-client';
2
3
  import { Address } from '@xchainjs/xchain-util';
3
4
  import * as Bitcoin from 'bitcoinjs-lib';
4
5
  export declare const defaultBTCParams: UtxoClientParams;
@@ -50,7 +51,22 @@ declare class Client extends UTXOClient {
50
51
  */
51
52
  validateAddress(address: string): boolean;
52
53
  protected getSuggestedFeeRate(): Promise<FeeRate>;
53
- protected calcFee(feeRate: FeeRate, memo?: string): Promise<Fee>;
54
+ /**
55
+ * Compile memo.
56
+ *
57
+ * @param {string} memo The memo to be compiled.
58
+ * @returns {Buffer} The compiled memo.
59
+ */
60
+ protected compileMemo(memo: string): Buffer;
61
+ /**
62
+ * Get the transaction fee.
63
+ *
64
+ * @param {UTXO[]} inputs The UTXOs.
65
+ * @param {FeeRate} feeRate The fee rate.
66
+ * @param {Buffer} data The compiled memo (Optional).
67
+ * @returns {number} The fee amount.
68
+ */
69
+ protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data?: Buffer | null): number;
54
70
  /**
55
71
  * Transfer BTC.
56
72
  *
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './types';
2
2
  export * from './client';
3
3
  export * from './const';
4
- export { getDefaultFees, getDefaultFeesWithRates, getPrefix, validateAddress, calcFee } from './utils';
4
+ export { getPrefix, validateAddress } from './utils';
package/lib/index.esm.js CHANGED
@@ -1,10 +1,9 @@
1
- import { ExplorerProvider, Network, standardFeeRates, FeeOption, calcFees, UTXOClient, checkFeeBounds } from '@xchainjs/xchain-client';
1
+ import { ExplorerProvider, Network, UTXOClient, FeeOption, checkFeeBounds } from '@xchainjs/xchain-client';
2
2
  import { getSeed } from '@xchainjs/xchain-crypto';
3
3
  import axios from 'axios';
4
4
  import * as Bitcoin from 'bitcoinjs-lib';
5
5
  import accumulative from 'coinselect/accumulative';
6
6
  import { SochainProvider, SochainNetwork, HaskoinProvider, HaskoinNetwork, BlockcypherProvider, BlockcypherNetwork } from '@xchainjs/xchain-utxo-providers';
7
- import { baseAmount } from '@xchainjs/xchain-util';
8
7
 
9
8
  /******************************************************************************
10
9
  Copyright (c) Microsoft Corporation.
@@ -98,39 +97,8 @@ const TX_INPUT_PUBKEYHASH = 107;
98
97
  const TX_OUTPUT_BASE = 8 + 1; //9
99
98
  const TX_OUTPUT_PUBKEYHASH = 25;
100
99
  const inputBytes = (input) => {
101
- return TX_INPUT_BASE + (input.witnessUtxo.script ? input.witnessUtxo.script.length : TX_INPUT_PUBKEYHASH);
102
- };
103
- /**
104
- * Compile memo.
105
- *
106
- * @param {string} memo The memo to be compiled.
107
- * @returns {Buffer} The compiled memo.
108
- */
109
- const compileMemo = (memo) => {
110
- const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
111
- return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
112
- };
113
- /**
114
- * Get the transaction fee.
115
- *
116
- * @param {UTXO[]} inputs The UTXOs.
117
- * @param {FeeRate} feeRate The fee rate.
118
- * @param {Buffer} data The compiled memo (Optional).
119
- * @returns {number} The fee amount.
120
- */
121
- const getFee = (inputs, feeRate, data = null) => {
122
- let sum = TX_EMPTY_SIZE +
123
- inputs.reduce((a, x) => a + inputBytes(x), 0) +
124
- inputs.length + // +1 byte for each input signature
125
- TX_OUTPUT_BASE +
126
- TX_OUTPUT_PUBKEYHASH +
127
- TX_OUTPUT_BASE +
128
- TX_OUTPUT_PUBKEYHASH;
129
- if (data) {
130
- sum += TX_OUTPUT_BASE + data.length;
131
- }
132
- const fee = sum * feeRate;
133
- return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
100
+ var _a, _b;
101
+ return TX_INPUT_BASE + (((_a = input.witnessUtxo) === null || _a === void 0 ? void 0 : _a.script) ? (_b = input.witnessUtxo) === null || _b === void 0 ? void 0 : _b.script.length : TX_INPUT_PUBKEYHASH);
134
102
  };
135
103
  /**
136
104
  * Get Bitcoin network to be used with bitcoinjs.
@@ -163,39 +131,6 @@ const validateAddress = (address, network) => {
163
131
  return false;
164
132
  }
165
133
  };
166
- /**
167
- * Calculate fees based on fee rate and memo.
168
- *
169
- * @param {FeeRate} feeRate
170
- * @param {string} memo
171
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
172
- */
173
- const calcFee = (feeRate, memo) => {
174
- const compiledMemo = memo ? compileMemo(memo) : null;
175
- const fee = getFee([], feeRate, compiledMemo);
176
- return baseAmount(fee);
177
- };
178
- /**
179
- * Get the default fees with rates.
180
- *
181
- * @returns {FeesWithRates} The default fees and rates.
182
- */
183
- const getDefaultFeesWithRates = () => {
184
- const rates = Object.assign(Object.assign({}, standardFeeRates(20)), { [FeeOption.Fastest]: 50 });
185
- return {
186
- fees: calcFees(rates, calcFee),
187
- rates,
188
- };
189
- };
190
- /**
191
- * Get the default fees.
192
- *
193
- * @returns {Fees} The default fees.
194
- */
195
- const getDefaultFees = () => {
196
- const { fees } = getDefaultFeesWithRates();
197
- return fees;
198
- };
199
134
  /**
200
135
  * Get address prefix based on the network.
201
136
  *
@@ -331,10 +266,39 @@ class Client extends UTXOClient {
331
266
  }
332
267
  });
333
268
  }
334
- calcFee(feeRate, memo) {
335
- return __awaiter(this, void 0, void 0, function* () {
336
- return calcFee(feeRate, memo);
337
- });
269
+ /**
270
+ * Compile memo.
271
+ *
272
+ * @param {string} memo The memo to be compiled.
273
+ * @returns {Buffer} The compiled memo.
274
+ */
275
+ compileMemo(memo) {
276
+ const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
277
+ return Bitcoin.script.compile([Bitcoin.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
278
+ }
279
+ /**
280
+ * Get the transaction fee.
281
+ *
282
+ * @param {UTXO[]} inputs The UTXOs.
283
+ * @param {FeeRate} feeRate The fee rate.
284
+ * @param {Buffer} data The compiled memo (Optional).
285
+ * @returns {number} The fee amount.
286
+ */
287
+ getFeeFromUtxos(inputs, feeRate, data = null) {
288
+ const inputSizeBasedOnInputs = inputs.length > 0
289
+ ? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature
290
+ : 0;
291
+ let sum = TX_EMPTY_SIZE +
292
+ inputSizeBasedOnInputs +
293
+ TX_OUTPUT_BASE +
294
+ TX_OUTPUT_PUBKEYHASH +
295
+ TX_OUTPUT_BASE +
296
+ TX_OUTPUT_PUBKEYHASH;
297
+ if (data) {
298
+ sum += TX_OUTPUT_BASE + data.length;
299
+ }
300
+ const fee = sum * feeRate;
301
+ return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
338
302
  }
339
303
  /**
340
304
  * Transfer BTC.
@@ -350,12 +314,7 @@ class Client extends UTXOClient {
350
314
  // set the default fee rate to `fast`
351
315
  const feeRate = params.feeRate || (yield this.getFeeRates())[FeeOption.Fast];
352
316
  checkFeeBounds(this.feeBounds, feeRate);
353
- /**
354
- * do not spend pending UTXOs when adding a memo
355
- * https://github.com/xchainjs/xchainjs-lib/issues/330
356
- */
357
- const spendPendingUTXO = !params.memo;
358
- const { psbt } = yield this.buildTx(Object.assign(Object.assign({}, params), { feeRate, sender: this.getAddress(fromAddressIndex), spendPendingUTXO }));
317
+ const { psbt } = yield this.buildTx(Object.assign(Object.assign({}, params), { feeRate, sender: this.getAddress(fromAddressIndex) }));
359
318
  const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
360
319
  psbt.signAllInputs(btcKeys); // Sign all inputs
361
320
  psbt.finalizeAllInputs(); // Finalise inputs
@@ -371,7 +330,7 @@ class Client extends UTXOClient {
371
330
  }
372
331
  });
373
332
  }
374
- buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = false, // default: prevent spending uncomfirmed UTXOs
333
+ buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = true, // default: prevent spending uncomfirmed UTXOs
375
334
  }) {
376
335
  return __awaiter(this, void 0, void 0, function* () {
377
336
  if (memo && memo.length > 80) {
@@ -385,7 +344,7 @@ class Client extends UTXOClient {
385
344
  if (utxos.length === 0)
386
345
  throw new Error('Insufficient Balance for transaction');
387
346
  const feeRateWhole = Math.ceil(feeRate);
388
- const compiledMemo = memo ? compileMemo(memo) : null;
347
+ const compiledMemo = memo ? this.compileMemo(memo) : null;
389
348
  const targetOutputs = [];
390
349
  //1. add output amount and recipient to targets
391
350
  targetOutputs.push({
@@ -429,5 +388,5 @@ class Client extends UTXOClient {
429
388
  }
430
389
  }
431
390
 
432
- export { AssetBTC, BTCChain, BTC_DECIMAL, BTC_SATOSHI_SYMBOL, BTC_SYMBOL, BlockcypherDataProviders, Client, HaskoinDataProviders, LOWER_FEE_BOUND, MIN_TX_FEE, SochainDataProviders, UPPER_FEE_BOUND, blockstreamExplorerProviders, calcFee, defaultBTCParams, getDefaultFees, getDefaultFeesWithRates, getPrefix, validateAddress };
391
+ export { AssetBTC, BTCChain, BTC_DECIMAL, BTC_SATOSHI_SYMBOL, BTC_SYMBOL, BlockcypherDataProviders, Client, HaskoinDataProviders, LOWER_FEE_BOUND, MIN_TX_FEE, SochainDataProviders, UPPER_FEE_BOUND, blockstreamExplorerProviders, defaultBTCParams, getPrefix, validateAddress };
433
392
  //# sourceMappingURL=index.esm.js.map
@@ -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 {\n FeeOption,\n FeeRate,\n Fees,\n FeesWithRates,\n Network,\n UTXO,\n calcFees,\n standardFeeRates,\n} from '@xchainjs/xchain-client'\nimport { Address, BaseAmount, baseAmount } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nimport { MIN_TX_FEE } from './const'\n\nconst TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nconst TX_INPUT_PUBKEYHASH = 107\nconst TX_OUTPUT_BASE = 8 + 1 //9\nconst TX_OUTPUT_PUBKEYHASH = 25\n\nconst inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo.script ? input.witnessUtxo.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\nexport const 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 */\nexport const getFee = (inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number => {\n let sum =\n TX_EMPTY_SIZE +\n inputs.reduce((a, x) => a + inputBytes(x), 0) +\n inputs.length + // +1 byte for each input signature\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH +\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += 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 * 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 * Calculate fees based on fee rate and memo.\n *\n * @param {FeeRate} feeRate\n * @param {string} memo\n * @returns {BaseAmount} The calculated fees based on fee rate and the memo.\n */\nexport const calcFee = (feeRate: FeeRate, memo?: string): BaseAmount => {\n const compiledMemo = memo ? compileMemo(memo) : null\n const fee = getFee([], feeRate, compiledMemo)\n return baseAmount(fee)\n}\n\n/**\n * Get the default fees with rates.\n *\n * @returns {FeesWithRates} The default fees and rates.\n */\nexport const getDefaultFeesWithRates = (): FeesWithRates => {\n const rates = {\n ...standardFeeRates(20),\n [FeeOption.Fastest]: 50,\n }\n\n return {\n fees: calcFees(rates, calcFee),\n rates,\n }\n}\n\n/**\n * Get the default fees.\n *\n * @returns {Fees} The default fees.\n */\nexport const getDefaultFees = (): Fees => {\n const { fees } = getDefaultFeesWithRates()\n return fees\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 Fee,\n FeeOption,\n FeeRate,\n Network,\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 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 protected async calcFee(feeRate: FeeRate, memo?: string): Promise<Fee> {\n return Utils.calcFee(feeRate, memo)\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 const fromAddressIndex = params?.walletIndex || 0\n\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 /**\n * do not spend pending UTXOs when adding a memo\n * https://github.com/xchainjs/xchainjs-lib/issues/330\n */\n const spendPendingUTXO = !params.memo\n\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n spendPendingUTXO,\n })\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\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 async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = false, // default: prevent spending uncomfirmed UTXOs\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 ? Utils.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\nexport { Client }\n"],"names":["btcNetwork","Utils.btcNetwork","Utils.validateAddress","Utils.calcFee","Utils.compileMemo"],"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 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 const fromAddressIndex = params?.walletIndex || 0\n\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 { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\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 async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true, // default: prevent spending uncomfirmed UTXOs\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\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
@@ -8,7 +8,6 @@ var axios = require('axios');
8
8
  var Bitcoin = require('bitcoinjs-lib');
9
9
  var accumulative = require('coinselect/accumulative');
10
10
  var xchainUtxoProviders = require('@xchainjs/xchain-utxo-providers');
11
- var xchainUtil = require('@xchainjs/xchain-util');
12
11
 
13
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
13
 
@@ -126,39 +125,8 @@ const TX_INPUT_PUBKEYHASH = 107;
126
125
  const TX_OUTPUT_BASE = 8 + 1; //9
127
126
  const TX_OUTPUT_PUBKEYHASH = 25;
128
127
  const inputBytes = (input) => {
129
- return TX_INPUT_BASE + (input.witnessUtxo.script ? input.witnessUtxo.script.length : TX_INPUT_PUBKEYHASH);
130
- };
131
- /**
132
- * Compile memo.
133
- *
134
- * @param {string} memo The memo to be compiled.
135
- * @returns {Buffer} The compiled memo.
136
- */
137
- const compileMemo = (memo) => {
138
- const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
139
- return Bitcoin__namespace.script.compile([Bitcoin__namespace.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
140
- };
141
- /**
142
- * Get the transaction fee.
143
- *
144
- * @param {UTXO[]} inputs The UTXOs.
145
- * @param {FeeRate} feeRate The fee rate.
146
- * @param {Buffer} data The compiled memo (Optional).
147
- * @returns {number} The fee amount.
148
- */
149
- const getFee = (inputs, feeRate, data = null) => {
150
- let sum = TX_EMPTY_SIZE +
151
- inputs.reduce((a, x) => a + inputBytes(x), 0) +
152
- inputs.length + // +1 byte for each input signature
153
- TX_OUTPUT_BASE +
154
- TX_OUTPUT_PUBKEYHASH +
155
- TX_OUTPUT_BASE +
156
- TX_OUTPUT_PUBKEYHASH;
157
- if (data) {
158
- sum += TX_OUTPUT_BASE + data.length;
159
- }
160
- const fee = sum * feeRate;
161
- return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
128
+ var _a, _b;
129
+ return TX_INPUT_BASE + (((_a = input.witnessUtxo) === null || _a === void 0 ? void 0 : _a.script) ? (_b = input.witnessUtxo) === null || _b === void 0 ? void 0 : _b.script.length : TX_INPUT_PUBKEYHASH);
162
130
  };
163
131
  /**
164
132
  * Get Bitcoin network to be used with bitcoinjs.
@@ -191,39 +159,6 @@ const validateAddress = (address, network) => {
191
159
  return false;
192
160
  }
193
161
  };
194
- /**
195
- * Calculate fees based on fee rate and memo.
196
- *
197
- * @param {FeeRate} feeRate
198
- * @param {string} memo
199
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
200
- */
201
- const calcFee = (feeRate, memo) => {
202
- const compiledMemo = memo ? compileMemo(memo) : null;
203
- const fee = getFee([], feeRate, compiledMemo);
204
- return xchainUtil.baseAmount(fee);
205
- };
206
- /**
207
- * Get the default fees with rates.
208
- *
209
- * @returns {FeesWithRates} The default fees and rates.
210
- */
211
- const getDefaultFeesWithRates = () => {
212
- const rates = Object.assign(Object.assign({}, xchainClient.standardFeeRates(20)), { [xchainClient.FeeOption.Fastest]: 50 });
213
- return {
214
- fees: xchainClient.calcFees(rates, calcFee),
215
- rates,
216
- };
217
- };
218
- /**
219
- * Get the default fees.
220
- *
221
- * @returns {Fees} The default fees.
222
- */
223
- const getDefaultFees = () => {
224
- const { fees } = getDefaultFeesWithRates();
225
- return fees;
226
- };
227
162
  /**
228
163
  * Get address prefix based on the network.
229
164
  *
@@ -359,10 +294,39 @@ class Client extends xchainClient.UTXOClient {
359
294
  }
360
295
  });
361
296
  }
362
- calcFee(feeRate, memo) {
363
- return __awaiter(this, void 0, void 0, function* () {
364
- return calcFee(feeRate, memo);
365
- });
297
+ /**
298
+ * Compile memo.
299
+ *
300
+ * @param {string} memo The memo to be compiled.
301
+ * @returns {Buffer} The compiled memo.
302
+ */
303
+ compileMemo(memo) {
304
+ const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
305
+ return Bitcoin__namespace.script.compile([Bitcoin__namespace.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
306
+ }
307
+ /**
308
+ * Get the transaction fee.
309
+ *
310
+ * @param {UTXO[]} inputs The UTXOs.
311
+ * @param {FeeRate} feeRate The fee rate.
312
+ * @param {Buffer} data The compiled memo (Optional).
313
+ * @returns {number} The fee amount.
314
+ */
315
+ getFeeFromUtxos(inputs, feeRate, data = null) {
316
+ const inputSizeBasedOnInputs = inputs.length > 0
317
+ ? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature
318
+ : 0;
319
+ let sum = TX_EMPTY_SIZE +
320
+ inputSizeBasedOnInputs +
321
+ TX_OUTPUT_BASE +
322
+ TX_OUTPUT_PUBKEYHASH +
323
+ TX_OUTPUT_BASE +
324
+ TX_OUTPUT_PUBKEYHASH;
325
+ if (data) {
326
+ sum += TX_OUTPUT_BASE + data.length;
327
+ }
328
+ const fee = sum * feeRate;
329
+ return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
366
330
  }
367
331
  /**
368
332
  * Transfer BTC.
@@ -378,12 +342,7 @@ class Client extends xchainClient.UTXOClient {
378
342
  // set the default fee rate to `fast`
379
343
  const feeRate = params.feeRate || (yield this.getFeeRates())[xchainClient.FeeOption.Fast];
380
344
  xchainClient.checkFeeBounds(this.feeBounds, feeRate);
381
- /**
382
- * do not spend pending UTXOs when adding a memo
383
- * https://github.com/xchainjs/xchainjs-lib/issues/330
384
- */
385
- const spendPendingUTXO = !params.memo;
386
- const { psbt } = yield this.buildTx(Object.assign(Object.assign({}, params), { feeRate, sender: this.getAddress(fromAddressIndex), spendPendingUTXO }));
345
+ const { psbt } = yield this.buildTx(Object.assign(Object.assign({}, params), { feeRate, sender: this.getAddress(fromAddressIndex) }));
387
346
  const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
388
347
  psbt.signAllInputs(btcKeys); // Sign all inputs
389
348
  psbt.finalizeAllInputs(); // Finalise inputs
@@ -399,7 +358,7 @@ class Client extends xchainClient.UTXOClient {
399
358
  }
400
359
  });
401
360
  }
402
- buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = false, // default: prevent spending uncomfirmed UTXOs
361
+ buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = true, // default: prevent spending uncomfirmed UTXOs
403
362
  }) {
404
363
  return __awaiter(this, void 0, void 0, function* () {
405
364
  if (memo && memo.length > 80) {
@@ -413,7 +372,7 @@ class Client extends xchainClient.UTXOClient {
413
372
  if (utxos.length === 0)
414
373
  throw new Error('Insufficient Balance for transaction');
415
374
  const feeRateWhole = Math.ceil(feeRate);
416
- const compiledMemo = memo ? compileMemo(memo) : null;
375
+ const compiledMemo = memo ? this.compileMemo(memo) : null;
417
376
  const targetOutputs = [];
418
377
  //1. add output amount and recipient to targets
419
378
  targetOutputs.push({
@@ -470,10 +429,7 @@ exports.MIN_TX_FEE = MIN_TX_FEE;
470
429
  exports.SochainDataProviders = SochainDataProviders;
471
430
  exports.UPPER_FEE_BOUND = UPPER_FEE_BOUND;
472
431
  exports.blockstreamExplorerProviders = blockstreamExplorerProviders;
473
- exports.calcFee = calcFee;
474
432
  exports.defaultBTCParams = defaultBTCParams;
475
- exports.getDefaultFees = getDefaultFees;
476
- exports.getDefaultFeesWithRates = getDefaultFeesWithRates;
477
433
  exports.getPrefix = getPrefix;
478
434
  exports.validateAddress = validateAddress;
479
435
  //# sourceMappingURL=index.js.map
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 {\n FeeOption,\n FeeRate,\n Fees,\n FeesWithRates,\n Network,\n UTXO,\n calcFees,\n standardFeeRates,\n} from '@xchainjs/xchain-client'\nimport { Address, BaseAmount, baseAmount } from '@xchainjs/xchain-util'\nimport * as Bitcoin from 'bitcoinjs-lib'\n\nimport { MIN_TX_FEE } from './const'\n\nconst TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nconst TX_INPUT_PUBKEYHASH = 107\nconst TX_OUTPUT_BASE = 8 + 1 //9\nconst TX_OUTPUT_PUBKEYHASH = 25\n\nconst inputBytes = (input: UTXO): number => {\n return TX_INPUT_BASE + (input.witnessUtxo.script ? input.witnessUtxo.script.length : TX_INPUT_PUBKEYHASH)\n}\n\n/**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\nexport const 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 */\nexport const getFee = (inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number => {\n let sum =\n TX_EMPTY_SIZE +\n inputs.reduce((a, x) => a + inputBytes(x), 0) +\n inputs.length + // +1 byte for each input signature\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH +\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += 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 * 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 * Calculate fees based on fee rate and memo.\n *\n * @param {FeeRate} feeRate\n * @param {string} memo\n * @returns {BaseAmount} The calculated fees based on fee rate and the memo.\n */\nexport const calcFee = (feeRate: FeeRate, memo?: string): BaseAmount => {\n const compiledMemo = memo ? compileMemo(memo) : null\n const fee = getFee([], feeRate, compiledMemo)\n return baseAmount(fee)\n}\n\n/**\n * Get the default fees with rates.\n *\n * @returns {FeesWithRates} The default fees and rates.\n */\nexport const getDefaultFeesWithRates = (): FeesWithRates => {\n const rates = {\n ...standardFeeRates(20),\n [FeeOption.Fastest]: 50,\n }\n\n return {\n fees: calcFees(rates, calcFee),\n rates,\n }\n}\n\n/**\n * Get the default fees.\n *\n * @returns {Fees} The default fees.\n */\nexport const getDefaultFees = (): Fees => {\n const { fees } = getDefaultFeesWithRates()\n return fees\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 Fee,\n FeeOption,\n FeeRate,\n Network,\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 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 protected async calcFee(feeRate: FeeRate, memo?: string): Promise<Fee> {\n return Utils.calcFee(feeRate, memo)\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 const fromAddressIndex = params?.walletIndex || 0\n\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 /**\n * do not spend pending UTXOs when adding a memo\n * https://github.com/xchainjs/xchainjs-lib/issues/330\n */\n const spendPendingUTXO = !params.memo\n\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n spendPendingUTXO,\n })\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\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 async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = false, // default: prevent spending uncomfirmed UTXOs\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 ? Utils.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\nexport { Client }\n"],"names":["ExplorerProvider","Network","SochainProvider","SochainNetwork","HaskoinProvider","HaskoinNetwork","BlockcypherProvider","BlockcypherNetwork","Bitcoin","baseAmount","standardFeeRates","FeeOption","calcFees","UTXOClient","btcNetwork","Utils.btcNetwork","getSeed","Utils.validateAddress","axios","Utils.calcFee","checkFeeBounds","Utils.compileMemo","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 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 const fromAddressIndex = params?.walletIndex || 0\n\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 { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex)\n psbt.signAllInputs(btcKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\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 async buildTx({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n spendPendingUTXO = true, // default: prevent spending uncomfirmed UTXOs\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\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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"}
package/lib/utils.d.ts CHANGED
@@ -1,23 +1,12 @@
1
- /// <reference types="node" />
2
- import { FeeRate, Fees, FeesWithRates, Network, UTXO } from '@xchainjs/xchain-client';
3
- import { Address, BaseAmount } from '@xchainjs/xchain-util';
1
+ import { Network, UTXO } from '@xchainjs/xchain-client';
2
+ import { Address } from '@xchainjs/xchain-util';
4
3
  import * as Bitcoin from 'bitcoinjs-lib';
5
- /**
6
- * Compile memo.
7
- *
8
- * @param {string} memo The memo to be compiled.
9
- * @returns {Buffer} The compiled memo.
10
- */
11
- export declare const compileMemo: (memo: string) => Buffer;
12
- /**
13
- * Get the transaction fee.
14
- *
15
- * @param {UTXO[]} inputs The UTXOs.
16
- * @param {FeeRate} feeRate The fee rate.
17
- * @param {Buffer} data The compiled memo (Optional).
18
- * @returns {number} The fee amount.
19
- */
20
- export declare const getFee: (inputs: UTXO[], feeRate: FeeRate, data?: Buffer | null) => number;
4
+ export declare const TX_EMPTY_SIZE: number;
5
+ export declare const TX_INPUT_BASE: number;
6
+ export declare const TX_INPUT_PUBKEYHASH = 107;
7
+ export declare const TX_OUTPUT_BASE: number;
8
+ export declare const TX_OUTPUT_PUBKEYHASH = 25;
9
+ export declare const inputBytes: (input: UTXO) => number;
21
10
  /**
22
11
  * Get the average value of an array.
23
12
  *
@@ -40,26 +29,6 @@ export declare const btcNetwork: (network: Network) => Bitcoin.Network;
40
29
  * @returns {boolean} `true` or `false`.
41
30
  */
42
31
  export declare const validateAddress: (address: Address, network: Network) => boolean;
43
- /**
44
- * Calculate fees based on fee rate and memo.
45
- *
46
- * @param {FeeRate} feeRate
47
- * @param {string} memo
48
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
49
- */
50
- export declare const calcFee: (feeRate: FeeRate, memo?: string) => BaseAmount;
51
- /**
52
- * Get the default fees with rates.
53
- *
54
- * @returns {FeesWithRates} The default fees and rates.
55
- */
56
- export declare const getDefaultFeesWithRates: () => FeesWithRates;
57
- /**
58
- * Get the default fees.
59
- *
60
- * @returns {Fees} The default fees.
61
- */
62
- export declare const getDefaultFees: () => Fees;
63
32
  /**
64
33
  * Get address prefix based on the network.
65
34
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xchainjs/xchain-bitcoin",
3
- "version": "0.22.3",
3
+ "version": "0.23.0",
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.14.2",
37
+ "@xchainjs/xchain-client": "^0.15.0",
38
38
  "@xchainjs/xchain-crypto": "^0.3.0",
39
39
  "@xchainjs/xchain-util": "^0.13.1",
40
- "@xchainjs/xchain-utxo-providers": "^0.2.2",
40
+ "@xchainjs/xchain-utxo-providers": "^0.2.5",
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.14.2",
48
+ "@xchainjs/xchain-client": "^0.15.0",
49
49
  "@xchainjs/xchain-crypto": "^0.3.0",
50
50
  "@xchainjs/xchain-util": "^0.13.1",
51
- "@xchainjs/xchain-utxo-providers": "^0.2.2",
51
+ "@xchainjs/xchain-utxo-providers": "^0.2.5",
52
52
  "axios": "^1.3.6",
53
53
  "bitcoinjs-lib": "5.2.0",
54
54
  "coinselect": "^3.1.12",