@btc-vision/bitcoin 6.5.6 → 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 (455) 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 +56 -9
  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 +12482 -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 +57 -10
  115. package/build/address.d.ts.map +1 -0
  116. package/build/address.js +80 -24
  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 +204 -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 +36 -9
  203. package/build/payments/bip341.d.ts.map +1 -0
  204. package/build/payments/bip341.js +35 -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 -152
  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 +429 -104
  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 +466 -144
  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 +113 -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 +411 -412
  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 +100 -36
  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 +175 -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 +66 -8
  332. package/scripts/bundle-ecc.ts +111 -0
  333. package/src/address.ts +81 -44
  334. package/src/bech32utils.ts +3 -3
  335. package/src/bip66.ts +34 -24
  336. package/src/block.ts +196 -84
  337. package/src/branded.ts +18 -0
  338. package/src/crypto.ts +64 -26
  339. package/src/ecc/context.ts +277 -0
  340. package/src/ecc/index.ts +14 -0
  341. package/src/ecc/types.ts +154 -0
  342. package/src/ecpair.d.ts +99 -0
  343. package/src/errors.ts +163 -0
  344. package/src/index.ts +113 -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 +34 -33
  355. package/src/payments/embed.ts +244 -41
  356. package/src/payments/index.ts +12 -10
  357. package/src/payments/p2ms.ts +490 -118
  358. package/src/payments/p2op.ts +431 -133
  359. package/src/payments/p2pk.ts +370 -72
  360. package/src/payments/p2pkh.ts +524 -130
  361. package/src/payments/p2sh.ts +572 -172
  362. package/src/payments/p2tr.ts +686 -194
  363. package/src/payments/p2wpkh.ts +484 -107
  364. package/src/payments/p2wsh.ts +526 -164
  365. package/src/payments/types.ts +80 -66
  366. package/src/psbt/bip371.ts +68 -51
  367. package/src/psbt/psbtutils.ts +39 -40
  368. package/src/psbt/types.ts +331 -0
  369. package/src/psbt/utils.ts +188 -0
  370. package/src/psbt/validation.ts +192 -0
  371. package/src/psbt.ts +566 -809
  372. package/src/pubkey.ts +22 -23
  373. package/src/push_data.ts +18 -16
  374. package/src/script.ts +82 -64
  375. package/src/script_number.ts +6 -6
  376. package/src/script_signature.ts +33 -36
  377. package/src/transaction.ts +458 -238
  378. package/src/types.ts +231 -100
  379. package/src/workers/WorkerSigningPool.node.ts +887 -0
  380. package/src/workers/WorkerSigningPool.ts +670 -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 +332 -0
  384. package/src/workers/signing-worker.ts +353 -0
  385. package/src/workers/types.ts +413 -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/vite.config.browser.ts +3 -42
  421. package/vitest.config.integration.ts +2 -0
  422. package/browser/bufferutils.d.ts +0 -34
  423. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  424. package/browser/chunks/payments-B1wlSccx.js +0 -1089
  425. package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
  426. package/browser/chunks/script-DyPItFEl.js +0 -318
  427. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  428. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  429. package/browser/ecc_lib.d.ts +0 -3
  430. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  431. package/browser/hooks/HookedSigner.d.ts +0 -4
  432. package/browser/hooks/SignatureManager.d.ts +0 -13
  433. package/browser/payments/lazy.d.ts +0 -2
  434. package/browser/typeforce.d.ts +0 -38
  435. package/build/bufferutils.d.ts +0 -34
  436. package/build/bufferutils.js +0 -141
  437. package/build/ecc_lib.d.ts +0 -3
  438. package/build/ecc_lib.js +0 -61
  439. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  440. package/build/hooks/AdvancedSignatureManager.js +0 -52
  441. package/build/hooks/HookedSigner.d.ts +0 -4
  442. package/build/hooks/HookedSigner.js +0 -64
  443. package/build/hooks/SignatureManager.d.ts +0 -13
  444. package/build/hooks/SignatureManager.js +0 -45
  445. package/build/payments/lazy.d.ts +0 -2
  446. package/build/payments/lazy.js +0 -28
  447. package/build/tsconfig.tsbuildinfo +0 -1
  448. package/src/bufferutils.ts +0 -188
  449. package/src/ecc_lib.ts +0 -94
  450. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  451. package/src/hooks/HookedSigner.ts +0 -108
  452. package/src/hooks/SignatureManager.ts +0 -84
  453. package/src/payments/lazy.ts +0 -28
  454. package/src/typeforce.d.ts +0 -38
  455. package/tsconfig.webpack.json +0 -18
