@btc-vision/bitcoin 6.5.5 → 7.0.0-alpha.0

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 (457) hide show
  1. package/AUDIT/README.md +9 -0
  2. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  3. package/SECURITY.md +27 -0
  4. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  5. package/benchmark/signing.bench.ts +147 -0
  6. package/browser/address.d.ts +56 -9
  7. package/browser/address.d.ts.map +1 -0
  8. package/browser/bech32utils.d.ts +9 -1
  9. package/browser/bech32utils.d.ts.map +1 -0
  10. package/browser/bip66.d.ts +11 -6
  11. package/browser/bip66.d.ts.map +1 -0
  12. package/browser/block.d.ts +117 -11
  13. package/browser/block.d.ts.map +1 -0
  14. package/browser/branded.d.ts +20 -0
  15. package/browser/branded.d.ts.map +1 -0
  16. package/browser/crypto/crypto.d.ts +1 -0
  17. package/browser/crypto/crypto.d.ts.map +1 -0
  18. package/browser/crypto.d.ts +46 -7
  19. package/browser/crypto.d.ts.map +1 -0
  20. package/browser/ecc/context.d.ts +129 -0
  21. package/browser/ecc/context.d.ts.map +1 -0
  22. package/browser/ecc/index.d.ts +11 -0
  23. package/browser/ecc/index.d.ts.map +1 -0
  24. package/browser/ecc/types.d.ts +128 -0
  25. package/browser/ecc/types.d.ts.map +1 -0
  26. package/browser/ecpair.d.ts +99 -0
  27. package/browser/errors.d.ts +124 -0
  28. package/browser/errors.d.ts.map +1 -0
  29. package/browser/index.d.ts +32 -5
  30. package/browser/index.d.ts.map +1 -0
  31. package/browser/index.js +12482 -101
  32. package/browser/io/BinaryReader.d.ts +276 -0
  33. package/browser/io/BinaryReader.d.ts.map +1 -0
  34. package/browser/io/BinaryWriter.d.ts +391 -0
  35. package/browser/io/BinaryWriter.d.ts.map +1 -0
  36. package/browser/io/MemoryPool.d.ts +220 -0
  37. package/browser/io/MemoryPool.d.ts.map +1 -0
  38. package/browser/io/base64.d.ts +13 -0
  39. package/browser/io/base64.d.ts.map +1 -0
  40. package/browser/io/hex.d.ts +67 -0
  41. package/browser/io/hex.d.ts.map +1 -0
  42. package/browser/io/index.d.ts +17 -0
  43. package/browser/io/index.d.ts.map +1 -0
  44. package/browser/io/utils.d.ts +199 -0
  45. package/browser/io/utils.d.ts.map +1 -0
  46. package/browser/merkle.d.ts +10 -1
  47. package/browser/merkle.d.ts.map +1 -0
  48. package/browser/networks.d.ts +70 -9
  49. package/browser/networks.d.ts.map +1 -0
  50. package/browser/opcodes.d.ts +1 -0
  51. package/browser/opcodes.d.ts.map +1 -0
  52. package/browser/payments/bip341.d.ts +35 -9
  53. package/browser/payments/bip341.d.ts.map +1 -0
  54. package/browser/payments/embed.d.ts +112 -1
  55. package/browser/payments/embed.d.ts.map +1 -0
  56. package/browser/payments/index.d.ts +17 -10
  57. package/browser/payments/index.d.ts.map +1 -0
  58. package/browser/payments/p2ms.d.ts +150 -0
  59. package/browser/payments/p2ms.d.ts.map +1 -0
  60. package/browser/payments/p2op.d.ts +150 -24
  61. package/browser/payments/p2op.d.ts.map +1 -0
  62. package/browser/payments/p2pk.d.ts +154 -1
  63. package/browser/payments/p2pk.d.ts.map +1 -0
  64. package/browser/payments/p2pkh.d.ts +176 -1
  65. package/browser/payments/p2pkh.d.ts.map +1 -0
  66. package/browser/payments/p2sh.d.ts +150 -1
  67. package/browser/payments/p2sh.d.ts.map +1 -0
  68. package/browser/payments/p2tr.d.ts +185 -1
  69. package/browser/payments/p2tr.d.ts.map +1 -0
  70. package/browser/payments/p2wpkh.d.ts +161 -1
  71. package/browser/payments/p2wpkh.d.ts.map +1 -0
  72. package/browser/payments/p2wsh.d.ts +146 -1
  73. package/browser/payments/p2wsh.d.ts.map +1 -0
  74. package/browser/payments/types.d.ts +94 -64
  75. package/browser/payments/types.d.ts.map +1 -0
  76. package/browser/psbt/bip371.d.ts +34 -8
  77. package/browser/psbt/bip371.d.ts.map +1 -0
  78. package/browser/psbt/psbtutils.d.ts +56 -16
  79. package/browser/psbt/psbtutils.d.ts.map +1 -0
  80. package/browser/psbt/types.d.ts +245 -0
  81. package/browser/psbt/types.d.ts.map +1 -0
  82. package/browser/psbt/utils.d.ts +64 -0
  83. package/browser/psbt/utils.d.ts.map +1 -0
  84. package/browser/psbt/validation.d.ts +84 -0
  85. package/browser/psbt/validation.d.ts.map +1 -0
  86. package/browser/psbt.d.ts +82 -118
  87. package/browser/psbt.d.ts.map +1 -0
  88. package/browser/pubkey.d.ts +27 -6
  89. package/browser/pubkey.d.ts.map +1 -0
  90. package/browser/push_data.d.ts +24 -2
  91. package/browser/push_data.d.ts.map +1 -0
  92. package/browser/script.d.ts +33 -8
  93. package/browser/script.d.ts.map +1 -0
  94. package/browser/script_number.d.ts +17 -0
  95. package/browser/script_number.d.ts.map +1 -0
  96. package/browser/script_signature.d.ts +23 -5
  97. package/browser/script_signature.d.ts.map +1 -0
  98. package/browser/transaction.d.ts +160 -18
  99. package/browser/transaction.d.ts.map +1 -0
  100. package/browser/types.d.ts +36 -38
  101. package/browser/types.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  103. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  104. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  105. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  106. package/browser/workers/ecc-bundle.d.ts +25 -0
  107. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  108. package/browser/workers/index.d.ts +91 -0
  109. package/browser/workers/index.d.ts.map +1 -0
  110. package/browser/workers/psbt-parallel.d.ts +88 -0
  111. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  112. package/browser/workers/signing-worker.d.ts +37 -0
  113. package/browser/workers/signing-worker.d.ts.map +1 -0
  114. package/browser/workers/types.d.ts +365 -0
  115. package/browser/workers/types.d.ts.map +1 -0
  116. package/build/address.d.ts +57 -10
  117. package/build/address.d.ts.map +1 -0
  118. package/build/address.js +80 -24
  119. package/build/address.js.map +1 -0
  120. package/build/bech32utils.d.ts +9 -1
  121. package/build/bech32utils.d.ts.map +1 -0
  122. package/build/bech32utils.js +10 -2
  123. package/build/bech32utils.js.map +1 -0
  124. package/build/bip66.d.ts +11 -6
  125. package/build/bip66.d.ts.map +1 -0
  126. package/build/bip66.js +32 -3
  127. package/build/bip66.js.map +1 -0
  128. package/build/block.d.ts +117 -11
  129. package/build/block.d.ts.map +1 -0
  130. package/build/block.js +204 -72
  131. package/build/block.js.map +1 -0
  132. package/build/branded.d.ts +20 -0
  133. package/build/branded.d.ts.map +1 -0
  134. package/build/branded.js +7 -0
  135. package/build/branded.js.map +1 -0
  136. package/build/crypto/crypto.d.ts +1 -0
  137. package/build/crypto/crypto.d.ts.map +1 -0
  138. package/build/crypto/crypto.js +1 -0
  139. package/build/crypto/crypto.js.map +1 -0
  140. package/build/crypto.d.ts +46 -7
  141. package/build/crypto.d.ts.map +1 -0
  142. package/build/crypto.js +65 -20
  143. package/build/crypto.js.map +1 -0
  144. package/build/ecc/context.d.ts +135 -0
  145. package/build/ecc/context.d.ts.map +1 -0
  146. package/build/ecc/context.js +232 -0
  147. package/build/ecc/context.js.map +1 -0
  148. package/build/ecc/index.d.ts +11 -0
  149. package/build/ecc/index.d.ts.map +1 -0
  150. package/build/ecc/index.js +11 -0
  151. package/build/ecc/index.js.map +1 -0
  152. package/build/ecc/types.d.ts +134 -0
  153. package/build/ecc/types.d.ts.map +1 -0
  154. package/build/ecc/types.js +8 -0
  155. package/build/ecc/types.js.map +1 -0
  156. package/build/errors.d.ts +124 -0
  157. package/build/errors.d.ts.map +1 -0
  158. package/build/errors.js +155 -0
  159. package/build/errors.js.map +1 -0
  160. package/build/index.d.ts +32 -5
  161. package/build/index.d.ts.map +1 -0
  162. package/build/index.js +26 -3
  163. package/build/index.js.map +1 -0
  164. package/build/io/BinaryReader.d.ts +276 -0
  165. package/build/io/BinaryReader.d.ts.map +1 -0
  166. package/build/io/BinaryReader.js +425 -0
  167. package/build/io/BinaryReader.js.map +1 -0
  168. package/build/io/BinaryWriter.d.ts +391 -0
  169. package/build/io/BinaryWriter.d.ts.map +1 -0
  170. package/build/io/BinaryWriter.js +611 -0
  171. package/build/io/BinaryWriter.js.map +1 -0
  172. package/build/io/MemoryPool.d.ts +220 -0
  173. package/build/io/MemoryPool.d.ts.map +1 -0
  174. package/build/io/MemoryPool.js +309 -0
  175. package/build/io/MemoryPool.js.map +1 -0
  176. package/build/io/base64.d.ts +13 -0
  177. package/build/io/base64.d.ts.map +1 -0
  178. package/build/io/base64.js +20 -0
  179. package/build/io/base64.js.map +1 -0
  180. package/build/io/hex.d.ts +67 -0
  181. package/build/io/hex.d.ts.map +1 -0
  182. package/build/io/hex.js +138 -0
  183. package/build/io/hex.js.map +1 -0
  184. package/build/io/index.d.ts +17 -0
  185. package/build/io/index.d.ts.map +1 -0
  186. package/build/io/index.js +23 -0
  187. package/build/io/index.js.map +1 -0
  188. package/build/io/utils.d.ts +199 -0
  189. package/build/io/utils.d.ts.map +1 -0
  190. package/build/io/utils.js +271 -0
  191. package/build/io/utils.js.map +1 -0
  192. package/build/merkle.d.ts +10 -1
  193. package/build/merkle.d.ts.map +1 -0
  194. package/build/merkle.js +12 -1
  195. package/build/merkle.js.map +1 -0
  196. package/build/networks.d.ts +70 -9
  197. package/build/networks.d.ts.map +1 -0
  198. package/build/networks.js +90 -4
  199. package/build/networks.js.map +1 -0
  200. package/build/opcodes.d.ts +1 -0
  201. package/build/opcodes.d.ts.map +1 -0
  202. package/build/opcodes.js +1 -0
  203. package/build/opcodes.js.map +1 -0
  204. package/build/payments/bip341.d.ts +36 -9
  205. package/build/payments/bip341.d.ts.map +1 -0
  206. package/build/payments/bip341.js +35 -15
  207. package/build/payments/bip341.js.map +1 -0
  208. package/build/payments/embed.d.ts +120 -1
  209. package/build/payments/embed.d.ts.map +1 -0
  210. package/build/payments/embed.js +215 -34
  211. package/build/payments/embed.js.map +1 -0
  212. package/build/payments/index.d.ts +17 -10
  213. package/build/payments/index.d.ts.map +1 -0
  214. package/build/payments/index.js +20 -10
  215. package/build/payments/index.js.map +1 -0
  216. package/build/payments/p2ms.d.ts +159 -1
  217. package/build/payments/p2ms.d.ts.map +1 -0
  218. package/build/payments/p2ms.js +427 -108
  219. package/build/payments/p2ms.js.map +1 -0
  220. package/build/payments/p2op.d.ts +158 -24
  221. package/build/payments/p2op.d.ts.map +1 -0
  222. package/build/payments/p2op.js +379 -93
  223. package/build/payments/p2op.js.map +1 -0
  224. package/build/payments/p2pk.d.ts +162 -1
  225. package/build/payments/p2pk.d.ts.map +1 -0
  226. package/build/payments/p2pk.js +327 -58
  227. package/build/payments/p2pk.js.map +1 -0
  228. package/build/payments/p2pkh.d.ts +185 -1
  229. package/build/payments/p2pkh.d.ts.map +1 -0
  230. package/build/payments/p2pkh.js +467 -114
  231. package/build/payments/p2pkh.js.map +1 -0
  232. package/build/payments/p2sh.d.ts +159 -1
  233. package/build/payments/p2sh.d.ts.map +1 -0
  234. package/build/payments/p2sh.js +500 -152
  235. package/build/payments/p2sh.js.map +1 -0
  236. package/build/payments/p2tr.d.ts +193 -1
  237. package/build/payments/p2tr.d.ts.map +1 -0
  238. package/build/payments/p2tr.js +592 -174
  239. package/build/payments/p2tr.js.map +1 -0
  240. package/build/payments/p2wpkh.d.ts +170 -1
  241. package/build/payments/p2wpkh.d.ts.map +1 -0
  242. package/build/payments/p2wpkh.js +429 -104
  243. package/build/payments/p2wpkh.js.map +1 -0
  244. package/build/payments/p2wsh.d.ts +155 -1
  245. package/build/payments/p2wsh.d.ts.map +1 -0
  246. package/build/payments/p2wsh.js +466 -144
  247. package/build/payments/p2wsh.js.map +1 -0
  248. package/build/payments/types.d.ts +98 -64
  249. package/build/payments/types.d.ts.map +1 -0
  250. package/build/payments/types.js +17 -13
  251. package/build/payments/types.js.map +1 -0
  252. package/build/psbt/bip371.d.ts +35 -9
  253. package/build/psbt/bip371.d.ts.map +1 -0
  254. package/build/psbt/bip371.js +113 -28
  255. package/build/psbt/bip371.js.map +1 -0
  256. package/build/psbt/psbtutils.d.ts +56 -16
  257. package/build/psbt/psbtutils.d.ts.map +1 -0
  258. package/build/psbt/psbtutils.js +71 -16
  259. package/build/psbt/psbtutils.js.map +1 -0
  260. package/build/psbt/types.d.ts +249 -0
  261. package/build/psbt/types.d.ts.map +1 -0
  262. package/build/psbt/types.js +6 -0
  263. package/build/psbt/types.js.map +1 -0
  264. package/build/psbt/utils.d.ts +68 -0
  265. package/build/psbt/utils.d.ts.map +1 -0
  266. package/build/psbt/utils.js +171 -0
  267. package/build/psbt/utils.js.map +1 -0
  268. package/build/psbt/validation.d.ts +88 -0
  269. package/build/psbt/validation.d.ts.map +1 -0
  270. package/build/psbt/validation.js +149 -0
  271. package/build/psbt/validation.js.map +1 -0
  272. package/build/psbt.d.ts +84 -120
  273. package/build/psbt.d.ts.map +1 -0
  274. package/build/psbt.js +411 -412
  275. package/build/psbt.js.map +1 -0
  276. package/build/pubkey.d.ts +27 -6
  277. package/build/pubkey.d.ts.map +1 -0
  278. package/build/pubkey.js +37 -13
  279. package/build/pubkey.js.map +1 -0
  280. package/build/push_data.d.ts +24 -2
  281. package/build/push_data.d.ts.map +1 -0
  282. package/build/push_data.js +44 -12
  283. package/build/push_data.js.map +1 -0
  284. package/build/script.d.ts +33 -8
  285. package/build/script.d.ts.map +1 -0
  286. package/build/script.js +100 -36
  287. package/build/script.js.map +1 -0
  288. package/build/script_number.d.ts +17 -0
  289. package/build/script_number.d.ts.map +1 -0
  290. package/build/script_number.js +19 -0
  291. package/build/script_number.js.map +1 -0
  292. package/build/script_signature.d.ts +23 -5
  293. package/build/script_signature.d.ts.map +1 -0
  294. package/build/script_signature.js +48 -15
  295. package/build/script_signature.js.map +1 -0
  296. package/build/transaction.d.ts +160 -18
  297. package/build/transaction.d.ts.map +1 -0
  298. package/build/transaction.js +443 -176
  299. package/build/transaction.js.map +1 -0
  300. package/build/tsconfig.build.tsbuildinfo +1 -0
  301. package/build/types.d.ts +36 -38
  302. package/build/types.d.ts.map +1 -0
  303. package/build/types.js +175 -57
  304. package/build/types.js.map +1 -0
  305. package/build/workers/WorkerSigningPool.d.ts +174 -0
  306. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  307. package/build/workers/WorkerSigningPool.js +553 -0
  308. package/build/workers/WorkerSigningPool.js.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  310. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  311. package/build/workers/WorkerSigningPool.node.js +753 -0
  312. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  313. package/build/workers/ecc-bundle.d.ts +25 -0
  314. package/build/workers/ecc-bundle.d.ts.map +1 -0
  315. package/build/workers/ecc-bundle.js +25 -0
  316. package/build/workers/ecc-bundle.js.map +1 -0
  317. package/build/workers/index.d.ts +91 -0
  318. package/build/workers/index.d.ts.map +1 -0
  319. package/build/workers/index.js +114 -0
  320. package/build/workers/index.js.map +1 -0
  321. package/build/workers/psbt-parallel.d.ts +117 -0
  322. package/build/workers/psbt-parallel.d.ts.map +1 -0
  323. package/build/workers/psbt-parallel.js +233 -0
  324. package/build/workers/psbt-parallel.js.map +1 -0
  325. package/build/workers/signing-worker.d.ts +37 -0
  326. package/build/workers/signing-worker.d.ts.map +1 -0
  327. package/build/workers/signing-worker.js +350 -0
  328. package/build/workers/signing-worker.js.map +1 -0
  329. package/build/workers/types.d.ts +365 -0
  330. package/build/workers/types.d.ts.map +1 -0
  331. package/build/workers/types.js +60 -0
  332. package/build/workers/types.js.map +1 -0
  333. package/package.json +83 -25
  334. package/scripts/bundle-ecc.ts +111 -0
  335. package/src/address.ts +81 -44
  336. package/src/bech32utils.ts +3 -3
  337. package/src/bip66.ts +34 -24
  338. package/src/block.ts +196 -84
  339. package/src/branded.ts +18 -0
  340. package/src/crypto.ts +64 -26
  341. package/src/ecc/context.ts +277 -0
  342. package/src/ecc/index.ts +14 -0
  343. package/src/ecc/types.ts +154 -0
  344. package/src/ecpair.d.ts +99 -0
  345. package/src/errors.ts +163 -0
  346. package/src/index.ts +113 -9
  347. package/src/io/BinaryReader.ts +461 -0
  348. package/src/io/BinaryWriter.ts +696 -0
  349. package/src/io/MemoryPool.ts +343 -0
  350. package/src/io/base64.ts +20 -0
  351. package/src/io/hex.ts +155 -0
  352. package/src/io/index.ts +41 -0
  353. package/src/io/utils.ts +283 -0
  354. package/src/merkle.ts +14 -9
  355. package/src/networks.ts +9 -9
  356. package/src/payments/bip341.ts +34 -33
  357. package/src/payments/embed.ts +244 -41
  358. package/src/payments/index.ts +12 -10
  359. package/src/payments/p2ms.ts +490 -118
  360. package/src/payments/p2op.ts +431 -133
  361. package/src/payments/p2pk.ts +370 -72
  362. package/src/payments/p2pkh.ts +524 -130
  363. package/src/payments/p2sh.ts +572 -172
  364. package/src/payments/p2tr.ts +686 -194
  365. package/src/payments/p2wpkh.ts +484 -107
  366. package/src/payments/p2wsh.ts +526 -164
  367. package/src/payments/types.ts +80 -66
  368. package/src/psbt/bip371.ts +68 -51
  369. package/src/psbt/psbtutils.ts +39 -40
  370. package/src/psbt/types.ts +331 -0
  371. package/src/psbt/utils.ts +188 -0
  372. package/src/psbt/validation.ts +192 -0
  373. package/src/psbt.ts +566 -809
  374. package/src/pubkey.ts +24 -25
  375. package/src/push_data.ts +18 -16
  376. package/src/script.ts +82 -64
  377. package/src/script_number.ts +6 -6
  378. package/src/script_signature.ts +33 -36
  379. package/src/transaction.ts +458 -238
  380. package/src/types.ts +231 -100
  381. package/src/workers/WorkerSigningPool.node.ts +887 -0
  382. package/src/workers/WorkerSigningPool.ts +670 -0
  383. package/src/workers/ecc-bundle.ts +26 -0
  384. package/src/workers/index.ts +165 -0
  385. package/src/workers/psbt-parallel.ts +332 -0
  386. package/src/workers/signing-worker.ts +353 -0
  387. package/src/workers/types.ts +413 -0
  388. package/test/address.spec.ts +9 -6
  389. package/test/bitcoin.core.spec.ts +16 -17
  390. package/test/block.spec.ts +8 -7
  391. package/test/bufferutils.spec.ts +228 -214
  392. package/test/crypto.spec.ts +19 -11
  393. package/test/fixtures/p2pk.json +0 -8
  394. package/test/fixtures/p2pkh.json +1 -1
  395. package/test/fixtures/p2sh.json +1 -1
  396. package/test/fixtures/script.json +1 -1
  397. package/test/fixtures/transaction.json +2 -2
  398. package/test/integration/_regtest.ts +25 -0
  399. package/test/integration/addresses.spec.ts +4 -3
  400. package/test/integration/bip32.spec.ts +2 -1
  401. package/test/integration/blocks.spec.ts +1 -1
  402. package/test/integration/cltv.spec.ts +18 -16
  403. package/test/integration/csv.spec.ts +37 -64
  404. package/test/integration/payments.spec.ts +5 -3
  405. package/test/integration/taproot.spec.ts +76 -83
  406. package/test/integration/transactions.spec.ts +38 -35
  407. package/test/payments.spec.ts +35 -13
  408. package/test/payments.utils.ts +17 -16
  409. package/test/psbt.spec.ts +111 -100
  410. package/test/script.spec.ts +11 -10
  411. package/test/script_signature.spec.ts +9 -11
  412. package/test/taproot-cache.spec.ts +694 -0
  413. package/test/transaction.spec.ts +32 -40
  414. package/test/types.spec.ts +74 -29
  415. package/test/workers-pool.spec.ts +963 -0
  416. package/test/workers-signing.spec.ts +635 -0
  417. package/test/workers.spec.ts +1390 -0
  418. package/tsconfig.base.json +34 -18
  419. package/tsconfig.browser.json +15 -0
  420. package/tsconfig.build.json +5 -0
  421. package/tsconfig.json +5 -14
  422. package/vite.config.browser.ts +3 -42
  423. package/vitest.config.integration.ts +11 -0
  424. package/browser/bufferutils.d.ts +0 -34
  425. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  426. package/browser/chunks/payments-yjA0Evsv.js +0 -1089
  427. package/browser/chunks/psbt-URK2hBFc.js +0 -4039
  428. package/browser/chunks/script-DyPItFEl.js +0 -318
  429. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  430. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  431. package/browser/ecc_lib.d.ts +0 -3
  432. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  433. package/browser/hooks/HookedSigner.d.ts +0 -4
  434. package/browser/hooks/SignatureManager.d.ts +0 -13
  435. package/browser/payments/lazy.d.ts +0 -2
  436. package/browser/typeforce.d.ts +0 -38
  437. package/build/bufferutils.d.ts +0 -34
  438. package/build/bufferutils.js +0 -141
  439. package/build/ecc_lib.d.ts +0 -3
  440. package/build/ecc_lib.js +0 -61
  441. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  442. package/build/hooks/AdvancedSignatureManager.js +0 -52
  443. package/build/hooks/HookedSigner.d.ts +0 -4
  444. package/build/hooks/HookedSigner.js +0 -64
  445. package/build/hooks/SignatureManager.d.ts +0 -13
  446. package/build/hooks/SignatureManager.js +0 -45
  447. package/build/payments/lazy.d.ts +0 -2
  448. package/build/payments/lazy.js +0 -28
  449. package/build/tsconfig.tsbuildinfo +0 -1
  450. package/src/bufferutils.ts +0 -188
  451. package/src/ecc_lib.ts +0 -94
  452. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  453. package/src/hooks/HookedSigner.ts +0 -108
  454. package/src/hooks/SignatureManager.ts +0 -84
  455. package/src/payments/lazy.ts +0 -28
  456. package/src/typeforce.d.ts +0 -38
  457. package/tsconfig.webpack.json +0 -18
