@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.1

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 (456) hide show
  1. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  2. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  3. package/benchmark/signing.bench.ts +147 -0
  4. package/browser/address.d.ts +57 -10
  5. package/browser/address.d.ts.map +1 -0
  6. package/browser/bech32utils.d.ts +9 -1
  7. package/browser/bech32utils.d.ts.map +1 -0
  8. package/browser/bip66.d.ts +11 -6
  9. package/browser/bip66.d.ts.map +1 -0
  10. package/browser/block.d.ts +117 -11
  11. package/browser/block.d.ts.map +1 -0
  12. package/browser/branded.d.ts +20 -0
  13. package/browser/branded.d.ts.map +1 -0
  14. package/browser/crypto/crypto.d.ts +1 -0
  15. package/browser/crypto/crypto.d.ts.map +1 -0
  16. package/browser/crypto.d.ts +46 -7
  17. package/browser/crypto.d.ts.map +1 -0
  18. package/browser/ecc/context.d.ts +129 -0
  19. package/browser/ecc/context.d.ts.map +1 -0
  20. package/browser/ecc/index.d.ts +11 -0
  21. package/browser/ecc/index.d.ts.map +1 -0
  22. package/browser/ecc/types.d.ts +128 -0
  23. package/browser/ecc/types.d.ts.map +1 -0
  24. package/browser/ecpair.d.ts +99 -0
  25. package/browser/errors.d.ts +124 -0
  26. package/browser/errors.d.ts.map +1 -0
  27. package/browser/index.d.ts +32 -5
  28. package/browser/index.d.ts.map +1 -0
  29. package/browser/index.js +12477 -101
  30. package/browser/io/BinaryReader.d.ts +276 -0
  31. package/browser/io/BinaryReader.d.ts.map +1 -0
  32. package/browser/io/BinaryWriter.d.ts +391 -0
  33. package/browser/io/BinaryWriter.d.ts.map +1 -0
  34. package/browser/io/MemoryPool.d.ts +220 -0
  35. package/browser/io/MemoryPool.d.ts.map +1 -0
  36. package/browser/io/base64.d.ts +13 -0
  37. package/browser/io/base64.d.ts.map +1 -0
  38. package/browser/io/hex.d.ts +67 -0
  39. package/browser/io/hex.d.ts.map +1 -0
  40. package/browser/io/index.d.ts +17 -0
  41. package/browser/io/index.d.ts.map +1 -0
  42. package/browser/io/utils.d.ts +199 -0
  43. package/browser/io/utils.d.ts.map +1 -0
  44. package/browser/merkle.d.ts +10 -1
  45. package/browser/merkle.d.ts.map +1 -0
  46. package/browser/networks.d.ts +70 -9
  47. package/browser/networks.d.ts.map +1 -0
  48. package/browser/opcodes.d.ts +1 -0
  49. package/browser/opcodes.d.ts.map +1 -0
  50. package/browser/payments/bip341.d.ts +35 -9
  51. package/browser/payments/bip341.d.ts.map +1 -0
  52. package/browser/payments/embed.d.ts +112 -1
  53. package/browser/payments/embed.d.ts.map +1 -0
  54. package/browser/payments/index.d.ts +17 -10
  55. package/browser/payments/index.d.ts.map +1 -0
  56. package/browser/payments/p2ms.d.ts +150 -0
  57. package/browser/payments/p2ms.d.ts.map +1 -0
  58. package/browser/payments/p2op.d.ts +150 -24
  59. package/browser/payments/p2op.d.ts.map +1 -0
  60. package/browser/payments/p2pk.d.ts +154 -1
  61. package/browser/payments/p2pk.d.ts.map +1 -0
  62. package/browser/payments/p2pkh.d.ts +176 -1
  63. package/browser/payments/p2pkh.d.ts.map +1 -0
  64. package/browser/payments/p2sh.d.ts +150 -1
  65. package/browser/payments/p2sh.d.ts.map +1 -0
  66. package/browser/payments/p2tr.d.ts +185 -1
  67. package/browser/payments/p2tr.d.ts.map +1 -0
  68. package/browser/payments/p2wpkh.d.ts +161 -1
  69. package/browser/payments/p2wpkh.d.ts.map +1 -0
  70. package/browser/payments/p2wsh.d.ts +146 -1
  71. package/browser/payments/p2wsh.d.ts.map +1 -0
  72. package/browser/payments/types.d.ts +94 -64
  73. package/browser/payments/types.d.ts.map +1 -0
  74. package/browser/psbt/bip371.d.ts +34 -8
  75. package/browser/psbt/bip371.d.ts.map +1 -0
  76. package/browser/psbt/psbtutils.d.ts +56 -16
  77. package/browser/psbt/psbtutils.d.ts.map +1 -0
  78. package/browser/psbt/types.d.ts +245 -0
  79. package/browser/psbt/types.d.ts.map +1 -0
  80. package/browser/psbt/utils.d.ts +64 -0
  81. package/browser/psbt/utils.d.ts.map +1 -0
  82. package/browser/psbt/validation.d.ts +84 -0
  83. package/browser/psbt/validation.d.ts.map +1 -0
  84. package/browser/psbt.d.ts +82 -118
  85. package/browser/psbt.d.ts.map +1 -0
  86. package/browser/pubkey.d.ts +27 -6
  87. package/browser/pubkey.d.ts.map +1 -0
  88. package/browser/push_data.d.ts +24 -2
  89. package/browser/push_data.d.ts.map +1 -0
  90. package/browser/script.d.ts +33 -8
  91. package/browser/script.d.ts.map +1 -0
  92. package/browser/script_number.d.ts +17 -0
  93. package/browser/script_number.d.ts.map +1 -0
  94. package/browser/script_signature.d.ts +23 -5
  95. package/browser/script_signature.d.ts.map +1 -0
  96. package/browser/transaction.d.ts +160 -18
  97. package/browser/transaction.d.ts.map +1 -0
  98. package/browser/types.d.ts +36 -38
  99. package/browser/types.d.ts.map +1 -0
  100. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  101. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  103. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  104. package/browser/workers/ecc-bundle.d.ts +25 -0
  105. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  106. package/browser/workers/index.d.ts +91 -0
  107. package/browser/workers/index.d.ts.map +1 -0
  108. package/browser/workers/psbt-parallel.d.ts +88 -0
  109. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  110. package/browser/workers/signing-worker.d.ts +37 -0
  111. package/browser/workers/signing-worker.d.ts.map +1 -0
  112. package/browser/workers/types.d.ts +365 -0
  113. package/browser/workers/types.d.ts.map +1 -0
  114. package/build/address.d.ts +58 -11
  115. package/build/address.d.ts.map +1 -0
  116. package/build/address.js +82 -25
  117. package/build/address.js.map +1 -0
  118. package/build/bech32utils.d.ts +9 -1
  119. package/build/bech32utils.d.ts.map +1 -0
  120. package/build/bech32utils.js +10 -2
  121. package/build/bech32utils.js.map +1 -0
  122. package/build/bip66.d.ts +11 -6
  123. package/build/bip66.d.ts.map +1 -0
  124. package/build/bip66.js +32 -3
  125. package/build/bip66.js.map +1 -0
  126. package/build/block.d.ts +117 -11
  127. package/build/block.d.ts.map +1 -0
  128. package/build/block.js +202 -72
  129. package/build/block.js.map +1 -0
  130. package/build/branded.d.ts +20 -0
  131. package/build/branded.d.ts.map +1 -0
  132. package/build/branded.js +7 -0
  133. package/build/branded.js.map +1 -0
  134. package/build/crypto/crypto.d.ts +1 -0
  135. package/build/crypto/crypto.d.ts.map +1 -0
  136. package/build/crypto/crypto.js +1 -0
  137. package/build/crypto/crypto.js.map +1 -0
  138. package/build/crypto.d.ts +46 -7
  139. package/build/crypto.d.ts.map +1 -0
  140. package/build/crypto.js +65 -20
  141. package/build/crypto.js.map +1 -0
  142. package/build/ecc/context.d.ts +135 -0
  143. package/build/ecc/context.d.ts.map +1 -0
  144. package/build/ecc/context.js +232 -0
  145. package/build/ecc/context.js.map +1 -0
  146. package/build/ecc/index.d.ts +11 -0
  147. package/build/ecc/index.d.ts.map +1 -0
  148. package/build/ecc/index.js +11 -0
  149. package/build/ecc/index.js.map +1 -0
  150. package/build/ecc/types.d.ts +134 -0
  151. package/build/ecc/types.d.ts.map +1 -0
  152. package/build/ecc/types.js +8 -0
  153. package/build/ecc/types.js.map +1 -0
  154. package/build/errors.d.ts +124 -0
  155. package/build/errors.d.ts.map +1 -0
  156. package/build/errors.js +155 -0
  157. package/build/errors.js.map +1 -0
  158. package/build/index.d.ts +32 -5
  159. package/build/index.d.ts.map +1 -0
  160. package/build/index.js +26 -3
  161. package/build/index.js.map +1 -0
  162. package/build/io/BinaryReader.d.ts +276 -0
  163. package/build/io/BinaryReader.d.ts.map +1 -0
  164. package/build/io/BinaryReader.js +425 -0
  165. package/build/io/BinaryReader.js.map +1 -0
  166. package/build/io/BinaryWriter.d.ts +391 -0
  167. package/build/io/BinaryWriter.d.ts.map +1 -0
  168. package/build/io/BinaryWriter.js +611 -0
  169. package/build/io/BinaryWriter.js.map +1 -0
  170. package/build/io/MemoryPool.d.ts +220 -0
  171. package/build/io/MemoryPool.d.ts.map +1 -0
  172. package/build/io/MemoryPool.js +309 -0
  173. package/build/io/MemoryPool.js.map +1 -0
  174. package/build/io/base64.d.ts +13 -0
  175. package/build/io/base64.d.ts.map +1 -0
  176. package/build/io/base64.js +20 -0
  177. package/build/io/base64.js.map +1 -0
  178. package/build/io/hex.d.ts +67 -0
  179. package/build/io/hex.d.ts.map +1 -0
  180. package/build/io/hex.js +138 -0
  181. package/build/io/hex.js.map +1 -0
  182. package/build/io/index.d.ts +17 -0
  183. package/build/io/index.d.ts.map +1 -0
  184. package/build/io/index.js +23 -0
  185. package/build/io/index.js.map +1 -0
  186. package/build/io/utils.d.ts +199 -0
  187. package/build/io/utils.d.ts.map +1 -0
  188. package/build/io/utils.js +271 -0
  189. package/build/io/utils.js.map +1 -0
  190. package/build/merkle.d.ts +10 -1
  191. package/build/merkle.d.ts.map +1 -0
  192. package/build/merkle.js +12 -1
  193. package/build/merkle.js.map +1 -0
  194. package/build/networks.d.ts +70 -9
  195. package/build/networks.d.ts.map +1 -0
  196. package/build/networks.js +90 -4
  197. package/build/networks.js.map +1 -0
  198. package/build/opcodes.d.ts +1 -0
  199. package/build/opcodes.d.ts.map +1 -0
  200. package/build/opcodes.js +1 -0
  201. package/build/opcodes.js.map +1 -0
  202. package/build/payments/bip341.d.ts +35 -9
  203. package/build/payments/bip341.d.ts.map +1 -0
  204. package/build/payments/bip341.js +34 -15
  205. package/build/payments/bip341.js.map +1 -0
  206. package/build/payments/embed.d.ts +120 -1
  207. package/build/payments/embed.d.ts.map +1 -0
  208. package/build/payments/embed.js +215 -34
  209. package/build/payments/embed.js.map +1 -0
  210. package/build/payments/index.d.ts +17 -10
  211. package/build/payments/index.d.ts.map +1 -0
  212. package/build/payments/index.js +20 -10
  213. package/build/payments/index.js.map +1 -0
  214. package/build/payments/p2ms.d.ts +159 -1
  215. package/build/payments/p2ms.d.ts.map +1 -0
  216. package/build/payments/p2ms.js +427 -108
  217. package/build/payments/p2ms.js.map +1 -0
  218. package/build/payments/p2op.d.ts +158 -24
  219. package/build/payments/p2op.d.ts.map +1 -0
  220. package/build/payments/p2op.js +379 -93
  221. package/build/payments/p2op.js.map +1 -0
  222. package/build/payments/p2pk.d.ts +162 -1
  223. package/build/payments/p2pk.d.ts.map +1 -0
  224. package/build/payments/p2pk.js +327 -58
  225. package/build/payments/p2pk.js.map +1 -0
  226. package/build/payments/p2pkh.d.ts +185 -1
  227. package/build/payments/p2pkh.d.ts.map +1 -0
  228. package/build/payments/p2pkh.js +467 -114
  229. package/build/payments/p2pkh.js.map +1 -0
  230. package/build/payments/p2sh.d.ts +159 -1
  231. package/build/payments/p2sh.d.ts.map +1 -0
  232. package/build/payments/p2sh.js +500 -150
  233. package/build/payments/p2sh.js.map +1 -0
  234. package/build/payments/p2tr.d.ts +193 -1
  235. package/build/payments/p2tr.d.ts.map +1 -0
  236. package/build/payments/p2tr.js +592 -174
  237. package/build/payments/p2tr.js.map +1 -0
  238. package/build/payments/p2wpkh.d.ts +170 -1
  239. package/build/payments/p2wpkh.d.ts.map +1 -0
  240. package/build/payments/p2wpkh.js +428 -103
  241. package/build/payments/p2wpkh.js.map +1 -0
  242. package/build/payments/p2wsh.d.ts +155 -1
  243. package/build/payments/p2wsh.d.ts.map +1 -0
  244. package/build/payments/p2wsh.js +465 -143
  245. package/build/payments/p2wsh.js.map +1 -0
  246. package/build/payments/types.d.ts +98 -64
  247. package/build/payments/types.d.ts.map +1 -0
  248. package/build/payments/types.js +17 -13
  249. package/build/payments/types.js.map +1 -0
  250. package/build/psbt/bip371.d.ts +35 -9
  251. package/build/psbt/bip371.d.ts.map +1 -0
  252. package/build/psbt/bip371.js +117 -28
  253. package/build/psbt/bip371.js.map +1 -0
  254. package/build/psbt/psbtutils.d.ts +56 -16
  255. package/build/psbt/psbtutils.d.ts.map +1 -0
  256. package/build/psbt/psbtutils.js +71 -16
  257. package/build/psbt/psbtutils.js.map +1 -0
  258. package/build/psbt/types.d.ts +249 -0
  259. package/build/psbt/types.d.ts.map +1 -0
  260. package/build/psbt/types.js +6 -0
  261. package/build/psbt/types.js.map +1 -0
  262. package/build/psbt/utils.d.ts +68 -0
  263. package/build/psbt/utils.d.ts.map +1 -0
  264. package/build/psbt/utils.js +171 -0
  265. package/build/psbt/utils.js.map +1 -0
  266. package/build/psbt/validation.d.ts +88 -0
  267. package/build/psbt/validation.d.ts.map +1 -0
  268. package/build/psbt/validation.js +149 -0
  269. package/build/psbt/validation.js.map +1 -0
  270. package/build/psbt.d.ts +84 -120
  271. package/build/psbt.d.ts.map +1 -0
  272. package/build/psbt.js +406 -413
  273. package/build/psbt.js.map +1 -0
  274. package/build/pubkey.d.ts +27 -6
  275. package/build/pubkey.d.ts.map +1 -0
  276. package/build/pubkey.js +36 -12
  277. package/build/pubkey.js.map +1 -0
  278. package/build/push_data.d.ts +24 -2
  279. package/build/push_data.d.ts.map +1 -0
  280. package/build/push_data.js +44 -12
  281. package/build/push_data.js.map +1 -0
  282. package/build/script.d.ts +33 -8
  283. package/build/script.d.ts.map +1 -0
  284. package/build/script.js +101 -37
  285. package/build/script.js.map +1 -0
  286. package/build/script_number.d.ts +17 -0
  287. package/build/script_number.d.ts.map +1 -0
  288. package/build/script_number.js +19 -0
  289. package/build/script_number.js.map +1 -0
  290. package/build/script_signature.d.ts +23 -5
  291. package/build/script_signature.d.ts.map +1 -0
  292. package/build/script_signature.js +48 -15
  293. package/build/script_signature.js.map +1 -0
  294. package/build/transaction.d.ts +160 -18
  295. package/build/transaction.d.ts.map +1 -0
  296. package/build/transaction.js +443 -176
  297. package/build/transaction.js.map +1 -0
  298. package/build/tsconfig.build.tsbuildinfo +1 -0
  299. package/build/types.d.ts +36 -38
  300. package/build/types.d.ts.map +1 -0
  301. package/build/types.js +169 -57
  302. package/build/types.js.map +1 -0
  303. package/build/workers/WorkerSigningPool.d.ts +174 -0
  304. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  305. package/build/workers/WorkerSigningPool.js +553 -0
  306. package/build/workers/WorkerSigningPool.js.map +1 -0
  307. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  308. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.js +753 -0
  310. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  311. package/build/workers/ecc-bundle.d.ts +25 -0
  312. package/build/workers/ecc-bundle.d.ts.map +1 -0
  313. package/build/workers/ecc-bundle.js +25 -0
  314. package/build/workers/ecc-bundle.js.map +1 -0
  315. package/build/workers/index.d.ts +91 -0
  316. package/build/workers/index.d.ts.map +1 -0
  317. package/build/workers/index.js +114 -0
  318. package/build/workers/index.js.map +1 -0
  319. package/build/workers/psbt-parallel.d.ts +117 -0
  320. package/build/workers/psbt-parallel.d.ts.map +1 -0
  321. package/build/workers/psbt-parallel.js +233 -0
  322. package/build/workers/psbt-parallel.js.map +1 -0
  323. package/build/workers/signing-worker.d.ts +37 -0
  324. package/build/workers/signing-worker.d.ts.map +1 -0
  325. package/build/workers/signing-worker.js +350 -0
  326. package/build/workers/signing-worker.js.map +1 -0
  327. package/build/workers/types.d.ts +365 -0
  328. package/build/workers/types.d.ts.map +1 -0
  329. package/build/workers/types.js +60 -0
  330. package/build/workers/types.js.map +1 -0
  331. package/package.json +68 -9
  332. package/scripts/bundle-ecc.ts +111 -0
  333. package/src/address.ts +91 -45
  334. package/src/bech32utils.ts +3 -3
  335. package/src/bip66.ts +34 -24
  336. package/src/block.ts +205 -86
  337. package/src/branded.ts +18 -0
  338. package/src/crypto.ts +64 -26
  339. package/src/ecc/context.ts +280 -0
  340. package/src/ecc/index.ts +14 -0
  341. package/src/ecc/types.ts +147 -0
  342. package/src/ecpair.d.ts +99 -0
  343. package/src/errors.ts +163 -0
  344. package/src/index.ts +112 -9
  345. package/src/io/BinaryReader.ts +461 -0
  346. package/src/io/BinaryWriter.ts +696 -0
  347. package/src/io/MemoryPool.ts +343 -0
  348. package/src/io/base64.ts +20 -0
  349. package/src/io/hex.ts +155 -0
  350. package/src/io/index.ts +41 -0
  351. package/src/io/utils.ts +283 -0
  352. package/src/merkle.ts +14 -9
  353. package/src/networks.ts +9 -9
  354. package/src/payments/bip341.ts +32 -33
  355. package/src/payments/embed.ts +244 -41
  356. package/src/payments/index.ts +12 -10
  357. package/src/payments/p2ms.ts +497 -118
  358. package/src/payments/p2op.ts +432 -134
  359. package/src/payments/p2pk.ts +370 -72
  360. package/src/payments/p2pkh.ts +524 -130
  361. package/src/payments/p2sh.ts +572 -169
  362. package/src/payments/p2tr.ts +686 -194
  363. package/src/payments/p2wpkh.ts +482 -105
  364. package/src/payments/p2wsh.ts +524 -162
  365. package/src/payments/types.ts +80 -66
  366. package/src/psbt/bip371.ts +72 -51
  367. package/src/psbt/psbtutils.ts +39 -40
  368. package/src/psbt/types.ts +324 -0
  369. package/src/psbt/utils.ts +188 -0
  370. package/src/psbt/validation.ts +185 -0
  371. package/src/psbt.ts +608 -827
  372. package/src/pubkey.ts +22 -23
  373. package/src/push_data.ts +18 -16
  374. package/src/script.ts +81 -66
  375. package/src/script_number.ts +6 -6
  376. package/src/script_signature.ts +33 -36
  377. package/src/transaction.ts +462 -239
  378. package/src/types.ts +229 -100
  379. package/src/workers/WorkerSigningPool.node.ts +887 -0
  380. package/src/workers/WorkerSigningPool.ts +666 -0
  381. package/src/workers/ecc-bundle.ts +26 -0
  382. package/src/workers/index.ts +165 -0
  383. package/src/workers/psbt-parallel.ts +327 -0
  384. package/src/workers/signing-worker.ts +353 -0
  385. package/src/workers/types.ts +417 -0
  386. package/test/address.spec.ts +9 -6
  387. package/test/bitcoin.core.spec.ts +16 -17
  388. package/test/block.spec.ts +8 -7
  389. package/test/bufferutils.spec.ts +228 -214
  390. package/test/crypto.spec.ts +19 -11
  391. package/test/fixtures/p2pk.json +0 -8
  392. package/test/fixtures/p2pkh.json +1 -1
  393. package/test/fixtures/p2sh.json +1 -1
  394. package/test/fixtures/script.json +1 -1
  395. package/test/fixtures/transaction.json +2 -2
  396. package/test/integration/_regtest.ts +25 -0
  397. package/test/integration/addresses.spec.ts +4 -3
  398. package/test/integration/bip32.spec.ts +2 -1
  399. package/test/integration/blocks.spec.ts +1 -1
  400. package/test/integration/cltv.spec.ts +18 -16
  401. package/test/integration/csv.spec.ts +37 -64
  402. package/test/integration/payments.spec.ts +5 -3
  403. package/test/integration/taproot.spec.ts +76 -83
  404. package/test/integration/transactions.spec.ts +38 -35
  405. package/test/payments.spec.ts +35 -13
  406. package/test/payments.utils.ts +17 -16
  407. package/test/psbt.spec.ts +111 -100
  408. package/test/script.spec.ts +11 -10
  409. package/test/script_signature.spec.ts +9 -11
  410. package/test/taproot-cache.spec.ts +694 -0
  411. package/test/transaction.spec.ts +32 -40
  412. package/test/types.spec.ts +74 -29
  413. package/test/workers-pool.spec.ts +963 -0
  414. package/test/workers-signing.spec.ts +635 -0
  415. package/test/workers.spec.ts +1390 -0
  416. package/tsconfig.base.json +34 -18
  417. package/tsconfig.browser.json +15 -0
  418. package/tsconfig.build.json +5 -0
  419. package/tsconfig.json +5 -14
  420. package/typedoc.json +29 -0
  421. package/vite.config.browser.ts +3 -42
  422. package/vitest.config.integration.ts +2 -0
  423. package/browser/bufferutils.d.ts +0 -34
  424. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  425. package/browser/chunks/payments-B1wlSccx.js +0 -1089
  426. package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
  427. package/browser/chunks/script-DyPItFEl.js +0 -318
  428. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  429. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  430. package/browser/ecc_lib.d.ts +0 -3
  431. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  432. package/browser/hooks/HookedSigner.d.ts +0 -4
  433. package/browser/hooks/SignatureManager.d.ts +0 -13
  434. package/browser/payments/lazy.d.ts +0 -2
  435. package/browser/typeforce.d.ts +0 -38
  436. package/build/bufferutils.d.ts +0 -34
  437. package/build/bufferutils.js +0 -141
  438. package/build/ecc_lib.d.ts +0 -3
  439. package/build/ecc_lib.js +0 -61
  440. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  441. package/build/hooks/AdvancedSignatureManager.js +0 -52
  442. package/build/hooks/HookedSigner.d.ts +0 -4
  443. package/build/hooks/HookedSigner.js +0 -64
  444. package/build/hooks/SignatureManager.d.ts +0 -13
  445. package/build/hooks/SignatureManager.js +0 -45
  446. package/build/payments/lazy.d.ts +0 -2
  447. package/build/payments/lazy.js +0 -28
  448. package/build/tsconfig.tsbuildinfo +0 -1
  449. package/src/bufferutils.ts +0 -188
  450. package/src/ecc_lib.ts +0 -94
  451. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  452. package/src/hooks/HookedSigner.ts +0 -108
  453. package/src/hooks/SignatureManager.ts +0 -84
  454. package/src/payments/lazy.ts +0 -28
  455. package/src/typeforce.d.ts +0 -38
  456. package/tsconfig.webpack.json +0 -18