@@ -1,180 +1,528 @@
1
+ /**
2
+ * Pay-to-Script-Hash (P2SH) payment class.
3
+ *
4
+ * P2SH allows spending to be based on a hash of a script, with the actual
5
+ * script revealed only at spend time. This enables complex spending conditions
6
+ * while keeping addresses short.
7
+ *
8
+ * @packageDocumentation
9
+ */
1
10
  import * as bs58check from 'bs58check';
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 { stacksEqual, typeforce as typef } from '../types.js';
6
- import { PaymentType } from './types.js';
7
- import * as lazy from './lazy.js';
14
+ import { stacksEqual } from '../types.js';
15
+ import { alloc, equals } from '../io/index.js';
16
+ import { PaymentType, } from './types.js';
8
17
  const OPS = bscript.opcodes;
9
- export function p2sh(a, opts) {
10
- if (!a.address && !a.hash && !a.output && !a.redeem && !a.input) {
11
- throw new TypeError('Not enough data');
12
- }
13
- opts = Object.assign({ validate: true }, opts || {});
14
- typef({
15
- network: typef.maybe(typef.Object),
16
- address: typef.maybe(typef.String),
17
- hash: typef.maybe(typef.BufferN(20)),
18
- output: typef.maybe(typef.BufferN(23)),
19
- redeem: typef.maybe({
20
- network: typef.maybe(typef.Object),
21
- output: typef.maybe(typef.Buffer),
22
- input: typef.maybe(typef.Buffer),
23
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
24
- }),
25
- input: typef.maybe(typef.Buffer),
26
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
27
- }, a);
28
- let network = a.network;
29
- if (!network) {
30
- network = (a.redeem && a.redeem.network) || BITCOIN_NETWORK;
31
- }
32
- const o = {
33
- network,
34
- name: PaymentType.P2SH,
35
- };
36
- const _address = lazy.value(() => {
37
- const payload = Buffer.from(bs58check.default.decode(a.address));
38
- const version = payload.readUInt8(0);
39
- const hash = payload.subarray(1);
40
- return { version, hash };
41
- });
42
- const _chunks = lazy.value(() => {
43
- return bscript.decompile(a.input);
44
- });
45
- const _redeem = lazy.value(() => {
46
- const chunks = _chunks();
47
- const lastChunk = chunks[chunks.length - 1];
48
- return {
49
- network,
50
- output: lastChunk === OPS.OP_FALSE ? Buffer.from([]) : lastChunk,
51
- input: bscript.compile(chunks.slice(0, -1)),
52
- witness: a.witness || [],
18
+ /**
19
+ * Pay-to-Script-Hash (P2SH) payment class.
20
+ *
21
+ * Creates locking scripts of the form:
22
+ * `OP_HASH160 {hash160(redeemScript)} OP_EQUAL`
23
+ *
24
+ * Spending requires: `{redeemScriptSig...} {redeemScript}`
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * import { P2SH, P2MS } from '@btc-vision/bitcoin';
29
+ *
30
+ * // Wrap a multisig in P2SH
31
+ * const multisig = P2MS.fromPubkeys(2, [pubkey1, pubkey2, pubkey3]);
32
+ * const p2sh = P2SH.fromRedeem({ output: multisig.output });
33
+ * console.log(p2sh.address); // 3... address
34
+ *
35
+ * // Decode an existing output
36
+ * const decoded = P2SH.fromOutput(scriptPubKey);
37
+ * console.log(decoded.hash); // 20-byte script hash
38
+ * ```
39
+ */
40
+ export class P2SH {
41
+ // Static public fields
42
+ static NAME = PaymentType.P2SH;
43
+ // Private instance fields
44
+ #network;
45
+ #opts;
46
+ // Input data (provided by user)
47
+ #inputAddress;
48
+ #inputHash;
49
+ #inputOutput;
50
+ #inputInput;
51
+ #inputRedeem;
52
+ #inputWitness;
53
+ // Cached computed values
54
+ #address;
55
+ #hash;
56
+ #output;
57
+ #input;
58
+ #redeem;
59
+ #witness;
60
+ // Cache flags
61
+ #addressComputed = false;
62
+ #hashComputed = false;
63
+ #outputComputed = false;
64
+ #inputComputed = false;
65
+ #redeemComputed = false;
66
+ #witnessComputed = false;
67
+ // Decoded address cache
68
+ #decodedAddress;
69
+ #decodedAddressComputed = false;
70
+ // Decoded input chunks cache
71
+ #inputChunks;
72
+ #inputChunksComputed = false;
73
+ // Derived redeem from input
74
+ #derivedRedeem;
75
+ #derivedRedeemComputed = false;
76
+ /**
77
+ * Creates a new P2SH payment instance.
78
+ *
79
+ * @param params - Payment parameters
80
+ * @param params.address - Base58Check encoded address (3...)
81
+ * @param params.hash - 20-byte script hash
82
+ * @param params.output - The scriptPubKey
83
+ * @param params.input - The scriptSig
84
+ * @param params.redeem - The redeem script information
85
+ * @param params.witness - The witness stack (for wrapped SegWit)
86
+ * @param params.network - Network parameters (defaults to mainnet)
87
+ * @param opts - Payment options
88
+ * @param opts.validate - Whether to validate inputs (default: true)
89
+ *
90
+ * @throws {TypeError} If validation is enabled and data is invalid
91
+ */
92
+ constructor(params, opts) {
93
+ // Derive network from redeem if not specified
94
+ let network = params.network;
95
+ if (!network) {
96
+ network = (params.redeem && params.redeem.network) || BITCOIN_NETWORK;
97
+ }
98
+ this.#network = network;
99
+ this.#opts = {
100
+ validate: opts?.validate ?? true,
101
+ allowIncomplete: opts?.allowIncomplete ?? false,
53
102
  };
54
- });
55
- lazy.prop(o, 'address', () => {
56
- if (!o.hash)
57
- return;
58
- const payload = Buffer.allocUnsafe(21);
59
- payload.writeUInt8(o.network.scriptHash, 0);
60
- o.hash.copy(payload, 1);
103
+ // Store input data
104
+ this.#inputAddress = params.address;
105
+ this.#inputHash = params.hash;
106
+ this.#inputOutput = params.output;
107
+ this.#inputInput = params.input;
108
+ this.#inputRedeem = params.redeem;
109
+ this.#inputWitness = params.witness;
110
+ // Validate if requested
111
+ if (this.#opts.validate) {
112
+ this.#validate();
113
+ }
114
+ }
115
+ // Public getters
116
+ /**
117
+ * Payment type discriminant.
118
+ */
119
+ get name() {
120
+ const r = this.redeem;
121
+ if (r !== undefined && r.name !== undefined) {
122
+ return `p2sh-${r.name}`;
123
+ }
124
+ return PaymentType.P2SH;
125
+ }
126
+ /**
127
+ * Network parameters.
128
+ */
129
+ get network() {
130
+ return this.#network;
131
+ }
132
+ /**
133
+ * Base58Check encoded address (3... for mainnet).
134
+ */
135
+ get address() {
136
+ if (!this.#addressComputed) {
137
+ this.#address = this.#computeAddress();
138
+ this.#addressComputed = true;
139
+ }
140
+ return this.#address;
141
+ }
142
+ /**
143
+ * 20-byte script hash (HASH160 of redeem script).
144
+ */
145
+ get hash() {
146
+ if (!this.#hashComputed) {
147
+ this.#hash = this.#computeHash();
148
+ this.#hashComputed = true;
149
+ }
150
+ return this.#hash;
151
+ }
152
+ /**
153
+ * The scriptPubKey: `OP_HASH160 {hash} OP_EQUAL`
154
+ */
155
+ get output() {
156
+ if (!this.#outputComputed) {
157
+ this.#output = this.#computeOutput();
158
+ this.#outputComputed = true;
159
+ }
160
+ return this.#output;
161
+ }
162
+ /**
163
+ * The scriptSig: `{redeemScriptSig...} {redeemScript}`
164
+ */
165
+ get input() {
166
+ if (!this.#inputComputed) {
167
+ this.#input = this.#computeInput();
168
+ this.#inputComputed = true;
169
+ }
170
+ return this.#input;
171
+ }
172
+ /**
173
+ * The redeem script information.
174
+ */
175
+ get redeem() {
176
+ if (!this.#redeemComputed) {
177
+ this.#redeem = this.#computeRedeem();
178
+ this.#redeemComputed = true;
179
+ }
180
+ return this.#redeem;
181
+ }
182
+ /**
183
+ * The witness stack (for wrapped SegWit).
184
+ */
185
+ get witness() {
186
+ if (!this.#witnessComputed) {
187
+ this.#witness = this.#computeWitness();
188
+ this.#witnessComputed = true;
189
+ }
190
+ return this.#witness;
191
+ }
192
+ // Static factory methods
193
+ /**
194
+ * Creates a P2SH payment from a redeem script.
195
+ *
196
+ * @param redeem - The redeem script information
197
+ * @param network - Network parameters (defaults to mainnet)
198
+ * @returns A new P2SH payment instance
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * const p2sh = P2SH.fromRedeem({ output: redeemScript });
203
+ * ```
204
+ */
205
+ static fromRedeem(redeem, network) {
206
+ return new P2SH({ redeem, network });
207
+ }
208
+ /**
209
+ * Creates a P2SH payment from a Base58Check address.
210
+ *
211
+ * @param address - Base58Check encoded address
212
+ * @param network - Network parameters (defaults to mainnet)
213
+ * @returns A new P2SH payment instance
214
+ */
215
+ static fromAddress(address, network) {
216
+ return new P2SH({ address, network });
217
+ }
218
+ /**
219
+ * Creates a P2SH payment from a 20-byte script hash.
220
+ *
221
+ * @param hash - 20-byte script hash
222
+ * @param network - Network parameters (defaults to mainnet)
223
+ * @returns A new P2SH payment instance
224
+ */
225
+ static fromHash(hash, network) {
226
+ return new P2SH({ hash, network });
227
+ }
228
+ /**
229
+ * Creates a P2SH payment from a scriptPubKey.
230
+ *
231
+ * @param output - The scriptPubKey
232
+ * @param network - Network parameters (defaults to mainnet)
233
+ * @returns A new P2SH payment instance
234
+ */
235
+ static fromOutput(output, network) {
236
+ return new P2SH({ output, network });
237
+ }
238
+ // Private helper methods
239
+ #getDecodedAddress() {
240
+ if (!this.#decodedAddressComputed) {
241
+ if (this.#inputAddress) {
242
+ const payload = new Uint8Array(bs58check.default.decode(this.#inputAddress));
243
+ this.#decodedAddress = {
244
+ version: payload[0],
245
+ hash: payload.subarray(1),
246
+ };
247
+ }
248
+ this.#decodedAddressComputed = true;
249
+ }
250
+ return this.#decodedAddress;
251
+ }
252
+ #getInputChunks() {
253
+ if (!this.#inputChunksComputed) {
254
+ if (this.#inputInput) {
255
+ this.#inputChunks = bscript.decompile(this.#inputInput) ?? undefined;
256
+ }
257
+ this.#inputChunksComputed = true;
258
+ }
259
+ return this.#inputChunks;
260
+ }
261
+ #getDerivedRedeem() {
262
+ if (!this.#derivedRedeemComputed) {
263
+ const chunks = this.#getInputChunks();
264
+ if (chunks) {
265
+ const lastChunk = chunks[chunks.length - 1];
266
+ this.#derivedRedeem = {
267
+ network: this.#network,
268
+ output: (lastChunk === OPS.OP_FALSE ? new Uint8Array(0) : lastChunk),
269
+ input: bscript.compile(chunks.slice(0, -1)),
270
+ witness: this.#inputWitness || [],
271
+ };
272
+ }
273
+ this.#derivedRedeemComputed = true;
274
+ }
275
+ return this.#derivedRedeem;
276
+ }
277
+ // Private computation methods
278
+ #computeAddress() {
279
+ if (this.#inputAddress) {
280
+ return this.#inputAddress;
281
+ }
282
+ const h = this.hash;
283
+ if (!h)
284
+ return undefined;
285
+ const payload = alloc(21);
286
+ payload[0] = this.#network.scriptHash;
287
+ payload.set(h, 1);
61
288
  return bs58check.default.encode(payload);
62
- });
63
- lazy.prop(o, 'hash', () => {
64
- if (a.output)
65
- return a.output.subarray(2, 22);
66
- if (a.address)
67
- return _address().hash;
68
- if (o.redeem && o.redeem.output)
69
- return bcrypto.hash160(o.redeem.output);
70
- });
71
- lazy.prop(o, 'output', () => {
72
- if (!o.hash)
73
- return;
74
- return bscript.compile([OPS.OP_HASH160, o.hash, OPS.OP_EQUAL]);
75
- });
76
- lazy.prop(o, 'redeem', () => {
77
- if (!a.input)
78
- return;
79
- return _redeem();
80
- });
81
- lazy.prop(o, 'input', () => {
82
- if (!a.redeem || !a.redeem.input || !a.redeem.output)
83
- return;
84
- return bscript.compile([].concat(bscript.decompile(a.redeem.input), a.redeem.output));
85
- });
86
- lazy.prop(o, 'witness', () => {
87
- if (o.redeem && o.redeem.witness)
88
- return o.redeem.witness;
89
- if (o.input)
289
+ }
290
+ #computeHash() {
291
+ if (this.#inputHash) {
292
+ return this.#inputHash;
293
+ }
294
+ if (this.#inputOutput) {
295
+ return this.#inputOutput.subarray(2, 22);
296
+ }
297
+ if (this.#inputAddress) {
298
+ return this.#getDecodedAddress()?.hash;
299
+ }
300
+ const r = this.redeem;
301
+ if (r && r.output) {
302
+ return bcrypto.hash160(r.output);
303
+ }
304
+ return undefined;
305
+ }
306
+ #computeOutput() {
307
+ if (this.#inputOutput) {
308
+ return this.#inputOutput;
309
+ }
310
+ const h = this.hash;
311
+ if (!h)
312
+ return undefined;
313
+ return bscript.compile([OPS.OP_HASH160, h, OPS.OP_EQUAL]);
314
+ }
315
+ #computeInput() {
316
+ if (this.#inputInput) {
317
+ return this.#inputInput;
318
+ }
319
+ const r = this.#inputRedeem;
320
+ if (!r || !r.input || !r.output) {
321
+ return undefined;
322
+ }
323
+ return bscript.compile([].concat(bscript.decompile(r.input), r.output));
324
+ }
325
+ #computeRedeem() {
326
+ if (this.#inputRedeem) {
327
+ return this.#inputRedeem;
328
+ }
329
+ if (this.#inputInput) {
330
+ return this.#getDerivedRedeem();
331
+ }
332
+ return undefined;
333
+ }
334
+ #computeWitness() {
335
+ if (this.#inputWitness) {
336
+ return this.#inputWitness;
337
+ }
338
+ const r = this.redeem;
339
+ if (r && r.witness) {
340
+ return r.witness;
341
+ }
342
+ if (this.input) {
90
343
  return [];
91
- });
92
- lazy.prop(o, 'name', () => {
93
- const nameParts = ['p2sh'];
94
- if (o.redeem !== undefined && o.redeem.name !== undefined)
95
- nameParts.push(o.redeem.name);
96
- return nameParts.join('-');
97
- });
98
- if (opts.validate) {
99
- let hash = Buffer.from([]);
100
- if (a.address) {
101
- if (_address().version !== network.scriptHash)
344
+ }
345
+ return undefined;
346
+ }
347
+ // Validation
348
+ #checkRedeem(redeem) {
349
+ // Is the redeem output empty/invalid?
350
+ if (redeem.output) {
351
+ const decompile = bscript.decompile(redeem.output);
352
+ if (!decompile || decompile.length < 1) {
353
+ throw new TypeError('Redeem.output too short');
354
+ }
355
+ if (redeem.output.byteLength > 520) {
356
+ throw new TypeError('Redeem.output unspendable if larger than 520 bytes');
357
+ }
358
+ if (bscript.countNonPushOnlyOPs(decompile) > 201) {
359
+ throw new TypeError('Redeem.output unspendable with more than 201 non-push ops');
360
+ }
361
+ }
362
+ if (redeem.input) {
363
+ const hasInput = redeem.input.length > 0;
364
+ const hasWitness = redeem.witness && redeem.witness.length > 0;
365
+ if (!hasInput && !hasWitness) {
366
+ throw new TypeError('Empty input');
367
+ }
368
+ if (hasInput && hasWitness) {
369
+ throw new TypeError('Input and witness provided');
370
+ }
371
+ if (hasInput) {
372
+ const richunks = bscript.decompile(redeem.input);
373
+ if (!bscript.isPushOnly(richunks)) {
374
+ throw new TypeError('Non push-only scriptSig');
375
+ }
376
+ }
377
+ }
378
+ }
379
+ #validate() {
380
+ let hash = new Uint8Array(0);
381
+ if (this.#inputAddress) {
382
+ const addr = this.#getDecodedAddress();
383
+ if (!addr) {
384
+ throw new TypeError('Invalid address');
385
+ }
386
+ if (addr.version !== this.#network.scriptHash) {
102
387
  throw new TypeError('Invalid version or Network mismatch');
103
- if (_address().hash.length !== 20)
388
+ }
389
+ if (addr.hash.length !== 20) {
104
390
  throw new TypeError('Invalid address');
105
- hash = _address().hash;
391
+ }
392
+ hash = addr.hash;
106
393
  }
