@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
@@ -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);
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
+ #getDecodedAddress() {
242
+ if (!this.#decodedAddressComputed) {
243
+ if (this.#inputAddress) {
244
+ const result = bech32.decode(this.#inputAddress);
245
+ const version = result.words.shift();
246
+ const data = bech32.fromWords(result.words);
247
+ this.#decodedAddress = {
248
+ version: version ?? 0,
249
+ prefix: result.prefix,
250
+ data: new Uint8Array(data),
251
+ };
252
+ }
253
+ this.#decodedAddressComputed = true;
254
+ }
255
+ return this.#decodedAddress;
256
+ }
257
+ #getRedeemChunks() {
258
+ if (!this.#redeemChunksComputed) {
259
+ if (this.#inputRedeem?.input) {
260
+ this.#redeemChunks = bscript.decompile(this.#inputRedeem.input) ?? undefined;
261
+ }
262
+ this.#redeemChunksComputed = true;
263
+ }
264
+ return this.#redeemChunks;
265
+ }
266
+ // Private computation methods
267
+ #computeAddress() {
268
+ if (this.#inputAddress) {
269
+ return this.#inputAddress;
270
+ }
271
+ const h = this.hash;
272
+ if (!h)
273
+ return undefined;
274
+ const words = bech32.toWords(h);
61
275
  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;
80
- return {
81
- output: a.witness[a.witness.length - 1],
82
- input: EMPTY_BUFFER,
83
- witness: a.witness.slice(0, -1),
84
- };
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)
276
+ return bech32.encode(this.#network.bech32, words);
277
+ }
278
+ #computeHash() {
279
+ if (this.#inputHash) {
280
+ return this.#inputHash;
281
+ }
282
+ if (this.#inputOutput) {
283
+ return this.#inputOutput.subarray(2);
284
+ }
285
+ if (this.#inputAddress) {
286
+ return this.#getDecodedAddress()?.data;
287
+ }
288
+ const r = this.redeem;
289
+ if (r && r.output) {
290
+ return bcrypto.sha256(r.output);
291
+ }
292
+ return undefined;
293
+ }
294
+ #computeOutput() {
295
+ if (this.#inputOutput) {
296
+ return this.#inputOutput;
297
+ }
298
+ const h = this.hash;
299
+ if (!h)
300
+ return undefined;
301
+ return bscript.compile([OPS.OP_0, h]);
302
+ }
303
+ #computeInput() {
304
+ if (this.witness) {
305
+ return EMPTY_BUFFER;
306
+ }
307
+ return undefined;
308
+ }
309
+ #computeRedeem() {
310
+ if (this.#inputRedeem) {
311
+ return this.#inputRedeem;
312
+ }
313
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
314
+ return {
315
+ output: this.#inputWitness[this.#inputWitness.length - 1],
316
+ input: EMPTY_BUFFER,
317
+ witness: this.#inputWitness.slice(0, -1),
318
+ };
319
+ }
320
+ return undefined;
321
+ }
322
+ #computeWitness() {
323
+ if (this.#inputWitness) {
324
+ return this.#inputWitness;
325
+ }
326
+ const r = this.#inputRedeem;
327
+ if (r) {
328
+ // Transform redeem input to witness stack
329
+ if (r.input && r.input.length > 0 && r.output && r.output.length > 0) {
330
+ const chunks = this.#getRedeemChunks();
331
+ if (chunks) {
332
+ const stack = bscript.toStack(chunks);
333
+ // Assign, and blank the existing input
334
+ this.#redeem = Object.assign({ witness: stack }, r, { input: EMPTY_BUFFER });
335
+ this.#redeemComputed = true;
336
+ return [].concat(stack, r.output);
337
+ }
338
+ }
339
+ if (!r.output)
340
+ return undefined;
341
+ if (!r.witness)
342
+ return undefined;
343
+ return [].concat(r.witness, r.output);
344
+ }
345
+ return undefined;
346
+ }
347
+ // Validation
348
+ #validate() {
349
+ let hash = new Uint8Array(0);
350
+ if (this.#inputAddress) {
351
+ const addr = this.#getDecodedAddress();
352
+ if (!addr) {
353
+ throw new TypeError('Invalid address');
354
+ }
355
+ if (addr.prefix !== this.#network.bech32) {
120
356
  throw new TypeError('Invalid prefix or Network mismatch');
121
- if (_address().version !== 0x00)
357
+ }
358
+ if (addr.version !== 0x00) {
122
359
  throw new TypeError('Invalid address version');
123
- if (_address().data.length !== 32)
360
+ }
361
+ if (addr.data.length !== 32) {
124
362
  throw new TypeError('Invalid address data');
125
- hash = _address().data;
363
+ }
364
+ hash = addr.data;
126
365
  }
