@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.
Files changed (260) hide show
  1. package/.babelrc +4 -0
  2. package/.gitattributes +2 -0
  3. package/.nyc_output/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  4. package/.nyc_output/processinfo/6368a5b2-daa5-4821-8ed0-b742d6fc7eab.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -0
  6. package/.prettierrc.json +12 -0
  7. package/CHANGELOG.md +403 -0
  8. package/CONTRIBUTING.md +83 -0
  9. package/browser/address.d.ts +16 -0
  10. package/{src → browser}/bip66.d.ts +6 -7
  11. package/{src → browser}/block.d.ts +29 -30
  12. package/{src → browser}/bufferutils.d.ts +34 -54
  13. package/browser/crypto/crypto.d.ts +1 -0
  14. package/{src → browser}/crypto.d.ts +13 -18
  15. package/browser/ecc_lib.d.ts +3 -0
  16. package/browser/hooks/AdvancedSignatureManager.d.ts +16 -0
  17. package/{src → browser}/hooks/HookedSigner.d.ts +4 -4
  18. package/browser/hooks/SignatureManager.d.ts +13 -0
  19. package/browser/index.d.ts +58 -0
  20. package/browser/index.js +2 -0
  21. package/browser/index.js.LICENSE.txt +14 -0
  22. package/browser/merkle.d.ts +1 -0
  23. package/browser/networks.d.ts +23 -0
  24. package/{src → browser}/ops.d.ts +126 -126
  25. package/browser/payments/bip341.d.ts +23 -0
  26. package/browser/payments/embed.d.ts +2 -0
  27. package/browser/payments/index.d.ts +41 -0
  28. package/{src → browser}/payments/lazy.d.ts +2 -2
  29. package/browser/payments/p2ms.d.ts +2 -0
  30. package/browser/payments/p2pk.d.ts +2 -0
  31. package/browser/payments/p2pkh.d.ts +2 -0
  32. package/browser/payments/p2sh.d.ts +2 -0
  33. package/browser/payments/p2tr.d.ts +2 -0
  34. package/browser/payments/p2wpkh.d.ts +2 -0
  35. package/browser/payments/p2wsh.d.ts +2 -0
  36. package/browser/psbt/bip371.d.ts +16 -0
  37. package/browser/psbt/psbtutils.d.ts +26 -0
  38. package/{src → browser}/psbt.d.ts +167 -235
  39. package/browser/push_data.d.ts +7 -0
  40. package/browser/script.d.ts +17 -0
  41. package/browser/script_number.d.ts +2 -0
  42. package/browser/script_signature.d.ts +7 -0
  43. package/{src → browser}/transaction.d.ts +48 -60
  44. package/{src → browser}/types.d.ts +37 -54
  45. package/build/address.d.ts +16 -0
  46. package/build/address.js +148 -0
  47. package/build/bip66.d.ts +6 -0
  48. package/build/bip66.js +99 -0
  49. package/build/block.d.ts +29 -0
  50. package/build/block.js +181 -0
  51. package/build/bufferutils.d.ts +34 -0
  52. package/build/bufferutils.js +141 -0
  53. package/build/crypto/crypto.d.ts +1 -0
  54. package/build/crypto/crypto.js +1 -0
  55. package/build/crypto.d.ts +13 -0
  56. package/build/crypto.js +87 -0
  57. package/build/ecc_lib.d.ts +3 -0
  58. package/build/ecc_lib.js +61 -0
  59. package/build/hooks/AdvancedSignatureManager.d.ts +16 -0
  60. package/build/hooks/AdvancedSignatureManager.js +52 -0
  61. package/build/hooks/HookedSigner.d.ts +4 -0
  62. package/build/hooks/HookedSigner.js +64 -0
  63. package/build/hooks/SignatureManager.d.ts +13 -0
  64. package/build/hooks/SignatureManager.js +45 -0
  65. package/build/index.d.ts +58 -0
  66. package/build/index.js +32 -0
  67. package/build/merkle.d.ts +1 -0
  68. package/build/merkle.js +19 -0
  69. package/build/networks.d.ts +23 -0
  70. package/build/networks.js +121 -0
  71. package/build/ops.d.ts +126 -0
  72. package/{src → build}/ops.js +127 -131
  73. package/build/payments/bip341.d.ts +23 -0
  74. package/build/payments/bip341.js +82 -0
  75. package/build/payments/embed.d.ts +2 -0
  76. package/build/payments/embed.js +39 -0
  77. package/build/payments/index.d.ts +41 -0
  78. package/build/payments/index.js +10 -0
  79. package/build/payments/lazy.d.ts +2 -0
  80. package/{src → build}/payments/lazy.js +28 -32
  81. package/build/payments/p2ms.d.ts +2 -0
  82. package/{src → build}/payments/p2ms.js +128 -158
  83. package/build/payments/p2pk.d.ts +2 -0
  84. package/build/payments/p2pk.js +68 -0
  85. package/build/payments/p2pkh.d.ts +2 -0
  86. package/build/payments/p2pkh.js +135 -0
  87. package/build/payments/p2sh.d.ts +2 -0
  88. package/build/payments/p2sh.js +175 -0
  89. package/build/payments/p2tr.d.ts +2 -0
  90. package/build/payments/p2tr.js +254 -0
  91. package/build/payments/p2wpkh.d.ts +2 -0
  92. package/build/payments/p2wpkh.js +130 -0
  93. package/build/payments/p2wsh.d.ts +2 -0
  94. package/build/payments/p2wsh.js +180 -0
  95. package/build/psbt/bip371.d.ts +16 -0
  96. package/build/psbt/bip371.js +246 -0
  97. package/build/psbt/psbtutils.d.ts +26 -0
  98. package/build/psbt/psbtutils.js +170 -0
  99. package/build/psbt.d.ts +167 -0
  100. package/build/psbt.js +1305 -0
  101. package/build/push_data.d.ts +7 -0
  102. package/build/push_data.js +57 -0
  103. package/build/script.d.ts +17 -0
  104. package/build/script.js +167 -0
  105. package/build/script_number.d.ts +2 -0
  106. package/build/script_number.js +49 -0
  107. package/build/script_signature.d.ts +7 -0
  108. package/build/script_signature.js +49 -0
  109. package/build/transaction.d.ts +48 -0
  110. package/build/transaction.js +445 -0
  111. package/build/types.d.ts +37 -0
  112. package/build/types.js +73 -0
  113. package/cjs/package.json +3 -0
  114. package/eslint.config.js +56 -0
  115. package/gulpfile.js +42 -0
  116. package/package.json +105 -50
  117. package/src/{address.js → address.ts} +93 -73
  118. package/src/{bip66.js → bip66.ts} +23 -19
  119. package/src/{block.js → block.ts} +114 -105
  120. package/src/{bufferutils.js → bufferutils.ts} +65 -67
  121. package/src/crypto/crypto-browser.js +75 -0
  122. package/src/crypto/crypto.ts +1 -0
  123. package/src/crypto.ts +108 -0
  124. package/src/{ecc_lib.js → ecc_lib.ts} +25 -53
  125. package/src/hooks/{AdvancedSignatureManager.js → AdvancedSignatureManager.ts} +34 -18
  126. package/src/hooks/HookedSigner.ts +108 -0
  127. package/src/hooks/{SignatureManager.js → SignatureManager.ts} +26 -14
  128. package/src/index.ts +86 -0
  129. package/src/{merkle.js → merkle.ts} +8 -7
  130. package/src/networks.ts +235 -0
  131. package/src/ops.ts +282 -0
  132. package/src/payments/bip341.ts +140 -0
  133. package/src/payments/embed.ts +55 -0
  134. package/src/payments/{index.d.ts → index.ts} +20 -10
  135. package/src/payments/lazy.ts +28 -0
  136. package/src/payments/p2ms.ts +150 -0
  137. package/src/payments/{p2pk.js → p2pk.ts} +32 -29
  138. package/src/payments/{p2pkh.js → p2pkh.ts} +53 -47
  139. package/src/payments/{p2sh.js → p2sh.ts} +72 -71
  140. package/src/payments/{p2tr.js → p2tr.ts} +114 -125
  141. package/src/payments/{p2wpkh.js → p2wpkh.ts} +51 -56
  142. package/src/payments/{p2wsh.js → p2wsh.ts} +69 -81
  143. package/src/psbt/{bip371.js → bip371.ts} +195 -178
  144. package/src/psbt/psbtutils.ts +299 -0
  145. package/src/{psbt.js → psbt.ts} +1048 -699
  146. package/src/{push_data.js → push_data.ts} +35 -21
  147. package/src/{script.js → script.ts} +93 -77
  148. package/src/{script_number.js → script_number.ts} +15 -21
  149. package/src/{script_signature.js → script_signature.ts} +26 -14
  150. package/src/{transaction.js → transaction.ts} +247 -167
  151. package/src/types.ts +122 -0
  152. package/test/address.spec.js +124 -0
  153. package/test/address.spec.ts +177 -0
  154. package/test/bitcoin.core.spec.js +170 -0
  155. package/test/bitcoin.core.spec.ts +234 -0
  156. package/test/block.spec.js +141 -0
  157. package/test/block.spec.ts +194 -0
  158. package/test/bufferutils.spec.js +427 -0
  159. package/test/bufferutils.spec.ts +513 -0
  160. package/test/crypto.spec.js +41 -0
  161. package/test/crypto.spec.ts +55 -0
  162. package/test/fixtures/address.json +329 -0
  163. package/test/fixtures/block.json +148 -0
  164. package/test/fixtures/bufferutils.json +102 -0
  165. package/test/fixtures/core/README.md +26 -0
  166. package/test/fixtures/core/base58_encode_decode.json +50 -0
  167. package/test/fixtures/core/base58_keys_invalid.json +152 -0
  168. package/test/fixtures/core/base58_keys_valid.json +452 -0
  169. package/test/fixtures/core/blocks.json +27 -0
  170. package/test/fixtures/core/sig_canonical.json +7 -0
  171. package/test/fixtures/core/sig_noncanonical.json +33 -0
  172. package/test/fixtures/core/sighash.json +3505 -0
  173. package/test/fixtures/core/tx_valid.json +2023 -0
  174. package/test/fixtures/crypto.json +43 -0
  175. package/test/fixtures/ecdsa.json +217 -0
  176. package/test/fixtures/ecpair.json +141 -0
  177. package/test/fixtures/embed.json +108 -0
  178. package/test/fixtures/p2ms.json +434 -0
  179. package/test/fixtures/p2pk.json +179 -0
  180. package/test/fixtures/p2pkh.json +276 -0
  181. package/test/fixtures/p2sh.json +508 -0
  182. package/test/fixtures/p2tr.json +1198 -0
  183. package/test/fixtures/p2wpkh.json +290 -0
  184. package/test/fixtures/p2wsh.json +489 -0
  185. package/test/fixtures/psbt.json +924 -0
  186. package/test/fixtures/script.json +465 -0
  187. package/test/fixtures/script_number.json +225 -0
  188. package/test/fixtures/signature.json +140 -0
  189. package/test/fixtures/transaction.json +916 -0
  190. package/test/integration/_regtest.js +7 -0
  191. package/test/integration/_regtest.ts +6 -0
  192. package/test/integration/addresses.spec.js +116 -0
  193. package/test/integration/addresses.spec.ts +154 -0
  194. package/test/integration/bip32.spec.js +85 -0
  195. package/test/integration/bip32.spec.ts +151 -0
  196. package/test/integration/blocks.spec.js +26 -0
  197. package/test/integration/blocks.spec.ts +28 -0
  198. package/test/integration/cltv.spec.js +199 -0
  199. package/test/integration/cltv.spec.ts +283 -0
  200. package/test/integration/csv.spec.js +362 -0
  201. package/test/integration/csv.spec.ts +527 -0
  202. package/test/integration/payments.spec.js +98 -0
  203. package/test/integration/payments.spec.ts +135 -0
  204. package/test/integration/taproot.spec.js +532 -0
  205. package/test/integration/taproot.spec.ts +707 -0
  206. package/test/integration/transactions.spec.js +561 -0
  207. package/test/integration/transactions.spec.ts +769 -0
  208. package/test/payments.spec.js +97 -0
  209. package/test/payments.spec.ts +125 -0
  210. package/test/payments.utils.js +190 -0
  211. package/test/payments.utils.ts +208 -0
  212. package/test/psbt.spec.js +1044 -0
  213. package/test/psbt.spec.ts +1414 -0
  214. package/test/script.spec.js +151 -0
  215. package/test/script.spec.ts +210 -0
  216. package/test/script_number.spec.js +24 -0
  217. package/test/script_number.spec.ts +29 -0
  218. package/test/script_signature.spec.js +52 -0
  219. package/test/script_signature.spec.ts +66 -0
  220. package/test/transaction.spec.js +269 -0
  221. package/test/transaction.spec.ts +387 -0
  222. package/test/ts-node-register.js +5 -0
  223. package/test/tsconfig.json +45 -0
  224. package/test/types.spec.js +46 -0
  225. package/test/types.spec.ts +58 -0
  226. package/tsconfig.base.json +27 -0
  227. package/tsconfig.json +19 -0
  228. package/tsconfig.webpack.json +18 -0
  229. package/webpack.config.js +79 -0
  230. package/src/address.d.ts +0 -42
  231. package/src/crypto.js +0 -128
  232. package/src/ecc_lib.d.ts +0 -17
  233. package/src/hooks/AdvancedSignatureManager.d.ts +0 -44
  234. package/src/hooks/HookedSigner.js +0 -90
  235. package/src/hooks/SignatureManager.d.ts +0 -35
  236. package/src/index.d.ts +0 -42
  237. package/src/index.js +0 -87
  238. package/src/merkle.d.ts +0 -10
  239. package/src/networks.d.ts +0 -29
  240. package/src/networks.js +0 -71
  241. package/src/payments/bip341.d.ts +0 -49
  242. package/src/payments/bip341.js +0 -124
  243. package/src/payments/embed.d.ts +0 -9
  244. package/src/payments/embed.js +0 -54
  245. package/src/payments/index.js +0 -69
  246. package/src/payments/p2ms.d.ts +0 -9
  247. package/src/payments/p2pk.d.ts +0 -10
  248. package/src/payments/p2pkh.d.ts +0 -10
  249. package/src/payments/p2sh.d.ts +0 -10
  250. package/src/payments/p2tr.d.ts +0 -10
  251. package/src/payments/p2wpkh.d.ts +0 -10
  252. package/src/payments/p2wsh.d.ts +0 -10
  253. package/src/psbt/bip371.d.ts +0 -42
  254. package/src/psbt/psbtutils.d.ts +0 -64
  255. package/src/psbt/psbtutils.js +0 -191
  256. package/src/push_data.d.ts +0 -29
  257. package/src/script.d.ts +0 -42
  258. package/src/script_number.d.ts +0 -19
  259. package/src/script_signature.d.ts +0 -21
  260. 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
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.getEccLib = exports.initEccLib = void 0;
4
- const _ECCLIB_CACHE = {};
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
- exports.initEccLib = initEccLib;
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
- exports.getEccLib = getEccLib;
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.parity === t.parity);
96
- assert(Buffer.from(r.xOnlyPubkey).equals(h(t.result)));
65
+ assert(r!.parity === t.parity);
66
+ assert(Buffer.from(r!.xOnlyPubkey).equals(h(t.result)));
97
67
  }
98
68
  });
99
69
  }
100
- function assert(bool) {
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
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.AdvancedSignatureManager = void 0;
4
- class AdvancedSignatureManager {
5
- static instance;
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
- constructor() {
17
- this.registry = new FinalizationRegistry(entry => {
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
- const set = this.cacheBySigner.get(pubKey);
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
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- exports.SignatureManager = void 0;
4
- class SignatureManager {
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
- const set = this.cacheByLength.get(length);
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
- throw TypeError('Expected digest Function');
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;