@atomicfinance/bitcoin-utils 3.6.0 → 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/index.js +78 -6
- package/dist/index.js.map +1 -1
- package/lib/index.ts +100 -6
- package/package.json +6 -7
- package/lib/bitcoinjs-lib-classify.d.ts +0 -1
package/dist/index.js
CHANGED
|
@@ -35,10 +35,82 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
|
35
35
|
const varuint = __importStar(require("bip174/src/lib/converter/varint"));
|
|
36
36
|
const bitcoin_networks_1 = require("bitcoin-networks");
|
|
37
37
|
const bitcoin = __importStar(require("bitcoinjs-lib"));
|
|
38
|
-
const classify = __importStar(require("bitcoinjs-lib/src/classify"));
|
|
39
38
|
const coinselect_1 = __importDefault(require("coinselect"));
|
|
40
39
|
const accumulative_1 = __importDefault(require("coinselect/accumulative"));
|
|
41
40
|
const lodash_1 = require("lodash");
|
|
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
|
+
const 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
|
const calculateFee = (numInputs, numOutputs, feePerByte) => {
|
|
@@ -103,8 +175,8 @@ const 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
|
const decodeRawTransaction = (hex, network) => {
|
|
110
182
|
const bjsTx = bitcoin.Transaction.fromHex(hex);
|
|
@@ -121,7 +193,7 @@ const 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 @@ const witnessStackToScriptWitness = (witness) => {
|
|
|
209
281
|
exports.witnessStackToScriptWitness = witnessStackToScriptWitness;
|
|
210
282
|
const 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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA4D;AAC5D,kDAA4D;AAC5D,gDAK8B;AAC9B,gDAAuD;AACvD,gEAAqC;AACrC,yEAA2D;AAC3D,uDAAmE;AACnE,uDAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
|
package/lib/index.ts
CHANGED
|
@@ -11,11 +11,105 @@ import BigNumber from 'bignumber.js';
|
|
|
11
11
|
import * as varuint from 'bip174/src/lib/converter/varint';
|
|
12
12
|
import { BitcoinNetwork, BitcoinNetworks } from 'bitcoin-networks';
|
|
13
13
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
14
|
-
import * as classify from 'bitcoinjs-lib/src/classify';
|
|
15
14
|
import coinselect from 'coinselect';
|
|
16
15
|
import coinselectAccumulative from 'coinselect/accumulative';
|
|
17
16
|
import { findKey } from 'lodash';
|
|
18
17
|
|
|
18
|
+
// Script type constants (replacing the classify module)
|
|
19
|
+
const SCRIPT_TYPES = {
|
|
20
|
+
P2PKH: 'pubkeyhash',
|
|
21
|
+
P2SH: 'scripthash',
|
|
22
|
+
P2WPKH: 'witness_v0_keyhash',
|
|
23
|
+
P2WSH: 'witness_v0_scripthash',
|
|
24
|
+
P2TR: 'witness_v1_taproot',
|
|
25
|
+
NULLDATA: 'nulldata',
|
|
26
|
+
NONSTANDARD: 'nonstandard',
|
|
27
|
+
MULTISIG: 'multisig',
|
|
28
|
+
P2PK: 'pubkey',
|
|
29
|
+
} as const;
|
|
30
|
+
|
|
31
|
+
// Custom script classification function
|
|
32
|
+
const classifyScript = (script: Buffer): string => {
|
|
33
|
+
if (script.length === 0) return SCRIPT_TYPES.NONSTANDARD;
|
|
34
|
+
|
|
35
|
+
// P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
|
|
36
|
+
if (
|
|
37
|
+
script.length === 25 &&
|
|
38
|
+
script[0] === 0x76 && // OP_DUP
|
|
39
|
+
script[1] === 0xa9 && // OP_HASH160
|
|
40
|
+
script[2] === 0x14 && // 20 bytes
|
|
41
|
+
script[23] === 0x88 && // OP_EQUALVERIFY
|
|
42
|
+
script[24] === 0xac
|
|
43
|
+
) {
|
|
44
|
+
// OP_CHECKSIG
|
|
45
|
+
return SCRIPT_TYPES.P2PKH;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// P2SH: OP_HASH160 <20 bytes> OP_EQUAL
|
|
49
|
+
if (
|
|
50
|
+
script.length === 23 &&
|
|
51
|
+
script[0] === 0xa9 && // OP_HASH160
|
|
52
|
+
script[1] === 0x14 && // 20 bytes
|
|
53
|
+
script[22] === 0x87
|
|
54
|
+
) {
|
|
55
|
+
// OP_EQUAL
|
|
56
|
+
return SCRIPT_TYPES.P2SH;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// P2WPKH: OP_0 <20 bytes>
|
|
60
|
+
if (
|
|
61
|
+
script.length === 22 &&
|
|
62
|
+
script[0] === 0x00 && // OP_0
|
|
63
|
+
script[1] === 0x14
|
|
64
|
+
) {
|
|
65
|
+
// 20 bytes
|
|
66
|
+
return SCRIPT_TYPES.P2WPKH;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// P2WSH: OP_0 <32 bytes>
|
|
70
|
+
if (
|
|
71
|
+
script.length === 34 &&
|
|
72
|
+
script[0] === 0x00 && // OP_0
|
|
73
|
+
script[1] === 0x20
|
|
74
|
+
) {
|
|
75
|
+
// 32 bytes
|
|
76
|
+
return SCRIPT_TYPES.P2WSH;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// P2TR: OP_1 <32 bytes>
|
|
80
|
+
if (
|
|
81
|
+
script.length === 34 &&
|
|
82
|
+
script[0] === 0x51 && // OP_1
|
|
83
|
+
script[1] === 0x20
|
|
84
|
+
) {
|
|
85
|
+
// 32 bytes
|
|
86
|
+
return SCRIPT_TYPES.P2TR;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// OP_RETURN (nulldata)
|
|
90
|
+
if (script.length >= 1 && script[0] === 0x6a) {
|
|
91
|
+
// OP_RETURN
|
|
92
|
+
return SCRIPT_TYPES.NULLDATA;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// P2PK: <33 or 65 bytes pubkey> OP_CHECKSIG
|
|
96
|
+
if (
|
|
97
|
+
(script.length === 35 || script.length === 67) &&
|
|
98
|
+
script[script.length - 1] === 0xac
|
|
99
|
+
) {
|
|
100
|
+
// OP_CHECKSIG
|
|
101
|
+
return SCRIPT_TYPES.P2PK;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Basic multisig detection: OP_M <pubkeys> OP_N OP_CHECKMULTISIG
|
|
105
|
+
if (script.length >= 4 && script[script.length - 1] === 0xae) {
|
|
106
|
+
// OP_CHECKMULTISIG
|
|
107
|
+
return SCRIPT_TYPES.MULTISIG;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return SCRIPT_TYPES.NONSTANDARD;
|
|
111
|
+
};
|
|
112
|
+
|
|
19
113
|
const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
|
|
20
114
|
|
|
21
115
|
const calculateFee = (
|
|
@@ -124,8 +218,8 @@ const selectCoins = (
|
|
|
124
218
|
};
|
|
125
219
|
|
|
126
220
|
const OUTPUT_TYPES_MAP = {
|
|
127
|
-
[
|
|
128
|
-
[
|
|
221
|
+
[SCRIPT_TYPES.P2WPKH]: 'witness_v0_keyhash',
|
|
222
|
+
[SCRIPT_TYPES.P2WSH]: 'witness_v0_scripthash',
|
|
129
223
|
};
|
|
130
224
|
|
|
131
225
|
const decodeRawTransaction = (
|
|
@@ -148,7 +242,7 @@ const decodeRawTransaction = (
|
|
|
148
242
|
});
|
|
149
243
|
|
|
150
244
|
const vout = bjsTx.outs.map((output, n) => {
|
|
151
|
-
const type =
|
|
245
|
+
const type = classifyScript(output.script);
|
|
152
246
|
|
|
153
247
|
const vout: bT.Output = {
|
|
154
248
|
value: output.value / 1e8,
|
|
@@ -256,8 +350,8 @@ const witnessStackToScriptWitness = (witness: Buffer[]): Buffer => {
|
|
|
256
350
|
|
|
257
351
|
const getPubKeyHash = (address: string, network: BitcoinNetwork): Buffer => {
|
|
258
352
|
const outputScript = bitcoin.address.toOutputScript(address, network);
|
|
259
|
-
const type =
|
|
260
|
-
if (
|
|
353
|
+
const type = classifyScript(outputScript);
|
|
354
|
+
if (type !== SCRIPT_TYPES.P2PKH && type !== SCRIPT_TYPES.P2WPKH) {
|
|
261
355
|
throw new Error(
|
|
262
356
|
`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`,
|
|
263
357
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomicfinance/bitcoin-utils",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
"node": ">=14"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@atomicfinance/crypto": "^3.6.
|
|
28
|
-
"@atomicfinance/errors": "^3.6.
|
|
29
|
-
"@atomicfinance/types": "^3.6.
|
|
30
|
-
"@atomicfinance/utils": "^3.6.
|
|
27
|
+
"@atomicfinance/crypto": "^3.6.1",
|
|
28
|
+
"@atomicfinance/errors": "^3.6.1",
|
|
29
|
+
"@atomicfinance/types": "^3.6.1",
|
|
30
|
+
"@atomicfinance/utils": "^3.6.1",
|
|
31
31
|
"@babel/runtime": "^7.12.1",
|
|
32
32
|
"bignumber.js": "^9.0.0",
|
|
33
33
|
"bip174": "^2.0.1",
|
|
34
34
|
"bitcoin-networks": "^1.0.0",
|
|
35
|
-
"bitcoinjs-lib": "
|
|
35
|
+
"bitcoinjs-lib": "6.1.7",
|
|
36
36
|
"coinselect": "^3.1.11",
|
|
37
37
|
"lodash": "^4.17.20"
|
|
38
38
|
},
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
"access": "public"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/bitcoinjs-lib": "^5.0.0",
|
|
44
43
|
"@types/lodash": "^4.14.168",
|
|
45
44
|
"@types/node": "16.10.3"
|
|
46
45
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
declare module 'bitcoinjs-lib/src/classify'
|