@btc-vision/bitcoin 6.3.0 → 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 -235
- 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.ts +235 -0
- 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} +195 -178
- package/src/psbt/psbtutils.ts +299 -0
- package/src/{psbt.js → psbt.ts} +1048 -699
- 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 -29
- package/src/networks.js +0 -71
- 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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function encodingLength(i: number): number;
|
|
2
|
+
export declare function encode(buffer: Buffer, num: number, offset: number): number;
|
|
3
|
+
export declare function decode(buffer: Buffer, offset: number): {
|
|
4
|
+
opcode: number;
|
|
5
|
+
number: number;
|
|
6
|
+
size: number;
|
|
7
|
+
} | null;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { OPS } from './ops.js';
|
|
2
|
+
export function encodingLength(i) {
|
|
3
|
+
return i < OPS.OP_PUSHDATA1 ? 1 : i <= 0xff ? 2 : i <= 0xffff ? 3 : 5;
|
|
4
|
+
}
|
|
5
|
+
export function encode(buffer, num, offset) {
|
|
6
|
+
const size = encodingLength(num);
|
|
7
|
+
if (size === 1) {
|
|
8
|
+
buffer.writeUInt8(num, offset);
|
|
9
|
+
}
|
|
10
|
+
else if (size === 2) {
|
|
11
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA1, offset);
|
|
12
|
+
buffer.writeUInt8(num, offset + 1);
|
|
13
|
+
}
|
|
14
|
+
else if (size === 3) {
|
|
15
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA2, offset);
|
|
16
|
+
buffer.writeUInt16LE(num, offset + 1);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
buffer.writeUInt8(OPS.OP_PUSHDATA4, offset);
|
|
20
|
+
buffer.writeUInt32LE(num, offset + 1);
|
|
21
|
+
}
|
|
22
|
+
return size;
|
|
23
|
+
}
|
|
24
|
+
export function decode(buffer, offset) {
|
|
25
|
+
const opcode = buffer.readUInt8(offset);
|
|
26
|
+
let num;
|
|
27
|
+
let size;
|
|
28
|
+
if (opcode < OPS.OP_PUSHDATA1) {
|
|
29
|
+
num = opcode;
|
|
30
|
+
size = 1;
|
|
31
|
+
}
|
|
32
|
+
else if (opcode === OPS.OP_PUSHDATA1) {
|
|
33
|
+
if (offset + 2 > buffer.length)
|
|
34
|
+
return null;
|
|
35
|
+
num = buffer.readUInt8(offset + 1);
|
|
36
|
+
size = 2;
|
|
37
|
+
}
|
|
38
|
+
else if (opcode === OPS.OP_PUSHDATA2) {
|
|
39
|
+
if (offset + 3 > buffer.length)
|
|
40
|
+
return null;
|
|
41
|
+
num = buffer.readUInt16LE(offset + 1);
|
|
42
|
+
size = 3;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (offset + 5 > buffer.length)
|
|
46
|
+
return null;
|
|
47
|
+
if (opcode !== OPS.OP_PUSHDATA4)
|
|
48
|
+
throw new Error('Unexpected opcode');
|
|
49
|
+
num = buffer.readUInt32LE(offset + 1);
|
|
50
|
+
size = 5;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
opcode,
|
|
54
|
+
number: num,
|
|
55
|
+
size,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { OPS } from './ops.js';
|
|
2
|
+
import { Stack } from './payments/index.js';
|
|
3
|
+
import * as scriptNumber from './script_number.js';
|
|
4
|
+
import * as scriptSignature from './script_signature.js';
|
|
5
|
+
export { OPS };
|
|
6
|
+
export declare function isPushOnly(value: Stack): boolean;
|
|
7
|
+
export declare function countNonPushOnlyOPs(value: Stack): number;
|
|
8
|
+
export declare function compile(chunks: Buffer | Stack): Buffer;
|
|
9
|
+
export declare function decompile(buffer: Buffer | Array<number | Buffer>): Array<number | Buffer> | null;
|
|
10
|
+
export declare function toASM(chunks: Buffer | Array<number | Buffer>): string;
|
|
11
|
+
export declare function fromASM(asm: string): Buffer;
|
|
12
|
+
export declare function toStack(chunks: Buffer | Array<number | Buffer>): Buffer[];
|
|
13
|
+
export declare function isCanonicalPubKey(buffer: Buffer): boolean;
|
|
14
|
+
export declare function isDefinedHashType(hashType: number): boolean;
|
|
15
|
+
export declare function isCanonicalScriptSignature(buffer: Buffer): boolean;
|
|
16
|
+
export declare const number: typeof scriptNumber;
|
|
17
|
+
export declare const signature: typeof scriptSignature;
|
package/build/script.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as bip66 from './bip66.js';
|
|
2
|
+
import { OPS, REVERSE_OPS } from './ops.js';
|
|
3
|
+
import * as pushdata from './push_data.js';
|
|
4
|
+
import * as scriptNumber from './script_number.js';
|
|
5
|
+
import * as scriptSignature from './script_signature.js';
|
|
6
|
+
import * as types from './types.js';
|
|
7
|
+
const { typeforce } = types;
|
|
8
|
+
const OP_INT_BASE = OPS.OP_RESERVED;
|
|
9
|
+
export { OPS };
|
|
10
|
+
function isOPInt(value) {
|
|
11
|
+
return (types.Number(value) &&
|
|
12
|
+
(value === OPS.OP_0 ||
|
|
13
|
+
(value >= OPS.OP_1 && value <= OPS.OP_16) ||
|
|
14
|
+
value === OPS.OP_1NEGATE));
|
|
15
|
+
}
|
|
16
|
+
function isPushOnlyChunk(value) {
|
|
17
|
+
return types.Buffer(value) || isOPInt(value);
|
|
18
|
+
}
|
|
19
|
+
export function isPushOnly(value) {
|
|
20
|
+
return types.Array(value) && value.every(isPushOnlyChunk);
|
|
21
|
+
}
|
|
22
|
+
export function countNonPushOnlyOPs(value) {
|
|
23
|
+
return value.length - value.filter(isPushOnlyChunk).length;
|
|
24
|
+
}
|
|
25
|
+
function asMinimalOP(buffer) {
|
|
26
|
+
if (buffer.length === 0)
|
|
27
|
+
return OPS.OP_0;
|
|
28
|
+
if (buffer.length !== 1)
|
|
29
|
+
return;
|
|
30
|
+
if (buffer[0] >= 1 && buffer[0] <= 16)
|
|
31
|
+
return OP_INT_BASE + buffer[0];
|
|
32
|
+
if (buffer[0] === 0x81)
|
|
33
|
+
return OPS.OP_1NEGATE;
|
|
34
|
+
}
|
|
35
|
+
function chunksIsBuffer(buf) {
|
|
36
|
+
return Buffer.isBuffer(buf);
|
|
37
|
+
}
|
|
38
|
+
function chunksIsArray(buf) {
|
|
39
|
+
return types.Array(buf);
|
|
40
|
+
}
|
|
41
|
+
function singleChunkIsBuffer(buf) {
|
|
42
|
+
return Buffer.isBuffer(buf);
|
|
43
|
+
}
|
|
44
|
+
export function compile(chunks) {
|
|
45
|
+
if (chunksIsBuffer(chunks))
|
|
46
|
+
return chunks;
|
|
47
|
+
typeforce(types.Array, chunks);
|
|
48
|
+
const bufferSize = chunks.reduce((accum, chunk) => {
|
|
49
|
+
if (singleChunkIsBuffer(chunk)) {
|
|
50
|
+
if (chunk.length === 1 && asMinimalOP(chunk) !== undefined) {
|
|
51
|
+
return accum + 1;
|
|
52
|
+
}
|
|
53
|
+
return accum + pushdata.encodingLength(chunk.length) + chunk.length;
|
|
54
|
+
}
|
|
55
|
+
return accum + 1;
|
|
56
|
+
}, 0.0);
|
|
57
|
+
const buffer = Buffer.allocUnsafe(bufferSize);
|
|
58
|
+
let offset = 0;
|
|
59
|
+
chunks.forEach((chunk) => {
|
|
60
|
+
if (singleChunkIsBuffer(chunk)) {
|
|
61
|
+
const opcode = asMinimalOP(chunk);
|
|
62
|
+
if (opcode !== undefined) {
|
|
63
|
+
buffer.writeUInt8(opcode, offset);
|
|
64
|
+
offset += 1;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
offset += pushdata.encode(buffer, chunk.length, offset);
|
|
68
|
+
chunk.copy(buffer, offset);
|
|
69
|
+
offset += chunk.length;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
buffer.writeUInt8(chunk, offset);
|
|
73
|
+
offset += 1;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
if (offset !== buffer.length)
|
|
77
|
+
throw new Error('Could not decode chunks');
|
|
78
|
+
return buffer;
|
|
79
|
+
}
|
|
80
|
+
export function decompile(buffer) {
|
|
81
|
+
if (chunksIsArray(buffer))
|
|
82
|
+
return buffer;
|
|
83
|
+
typeforce(types.Buffer, buffer);
|
|
84
|
+
const chunks = [];
|
|
85
|
+
let i = 0;
|
|
86
|
+
while (i < buffer.length) {
|
|
87
|
+
const opcode = buffer[i];
|
|
88
|
+
if (opcode > OPS.OP_0 && opcode <= OPS.OP_PUSHDATA4) {
|
|
89
|
+
const d = pushdata.decode(buffer, i);
|
|
90
|
+
if (d === null)
|
|
91
|
+
return null;
|
|
92
|
+
i += d.size;
|
|
93
|
+
if (i + d.number > buffer.length)
|
|
94
|
+
return null;
|
|
95
|
+
const data = buffer.slice(i, i + d.number);
|
|
96
|
+
i += d.number;
|
|
97
|
+
const op = asMinimalOP(data);
|
|
98
|
+
if (op !== undefined) {
|
|
99
|
+
chunks.push(op);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
chunks.push(data);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
chunks.push(opcode);
|
|
107
|
+
i += 1;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return chunks;
|
|
111
|
+
}
|
|
112
|
+
export function toASM(chunks) {
|
|
113
|
+
if (chunksIsBuffer(chunks)) {
|
|
114
|
+
chunks = decompile(chunks);
|
|
115
|
+
}
|
|
116
|
+
if (!chunks) {
|
|
117
|
+
throw new Error('Could not convert invalid chunks to ASM');
|
|
118
|
+
}
|
|
119
|
+
return chunks
|
|
120
|
+
.map((chunk) => {
|
|
121
|
+
if (singleChunkIsBuffer(chunk)) {
|
|
122
|
+
const op = asMinimalOP(chunk);
|
|
123
|
+
if (op === undefined)
|
|
124
|
+
return chunk.toString('hex');
|
|
125
|
+
chunk = op;
|
|
126
|
+
}
|
|
127
|
+
return REVERSE_OPS[chunk];
|
|
128
|
+
})
|
|
129
|
+
.join(' ');
|
|
130
|
+
}
|
|
131
|
+
export function fromASM(asm) {
|
|
132
|
+
typeforce(types.String, asm);
|
|
133
|
+
return compile(asm.split(' ').map((chunkStr) => {
|
|
134
|
+
if (OPS[chunkStr] !== undefined) {
|
|
135
|
+
return OPS[chunkStr];
|
|
136
|
+
}
|
|
137
|
+
typeforce(types.Hex, chunkStr);
|
|
138
|
+
return Buffer.from(chunkStr, 'hex');
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
export function toStack(chunks) {
|
|
142
|
+
chunks = decompile(chunks);
|
|
143
|
+
typeforce(isPushOnly, chunks);
|
|
144
|
+
return chunks.map((op) => {
|
|
145
|
+
if (singleChunkIsBuffer(op))
|
|
146
|
+
return op;
|
|
147
|
+
if (op === OPS.OP_0)
|
|
148
|
+
return Buffer.allocUnsafe(0);
|
|
149
|
+
return scriptNumber.encode(op - OP_INT_BASE);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export function isCanonicalPubKey(buffer) {
|
|
153
|
+
return types.isPoint(buffer);
|
|
154
|
+
}
|
|
155
|
+
export function isDefinedHashType(hashType) {
|
|
156
|
+
const hashTypeMod = hashType & ~0x80;
|
|
157
|
+
return hashTypeMod > 0x00 && hashTypeMod < 0x04;
|
|
158
|
+
}
|
|
159
|
+
export function isCanonicalScriptSignature(buffer) {
|
|
160
|
+
if (!Buffer.isBuffer(buffer))
|
|
161
|
+
return false;
|
|
162
|
+
if (!isDefinedHashType(buffer[buffer.length - 1]))
|
|
163
|
+
return false;
|
|
164
|
+
return bip66.check(buffer.slice(0, -1));
|
|
165
|
+
}
|
|
166
|
+
export const number = scriptNumber;
|
|
167
|
+
export const signature = scriptSignature;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function decode(buffer, maxLength, minimal) {
|
|
2
|
+
maxLength = maxLength || 4;
|
|
3
|
+
minimal = minimal === undefined ? true : minimal;
|
|
4
|
+
const length = buffer.length;
|
|
5
|
+
if (length === 0)
|
|
6
|
+
return 0;
|
|
7
|
+
if (length > maxLength)
|
|
8
|
+
throw new TypeError('Script number overflow');
|
|
9
|
+
if (minimal) {
|
|
10
|
+
if ((buffer[length - 1] & 0x7f) === 0) {
|
|
11
|
+
if (length <= 1 || (buffer[length - 2] & 0x80) === 0)
|
|
12
|
+
throw new Error('Non-minimally encoded script number');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (length === 5) {
|
|
16
|
+
const a = buffer.readUInt32LE(0);
|
|
17
|
+
const b = buffer.readUInt8(4);
|
|
18
|
+
if (b & 0x80)
|
|
19
|
+
return -((b & ~0x80) * 0x100000000 + a);
|
|
20
|
+
return b * 0x100000000 + a;
|
|
21
|
+
}
|
|
22
|
+
let result = 0;
|
|
23
|
+
for (let i = 0; i < length; ++i) {
|
|
24
|
+
result |= buffer[i] << (8 * i);
|
|
25
|
+
}
|
|
26
|
+
if (buffer[length - 1] & 0x80)
|
|
27
|
+
return -(result & ~(0x80 << (8 * (length - 1))));
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
function scriptNumSize(i) {
|
|
31
|
+
return i > 0x7fffffff ? 5 : i > 0x7fffff ? 4 : i > 0x7fff ? 3 : i > 0x7f ? 2 : i > 0x00 ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
export function encode(_number) {
|
|
34
|
+
let value = Math.abs(_number);
|
|
35
|
+
const size = scriptNumSize(value);
|
|
36
|
+
const buffer = Buffer.allocUnsafe(size);
|
|
37
|
+
const negative = _number < 0;
|
|
38
|
+
for (let i = 0; i < size; ++i) {
|
|
39
|
+
buffer.writeUInt8(value & 0xff, i);
|
|
40
|
+
value >>= 8;
|
|
41
|
+
}
|
|
42
|
+
if (buffer[size - 1] & 0x80) {
|
|
43
|
+
buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1);
|
|
44
|
+
}
|
|
45
|
+
else if (negative) {
|
|
46
|
+
buffer[size - 1] |= 0x80;
|
|
47
|
+
}
|
|
48
|
+
return buffer;
|
|
49
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as bip66 from './bip66.js';
|
|
2
|
+
import { isDefinedHashType } from './script.js';
|
|
3
|
+
import * as types from './types.js';
|
|
4
|
+
const { typeforce } = types;
|
|
5
|
+
const ZERO = Buffer.alloc(1, 0);
|
|
6
|
+
function toDER(x) {
|
|
7
|
+
let i = 0;
|
|
8
|
+
while (x[i] === 0)
|
|
9
|
+
++i;
|
|
10
|
+
if (i === x.length)
|
|
11
|
+
return ZERO;
|
|
12
|
+
x = x.slice(i);
|
|
13
|
+
if (x[0] & 0x80)
|
|
14
|
+
return Buffer.concat([ZERO, x], 1 + x.length);
|
|
15
|
+
return x;
|
|
16
|
+
}
|
|
17
|
+
function fromDER(x) {
|
|
18
|
+
if (x[0] === 0x00)
|
|
19
|
+
x = x.slice(1);
|
|
20
|
+
const buffer = Buffer.alloc(32, 0);
|
|
21
|
+
const bstart = Math.max(0, 32 - x.length);
|
|
22
|
+
x.copy(buffer, bstart);
|
|
23
|
+
return buffer;
|
|
24
|
+
}
|
|
25
|
+
export function decode(buffer) {
|
|
26
|
+
const hashType = buffer.readUInt8(buffer.length - 1);
|
|
27
|
+
if (!isDefinedHashType(hashType)) {
|
|
28
|
+
throw new Error('Invalid hashType ' + hashType);
|
|
29
|
+
}
|
|
30
|
+
const decoded = bip66.decode(buffer.slice(0, -1));
|
|
31
|
+
const r = fromDER(decoded.r);
|
|
32
|
+
const s = fromDER(decoded.s);
|
|
33
|
+
const signature = Buffer.concat([r, s], 64);
|
|
34
|
+
return { signature, hashType };
|
|
35
|
+
}
|
|
36
|
+
export function encode(signature, hashType) {
|
|
37
|
+
typeforce({
|
|
38
|
+
signature: types.BufferN(64),
|
|
39
|
+
hashType: types.UInt8,
|
|
40
|
+
}, { signature, hashType });
|
|
41
|
+
if (!isDefinedHashType(hashType)) {
|
|
42
|
+
throw new Error('Invalid hashType ' + hashType);
|
|
43
|
+
}
|
|
44
|
+
const hashTypeBuffer = Buffer.allocUnsafe(1);
|
|
45
|
+
hashTypeBuffer.writeUInt8(hashType, 0);
|
|
46
|
+
const r = toDER(signature.slice(0, 32));
|
|
47
|
+
const s = toDER(signature.slice(32, 64));
|
|
48
|
+
return Buffer.concat([bip66.encode(r, s), hashTypeBuffer]);
|
|
49
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface Output {
|
|
2
|
+
script: Buffer;
|
|
3
|
+
value: number;
|
|
4
|
+
}
|
|
5
|
+
export interface Input {
|
|
6
|
+
hash: Buffer;
|
|
7
|
+
index: number;
|
|
8
|
+
script: Buffer;
|
|
9
|
+
sequence: number;
|
|
10
|
+
witness: Buffer[];
|
|
11
|
+
}
|
|
12
|
+
export declare class Transaction {
|
|
13
|
+
static readonly DEFAULT_SEQUENCE = 4294967295;
|
|
14
|
+
static readonly SIGHASH_DEFAULT = 0;
|
|
15
|
+
static readonly SIGHASH_ALL = 1;
|
|
16
|
+
static readonly SIGHASH_NONE = 2;
|
|
17
|
+
static readonly SIGHASH_SINGLE = 3;
|
|
18
|
+
static readonly SIGHASH_ANYONECANPAY = 128;
|
|
19
|
+
static readonly SIGHASH_OUTPUT_MASK = 3;
|
|
20
|
+
static readonly SIGHASH_INPUT_MASK = 128;
|
|
21
|
+
static readonly ADVANCED_TRANSACTION_MARKER = 0;
|
|
22
|
+
static readonly ADVANCED_TRANSACTION_FLAG = 1;
|
|
23
|
+
version: number;
|
|
24
|
+
locktime: number;
|
|
25
|
+
ins: Input[];
|
|
26
|
+
outs: Output[];
|
|
27
|
+
static fromBuffer(buffer: Buffer, _NO_STRICT?: boolean): Transaction;
|
|
28
|
+
static fromHex(hex: string): Transaction;
|
|
29
|
+
static isCoinbaseHash(buffer: Buffer): boolean;
|
|
30
|
+
isCoinbase(): boolean;
|
|
31
|
+
addInput(hash: Buffer, index: number, sequence?: number, scriptSig?: Buffer): number;
|
|
32
|
+
addOutput(scriptPubKey: Buffer, value: number): number;
|
|
33
|
+
hasWitnesses(): boolean;
|
|
34
|
+
weight(): number;
|
|
35
|
+
virtualSize(): number;
|
|
36
|
+
byteLength(_ALLOW_WITNESS?: boolean): number;
|
|
37
|
+
clone(): Transaction;
|
|
38
|
+
hashForSignature(inIndex: number, prevOutScript: Buffer, hashType: number): Buffer;
|
|
39
|
+
hashForWitnessV1(inIndex: number, prevOutScripts: Buffer[], values: number[], hashType: number, leafHash?: Buffer, annex?: Buffer): Buffer;
|
|
40
|
+
hashForWitnessV0(inIndex: number, prevOutScript: Buffer, value: number, hashType: number): Buffer;
|
|
41
|
+
getHash(forWitness?: boolean): Buffer;
|
|
42
|
+
getId(): string;
|
|
43
|
+
toBuffer(buffer?: Buffer, initialOffset?: number): Buffer;
|
|
44
|
+
toHex(): string;
|
|
45
|
+
setInputScript(index: number, scriptSig: Buffer): void;
|
|
46
|
+
setWitness(index: number, witness: Buffer[]): void;
|
|
47
|
+
private __toBuffer;
|
|
48
|
+
}
|