@@ -1,223 +1,585 @@
1
+ /**
2
+ * Pay-to-Witness-Script-Hash (P2WSH) payment class.
3
+ *
4
+ * P2WSH is the native SegWit version of P2SH. The witness program is
5
+ * a 32-byte SHA256 hash of the script, and spending requires the witness
6
+ * stack with the script and its inputs.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
1
11
  import { bech32 } from 'bech32';
2
12
  import * as bcrypto from '../crypto.js';
3
- import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
13
+ import { bitcoin as BITCOIN_NETWORK, type Network } from '../networks.js';
4
14
  import * as bscript from '../script.js';
5
- import {
6
- isPoint,
7
- stacksEqual,
8
- typeforce as typef,
9
- type StackElement,
10
- type StackFunction,
11
- } from '../types.js';
12
- import { P2WSHPayment, PaymentOpts, PaymentType } from './types.js';
13
- import * as lazy from './lazy.js';
15
+ import type { Bytes32, Script } from '../types.js';
16
+ import { isPoint, type StackElement, stacksEqual } from '../types.js';
17
+ import { equals } from '../io/index.js';
18
+ import { type P2WSHPayment, type PaymentOpts, PaymentType, type ScriptRedeem } from './types.js';
14
19
 
15
20
  const OPS = bscript.opcodes;
21
+ const EMPTY_BUFFER = new Uint8Array(0);
16
22
 
17
- const EMPTY_BUFFER = Buffer.alloc(0);
18
-
23
+ /**
24
+ * Checks if a stack element is an uncompressed public key.
25
+ */
19
26
  function chunkHasUncompressedPubkey(chunk: StackElement): boolean {
20
- if (Buffer.isBuffer(chunk) && chunk.length === 65 && chunk[0] === 0x04 && isPoint(chunk)) {
27
+ if (chunk instanceof Uint8Array && chunk.length === 65 && chunk[0] === 0x04 && isPoint(chunk)) {
21
28
  return true;
22
- } else {
23
- return false;
24
29
  }
30
+ return false;
25
31
  }
26
32
 
27
- // input: <>
28
- // witness: [redeemScriptSig ...] {redeemScript}
29
- // output: OP_0 {sha256(redeemScript)}
30
33
  /**
31
- * Creates a Pay-to-Witness-Script-Hash (P2WSH) payment object.
34
+ * Pay-to-Witness-Script-Hash (P2WSH) payment class.
32
35
  *
33
- * @param a - The payment object containing the necessary data.
34
- * @param opts - Optional payment options.
35
- * @returns The P2WSH payment object.
36
- * @throws {TypeError} If the required data is missing or invalid.
36
+ * Creates locking scripts of the form: `OP_0 {sha256(redeemScript)}`
37
+ * Spending witness: `[{redeemScriptSig...}, {redeemScript}]`
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * import { P2WSH, P2MS } from '@btc-vision/bitcoin';
42
+ *
43
+ * // Wrap a multisig in P2WSH
44
+ * const multisig = P2MS.fromPubkeys(2, [pubkey1, pubkey2, pubkey3]);
45
+ * const p2wsh = P2WSH.fromRedeem({ output: multisig.output });
46
+ * console.log(p2wsh.address); // bc1q... bech32 address
47
+ *
48
+ * // Decode an existing output
49
+ * const decoded = P2WSH.fromOutput(scriptPubKey);
50
+ * console.log(decoded.hash); // 32-byte witness program
51
+ * ```
37
52
  */
38
- export function p2wsh(a: Omit<P2WSHPayment, 'name'>, opts?: PaymentOpts): P2WSHPayment {
39
- if (!a.address && !a.hash && !a.output && !a.redeem && !a.witness)
40
- throw new TypeError('Not enough data');
41
- opts = Object.assign({ validate: true }, opts || {});
53
+ export class P2WSH {
54
+ // Static public fields
55
+ static readonly NAME = PaymentType.P2WSH;
42
56
 
43
- typef(
44
- {
45
- network: typef.maybe(typef.Object),
46
-
47
- address: typef.maybe(typef.String),
48
- hash: typef.maybe(typef.BufferN(32)),
49
- output: typef.maybe(typef.BufferN(34)),
50
-
51
- redeem: typef.maybe({
52
- input: typef.maybe(typef.Buffer),
53
- network: typef.maybe(typef.Object),
54
- output: typef.maybe(typef.Buffer),
55
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
56
- }),
57
- input: typef.maybe(typef.BufferN(0)),
58
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
57
+ // Private instance fields
58
+ readonly #network: Network;
59
+ readonly #opts: Required<PaymentOpts>;
60
+
61
+ // Input data (provided by user)
62
+ #inputAddress?: string | undefined;
63
+ #inputHash?: Uint8Array | undefined;
64
+ #inputOutput?: Uint8Array | undefined;
65
+ #inputRedeem?: ScriptRedeem | undefined;
66
+ #inputWitness?: Uint8Array[] | undefined;
67
+
68
+ // Cached computed values
69
+ #address?: string | undefined;
70
+ #hash?: Uint8Array | undefined;
71
+ #output?: Uint8Array | undefined;
72
+ #input?: Uint8Array | undefined;
73
+ #redeem?: ScriptRedeem | undefined;
74
+ #witness?: Uint8Array[] | undefined;
75
+
76
+ // Cache flags
77
+ #addressComputed = false;
78
+ #hashComputed = false;
79
+ #outputComputed = false;
80
+ #inputComputed = false;
81
+ #redeemComputed = false;
82
+ #witnessComputed = false;
83
+
84
+ // Decoded address cache
85
+ #decodedAddress?: { version: number; prefix: string; data: Uint8Array } | undefined;
86
+ #decodedAddressComputed = false;
87
+
88
+ // Decoded redeem chunks cache
89
+ #redeemChunks?: (Uint8Array | number)[] | undefined;
90
+ #redeemChunksComputed = false;
91
+
92
+ /**
93
+ * Creates a new P2WSH payment instance.
94
+ *
95
+ * @param params - Payment parameters
96
+ * @param params.address - Bech32 encoded address
97
+ * @param params.hash - 32-byte witness program (SHA256 of script)
98
+ * @param params.output - The scriptPubKey
99
+ * @param params.redeem - The redeem script information
100
+ * @param params.witness - The witness stack
101
+ * @param params.network - Network parameters (defaults to mainnet)
102
+ * @param opts - Payment options
103
+ * @param opts.validate - Whether to validate inputs (default: true)
104
+ *
105
+ * @throws {TypeError} If validation is enabled and data is invalid
106
+ */
107
+ constructor(
108
+ params: {
109
+ address?: string | undefined;
110
+ hash?: Uint8Array | undefined;
111
+ output?: Uint8Array | undefined;
112
+ redeem?: ScriptRedeem | undefined;
113
+ witness?: Uint8Array[] | undefined;
114
+ network?: Network | undefined;
59
115
  },
60
- a,
61
- );
116
+ opts?: PaymentOpts,
117
+ ) {
118
+ // Derive network from redeem if not specified
119
+ let network = params.network;
120
+ if (!network) {
121
+ network = (params.redeem && params.redeem.network) || BITCOIN_NETWORK;
122
+ }
123
+ this.#network = network;
124
+ this.#opts = {
125
+ validate: opts?.validate ?? true,
126
+ allowIncomplete: opts?.allowIncomplete ?? false,
127
+ };
128
+
129
+ // Store input data
130
+ this.#inputAddress = params.address;
131
+ this.#inputHash = params.hash;
132
+ this.#inputOutput = params.output;
133
+ this.#inputRedeem = params.redeem;
134
+ this.#inputWitness = params.witness;
135
+
136
+ // Validate if requested
137
+ if (this.#opts.validate) {
138
+ this.#validate();
139
+ }
140
+ }
141
+
142
+ // Public getters
143
+
144
+ /**
145
+ * Payment type discriminant.
146
+ */
147
+ get name(): string {
148
+ const r = this.redeem;
149
+ if (r !== undefined && r.name !== undefined) {
150
+ return `p2wsh-${r.name}`;
151
+ }
152
+ return PaymentType.P2WSH;
153
+ }
154
+
155
+ /**
156
+ * Network parameters.
157
+ */
158
+ get network(): Network {
159
+ return this.#network;
160
+ }
161
+
162
+ /**
163
+ * Bech32 encoded address (bc1q... for mainnet).
164
+ */
165
+ get address(): string | undefined {
166
+ if (!this.#addressComputed) {
167
+ this.#address = this.#computeAddress();
168
+ this.#addressComputed = true;
169
+ }
170
+ return this.#address;
171
+ }
172
+
173
+ /**
174
+ * 32-byte witness program (SHA256 of redeem script).
175
+ */
176
+ get hash(): Bytes32 | undefined {
177
+ if (!this.#hashComputed) {
178
+ this.#hash = this.#computeHash();
179
+ this.#hashComputed = true;
180
+ }
181
+ return this.#hash as Bytes32 | undefined;
182
+ }
183
+
184
+ /**
185
+ * The scriptPubKey: `OP_0 {32-byte hash}`
186
+ */
187
+ get output(): Script | undefined {
188
+ if (!this.#outputComputed) {
189
+ this.#output = this.#computeOutput();
190
+ this.#outputComputed = true;
191
+ }
192
+ return this.#output as Script | undefined;
193
+ }
194
+
195
+ /**
196
+ * The scriptSig (always empty for native SegWit).
197
+ */
198
+ get input(): Script | undefined {
199
+ if (!this.#inputComputed) {
200
+ this.#input = this.#computeInput();
201
+ this.#inputComputed = true;
202
+ }
203
+ return this.#input as Script | undefined;
204
+ }
205
+
206
+ /**
207
+ * The redeem script information.
208
+ */
209
+ get redeem(): ScriptRedeem | undefined {
210
+ if (!this.#redeemComputed) {
211
+ this.#redeem = this.#computeRedeem();
212
+ this.#redeemComputed = true;
213
+ }
214
+ return this.#redeem;
215
+ }
216
+
217
+ /**
218
+ * Witness stack: `[{scriptSig...}, {redeemScript}]`
219
+ */
220
+ get witness(): Uint8Array[] | undefined {
221
+ if (!this.#witnessComputed) {
222
+ this.#witness = this.#computeWitness();
223
+ this.#witnessComputed = true;
224
+ }
225
+ return this.#witness;
226
+ }
227
+
228
+ // Static factory methods
62
229
 
63
- const _address = lazy.value(() => {
64
- const result = bech32.decode(a.address!);
65
- const version = result.words.shift();
66
- const data = bech32.fromWords(result.words);
230
+ /**
231
+ * Creates a P2WSH payment from a redeem script.
232
+ *
233
+ * @param redeem - The redeem script information
234
+ * @param network - Network parameters (defaults to mainnet)
235
+ * @returns A new P2WSH payment instance
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * const p2wsh = P2WSH.fromRedeem({ output: redeemScript });
240
+ * ```
241
+ */
242
+ static fromRedeem(redeem: ScriptRedeem, network?: Network): P2WSH {
243
+ return new P2WSH({ redeem, network });
244
+ }
245
+
246
+ /**
247
+ * Creates a P2WSH payment from a bech32 address.
248
+ *
249
+ * @param address - Bech32 encoded address
250
+ * @param network - Network parameters (defaults to mainnet)
251
+ * @returns A new P2WSH payment instance
252
+ */
253
+ static fromAddress(address: string, network?: Network): P2WSH {
254
+ return new P2WSH({ address, network });
255
+ }
256
+
257
+ /**
258
+ * Creates a P2WSH payment from a 32-byte witness program.
259
+ *
260
+ * @param hash - 32-byte witness program (SHA256 of script)
261
+ * @param network - Network parameters (defaults to mainnet)
262
+ * @returns A new P2WSH payment instance
263
+ */
264
+ static fromHash(hash: Bytes32, network?: Network): P2WSH {
265
+ return new P2WSH({ hash, network });
266
+ }
267
+
268
+ /**
269
+ * Creates a P2WSH payment from a scriptPubKey.
270
+ *
271
+ * @param output - The scriptPubKey
272
+ * @param network - Network parameters (defaults to mainnet)
273
+ * @returns A new P2WSH payment instance
274
+ */
275
+ static fromOutput(output: Uint8Array, network?: Network): P2WSH {
276
+ return new P2WSH({ output, network });
277
+ }
278
+
279
+ // Private helper methods
280
+
281
+ /**
282
+ * Converts to a plain P2WSHPayment object for backwards compatibility.
283
+ *
284
+ * @returns A P2WSHPayment object
285
+ */
286
+ toPayment(): P2WSHPayment {
287
+ // Access witness first as it may modify redeem (transform input to witness)
288
+ const witness = this.witness;
289
+ const redeem = this.redeem;
67
290
  return {
68
- version,
69
- prefix: result.prefix,
70
- data: Buffer.from(data),
291
+ name: this.name,
292
+ network: this.network,
293
+ address: this.address,
294
+ hash: this.hash,
295
+ output: this.output,
296
+ input: this.input,
297
+ redeem,
298
+ witness,
71
299
  };
72
- });
73
- const _rchunks = lazy.value(() => {
74
- return bscript.decompile(a.redeem!.input!);
75
- }) as StackFunction;
300
+ }
76
301
 
77
- let network = a.network;
78
- if (!network) {
79
- network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
302
+ #getDecodedAddress(): { version: number; prefix: string; data: Uint8Array } | undefined {
303
+ if (!this.#decodedAddressComputed) {
304
+ if (this.#inputAddress) {
305
+ const result = bech32.decode(this.#inputAddress);
306
+ const version = result.words.shift();
307
+ const data = bech32.fromWords(result.words);
308
+ this.#decodedAddress = {
309
+ version: version ?? 0,
310
+ prefix: result.prefix,
311
+ data: new Uint8Array(data),
312
+ };
313
+ }
314
+ this.#decodedAddressComputed = true;
315
+ }
316
+ return this.#decodedAddress;
80
317
  }
81
318
 
82
- const o: P2WSHPayment = {
83
- network,
84
- name: PaymentType.P2WSH,
85
- };
319
+ // Private computation methods
320
+
321
+ #getRedeemChunks(): (Uint8Array | number)[] | undefined {
322
+ if (!this.#redeemChunksComputed) {
323
+ if (this.#inputRedeem?.input) {
324
+ this.#redeemChunks = bscript.decompile(this.#inputRedeem.input) ?? undefined;
325
+ }
326
+ this.#redeemChunksComputed = true;
327
+ }
328
+ return this.#redeemChunks;
329
+ }
86
330
 
87
- lazy.prop(o, 'address', () => {
88
- if (!o.hash) return;
89
- const words = bech32.toWords(o.hash);
331
+ #computeAddress(): string | undefined {
332
+ if (this.#inputAddress) {
333
+ return this.#inputAddress;
334
+ }
335
+ const h = this.hash;
336
+ if (!h) return undefined;
337
+
338
+ const words = bech32.toWords(h);
90
339
  words.unshift(0x00);
91
- return bech32.encode(network.bech32, words);
92
- });
93
- lazy.prop(o, 'hash', () => {
94
- if (a.output) return a.output.subarray(2);
95
- if (a.address) return _address().data;
96
- if (o.redeem && o.redeem.output) return bcrypto.sha256(o.redeem.output);
97
- });
98
- lazy.prop(o, 'output', () => {
99
- if (!o.hash) return;
100
- return bscript.compile([OPS.OP_0, o.hash]);
101
- });
102
- lazy.prop(o, 'redeem', () => {
103
- if (!a.witness) return;
104
- return {
105
- output: a.witness[a.witness.length - 1],
106
- input: EMPTY_BUFFER,
107
- witness: a.witness.slice(0, -1),
108
- };
109
- });
110
- lazy.prop(o, 'input', () => {
111
- if (!o.witness) return;
112
- return EMPTY_BUFFER;
113
- });
114
- lazy.prop(o, 'witness', () => {
115
- // transform redeem input to witness stack?
116
- if (
117
- a.redeem &&
118
- a.redeem.input &&
119
- a.redeem.input.length > 0 &&
120
- a.redeem.output &&
121
- a.redeem.output.length > 0
122
- ) {
123
- const stack = bscript.toStack(_rchunks());
124
-
125
- // assign, and blank the existing input
126
- o.redeem = Object.assign({ witness: stack }, a.redeem);
127
- o.redeem.input = EMPTY_BUFFER;
128
- return ([] as Buffer[]).concat(stack, a.redeem.output);
129
- }
130
-
131
- if (!a.redeem) return;
132
- if (!a.redeem.output) return;
133
- if (!a.redeem.witness) return;
134
- return ([] as Buffer[]).concat(a.redeem.witness, a.redeem.output);
135
- });
136
- lazy.prop(o, 'name', () => {
137
- const nameParts = ['p2wsh'];
138
- if (o.redeem !== undefined && o.redeem.name !== undefined) nameParts.push(o.redeem.name);
139
- return nameParts.join('-');
140
- });
141
-
142
- // extended validation
143
- if (opts.validate) {
144
- let hash: Buffer = Buffer.from([]);
145
- if (a.address) {
146
- if (_address().prefix !== network.bech32)
340
+ return bech32.encode(this.#network.bech32, words);
341
+ }
342
+
343
+ #computeHash(): Uint8Array | undefined {
344
+ if (this.#inputHash) {
345
+ return this.#inputHash;
346
+ }
347
+ if (this.#inputOutput) {
348
+ return this.#inputOutput.subarray(2) as Bytes32;
349
+ }
350
+ if (this.#inputAddress) {
351
+ return this.#getDecodedAddress()?.data as Bytes32 | undefined;
352
+ }
353
+ const r = this.redeem;
354
+ if (r && r.output) {
355
+ return bcrypto.sha256(r.output) as Bytes32;
356
+ }
357
+ return undefined;
358
+ }
359
+
360
+ #computeOutput(): Uint8Array | undefined {
361
+ if (this.#inputOutput) {
362
+ return this.#inputOutput;
363
+ }
364
+ const h = this.hash;
365
+ if (!h) return undefined;
366
+
367
+ return bscript.compile([OPS.OP_0, h]) as Script;
368
+ }
369
+
370
+ #computeInput(): Uint8Array | undefined {
371
+ if (this.witness) {
372
+ return EMPTY_BUFFER as Script;
373
+ }
374
+ return undefined;
375
+ }
376
+
377
+ #computeRedeem(): ScriptRedeem | undefined {
378
+ if (this.#inputRedeem) {
379
+ return this.#inputRedeem;
380
+ }
381
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
382
+ return {
383
+ output: this.#inputWitness[this.#inputWitness.length - 1] as Script,
384
+ input: EMPTY_BUFFER as Script,
385
+ witness: this.#inputWitness.slice(0, -1),
386
+ };
387
+ }
388
+ return undefined;
389
+ }
390
+
391
+ // Validation
392
+
393
+ #computeWitness(): Uint8Array[] | undefined {
394
+ if (this.#inputWitness) {
395
+ return this.#inputWitness;
396
+ }
397
+
398
+ const r = this.#inputRedeem;
399
+ if (r) {
400
+ // Transform redeem input to witness stack
401
+ if (r.input && r.input.length > 0 && r.output && r.output.length > 0) {
402
+ const chunks = this.#getRedeemChunks();
403
+ if (chunks) {
404
+ const stack = bscript.toStack(chunks);
405
+ // Assign, and blank the existing input
406
+ this.#redeem = Object.assign({ witness: stack }, r, { input: EMPTY_BUFFER });
407
+ this.#redeemComputed = true;
408
+ return ([] as Uint8Array[]).concat(stack, r.output);
409
+ }
410
+ }
411
+
412
+ if (!r.output) return undefined;
413
+ if (!r.witness) return undefined;
414
+ return ([] as Uint8Array[]).concat(r.witness, r.output);
415
+ }
416
+
417
+ return undefined;
418
+ }
419
+
420
+ #validate(): void {
421
+ let hash: Uint8Array = new Uint8Array(0);
422
+
423
+ if (this.#inputAddress) {
424
+ const addr = this.#getDecodedAddress();
425
+ if (!addr) {
426
+ throw new TypeError('Invalid address');
427
+ }
428
+ if (addr.prefix !== this.#network.bech32) {
147
429
  throw new TypeError('Invalid prefix or Network mismatch');
148
- if (_address().version !== 0x00) throw new TypeError('Invalid address version');
149
- if (_address().data.length !== 32) throw new TypeError('Invalid address data');
150
- hash = _address().data;
430
+ }
431
+ if (addr.version !== 0x00) {
432
+ throw new TypeError('Invalid address version');
433
+ }
434
+ if (addr.data.length !== 32) {
435
+ throw new TypeError('Invalid address data');
436
+ }
437
+ hash = addr.data;
151
438
  }
