@btc-vision/bitcoin 6.5.5 → 7.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/AUDIT/README.md +9 -0
  2. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  3. package/SECURITY.md +27 -0
  4. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  5. package/benchmark/signing.bench.ts +147 -0
  6. package/browser/address.d.ts +56 -9
  7. package/browser/address.d.ts.map +1 -0
  8. package/browser/bech32utils.d.ts +9 -1
  9. package/browser/bech32utils.d.ts.map +1 -0
  10. package/browser/bip66.d.ts +11 -6
  11. package/browser/bip66.d.ts.map +1 -0
  12. package/browser/block.d.ts +117 -11
  13. package/browser/block.d.ts.map +1 -0
  14. package/browser/branded.d.ts +20 -0
  15. package/browser/branded.d.ts.map +1 -0
  16. package/browser/crypto/crypto.d.ts +1 -0
  17. package/browser/crypto/crypto.d.ts.map +1 -0
  18. package/browser/crypto.d.ts +46 -7
  19. package/browser/crypto.d.ts.map +1 -0
  20. package/browser/ecc/context.d.ts +129 -0
  21. package/browser/ecc/context.d.ts.map +1 -0
  22. package/browser/ecc/index.d.ts +11 -0
  23. package/browser/ecc/index.d.ts.map +1 -0
  24. package/browser/ecc/types.d.ts +128 -0
  25. package/browser/ecc/types.d.ts.map +1 -0
  26. package/browser/ecpair.d.ts +99 -0
  27. package/browser/errors.d.ts +124 -0
  28. package/browser/errors.d.ts.map +1 -0
  29. package/browser/index.d.ts +32 -5
  30. package/browser/index.d.ts.map +1 -0
  31. package/browser/index.js +12482 -101
  32. package/browser/io/BinaryReader.d.ts +276 -0
  33. package/browser/io/BinaryReader.d.ts.map +1 -0
  34. package/browser/io/BinaryWriter.d.ts +391 -0
  35. package/browser/io/BinaryWriter.d.ts.map +1 -0
  36. package/browser/io/MemoryPool.d.ts +220 -0
  37. package/browser/io/MemoryPool.d.ts.map +1 -0
  38. package/browser/io/base64.d.ts +13 -0
  39. package/browser/io/base64.d.ts.map +1 -0
  40. package/browser/io/hex.d.ts +67 -0
  41. package/browser/io/hex.d.ts.map +1 -0
  42. package/browser/io/index.d.ts +17 -0
  43. package/browser/io/index.d.ts.map +1 -0
  44. package/browser/io/utils.d.ts +199 -0
  45. package/browser/io/utils.d.ts.map +1 -0
  46. package/browser/merkle.d.ts +10 -1
  47. package/browser/merkle.d.ts.map +1 -0
  48. package/browser/networks.d.ts +70 -9
  49. package/browser/networks.d.ts.map +1 -0
  50. package/browser/opcodes.d.ts +1 -0
  51. package/browser/opcodes.d.ts.map +1 -0
  52. package/browser/payments/bip341.d.ts +35 -9
  53. package/browser/payments/bip341.d.ts.map +1 -0
  54. package/browser/payments/embed.d.ts +112 -1
  55. package/browser/payments/embed.d.ts.map +1 -0
  56. package/browser/payments/index.d.ts +17 -10
  57. package/browser/payments/index.d.ts.map +1 -0
  58. package/browser/payments/p2ms.d.ts +150 -0
  59. package/browser/payments/p2ms.d.ts.map +1 -0
  60. package/browser/payments/p2op.d.ts +150 -24
  61. package/browser/payments/p2op.d.ts.map +1 -0
  62. package/browser/payments/p2pk.d.ts +154 -1
  63. package/browser/payments/p2pk.d.ts.map +1 -0
  64. package/browser/payments/p2pkh.d.ts +176 -1
  65. package/browser/payments/p2pkh.d.ts.map +1 -0
  66. package/browser/payments/p2sh.d.ts +150 -1
  67. package/browser/payments/p2sh.d.ts.map +1 -0
  68. package/browser/payments/p2tr.d.ts +185 -1
  69. package/browser/payments/p2tr.d.ts.map +1 -0
  70. package/browser/payments/p2wpkh.d.ts +161 -1
  71. package/browser/payments/p2wpkh.d.ts.map +1 -0
  72. package/browser/payments/p2wsh.d.ts +146 -1
  73. package/browser/payments/p2wsh.d.ts.map +1 -0
  74. package/browser/payments/types.d.ts +94 -64
  75. package/browser/payments/types.d.ts.map +1 -0
  76. package/browser/psbt/bip371.d.ts +34 -8
  77. package/browser/psbt/bip371.d.ts.map +1 -0
  78. package/browser/psbt/psbtutils.d.ts +56 -16
  79. package/browser/psbt/psbtutils.d.ts.map +1 -0
  80. package/browser/psbt/types.d.ts +245 -0
  81. package/browser/psbt/types.d.ts.map +1 -0
  82. package/browser/psbt/utils.d.ts +64 -0
  83. package/browser/psbt/utils.d.ts.map +1 -0
  84. package/browser/psbt/validation.d.ts +84 -0
  85. package/browser/psbt/validation.d.ts.map +1 -0
  86. package/browser/psbt.d.ts +82 -118
  87. package/browser/psbt.d.ts.map +1 -0
  88. package/browser/pubkey.d.ts +27 -6
  89. package/browser/pubkey.d.ts.map +1 -0
  90. package/browser/push_data.d.ts +24 -2
  91. package/browser/push_data.d.ts.map +1 -0
  92. package/browser/script.d.ts +33 -8
  93. package/browser/script.d.ts.map +1 -0
  94. package/browser/script_number.d.ts +17 -0
  95. package/browser/script_number.d.ts.map +1 -0
  96. package/browser/script_signature.d.ts +23 -5
  97. package/browser/script_signature.d.ts.map +1 -0
  98. package/browser/transaction.d.ts +160 -18
  99. package/browser/transaction.d.ts.map +1 -0
  100. package/browser/types.d.ts +36 -38
  101. package/browser/types.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  103. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  104. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  105. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  106. package/browser/workers/ecc-bundle.d.ts +25 -0
  107. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  108. package/browser/workers/index.d.ts +91 -0
  109. package/browser/workers/index.d.ts.map +1 -0
  110. package/browser/workers/psbt-parallel.d.ts +88 -0
  111. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  112. package/browser/workers/signing-worker.d.ts +37 -0
  113. package/browser/workers/signing-worker.d.ts.map +1 -0
  114. package/browser/workers/types.d.ts +365 -0
  115. package/browser/workers/types.d.ts.map +1 -0
  116. package/build/address.d.ts +57 -10
  117. package/build/address.d.ts.map +1 -0
  118. package/build/address.js +80 -24
  119. package/build/address.js.map +1 -0
  120. package/build/bech32utils.d.ts +9 -1
  121. package/build/bech32utils.d.ts.map +1 -0
  122. package/build/bech32utils.js +10 -2
  123. package/build/bech32utils.js.map +1 -0
  124. package/build/bip66.d.ts +11 -6
  125. package/build/bip66.d.ts.map +1 -0
  126. package/build/bip66.js +32 -3
  127. package/build/bip66.js.map +1 -0
  128. package/build/block.d.ts +117 -11
  129. package/build/block.d.ts.map +1 -0
  130. package/build/block.js +204 -72
  131. package/build/block.js.map +1 -0
  132. package/build/branded.d.ts +20 -0
  133. package/build/branded.d.ts.map +1 -0
  134. package/build/branded.js +7 -0
  135. package/build/branded.js.map +1 -0
  136. package/build/crypto/crypto.d.ts +1 -0
  137. package/build/crypto/crypto.d.ts.map +1 -0
  138. package/build/crypto/crypto.js +1 -0
  139. package/build/crypto/crypto.js.map +1 -0
  140. package/build/crypto.d.ts +46 -7
  141. package/build/crypto.d.ts.map +1 -0
  142. package/build/crypto.js +65 -20
  143. package/build/crypto.js.map +1 -0
  144. package/build/ecc/context.d.ts +135 -0
  145. package/build/ecc/context.d.ts.map +1 -0
  146. package/build/ecc/context.js +232 -0
  147. package/build/ecc/context.js.map +1 -0
  148. package/build/ecc/index.d.ts +11 -0
  149. package/build/ecc/index.d.ts.map +1 -0
  150. package/build/ecc/index.js +11 -0
  151. package/build/ecc/index.js.map +1 -0
  152. package/build/ecc/types.d.ts +134 -0
  153. package/build/ecc/types.d.ts.map +1 -0
  154. package/build/ecc/types.js +8 -0
  155. package/build/ecc/types.js.map +1 -0
  156. package/build/errors.d.ts +124 -0
  157. package/build/errors.d.ts.map +1 -0
  158. package/build/errors.js +155 -0
  159. package/build/errors.js.map +1 -0
  160. package/build/index.d.ts +32 -5
  161. package/build/index.d.ts.map +1 -0
  162. package/build/index.js +26 -3
  163. package/build/index.js.map +1 -0
  164. package/build/io/BinaryReader.d.ts +276 -0
  165. package/build/io/BinaryReader.d.ts.map +1 -0
  166. package/build/io/BinaryReader.js +425 -0
  167. package/build/io/BinaryReader.js.map +1 -0
  168. package/build/io/BinaryWriter.d.ts +391 -0
  169. package/build/io/BinaryWriter.d.ts.map +1 -0
  170. package/build/io/BinaryWriter.js +611 -0
  171. package/build/io/BinaryWriter.js.map +1 -0
  172. package/build/io/MemoryPool.d.ts +220 -0
  173. package/build/io/MemoryPool.d.ts.map +1 -0
  174. package/build/io/MemoryPool.js +309 -0
  175. package/build/io/MemoryPool.js.map +1 -0
  176. package/build/io/base64.d.ts +13 -0
  177. package/build/io/base64.d.ts.map +1 -0
  178. package/build/io/base64.js +20 -0
  179. package/build/io/base64.js.map +1 -0
  180. package/build/io/hex.d.ts +67 -0
  181. package/build/io/hex.d.ts.map +1 -0
  182. package/build/io/hex.js +138 -0
  183. package/build/io/hex.js.map +1 -0
  184. package/build/io/index.d.ts +17 -0
  185. package/build/io/index.d.ts.map +1 -0
  186. package/build/io/index.js +23 -0
  187. package/build/io/index.js.map +1 -0
  188. package/build/io/utils.d.ts +199 -0
  189. package/build/io/utils.d.ts.map +1 -0
  190. package/build/io/utils.js +271 -0
  191. package/build/io/utils.js.map +1 -0
  192. package/build/merkle.d.ts +10 -1
  193. package/build/merkle.d.ts.map +1 -0
  194. package/build/merkle.js +12 -1
  195. package/build/merkle.js.map +1 -0
  196. package/build/networks.d.ts +70 -9
  197. package/build/networks.d.ts.map +1 -0
  198. package/build/networks.js +90 -4
  199. package/build/networks.js.map +1 -0
  200. package/build/opcodes.d.ts +1 -0
  201. package/build/opcodes.d.ts.map +1 -0
  202. package/build/opcodes.js +1 -0
  203. package/build/opcodes.js.map +1 -0
  204. package/build/payments/bip341.d.ts +36 -9
  205. package/build/payments/bip341.d.ts.map +1 -0
  206. package/build/payments/bip341.js +35 -15
  207. package/build/payments/bip341.js.map +1 -0
  208. package/build/payments/embed.d.ts +120 -1
  209. package/build/payments/embed.d.ts.map +1 -0
  210. package/build/payments/embed.js +215 -34
  211. package/build/payments/embed.js.map +1 -0
  212. package/build/payments/index.d.ts +17 -10
  213. package/build/payments/index.d.ts.map +1 -0
  214. package/build/payments/index.js +20 -10
  215. package/build/payments/index.js.map +1 -0
  216. package/build/payments/p2ms.d.ts +159 -1
  217. package/build/payments/p2ms.d.ts.map +1 -0
  218. package/build/payments/p2ms.js +427 -108
  219. package/build/payments/p2ms.js.map +1 -0
  220. package/build/payments/p2op.d.ts +158 -24
  221. package/build/payments/p2op.d.ts.map +1 -0
  222. package/build/payments/p2op.js +379 -93
  223. package/build/payments/p2op.js.map +1 -0
  224. package/build/payments/p2pk.d.ts +162 -1
  225. package/build/payments/p2pk.d.ts.map +1 -0
  226. package/build/payments/p2pk.js +327 -58
  227. package/build/payments/p2pk.js.map +1 -0
  228. package/build/payments/p2pkh.d.ts +185 -1
  229. package/build/payments/p2pkh.d.ts.map +1 -0
  230. package/build/payments/p2pkh.js +467 -114
  231. package/build/payments/p2pkh.js.map +1 -0
  232. package/build/payments/p2sh.d.ts +159 -1
  233. package/build/payments/p2sh.d.ts.map +1 -0
  234. package/build/payments/p2sh.js +500 -152
  235. package/build/payments/p2sh.js.map +1 -0
  236. package/build/payments/p2tr.d.ts +193 -1
  237. package/build/payments/p2tr.d.ts.map +1 -0
  238. package/build/payments/p2tr.js +592 -174
  239. package/build/payments/p2tr.js.map +1 -0
  240. package/build/payments/p2wpkh.d.ts +170 -1
  241. package/build/payments/p2wpkh.d.ts.map +1 -0
  242. package/build/payments/p2wpkh.js +429 -104
  243. package/build/payments/p2wpkh.js.map +1 -0
  244. package/build/payments/p2wsh.d.ts +155 -1
  245. package/build/payments/p2wsh.d.ts.map +1 -0
  246. package/build/payments/p2wsh.js +466 -144
  247. package/build/payments/p2wsh.js.map +1 -0
  248. package/build/payments/types.d.ts +98 -64
  249. package/build/payments/types.d.ts.map +1 -0
  250. package/build/payments/types.js +17 -13
  251. package/build/payments/types.js.map +1 -0
  252. package/build/psbt/bip371.d.ts +35 -9
  253. package/build/psbt/bip371.d.ts.map +1 -0
  254. package/build/psbt/bip371.js +113 -28
  255. package/build/psbt/bip371.js.map +1 -0
  256. package/build/psbt/psbtutils.d.ts +56 -16
  257. package/build/psbt/psbtutils.d.ts.map +1 -0
  258. package/build/psbt/psbtutils.js +71 -16
  259. package/build/psbt/psbtutils.js.map +1 -0
  260. package/build/psbt/types.d.ts +249 -0
  261. package/build/psbt/types.d.ts.map +1 -0
  262. package/build/psbt/types.js +6 -0
  263. package/build/psbt/types.js.map +1 -0
  264. package/build/psbt/utils.d.ts +68 -0
  265. package/build/psbt/utils.d.ts.map +1 -0
  266. package/build/psbt/utils.js +171 -0
  267. package/build/psbt/utils.js.map +1 -0
  268. package/build/psbt/validation.d.ts +88 -0
  269. package/build/psbt/validation.d.ts.map +1 -0
  270. package/build/psbt/validation.js +149 -0
  271. package/build/psbt/validation.js.map +1 -0
  272. package/build/psbt.d.ts +84 -120
  273. package/build/psbt.d.ts.map +1 -0
  274. package/build/psbt.js +411 -412
  275. package/build/psbt.js.map +1 -0
  276. package/build/pubkey.d.ts +27 -6
  277. package/build/pubkey.d.ts.map +1 -0
  278. package/build/pubkey.js +37 -13
  279. package/build/pubkey.js.map +1 -0
  280. package/build/push_data.d.ts +24 -2
  281. package/build/push_data.d.ts.map +1 -0
  282. package/build/push_data.js +44 -12
  283. package/build/push_data.js.map +1 -0
  284. package/build/script.d.ts +33 -8
  285. package/build/script.d.ts.map +1 -0
  286. package/build/script.js +100 -36
  287. package/build/script.js.map +1 -0
  288. package/build/script_number.d.ts +17 -0
  289. package/build/script_number.d.ts.map +1 -0
  290. package/build/script_number.js +19 -0
  291. package/build/script_number.js.map +1 -0
  292. package/build/script_signature.d.ts +23 -5
  293. package/build/script_signature.d.ts.map +1 -0
  294. package/build/script_signature.js +48 -15
  295. package/build/script_signature.js.map +1 -0
  296. package/build/transaction.d.ts +160 -18
  297. package/build/transaction.d.ts.map +1 -0
  298. package/build/transaction.js +443 -176
  299. package/build/transaction.js.map +1 -0
  300. package/build/tsconfig.build.tsbuildinfo +1 -0
  301. package/build/types.d.ts +36 -38
  302. package/build/types.d.ts.map +1 -0
  303. package/build/types.js +175 -57
  304. package/build/types.js.map +1 -0
  305. package/build/workers/WorkerSigningPool.d.ts +174 -0
  306. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  307. package/build/workers/WorkerSigningPool.js +553 -0
  308. package/build/workers/WorkerSigningPool.js.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  310. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  311. package/build/workers/WorkerSigningPool.node.js +753 -0
  312. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  313. package/build/workers/ecc-bundle.d.ts +25 -0
  314. package/build/workers/ecc-bundle.d.ts.map +1 -0
  315. package/build/workers/ecc-bundle.js +25 -0
  316. package/build/workers/ecc-bundle.js.map +1 -0
  317. package/build/workers/index.d.ts +91 -0
  318. package/build/workers/index.d.ts.map +1 -0
  319. package/build/workers/index.js +114 -0
  320. package/build/workers/index.js.map +1 -0
  321. package/build/workers/psbt-parallel.d.ts +117 -0
  322. package/build/workers/psbt-parallel.d.ts.map +1 -0
  323. package/build/workers/psbt-parallel.js +233 -0
  324. package/build/workers/psbt-parallel.js.map +1 -0
  325. package/build/workers/signing-worker.d.ts +37 -0
  326. package/build/workers/signing-worker.d.ts.map +1 -0
  327. package/build/workers/signing-worker.js +350 -0
  328. package/build/workers/signing-worker.js.map +1 -0
  329. package/build/workers/types.d.ts +365 -0
  330. package/build/workers/types.d.ts.map +1 -0
  331. package/build/workers/types.js +60 -0
  332. package/build/workers/types.js.map +1 -0
  333. package/package.json +83 -25
  334. package/scripts/bundle-ecc.ts +111 -0
  335. package/src/address.ts +81 -44
  336. package/src/bech32utils.ts +3 -3
  337. package/src/bip66.ts +34 -24
  338. package/src/block.ts +196 -84
  339. package/src/branded.ts +18 -0
  340. package/src/crypto.ts +64 -26
  341. package/src/ecc/context.ts +277 -0
  342. package/src/ecc/index.ts +14 -0
  343. package/src/ecc/types.ts +154 -0
  344. package/src/ecpair.d.ts +99 -0
  345. package/src/errors.ts +163 -0
  346. package/src/index.ts +113 -9
  347. package/src/io/BinaryReader.ts +461 -0
  348. package/src/io/BinaryWriter.ts +696 -0
  349. package/src/io/MemoryPool.ts +343 -0
  350. package/src/io/base64.ts +20 -0
  351. package/src/io/hex.ts +155 -0
  352. package/src/io/index.ts +41 -0
  353. package/src/io/utils.ts +283 -0
  354. package/src/merkle.ts +14 -9
  355. package/src/networks.ts +9 -9
  356. package/src/payments/bip341.ts +34 -33
  357. package/src/payments/embed.ts +244 -41
  358. package/src/payments/index.ts +12 -10
  359. package/src/payments/p2ms.ts +490 -118
  360. package/src/payments/p2op.ts +431 -133
  361. package/src/payments/p2pk.ts +370 -72
  362. package/src/payments/p2pkh.ts +524 -130
  363. package/src/payments/p2sh.ts +572 -172
  364. package/src/payments/p2tr.ts +686 -194
  365. package/src/payments/p2wpkh.ts +484 -107
  366. package/src/payments/p2wsh.ts +526 -164
  367. package/src/payments/types.ts +80 -66
  368. package/src/psbt/bip371.ts +68 -51
  369. package/src/psbt/psbtutils.ts +39 -40
  370. package/src/psbt/types.ts +331 -0
  371. package/src/psbt/utils.ts +188 -0
  372. package/src/psbt/validation.ts +192 -0
  373. package/src/psbt.ts +566 -809
  374. package/src/pubkey.ts +24 -25
  375. package/src/push_data.ts +18 -16
  376. package/src/script.ts +82 -64
  377. package/src/script_number.ts +6 -6
  378. package/src/script_signature.ts +33 -36
  379. package/src/transaction.ts +458 -238
  380. package/src/types.ts +231 -100
  381. package/src/workers/WorkerSigningPool.node.ts +887 -0
  382. package/src/workers/WorkerSigningPool.ts +670 -0
  383. package/src/workers/ecc-bundle.ts +26 -0
  384. package/src/workers/index.ts +165 -0
  385. package/src/workers/psbt-parallel.ts +332 -0
  386. package/src/workers/signing-worker.ts +353 -0
  387. package/src/workers/types.ts +413 -0
  388. package/test/address.spec.ts +9 -6
  389. package/test/bitcoin.core.spec.ts +16 -17
  390. package/test/block.spec.ts +8 -7
  391. package/test/bufferutils.spec.ts +228 -214
  392. package/test/crypto.spec.ts +19 -11
  393. package/test/fixtures/p2pk.json +0 -8
  394. package/test/fixtures/p2pkh.json +1 -1
  395. package/test/fixtures/p2sh.json +1 -1
  396. package/test/fixtures/script.json +1 -1
  397. package/test/fixtures/transaction.json +2 -2
  398. package/test/integration/_regtest.ts +25 -0
  399. package/test/integration/addresses.spec.ts +4 -3
  400. package/test/integration/bip32.spec.ts +2 -1
  401. package/test/integration/blocks.spec.ts +1 -1
  402. package/test/integration/cltv.spec.ts +18 -16
  403. package/test/integration/csv.spec.ts +37 -64
  404. package/test/integration/payments.spec.ts +5 -3
  405. package/test/integration/taproot.spec.ts +76 -83
  406. package/test/integration/transactions.spec.ts +38 -35
  407. package/test/payments.spec.ts +35 -13
  408. package/test/payments.utils.ts +17 -16
  409. package/test/psbt.spec.ts +111 -100
  410. package/test/script.spec.ts +11 -10
  411. package/test/script_signature.spec.ts +9 -11
  412. package/test/taproot-cache.spec.ts +694 -0
  413. package/test/transaction.spec.ts +32 -40
  414. package/test/types.spec.ts +74 -29
  415. package/test/workers-pool.spec.ts +963 -0
  416. package/test/workers-signing.spec.ts +635 -0
  417. package/test/workers.spec.ts +1390 -0
  418. package/tsconfig.base.json +34 -18
  419. package/tsconfig.browser.json +15 -0
  420. package/tsconfig.build.json +5 -0
  421. package/tsconfig.json +5 -14
  422. package/vite.config.browser.ts +3 -42
  423. package/vitest.config.integration.ts +11 -0
  424. package/browser/bufferutils.d.ts +0 -34
  425. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  426. package/browser/chunks/payments-yjA0Evsv.js +0 -1089
  427. package/browser/chunks/psbt-URK2hBFc.js +0 -4039
  428. package/browser/chunks/script-DyPItFEl.js +0 -318
  429. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  430. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  431. package/browser/ecc_lib.d.ts +0 -3
  432. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  433. package/browser/hooks/HookedSigner.d.ts +0 -4
  434. package/browser/hooks/SignatureManager.d.ts +0 -13
  435. package/browser/payments/lazy.d.ts +0 -2
  436. package/browser/typeforce.d.ts +0 -38
  437. package/build/bufferutils.d.ts +0 -34
  438. package/build/bufferutils.js +0 -141
  439. package/build/ecc_lib.d.ts +0 -3
  440. package/build/ecc_lib.js +0 -61
  441. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  442. package/build/hooks/AdvancedSignatureManager.js +0 -52
  443. package/build/hooks/HookedSigner.d.ts +0 -4
  444. package/build/hooks/HookedSigner.js +0 -64
  445. package/build/hooks/SignatureManager.d.ts +0 -13
  446. package/build/hooks/SignatureManager.js +0 -45
  447. package/build/payments/lazy.d.ts +0 -2
  448. package/build/payments/lazy.js +0 -28
  449. package/build/tsconfig.tsbuildinfo +0 -1
  450. package/src/bufferutils.ts +0 -188
  451. package/src/ecc_lib.ts +0 -94
  452. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  453. package/src/hooks/HookedSigner.ts +0 -108
  454. package/src/hooks/SignatureManager.ts +0 -84
  455. package/src/payments/lazy.ts +0 -28
  456. package/src/typeforce.d.ts +0 -38
  457. package/tsconfig.webpack.json +0 -18
