@xchainjs/xchain-bitcoin 0.22.4 → 0.23.2
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 +34 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.esm.js +66 -80
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +64 -81
- package/lib/index.js.map +1 -1
- package/lib/utils.d.ts +8 -39
- package/package.json +5 -5
package/lib/client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AssetInfo, FeeRate, PreparedTx, 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
|
-
|
|
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
|
*
|
|
@@ -62,6 +78,11 @@ declare class Client extends UTXOClient {
|
|
|
62
78
|
transfer(params: TxParams & {
|
|
63
79
|
feeRate?: FeeRate;
|
|
64
80
|
}): Promise<TxHash>;
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param param0
|
|
84
|
+
* @deprecated
|
|
85
|
+
*/
|
|
65
86
|
buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO, }: TxParams & {
|
|
66
87
|
feeRate: FeeRate;
|
|
67
88
|
sender: Address;
|
|
@@ -72,5 +93,16 @@ declare class Client extends UTXOClient {
|
|
|
72
93
|
utxos: UTXO[];
|
|
73
94
|
inputs: UTXO[];
|
|
74
95
|
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Prepare transfer.
|
|
98
|
+
*
|
|
99
|
+
* @param {TxParams&Address&FeeRate&boolean} params The transfer options.
|
|
100
|
+
* @returns {PreparedTx} The raw unsigned transaction.
|
|
101
|
+
*/
|
|
102
|
+
prepareTx({ sender, memo, amount, recipient, spendPendingUTXO, feeRate, }: TxParams & {
|
|
103
|
+
sender: Address;
|
|
104
|
+
feeRate: FeeRate;
|
|
105
|
+
spendPendingUTXO?: boolean;
|
|
106
|
+
}): Promise<PreparedTx>;
|
|
75
107
|
}
|
|
76
108
|
export { Client };
|
package/lib/index.d.ts
CHANGED
package/lib/index.esm.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { ExplorerProvider, Network,
|
|
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,41 +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
|
-
|
|
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
|
-
const inputSizeBasedOnInputs = inputs.length > 0
|
|
123
|
-
? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature
|
|
124
|
-
: (TX_INPUT_BASE + TX_INPUT_PUBKEYHASH) * 2 + 2; // By default 2 UTXOs // Temporal solution until issue addressed https://github.com/xchainjs/xchainjs-lib/issues/850
|
|
125
|
-
let sum = TX_EMPTY_SIZE +
|
|
126
|
-
inputSizeBasedOnInputs +
|
|
127
|
-
TX_OUTPUT_BASE +
|
|
128
|
-
TX_OUTPUT_PUBKEYHASH +
|
|
129
|
-
TX_OUTPUT_BASE +
|
|
130
|
-
TX_OUTPUT_PUBKEYHASH;
|
|
131
|
-
if (data) {
|
|
132
|
-
sum += TX_OUTPUT_BASE + data.length;
|
|
133
|
-
}
|
|
134
|
-
const fee = sum * feeRate;
|
|
135
|
-
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);
|
|
136
102
|
};
|
|
137
103
|
/**
|
|
138
104
|
* Get Bitcoin network to be used with bitcoinjs.
|
|
@@ -165,39 +131,6 @@ const validateAddress = (address, network) => {
|
|
|
165
131
|
return false;
|
|
166
132
|
}
|
|
167
133
|
};
|
|
168
|
-
/**
|
|
169
|
-
* Calculate fees based on fee rate and memo.
|
|
170
|
-
*
|
|
171
|
-
* @param {FeeRate} feeRate
|
|
172
|
-
* @param {string} memo
|
|
173
|
-
* @returns {BaseAmount} The calculated fees based on fee rate and the memo.
|
|
174
|
-
*/
|
|
175
|
-
const calcFee = (feeRate, memo) => {
|
|
176
|
-
const compiledMemo = memo ? compileMemo(memo) : null;
|
|
177
|
-
const fee = getFee([], feeRate, compiledMemo);
|
|
178
|
-
return baseAmount(fee);
|
|
179
|
-
};
|
|
180
|
-
/**
|
|
181
|
-
* Get the default fees with rates.
|
|
182
|
-
*
|
|
183
|
-
* @returns {FeesWithRates} The default fees and rates.
|
|
184
|
-
*/
|
|
185
|
-
const getDefaultFeesWithRates = () => {
|
|
186
|
-
const rates = Object.assign(Object.assign({}, standardFeeRates(20)), { [FeeOption.Fastest]: 50 });
|
|
187
|
-
return {
|
|
188
|
-
fees: calcFees(rates, calcFee),
|
|
189
|
-
rates,
|
|
190
|
-
};
|
|
191
|
-
};
|
|
192
|
-
/**
|
|
193
|
-
* Get the default fees.
|
|
194
|
-
*
|
|
195
|
-
* @returns {Fees} The default fees.
|
|
196
|
-
*/
|
|
197
|
-
const getDefaultFees = () => {
|
|
198
|
-
const { fees } = getDefaultFeesWithRates();
|
|
199
|
-
return fees;
|
|
200
|
-
};
|
|
201
134
|
/**
|
|
202
135
|
* Get address prefix based on the network.
|
|
203
136
|
*
|
|
@@ -333,10 +266,39 @@ class Client extends UTXOClient {
|
|
|
333
266
|
}
|
|
334
267
|
});
|
|
335
268
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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;
|
|
340
302
|
}
|
|
341
303
|
/**
|
|
342
304
|
* Transfer BTC.
|
|
@@ -348,12 +310,13 @@ class Client extends UTXOClient {
|
|
|
348
310
|
*/
|
|
349
311
|
transfer(params) {
|
|
350
312
|
return __awaiter(this, void 0, void 0, function* () {
|
|
351
|
-
const fromAddressIndex = (params === null || params === void 0 ? void 0 : params.walletIndex) || 0;
|
|
352
313
|
// set the default fee rate to `fast`
|
|
353
314
|
const feeRate = params.feeRate || (yield this.getFeeRates())[FeeOption.Fast];
|
|
354
315
|
checkFeeBounds(this.feeBounds, feeRate);
|
|
355
|
-
const
|
|
316
|
+
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 }));
|
|
356
318
|
const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
|
|
319
|
+
const psbt = Bitcoin.Psbt.fromBase64(rawUnsignedTx);
|
|
357
320
|
psbt.signAllInputs(btcKeys); // Sign all inputs
|
|
358
321
|
psbt.finalizeAllInputs(); // Finalise inputs
|
|
359
322
|
const txHex = psbt.extractTransaction().toHex(); // TX extracted and formatted to hex
|
|
@@ -368,8 +331,12 @@ class Client extends UTXOClient {
|
|
|
368
331
|
}
|
|
369
332
|
});
|
|
370
333
|
}
|
|
371
|
-
|
|
372
|
-
|
|
334
|
+
/**
|
|
335
|
+
*
|
|
336
|
+
* @param param0
|
|
337
|
+
* @deprecated
|
|
338
|
+
*/
|
|
339
|
+
buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = true, }) {
|
|
373
340
|
return __awaiter(this, void 0, void 0, function* () {
|
|
374
341
|
if (memo && memo.length > 80) {
|
|
375
342
|
throw new Error('memo too long, must not be longer than 80 chars.');
|
|
@@ -382,7 +349,7 @@ class Client extends UTXOClient {
|
|
|
382
349
|
if (utxos.length === 0)
|
|
383
350
|
throw new Error('Insufficient Balance for transaction');
|
|
384
351
|
const feeRateWhole = Math.ceil(feeRate);
|
|
385
|
-
const compiledMemo = memo ? compileMemo(memo) : null;
|
|
352
|
+
const compiledMemo = memo ? this.compileMemo(memo) : null;
|
|
386
353
|
const targetOutputs = [];
|
|
387
354
|
//1. add output amount and recipient to targets
|
|
388
355
|
targetOutputs.push({
|
|
@@ -424,7 +391,26 @@ class Client extends UTXOClient {
|
|
|
424
391
|
return { psbt, utxos, inputs };
|
|
425
392
|
});
|
|
426
393
|
}
|
|
394
|
+
/**
|
|
395
|
+
* Prepare transfer.
|
|
396
|
+
*
|
|
397
|
+
* @param {TxParams&Address&FeeRate&boolean} params The transfer options.
|
|
398
|
+
* @returns {PreparedTx} The raw unsigned transaction.
|
|
399
|
+
*/
|
|
400
|
+
prepareTx({ sender, memo, amount, recipient, spendPendingUTXO = true, feeRate, }) {
|
|
401
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
402
|
+
const { psbt } = yield this.buildTx({
|
|
403
|
+
sender,
|
|
404
|
+
recipient,
|
|
405
|
+
amount,
|
|
406
|
+
feeRate,
|
|
407
|
+
memo,
|
|
408
|
+
spendPendingUTXO,
|
|
409
|
+
});
|
|
410
|
+
return { rawUnsignedTx: psbt.toBase64() };
|
|
411
|
+
});
|
|
412
|
+
}
|
|
427
413
|
}
|
|
428
414
|
|
|
429
|
-
export { AssetBTC, BTCChain, BTC_DECIMAL, BTC_SATOSHI_SYMBOL, BTC_SYMBOL, BlockcypherDataProviders, Client, HaskoinDataProviders, LOWER_FEE_BOUND, MIN_TX_FEE, SochainDataProviders, UPPER_FEE_BOUND, blockstreamExplorerProviders,
|
|
415
|
+
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 };
|
|
430
416
|
//# sourceMappingURL=index.esm.js.map
|
package/lib/index.esm.js.map
CHANGED
|
@@ -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 const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : (TX_INPUT_BASE + TX_INPUT_PUBKEYHASH) * 2 + 2 // By default 2 UTXOs // Temporal solution until issue addressed https://github.com/xchainjs/xchainjs-lib/issues/850\n let sum =\n TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\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 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 ? 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 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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"}
|
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,41 +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
|
-
|
|
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
|
-
const inputSizeBasedOnInputs = inputs.length > 0
|
|
151
|
-
? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature
|
|
152
|
-
: (TX_INPUT_BASE + TX_INPUT_PUBKEYHASH) * 2 + 2; // By default 2 UTXOs // Temporal solution until issue addressed https://github.com/xchainjs/xchainjs-lib/issues/850
|
|
153
|
-
let sum = TX_EMPTY_SIZE +
|
|
154
|
-
inputSizeBasedOnInputs +
|
|
155
|
-
TX_OUTPUT_BASE +
|
|
156
|
-
TX_OUTPUT_PUBKEYHASH +
|
|
157
|
-
TX_OUTPUT_BASE +
|
|
158
|
-
TX_OUTPUT_PUBKEYHASH;
|
|
159
|
-
if (data) {
|
|
160
|
-
sum += TX_OUTPUT_BASE + data.length;
|
|
161
|
-
}
|
|
162
|
-
const fee = sum * feeRate;
|
|
163
|
-
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);
|
|
164
130
|
};
|
|
165
131
|
/**
|
|
166
132
|
* Get Bitcoin network to be used with bitcoinjs.
|
|
@@ -193,39 +159,6 @@ const validateAddress = (address, network) => {
|
|
|
193
159
|
return false;
|
|
194
160
|
}
|
|
195
161
|
};
|
|
196
|
-
/**
|
|
197
|
-
* Calculate fees based on fee rate and memo.
|
|
198
|
-
*
|
|
199
|
-
* @param {FeeRate} feeRate
|
|
200
|
-
* @param {string} memo
|
|
201
|
-
* @returns {BaseAmount} The calculated fees based on fee rate and the memo.
|
|
202
|
-
*/
|
|
203
|
-
const calcFee = (feeRate, memo) => {
|
|
204
|
-
const compiledMemo = memo ? compileMemo(memo) : null;
|
|
205
|
-
const fee = getFee([], feeRate, compiledMemo);
|
|
206
|
-
return xchainUtil.baseAmount(fee);
|
|
207
|
-
};
|
|
208
|
-
/**
|
|
209
|
-
* Get the default fees with rates.
|
|
210
|
-
*
|
|
211
|
-
* @returns {FeesWithRates} The default fees and rates.
|
|
212
|
-
*/
|
|
213
|
-
const getDefaultFeesWithRates = () => {
|
|
214
|
-
const rates = Object.assign(Object.assign({}, xchainClient.standardFeeRates(20)), { [xchainClient.FeeOption.Fastest]: 50 });
|
|
215
|
-
return {
|
|
216
|
-
fees: xchainClient.calcFees(rates, calcFee),
|
|
217
|
-
rates,
|
|
218
|
-
};
|
|
219
|
-
};
|
|
220
|
-
/**
|
|
221
|
-
* Get the default fees.
|
|
222
|
-
*
|
|
223
|
-
* @returns {Fees} The default fees.
|
|
224
|
-
*/
|
|
225
|
-
const getDefaultFees = () => {
|
|
226
|
-
const { fees } = getDefaultFeesWithRates();
|
|
227
|
-
return fees;
|
|
228
|
-
};
|
|
229
162
|
/**
|
|
230
163
|
* Get address prefix based on the network.
|
|
231
164
|
*
|
|
@@ -361,10 +294,39 @@ class Client extends xchainClient.UTXOClient {
|
|
|
361
294
|
}
|
|
362
295
|
});
|
|
363
296
|
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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;
|
|
368
330
|
}
|
|
369
331
|
/**
|
|
370
332
|
* Transfer BTC.
|
|
@@ -376,12 +338,13 @@ class Client extends xchainClient.UTXOClient {
|
|
|
376
338
|
*/
|
|
377
339
|
transfer(params) {
|
|
378
340
|
return __awaiter(this, void 0, void 0, function* () {
|
|
379
|
-
const fromAddressIndex = (params === null || params === void 0 ? void 0 : params.walletIndex) || 0;
|
|
380
341
|
// set the default fee rate to `fast`
|
|
381
342
|
const feeRate = params.feeRate || (yield this.getFeeRates())[xchainClient.FeeOption.Fast];
|
|
382
343
|
xchainClient.checkFeeBounds(this.feeBounds, feeRate);
|
|
383
|
-
const
|
|
344
|
+
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 }));
|
|
384
346
|
const btcKeys = this.getBtcKeys(this.phrase, fromAddressIndex);
|
|
347
|
+
const psbt = Bitcoin__namespace.Psbt.fromBase64(rawUnsignedTx);
|
|
385
348
|
psbt.signAllInputs(btcKeys); // Sign all inputs
|
|
386
349
|
psbt.finalizeAllInputs(); // Finalise inputs
|
|
387
350
|
const txHex = psbt.extractTransaction().toHex(); // TX extracted and formatted to hex
|
|
@@ -396,8 +359,12 @@ class Client extends xchainClient.UTXOClient {
|
|
|
396
359
|
}
|
|
397
360
|
});
|
|
398
361
|
}
|
|
399
|
-
|
|
400
|
-
|
|
362
|
+
/**
|
|
363
|
+
*
|
|
364
|
+
* @param param0
|
|
365
|
+
* @deprecated
|
|
366
|
+
*/
|
|
367
|
+
buildTx({ amount, recipient, memo, feeRate, sender, spendPendingUTXO = true, }) {
|
|
401
368
|
return __awaiter(this, void 0, void 0, function* () {
|
|
402
369
|
if (memo && memo.length > 80) {
|
|
403
370
|
throw new Error('memo too long, must not be longer than 80 chars.');
|
|
@@ -410,7 +377,7 @@ class Client extends xchainClient.UTXOClient {
|
|
|
410
377
|
if (utxos.length === 0)
|
|
411
378
|
throw new Error('Insufficient Balance for transaction');
|
|
412
379
|
const feeRateWhole = Math.ceil(feeRate);
|
|
413
|
-
const compiledMemo = memo ? compileMemo(memo) : null;
|
|
380
|
+
const compiledMemo = memo ? this.compileMemo(memo) : null;
|
|
414
381
|
const targetOutputs = [];
|
|
415
382
|
//1. add output amount and recipient to targets
|
|
416
383
|
targetOutputs.push({
|
|
@@ -452,6 +419,25 @@ class Client extends xchainClient.UTXOClient {
|
|
|
452
419
|
return { psbt, utxos, inputs };
|
|
453
420
|
});
|
|
454
421
|
}
|
|
422
|
+
/**
|
|
423
|
+
* Prepare transfer.
|
|
424
|
+
*
|
|
425
|
+
* @param {TxParams&Address&FeeRate&boolean} params The transfer options.
|
|
426
|
+
* @returns {PreparedTx} The raw unsigned transaction.
|
|
427
|
+
*/
|
|
428
|
+
prepareTx({ sender, memo, amount, recipient, spendPendingUTXO = true, feeRate, }) {
|
|
429
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
430
|
+
const { psbt } = yield this.buildTx({
|
|
431
|
+
sender,
|
|
432
|
+
recipient,
|
|
433
|
+
amount,
|
|
434
|
+
feeRate,
|
|
435
|
+
memo,
|
|
436
|
+
spendPendingUTXO,
|
|
437
|
+
});
|
|
438
|
+
return { rawUnsignedTx: psbt.toBase64() };
|
|
439
|
+
});
|
|
440
|
+
}
|
|
455
441
|
}
|
|
456
442
|
|
|
457
443
|
exports.AssetBTC = AssetBTC;
|
|
@@ -467,10 +453,7 @@ exports.MIN_TX_FEE = MIN_TX_FEE;
|
|
|
467
453
|
exports.SochainDataProviders = SochainDataProviders;
|
|
468
454
|
exports.UPPER_FEE_BOUND = UPPER_FEE_BOUND;
|
|
469
455
|
exports.blockstreamExplorerProviders = blockstreamExplorerProviders;
|
|
470
|
-
exports.calcFee = calcFee;
|
|
471
456
|
exports.defaultBTCParams = defaultBTCParams;
|
|
472
|
-
exports.getDefaultFees = getDefaultFees;
|
|
473
|
-
exports.getDefaultFeesWithRates = getDefaultFeesWithRates;
|
|
474
457
|
exports.getPrefix = getPrefix;
|
|
475
458
|
exports.validateAddress = validateAddress;
|
|
476
459
|
//# 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 const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a, x) => a + inputBytes(x), 0) + inputs.length // +1 byte for each input signature\n : (TX_INPUT_BASE + TX_INPUT_PUBKEYHASH) * 2 + 2 // By default 2 UTXOs // Temporal solution until issue addressed https://github.com/xchainjs/xchainjs-lib/issues/850\n let sum =\n TX_EMPTY_SIZE +\n inputSizeBasedOnInputs +\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 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 ? 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;ACxG/C,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;IACzC,OAAO,aAAa,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAA;AAC3G,CAAC,CAAA;AAED;;;;;AAKG;AACI,MAAM,WAAW,GAAG,CAAC,IAAY,KAAY;AAClD,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACtC,IAAA,OAAOO,kBAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAACA,kBAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;AAClE,CAAC,CAAA;AAED;;;;;;;AAOG;AACI,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,OAAgB,EAAE,IAAA,GAAsB,IAAI,KAAY;AAC7F,IAAA,MAAM,sBAAsB,GAC1B,MAAM,CAAC,MAAM,GAAG,CAAC;UACb,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM;AAC/D,UAAE,CAAC,aAAa,GAAG,mBAAmB,IAAI,CAAC,GAAG,CAAC,CAAA;IACnD,IAAI,GAAG,GACL,aAAa;QACb,sBAAsB;QACtB,cAAc;QACd,oBAAoB;QACpB,cAAc;AACd,QAAA,oBAAoB,CAAA;AAEtB,IAAA,IAAI,IAAI,EAAE;AACR,QAAA,GAAG,IAAI,cAAc,GAAG,IAAI,CAAC,MAAM,CAAA;AACpC,KAAA;AACD,IAAA,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,CAAA;IACzB,OAAO,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,UAAU,CAAA;AAC5C,CAAC,CAAA;AAcD;;;;;AAKG;AACI,MAAM,UAAU,GAAG,CAAC,OAAgB,KAAqB;AAC9D,IAAA,QAAQ,OAAO;QACb,KAAKP,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;;;;;;AAMG;MACU,OAAO,GAAG,CAAC,OAAgB,EAAE,IAAa,KAAgB;AACrE,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;AAC7C,IAAA,OAAOC,qBAAU,CAAC,GAAG,CAAC,CAAA;AACxB,EAAC;AAED;;;;AAIG;AACI,MAAM,uBAAuB,GAAG,MAAoB;AACzD,IAAA,MAAM,KAAK,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACNC,6BAAgB,CAAC,EAAE,CAAC,CAAA,EAAA,EACvB,CAACC,sBAAS,CAAC,OAAO,GAAG,EAAE,GACxB,CAAA;IAED,OAAO;AACL,QAAA,IAAI,EAAEC,qBAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAC9B,KAAK;KACN,CAAA;AACH,EAAC;AAED;;;;AAIG;AACI,MAAM,cAAc,GAAG,MAAW;AACvC,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,uBAAuB,EAAE,CAAA;AAC1C,IAAA,OAAO,IAAI,CAAA;AACb,EAAC;AAED;;;;;;AAMI;AACS,MAAA,SAAS,GAAG,CAAC,OAAgB,KAAI;AAC5C,IAAA,QAAQ,OAAO;QACb,KAAKX,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;;ACrIA,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,SAAQY,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;;;;;;;;;;AAUG;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,GAAGP,kBAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC1C,MAAM,EAAE,OAAO,CAAC,SAAS;AACzB,gBAAA,OAAO,EAAEM,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;;;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,GAAGR,kBAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAEM,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,OAAON,kBAAO,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,EAAEM,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;IAEe,OAAO,CAAC,OAAgB,EAAE,IAAa,EAAA;;YACrD,OAAOC,OAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;SACpC,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;;AAOG;AACG,IAAA,QAAQ,CAAC,MAAwC,EAAA;;AACrD,YAAA,MAAM,gBAAgB,GAAG,CAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,WAAW,KAAI,CAAC,CAAA;;AAGjD,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAER,sBAAS,CAAC,IAAI,CAAC,CAAA;AAC5E,YAAAS,2BAAc,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAEvC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC9B,MAAM,CAAA,EAAA,EACT,OAAO,EACP,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAA,CAAA,CACzC,CAAA;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AAC3B,YAAA,IAAI,CAAC,iBAAiB,EAAE,CAAA;YACxB,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;AAEK,IAAA,OAAO,CAAC,EACZ,MAAM,EACN,SAAS,EACT,IAAI,EACJ,OAAO,EACP,MAAM,EACN,gBAAgB,GAAG,IAAI;AAMxB,MAAA,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,GAAGC,WAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAE1D,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,GAAGC,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,IAAId,kBAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAEO,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;AACF;;;;;;;;;;;;;;;;;;;;;;"}
|
|
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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"}
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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.
|
|
3
|
+
"version": "0.23.2",
|
|
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.
|
|
37
|
+
"@xchainjs/xchain-client": "^0.15.1",
|
|
38
38
|
"@xchainjs/xchain-crypto": "^0.3.0",
|
|
39
39
|
"@xchainjs/xchain-util": "^0.13.1",
|
|
40
|
-
"@xchainjs/xchain-utxo-providers": "^0.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.
|
|
48
|
+
"@xchainjs/xchain-client": "^0.15.1",
|
|
49
49
|
"@xchainjs/xchain-crypto": "^0.3.0",
|
|
50
50
|
"@xchainjs/xchain-util": "^0.13.1",
|
|
51
|
-
"@xchainjs/xchain-utxo-providers": "^0.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",
|