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