@@ -1,108 +1,420 @@
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 { isPoint, type Bytes20, type PublicKey, type Script, type Signature } from '../types.js';
17
+ import { alloc, equals } from '../io/index.js';
18
+ import { PaymentType, type P2PKHPayment, type PaymentOpts } 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
+ #getDecodedAddress(): { version: number; hash: Uint8Array } | undefined {
307
+ if (!this.#decodedAddressComputed) {
308
+ if (this.#inputAddress) {
309
+ const payload = new Uint8Array(bs58check.default.decode(this.#inputAddress));
310
+ this.#decodedAddress = {
311
+ version: payload[0]!,
312
+ hash: payload.subarray(1),
313
+ };
314
+ }
315
+ this.#decodedAddressComputed = true;
316
+ }
317
+ return this.#decodedAddress;
318
+ }
319
+
320
+ #getInputChunks(): (Uint8Array | number)[] | undefined {
321
+ if (!this.#inputChunksComputed) {
322
+ if (this.#inputInput) {
323
+ this.#inputChunks = bscript.decompile(this.#inputInput) ?? undefined;
324
+ }
325
+ this.#inputChunksComputed = true;
326
+ }
327
+ return this.#inputChunks;
328
+ }
329
+
330
+ // Private computation methods
331
+
332
+ #computeAddress(): string | undefined {
333
+ if (this.#inputAddress) {
334
+ return this.#inputAddress;
335
+ }
336
+ const h = this.hash;
337
+ if (!h) return undefined;
42
338
 
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);
339
+ const payload = alloc(21);
340
+ payload[0] = this.#network.pubKeyHash;
341
+ payload.set(h, 1);
67
342
  return bs58check.default.encode(payload);