152
439
 
153
- if (a.hash) {
154
- if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');
155
- else hash = a.hash;
440
+ if (this.#inputHash) {
441
+ if (hash.length > 0 && !equals(hash, this.#inputHash)) {
442
+ throw new TypeError('Hash mismatch');
443
+ } else {
444
+ hash = this.#inputHash;
445
+ }
156
446
  }
157
447
 
158
- if (a.output) {
159
- if (a.output.length !== 34 || a.output[0] !== OPS.OP_0 || a.output[1] !== 0x20)
448
+ if (this.#inputOutput) {
449
+ if (
450
+ this.#inputOutput.length !== 34 ||
451
+ this.#inputOutput[0] !== OPS.OP_0 ||
452
+ this.#inputOutput[1] !== 0x20
453
+ ) {
160
454
  throw new TypeError('Output is invalid');
161
- const hash2 = a.output.subarray(2);
162
- if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
163
- else hash = hash2;
455
+ }
456
+ const hash2 = this.#inputOutput.subarray(2);
457
+ if (hash.length > 0 && !equals(hash, hash2)) {
458
+ throw new TypeError('Hash mismatch');
459
+ } else {
460
+ hash = hash2;
461
+ }
164
462
  }
165
463
 
166
- if (a.redeem) {
167
- if (a.redeem.network && a.redeem.network !== network)
464
+ if (this.#inputRedeem) {
465
+ if (this.#inputRedeem.network && this.#inputRedeem.network !== this.#network) {
168
466
  throw new TypeError('Network mismatch');
467
+ }
169
468
 
170
- // is there two redeem sources?
469
+ // Is there two redeem sources?
171
470
  if (
172
- a.redeem.input &&
173
- a.redeem.input.length > 0 &&
174
- a.redeem.witness &&
175
- a.redeem.witness.length > 0
176
- )
471
+ this.#inputRedeem.input &&
472
+ this.#inputRedeem.input.length > 0 &&
473
+ this.#inputRedeem.witness &&
474
+ this.#inputRedeem.witness.length > 0
475
+ ) {
177
476
  throw new TypeError('Ambiguous witness source');
477
+ }
178
478
 
179
- // is the redeem output non-empty/valid?
180
- if (a.redeem.output) {
181
- const decompile = bscript.decompile(a.redeem.output);
182
- if (!decompile || decompile.length < 1)
479
+ // Is the redeem output non-empty/valid?
480
+ if (this.#inputRedeem.output) {
481
+ const decompile = bscript.decompile(this.#inputRedeem.output);
482
+ if (!decompile || decompile.length < 1) {
183
483
  throw new TypeError('Redeem.output is invalid');
184
- if (a.redeem.output.byteLength > 3600)
484
+ }
485
+ if (this.#inputRedeem.output.byteLength > 3600) {
185
486
  throw new TypeError('Redeem.output unspendable if larger than 3600 bytes');
186
- if (bscript.countNonPushOnlyOPs(decompile) > 201)
487
+ }
488
+ if (bscript.countNonPushOnlyOPs(decompile) > 201) {
187
489
  throw new TypeError(
188
490
  'Redeem.output unspendable with more than 201 non-push ops',
189
491
  );
492
+ }
190
493
 
191
- // match hash against other sources
192
- const hash2 = bcrypto.sha256(a.redeem.output);
193
- if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');
194
- else hash = hash2;
494
+ // Match hash against other sources
495
+ const hash2 = bcrypto.sha256(this.#inputRedeem.output);
496
+ if (hash.length > 0 && !equals(hash, hash2)) {
497
+ throw new TypeError('Hash mismatch');
498
+ } else {
499
+ hash = hash2;
500
+ }
195
501
  }
196
502
 
197
- if (a.redeem.input && !bscript.isPushOnly(_rchunks()))
503
+ const chunks = this.#getRedeemChunks();
504
+ if (this.#inputRedeem.input && chunks && !bscript.isPushOnly(chunks)) {
198
505
  throw new TypeError('Non push-only scriptSig');
199
- if (a.witness && a.redeem.witness && !stacksEqual(a.witness, a.redeem.witness))
506
+ }
507
+ if (
508
+ this.#inputWitness &&
509
+ this.#inputRedeem.witness &&
510
+ !stacksEqual(this.#inputWitness, this.#inputRedeem.witness)
511
+ ) {
200
512
  throw new TypeError('Witness and redeem.witness mismatch');
513
+ }
201
514
  if (
202
- (a.redeem.input && _rchunks().some(chunkHasUncompressedPubkey)) ||
203
- (a.redeem.output &&
204
- (bscript.decompile(a.redeem.output) || []).some(chunkHasUncompressedPubkey))
515
+ (this.#inputRedeem.input && chunks?.some(chunkHasUncompressedPubkey)) ||
516
+ (this.#inputRedeem.output &&
517
+ (bscript.decompile(this.#inputRedeem.output) || []).some(
518
+ chunkHasUncompressedPubkey,
519
+ ))
205
520
  ) {
206
521
  throw new TypeError('redeem.input or redeem.output contains uncompressed pubkey');
207
522
  }
208
523
  }
209
524
 
210
- if (a.witness && a.witness.length > 0) {
211
- const wScript = a.witness[a.witness.length - 1];
212
- if (a.redeem && a.redeem.output && !a.redeem.output.equals(wScript))
525
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
526
+ const wScript = this.#inputWitness[this.#inputWitness.length - 1]!;
527
+ if (
528
+ this.#inputRedeem &&
529
+ this.#inputRedeem.output &&
530
+ !equals(this.#inputRedeem.output, wScript)
531
+ ) {
213
532
  throw new TypeError('Witness and redeem.output mismatch');
533
+ }
214
534
  if (
215
- a.witness.some(chunkHasUncompressedPubkey) ||
535
+ this.#inputWitness.some(chunkHasUncompressedPubkey) ||
216
536
  (bscript.decompile(wScript) || []).some(chunkHasUncompressedPubkey)
217
- )
537
+ ) {
218
538
  throw new TypeError('Witness contains uncompressed pubkey');
539
+ }
219
540
  }
220
541
  }
542
+ }
543
+
544
+ /**
545
+ * Creates a Pay-to-Witness-Script-Hash (P2WSH) payment object.
546
+ *
547
+ * This is the legacy factory function for backwards compatibility.
548
+ * For new code, prefer using the P2WSH class directly.
549
+ *
550
+ * @param a - The payment object containing the necessary data
551
+ * @param opts - Optional payment options
552
+ * @returns The P2WSH payment object
553
+ * @throws {TypeError} If the required data is not provided or if the data is invalid
554
+ *
555
+ * @example
556
+ * ```typescript
557
+ * import { p2wsh, p2ms } from '@btc-vision/bitcoin';
558
+ *
559
+ * // Wrap a multisig in P2WSH
560
+ * const multisig = p2ms({ m: 2, pubkeys: [pk1, pk2, pk3] });
561
+ * const payment = p2wsh({ redeem: multisig });
562
+ * ```
563
+ */
564
+ export function p2wsh(a: Omit<P2WSHPayment, 'name'>, opts?: PaymentOpts): P2WSHPayment {
565
+ if (!a.address && !a.hash && !a.output && !a.redeem && !a.witness) {
566
+ throw new TypeError('Not enough data');
567
+ }
568
+
569
+ const instance = new P2WSH(
570
+ {
571
+ address: a.address,
572
+ hash: a.hash,
573
+ output: a.output,
574
+ redeem: a.redeem,
575
+ witness: a.witness,
576
+ network: a.network,
577
+ },
578
+ opts,
579
+ );
221
580
 
222
- return Object.assign(o, a);
581
+ // Return the computed payment
582
+ // Note: We don't use Object.assign(toPayment(), a) because that would
583
+ // overwrite computed properties (like modified redeem) with original values
584
+ return instance.toPayment();
223
585
  }