127
- if (a.hash) {
128
- if (hash.length > 0 && !hash.equals(a.hash))
366
+ if (this.#inputHash) {
367
+ if (hash.length > 0 && !equals(hash, this.#inputHash)) {
129
368
  throw new TypeError('Hash mismatch');
130
- else
131
- hash = a.hash;
369
+ }
370
+ else {
371
+ hash = this.#inputHash;
372
+ }
132
373
  }
133
- if (a.output) {
134
- if (a.output.length !== 34 || a.output[0] !== OPS.OP_0 || a.output[1] !== 0x20)
374
+ if (this.#inputOutput) {
375
+ if (this.#inputOutput.length !== 34 ||
376
+ this.#inputOutput[0] !== OPS.OP_0 ||
377
+ this.#inputOutput[1] !== 0x20) {
135
378
  throw new TypeError('Output is invalid');
136
- const hash2 = a.output.subarray(2);
137
- if (hash.length > 0 && !hash.equals(hash2))
379
+ }
380
+ const hash2 = this.#inputOutput.subarray(2);
381
+ if (hash.length > 0 && !equals(hash, hash2)) {
138
382
  throw new TypeError('Hash mismatch');
139
- else
383
+ }
384
+ else {
140
385
  hash = hash2;
386
+ }
141
387
  }
142
- if (a.redeem) {
143
- if (a.redeem.network && a.redeem.network !== network)
388
+ if (this.#inputRedeem) {
389
+ if (this.#inputRedeem.network && this.#inputRedeem.network !== this.#network) {
144
390
  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)
391
+ }
392
+ // Is there two redeem sources?
393
+ if (this.#inputRedeem.input &&
394
+ this.#inputRedeem.input.length > 0 &&
395
+ this.#inputRedeem.witness &&
396
+ this.#inputRedeem.witness.length > 0) {
149
397
  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)
398
+ }
399
+ // Is the redeem output non-empty/valid?
400
+ if (this.#inputRedeem.output) {
401
+ const decompile = bscript.decompile(this.#inputRedeem.output);
402
+ if (!decompile || decompile.length < 1) {
153
403
  throw new TypeError('Redeem.output is invalid');
154
- if (a.redeem.output.byteLength > 3600)
404
+ }
405
+ if (this.#inputRedeem.output.byteLength > 3600) {
155
406
  throw new TypeError('Redeem.output unspendable if larger than 3600 bytes');
156
- if (bscript.countNonPushOnlyOPs(decompile) > 201)
407
+ }
408
+ if (bscript.countNonPushOnlyOPs(decompile) > 201) {
157
409
  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))
410
+ }
411
+ // Match hash against other sources
412
+ const hash2 = bcrypto.sha256(this.#inputRedeem.output);
413
+ if (hash.length > 0 && !equals(hash, hash2)) {
160
414
  throw new TypeError('Hash mismatch');
161
- else
415
+ }
416
+ else {
162
417
  hash = hash2;
418
+ }
163
419
  }
164
- if (a.redeem.input && !bscript.isPushOnly(_rchunks()))
420
+ const chunks = this.#getRedeemChunks();
421
+ if (this.#inputRedeem.input && chunks && !bscript.isPushOnly(chunks)) {
165
422
  throw new TypeError('Non push-only scriptSig');
166
- if (a.witness && a.redeem.witness && !stacksEqual(a.witness, a.redeem.witness))
423
+ }
424
+ if (this.#inputWitness &&
425
+ this.#inputRedeem.witness &&
426
+ !stacksEqual(this.#inputWitness, this.#inputRedeem.witness)) {
167
427
  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))) {
428
+ }
429
+ if ((this.#inputRedeem.input && chunks?.some(chunkHasUncompressedPubkey)) ||
430
+ (this.#inputRedeem.output &&
431
+ (bscript.decompile(this.#inputRedeem.output) || []).some(chunkHasUncompressedPubkey))) {
171
432
  throw new TypeError('redeem.input or redeem.output contains uncompressed pubkey');
172
433
  }
173
434
  }
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))
435
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
436
+ const wScript = this.#inputWitness[this.#inputWitness.length - 1];
437
+ if (this.#inputRedeem &&
438
+ this.#inputRedeem.output &&
439
+ !equals(this.#inputRedeem.output, wScript)) {
177
440
  throw new TypeError('Witness and redeem.output mismatch');
178
- if (a.witness.some(chunkHasUncompressedPubkey) ||
179
- (bscript.decompile(wScript) || []).some(chunkHasUncompressedPubkey))
441
+ }
442
+ if (this.#inputWitness.some(chunkHasUncompressedPubkey) ||
443
+ (bscript.decompile(wScript) || []).some(chunkHasUncompressedPubkey)) {
180
444
  throw new TypeError('Witness contains uncompressed pubkey');
445
+ }
181
446
  }
182
447
  }
183
- return Object.assign(o, a);
448
+ /**
449
+ * Converts to a plain P2WSHPayment object for backwards compatibility.
450
+ *
451
+ * @returns A P2WSHPayment object
452
+ */
453
+ toPayment() {
454
+ // Access witness first as it may modify redeem (transform input to witness)
455
+ const witness = this.witness;
456
+ const redeem = this.redeem;
457
+ return {
458
+ name: this.name,
459
+ network: this.network,
460
+ address: this.address,
461
+ hash: this.hash,
462
+ output: this.output,
463
+ input: this.input,
464
+ redeem,
465
+ witness,
466
+ };
467
+ }
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();
184
505
  }
506
+ //# sourceMappingURL=p2wsh.js.map