107
- if (a.hash) {
108
- if (hash.length > 0 && !hash.equals(a.hash))
394
+ if (this.#inputHash) {
395
+ if (hash.length > 0 && !equals(hash, this.#inputHash)) {
109
396
  throw new TypeError('Hash mismatch');
110
- else
111
- hash = a.hash;
112
- }
113
- if (a.output) {
114
- if (a.output.length !== 23 ||
115
- a.output[0] !== OPS.OP_HASH160 ||
116
- a.output[1] !== 0x14 ||
117
- a.output[22] !== OPS.OP_EQUAL)
397
+ }
398
+ else {
399
+ hash = this.#inputHash;
400
+ }
401
+ }
402
+ if (this.#inputOutput) {
403
+ if (this.#inputOutput.length !== 23 ||
404
+ this.#inputOutput[0] !== OPS.OP_HASH160 ||
405
+ this.#inputOutput[1] !== 0x14 ||
406
+ this.#inputOutput[22] !== OPS.OP_EQUAL) {
118
407
  throw new TypeError('Output is invalid');
119
- const hash2 = a.output.subarray(2, 22);
120
- if (hash.length > 0 && !hash.equals(hash2))
408
+ }
409
+ const hash2 = this.#inputOutput.subarray(2, 22);
410
+ if (hash.length > 0 && !equals(hash, hash2)) {
121
411
  throw new TypeError('Hash mismatch');
122
- else
412
+ }
413
+ else {
123
414
  hash = hash2;
415
+ }
124
416
  }
125
- const checkRedeem = (redeem) => {
126
- if (redeem.output) {
127
- const decompile = bscript.decompile(redeem.output);
128
- if (!decompile || decompile.length < 1)
129
- throw new TypeError('Redeem.output too short');
130
- if (redeem.output.byteLength > 520)
131
- throw new TypeError('Redeem.output unspendable if larger than 520 bytes');
132
- if (bscript.countNonPushOnlyOPs(decompile) > 201)
133
- throw new TypeError('Redeem.output unspendable with more than 201 non-push ops');
134
- const hash2 = bcrypto.hash160(redeem.output);
135
- if (hash.length > 0 && !hash.equals(hash2))
417
+ if (this.#inputInput) {
418
+ const chunks = this.#getInputChunks();
419
+ if (!chunks || chunks.length < 1) {
420
+ throw new TypeError('Input too short');
421
+ }
422
+ const derived = this.#getDerivedRedeem();
423
+ if (!derived || !(derived.output instanceof Uint8Array)) {
424
+ throw new TypeError('Input is invalid');
425
+ }
426
+ this.#checkRedeem(derived);
427
+ // Match hash against redeem output
428
+ if (derived.output) {
429
+ const hash2 = bcrypto.hash160(derived.output);
430
+ if (hash.length > 0 && !equals(hash, hash2)) {
136
431
  throw new TypeError('Hash mismatch');
137
- else
432
+ }
433
+ else {
138
434
  hash = hash2;
139
- }
140
- if (redeem.input) {
141
- const hasInput = redeem.input.length > 0;
142
- const hasWitness = redeem.witness && redeem.witness.length > 0;
143
- if (!hasInput && !hasWitness)
144
- throw new TypeError('Empty input');
145
- if (hasInput && hasWitness)
146
- throw new TypeError('Input and witness provided');
147
- if (hasInput) {
148
- const richunks = bscript.decompile(redeem.input);
149
- if (!bscript.isPushOnly(richunks))
150
- throw new TypeError('Non push-only scriptSig');
151
435
  }
152
436
  }
153
- };
154
- if (a.input) {
155
- const chunks = _chunks();
156
- if (!chunks || chunks.length < 1)
157
- throw new TypeError('Input too short');
158
- if (!Buffer.isBuffer(_redeem().output))
159
- throw new TypeError('Input is invalid');
160
- checkRedeem(_redeem());
161
437
  }
162
- if (a.redeem) {
163
- if (a.redeem.network && a.redeem.network !== network)
438
+ if (this.#inputRedeem) {
439
+ if (this.#inputRedeem.network && this.#inputRedeem.network !== this.#network) {
164
440
  throw new TypeError('Network mismatch');
165
- if (a.input) {
166
- const redeem = _redeem();
167
- if (a.redeem.output && !a.redeem.output.equals(redeem.output))
168
- throw new TypeError('Redeem.output mismatch');
169
- if (a.redeem.input && !a.redeem.input.equals(redeem.input))
170
- throw new TypeError('Redeem.input mismatch');
171
441
  }
172
- checkRedeem(a.redeem);
442
+ if (this.#inputInput) {
443
+ const derived = this.#getDerivedRedeem();
444
+ if (derived) {
445
+ if (this.#inputRedeem.output &&
446
+ derived.output &&
447
+ !equals(this.#inputRedeem.output, derived.output)) {
448
+ throw new TypeError('Redeem.output mismatch');
449
+ }
450
+ if (this.#inputRedeem.input &&
451
+ derived.input &&
452
+ !equals(this.#inputRedeem.input, derived.input)) {
453
+ throw new TypeError('Redeem.input mismatch');
454
+ }
455
+ }
456
+ }
457
+ this.#checkRedeem(this.#inputRedeem);
458
+ // Match hash against redeem output
459
+ if (this.#inputRedeem.output) {
460
+ const hash2 = bcrypto.hash160(this.#inputRedeem.output);
461
+ if (hash.length > 0 && !equals(hash, hash2)) {
462
+ throw new TypeError('Hash mismatch');
463
+ }
464
+ }
173
465
  }
174
- if (a.witness) {
175
- if (a.redeem && a.redeem.witness && !stacksEqual(a.redeem.witness, a.witness))
466
+ if (this.#inputWitness) {
467
+ if (this.#inputRedeem &&
468
+ this.#inputRedeem.witness &&
469
+ !stacksEqual(this.#inputRedeem.witness, this.#inputWitness)) {
176
470
  throw new TypeError('Witness and redeem.witness mismatch');
471
+ }
177
472
  }
178
473
  }
179
- return Object.assign(o, a);
474
+ /**
475
+ * Converts to a plain P2SHPayment object for backwards compatibility.
476
+ *
477
+ * @returns A P2SHPayment object
478
+ */
479
+ toPayment() {
480
+ return {
481
+ name: this.name,
482
+ network: this.network,
483
+ address: this.address,
484
+ hash: this.hash,
485
+ output: this.output,
486
+ input: this.input,
487
+ redeem: this.redeem,
488
+ witness: this.witness,
489
+ };
490
+ }
491
+ }
492
+ /**
493
+ * Creates a Pay-to-Script-Hash (P2SH) payment object.
494
+ *
495
+ * This is the legacy factory function for backwards compatibility.
496
+ * For new code, prefer using the P2SH class directly.
497
+ *
498
+ * @param a - The payment object containing the necessary data
499
+ * @param opts - Optional payment options
500
+ * @returns The P2SH payment object
501
+ * @throws {TypeError} If the required data is not provided or if the data is invalid
502
+ *
503
+ * @example
504
+ * ```typescript
505
+ * import { p2sh, p2ms } from '@btc-vision/bitcoin';
506
+ *
507
+ * // Wrap a multisig in P2SH
508
+ * const multisig = p2ms({ m: 2, pubkeys: [pk1, pk2, pk3] });
509
+ * const payment = p2sh({ redeem: multisig });
510
+ * ```
511
+ */
512
+ export function p2sh(a, opts) {
513
+ if (!a.address && !a.hash && !a.output && !a.redeem && !a.input) {
514
+ throw new TypeError('Not enough data');
515
+ }
516
+ const instance = new P2SH({
517
+ address: a.address,
518
+ hash: a.hash,
519
+ output: a.output,
520
+ input: a.input,
521
+ redeem: a.redeem,
522
+ witness: a.witness,
523
+ network: a.network,
524
+ }, opts);
525
+ // Return a merged object for backwards compatibility
526
+ return Object.assign(instance.toPayment(), a);
180
527
  }
528
+ //# sourceMappingURL=p2sh.js.map