@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
package/src/crypto.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A module for hashing functions.
|
|
3
|
+
* include ripemd160、sha1、sha256、hash160、hash256、taggedHash
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
import { ripemd160 as _ripemd160 } from '@noble/hashes/ripemd160';
|
|
8
|
+
import { sha1 as _sha1 } from '@noble/hashes/sha1';
|
|
9
|
+
import { sha256 as _sha256 } from '@noble/hashes/sha256';
|
|
10
|
+
|
|
11
|
+
export function ripemd160(buffer: Buffer): Buffer {
|
|
12
|
+
return Buffer.from(_ripemd160(Uint8Array.from(buffer)));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function sha1(buffer: Buffer): Buffer {
|
|
16
|
+
return Buffer.from(_sha1(Uint8Array.from(buffer)));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function sha256(buffer: Buffer): Buffer {
|
|
20
|
+
return Buffer.from(_sha256(Uint8Array.from(buffer)));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function hash160(buffer: Buffer): Buffer {
|
|
24
|
+
return Buffer.from(_ripemd160(_sha256(Uint8Array.from(buffer))));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function hash256(buffer: Buffer): Buffer {
|
|
28
|
+
return Buffer.from(_sha256(_sha256(Uint8Array.from(buffer))));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const TAGS = [
|
|
32
|
+
'BIP0340/challenge',
|
|
33
|
+
'BIP0340/aux',
|
|
34
|
+
'BIP0340/nonce',
|
|
35
|
+
'TapLeaf',
|
|
36
|
+
'TapBranch',
|
|
37
|
+
'TapSighash',
|
|
38
|
+
'TapTweak',
|
|
39
|
+
'KeyAgg list',
|
|
40
|
+
'KeyAgg coefficient',
|
|
41
|
+
] as const;
|
|
42
|
+
export type TaggedHashPrefix = typeof TAGS[number];
|
|
43
|
+
type TaggedHashPrefixes = {
|
|
44
|
+
[key in TaggedHashPrefix]: Buffer;
|
|
45
|
+
};
|
|
46
|
+
/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */
|
|
47
|
+
/**
|
|
48
|
+
* Defines the tagged hash prefixes used in the crypto module.
|
|
49
|
+
*/
|
|
50
|
+
export const TAGGED_HASH_PREFIXES: TaggedHashPrefixes = {
|
|
51
|
+
'BIP0340/challenge': Buffer.from([
|
|
52
|
+
123, 181, 45, 122, 159, 239, 88, 50, 62, 177, 191, 122, 64, 125, 179, 130, 210, 243, 242,
|
|
53
|
+
216, 27, 177, 34, 79, 73, 254, 81, 143, 109, 72, 211, 124, 123, 181, 45, 122, 159, 239, 88,
|
|
54
|
+
50, 62, 177, 191, 122, 64, 125, 179, 130, 210, 243, 242, 216, 27, 177, 34, 79, 73, 254, 81,
|
|
55
|
+
143, 109, 72, 211, 124,
|
|
56
|
+
]),
|
|
57
|
+
'BIP0340/aux': Buffer.from([
|
|
58
|
+
241, 239, 78, 94, 192, 99, 202, 218, 109, 148, 202, 250, 157, 152, 126, 160, 105, 38, 88,
|
|
59
|
+
57, 236, 193, 31, 151, 45, 119, 165, 46, 216, 193, 204, 144, 241, 239, 78, 94, 192, 99, 202,
|
|
60
|
+
218, 109, 148, 202, 250, 157, 152, 126, 160, 105, 38, 88, 57, 236, 193, 31, 151, 45, 119,
|
|
61
|
+
165, 46, 216, 193, 204, 144,
|
|
62
|
+
]),
|
|
63
|
+
'BIP0340/nonce': Buffer.from([
|
|
64
|
+
7, 73, 119, 52, 167, 155, 203, 53, 91, 155, 140, 125, 3, 79, 18, 28, 244, 52, 215, 62, 247,
|
|
65
|
+
45, 218, 25, 135, 0, 97, 251, 82, 191, 235, 47, 7, 73, 119, 52, 167, 155, 203, 53, 91, 155,
|
|
66
|
+
140, 125, 3, 79, 18, 28, 244, 52, 215, 62, 247, 45, 218, 25, 135, 0, 97, 251, 82, 191, 235,
|
|
67
|
+
47,
|
|
68
|
+
]),
|
|
69
|
+
TapLeaf: Buffer.from([
|
|
70
|
+
174, 234, 143, 220, 66, 8, 152, 49, 5, 115, 75, 88, 8, 29, 30, 38, 56, 211, 95, 28, 181, 64,
|
|
71
|
+
8, 212, 211, 87, 202, 3, 190, 120, 233, 238, 174, 234, 143, 220, 66, 8, 152, 49, 5, 115, 75,
|
|
72
|
+
88, 8, 29, 30, 38, 56, 211, 95, 28, 181, 64, 8, 212, 211, 87, 202, 3, 190, 120, 233, 238,
|
|
73
|
+
]),
|
|
74
|
+
TapBranch: Buffer.from([
|
|
75
|
+
25, 65, 161, 242, 229, 110, 185, 95, 162, 169, 241, 148, 190, 92, 1, 247, 33, 111, 51, 237,
|
|
76
|
+
130, 176, 145, 70, 52, 144, 208, 91, 245, 22, 160, 21, 25, 65, 161, 242, 229, 110, 185, 95,
|
|
77
|
+
162, 169, 241, 148, 190, 92, 1, 247, 33, 111, 51, 237, 130, 176, 145, 70, 52, 144, 208, 91,
|
|
78
|
+
245, 22, 160, 21,
|
|
79
|
+
]),
|
|
80
|
+
TapSighash: Buffer.from([
|
|
81
|
+
244, 10, 72, 223, 75, 42, 112, 200, 180, 146, 75, 242, 101, 70, 97, 237, 61, 149, 253, 102,
|
|
82
|
+
163, 19, 235, 135, 35, 117, 151, 198, 40, 228, 160, 49, 244, 10, 72, 223, 75, 42, 112, 200,
|
|
83
|
+
180, 146, 75, 242, 101, 70, 97, 237, 61, 149, 253, 102, 163, 19, 235, 135, 35, 117, 151,
|
|
84
|
+
198, 40, 228, 160, 49,
|
|
85
|
+
]),
|
|
86
|
+
TapTweak: Buffer.from([
|
|
87
|
+
232, 15, 225, 99, 156, 156, 160, 80, 227, 175, 27, 57, 193, 67, 198, 62, 66, 156, 188, 235,
|
|
88
|
+
21, 217, 64, 251, 181, 197, 161, 244, 175, 87, 197, 233, 232, 15, 225, 99, 156, 156, 160,
|
|
89
|
+
80, 227, 175, 27, 57, 193, 67, 198, 62, 66, 156, 188, 235, 21, 217, 64, 251, 181, 197, 161,
|
|
90
|
+
244, 175, 87, 197, 233,
|
|
91
|
+
]),
|
|
92
|
+
'KeyAgg list': Buffer.from([
|
|
93
|
+
72, 28, 151, 28, 60, 11, 70, 215, 240, 178, 117, 174, 89, 141, 78, 44, 126, 215, 49, 156,
|
|
94
|
+
89, 74, 92, 110, 199, 158, 160, 212, 153, 2, 148, 240, 72, 28, 151, 28, 60, 11, 70, 215,
|
|
95
|
+
240, 178, 117, 174, 89, 141, 78, 44, 126, 215, 49, 156, 89, 74, 92, 110, 199, 158, 160, 212,
|
|
96
|
+
153, 2, 148, 240,
|
|
97
|
+
]),
|
|
98
|
+
'KeyAgg coefficient': Buffer.from([
|
|
99
|
+
191, 201, 4, 3, 77, 28, 136, 232, 200, 14, 34, 229, 61, 36, 86, 109, 100, 130, 78, 214, 66,
|
|
100
|
+
114, 129, 192, 145, 0, 249, 77, 205, 82, 201, 129, 191, 201, 4, 3, 77, 28, 136, 232, 200,
|
|
101
|
+
14, 34, 229, 61, 36, 86, 109, 100, 130, 78, 214, 66, 114, 129, 192, 145, 0, 249, 77, 205,
|
|
102
|
+
82, 201, 129,
|
|
103
|
+
]),
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export function taggedHash(prefix: TaggedHashPrefix, data: Buffer): Buffer {
|
|
107
|
+
return sha256(Buffer.concat([TAGGED_HASH_PREFIXES[prefix], data]));
|
|
108
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { TinySecp256k1Interface } from './types.js';
|
|
2
|
+
|
|
3
|
+
const _ECCLIB_CACHE: { eccLib?: TinySecp256k1Interface } = {};
|
|
4
|
+
|
|
5
5
|
/**
|
|
6
6
|
* Initializes the ECC library with the provided instance.
|
|
7
7
|
* If `eccLib` is `undefined`, the library will be cleared.
|
|
@@ -9,17 +9,17 @@ const _ECCLIB_CACHE = {};
|
|
|
9
9
|
*
|
|
10
10
|
* @param eccLib The instance of the ECC library to initialize.
|
|
11
11
|
*/
|
|
12
|
-
function initEccLib(eccLib) {
|
|
12
|
+
export function initEccLib(eccLib: TinySecp256k1Interface | undefined): void {
|
|
13
13
|
if (!eccLib) {
|
|
14
14
|
// allow clearing the library
|
|
15
15
|
_ECCLIB_CACHE.eccLib = eccLib;
|
|
16
16
|
} else if (eccLib !== _ECCLIB_CACHE.eccLib) {
|
|
17
17
|
// new instance, verify it
|
|
18
|
-
verifyEcc(eccLib);
|
|
18
|
+
verifyEcc(eccLib!);
|
|
19
19
|
_ECCLIB_CACHE.eccLib = eccLib;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
/**
|
|
24
24
|
* Retrieves the ECC Library instance.
|
|
25
25
|
* Throws an error if the ECC Library is not provided.
|
|
@@ -27,79 +27,51 @@ exports.initEccLib = initEccLib;
|
|
|
27
27
|
* @returns The ECC Library instance.
|
|
28
28
|
* @throws Error if the ECC Library is not provided.
|
|
29
29
|
*/
|
|
30
|
-
function getEccLib() {
|
|
30
|
+
export function getEccLib(): TinySecp256k1Interface {
|
|
31
31
|
if (!_ECCLIB_CACHE.eccLib)
|
|
32
32
|
throw new Error(
|
|
33
33
|
'No ECC Library provided. You must call initEccLib() with a valid TinySecp256k1Interface instance',
|
|
34
34
|
);
|
|
35
35
|
return _ECCLIB_CACHE.eccLib;
|
|
36
36
|
}
|
|
37
|
-
|
|
38
|
-
const h = hex => Buffer.from(hex, 'hex');
|
|
37
|
+
|
|
38
|
+
const h = (hex: string): Buffer => Buffer.from(hex, 'hex');
|
|
39
|
+
|
|
39
40
|
/**
|
|
40
41
|
* Verifies the ECC functionality.
|
|
41
42
|
*
|
|
42
43
|
* @param ecc - The TinySecp256k1Interface object.
|
|
43
44
|
*/
|
|
44
|
-
function verifyEcc(ecc) {
|
|
45
|
+
function verifyEcc(ecc: TinySecp256k1Interface): void {
|
|
45
46
|
assert(typeof ecc.isXOnlyPoint === 'function');
|
|
47
|
+
assert(ecc.isXOnlyPoint(h('79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')));
|
|
48
|
+
assert(ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffeeffffc2e')));
|
|
49
|
+
assert(ecc.isXOnlyPoint(h('f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9')));
|
|
50
|
+
assert(ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000001')));
|
|
46
51
|
assert(
|
|
47
|
-
ecc.isXOnlyPoint(
|
|
48
|
-
h(
|
|
49
|
-
'79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
50
|
-
),
|
|
51
|
-
),
|
|
52
|
+
!ecc.isXOnlyPoint(h('0000000000000000000000000000000000000000000000000000000000000000')),
|
|
52
53
|
);
|
|
53
54
|
assert(
|
|
54
|
-
ecc.isXOnlyPoint(
|
|
55
|
-
h(
|
|
56
|
-
'fffffffffffffffffffffffffffffffffffffffffffffffffffffffeeffffc2e',
|
|
57
|
-
),
|
|
58
|
-
),
|
|
59
|
-
);
|
|
60
|
-
assert(
|
|
61
|
-
ecc.isXOnlyPoint(
|
|
62
|
-
h(
|
|
63
|
-
'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',
|
|
64
|
-
),
|
|
65
|
-
),
|
|
66
|
-
);
|
|
67
|
-
assert(
|
|
68
|
-
ecc.isXOnlyPoint(
|
|
69
|
-
h(
|
|
70
|
-
'0000000000000000000000000000000000000000000000000000000000000001',
|
|
71
|
-
),
|
|
72
|
-
),
|
|
73
|
-
);
|
|
74
|
-
assert(
|
|
75
|
-
!ecc.isXOnlyPoint(
|
|
76
|
-
h(
|
|
77
|
-
'0000000000000000000000000000000000000000000000000000000000000000',
|
|
78
|
-
),
|
|
79
|
-
),
|
|
80
|
-
);
|
|
81
|
-
assert(
|
|
82
|
-
!ecc.isXOnlyPoint(
|
|
83
|
-
h(
|
|
84
|
-
'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f',
|
|
85
|
-
),
|
|
86
|
-
),
|
|
55
|
+
!ecc.isXOnlyPoint(h('fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f')),
|
|
87
56
|
);
|
|
57
|
+
|
|
88
58
|
assert(typeof ecc.xOnlyPointAddTweak === 'function');
|
|
89
|
-
tweakAddVectors.forEach(t => {
|
|
59
|
+
tweakAddVectors.forEach((t) => {
|
|
90
60
|
const r = ecc.xOnlyPointAddTweak(h(t.pubkey), h(t.tweak));
|
|
91
61
|
if (t.result === null) {
|
|
92
62
|
assert(r === null);
|
|
93
63
|
} else {
|
|
94
64
|
assert(r !== null);
|
|
95
|
-
assert(r
|
|
96
|
-
assert(Buffer.from(r
|
|
65
|
+
assert(r!.parity === t.parity);
|
|
66
|
+
assert(Buffer.from(r!.xOnlyPubkey).equals(h(t.result)));
|
|
97
67
|
}
|
|
98
68
|
});
|
|
99
69
|
}
|
|
100
|
-
|
|
70
|
+
|
|
71
|
+
function assert(bool: boolean): void {
|
|
101
72
|
if (!bool) throw new Error('ecc library invalid');
|
|
102
73
|
}
|
|
74
|
+
|
|
103
75
|
const tweakAddVectors = [
|
|
104
76
|
{
|
|
105
77
|
pubkey: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
@@ -1,24 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export interface CacheEntry {
|
|
2
|
+
pubKey: string;
|
|
3
|
+
dataRef: WeakRef<Buffer>;
|
|
4
|
+
signature: Buffer;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export class AdvancedSignatureManager {
|
|
8
|
+
private static instance: AdvancedSignatureManager;
|
|
9
|
+
|
|
6
10
|
/**
|
|
7
11
|
* Map to index cache entries by signer public key.
|
|
8
12
|
* Key: Public Key (string)
|
|
9
13
|
* Value: Set of CacheEntries
|
|
10
14
|
*/
|
|
11
|
-
cacheBySigner = new Map();
|
|
15
|
+
private cacheBySigner: Map<string, Set<CacheEntry>> = new Map();
|
|
16
|
+
|
|
12
17
|
/**
|
|
13
18
|
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
14
19
|
*/
|
|
15
|
-
registry
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
private registry: FinalizationRegistry<CacheEntry>;
|
|
21
|
+
|
|
22
|
+
private constructor() {
|
|
23
|
+
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
18
24
|
// Remove the entry directly using its pubKey
|
|
19
25
|
const set = this.cacheBySigner.get(entry.pubKey);
|
|
20
26
|
if (set) {
|
|
21
27
|
set.delete(entry);
|
|
28
|
+
|
|
22
29
|
// Clean up the set if it's empty
|
|
23
30
|
if (set.size === 0) {
|
|
24
31
|
this.cacheBySigner.delete(entry.pubKey);
|
|
@@ -26,43 +33,51 @@ class AdvancedSignatureManager {
|
|
|
26
33
|
}
|
|
27
34
|
});
|
|
28
35
|
}
|
|
36
|
+
|
|
29
37
|
// Singleton instance accessor
|
|
30
|
-
static getInstance() {
|
|
38
|
+
public static getInstance(): AdvancedSignatureManager {
|
|
31
39
|
if (!AdvancedSignatureManager.instance) {
|
|
32
40
|
AdvancedSignatureManager.instance = new AdvancedSignatureManager();
|
|
33
41
|
}
|
|
34
42
|
return AdvancedSignatureManager.instance;
|
|
35
43
|
}
|
|
44
|
+
|
|
36
45
|
/**
|
|
37
46
|
* Adds (caches) the signature for the given data buffer and signer public key.
|
|
38
47
|
* @param pubKey The signer's public key.
|
|
39
48
|
* @param data The data buffer.
|
|
40
49
|
* @param signature The signature buffer.
|
|
41
50
|
*/
|
|
42
|
-
addSignature(pubKey, data, signature) {
|
|
43
|
-
const entry = {
|
|
51
|
+
public addSignature(pubKey: string, data: Buffer, signature: Buffer): Buffer {
|
|
52
|
+
const entry: CacheEntry = {
|
|
44
53
|
pubKey,
|
|
45
54
|
dataRef: new WeakRef(data),
|
|
46
55
|
signature,
|
|
47
56
|
};
|
|
57
|
+
|
|
48
58
|
if (!this.cacheBySigner.has(pubKey)) {
|
|
49
|
-
this.cacheBySigner.set(pubKey, new Set());
|
|
59
|
+
this.cacheBySigner.set(pubKey, new Set<CacheEntry>());
|
|
50
60
|
}
|
|
51
|
-
|
|
61
|
+
|
|
62
|
+
const set = this.cacheBySigner.get(pubKey)!;
|
|
52
63
|
set.add(entry);
|
|
64
|
+
|
|
53
65
|
// Register the data buffer with the FinalizationRegistry.
|
|
54
66
|
this.registry.register(data, entry);
|
|
67
|
+
|
|
55
68
|
return signature;
|
|
56
69
|
}
|
|
70
|
+
|
|
57
71
|
/**
|
|
58
72
|
* Retrieves the signature for the given data buffer and signer public key.
|
|
59
73
|
* @param pubKey The signer's public key.
|
|
60
74
|
* @param data The data buffer.
|
|
61
75
|
* @returns The signature buffer if found; otherwise, undefined.
|
|
62
76
|
*/
|
|
63
|
-
getSignature(pubKey, data) {
|
|
77
|
+
public getSignature(pubKey: string, data: Buffer): Buffer | undefined {
|
|
64
78
|
const set = this.cacheBySigner.get(pubKey);
|
|
65
79
|
if (!set) return undefined;
|
|
80
|
+
|
|
66
81
|
for (const entry of set) {
|
|
67
82
|
const cachedData = entry.dataRef.deref();
|
|
68
83
|
if (cachedData && cachedData.equals(data)) {
|
|
@@ -71,18 +86,19 @@ class AdvancedSignatureManager {
|
|
|
71
86
|
}
|
|
72
87
|
return undefined;
|
|
73
88
|
}
|
|
89
|
+
|
|
74
90
|
/**
|
|
75
91
|
* Use with caution as it removes all cached signatures for all signers.
|
|
76
92
|
*/
|
|
77
|
-
clearCache() {
|
|
93
|
+
public clearCache(): void {
|
|
78
94
|
this.cacheBySigner.clear();
|
|
79
95
|
}
|
|
96
|
+
|
|
80
97
|
/**
|
|
81
98
|
* Clears the cache for a specific signer.
|
|
82
99
|
* @param pubKey The signer's public key.
|
|
83
100
|
*/
|
|
84
|
-
clearCacheForSigner(pubKey) {
|
|
101
|
+
public clearCacheForSigner(pubKey: string): void {
|
|
85
102
|
this.cacheBySigner.delete(pubKey);
|
|
86
103
|
}
|
|
87
104
|
}
|
|
88
|
-
exports.AdvancedSignatureManager = AdvancedSignatureManager;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { BIP32Interface } from 'bip32';
|
|
2
|
+
import { ECPairInterface } from 'ecpair';
|
|
3
|
+
import { Signer, SignerAlternative, SignerAsync } from '../psbt.js';
|
|
4
|
+
|
|
5
|
+
import { SignatureManager } from './SignatureManager.js';
|
|
6
|
+
import { AdvancedSignatureManager } from './AdvancedSignatureManager.js';
|
|
7
|
+
|
|
8
|
+
interface HookSigner {
|
|
9
|
+
hasHook?: boolean;
|
|
10
|
+
signatureManager: SignatureManager;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type HookedSigner = (Signer | SignerAlternative | SignerAsync | BIP32Interface | ECPairInterface) &
|
|
14
|
+
HookSigner;
|
|
15
|
+
|
|
16
|
+
const advancedSignatureManager: AdvancedSignatureManager = AdvancedSignatureManager.getInstance();
|
|
17
|
+
|
|
18
|
+
function getPublicKey(keyPair: HookedSigner): string | undefined {
|
|
19
|
+
if (keyPair.publicKey && Buffer.isBuffer(keyPair.publicKey)) {
|
|
20
|
+
return keyPair.publicKey.toString('hex');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function hookKeyPair(keyPair: HookedSigner) {
|
|
25
|
+
const oldSign = keyPair.sign;
|
|
26
|
+
|
|
27
|
+
if (oldSign) {
|
|
28
|
+
keyPair.sign = new Proxy(oldSign, {
|
|
29
|
+
apply: function (target, thisArg, argumentsList) {
|
|
30
|
+
const publicKey = getPublicKey(keyPair);
|
|
31
|
+
const hash = argumentsList[0];
|
|
32
|
+
|
|
33
|
+
if (publicKey) {
|
|
34
|
+
let possibleSignature = advancedSignatureManager.getSignature(publicKey, hash);
|
|
35
|
+
|
|
36
|
+
if (!possibleSignature) {
|
|
37
|
+
possibleSignature = advancedSignatureManager.addSignature(
|
|
38
|
+
publicKey,
|
|
39
|
+
hash,
|
|
40
|
+
Reflect.apply(target, thisArg, argumentsList),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return possibleSignature;
|
|
45
|
+
} else {
|
|
46
|
+
let possibleSignature = keyPair.signatureManager.getSignature(hash);
|
|
47
|
+
|
|
48
|
+
if (!possibleSignature) {
|
|
49
|
+
possibleSignature = keyPair.signatureManager.addSignature(
|
|
50
|
+
hash,
|
|
51
|
+
Reflect.apply(target, thisArg, argumentsList),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return possibleSignature;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const oldSignSchnorr = keyPair.signSchnorr;
|
|
62
|
+
if (oldSignSchnorr) {
|
|
63
|
+
keyPair.signSchnorr = new Proxy(oldSignSchnorr, {
|
|
64
|
+
apply: function (target, thisArg, argumentsList) {
|
|
65
|
+
const publicKey = getPublicKey(keyPair);
|
|
66
|
+
const hash = argumentsList[0];
|
|
67
|
+
|
|
68
|
+
if (publicKey) {
|
|
69
|
+
let possibleSignature = advancedSignatureManager.getSignature(publicKey, hash);
|
|
70
|
+
|
|
71
|
+
if (!possibleSignature) {
|
|
72
|
+
possibleSignature = advancedSignatureManager.addSignature(
|
|
73
|
+
publicKey,
|
|
74
|
+
hash,
|
|
75
|
+
Reflect.apply(target, thisArg, argumentsList),
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return possibleSignature;
|
|
80
|
+
} else {
|
|
81
|
+
let possibleSignature = keyPair.signatureManager.getSignature(hash);
|
|
82
|
+
|
|
83
|
+
if (!possibleSignature) {
|
|
84
|
+
possibleSignature = keyPair.signatureManager.addSignature(
|
|
85
|
+
hash,
|
|
86
|
+
Reflect.apply(target, thisArg, argumentsList),
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return possibleSignature;
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function hookSigner(
|
|
98
|
+
keyPair: Signer | SignerAlternative | SignerAsync | BIP32Interface | ECPairInterface,
|
|
99
|
+
) {
|
|
100
|
+
const newKeypair: HookedSigner = keyPair as HookedSigner;
|
|
101
|
+
|
|
102
|
+
if (!newKeypair.hasHook) {
|
|
103
|
+
newKeypair.hasHook = true;
|
|
104
|
+
newKeypair.signatureManager = new SignatureManager();
|
|
105
|
+
|
|
106
|
+
hookKeyPair(newKeypair);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export interface CacheEntry {
|
|
2
|
+
length: number;
|
|
3
|
+
dataRef: WeakRef<Buffer>;
|
|
4
|
+
signature: Buffer;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export class SignatureManager {
|
|
5
8
|
/**
|
|
6
9
|
* Map to index cache entries by buffer length.
|
|
7
10
|
* Key: Buffer length
|
|
8
11
|
* Value: Set of CacheEntries with that buffer length
|
|
9
12
|
*/
|
|
10
|
-
cacheByLength = new Map();
|
|
13
|
+
private cacheByLength: Map<number, Set<CacheEntry>> = new Map();
|
|
14
|
+
|
|
11
15
|
/**
|
|
12
16
|
* FinalizationRegistry to clean up cache entries when their data buffers are garbage collected.
|
|
13
17
|
*/
|
|
14
|
-
registry
|
|
18
|
+
private registry: FinalizationRegistry<CacheEntry>;
|
|
19
|
+
|
|
15
20
|
constructor() {
|
|
16
|
-
this.registry = new FinalizationRegistry(entry => {
|
|
21
|
+
this.registry = new FinalizationRegistry((entry: CacheEntry) => {
|
|
17
22
|
const set = this.cacheByLength.get(entry.length);
|
|
18
23
|
if (set) {
|
|
19
24
|
set.delete(entry);
|
|
@@ -24,36 +29,43 @@ class SignatureManager {
|
|
|
24
29
|
}
|
|
25
30
|
});
|
|
26
31
|
}
|
|
32
|
+
|
|
27
33
|
/**
|
|
28
34
|
* Adds (caches) the signature for the given data buffer.
|
|
29
35
|
* @param data The data buffer.
|
|
30
36
|
* @param signature The signature buffer.
|
|
31
37
|
*/
|
|
32
|
-
addSignature(data, signature) {
|
|
38
|
+
public addSignature(data: Buffer, signature: Buffer): Buffer {
|
|
33
39
|
const length = data.length;
|
|
34
|
-
const entry = {
|
|
40
|
+
const entry: CacheEntry = {
|
|
35
41
|
length,
|
|
36
42
|
dataRef: new WeakRef(data),
|
|
37
43
|
signature,
|
|
38
44
|
};
|
|
45
|
+
|
|
39
46
|
if (!this.cacheByLength.has(length)) {
|
|
40
|
-
this.cacheByLength.set(length, new Set());
|
|
47
|
+
this.cacheByLength.set(length, new Set<CacheEntry>());
|
|
41
48
|
}
|
|
42
|
-
|
|
49
|
+
|
|
50
|
+
const set = this.cacheByLength.get(length)!;
|
|
43
51
|
set.add(entry);
|
|
52
|
+
|
|
44
53
|
// Register the data buffer with the FinalizationRegistry.
|
|
45
54
|
this.registry.register(data, entry);
|
|
55
|
+
|
|
46
56
|
return signature;
|
|
47
57
|
}
|
|
58
|
+
|
|
48
59
|
/**
|
|
49
60
|
* Retrieves the signature for the given data buffer.
|
|
50
61
|
* @param data The data buffer.
|
|
51
62
|
* @returns The signature buffer if found; otherwise, undefined.
|
|
52
63
|
*/
|
|
53
|
-
getSignature(data) {
|
|
64
|
+
public getSignature(data: Buffer): Buffer | undefined {
|
|
54
65
|
const length = data.length;
|
|
55
66
|
const set = this.cacheByLength.get(length);
|
|
56
67
|
if (!set) return undefined;
|
|
68
|
+
|
|
57
69
|
for (const entry of set) {
|
|
58
70
|
const cachedData = entry.dataRef.deref();
|
|
59
71
|
if (cachedData && cachedData.equals(data)) {
|
|
@@ -62,11 +74,11 @@ class SignatureManager {
|
|
|
62
74
|
}
|
|
63
75
|
return undefined;
|
|
64
76
|
}
|
|
77
|
+
|
|
65
78
|
/**
|
|
66
79
|
* Use with caution as it removes all cached signatures.
|
|
67
80
|
*/
|
|
68
|
-
clearCache() {
|
|
81
|
+
public clearCache(): void {
|
|
69
82
|
this.cacheByLength.clear();
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
|
-
exports.SignatureManager = SignatureManager;
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PsbtInput as _PsbtInput,
|
|
3
|
+
PsbtInputUpdate as _PsbtInputUpdate,
|
|
4
|
+
PsbtOutput as _PsbtOutput,
|
|
5
|
+
TapBip32Derivation as _TapBip32Derivation,
|
|
6
|
+
TapInternalKey as _TapInternalKey,
|
|
7
|
+
TapKeySig as _TapKeySig,
|
|
8
|
+
TapLeaf as _TapLeaf,
|
|
9
|
+
TapLeafScript as _TapLeafScript,
|
|
10
|
+
TapMerkleRoot as _TapMerkleRoot,
|
|
11
|
+
TapScriptSig as _TapScriptSig,
|
|
12
|
+
TapTree as _TapTree,
|
|
13
|
+
} from 'bip174/src/lib/interfaces.js';
|
|
14
|
+
import * as networks from './networks.js';
|
|
15
|
+
import * as address from './address.js';
|
|
16
|
+
import * as payments from './payments/index.js';
|
|
17
|
+
import * as script from './script.js';
|
|
18
|
+
import * as crypto from './crypto.js';
|
|
19
|
+
import * as Transaction from './transaction.js';
|
|
20
|
+
|
|
21
|
+
export * as address from './address.js';
|
|
22
|
+
export * as crypto from './crypto.js';
|
|
23
|
+
export * as networks from './networks.js';
|
|
24
|
+
export * as payments from './payments/index.js';
|
|
25
|
+
export * as script from './script.js';
|
|
26
|
+
|
|
27
|
+
export { Block } from './block.js';
|
|
28
|
+
/** @hidden */
|
|
29
|
+
export * from './crypto.js';
|
|
30
|
+
export * from './psbt.js';
|
|
31
|
+
/** @hidden */
|
|
32
|
+
export { OPS as opcodes } from './ops.js';
|
|
33
|
+
export { Transaction } from './transaction.js';
|
|
34
|
+
/** @hidden */
|
|
35
|
+
export { Network } from './networks.js';
|
|
36
|
+
/** @hidden */
|
|
37
|
+
export { initEccLib } from './ecc_lib.js';
|
|
38
|
+
export { Payment, PaymentCreator, PaymentOpts, Stack, StackElement } from './payments/index.js';
|
|
39
|
+
export { Input as TxInput, Output as TxOutput } from './transaction.js';
|
|
40
|
+
|
|
41
|
+
export interface PsbtInput extends _PsbtInput {}
|
|
42
|
+
|
|
43
|
+
export interface PsbtOutput extends _PsbtOutput {}
|
|
44
|
+
|
|
45
|
+
export interface TapInternalKey extends _TapInternalKey {}
|
|
46
|
+
|
|
47
|
+
export interface TapLeaf extends _TapLeaf {}
|
|
48
|
+
|
|
49
|
+
export interface TapScriptSig extends _TapScriptSig {}
|
|
50
|
+
|
|
51
|
+
export interface TapKeySig extends _TapKeySig {}
|
|
52
|
+
|
|
53
|
+
export interface TapTree extends _TapTree {}
|
|
54
|
+
|
|
55
|
+
export interface TapMerkleRoot extends _TapMerkleRoot {}
|
|
56
|
+
|
|
57
|
+
export interface TapLeafScript extends _TapLeafScript {}
|
|
58
|
+
|
|
59
|
+
export interface TapBip32Derivation extends _TapBip32Derivation {}
|
|
60
|
+
|
|
61
|
+
export interface PsbtInputUpdate extends _PsbtInputUpdate {}
|
|
62
|
+
|
|
63
|
+
export * from './psbt/bip371.js';
|
|
64
|
+
export * from './address.js';
|
|
65
|
+
export * from './bufferutils.js';
|
|
66
|
+
export * from './payments/bip341.js';
|
|
67
|
+
export * from './psbt/psbtutils.js';
|
|
68
|
+
|
|
69
|
+
export {
|
|
70
|
+
Taptree,
|
|
71
|
+
XOnlyPointAddTweakResult,
|
|
72
|
+
Tapleaf,
|
|
73
|
+
TinySecp256k1Interface,
|
|
74
|
+
TAPLEAF_VERSION_MASK,
|
|
75
|
+
} from './types.js';
|
|
76
|
+
|
|
77
|
+
const bitcoin = {
|
|
78
|
+
networks,
|
|
79
|
+
address,
|
|
80
|
+
payments,
|
|
81
|
+
script,
|
|
82
|
+
crypto,
|
|
83
|
+
Transaction,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export default bitcoin;
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3
|
-
exports.fastMerkleRoot = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Calculates the Merkle root of an array of buffers using a specified digest function.
|
|
6
3
|
*
|
|
@@ -9,22 +6,26 @@ exports.fastMerkleRoot = void 0;
|
|
|
9
6
|
* @returns The Merkle root as a buffer.
|
|
10
7
|
* @throws {TypeError} If the values parameter is not an array or the digestFn parameter is not a function.
|
|
11
8
|
*/
|
|
12
|
-
function fastMerkleRoot(values, digestFn) {
|
|
9
|
+
export function fastMerkleRoot(values: Buffer[], digestFn: (b: Buffer) => Buffer): Buffer {
|
|
13
10
|
if (!Array.isArray(values)) throw TypeError('Expected values Array');
|
|
14
|
-
if (typeof digestFn !== 'function')
|
|
15
|
-
|
|
11
|
+
if (typeof digestFn !== 'function') throw TypeError('Expected digest Function');
|
|
12
|
+
|
|
16
13
|
let length = values.length;
|
|
17
14
|
const results = values.concat();
|
|
15
|
+
|
|
18
16
|
while (length > 1) {
|
|
19
17
|
let j = 0;
|
|
18
|
+
|
|
20
19
|
for (let i = 0; i < length; i += 2, ++j) {
|
|
21
20
|
const left = results[i];
|
|
22
21
|
const right = i + 1 === length ? left : results[i + 1];
|
|
23
22
|
const data = Buffer.concat([left, right]);
|
|
23
|
+
|
|
24
24
|
results[j] = digestFn(data);
|
|
25
25
|
}
|
|
26
|
+
|
|
26
27
|
length = j;
|
|
27
28
|
}
|
|
29
|
+
|
|
28
30
|
return results[0];
|
|
29
31
|
}
|
|
30
|
-
exports.fastMerkleRoot = fastMerkleRoot;
|