package/src/block.ts CHANGED
@@ -1,49 +1,84 @@
1
- import { BufferReader, BufferWriter, reverseBuffer, varuint } from './bufferutils.js';
2
1
  import * as bcrypto from './crypto.js';
2
+ import { BinaryReader, BinaryWriter, varuint, equals, fromHex, alloc, compare, toHex, reverse } from './io/index.js';
3
3
  import { fastMerkleRoot } from './merkle.js';
4
4
  import { Transaction } from './transaction.js';
5
- import * as types from './types.js';
6
-
7
- const { typeforce } = types;
5
+ import type { Bytes32 } from './types.js';
8
6
 
9
7
  const errorMerkleNoTxes = new TypeError('Cannot compute merkle root for zero transactions');
10
8
  const errorWitnessNotSegwit = new TypeError('Cannot compute witness commit for non-segwit block');
11
9
 
10
+ const WITNESS_COMMIT_PREFIX = fromHex('6a24aa21a9ed');
11
+
12
+ /**
13
+ * Represents a Bitcoin block with header fields and optional transactions.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { Block, fromHex } from '@btc-vision/bitcoin';
18
+ *
19
+ * // Parse a block from hex
20
+ * const block = Block.fromHex('0100000000000000...');
21
+ *
22
+ * // Access block properties
23
+ * console.log(block.version);
24
+ * console.log(block.getId());
25
+ * console.log(block.timestamp);
26
+ *
27
+ * // Check proof of work
28
+ * if (block.checkProofOfWork()) {
29
+ * console.log('Valid PoW');
30
+ * }
31
+ * ```
32
+ */
12
33
  export class Block {
34
+ /** Block version number */
13
35
  version: number = 1;
14
- prevHash?: Buffer = undefined;
15
- merkleRoot?: Buffer = undefined;
36
+ /** Hash of the previous block (32 bytes) */
37
+ prevHash?: Bytes32 = undefined;
38
+ /** Merkle root of the transactions (32 bytes) */
39
+ merkleRoot?: Bytes32 = undefined;
40
+ /** Block timestamp (Unix time) */
16
41
  timestamp: number = 0;
17
- witnessCommit?: Buffer = undefined;
42
+ /** Witness commitment for SegWit blocks (32 bytes) */
43
+ witnessCommit?: Bytes32 = undefined;
44
+ /** Compact representation of the target threshold */
18
45
  bits: number = 0;
46
+ /** Nonce used for proof of work */
19
47
  nonce: number = 0;
48
+ /** Array of transactions included in the block */
20
49
  transactions?: Transaction[] = undefined;
21
50
 
22
- static fromBuffer(buffer: Buffer): Block {
51
+ /**
52
+ * Parses a Block from a Uint8Array.
53
+ * @param buffer - The raw block data (minimum 80 bytes for header only)
54
+ * @returns Parsed Block instance
55
+ * @throws Error if buffer is too small
56
+ */
57
+ static fromBuffer(buffer: Uint8Array): Block {
23
58
  if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)');
24
59
 
25
- const bufferReader = new BufferReader(buffer);
60
+ const reader = new BinaryReader(buffer);
26
61
 
27
62
  const block = new Block();
28
- block.version = bufferReader.readInt32();
29
- block.prevHash = bufferReader.readSlice(32);
30
- block.merkleRoot = bufferReader.readSlice(32);
31
- block.timestamp = bufferReader.readUInt32();
32
- block.bits = bufferReader.readUInt32();
33
- block.nonce = bufferReader.readUInt32();
63
+ block.version = reader.readInt32LE();
64
+ block.prevHash = reader.readBytes(32) as Bytes32;
65
+ block.merkleRoot = reader.readBytes(32) as Bytes32;
66
+ block.timestamp = reader.readUInt32LE();
67
+ block.bits = reader.readUInt32LE();
68
+ block.nonce = reader.readUInt32LE();
34
69
 
35
70
  if (buffer.length === 80) return block;
36
71
 
37
72
  const readTransaction = (): Transaction => {
38
73
  const tx = Transaction.fromBuffer(
39
- bufferReader.buffer.subarray(bufferReader.offset),
74
+ reader.data.subarray(reader.offset),
40
75
  true,
41
76
  );
42
- bufferReader.offset += tx.byteLength();
77
+ reader.offset += tx.byteLength();
43
78
  return tx;
44
79
  };
45
80
 
46
- const nTransactions = bufferReader.readVarInt();
81
+ const nTransactions = reader.readVarInt();
47
82
  block.transactions = [];
48
83
 
49
84
  for (let i = 0; i < nTransactions; ++i) {
@@ -58,20 +93,43 @@ export class Block {
58
93
  return block;
59
94
  }
60
95
 
96
+ /**
97
+ * Parses a Block from a hex string.
98
+ * @param hex - Hexadecimal representation of the block
99
+ * @returns Parsed Block instance
100
+ */
61
101
  static fromHex(hex: string): Block {
62
- return Block.fromBuffer(Buffer.from(hex, 'hex'));
102
+ return Block.fromBuffer(fromHex(hex));
63
103
  }
64
104
 
65
- static calculateTarget(bits: number): Buffer {
105
+ /**
106
+ * Calculates the target threshold from the compact bits representation.
107
+ * @param bits - Compact bits value from block header
108
+ * @returns 32-byte target threshold
109
+ */
110
+ static calculateTarget(bits: number): Bytes32 {
66
111
  const exponent = ((bits & 0xff000000) >> 24) - 3;
67
112
  const mantissa = bits & 0x007fffff;
68
- const target = Buffer.alloc(32, 0);
69
- target.writeUIntBE(mantissa, 29 - exponent, 3);
70
- return target;
113
+ const target = alloc(32);
114
+ // Write mantissa as big-endian at the computed offset
115
+ const offset = 29 - exponent;
116
+ target[offset] = (mantissa >> 16) & 0xff;
117
+ target[offset + 1] = (mantissa >> 8) & 0xff;
118
+ target[offset + 2] = mantissa & 0xff;
119
+ return target as Bytes32;
71
120
  }
72
121
 
73
- static calculateMerkleRoot(transactions: Transaction[], forWitness?: boolean): Buffer {
74
- typeforce([{ getHash: types.Function }], transactions);
122
+ /**
123
+ * Calculates the merkle root for a list of transactions.
124
+ * @param transactions - Array of transactions
125
+ * @param forWitness - If true, calculate witness merkle root (for SegWit)
126
+ * @returns 32-byte merkle root hash
127
+ * @throws TypeError if transactions is empty or not an array
128
+ */
129
+ static calculateMerkleRoot(transactions: Transaction[], forWitness?: boolean): Bytes32 {
130
+ if (!Array.isArray(transactions)) {
131
+ throw new TypeError('Expected an array of transactions');
132
+ }
75
133
  if (transactions.length === 0) throw errorMerkleNoTxes;
76
134
  if (forWitness && !txesHaveWitnessCommit(transactions)) throw errorWitnessNotSegwit;
77
135
 
@@ -79,45 +137,74 @@ export class Block {
79
137
 
80
138
  const rootHash = fastMerkleRoot(hashes, bcrypto.hash256);
81
139
 
82
- return forWitness
83
- ? bcrypto.hash256(Buffer.concat([rootHash, transactions[0].ins[0].witness[0]]))
84
- : rootHash;
140
+ if (forWitness) {
141
+ const witness = transactions[0]!.ins[0]!.witness![0]!;
142
+ const combined = new Uint8Array(rootHash.length + witness.length);
143
+ combined.set(rootHash);
144
+ combined.set(witness, rootHash.length);
145
+ return bcrypto.hash256(combined) as Bytes32;
146
+ }
147
+ return rootHash as Bytes32;
85
148
  }
86
149
 
87
- getWitnessCommit(): Buffer | null {
88
- if (!txesHaveWitnessCommit(this.transactions!)) return null;
150
+ /**
151
+ * Extracts the witness commitment from the coinbase transaction.
152
+ * @returns 32-byte witness commitment or null if not found
153
+ */
154
+ getWitnessCommit(): Bytes32 | null {
155
+ if (!this.transactions || !txesHaveWitnessCommit(this.transactions)) return null;
89
156
 
90
157
  // The merkle root for the witness data is in an OP_RETURN output.
91
158
  // There is no rule for the index of the output, so use filter to find it.
92
159
  // The root is prepended with 0xaa21a9ed so check for 0x6a24aa21a9ed
93
160
  // If multiple commits are found, the output with highest index is assumed.
94
- const witnessCommits = this.transactions![0].outs.filter((out) =>
95
- out.script.subarray(0, 6).equals(Buffer.from('6a24aa21a9ed', 'hex')),
96
- ).map((out) => out.script.subarray(6, 38));
161
+ const witnessCommits = this.transactions[0]!.outs
162
+ .filter((out) => equals(out.script.subarray(0, 6), WITNESS_COMMIT_PREFIX))
163
+ .map((out) => out.script.subarray(6, 38));
97
164
  if (witnessCommits.length === 0) return null;
98
165
  // Use the commit with the highest output (should only be one though)
99
166
  const result = witnessCommits[witnessCommits.length - 1];
100
167
 
101
- if (!(result instanceof Buffer && result.length === 32)) return null;
102
- return result;
168
+ if (!(result instanceof Uint8Array && result.length === 32)) return null;
169
+ return result as Bytes32;
103
170
  }
104
171
 
172
+ /**
173
+ * Checks if this block has a witness commitment.
174
+ * @returns True if the block has a witness commitment
175
+ */
105
176
  hasWitnessCommit(): boolean {
106
- if (this.witnessCommit instanceof Buffer && this.witnessCommit.length === 32) return true;
177
+ if (this.witnessCommit instanceof Uint8Array && this.witnessCommit.length === 32)
178
+ return true;
107
179
  if (this.getWitnessCommit() !== null) return true;
108
180
  return false;
109
181
  }
110
182
 
183
+ /**
184
+ * Checks if any transaction in this block has witness data.
185
+ * @returns True if any transaction has witness data
186
+ */
111
187
  hasWitness(): boolean {
112
- return anyTxHasWitness(this.transactions!);
188
+ return this.transactions ? anyTxHasWitness(this.transactions) : false;
113
189
  }
114
190
 
191
+ /**
192
+ * Calculates the weight of this block.
193
+ * Weight = (base size * 3) + total size
194
+ * @returns Block weight in weight units
195
+ */
115
196
  weight(): number {
116
197
  const base = this.byteLength(false, false);
117
198
  const total = this.byteLength(false, true);
118
199
  return base * 3 + total;
119
200
  }
120
201
 
202
+ /**
203
+ * Calculates the serialized byte length of this block.
204
+ * @param headersOnly - If true, return only header size (80 bytes)
205
+ * @param allowWitness - If true, include witness data in calculation
206
+ * @returns Byte length of the serialized block
207
+ */
121
208
  byteLength(headersOnly?: boolean, allowWitness: boolean = true): number {
122
209
  if (headersOnly || !this.transactions) return 80;
123
210
 
@@ -128,14 +215,26 @@ export class Block {
128
215
  );
129
216
  }
130
217
 
131
- getHash(): Buffer {
218
+ /**
219
+ * Computes the double-SHA256 hash of the block header.
220
+ * @returns 32-byte block hash
221
+ */
222
+ getHash(): Bytes32 {
132
223
  return bcrypto.hash256(this.toBuffer(true));
133
224
  }
134
225
 
226
+ /**
227
+ * Returns the block ID (hash in reversed hex format, as displayed in block explorers).
228
+ * @returns Block ID as hex string
229
+ */
135
230
  getId(): string {
136
- return reverseBuffer(this.getHash()).toString('hex');
231
+ return toHex(reverse(this.getHash()));
137
232
  }
138
233
 
234
+ /**
235
+ * Converts the block timestamp to a Date object.
236
+ * @returns UTC date of the block
237
+ */
139
238
  getUTCDate(): Date {
140
239
  const date = new Date(0); // epoch
141
240
  date.setUTCSeconds(this.timestamp);
@@ -143,94 +242,107 @@ export class Block {
143
242
  return date;
144
243
  }
145
244
 
146
- // TODO: buffer, offset compatibility
147
- toBuffer(headersOnly?: boolean): Buffer {
148
- const buffer: Buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
245
+ /**
246
+ * Serializes the block to a Uint8Array.
247
+ * @param headersOnly - If true, only serialize the 80-byte header
248
+ * @returns Serialized block data
249
+ */
250
+ toBuffer(headersOnly?: boolean): Uint8Array {
251
+ if (!this.prevHash) throw new TypeError('Block prevHash is required');
252
+ if (!this.merkleRoot) throw new TypeError('Block merkleRoot is required');
149
253
 
150
- const bufferWriter = new BufferWriter(buffer);
254
+ const buffer = new Uint8Array(this.byteLength(headersOnly));
151
255
 
152
- bufferWriter.writeInt32(this.version);
153
- bufferWriter.writeSlice(this.prevHash!);
154
- bufferWriter.writeSlice(this.merkleRoot!);
155
- bufferWriter.writeUInt32(this.timestamp);
156
- bufferWriter.writeUInt32(this.bits);
157
- bufferWriter.writeUInt32(this.nonce);
256
+ const writer = new BinaryWriter(buffer);
257
+
258
+ writer.writeInt32LE(this.version);
259
+ writer.writeBytes(this.prevHash);
260
+ writer.writeBytes(this.merkleRoot);
261
+ writer.writeUInt32LE(this.timestamp);
262
+ writer.writeUInt32LE(this.bits);
263
+ writer.writeUInt32LE(this.nonce);
158
264
 
159
265
  if (headersOnly || !this.transactions) return buffer;
160
266
 
161
- const encoded = varuint.encode(this.transactions.length, buffer, bufferWriter.offset);
162
- bufferWriter.offset += encoded.bytes;
267
+ writer.writeVarInt(this.transactions.length);
163
268
 
164
269
  this.transactions.forEach((tx) => {
165
270
  const txSize = tx.byteLength(); // TODO: extract from toBuffer?
166
- tx.toBuffer(buffer, bufferWriter.offset);
167
- bufferWriter.offset += txSize;
271
+ tx.toBuffer(buffer.subarray(writer.offset));
272
+ writer.offset += txSize;
168
273
  });
169
274
 
170
275
  return buffer;
171
276
  }
172
277
 
278
+ /**
279
+ * Serializes the block to a hex string.
280
+ * @param headersOnly - If true, only serialize the 80-byte header
281
+ * @returns Hex string representation of the block
282
+ */
173
283
  toHex(headersOnly?: boolean): string {
174
- return this.toBuffer(headersOnly).toString('hex');
284
+ return toHex(this.toBuffer(headersOnly));
175
285
  }
176
286
 
287
+ /**
288
+ * Validates the merkle root and witness commitment (if present).
289
+ * @returns True if the transaction roots are valid
290
+ */
177
291
  checkTxRoots(): boolean {
178
292
  // If the Block has segwit transactions but no witness commit,
179
293
  // there's no way it can be valid, so fail the check.
180
294
  const hasWitnessCommit = this.hasWitnessCommit();
181
295
  if (!hasWitnessCommit && this.hasWitness()) return false;
182
- return this.__checkMerkleRoot() && (hasWitnessCommit ? this.__checkWitnessCommit() : true);
296
+ return this.#checkMerkleRoot() && (hasWitnessCommit ? this.#checkWitnessCommit() : true);
183
297
  }
184
298
 
299
+ /**
300
+ * Validates that the block hash meets the target threshold (proof of work).
301
+ * @returns True if the block's proof of work is valid
302
+ */
185
303
  checkProofOfWork(): boolean {
186
- const hash: Buffer = reverseBuffer(this.getHash());
304
+ const hash = reverse(this.getHash());
187
305
  const target = Block.calculateTarget(this.bits);
188
306
 
189
- return hash.compare(target) <= 0;
307
+ return compare(hash, target) <= 0;
190
308
  }
191
309
 
192
- private __checkMerkleRoot(): boolean {
310
+ #checkMerkleRoot(): boolean {
193
311
  if (!this.transactions) throw errorMerkleNoTxes;
312
+ if (!this.merkleRoot) throw new TypeError('Block merkleRoot is required');
194
313
 
195
314
  const actualMerkleRoot = Block.calculateMerkleRoot(this.transactions);
196
- return this.merkleRoot!.compare(actualMerkleRoot) === 0;
315
+ return compare(this.merkleRoot, actualMerkleRoot) === 0;
197
316
  }
198
317
 
199
- private __checkWitnessCommit(): boolean {
318
+ #checkWitnessCommit(): boolean {
200
319
  if (!this.transactions) throw errorMerkleNoTxes;
201
320
  if (!this.hasWitnessCommit()) throw errorWitnessNotSegwit;
321
+ if (!this.witnessCommit) throw errorWitnessNotSegwit;
202
322
 
203
323
  const actualWitnessCommit = Block.calculateMerkleRoot(this.transactions, true);
204
- return this.witnessCommit!.compare(actualWitnessCommit) === 0;
324
+ return compare(this.witnessCommit, actualWitnessCommit) === 0;
205
325
  }
206
326
  }
207
327
 
328
+ /**
329
+ * Checks if the coinbase transaction has witness data (required for witness commitment).
330
+ * @param transactions - Array of transactions
331
+ * @returns True if coinbase has witness data
332
+ */
208
333
  function txesHaveWitnessCommit(transactions: Transaction[]): boolean {
209
- return (
210
- transactions instanceof Array &&
211
- transactions[0] &&
212
- transactions[0].ins &&
213
- transactions[0].ins instanceof Array &&
214
- transactions[0].ins[0] &&
215
- transactions[0].ins[0].witness &&
216
- transactions[0].ins[0].witness instanceof Array &&
217
- transactions[0].ins[0].witness.length > 0
218
- );
334
+ const coinbase = transactions[0];
335
+ if (!coinbase?.ins?.[0]?.witness) return false;
336
+ return coinbase.ins[0].witness.length > 0;
219
337
  }
220
338
 
339
+ /**
340
+ * Checks if any transaction in the array has witness data.
341
+ * @param transactions - Array of transactions
342
+ * @returns True if any transaction has witness data
343
+ */
221
344
  function anyTxHasWitness(transactions: Transaction[]): boolean {
222
- return (
223
- transactions instanceof Array &&
224
- transactions.some(
225
- (tx) =>
226
- typeof tx === 'object' &&
227
- tx.ins instanceof Array &&
228
- tx.ins.some(
229
- (input) =>
230
- typeof input === 'object' &&
231
- input.witness instanceof Array &&
232
- input.witness.length > 0,
233
- ),
234
- )
345
+ return transactions.some((tx) =>
346
+ tx.ins?.some((input) => input.witness && input.witness.length > 0),
235
347
  );
236
348
  }
package/src/branded.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Branded type definitions for type-safe primitives.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+
7
+ declare const __brand: unique symbol;
8
+ type Brand<T, B extends string> = T & { readonly [__brand]: B };
9
+
10
+ export type Bytes32 = Brand<Uint8Array, 'Bytes32'>;
11
+ export type Bytes20 = Brand<Uint8Array, 'Bytes20'>;
12
+ export type PublicKey = Brand<Uint8Array, 'PublicKey'>;
13
+ export type XOnlyPublicKey = Brand<Uint8Array, 'XOnlyPublicKey'>;
14
+ export type Satoshi = Brand<bigint, 'Satoshi'>;
15
+ export type PrivateKey = Brand<Uint8Array, 'PrivateKey'>;
16
+ export type Signature = Brand<Uint8Array, 'Signature'>;
17
+ export type SchnorrSignature = Brand<Uint8Array, 'SchnorrSignature'>;
18
+ export type Script = Brand<Uint8Array, 'Script'>;
package/src/crypto.ts CHANGED
@@ -1,32 +1,62 @@
1
1
  /**
2
- * A module for hashing functions.
3
- * include ripemd160sha1sha256hash160hash256taggedHash
2
+ * Cryptographic hashing functions for Bitcoin.
3
+ * Includes ripemd160, sha1, sha256, hash160, hash256, and taggedHash.
4
4
  *
5
5
  * @packageDocumentation
6
6
  */
7
7
  import { ripemd160 as _ripemd160, sha1 as _sha1 } from '@noble/hashes/legacy.js';
8
8
  import { sha256 as _sha256 } from '@noble/hashes/sha2.js';
9
+ import { concat } from './io/index.js';
10
+ import type { Bytes32, Bytes20 } from './types.js';
9
11
 
10
- export function ripemd160(buffer: Buffer): Buffer {
11
- return Buffer.from(_ripemd160(Uint8Array.from(buffer)));
12
+ /**
13
+ * Computes RIPEMD-160 hash of the input.
14
+ * @param data - Input data
15
+ * @returns 20-byte hash (Bytes20)
16
+ */
17
+ export function ripemd160(data: Uint8Array): Bytes20 {
18
+ return _ripemd160(data) as Bytes20;
12
19
  }
13
20
 
14
- export function sha1(buffer: Buffer): Buffer {
15
- return Buffer.from(_sha1(Uint8Array.from(buffer)));
21
+ /**
22
+ * Computes SHA-1 hash of the input.
23
+ * @param data - Input data
24
+ * @returns 20-byte hash (Bytes20)
25
+ */
26
+ export function sha1(data: Uint8Array): Bytes20 {
27
+ return _sha1(data) as Bytes20;
16
28
  }
17
29
 
18
- export function sha256(buffer: Buffer): Buffer {
19
- return Buffer.from(_sha256(Uint8Array.from(buffer)));
30
+ /**
31
+ * Computes SHA-256 hash of the input.
32
+ * @param data - Input data
33
+ * @returns 32-byte hash (Bytes32)
34
+ */
35
+ export function sha256(data: Uint8Array): Bytes32 {
36
+ return _sha256(data) as Bytes32;
20
37
  }
21
38
 
22
- export function hash160(buffer: Buffer): Buffer {
23
- return Buffer.from(_ripemd160(_sha256(Uint8Array.from(buffer))));
39
+ /**
40
+ * Computes HASH160 (RIPEMD160(SHA256(data))) of the input.
41
+ * @param data - Input data
42
+ * @returns 20-byte hash (Bytes20)
43
+ */
44
+ export function hash160(data: Uint8Array): Bytes20 {
45
+ return _ripemd160(_sha256(data)) as Bytes20;
24
46
  }
25
47
 
26
- export function hash256(buffer: Buffer): Buffer {
27
- return Buffer.from(_sha256(_sha256(Uint8Array.from(buffer))));
48
+ /**
49
+ * Computes double SHA-256 hash of the input.
50
+ * @param data - Input data
51
+ * @returns 32-byte hash (Bytes32)
52
+ */
53
+ export function hash256(data: Uint8Array): Bytes32 {
54
+ return _sha256(_sha256(data)) as Bytes32;
28
55
  }
29
56
 
57
+ /**
58
+ * BIP340/Taproot tag names for tagged hashing.
59
+ */
30
60
  export const TAGS = [
31
61
  'BIP0340/challenge',
32
62
  'BIP0340/aux',
@@ -38,63 +68,65 @@ export const TAGS = [
38
68
  'KeyAgg list',
39
69
  'KeyAgg coefficient',
40
70
  ] as const;
71
+
41
72
  export type TaggedHashPrefix = (typeof TAGS)[number];
73
+
42
74
  type TaggedHashPrefixes = {
43
- [key in TaggedHashPrefix]: Buffer;
75
+ [key in TaggedHashPrefix]: Uint8Array;
44
76
  };
45
- /** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */
77
+
46
78
  /**
47
- * Defines the tagged hash prefixes used in the crypto module.
79
+ * Precomputed tagged hash prefixes: SHA256(tag) || SHA256(tag)
48
80
  */
49
81
  export const TAGGED_HASH_PREFIXES: TaggedHashPrefixes = {
50
- 'BIP0340/challenge': Buffer.from([
82
+ 'BIP0340/challenge': new Uint8Array([
51
83
  123, 181, 45, 122, 159, 239, 88, 50, 62, 177, 191, 122, 64, 125, 179, 130, 210, 243, 242,
52
84
  216, 27, 177, 34, 79, 73, 254, 81, 143, 109, 72, 211, 124, 123, 181, 45, 122, 159, 239, 88,
53
85
  50, 62, 177, 191, 122, 64, 125, 179, 130, 210, 243, 242, 216, 27, 177, 34, 79, 73, 254, 81,
54
86
  143, 109, 72, 211, 124,
55
87
  ]),
56
- 'BIP0340/aux': Buffer.from([
88
+ 'BIP0340/aux': new Uint8Array([
57
89
  241, 239, 78, 94, 192, 99, 202, 218, 109, 148, 202, 250, 157, 152, 126, 160, 105, 38, 88,
58
90
  57, 236, 193, 31, 151, 45, 119, 165, 46, 216, 193, 204, 144, 241, 239, 78, 94, 192, 99, 202,
59
91
  218, 109, 148, 202, 250, 157, 152, 126, 160, 105, 38, 88, 57, 236, 193, 31, 151, 45, 119,
60
92
  165, 46, 216, 193, 204, 144,
61
93
  ]),
62
- 'BIP0340/nonce': Buffer.from([
94
+ 'BIP0340/nonce': new Uint8Array([
63
95
  7, 73, 119, 52, 167, 155, 203, 53, 91, 155, 140, 125, 3, 79, 18, 28, 244, 52, 215, 62, 247,
64
96
  45, 218, 25, 135, 0, 97, 251, 82, 191, 235, 47, 7, 73, 119, 52, 167, 155, 203, 53, 91, 155,
65
97
  140, 125, 3, 79, 18, 28, 244, 52, 215, 62, 247, 45, 218, 25, 135, 0, 97, 251, 82, 191, 235,
66
98
  47,
67
99
  ]),
68
- TapLeaf: Buffer.from([
100
+ TapLeaf: new Uint8Array([
69
101
  174, 234, 143, 220, 66, 8, 152, 49, 5, 115, 75, 88, 8, 29, 30, 38, 56, 211, 95, 28, 181, 64,
70
102
  8, 212, 211, 87, 202, 3, 190, 120, 233, 238, 174, 234, 143, 220, 66, 8, 152, 49, 5, 115, 75,
71
103
  88, 8, 29, 30, 38, 56, 211, 95, 28, 181, 64, 8, 212, 211, 87, 202, 3, 190, 120, 233, 238,
72
104
  ]),
73
- TapBranch: Buffer.from([
105
+ TapBranch: new Uint8Array([
74
106
  25, 65, 161, 242, 229, 110, 185, 95, 162, 169, 241, 148, 190, 92, 1, 247, 33, 111, 51, 237,
75
107
  130, 176, 145, 70, 52, 144, 208, 91, 245, 22, 160, 21, 25, 65, 161, 242, 229, 110, 185, 95,
76
108
  162, 169, 241, 148, 190, 92, 1, 247, 33, 111, 51, 237, 130, 176, 145, 70, 52, 144, 208, 91,
77
109
  245, 22, 160, 21,
78
110
  ]),
79
- TapSighash: Buffer.from([
111
+ TapSighash: new Uint8Array([
80
112
  244, 10, 72, 223, 75, 42, 112, 200, 180, 146, 75, 242, 101, 70, 97, 237, 61, 149, 253, 102,
81
113
  163, 19, 235, 135, 35, 117, 151, 198, 40, 228, 160, 49, 244, 10, 72, 223, 75, 42, 112, 200,
82
114
  180, 146, 75, 242, 101, 70, 97, 237, 61, 149, 253, 102, 163, 19, 235, 135, 35, 117, 151,
83
115
  198, 40, 228, 160, 49,
84
116
  ]),
85
- TapTweak: Buffer.from([
117
+ TapTweak: new Uint8Array([
86
118
  232, 15, 225, 99, 156, 156, 160, 80, 227, 175, 27, 57, 193, 67, 198, 62, 66, 156, 188, 235,
87
119
  21, 217, 64, 251, 181, 197, 161, 244, 175, 87, 197, 233, 232, 15, 225, 99, 156, 156, 160,
88
120
  80, 227, 175, 27, 57, 193, 67, 198, 62, 66, 156, 188, 235, 21, 217, 64, 251, 181, 197, 161,
89
121
  244, 175, 87, 197, 233,
90
122
  ]),
91
- 'KeyAgg list': Buffer.from([
123
+ 'KeyAgg list': new Uint8Array([
92
124
  72, 28, 151, 28, 60, 11, 70, 215, 240, 178, 117, 174, 89, 141, 78, 44, 126, 215, 49, 156,
93
125
  89, 74, 92, 110, 199, 158, 160, 212, 153, 2, 148, 240, 72, 28, 151, 28, 60, 11, 70, 215,
94
126
  240, 178, 117, 174, 89, 141, 78, 44, 126, 215, 49, 156, 89, 74, 92, 110, 199, 158, 160, 212,
95
127
  153, 2, 148, 240,
96
128
  ]),
97
- 'KeyAgg coefficient': Buffer.from([
129
+ 'KeyAgg coefficient': new Uint8Array([
98
130
  191, 201, 4, 3, 77, 28, 136, 232, 200, 14, 34, 229, 61, 36, 86, 109, 100, 130, 78, 214, 66,
99
131
  114, 129, 192, 145, 0, 249, 77, 205, 82, 201, 129, 191, 201, 4, 3, 77, 28, 136, 232, 200,
100
132
  14, 34, 229, 61, 36, 86, 109, 100, 130, 78, 214, 66, 114, 129, 192, 145, 0, 249, 77, 205,
@@ -102,6 +134,12 @@ export const TAGGED_HASH_PREFIXES: TaggedHashPrefixes = {
102
134
  ]),
103
135
  };
104
136
 
105
- export function taggedHash(prefix: TaggedHashPrefix, data: Buffer): Buffer {
106
- return sha256(Buffer.concat([TAGGED_HASH_PREFIXES[prefix], data]));
137
+ /**
138
+ * Computes a BIP340-style tagged hash.
139
+ * @param prefix - The tag name
140
+ * @param data - Input data
141
+ * @returns 32-byte hash (Bytes32)
142
+ */
143
+ export function taggedHash(prefix: TaggedHashPrefix, data: Uint8Array): Bytes32 {
144
+ return sha256(concat([TAGGED_HASH_PREFIXES[prefix], data]));
107
145
  }