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