@btc-vision/bitcoin 6.3.1 → 6.3.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/.babelrc +4 -0
- package/.gitattributes +2 -0
- package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
- package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/.prettierrc.json +12 -0
- package/CHANGELOG.md +403 -0
- package/CONTRIBUTING.md +83 -0
- package/browser/address.d.ts +16 -0
- package/{src → browser}/bip66.d.ts +6 -7
- package/{src → browser}/block.d.ts +29 -30
- package/{src → browser}/bufferutils.d.ts +34 -54
- package/browser/crypto/crypto.d.ts +1 -0
- package/{src → browser}/crypto.d.ts +13 -18
- package/browser/ecc_lib.d.ts +3 -0
- package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
- package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
- package/browser/hooks/SignatureManager.d.ts +13 -0
- package/browser/index.d.ts +58 -0
- package/browser/index.js +2 -0
- package/browser/index.js.LICENSE.txt +14 -0
- package/browser/merkle.d.ts +1 -0
- package/browser/networks.d.ts +23 -0
- package/{src → browser}/ops.d.ts +126 -126
- package/browser/payments/bip341.d.ts +23 -0
- package/browser/payments/embed.d.ts +2 -0
- package/browser/payments/index.d.ts +41 -0
- package/{src → browser}/payments/lazy.d.ts +2 -2
- package/browser/payments/p2ms.d.ts +2 -0
- package/browser/payments/p2pk.d.ts +2 -0
- package/browser/payments/p2pkh.d.ts +2 -0
- package/browser/payments/p2sh.d.ts +2 -0
- package/browser/payments/p2tr.d.ts +2 -0
- package/browser/payments/p2wpkh.d.ts +2 -0
- package/browser/payments/p2wsh.d.ts +2 -0
- package/browser/psbt/bip371.d.ts +16 -0
- package/browser/psbt/psbtutils.d.ts +26 -0
- package/{src → browser}/psbt.d.ts +167 -238
- package/browser/push_data.d.ts +7 -0
- package/browser/script.d.ts +17 -0
- package/browser/script_number.d.ts +2 -0
- package/browser/script_signature.d.ts +7 -0
- package/{src → browser}/transaction.d.ts +48 -60
- package/{src → browser}/types.d.ts +37 -54
- package/build/address.d.ts +16 -0
- package/build/address.js +148 -0
- package/build/bip66.d.ts +6 -0
- package/build/bip66.js +99 -0
- package/build/block.d.ts +29 -0
- package/build/block.js +181 -0
- package/build/bufferutils.d.ts +34 -0
- package/build/bufferutils.js +141 -0
- package/build/crypto/crypto.d.ts +1 -0
- package/build/crypto/crypto.js +1 -0
- package/build/crypto.d.ts +13 -0
- package/build/crypto.js +87 -0
- package/build/ecc_lib.d.ts +3 -0
- package/build/ecc_lib.js +61 -0
- package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
- package/build/hooks/AdvancedSignatureManager.js +52 -0
- package/build/hooks/HookedSigner.d.ts +4 -0
- package/build/hooks/HookedSigner.js +64 -0
- package/build/hooks/SignatureManager.d.ts +13 -0
- package/build/hooks/SignatureManager.js +45 -0
- package/build/index.d.ts +58 -0
- package/build/index.js +32 -0
- package/build/merkle.d.ts +1 -0
- package/build/merkle.js +19 -0
- package/build/networks.d.ts +23 -0
- package/build/networks.js +121 -0
- package/build/ops.d.ts +126 -0
- package/{src → build}/ops.js +127 -131
- package/build/payments/bip341.d.ts +23 -0
- package/build/payments/bip341.js +82 -0
- package/build/payments/embed.d.ts +2 -0
- package/build/payments/embed.js +39 -0
- package/build/payments/index.d.ts +41 -0
- package/build/payments/index.js +10 -0
- package/build/payments/lazy.d.ts +2 -0
- package/{src → build}/payments/lazy.js +28 -32
- package/build/payments/p2ms.d.ts +2 -0
- package/{src → build}/payments/p2ms.js +128 -158
- package/build/payments/p2pk.d.ts +2 -0
- package/build/payments/p2pk.js +68 -0
- package/build/payments/p2pkh.d.ts +2 -0
- package/build/payments/p2pkh.js +135 -0
- package/build/payments/p2sh.d.ts +2 -0
- package/build/payments/p2sh.js +175 -0
- package/build/payments/p2tr.d.ts +2 -0
- package/build/payments/p2tr.js +254 -0
- package/build/payments/p2wpkh.d.ts +2 -0
- package/build/payments/p2wpkh.js +130 -0
- package/build/payments/p2wsh.d.ts +2 -0
- package/build/payments/p2wsh.js +180 -0
- package/build/psbt/bip371.d.ts +16 -0
- package/build/psbt/bip371.js +246 -0
- package/build/psbt/psbtutils.d.ts +26 -0
- package/build/psbt/psbtutils.js +170 -0
- package/build/psbt.d.ts +167 -0
- package/build/psbt.js +1305 -0
- package/build/push_data.d.ts +7 -0
- package/build/push_data.js +57 -0
- package/build/script.d.ts +17 -0
- package/build/script.js +167 -0
- package/build/script_number.d.ts +2 -0
- package/build/script_number.js +49 -0
- package/build/script_signature.d.ts +7 -0
- package/build/script_signature.js +49 -0
- package/build/transaction.d.ts +48 -0
- package/build/transaction.js +445 -0
- package/build/types.d.ts +37 -0
- package/build/types.js +73 -0
- package/cjs/package.json +3 -0
- package/eslint.config.js +56 -0
- package/gulpfile.js +42 -0
- package/package.json +105 -50
- package/src/{address.js → address.ts} +93 -73
- package/src/{bip66.js → bip66.ts} +23 -19
- package/src/{block.js → block.ts} +114 -105
- package/src/{bufferutils.js → bufferutils.ts} +65 -67
- package/src/crypto/crypto-browser.js +75 -0
- package/src/crypto/crypto.ts +1 -0
- package/src/crypto.ts +108 -0
- package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
- package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
- package/src/hooks/HookedSigner.ts +108 -0
- package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
- package/src/index.ts +86 -0
- package/src/{merkle.js → merkle.ts} +8 -7
- package/src/{networks.js → networks.ts} +44 -29
- package/src/ops.ts +282 -0
- package/src/payments/bip341.ts +140 -0
- package/src/payments/embed.ts +55 -0
- package/src/payments/{index.d.ts → index.ts} +20 -10
- package/src/payments/lazy.ts +28 -0
- package/src/payments/p2ms.ts +150 -0
- package/src/payments/{p2pk.js → p2pk.ts} +32 -29
- package/src/payments/{p2pkh.js → p2pkh.ts} +53 -47
- package/src/payments/{p2sh.js → p2sh.ts} +72 -71
- package/src/payments/{p2tr.js → p2tr.ts} +114 -125
- package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
- package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
- package/src/psbt/{bip371.js → bip371.ts} +191 -174
- package/src/psbt/psbtutils.ts +299 -0
- package/src/{psbt.js → psbt.ts} +1025 -679
- package/src/{push_data.js → push_data.ts} +35 -21
- package/src/{script.js → script.ts} +93 -77
- package/src/{script_number.js → script_number.ts} +15 -21
- package/src/{script_signature.js → script_signature.ts} +26 -14
- package/src/{transaction.js → transaction.ts} +247 -167
- package/src/types.ts +122 -0
- package/test/address.spec.js +124 -0
- package/test/address.spec.ts +177 -0
- package/test/bitcoin.core.spec.js +170 -0
- package/test/bitcoin.core.spec.ts +234 -0
- package/test/block.spec.js +141 -0
- package/test/block.spec.ts +194 -0
- package/test/bufferutils.spec.js +427 -0
- package/test/bufferutils.spec.ts +513 -0
- package/test/crypto.spec.js +41 -0
- package/test/crypto.spec.ts +55 -0
- package/test/fixtures/address.json +329 -0
- package/test/fixtures/block.json +148 -0
- package/test/fixtures/bufferutils.json +102 -0
- package/test/fixtures/core/README.md +26 -0
- package/test/fixtures/core/base58_encode_decode.json +50 -0
- package/test/fixtures/core/base58_keys_invalid.json +152 -0
- package/test/fixtures/core/base58_keys_valid.json +452 -0
- package/test/fixtures/core/blocks.json +27 -0
- package/test/fixtures/core/sig_canonical.json +7 -0
- package/test/fixtures/core/sig_noncanonical.json +33 -0
- package/test/fixtures/core/sighash.json +3505 -0
- package/test/fixtures/core/tx_valid.json +2023 -0
- package/test/fixtures/crypto.json +43 -0
- package/test/fixtures/ecdsa.json +217 -0
- package/test/fixtures/ecpair.json +141 -0
- package/test/fixtures/embed.json +108 -0
- package/test/fixtures/p2ms.json +434 -0
- package/test/fixtures/p2pk.json +179 -0
- package/test/fixtures/p2pkh.json +276 -0
- package/test/fixtures/p2sh.json +508 -0
- package/test/fixtures/p2tr.json +1198 -0
- package/test/fixtures/p2wpkh.json +290 -0
- package/test/fixtures/p2wsh.json +489 -0
- package/test/fixtures/psbt.json +924 -0
- package/test/fixtures/script.json +465 -0
- package/test/fixtures/script_number.json +225 -0
- package/test/fixtures/signature.json +140 -0
- package/test/fixtures/transaction.json +916 -0
- package/test/integration/_regtest.js +7 -0
- package/test/integration/_regtest.ts +6 -0
- package/test/integration/addresses.spec.js +116 -0
- package/test/integration/addresses.spec.ts +154 -0
- package/test/integration/bip32.spec.js +85 -0
- package/test/integration/bip32.spec.ts +151 -0
- package/test/integration/blocks.spec.js +26 -0
- package/test/integration/blocks.spec.ts +28 -0
- package/test/integration/cltv.spec.js +199 -0
- package/test/integration/cltv.spec.ts +283 -0
- package/test/integration/csv.spec.js +362 -0
- package/test/integration/csv.spec.ts +527 -0
- package/test/integration/payments.spec.js +98 -0
- package/test/integration/payments.spec.ts +135 -0
- package/test/integration/taproot.spec.js +532 -0
- package/test/integration/taproot.spec.ts +707 -0
- package/test/integration/transactions.spec.js +561 -0
- package/test/integration/transactions.spec.ts +769 -0
- package/test/payments.spec.js +97 -0
- package/test/payments.spec.ts +125 -0
- package/test/payments.utils.js +190 -0
- package/test/payments.utils.ts +208 -0
- package/test/psbt.spec.js +1044 -0
- package/test/psbt.spec.ts +1414 -0
- package/test/script.spec.js +151 -0
- package/test/script.spec.ts +210 -0
- package/test/script_number.spec.js +24 -0
- package/test/script_number.spec.ts +29 -0
- package/test/script_signature.spec.js +52 -0
- package/test/script_signature.spec.ts +66 -0
- package/test/transaction.spec.js +269 -0
- package/test/transaction.spec.ts +387 -0
- package/test/ts-node-register.js +5 -0
- package/test/tsconfig.json +45 -0
- package/test/types.spec.js +46 -0
- package/test/types.spec.ts +58 -0
- package/tsconfig.base.json +27 -0
- package/tsconfig.json +19 -0
- package/tsconfig.webpack.json +18 -0
- package/webpack.config.js +79 -0
- package/src/address.d.ts +0 -42
- package/src/crypto.js +0 -128
- package/src/ecc_lib.d.ts +0 -17
- package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
- package/src/hooks/HookedSigner.js +0 -90
- package/src/hooks/SignatureManager.d.ts +0 -35
- package/src/index.d.ts +0 -42
- package/src/index.js +0 -87
- package/src/merkle.d.ts +0 -10
- package/src/networks.d.ts +0 -83
- package/src/payments/bip341.d.ts +0 -49
- package/src/payments/bip341.js +0 -124
- package/src/payments/embed.d.ts +0 -9
- package/src/payments/embed.js +0 -54
- package/src/payments/index.js +0 -69
- package/src/payments/p2ms.d.ts +0 -9
- package/src/payments/p2pk.d.ts +0 -10
- package/src/payments/p2pkh.d.ts +0 -10
- package/src/payments/p2sh.d.ts +0 -10
- package/src/payments/p2tr.d.ts +0 -10
- package/src/payments/p2wpkh.d.ts +0 -10
- package/src/payments/p2wsh.d.ts +0 -10
- package/src/psbt/bip371.d.ts +0 -42
- package/src/psbt/psbtutils.d.ts +0 -64
- package/src/psbt/psbtutils.js +0 -191
- package/src/push_data.d.ts +0 -29
- package/src/script.d.ts +0 -42
- package/src/script_number.d.ts +0 -19
- package/src/script_signature.d.ts +0 -21
- package/src/types.js +0 -106
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.decode = exports.encode = exports.encodingLength = void 0;
|
|
4
|
-
const ops_1 = require('./ops');
|
|
1
|
+
import { OPS } from './ops.js';
|
|
2
|
+
|
|
5
3
|
/**
|
|
6
4
|
* Calculates the encoding length of a number used for push data in Bitcoin transactions.
|
|
7
5
|
* @param i The number to calculate the encoding length for.
|
|
8
6
|
* @returns The encoding length of the number.
|
|
9
7
|
*/
|
|
10
|
-
function encodingLength(i) {
|
|
11
|
-
return i <
|
|
8
|
+
export function encodingLength(i: number): number {
|
|
9
|
+
return i < OPS.OP_PUSHDATA1 ? 1 : i <= 0xff ? 2 : i <= 0xffff ? 3 : 5;
|
|
12
10
|
}
|
|
13
|
-
|
|
11
|
+
|
|
14
12
|
/**
|
|
15
13
|
* Encodes a number into a buffer using a variable-length encoding scheme.
|
|
16
14
|
* The encoded buffer is written starting at the specified offset.
|
|
@@ -21,63 +19,79 @@ exports.encodingLength = encodingLength;
|
|
|
21
19
|
* @param offset - The offset at which to start writing the encoded buffer.
|
|
22
20
|
* @returns The size of the encoded buffer.
|
|
23
21
|
*/
|
|
24
|
-
function encode(buffer, num, offset) {
|
|
22
|
+
export function encode(buffer: Buffer, num: number, offset: number): number {
|
|
25
23
|
const size = encodingLength(num);
|
|
24
|
+
|
|
26
25
|
// ~6 bit
|
|
27
26
|
if (size === 1) {
|
|
28
27
|
buffer.writeUInt8(num, offset);
|
|
28
|
+
|
|
29
29
|
// 8 bit
|
|
30
30
|
} else if (size === 2) {
|
|
31
|
-
buffer.writeUInt8(
|
|
31
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA1, offset);
|
|
32
32
|
buffer.writeUInt8(num, offset + 1);
|
|
33
|
+
|
|
33
34
|
// 16 bit
|
|
34
35
|
} else if (size === 3) {
|
|
35
|
-
buffer.writeUInt8(
|
|
36
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA2, offset);
|
|
36
37
|
buffer.writeUInt16LE(num, offset + 1);
|
|
38
|
+
|
|
37
39
|
// 32 bit
|
|
38
40
|
} else {
|
|
39
|
-
buffer.writeUInt8(
|
|
41
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA4, offset);
|
|
40
42
|
buffer.writeUInt32LE(num, offset + 1);
|
|
41
43
|
}
|
|
44
|
+
|
|
42
45
|
return size;
|
|
43
46
|
}
|
|
44
|
-
|
|
47
|
+
|
|
45
48
|
/**
|
|
46
49
|
* Decodes a buffer and returns information about the opcode, number, and size.
|
|
47
50
|
* @param buffer - The buffer to decode.
|
|
48
51
|
* @param offset - The offset within the buffer to start decoding.
|
|
49
52
|
* @returns An object containing the opcode, number, and size, or null if decoding fails.
|
|
50
53
|
*/
|
|
51
|
-
function decode(
|
|
54
|
+
export function decode(
|
|
55
|
+
buffer: Buffer,
|
|
56
|
+
offset: number,
|
|
57
|
+
): {
|
|
58
|
+
opcode: number;
|
|
59
|
+
number: number;
|
|
60
|
+
size: number;
|
|
61
|
+
} | null {
|
|
52
62
|
const opcode = buffer.readUInt8(offset);
|
|
53
|
-
let num;
|
|
54
|
-
let size;
|
|
63
|
+
let num: number;
|
|
64
|
+
let size: number;
|
|
65
|
+
|
|
55
66
|
// ~6 bit
|
|
56
|
-
if (opcode <
|
|
67
|
+
if (opcode < OPS.OP_PUSHDATA1) {
|
|
57
68
|
num = opcode;
|
|
58
69
|
size = 1;
|
|
70
|
+
|
|
59
71
|
// 8 bit
|
|
60
|
-
} else if (opcode ===
|
|
72
|
+
} else if (opcode === OPS.OP_PUSHDATA1) {
|
|
61
73
|
if (offset + 2 > buffer.length) return null;
|
|
62
74
|
num = buffer.readUInt8(offset + 1);
|
|
63
75
|
size = 2;
|
|
76
|
+
|
|
64
77
|
// 16 bit
|
|
65
|
-
} else if (opcode ===
|
|
78
|
+
} else if (opcode === OPS.OP_PUSHDATA2) {
|
|
66
79
|
if (offset + 3 > buffer.length) return null;
|
|
67
80
|
num = buffer.readUInt16LE(offset + 1);
|
|
68
81
|
size = 3;
|
|
82
|
+
|
|
69
83
|
// 32 bit
|
|
70
84
|
} else {
|
|
71
85
|
if (offset + 5 > buffer.length) return null;
|
|
72
|
-
if (opcode !==
|
|
73
|
-
|
|
86
|
+
if (opcode !== OPS.OP_PUSHDATA4) throw new Error('Unexpected opcode');
|
|
87
|
+
|
|
74
88
|
num = buffer.readUInt32LE(offset + 1);
|
|
75
89
|
size = 5;
|
|
76
90
|
}
|
|
91
|
+
|
|
77
92
|
return {
|
|
78
93
|
opcode,
|
|
79
94
|
number: num,
|
|
80
95
|
size,
|
|
81
96
|
};
|
|
82
97
|
}
|
|
83
|
-
exports.decode = decode;
|
|
@@ -1,71 +1,60 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
|
-
exports.signature =
|
|
4
|
-
exports.number =
|
|
5
|
-
exports.isCanonicalScriptSignature =
|
|
6
|
-
exports.isDefinedHashType =
|
|
7
|
-
exports.isCanonicalPubKey =
|
|
8
|
-
exports.toStack =
|
|
9
|
-
exports.fromASM =
|
|
10
|
-
exports.toASM =
|
|
11
|
-
exports.decompile =
|
|
12
|
-
exports.compile =
|
|
13
|
-
exports.countNonPushOnlyOPs =
|
|
14
|
-
exports.isPushOnly =
|
|
15
|
-
exports.OPS =
|
|
16
|
-
void 0;
|
|
17
1
|
/**
|
|
18
2
|
* Script tools, including decompile, compile, toASM, fromASM, toStack, isCanonicalPubKey, isCanonicalScriptSignature
|
|
19
3
|
* @packageDocumentation
|
|
20
4
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const pushdata = require('./push_data');
|
|
30
|
-
const scriptNumber = require('./script_number');
|
|
31
|
-
const scriptSignature = require('./script_signature');
|
|
32
|
-
const types = require('./types');
|
|
5
|
+
import * as bip66 from './bip66.js';
|
|
6
|
+
import { Opcodes, OPS, REVERSE_OPS } from './ops.js';
|
|
7
|
+
import { Stack } from './payments/index.js';
|
|
8
|
+
import * as pushdata from './push_data.js';
|
|
9
|
+
import * as scriptNumber from './script_number.js';
|
|
10
|
+
import * as scriptSignature from './script_signature.js';
|
|
11
|
+
import * as types from './types.js';
|
|
12
|
+
|
|
33
13
|
const { typeforce } = types;
|
|
34
|
-
|
|
35
|
-
|
|
14
|
+
|
|
15
|
+
const OP_INT_BASE = OPS.OP_RESERVED; // OP_1 - 1
|
|
16
|
+
export { OPS };
|
|
17
|
+
|
|
18
|
+
function isOPInt(value: number): boolean {
|
|
36
19
|
return (
|
|
37
20
|
types.Number(value) &&
|
|
38
|
-
(value ===
|
|
39
|
-
(value >=
|
|
40
|
-
value ===
|
|
21
|
+
(value === OPS.OP_0 ||
|
|
22
|
+
(value >= OPS.OP_1 && value <= OPS.OP_16) ||
|
|
23
|
+
value === OPS.OP_1NEGATE)
|
|
41
24
|
);
|
|
42
25
|
}
|
|
43
|
-
|
|
44
|
-
|
|
26
|
+
|
|
27
|
+
function isPushOnlyChunk(value: number | Buffer): boolean {
|
|
28
|
+
return types.Buffer(value) || isOPInt(value as number);
|
|
45
29
|
}
|
|
46
|
-
|
|
30
|
+
|
|
31
|
+
export function isPushOnly(value: Stack): boolean {
|
|
47
32
|
return types.Array(value) && value.every(isPushOnlyChunk);
|
|
48
33
|
}
|
|
49
|
-
|
|
50
|
-
function countNonPushOnlyOPs(value) {
|
|
34
|
+
|
|
35
|
+
export function countNonPushOnlyOPs(value: Stack): number {
|
|
51
36
|
return value.length - value.filter(isPushOnlyChunk).length;
|
|
52
37
|
}
|
|
53
|
-
|
|
54
|
-
function asMinimalOP(buffer) {
|
|
55
|
-
if (buffer.length === 0) return
|
|
38
|
+
|
|
39
|
+
function asMinimalOP(buffer: Buffer): number | void {
|
|
40
|
+
if (buffer.length === 0) return OPS.OP_0;
|
|
56
41
|
if (buffer.length !== 1) return;
|
|
57
42
|
if (buffer[0] >= 1 && buffer[0] <= 16) return OP_INT_BASE + buffer[0];
|
|
58
|
-
if (buffer[0] === 0x81) return
|
|
43
|
+
if (buffer[0] === 0x81) return OPS.OP_1NEGATE;
|
|
59
44
|
}
|
|
60
|
-
|
|
45
|
+
|
|
46
|
+
function chunksIsBuffer(buf: Buffer | Stack): buf is Buffer {
|
|
61
47
|
return Buffer.isBuffer(buf);
|
|
62
48
|
}
|
|
63
|
-
|
|
49
|
+
|
|
50
|
+
function chunksIsArray(buf: Buffer | Stack): buf is Stack {
|
|
64
51
|
return types.Array(buf);
|
|
65
52
|
}
|
|
66
|
-
|
|
53
|
+
|
|
54
|
+
function singleChunkIsBuffer(buf: number | Buffer): buf is Buffer {
|
|
67
55
|
return Buffer.isBuffer(buf);
|
|
68
56
|
}
|
|
57
|
+
|
|
69
58
|
/**
|
|
70
59
|
* Compiles an array of chunks into a Buffer.
|
|
71
60
|
*
|
|
@@ -73,25 +62,31 @@ function singleChunkIsBuffer(buf) {
|
|
|
73
62
|
* @returns The compiled Buffer.
|
|
74
63
|
* @throws Error if the compilation fails.
|
|
75
64
|
*/
|
|
76
|
-
function compile(chunks) {
|
|
65
|
+
export function compile(chunks: Buffer | Stack): Buffer {
|
|
77
66
|
// TODO: remove me
|
|
78
67
|
if (chunksIsBuffer(chunks)) return chunks;
|
|
68
|
+
|
|
79
69
|
typeforce(types.Array, chunks);
|
|
80
|
-
|
|
70
|
+
|
|
71
|
+
const bufferSize = chunks.reduce((accum: number, chunk) => {
|
|
81
72
|
// data chunk
|
|
82
73
|
if (singleChunkIsBuffer(chunk)) {
|
|
83
74
|
// adhere to BIP62.3, minimal push policy
|
|
84
75
|
if (chunk.length === 1 && asMinimalOP(chunk) !== undefined) {
|
|
85
76
|
return accum + 1;
|
|
86
77
|
}
|
|
78
|
+
|
|
87
79
|
return accum + pushdata.encodingLength(chunk.length) + chunk.length;
|
|
88
80
|
}
|
|
81
|
+
|
|
89
82
|
// opcode
|
|
90
83
|
return accum + 1;
|
|
91
84
|
}, 0.0);
|
|
85
|
+
|
|
92
86
|
const buffer = Buffer.allocUnsafe(bufferSize);
|
|
93
87
|
let offset = 0;
|
|
94
|
-
|
|
88
|
+
|
|
89
|
+
chunks.forEach((chunk) => {
|
|
95
90
|
// data chunk
|
|
96
91
|
if (singleChunkIsBuffer(chunk)) {
|
|
97
92
|
// adhere to BIP62.3, minimal push policy
|
|
@@ -101,37 +96,48 @@ function compile(chunks) {
|
|
|
101
96
|
offset += 1;
|
|
102
97
|
return;
|
|
103
98
|
}
|
|
99
|
+
|
|
104
100
|
offset += pushdata.encode(buffer, chunk.length, offset);
|
|
105
101
|
chunk.copy(buffer, offset);
|
|
106
102
|
offset += chunk.length;
|
|
103
|
+
|
|
107
104
|
// opcode
|
|
108
105
|
} else {
|
|
109
106
|
buffer.writeUInt8(chunk, offset);
|
|
110
107
|
offset += 1;
|
|
111
108
|
}
|
|
112
109
|
});
|
|
110
|
+
|
|
113
111
|
if (offset !== buffer.length) throw new Error('Could not decode chunks');
|
|
114
112
|
return buffer;
|
|
115
113
|
}
|
|
116
|
-
|
|
117
|
-
function decompile(buffer) {
|
|
114
|
+
|
|
115
|
+
export function decompile(buffer: Buffer | Array<number | Buffer>): Array<number | Buffer> | null {
|
|
118
116
|
// TODO: remove me
|
|
119
117
|
if (chunksIsArray(buffer)) return buffer;
|
|
118
|
+
|
|
120
119
|
typeforce(types.Buffer, buffer);
|
|
121
|
-
|
|
120
|
+
|
|
121
|
+
const chunks: Array<number | Buffer> = [];
|
|
122
122
|
let i = 0;
|
|
123
|
+
|
|
123
124
|
while (i < buffer.length) {
|
|
124
125
|
const opcode = buffer[i];
|
|
126
|
+
|
|
125
127
|
// data chunk
|
|
126
|
-
if (opcode >
|
|
128
|
+
if (opcode > OPS.OP_0 && opcode <= OPS.OP_PUSHDATA4) {
|
|
127
129
|
const d = pushdata.decode(buffer, i);
|
|
130
|
+
|
|
128
131
|
// did reading a pushDataInt fail?
|
|
129
132
|
if (d === null) return null;
|
|
130
133
|
i += d.size;
|
|
134
|
+
|
|
131
135
|
// attempt to read too much data?
|
|
132
136
|
if (i + d.number > buffer.length) return null;
|
|
137
|
+
|
|
133
138
|
const data = buffer.slice(i, i + d.number);
|
|
134
139
|
i += d.number;
|
|
140
|
+
|
|
135
141
|
// decompile minimally
|
|
136
142
|
const op = asMinimalOP(data);
|
|
137
143
|
if (op !== undefined) {
|
|
@@ -139,93 +145,103 @@ function decompile(buffer) {
|
|
|
139
145
|
} else {
|
|
140
146
|
chunks.push(data);
|
|
141
147
|
}
|
|
148
|
+
|
|
142
149
|
// opcode
|
|
143
150
|
} else {
|
|
144
151
|
chunks.push(opcode);
|
|
152
|
+
|
|
145
153
|
i += 1;
|
|
146
154
|
}
|
|
147
155
|
}
|
|
156
|
+
|
|
148
157
|
return chunks;
|
|
149
158
|
}
|
|
150
|
-
|
|
159
|
+
|
|
151
160
|
/**
|
|
152
161
|
* Converts the given chunks into an ASM (Assembly) string representation.
|
|
153
162
|
* If the chunks parameter is a Buffer, it will be decompiled into a Stack before conversion.
|
|
154
163
|
* @param chunks - The chunks to convert into ASM.
|
|
155
164
|
* @returns The ASM string representation of the chunks.
|
|
156
165
|
*/
|
|
157
|
-
function toASM(chunks) {
|
|
166
|
+
export function toASM(chunks: Buffer | Array<number | Buffer>): string {
|
|
158
167
|
if (chunksIsBuffer(chunks)) {
|
|
159
|
-
chunks = decompile(chunks);
|
|
168
|
+
chunks = decompile(chunks) as Stack;
|
|
160
169
|
}
|
|
161
170
|
if (!chunks) {
|
|
162
171
|
throw new Error('Could not convert invalid chunks to ASM');
|
|
163
172
|
}
|
|
164
173
|
return chunks
|
|
165
|
-
.map(chunk => {
|
|
174
|
+
.map((chunk) => {
|
|
166
175
|
// data?
|
|
167
176
|
if (singleChunkIsBuffer(chunk)) {
|
|
168
177
|
const op = asMinimalOP(chunk);
|
|
169
178
|
if (op === undefined) return chunk.toString('hex');
|
|
170
|
-
chunk = op;
|
|
179
|
+
chunk = op as number;
|
|
171
180
|
}
|
|
181
|
+
|
|
172
182
|
// opcode!
|
|
173
|
-
return
|
|
183
|
+
return REVERSE_OPS[chunk];
|
|
174
184
|
})
|
|
175
185
|
.join(' ');
|
|
176
186
|
}
|
|
177
|
-
|
|
187
|
+
|
|
178
188
|
/**
|
|
179
189
|
* Converts an ASM string to a Buffer.
|
|
180
190
|
* @param asm The ASM string to convert.
|
|
181
191
|
* @returns The converted Buffer.
|
|
182
192
|
*/
|
|
183
|
-
function fromASM(asm) {
|
|
193
|
+
export function fromASM(asm: string): Buffer {
|
|
184
194
|
typeforce(types.String, asm);
|
|
195
|
+
|
|
185
196
|
return compile(
|
|
186
|
-
asm.split(' ').map(chunkStr => {
|
|
197
|
+
asm.split(' ').map((chunkStr) => {
|
|
187
198
|
// opcode?
|
|
188
|
-
if (
|
|
189
|
-
return
|
|
199
|
+
if (OPS[chunkStr as keyof Opcodes] !== undefined) {
|
|
200
|
+
return OPS[chunkStr as keyof Opcodes];
|
|
190
201
|
}
|
|
191
202
|
typeforce(types.Hex, chunkStr);
|
|
203
|
+
|
|
192
204
|
// data!
|
|
193
205
|
return Buffer.from(chunkStr, 'hex');
|
|
194
206
|
}),
|
|
195
207
|
);
|
|
196
208
|
}
|
|
197
|
-
|
|
209
|
+
|
|
198
210
|
/**
|
|
199
211
|
* Converts the given chunks into a stack of buffers.
|
|
200
212
|
*
|
|
201
213
|
* @param chunks - The chunks to convert.
|
|
202
214
|
* @returns The stack of buffers.
|
|
203
215
|
*/
|
|
204
|
-
function toStack(chunks) {
|
|
205
|
-
chunks = decompile(chunks);
|
|
216
|
+
export function toStack(chunks: Buffer | Array<number | Buffer>): Buffer[] {
|
|
217
|
+
chunks = decompile(chunks) as Stack;
|
|
206
218
|
typeforce(isPushOnly, chunks);
|
|
207
|
-
|
|
219
|
+
|
|
220
|
+
return chunks.map((op) => {
|
|
208
221
|
if (singleChunkIsBuffer(op)) return op;
|
|
209
|
-
if (op ===
|
|
222
|
+
if (op === OPS.OP_0) return Buffer.allocUnsafe(0);
|
|
223
|
+
|
|
210
224
|
return scriptNumber.encode(op - OP_INT_BASE);
|
|
211
225
|
});
|
|
212
226
|
}
|
|
213
|
-
|
|
214
|
-
function isCanonicalPubKey(buffer) {
|
|
227
|
+
|
|
228
|
+
export function isCanonicalPubKey(buffer: Buffer): boolean {
|
|
215
229
|
return types.isPoint(buffer);
|
|
216
230
|
}
|
|
217
|
-
|
|
218
|
-
function isDefinedHashType(hashType) {
|
|
231
|
+
|
|
232
|
+
export function isDefinedHashType(hashType: number): boolean {
|
|
219
233
|
const hashTypeMod = hashType & ~0x80;
|
|
234
|
+
|
|
220
235
|
// return hashTypeMod > SIGHASH_ALL && hashTypeMod < SIGHASH_SINGLE
|
|
221
236
|
return hashTypeMod > 0x00 && hashTypeMod < 0x04;
|
|
222
237
|
}
|
|
223
|
-
|
|
224
|
-
function isCanonicalScriptSignature(buffer) {
|
|
238
|
+
|
|
239
|
+
export function isCanonicalScriptSignature(buffer: Buffer): boolean {
|
|
225
240
|
if (!Buffer.isBuffer(buffer)) return false;
|
|
226
241
|
if (!isDefinedHashType(buffer[buffer.length - 1])) return false;
|
|
242
|
+
|
|
227
243
|
return bip66.check(buffer.slice(0, -1));
|
|
228
244
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
245
|
+
|
|
246
|
+
export const number = scriptNumber;
|
|
247
|
+
export const signature = scriptSignature;
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
|
-
exports.encode = exports.decode = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Decodes a script number from a buffer.
|
|
6
3
|
*
|
|
@@ -11,9 +8,10 @@ exports.encode = exports.decode = void 0;
|
|
|
11
8
|
* @throws {TypeError} If the script number overflows the maximum length.
|
|
12
9
|
* @throws {Error} If the script number is not minimally encoded when minimal is true.
|
|
13
10
|
*/
|
|
14
|
-
function decode(buffer, maxLength, minimal) {
|
|
11
|
+
export function decode(buffer: Buffer, maxLength?: number, minimal?: boolean): number {
|
|
15
12
|
maxLength = maxLength || 4;
|
|
16
13
|
minimal = minimal === undefined ? true : minimal;
|
|
14
|
+
|
|
17
15
|
const length = buffer.length;
|
|
18
16
|
if (length === 0) return 0;
|
|
19
17
|
if (length > maxLength) throw new TypeError('Script number overflow');
|
|
@@ -23,56 +21,52 @@ function decode(buffer, maxLength, minimal) {
|
|
|
23
21
|
throw new Error('Non-minimally encoded script number');
|
|
24
22
|
}
|
|
25
23
|
}
|
|
24
|
+
|
|
26
25
|
// 40-bit
|
|
27
26
|
if (length === 5) {
|
|
28
27
|
const a = buffer.readUInt32LE(0);
|
|
29
28
|
const b = buffer.readUInt8(4);
|
|
29
|
+
|
|
30
30
|
if (b & 0x80) return -((b & ~0x80) * 0x100000000 + a);
|
|
31
31
|
return b * 0x100000000 + a;
|
|
32
32
|
}
|
|
33
|
+
|
|
33
34
|
// 32-bit / 24-bit / 16-bit / 8-bit
|
|
34
35
|
let result = 0;
|
|
35
36
|
for (let i = 0; i < length; ++i) {
|
|
36
37
|
result |= buffer[i] << (8 * i);
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
if (buffer[length - 1] & 0x80) return -(result & ~(0x80 << (8 * (length - 1))));
|
|
40
41
|
return result;
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
function scriptNumSize(i) {
|
|
44
|
-
return i > 0x7fffffff
|
|
45
|
-
? 5
|
|
46
|
-
: i > 0x7fffff
|
|
47
|
-
? 4
|
|
48
|
-
: i > 0x7fff
|
|
49
|
-
? 3
|
|
50
|
-
: i > 0x7f
|
|
51
|
-
? 2
|
|
52
|
-
: i > 0x00
|
|
53
|
-
? 1
|
|
54
|
-
: 0;
|
|
43
|
+
|
|
44
|
+
function scriptNumSize(i: number): number {
|
|
45
|
+
return i > 0x7fffffff ? 5 : i > 0x7fffff ? 4 : i > 0x7fff ? 3 : i > 0x7f ? 2 : i > 0x00 ? 1 : 0;
|
|
55
46
|
}
|
|
47
|
+
|
|
56
48
|
/**
|
|
57
49
|
* Encodes a number into a Buffer using a specific format.
|
|
58
50
|
*
|
|
59
51
|
* @param _number - The number to encode.
|
|
60
52
|
* @returns The encoded number as a Buffer.
|
|
61
53
|
*/
|
|
62
|
-
function encode(_number) {
|
|
54
|
+
export function encode(_number: number): Buffer {
|
|
63
55
|
let value = Math.abs(_number);
|
|
64
56
|
const size = scriptNumSize(value);
|
|
65
57
|
const buffer = Buffer.allocUnsafe(size);
|
|
66
58
|
const negative = _number < 0;
|
|
59
|
+
|
|
67
60
|
for (let i = 0; i < size; ++i) {
|
|
68
61
|
buffer.writeUInt8(value & 0xff, i);
|
|
69
62
|
value >>= 8;
|
|
70
63
|
}
|
|
64
|
+
|
|
71
65
|
if (buffer[size - 1] & 0x80) {
|
|
72
66
|
buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1);
|
|
73
67
|
} else if (negative) {
|
|
74
68
|
buffer[size - 1] |= 0x80;
|
|
75
69
|
}
|
|
70
|
+
|
|
76
71
|
return buffer;
|
|
77
72
|
}
|
|
78
|
-
exports.encode = encode;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const script_1 = require('./script');
|
|
6
|
-
const types = require('./types');
|
|
1
|
+
import * as bip66 from './bip66.js';
|
|
2
|
+
import { isDefinedHashType } from './script.js';
|
|
3
|
+
import * as types from './types.js';
|
|
4
|
+
|
|
7
5
|
const { typeforce } = types;
|
|
6
|
+
|
|
8
7
|
const ZERO = Buffer.alloc(1, 0);
|
|
8
|
+
|
|
9
9
|
/**
|
|
10
10
|
* Converts a buffer to a DER-encoded buffer.
|
|
11
11
|
* @param x - The buffer to be converted.
|
|
12
12
|
* @returns The DER-encoded buffer.
|
|
13
13
|
*/
|
|
14
|
-
function toDER(x) {
|
|
14
|
+
function toDER(x: Buffer): Buffer {
|
|
15
15
|
let i = 0;
|
|
16
16
|
while (x[i] === 0) ++i;
|
|
17
17
|
if (i === x.length) return ZERO;
|
|
@@ -19,6 +19,7 @@ function toDER(x) {
|
|
|
19
19
|
if (x[0] & 0x80) return Buffer.concat([ZERO, x], 1 + x.length);
|
|
20
20
|
return x;
|
|
21
21
|
}
|
|
22
|
+
|
|
22
23
|
/**
|
|
23
24
|
* Converts a DER-encoded signature to a buffer.
|
|
24
25
|
* If the first byte of the input buffer is 0x00, it is skipped.
|
|
@@ -26,13 +27,19 @@ function toDER(x) {
|
|
|
26
27
|
* @param x - The DER-encoded signature.
|
|
27
28
|
* @returns The converted buffer.
|
|
28
29
|
*/
|
|
29
|
-
function fromDER(x) {
|
|
30
|
+
function fromDER(x: Buffer): Buffer {
|
|
30
31
|
if (x[0] === 0x00) x = x.slice(1);
|
|
31
32
|
const buffer = Buffer.alloc(32, 0);
|
|
32
33
|
const bstart = Math.max(0, 32 - x.length);
|
|
33
34
|
x.copy(buffer, bstart);
|
|
34
35
|
return buffer;
|
|
35
36
|
}
|
|
37
|
+
|
|
38
|
+
interface ScriptSignature {
|
|
39
|
+
signature: Buffer;
|
|
40
|
+
hashType: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
36
43
|
// BIP62: 1 byte hashType flag (only 0x01, 0x02, 0x03, 0x81, 0x82 and 0x83 are allowed)
|
|
37
44
|
/**
|
|
38
45
|
* Decodes a buffer into a ScriptSignature object.
|
|
@@ -40,18 +47,20 @@ function fromDER(x) {
|
|
|
40
47
|
* @returns The decoded ScriptSignature object.
|
|
41
48
|
* @throws Error if the hashType is invalid.
|
|
42
49
|
*/
|
|
43
|
-
function decode(buffer) {
|
|
50
|
+
export function decode(buffer: Buffer): ScriptSignature {
|
|
44
51
|
const hashType = buffer.readUInt8(buffer.length - 1);
|
|
45
|
-
if (!
|
|
52
|
+
if (!isDefinedHashType(hashType)) {
|
|
46
53
|
throw new Error('Invalid hashType ' + hashType);
|
|
47
54
|
}
|
|
55
|
+
|
|
48
56
|
const decoded = bip66.decode(buffer.slice(0, -1));
|
|
49
57
|
const r = fromDER(decoded.r);
|
|
50
58
|
const s = fromDER(decoded.s);
|
|
51
59
|
const signature = Buffer.concat([r, s], 64);
|
|
60
|
+
|
|
52
61
|
return { signature, hashType };
|
|
53
62
|
}
|
|
54
|
-
|
|
63
|
+
|
|
55
64
|
/**
|
|
56
65
|
* Encodes a signature and hash type into a buffer.
|
|
57
66
|
* @param signature - The signature to encode.
|
|
@@ -59,7 +68,7 @@ exports.decode = decode;
|
|
|
59
68
|
* @returns The encoded buffer.
|
|
60
69
|
* @throws Error if the hashType is invalid.
|
|
61
70
|
*/
|
|
62
|
-
function encode(signature, hashType) {
|
|
71
|
+
export function encode(signature: Buffer, hashType: number): Buffer {
|
|
63
72
|
typeforce(
|
|
64
73
|
{
|
|
65
74
|
signature: types.BufferN(64),
|
|
@@ -67,13 +76,16 @@ function encode(signature, hashType) {
|
|
|
67
76
|
},
|
|
68
77
|
{ signature, hashType },
|
|
69
78
|
);
|
|
70
|
-
|
|
79
|
+
|
|
80
|
+
if (!isDefinedHashType(hashType)) {
|
|
71
81
|
throw new Error('Invalid hashType ' + hashType);
|
|
72
82
|
}
|
|
83
|
+
|
|
73
84
|
const hashTypeBuffer = Buffer.allocUnsafe(1);
|
|
74
85
|
hashTypeBuffer.writeUInt8(hashType, 0);
|
|
86
|
+
|
|
75
87
|
const r = toDER(signature.slice(0, 32));
|
|
76
88
|
const s = toDER(signature.slice(32, 64));
|
|
89
|
+
|
|
77
90
|
return Buffer.concat([bip66.encode(r, s), hashTypeBuffer]);
|
|
78
91
|
}
|
|
79
|
-
exports.encode = encode;
|