@atomicfinance/utils 3.5.3 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bitcoin.js +78 -6
- package/dist/bitcoin.js.map +1 -1
- package/lib/bitcoin.ts +100 -6
- package/package.json +5 -5
- package/lib/bitcoin.js +0 -243
- package/lib/index.js +0 -84
package/dist/bitcoin.js
CHANGED
|
@@ -34,11 +34,83 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
|
34
34
|
const varuint = __importStar(require("bip174/src/lib/converter/varint"));
|
|
35
35
|
const bitcoin_networks_1 = require("bitcoin-networks");
|
|
36
36
|
const bitcoin = __importStar(require("bitcoinjs-lib"));
|
|
37
|
-
const classify = __importStar(require("bitcoinjs-lib/src/classify"));
|
|
38
37
|
const coinselect_1 = __importDefault(require("coinselect"));
|
|
39
38
|
const accumulative_1 = __importDefault(require("coinselect/accumulative"));
|
|
40
39
|
const lodash_1 = require("lodash");
|
|
41
40
|
const _1 = require("./");
|
|
41
|
+
// Script type constants (replacing the classify module)
|
|
42
|
+
const SCRIPT_TYPES = {
|
|
43
|
+
P2PKH: 'pubkeyhash',
|
|
44
|
+
P2SH: 'scripthash',
|
|
45
|
+
P2WPKH: 'witness_v0_keyhash',
|
|
46
|
+
P2WSH: 'witness_v0_scripthash',
|
|
47
|
+
P2TR: 'witness_v1_taproot',
|
|
48
|
+
NULLDATA: 'nulldata',
|
|
49
|
+
NONSTANDARD: 'nonstandard',
|
|
50
|
+
MULTISIG: 'multisig',
|
|
51
|
+
P2PK: 'pubkey',
|
|
52
|
+
};
|
|
53
|
+
// Custom script classification function
|
|
54
|
+
function classifyScript(script) {
|
|
55
|
+
if (script.length === 0)
|
|
56
|
+
return SCRIPT_TYPES.NONSTANDARD;
|
|
57
|
+
// P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
|
|
58
|
+
if (script.length === 25 &&
|
|
59
|
+
script[0] === 0x76 && // OP_DUP
|
|
60
|
+
script[1] === 0xa9 && // OP_HASH160
|
|
61
|
+
script[2] === 0x14 && // 20 bytes
|
|
62
|
+
script[23] === 0x88 && // OP_EQUALVERIFY
|
|
63
|
+
script[24] === 0xac) {
|
|
64
|
+
// OP_CHECKSIG
|
|
65
|
+
return SCRIPT_TYPES.P2PKH;
|
|
66
|
+
}
|
|
67
|
+
// P2SH: OP_HASH160 <20 bytes> OP_EQUAL
|
|
68
|
+
if (script.length === 23 &&
|
|
69
|
+
script[0] === 0xa9 && // OP_HASH160
|
|
70
|
+
script[1] === 0x14 && // 20 bytes
|
|
71
|
+
script[22] === 0x87) {
|
|
72
|
+
// OP_EQUAL
|
|
73
|
+
return SCRIPT_TYPES.P2SH;
|
|
74
|
+
}
|
|
75
|
+
// P2WPKH: OP_0 <20 bytes>
|
|
76
|
+
if (script.length === 22 &&
|
|
77
|
+
script[0] === 0x00 && // OP_0
|
|
78
|
+
script[1] === 0x14) {
|
|
79
|
+
// 20 bytes
|
|
80
|
+
return SCRIPT_TYPES.P2WPKH;
|
|
81
|
+
}
|
|
82
|
+
// P2WSH: OP_0 <32 bytes>
|
|
83
|
+
if (script.length === 34 &&
|
|
84
|
+
script[0] === 0x00 && // OP_0
|
|
85
|
+
script[1] === 0x20) {
|
|
86
|
+
// 32 bytes
|
|
87
|
+
return SCRIPT_TYPES.P2WSH;
|
|
88
|
+
}
|
|
89
|
+
// P2TR: OP_1 <32 bytes>
|
|
90
|
+
if (script.length === 34 &&
|
|
91
|
+
script[0] === 0x51 && // OP_1
|
|
92
|
+
script[1] === 0x20) {
|
|
93
|
+
// 32 bytes
|
|
94
|
+
return SCRIPT_TYPES.P2TR;
|
|
95
|
+
}
|
|
96
|
+
// OP_RETURN (nulldata)
|
|
97
|
+
if (script.length >= 1 && script[0] === 0x6a) {
|
|
98
|
+
// OP_RETURN
|
|
99
|
+
return SCRIPT_TYPES.NULLDATA;
|
|
100
|
+
}
|
|
101
|
+
// P2PK: <33 or 65 bytes pubkey> OP_CHECKSIG
|
|
102
|
+
if ((script.length === 35 || script.length === 67) &&
|
|
103
|
+
script[script.length - 1] === 0xac) {
|
|
104
|
+
// OP_CHECKSIG
|
|
105
|
+
return SCRIPT_TYPES.P2PK;
|
|
106
|
+
}
|
|
107
|
+
// Basic multisig detection: OP_M <pubkeys> OP_N OP_CHECKMULTISIG
|
|
108
|
+
if (script.length >= 4 && script[script.length - 1] === 0xae) {
|
|
109
|
+
// OP_CHECKMULTISIG
|
|
110
|
+
return SCRIPT_TYPES.MULTISIG;
|
|
111
|
+
}
|
|
112
|
+
return SCRIPT_TYPES.NONSTANDARD;
|
|
113
|
+
}
|
|
42
114
|
const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
|
|
43
115
|
exports.AddressTypes = AddressTypes;
|
|
44
116
|
function calculateFee(numInputs, numOutputs, feePerByte) {
|
|
@@ -103,8 +175,8 @@ function selectCoins(utxos, targets, feePerByte, fixedInputs = []) {
|
|
|
103
175
|
}
|
|
104
176
|
exports.selectCoins = selectCoins;
|
|
105
177
|
const OUTPUT_TYPES_MAP = {
|
|
106
|
-
[
|
|
107
|
-
[
|
|
178
|
+
[SCRIPT_TYPES.P2WPKH]: 'witness_v0_keyhash',
|
|
179
|
+
[SCRIPT_TYPES.P2WSH]: 'witness_v0_scripthash',
|
|
108
180
|
};
|
|
109
181
|
function decodeRawTransaction(hex, network) {
|
|
110
182
|
const bjsTx = bitcoin.Transaction.fromHex(hex);
|
|
@@ -121,7 +193,7 @@ function decodeRawTransaction(hex, network) {
|
|
|
121
193
|
};
|
|
122
194
|
});
|
|
123
195
|
const vout = bjsTx.outs.map((output, n) => {
|
|
124
|
-
const type =
|
|
196
|
+
const type = classifyScript(output.script);
|
|
125
197
|
const vout = {
|
|
126
198
|
value: output.value / 1e8,
|
|
127
199
|
n,
|
|
@@ -209,8 +281,8 @@ function witnessStackToScriptWitness(witness) {
|
|
|
209
281
|
exports.witnessStackToScriptWitness = witnessStackToScriptWitness;
|
|
210
282
|
function getPubKeyHash(address, network) {
|
|
211
283
|
const outputScript = bitcoin.address.toOutputScript(address, network);
|
|
212
|
-
const type =
|
|
213
|
-
if (
|
|
284
|
+
const type = classifyScript(outputScript);
|
|
285
|
+
if (type !== SCRIPT_TYPES.P2PKH && type !== SCRIPT_TYPES.P2WPKH) {
|
|
214
286
|
throw new Error(`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`);
|
|
215
287
|
}
|
|
216
288
|
try {
|
package/dist/bitcoin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../lib/bitcoin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA4D;AAC5D,kDAA4D;AAC5D,gDAK8B;AAC9B,gEAAqC;AACrC,yEAA2D;AAC3D,uDAAmE;AACnE,uDAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../lib/bitcoin.ts"],"names":[],"mappings":"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"}
|
package/lib/bitcoin.ts
CHANGED
|
@@ -10,13 +10,107 @@ import BigNumber from 'bignumber.js';
|
|
|
10
10
|
import * as varuint from 'bip174/src/lib/converter/varint';
|
|
11
11
|
import { BitcoinNetwork, BitcoinNetworks } from 'bitcoin-networks';
|
|
12
12
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
13
|
-
import * as classify from 'bitcoinjs-lib/src/classify';
|
|
14
13
|
import coinselect from 'coinselect';
|
|
15
14
|
import coinselectAccumulative from 'coinselect/accumulative';
|
|
16
15
|
import { findKey } from 'lodash';
|
|
17
16
|
|
|
18
17
|
import { addressToString } from './';
|
|
19
18
|
|
|
19
|
+
// Script type constants (replacing the classify module)
|
|
20
|
+
const SCRIPT_TYPES = {
|
|
21
|
+
P2PKH: 'pubkeyhash',
|
|
22
|
+
P2SH: 'scripthash',
|
|
23
|
+
P2WPKH: 'witness_v0_keyhash',
|
|
24
|
+
P2WSH: 'witness_v0_scripthash',
|
|
25
|
+
P2TR: 'witness_v1_taproot',
|
|
26
|
+
NULLDATA: 'nulldata',
|
|
27
|
+
NONSTANDARD: 'nonstandard',
|
|
28
|
+
MULTISIG: 'multisig',
|
|
29
|
+
P2PK: 'pubkey',
|
|
30
|
+
} as const;
|
|
31
|
+
|
|
32
|
+
// Custom script classification function
|
|
33
|
+
function classifyScript(script: Buffer): string {
|
|
34
|
+
if (script.length === 0) return SCRIPT_TYPES.NONSTANDARD;
|
|
35
|
+
|
|
36
|
+
// P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
|
|
37
|
+
if (
|
|
38
|
+
script.length === 25 &&
|
|
39
|
+
script[0] === 0x76 && // OP_DUP
|
|
40
|
+
script[1] === 0xa9 && // OP_HASH160
|
|
41
|
+
script[2] === 0x14 && // 20 bytes
|
|
42
|
+
script[23] === 0x88 && // OP_EQUALVERIFY
|
|
43
|
+
script[24] === 0xac
|
|
44
|
+
) {
|
|
45
|
+
// OP_CHECKSIG
|
|
46
|
+
return SCRIPT_TYPES.P2PKH;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// P2SH: OP_HASH160 <20 bytes> OP_EQUAL
|
|
50
|
+
if (
|
|
51
|
+
script.length === 23 &&
|
|
52
|
+
script[0] === 0xa9 && // OP_HASH160
|
|
53
|
+
script[1] === 0x14 && // 20 bytes
|
|
54
|
+
script[22] === 0x87
|
|
55
|
+
) {
|
|
56
|
+
// OP_EQUAL
|
|
57
|
+
return SCRIPT_TYPES.P2SH;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// P2WPKH: OP_0 <20 bytes>
|
|
61
|
+
if (
|
|
62
|
+
script.length === 22 &&
|
|
63
|
+
script[0] === 0x00 && // OP_0
|
|
64
|
+
script[1] === 0x14
|
|
65
|
+
) {
|
|
66
|
+
// 20 bytes
|
|
67
|
+
return SCRIPT_TYPES.P2WPKH;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// P2WSH: OP_0 <32 bytes>
|
|
71
|
+
if (
|
|
72
|
+
script.length === 34 &&
|
|
73
|
+
script[0] === 0x00 && // OP_0
|
|
74
|
+
script[1] === 0x20
|
|
75
|
+
) {
|
|
76
|
+
// 32 bytes
|
|
77
|
+
return SCRIPT_TYPES.P2WSH;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// P2TR: OP_1 <32 bytes>
|
|
81
|
+
if (
|
|
82
|
+
script.length === 34 &&
|
|
83
|
+
script[0] === 0x51 && // OP_1
|
|
84
|
+
script[1] === 0x20
|
|
85
|
+
) {
|
|
86
|
+
// 32 bytes
|
|
87
|
+
return SCRIPT_TYPES.P2TR;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// OP_RETURN (nulldata)
|
|
91
|
+
if (script.length >= 1 && script[0] === 0x6a) {
|
|
92
|
+
// OP_RETURN
|
|
93
|
+
return SCRIPT_TYPES.NULLDATA;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// P2PK: <33 or 65 bytes pubkey> OP_CHECKSIG
|
|
97
|
+
if (
|
|
98
|
+
(script.length === 35 || script.length === 67) &&
|
|
99
|
+
script[script.length - 1] === 0xac
|
|
100
|
+
) {
|
|
101
|
+
// OP_CHECKSIG
|
|
102
|
+
return SCRIPT_TYPES.P2PK;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Basic multisig detection: OP_M <pubkeys> OP_N OP_CHECKMULTISIG
|
|
106
|
+
if (script.length >= 4 && script[script.length - 1] === 0xae) {
|
|
107
|
+
// OP_CHECKMULTISIG
|
|
108
|
+
return SCRIPT_TYPES.MULTISIG;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return SCRIPT_TYPES.NONSTANDARD;
|
|
112
|
+
}
|
|
113
|
+
|
|
20
114
|
const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
|
|
21
115
|
|
|
22
116
|
function calculateFee(
|
|
@@ -125,8 +219,8 @@ function selectCoins(
|
|
|
125
219
|
}
|
|
126
220
|
|
|
127
221
|
const OUTPUT_TYPES_MAP = {
|
|
128
|
-
[
|
|
129
|
-
[
|
|
222
|
+
[SCRIPT_TYPES.P2WPKH]: 'witness_v0_keyhash',
|
|
223
|
+
[SCRIPT_TYPES.P2WSH]: 'witness_v0_scripthash',
|
|
130
224
|
};
|
|
131
225
|
|
|
132
226
|
function decodeRawTransaction(
|
|
@@ -149,7 +243,7 @@ function decodeRawTransaction(
|
|
|
149
243
|
});
|
|
150
244
|
|
|
151
245
|
const vout = bjsTx.outs.map((output, n) => {
|
|
152
|
-
const type =
|
|
246
|
+
const type = classifyScript(output.script);
|
|
153
247
|
|
|
154
248
|
const vout: bT.Output = {
|
|
155
249
|
value: output.value / 1e8,
|
|
@@ -257,8 +351,8 @@ function witnessStackToScriptWitness(witness: Buffer[]): Buffer {
|
|
|
257
351
|
|
|
258
352
|
function getPubKeyHash(address: string, network: BitcoinNetwork) {
|
|
259
353
|
const outputScript = bitcoin.address.toOutputScript(address, network);
|
|
260
|
-
const type =
|
|
261
|
-
if (
|
|
354
|
+
const type = classifyScript(outputScript);
|
|
355
|
+
if (type !== SCRIPT_TYPES.P2PKH && type !== SCRIPT_TYPES.P2WPKH) {
|
|
262
356
|
throw new Error(
|
|
263
357
|
`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`,
|
|
264
358
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomicfinance/utils",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"node": ">=14"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@atomicfinance/crypto": "^3.
|
|
27
|
-
"@atomicfinance/errors": "^3.
|
|
28
|
-
"@atomicfinance/types": "^3.
|
|
26
|
+
"@atomicfinance/crypto": "^3.6.1",
|
|
27
|
+
"@atomicfinance/errors": "^3.6.1",
|
|
28
|
+
"@atomicfinance/types": "^3.6.1",
|
|
29
29
|
"@babel/runtime": "^7.12.1",
|
|
30
30
|
"bignumber.js": "^9.0.0",
|
|
31
31
|
"bip174": "^2.0.1",
|
|
32
32
|
"bitcoin-networks": "^1.0.0",
|
|
33
|
-
"bitcoinjs-lib": "
|
|
33
|
+
"bitcoinjs-lib": "6.1.7",
|
|
34
34
|
"coinselect": "^3.1.11",
|
|
35
35
|
"lodash": "^4.17.20",
|
|
36
36
|
"setimmediate": "^1.0.5"
|
package/lib/bitcoin.js
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.validateAddress = exports.getPubKeyHash = exports.AddressTypes = exports.witnessStackToScriptWitness = exports.normalizeTransactionObject = exports.decodeRawTransaction = exports.selectCoins = exports.getAddressNetwork = exports.compressPubKey = exports.calculateFee = void 0;
|
|
30
|
-
const crypto_1 = require("@atomicfinance/crypto");
|
|
31
|
-
const errors_1 = require("@atomicfinance/errors");
|
|
32
|
-
const types_1 = require("@atomicfinance/types");
|
|
33
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
34
|
-
const varuint = __importStar(require("bip174/src/lib/converter/varint"));
|
|
35
|
-
const bitcoin_networks_1 = require("bitcoin-networks");
|
|
36
|
-
const bitcoin = __importStar(require("bitcoinjs-lib"));
|
|
37
|
-
const classify = __importStar(require("bitcoinjs-lib/src/classify"));
|
|
38
|
-
const coinselect_1 = __importDefault(require("coinselect"));
|
|
39
|
-
const accumulative_1 = __importDefault(require("coinselect/accumulative"));
|
|
40
|
-
const lodash_1 = require("lodash");
|
|
41
|
-
const _1 = require("./");
|
|
42
|
-
const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
|
|
43
|
-
exports.AddressTypes = AddressTypes;
|
|
44
|
-
function calculateFee(numInputs, numOutputs, feePerByte) {
|
|
45
|
-
return (numInputs * 148 + numOutputs * 34 + 10) * feePerByte;
|
|
46
|
-
}
|
|
47
|
-
exports.calculateFee = calculateFee;
|
|
48
|
-
/**
|
|
49
|
-
* Get compressed pubKey from pubKey.
|
|
50
|
-
* @param {!string} pubKey - 65 byte string with prefix, x, y.
|
|
51
|
-
* @return {string} Returns the compressed pubKey of uncompressed pubKey.
|
|
52
|
-
*/
|
|
53
|
-
function compressPubKey(pubKey) {
|
|
54
|
-
const x = pubKey.substring(2, 66);
|
|
55
|
-
const y = pubKey.substring(66, 130);
|
|
56
|
-
const even = parseInt(y.substring(62, 64), 16) % 2 === 0;
|
|
57
|
-
const prefix = even ? '02' : '03';
|
|
58
|
-
return prefix + x;
|
|
59
|
-
}
|
|
60
|
-
exports.compressPubKey = compressPubKey;
|
|
61
|
-
/**
|
|
62
|
-
* Get a network object from an address
|
|
63
|
-
* @param {string} address The bitcoin address
|
|
64
|
-
* @return {Network}
|
|
65
|
-
*/
|
|
66
|
-
function getAddressNetwork(address) {
|
|
67
|
-
// TODO: can this be simplified using just bitcoinjs-lib??
|
|
68
|
-
let networkKey;
|
|
69
|
-
// bech32
|
|
70
|
-
networkKey = (0, lodash_1.findKey)(bitcoin_networks_1.BitcoinNetworks, (network) => address.startsWith(network.bech32));
|
|
71
|
-
// base58
|
|
72
|
-
if (!networkKey) {
|
|
73
|
-
const prefix = crypto_1.base58.decode(address).toString('hex').substring(0, 2);
|
|
74
|
-
networkKey = (0, lodash_1.findKey)(bitcoin_networks_1.BitcoinNetworks, (network) => {
|
|
75
|
-
const pubKeyHashPrefix = (0, crypto_1.padHexStart)(network.pubKeyHash.toString(16), 1);
|
|
76
|
-
const scriptHashPrefix = (0, crypto_1.padHexStart)(network.scriptHash.toString(16), 1);
|
|
77
|
-
return [pubKeyHashPrefix, scriptHashPrefix].includes(prefix);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
return bitcoin_networks_1.BitcoinNetworks[networkKey];
|
|
81
|
-
}
|
|
82
|
-
exports.getAddressNetwork = getAddressNetwork;
|
|
83
|
-
function selectCoins(utxos, targets, feePerByte, fixedInputs = []) {
|
|
84
|
-
let selectUtxos = utxos;
|
|
85
|
-
// Default coinselect won't accumulate some inputs
|
|
86
|
-
// TODO: does coinselect need to be modified to ABSOLUTELY not skip an input?
|
|
87
|
-
const coinselectStrat = fixedInputs.length
|
|
88
|
-
? accumulative_1.default
|
|
89
|
-
: coinselect_1.default;
|
|
90
|
-
if (fixedInputs.length) {
|
|
91
|
-
selectUtxos = [
|
|
92
|
-
// Order fixed inputs to the start of the list so they are used
|
|
93
|
-
...fixedInputs,
|
|
94
|
-
...utxos.filter((utxo) => !fixedInputs.find((input) => input.vout === utxo.vout && input.txid === utxo.txid)),
|
|
95
|
-
];
|
|
96
|
-
}
|
|
97
|
-
const { inputs, outputs, fee } = coinselectStrat(selectUtxos, targets, Math.ceil(feePerByte));
|
|
98
|
-
let change;
|
|
99
|
-
if (inputs && outputs) {
|
|
100
|
-
change = outputs.find((output) => output.id !== 'main');
|
|
101
|
-
}
|
|
102
|
-
return { inputs, outputs, fee, change };
|
|
103
|
-
}
|
|
104
|
-
exports.selectCoins = selectCoins;
|
|
105
|
-
const OUTPUT_TYPES_MAP = {
|
|
106
|
-
[classify.types.P2WPKH]: 'witness_v0_keyhash',
|
|
107
|
-
[classify.types.P2WSH]: 'witness_v0_scripthash',
|
|
108
|
-
};
|
|
109
|
-
function decodeRawTransaction(hex, network) {
|
|
110
|
-
const bjsTx = bitcoin.Transaction.fromHex(hex);
|
|
111
|
-
const vin = bjsTx.ins.map((input) => {
|
|
112
|
-
return {
|
|
113
|
-
txid: Buffer.from(input.hash).reverse().toString('hex'),
|
|
114
|
-
vout: input.index,
|
|
115
|
-
scriptSig: {
|
|
116
|
-
asm: bitcoin.script.toASM(input.script),
|
|
117
|
-
hex: input.script.toString('hex'),
|
|
118
|
-
},
|
|
119
|
-
txinwitness: input.witness.map((w) => w.toString('hex')),
|
|
120
|
-
sequence: input.sequence,
|
|
121
|
-
};
|
|
122
|
-
});
|
|
123
|
-
const vout = bjsTx.outs.map((output, n) => {
|
|
124
|
-
const type = classify.output(output.script);
|
|
125
|
-
const vout = {
|
|
126
|
-
value: output.value / 1e8,
|
|
127
|
-
n,
|
|
128
|
-
scriptPubKey: {
|
|
129
|
-
asm: bitcoin.script.toASM(output.script),
|
|
130
|
-
hex: output.script.toString('hex'),
|
|
131
|
-
reqSigs: 1,
|
|
132
|
-
type: OUTPUT_TYPES_MAP[type] || type,
|
|
133
|
-
addresses: [],
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
try {
|
|
137
|
-
const address = bitcoin.address.fromOutputScript(output.script, network);
|
|
138
|
-
vout.scriptPubKey.addresses.push(address);
|
|
139
|
-
}
|
|
140
|
-
catch (e) {
|
|
141
|
-
/** If output script is not parasable, we just skip it */
|
|
142
|
-
}
|
|
143
|
-
return vout;
|
|
144
|
-
});
|
|
145
|
-
return {
|
|
146
|
-
txid: bjsTx.getHash(false).reverse().toString('hex'),
|
|
147
|
-
hash: bjsTx.getHash(true).reverse().toString('hex'),
|
|
148
|
-
version: bjsTx.version,
|
|
149
|
-
locktime: bjsTx.locktime,
|
|
150
|
-
size: bjsTx.byteLength(),
|
|
151
|
-
vsize: bjsTx.virtualSize(),
|
|
152
|
-
weight: bjsTx.weight(),
|
|
153
|
-
vin,
|
|
154
|
-
vout,
|
|
155
|
-
hex,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
exports.decodeRawTransaction = decodeRawTransaction;
|
|
159
|
-
function normalizeTransactionObject(tx, fee, block) {
|
|
160
|
-
const value = tx.vout.reduce((p, n) => p.plus(new bignumber_js_1.default(n.value).times(1e8)), new bignumber_js_1.default(0));
|
|
161
|
-
const result = {
|
|
162
|
-
hash: tx.txid,
|
|
163
|
-
value: value.toNumber(),
|
|
164
|
-
_raw: tx,
|
|
165
|
-
confirmations: 0,
|
|
166
|
-
status: tx.confirmations > 0 ? types_1.TxStatus.Success : types_1.TxStatus.Pending,
|
|
167
|
-
};
|
|
168
|
-
if (fee) {
|
|
169
|
-
const feePrice = Math.round(fee / tx.vsize);
|
|
170
|
-
Object.assign(result, {
|
|
171
|
-
fee,
|
|
172
|
-
feePrice,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
if (block) {
|
|
176
|
-
Object.assign(result, {
|
|
177
|
-
blockHash: block.hash,
|
|
178
|
-
blockNumber: block.number,
|
|
179
|
-
confirmations: tx.confirmations,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
return result;
|
|
183
|
-
}
|
|
184
|
-
exports.normalizeTransactionObject = normalizeTransactionObject;
|
|
185
|
-
// TODO: This is copy pasta because it's not exported from bitcoinjs-lib
|
|
186
|
-
// https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/csv.spec.ts#L477
|
|
187
|
-
function witnessStackToScriptWitness(witness) {
|
|
188
|
-
let buffer = Buffer.allocUnsafe(0);
|
|
189
|
-
function writeSlice(slice) {
|
|
190
|
-
buffer = Buffer.concat([buffer, Buffer.from(slice)]);
|
|
191
|
-
}
|
|
192
|
-
function writeVarInt(i) {
|
|
193
|
-
const currentLen = buffer.length;
|
|
194
|
-
const varintLen = varuint.encodingLength(i);
|
|
195
|
-
buffer = Buffer.concat([buffer, Buffer.allocUnsafe(varintLen)]);
|
|
196
|
-
varuint.encode(i, buffer, currentLen);
|
|
197
|
-
}
|
|
198
|
-
function writeVarSlice(slice) {
|
|
199
|
-
writeVarInt(slice.length);
|
|
200
|
-
writeSlice(slice);
|
|
201
|
-
}
|
|
202
|
-
function writeVector(vector) {
|
|
203
|
-
writeVarInt(vector.length);
|
|
204
|
-
vector.forEach(writeVarSlice);
|
|
205
|
-
}
|
|
206
|
-
writeVector(witness);
|
|
207
|
-
return buffer;
|
|
208
|
-
}
|
|
209
|
-
exports.witnessStackToScriptWitness = witnessStackToScriptWitness;
|
|
210
|
-
function getPubKeyHash(address, network) {
|
|
211
|
-
const outputScript = bitcoin.address.toOutputScript(address, network);
|
|
212
|
-
const type = classify.output(outputScript);
|
|
213
|
-
if (![classify.types.P2PKH, classify.types.P2WPKH].includes(type)) {
|
|
214
|
-
throw new Error(`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`);
|
|
215
|
-
}
|
|
216
|
-
try {
|
|
217
|
-
const bech32 = bitcoin.address.fromBech32(address);
|
|
218
|
-
return bech32.data;
|
|
219
|
-
}
|
|
220
|
-
catch (e) {
|
|
221
|
-
const base58 = bitcoin.address.fromBase58Check(address);
|
|
222
|
-
return base58.hash;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
exports.getPubKeyHash = getPubKeyHash;
|
|
226
|
-
function validateAddress(_address, network) {
|
|
227
|
-
const address = (0, _1.addressToString)(_address);
|
|
228
|
-
if (typeof address !== 'string') {
|
|
229
|
-
throw new errors_1.InvalidAddressError(`Invalid address: ${address}`);
|
|
230
|
-
}
|
|
231
|
-
let pubKeyHash;
|
|
232
|
-
try {
|
|
233
|
-
pubKeyHash = getPubKeyHash(address, network);
|
|
234
|
-
}
|
|
235
|
-
catch (e) {
|
|
236
|
-
throw new errors_1.InvalidAddressError(`Invalid Address. Failed to parse: ${address}`);
|
|
237
|
-
}
|
|
238
|
-
if (!pubKeyHash) {
|
|
239
|
-
throw new errors_1.InvalidAddressError(`Invalid Address: ${address}`);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
exports.validateAddress = validateAddress;
|
|
243
|
-
//# sourceMappingURL=bitcoin.js.map
|
package/lib/index.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateExpiration = exports.validateSecretAndHash = exports.validateSecretHash = exports.validateSecret = exports.validateValue = exports.caseInsensitiveEqual = exports.asyncSetImmediate = exports.addressToString = exports.sleep = void 0;
|
|
4
|
-
require("setimmediate");
|
|
5
|
-
const crypto_1 = require("@atomicfinance/crypto");
|
|
6
|
-
const errors_1 = require("@atomicfinance/errors");
|
|
7
|
-
const types_1 = require("@atomicfinance/types");
|
|
8
|
-
function addressToString(address) {
|
|
9
|
-
if (typeof address === 'string')
|
|
10
|
-
return address;
|
|
11
|
-
else
|
|
12
|
-
return address.address;
|
|
13
|
-
}
|
|
14
|
-
exports.addressToString = addressToString;
|
|
15
|
-
function sleep(ms) {
|
|
16
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
17
|
-
}
|
|
18
|
-
exports.sleep = sleep;
|
|
19
|
-
function asyncSetImmediate() {
|
|
20
|
-
return new Promise((resolve) => setImmediate(resolve));
|
|
21
|
-
}
|
|
22
|
-
exports.asyncSetImmediate = asyncSetImmediate;
|
|
23
|
-
function caseInsensitiveEqual(left, right) {
|
|
24
|
-
left = left && left.toLowerCase();
|
|
25
|
-
right = right && right.toLowerCase();
|
|
26
|
-
return left === right;
|
|
27
|
-
}
|
|
28
|
-
exports.caseInsensitiveEqual = caseInsensitiveEqual;
|
|
29
|
-
function validateValue(value) {
|
|
30
|
-
if (!types_1.BigNumber.isBigNumber(value)) {
|
|
31
|
-
throw new Error(`Invalid value: ${value}`);
|
|
32
|
-
}
|
|
33
|
-
if (value.lte(0)) {
|
|
34
|
-
throw new Error(`Invalid value: ${value}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
exports.validateValue = validateValue;
|
|
38
|
-
function validateSecretHash(secretHash) {
|
|
39
|
-
if (typeof secretHash !== 'string') {
|
|
40
|
-
throw new errors_1.InvalidSecretError(`Invalid secret hash type`);
|
|
41
|
-
}
|
|
42
|
-
if (Buffer.from(secretHash, 'hex').toString('hex') !== secretHash) {
|
|
43
|
-
throw new errors_1.InvalidSecretError(`Invalid secret hash. Not Hex.`);
|
|
44
|
-
}
|
|
45
|
-
if (Buffer.byteLength(secretHash, 'hex') !== 32) {
|
|
46
|
-
throw new errors_1.InvalidSecretError(`Invalid secret hash: ${secretHash}`);
|
|
47
|
-
}
|
|
48
|
-
if ((0, crypto_1.sha256)('0000000000000000000000000000000000000000000000000000000000000000') === secretHash) {
|
|
49
|
-
throw new errors_1.InvalidSecretError(`Invalid secret hash: ${secretHash}. Secret 0 detected.`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.validateSecretHash = validateSecretHash;
|
|
53
|
-
function validateSecret(secret) {
|
|
54
|
-
if (typeof secret !== 'string') {
|
|
55
|
-
throw new errors_1.InvalidSecretError(`Invalid secret type`);
|
|
56
|
-
}
|
|
57
|
-
if (Buffer.from(secret, 'hex').toString('hex') !== secret) {
|
|
58
|
-
throw new errors_1.InvalidSecretError(`Invalid secret. Not Hex.`);
|
|
59
|
-
}
|
|
60
|
-
const secretBuff = Buffer.from(secret, 'hex');
|
|
61
|
-
if (secretBuff.length !== 32) {
|
|
62
|
-
throw new errors_1.InvalidSecretError(`Invalid secret size`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.validateSecret = validateSecret;
|
|
66
|
-
function validateSecretAndHash(secret, secretHash) {
|
|
67
|
-
validateSecret(secret);
|
|
68
|
-
validateSecretHash(secretHash);
|
|
69
|
-
const computedSecretHash = Buffer.from((0, crypto_1.sha256)(secret), 'hex');
|
|
70
|
-
if (!computedSecretHash.equals(Buffer.from(secretHash, 'hex'))) {
|
|
71
|
-
throw new errors_1.InvalidSecretError(`Invalid secret: Does not match expected secret hash: ${secretHash}`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
exports.validateSecretAndHash = validateSecretAndHash;
|
|
75
|
-
function validateExpiration(expiration) {
|
|
76
|
-
if (isNaN(expiration)) {
|
|
77
|
-
throw new errors_1.InvalidExpirationError(`Invalid expiration. NaN: ${expiration}`);
|
|
78
|
-
}
|
|
79
|
-
if (expiration < 500000000 || expiration > 5000000000000) {
|
|
80
|
-
throw new errors_1.InvalidExpirationError(`Invalid expiration. Out of bounds: ${expiration}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
exports.validateExpiration = validateExpiration;
|
|
84
|
-
//# sourceMappingURL=index.js.map
|