68
- });
343
+ }
344
+
345
+ #computeHash(): Bytes20 | undefined {
346
+ if (this.#inputHash) {
347
+ return this.#inputHash as Bytes20;
348
+ }
349
+ if (this.#inputOutput) {
350
+ return this.#inputOutput.subarray(3, 23) as Bytes20;
351
+ }
352
+ if (this.#inputAddress) {
353
+ return this.#getDecodedAddress()?.hash as Bytes20 | undefined;
354
+ }
355
+ // Use the pubkey getter to derive pubkey from input if available
356
+ const pk = this.pubkey;
357
+ if (pk) {
358
+ return bcrypto.hash160(pk) as Bytes20;
359
+ }
360
+ return undefined;
361
+ }
69
362
 
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
- });
363
+ #computePubkey(): PublicKey | undefined {
364
+ if (this.#inputPubkey) {
365
+ return this.#inputPubkey as PublicKey;
366
+ }
367
+ if (this.#inputInput) {
368
+ const chunks = this.#getInputChunks();
369
+ if (chunks && chunks.length >= 2) {
370
+ return chunks[1] as PublicKey;
371
+ }
372
+ }
373
+ return undefined;
374
+ }
375
+
376
+ #computeSignature(): Signature | undefined {
377
+ if (this.#inputSignature) {
378
+ return this.#inputSignature as Signature;
379
+ }
380
+ if (this.#inputInput) {
381
+ const chunks = this.#getInputChunks();
382
+ if (chunks && chunks.length >= 1) {
383
+ return chunks[0] as Signature;
384
+ }
385
+ }
386
+ return undefined;
387
+ }
388
+
389
+ #computeOutput(): Script | undefined {
390
+ if (this.#inputOutput) {
391
+ return this.#inputOutput as Script;
392
+ }
393
+ const h = this.hash;
394
+ if (!h) return undefined;
75
395
 
