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