76
- lazy.prop(o, 'output', () => {
77
- if (!o.hash) return;
78
396
  return bscript.compile([
79
397
  OPS.OP_DUP,
80
398
  OPS.OP_HASH160,
81
- o.hash,
399
+ h,
82
400
  OPS.OP_EQUALVERIFY,
83
401
  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);
402
+ ]) as Script;
403
+ }
404
+
405
+ #computeInput(): Script | undefined {
406
+ if (this.#inputInput) {
407
+ return this.#inputInput as Script;
408
+ }
409
+ if (!this.#inputPubkey || !this.#inputSignature) {
410
+ return undefined;
411
+ }
412
+
413
+ let pubKey: Uint8Array = this.#inputPubkey;
414
+ if (this.#useHybrid || this.#useUncompressed) {
415
+ const decompressed = decompressPublicKey(this.#inputPubkey as PublicKey);
104
416
  if (decompressed) {
105
- if (a.useUncompressed) {
417
+ if (this.#useUncompressed) {
106
418
  pubKey = decompressed.uncompressed;
107
419
  } else {
108
420
  pubKey = decompressed.hybrid;
@@ -110,77 +422,87 @@ export function p2pkh(a: Omit<P2PKHPayment, 'name'>, opts?: PaymentOpts): P2PKHP
110
422
  }
111
423
  }
112
424
 
113
- return bscript.compile([a.signature, pubKey]);
114
- });
425
+ return bscript.compile([this.#inputSignature, pubKey]) as Script;
426
+ }
427
+
428
+ #computeWitness(): Uint8Array[] | undefined {
429
+ if (this.input) {
430
+ return [];
431
+ }
432
+ return undefined;
433
+ }
115
434
 
116
- lazy.prop(o, 'witness', () => {
117
- if (!o.input) return;
118
- return [];
119
- });
435
+ // Validation
120
436
 
121
- // extended validation
122
- if (opts.validate) {
123
- let hash: Buffer = Buffer.from([]);
124
- if (a.address) {
125
- if (_address().version !== network.pubKeyHash) {
437
+ #validate(): void {
438
+ let hash: Uint8Array = new Uint8Array(0);
439
+
440
+ if (this.#inputAddress) {
441
+ const addr = this.#getDecodedAddress();
442
+ if (!addr) {
443
+ throw new TypeError('Invalid address');
444
+ }
445
+ if (addr.version !== this.#network.pubKeyHash) {
126
446
  throw new TypeError('Invalid version or Network mismatch');
127
447
  }
128
-
129
- if (_address().hash.length !== 20) {
448
+ if (addr.hash.length !== 20) {
130
449
  throw new TypeError('Invalid address');
131
450
  }
132
-
133
- hash = _address().hash;
451
+ hash = addr.hash;
134
452
  }
135
453
 
136
- if (a.hash) {
137
- if (hash.length > 0 && !hash.equals(a.hash)) {
454
+ if (this.#inputHash) {
455
+ if (hash.length > 0 && !equals(hash, this.#inputHash)) {
138
456
  throw new TypeError('Hash mismatch');
139
457
  } else {
140
- hash = a.hash;
458
+ hash = this.#inputHash;
141
459
  }
142
460
  }
143
461
 
144
- if (a.output) {
462
+ if (this.#inputOutput) {
145
463
  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
464
+ this.#inputOutput.length !== 25 ||
465
+ this.#inputOutput[0] !== OPS.OP_DUP ||
466
+ this.#inputOutput[1] !== OPS.OP_HASH160 ||
467
+ this.#inputOutput[2] !== 0x14 ||
468
+ this.#inputOutput[23] !== OPS.OP_EQUALVERIFY ||
469
+ this.#inputOutput[24] !== OPS.OP_CHECKSIG
152
470
  ) {
153
471
  throw new TypeError('Output is invalid');
154
472
  }
155
473
 
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;
474
+ const hash2 = this.#inputOutput.subarray(3, 23);
475
+ if (hash.length > 0 && !equals(hash, hash2)) {
476
+ throw new TypeError('Hash mismatch');
477
+ } else {
478
+ hash = hash2;
479
+ }
159
480
  }
160
481
 
161
- if (a.pubkey) {
162
- const pkh = bcrypto.hash160(a.pubkey);
482
+ if (this.#inputPubkey) {
483
+ const pkh = bcrypto.hash160(this.#inputPubkey);
163
484
 
164
- let badHash = hash.length > 0 && !hash.equals(pkh);
485
+ let badHash = hash.length > 0 && !equals(hash, pkh);
165
486
  if (badHash) {
166
487
  if (
167
- (a.pubkey.length === 33 && (a.pubkey[0] === 0x02 || a.pubkey[0] === 0x03)) ||
168
- (a.pubkey.length === 65 && a.pubkey[0] === 0x04)
488
+ (this.#inputPubkey.length === 33 &&
489
+ (this.#inputPubkey[0] === 0x02 || this.#inputPubkey[0] === 0x03)) ||
490
+ (this.#inputPubkey.length === 65 && this.#inputPubkey[0] === 0x04)
169
491
  ) {
170
- const uncompressed = decompressPublicKey(a.pubkey);
492
+ const uncompressed = decompressPublicKey(this.#inputPubkey as PublicKey);
171
493
  if (uncompressed) {
172
494
  const pkh2 = bcrypto.hash160(uncompressed.uncompressed);
173
495
 
174
- if (!hash.equals(pkh2)) {
496
+ if (!equals(hash, pkh2)) {
175
497
  const pkh3 = bcrypto.hash160(uncompressed.hybrid);
176
- badHash = !hash.equals(pkh3);
498
+ badHash = !equals(hash, pkh3);
177
499
 
178
500
  if (!badHash) {
179
- a.useHybrid = true;
501
+ this.#useHybrid = true;
180
502
  }
181
503
  } else {
182
504
  badHash = false;
183
- a.useUncompressed = true;
505
+ this.#useUncompressed = true;
184
506
  }
185
507
  }
186
508
  }
@@ -193,22 +515,94 @@ export function p2pkh(a: Omit<P2PKHPayment, 'name'>, opts?: PaymentOpts): P2PKHP
193
515
  }
194
516
  }
195
517
 
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))
518
+ if (this.#inputInput) {
519
+ const chunks = this.#getInputChunks();
520
+ if (!chunks || chunks.length !== 2) {
521
+ throw new TypeError('Input is invalid');
522
+ }
523
+ if (!bscript.isCanonicalScriptSignature(chunks[0] as Uint8Array)) {
200
524
  throw new TypeError('Input has invalid signature');
201
- if (!isPoint(chunks[1])) throw new TypeError('Input has invalid pubkey');
525
+ }
526
+ if (!isPoint(chunks[1])) {
527
+ throw new TypeError('Input has invalid pubkey');
528
+ }
202
529
 
203
- if (a.signature && !a.signature.equals(chunks[0] as Buffer))
530
+ if (this.#inputSignature && !equals(this.#inputSignature, chunks[0] as Uint8Array)) {
204
531
  throw new TypeError('Signature mismatch');
205
- if (a.pubkey && !a.pubkey.equals(chunks[1] as Buffer))
532
+ }
533
+ if (this.#inputPubkey && !equals(this.#inputPubkey, chunks[1] as Uint8Array)) {
206
534
  throw new TypeError('Pubkey mismatch');
535
+ }
207
536
 
208
- const pkh = bcrypto.hash160(chunks[1] as Buffer);
209
- if (hash.length > 0 && !hash.equals(pkh)) throw new TypeError('Hash mismatch (input)');
537
+ const pkh = bcrypto.hash160(chunks[1] as Uint8Array);
538
+ if (hash.length > 0 && !equals(hash, pkh)) {
539
+ throw new TypeError('Hash mismatch (input)');
540
+ }
210
541
  }
211
542
  }
212
543
 
213
- return Object.assign(o, a);
544
+ /**
545
+ * Converts to a plain P2PKHPayment object for backwards compatibility.
546
+ *
547
+ * @returns A P2PKHPayment object
548
+ */
549
+ toPayment(): P2PKHPayment {
550
+ return {
551
+ name: this.name,
552
+ network: this.network,
553
+ address: this.address,
554
+ hash: this.hash,
555
+ pubkey: this.pubkey,
556
+ signature: this.signature,
557
+ output: this.output,
558
+ input: this.input,
559
+ witness: this.witness,
560
+ };
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
+ );
605
+
606
+ // Return a merged object for backwards compatibility
607
+ return Object.assign(instance.toPayment(), a);
214
608
  }