@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,77 +1,408 @@
1
+ /**
2
+ * Pay-to-Taproot (P2TR) payment class.
3
+ *
4
+ * P2TR is the Taproot output type (BIP341). It supports both key-path spending
5
+ * (single signature) and script-path spending (merkle tree of scripts).
6
+ *
7
+ * @packageDocumentation
8
+ */
1
9
  import { bech32m } from 'bech32';
2
- import { Buffer as NBuffer } from 'buffer';
3
10
  import { fromBech32 } from '../bech32utils.js';
4
- import { getEccLib } from '../ecc_lib.js';
11
+ import { getEccLib } from '../ecc/context.js';
5
12
  import { bitcoin as BITCOIN_NETWORK } from '../networks.js';
6
13
  import * as bscript from '../script.js';
7
- import { isTaptree, stacksEqual, TAPLEAF_VERSION_MASK, typeforce as typef } from '../types.js';
14
+ import { stacksEqual, TAPLEAF_VERSION_MASK, } from '../types.js';
8
15
  import { findScriptPath, LEAF_VERSION_TAPSCRIPT, rootHashFromPath, tapleafHash, toHashTree, tweakKey, } from './bip341.js';
16
+ import { concat, equals } from '../io/index.js';
9
17
  import { PaymentType } from './types.js';
10
- import * as lazy from './lazy.js';
11
18
  const OPS = bscript.opcodes;
12
19
  const TAPROOT_WITNESS_VERSION = 0x01;
13
20
  const ANNEX_PREFIX = 0x50;
14
- export function p2tr(a, opts) {
15
- if (!a.address &&
16
- !a.output &&
17
- !a.pubkey &&
18
- !a.internalPubkey &&
19
- !(a.witness && a.witness.length > 1))
20
- throw new TypeError('Not enough data');
21
- opts = Object.assign({ validate: true }, opts || {});
22
- typef({
23
- address: typef.maybe(typef.String),
24
- input: typef.maybe(typef.BufferN(0)),
25
- network: typef.maybe(typef.Object),
26
- output: typef.maybe(typef.BufferN(34)),
27
- internalPubkey: typef.maybe(typef.BufferN(32)),
28
- hash: typef.maybe(typef.BufferN(32)),
29
- pubkey: typef.maybe(typef.BufferN(32)),
30
- signature: typef.maybe(typef.anyOf(typef.BufferN(64), typef.BufferN(65))),
31
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
32
- scriptTree: typef.maybe(isTaptree),
33
- redeem: typef.maybe({
34
- output: typef.maybe(typef.Buffer),
35
- redeemVersion: typef.maybe(typef.Number),
36
- witness: typef.maybe(typef.arrayOf(typef.Buffer)),
37
- }),
38
- redeemVersion: typef.maybe(typef.Number),
39
- }, a);
40
- const _address = lazy.value(() => {
41
- return fromBech32(a.address);
42
- });
43
- const _witness = lazy.value(() => {
44
- if (!a.witness || !a.witness.length)
45
- return;
46
- if (a.witness.length >= 2 && a.witness[a.witness.length - 1][0] === ANNEX_PREFIX) {
47
- return a.witness.slice(0, -1);
48
- }
49
- return a.witness.slice();
50
- });
51
- const _hashTree = lazy.value(() => {
52
- if (a.scriptTree)
53
- return toHashTree(a.scriptTree);
54
- if (a.hash)
55
- return { hash: a.hash };
56
- return;
57
- });
58
- const network = a.network || BITCOIN_NETWORK;
59
- const o = {
60
- name: PaymentType.P2TR,
61
- network,
62
- };
63
- lazy.prop(o, 'address', () => {
64
- if (!o.pubkey)
65
- return;
66
- const words = bech32m.toWords(o.pubkey);
21
+ /**
22
+ * Pay-to-Taproot (P2TR) payment class.
23
+ *
24
+ * Creates locking scripts of the form: `OP_1 {x-only pubkey}`
25
+ *
26
+ * Key-path spending witness: `[signature]`
27
+ * Script-path spending witness: `[script inputs..., script, control block]`
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * import { P2TR } from '@btc-vision/bitcoin';
32
+ *
33
+ * // Key-path only (no scripts)
34
+ * const keyOnly = P2TR.fromInternalPubkey(internalPubkey);
35
+ * console.log(keyOnly.address); // bc1p... address
36
+ *
37
+ * // With script tree
38
+ * const withScripts = P2TR.fromInternalPubkey(internalPubkey, scriptTree);
39
+ *
40
+ * // Decode an existing output
41
+ * const decoded = P2TR.fromOutput(scriptPubKey);
42
+ * console.log(decoded.pubkey); // 32-byte x-only pubkey
43
+ * ```
44
+ */
45
+ export class P2TR {
46
+ // Static public fields
47
+ static NAME = PaymentType.P2TR;
48
+ // Private instance fields
49
+ #network;
50
+ #opts;
51
+ // Input data (provided by user)
52
+ #inputAddress;
53
+ #inputPubkey;
54
+ #inputInternalPubkey;
55
+ #inputHash;
56
+ #inputScriptTree;
57
+ #inputSignature;
58
+ #inputOutput;
59
+ #inputWitness;
60
+ #inputRedeem;
61
+ #inputRedeemVersion;
62
+ // Cached computed values
63
+ #address;
64
+ #pubkey;
65
+ #internalPubkey;
66
+ #hash;
67
+ #signature;
68
+ #output;
69
+ #redeem;
70
+ #redeemVersion;
71
+ #witness;
72
+ // Cache flags
73
+ #addressComputed = false;
74
+ #pubkeyComputed = false;
75
+ #internalPubkeyComputed = false;
76
+ #hashComputed = false;
77
+ #signatureComputed = false;
78
+ #outputComputed = false;
79
+ #redeemComputed = false;
80
+ #redeemVersionComputed = false;
81
+ #witnessComputed = false;
82
+ // Decoded address cache
83
+ #decodedAddress;
84
+ #decodedAddressComputed = false;
85
+ // Witness without annex
86
+ #witnessWithoutAnnex;
87
+ #witnessWithoutAnnexComputed = false;
88
+ // Hash tree cache
89
+ #hashTree;
90
+ #hashTreeComputed = false;
91
+ /**
92
+ * Creates a new P2TR payment instance.
93
+ *
94
+ * @param params - Payment parameters
95
+ * @param params.address - Bech32m encoded address (bc1p...)
96
+ * @param params.pubkey - x-only output pubkey (32 bytes)
97
+ * @param params.internalPubkey - x-only internal pubkey (32 bytes)
98
+ * @param params.hash - Merkle root (32 bytes, or empty for key-path only)
99
+ * @param params.scriptTree - Full script tree definition
100
+ * @param params.signature - Schnorr signature (for key-path spending)
101
+ * @param params.output - The scriptPubKey
102
+ * @param params.witness - The witness stack
103
+ * @param params.redeem - Redeem script for script-path spending
104
+ * @param params.redeemVersion - Leaf version (defaults to LEAF_VERSION_TAPSCRIPT)
105
+ * @param params.network - Network parameters (defaults to mainnet)
106
+ * @param opts - Payment options
107
+ * @param opts.validate - Whether to validate inputs (default: true)
108
+ *
109
+ * @throws {TypeError} If validation is enabled and data is invalid
110
+ */
111
+ constructor(params, opts) {
112
+ this.#network = params.network ?? BITCOIN_NETWORK;
113
+ this.#opts = {
114
+ validate: opts?.validate ?? true,
115
+ allowIncomplete: opts?.allowIncomplete ?? false,
116
+ };
117
+ // Store input data
118
+ this.#inputAddress = params.address;
119
+ this.#inputPubkey = params.pubkey;
120
+ this.#inputInternalPubkey = params.internalPubkey;
121
+ this.#inputHash = params.hash;
122
+ this.#inputScriptTree = params.scriptTree;
123
+ this.#inputSignature = params.signature;
124
+ this.#inputOutput = params.output;
125
+ this.#inputWitness = params.witness;
126
+ this.#inputRedeem = params.redeem;
127
+ this.#inputRedeemVersion = params.redeemVersion;
128
+ // Validate if requested
129
+ if (this.#opts.validate) {
130
+ this.#validate();
131
+ }
132
+ }
133
+ // Public getters
134
+ /**
135
+ * Payment type discriminant.
136
+ */
137
+ get name() {
138
+ return PaymentType.P2TR;
139
+ }
140
+ /**
141
+ * Network parameters.
142
+ */
143
+ get network() {
144
+ return this.#network;
145
+ }
146
+ /**
147
+ * Bech32m encoded address (bc1p... for mainnet).
148
+ */
149
+ get address() {
150
+ if (!this.#addressComputed) {
151
+ this.#address = this.#computeAddress();
152
+ this.#addressComputed = true;
153
+ }
154
+ return this.#address;
155
+ }
156
+ /**
157
+ * x-only output pubkey (32 bytes).
158
+ * This is the tweaked pubkey that appears in the output.
159
+ */
160
+ get pubkey() {
161
+ if (!this.#pubkeyComputed) {
162
+ this.#pubkey = this.#computePubkey();
163
+ this.#pubkeyComputed = true;
164
+ }
165
+ return this.#pubkey;
166
+ }
167
+ /**
168
+ * x-only internal pubkey (32 bytes).
169
+ * This is the untweaked pubkey before adding the merkle root tweak.
170
+ */
171
+ get internalPubkey() {
172
+ if (!this.#internalPubkeyComputed) {
173
+ this.#internalPubkey = this.#computeInternalPubkey();
174
+ this.#internalPubkeyComputed = true;
175
+ }
176
+ return this.#internalPubkey;
177
+ }
178
+ /**
179
+ * Merkle root hash (32 bytes).
180
+ * Present when a script tree is defined.
181
+ */
182
+ get hash() {
183
+ if (!this.#hashComputed) {
184
+ this.#hash = this.#computeHash();
185
+ this.#hashComputed = true;
186
+ }
187
+ return this.#hash;
188
+ }
189
+ /**
190
+ * Schnorr signature (for key-path spending).
191
+ */
192
+ get signature() {
193
+ if (!this.#signatureComputed) {
194
+ this.#signature = this.#computeSignature();
195
+ this.#signatureComputed = true;
196
+ }
197
+ return this.#signature;
198
+ }
199
+ /**
200
+ * The scriptPubKey: `OP_1 {32-byte x-only pubkey}`
201
+ */
202
+ get output() {
203
+ if (!this.#outputComputed) {
204
+ this.#output = this.#computeOutput();
205
+ this.#outputComputed = true;
206
+ }
207
+ return this.#output;
208
+ }
209
+ /**
210
+ * Redeem script information (for script-path spending).
211
+ */
212
+ get redeem() {
213
+ if (!this.#redeemComputed) {
214
+ this.#redeem = this.#computeRedeem();
215
+ this.#redeemComputed = true;
216
+ }
217
+ return this.#redeem;
218
+ }
219
+ /**
220
+ * Leaf version (defaults to LEAF_VERSION_TAPSCRIPT = 0xc0).
221
+ */
222
+ get redeemVersion() {
223
+ if (!this.#redeemVersionComputed) {
224
+ this.#redeemVersion = this.#computeRedeemVersion();
225
+ this.#redeemVersionComputed = true;
226
+ }
227
+ return this.#redeemVersion ?? LEAF_VERSION_TAPSCRIPT;
228
+ }
229
+ /**
230
+ * Witness stack.
231
+ * Key-path: `[signature]`
232
+ * Script-path: `[script inputs..., script, control block]`
233
+ */
234
+ get witness() {
235
+ if (!this.#witnessComputed) {
236
+ this.#witness = this.#computeWitness();
237
+ this.#witnessComputed = true;
238
+ }
239
+ return this.#witness;
240
+ }
241
+ // Static factory methods
242
+ /**
243
+ * Creates a P2TR payment from an internal pubkey (key-path only).
244
+ *
245
+ * @param internalPubkey - x-only internal pubkey (32 bytes)
246
+ * @param scriptTree - Optional script tree
247
+ * @param network - Network parameters (defaults to mainnet)
248
+ * @returns A new P2TR payment instance
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * // Key-path only
253
+ * const p2tr = P2TR.fromInternalPubkey(internalPubkey);
254
+ *
255
+ * // With script tree
256
+ * const withScripts = P2TR.fromInternalPubkey(internalPubkey, scriptTree);
257
+ * ```
258
+ */
259
+ static fromInternalPubkey(internalPubkey, scriptTree, network) {
260
+ return new P2TR({ internalPubkey, scriptTree, network });
261
+ }
262
+ /**
263
+ * Creates a P2TR payment from a bech32m address.
264
+ *
265
+ * @param address - Bech32m encoded address (bc1p...)
266
+ * @param network - Network parameters (defaults to mainnet)
267
+ * @returns A new P2TR payment instance
268
+ */
269
+ static fromAddress(address, network) {
270
+ return new P2TR({ address, network });
271
+ }
272
+ /**
273
+ * Creates a P2TR payment from a scriptPubKey.
274
+ *
275
+ * @param output - The scriptPubKey
276
+ * @param network - Network parameters (defaults to mainnet)
277
+ * @returns A new P2TR payment instance
278
+ */
279
+ static fromOutput(output, network) {
280
+ return new P2TR({ output, network });
281
+ }
282
+ /**
283
+ * Creates a P2TR payment from a signature (for key-path spending).
284
+ *
285
+ * @param signature - Schnorr signature
286
+ * @param internalPubkey - x-only internal pubkey
287
+ * @param network - Network parameters (defaults to mainnet)
288
+ * @returns A new P2TR payment instance
289
+ */
290
+ static fromSignature(signature, internalPubkey, network) {
291
+ return new P2TR({ signature, internalPubkey, network });
292
+ }
293
+ // Private helper methods
294
+ /**
295
+ * Converts to a plain P2TRPayment object for backwards compatibility.
296
+ *
297
+ * @returns A P2TRPayment object
298
+ */
299
+ toPayment() {
300
+ return {
301
+ name: this.name,
302
+ network: this.network,
303
+ address: this.address,
304
+ pubkey: this.pubkey,
305
+ internalPubkey: this.internalPubkey,
306
+ hash: this.hash,
307
+ scriptTree: this.#inputScriptTree,
308
+ signature: this.signature,
309
+ output: this.output,
310
+ redeem: this.redeem,
311
+ redeemVersion: this.redeemVersion,
312
+ witness: this.witness,
313
+ };
314
+ }
315
+ #getDecodedAddress() {
316
+ if (!this.#decodedAddressComputed) {
317
+ if (this.#inputAddress) {
318
+ const decoded = fromBech32(this.#inputAddress);
319
+ if (decoded) {
320
+ this.#decodedAddress = {
321
+ version: decoded.version,
322
+ prefix: decoded.prefix,
323
+ data: decoded.data,
324
+ };
325
+ }
326
+ }
327
+ this.#decodedAddressComputed = true;
328
+ }
329
+ return this.#decodedAddress;
330
+ }
331
+ #getWitnessWithoutAnnex() {
332
+ if (!this.#witnessWithoutAnnexComputed) {
333
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
334
+ // Remove annex if present
335
+ if (this.#inputWitness.length >= 2 &&
336
+ this.#inputWitness[this.#inputWitness.length - 1][0] === ANNEX_PREFIX) {
337
+ this.#witnessWithoutAnnex = this.#inputWitness.slice(0, -1);
338
+ }
339
+ else {
340
+ this.#witnessWithoutAnnex = this.#inputWitness.slice();
341
+ }
342
+ }
343
+ this.#witnessWithoutAnnexComputed = true;
344
+ }
345
+ return this.#witnessWithoutAnnex;
346
+ }
347
+ // Private computation methods
348
+ #getHashTree() {
349
+ if (!this.#hashTreeComputed) {
350
+ if (this.#inputScriptTree) {
351
+ this.#hashTree = toHashTree(this.#inputScriptTree);
352
+ }
353
+ else if (this.#inputHash) {
354
+ this.#hashTree = { hash: this.#inputHash };
355
+ }
356
+ this.#hashTreeComputed = true;
357
+ }
358
+ return this.#hashTree;
359
+ }
360
+ #computeAddress() {
361
+ if (this.#inputAddress) {
362
+ return this.#inputAddress;
363
+ }
364
+ const pk = this.pubkey;
365
+ if (!pk)
366
+ return undefined;
367
+ const words = bech32m.toWords(pk);
67
368
  words.unshift(TAPROOT_WITNESS_VERSION);
68
- return bech32m.encode(network.bech32, words);
69
- });
70
- lazy.prop(o, 'hash', () => {
71
- const hashTree = _hashTree();
72
- if (hashTree)
369
+ return bech32m.encode(this.#network.bech32, words);
370
+ }
371
+ #computePubkey() {
372
+ if (this.#inputPubkey) {
373
+ return this.#inputPubkey;
374
+ }
375
+ if (this.#inputOutput) {
376
+ return this.#inputOutput.subarray(2);
377
+ }
378
+ if (this.#inputAddress) {
379
+ return this.#getDecodedAddress()?.data;
380
+ }
381
+ const internalPk = this.internalPubkey;
382
+ if (internalPk) {
383
+ const tweakedKey = tweakKey(internalPk, this.hash);
384
+ if (tweakedKey) {
385
+ return tweakedKey.x;
386
+ }
387
+ }
388
+ return undefined;
389
+ }
390
+ #computeInternalPubkey() {
391
+ if (this.#inputInternalPubkey) {
392
+ return this.#inputInternalPubkey;
393
+ }
394
+ const witness = this.#getWitnessWithoutAnnex();
395
+ if (witness && witness.length > 1) {
396
+ return witness[witness.length - 1].subarray(1, 33);
397
+ }
398
+ return undefined;
399
+ }
400
+ #computeHash() {
401
+ const hashTree = this.#getHashTree();
402
+ if (hashTree) {
73
403
  return hashTree.hash;
74
- const w = _witness();
404
+ }
405
+ const w = this.#getWitnessWithoutAnnex();
75
406
  if (w && w.length > 1) {
76
407
  const controlBlock = w[w.length - 1];
77
408
  const leafVersion = controlBlock[0] & TAPLEAF_VERSION_MASK;
@@ -83,176 +414,263 @@ export function p2tr(a, opts) {
83
414
  return rootHashFromPath(controlBlock, leafHash);
84
415
  }
85
416
  return undefined;
86
- });
87
- lazy.prop(o, 'output', () => {
88
- if (!o.pubkey)
89
- return;
90
- return bscript.compile([OPS.OP_1, o.pubkey]);
91
- });
92
- lazy.prop(o, 'redeemVersion', () => {
93
- if (a.redeemVersion)
94
- return a.redeemVersion;
95
- if (a.redeem && a.redeem.redeemVersion !== undefined && a.redeem.redeemVersion !== null) {
96
- return a.redeem.redeemVersion;
417
+ }
418
+ #computeSignature() {
419
+ if (this.#inputSignature) {
420
+ return this.#inputSignature;
421
+ }
422
+ const witness = this.#getWitnessWithoutAnnex();
423
+ if (witness && witness.length === 1) {
424
+ return witness[0];
425
+ }
426
+ return undefined;
427
+ }
428
+ #computeOutput() {
429
+ if (this.#inputOutput) {
430
+ return this.#inputOutput;
431
+ }
432
+ const pk = this.pubkey;
433
+ if (!pk)
434
+ return undefined;
435
+ return bscript.compile([OPS.OP_1, pk]);
436
+ }
437
+ #computeRedeem() {
438
+ if (this.#inputRedeem) {
439
+ return this.#inputRedeem;
440
+ }
441
+ const witness = this.#getWitnessWithoutAnnex();
442
+ if (!witness || witness.length < 2) {
443
+ return undefined;
97
444
  }
98
- return LEAF_VERSION_TAPSCRIPT;
99
- });
100
- lazy.prop(o, 'redeem', () => {
101
- const witness = _witness();
102
- if (!witness || witness.length < 2)
103
- return;
104
445
  return {
105
446
  output: witness[witness.length - 2],
106
447
  witness: witness.slice(0, -2),
107
448
  redeemVersion: witness[witness.length - 1][0] & TAPLEAF_VERSION_MASK,
108
449
  };
109
- });
110
- lazy.prop(o, 'pubkey', () => {
111
- if (a.pubkey)
112
- return a.pubkey;
113
- if (a.output)
114
- return a.output.subarray(2);
115
- if (a.address)
116
- return _address().data;
117
- if (o.internalPubkey) {
118
- const tweakedKey = tweakKey(o.internalPubkey, o.hash);
119
- if (tweakedKey)
120
- return tweakedKey.x;
450
+ }
451
+ #computeRedeemVersion() {
452
+ if (this.#inputRedeemVersion !== undefined) {
453
+ return this.#inputRedeemVersion;
121
454
  }
122
- });
123
- lazy.prop(o, 'internalPubkey', () => {
124
- if (a.internalPubkey)
125
- return a.internalPubkey;
126
- const witness = _witness();
127
- if (witness && witness.length > 1)
128
- return witness[witness.length - 1].subarray(1, 33);
129
- });
130
- lazy.prop(o, 'signature', () => {
131
- if (a.signature)
132
- return a.signature;
133
- const witness = _witness();
134
- if (!witness || witness.length !== 1)
135
- return;
136
- return witness[0];
137
- });
138
- lazy.prop(o, 'witness', () => {
139
- if (a.witness)
140
- return a.witness;
141
- const hashTree = _hashTree();
142
- if (hashTree && a.redeem && a.redeem.output && a.internalPubkey) {
455
+ if (this.#inputRedeem &&
456
+ this.#inputRedeem.redeemVersion !== undefined &&
457
+ this.#inputRedeem.redeemVersion !== null) {
458
+ return this.#inputRedeem.redeemVersion;
459
+ }
460
+ return LEAF_VERSION_TAPSCRIPT;
461
+ }
462
+ // Validation
463
+ #computeWitness() {
464
+ if (this.#inputWitness) {
465
+ return this.#inputWitness;
466
+ }
467
+ const hashTree = this.#getHashTree();
468
+ if (hashTree && this.#inputRedeem?.output && this.#inputInternalPubkey) {
143
469
  const leafHash = tapleafHash({
144
- output: a.redeem.output,
145
- version: o.redeemVersion,
470
+ output: this.#inputRedeem.output,
471
+ version: this.redeemVersion,
146
472
  });
147
473
  const path = findScriptPath(hashTree, leafHash);
148
474
  if (!path)
149
- return;
150
- const outputKey = tweakKey(a.internalPubkey, hashTree.hash);
475
+ return undefined;
476
+ const outputKey = tweakKey(this.#inputInternalPubkey, hashTree.hash);
151
477
  if (!outputKey)
152
- return;
153
- const controlBock = NBuffer.concat([NBuffer.from([o.redeemVersion | outputKey.parity]), a.internalPubkey].concat(path));
154
- return [a.redeem.output, controlBock];
155
- }
156
- if (a.signature)
157
- return [a.signature];
158
- });
159
- if (opts.validate) {
160
- let pubkey = NBuffer.from([]);
161
- if (a.address) {
162
- if (network && network.bech32 !== _address().prefix)
478
+ return undefined;
479
+ const version = this.redeemVersion ?? 0xc0;
480
+ const controlBlock = concat([
481
+ new Uint8Array([version | outputKey.parity]),
482
+ this.#inputInternalPubkey,
483
+ ...path,
484
+ ]);
485
+ return [this.#inputRedeem.output, controlBlock];
486
+ }
487
+ if (this.#inputSignature) {
488
+ return [this.#inputSignature];
489
+ }
490
+ return undefined;
491
+ }
492
+ #validate() {
493
+ let pubkey = new Uint8Array(0);
494
+ if (this.#inputAddress) {
495
+ const addr = this.#getDecodedAddress();
496
+ if (!addr) {
497
+ throw new TypeError('Invalid address');
498
+ }
499
+ if (this.#network && this.#network.bech32 !== addr.prefix) {
163
500
  throw new TypeError('Invalid prefix or Network mismatch');
164
- if (_address().version !== TAPROOT_WITNESS_VERSION)
501
+ }
502
+ if (addr.version !== TAPROOT_WITNESS_VERSION) {
165
503
  throw new TypeError('Invalid address version');
166
- if (_address().data.length !== 32)
504
+ }
505
+ if (addr.data.length !== 32) {
167
506
  throw new TypeError('Invalid address data');
168
- pubkey = _address().data;
507
+ }
508
+ pubkey = addr.data;
169
509
  }
170
- if (a.pubkey) {
171
- if (pubkey.length > 0 && !pubkey.equals(a.pubkey))
510
+ if (this.#inputPubkey) {
511
+ if (pubkey.length > 0 && !equals(pubkey, this.#inputPubkey)) {
172
512
  throw new TypeError('Pubkey mismatch');
173
- else
174
- pubkey = a.pubkey;
513
+ }
514
+ else {
515
+ pubkey = this.#inputPubkey;
516
+ }
175
517
  }
176
- if (a.output) {
177
- if (a.output.length !== 34 || a.output[0] !== OPS.OP_1 || a.output[1] !== 0x20)
518
+ if (this.#inputOutput) {
519
+ if (this.#inputOutput.length !== 34 ||
520
+ this.#inputOutput[0] !== OPS.OP_1 ||
521
+ this.#inputOutput[1] !== 0x20) {
178
522
  throw new TypeError('Output is invalid');
179
- if (pubkey.length > 0 && !pubkey.equals(a.output.subarray(2)))
523
+ }
524
+ if (pubkey.length > 0 && !equals(pubkey, this.#inputOutput.subarray(2))) {
180
525
  throw new TypeError('Pubkey mismatch');
181
- else
182
- pubkey = a.output.subarray(2);
526
+ }
527
+ else {
528
+ pubkey = this.#inputOutput.subarray(2);
529
+ }
183
530
  }
184
- if (a.internalPubkey) {
185
- const tweakedKey = tweakKey(a.internalPubkey, o.hash);
186
- if (pubkey.length > 0 && !pubkey.equals(tweakedKey.x))
531
+ if (this.#inputInternalPubkey) {
532
+ const tweakedKey = tweakKey(this.#inputInternalPubkey, this.hash);
533
+ if (!tweakedKey) {
534
+ throw new TypeError('Invalid internal pubkey');
535
+ }
536
+ if (pubkey.length > 0 && !equals(pubkey, tweakedKey.x)) {
187
537
  throw new TypeError('Pubkey mismatch');
188
- else
538
+ }
539
+ else {
189
540
  pubkey = tweakedKey.x;
541
+ }
190
542
  }
191
- const hashTree = _hashTree();
192
- if (a.hash && hashTree) {
193
- if (!a.hash.equals(hashTree.hash))
543
+ const hashTree = this.#getHashTree();
544
+ if (this.#inputHash && hashTree) {
545
+ if (!equals(this.#inputHash, hashTree.hash)) {
194
546
  throw new TypeError('Hash mismatch');
547
+ }
195
548
  }
196
- if (a.redeem && a.redeem.output && hashTree) {
549
+ if (this.#inputRedeem?.output && hashTree) {
197
550
  const leafHash = tapleafHash({
198
- output: a.redeem.output,
199
- version: o.redeemVersion,
551
+ output: this.#inputRedeem.output,
552
+ version: this.redeemVersion,
200
553
  });
201
- if (!findScriptPath(hashTree, leafHash))
554
+ if (!findScriptPath(hashTree, leafHash)) {
202
555
  throw new TypeError('Redeem script not in tree');
556
+ }
203
557
  }
204
- const witness = _witness();
205
- if (a.redeem && o.redeem) {
206
- if (a.redeem.redeemVersion) {
207
- if (a.redeem.redeemVersion !== o.redeem.redeemVersion)
558
+ const witness = this.#getWitnessWithoutAnnex();
559
+ // Compare provided redeem with computed from witness
560
+ if (this.#inputRedeem && this.redeem) {
561
+ if (this.#inputRedeem.redeemVersion) {
562
+ if (this.#inputRedeem.redeemVersion !== this.redeem.redeemVersion) {
208
563
  throw new TypeError('Redeem.redeemVersion and witness mismatch');
564
+ }
209
565
  }
210
- if (a.redeem.output) {
211
- if (bscript.decompile(a.redeem.output).length === 0)
566
+ if (this.#inputRedeem.output) {
567
+ const decompiled = bscript.decompile(this.#inputRedeem.output);
568
+ if (!decompiled || decompiled.length === 0) {
212
569
  throw new TypeError('Redeem.output is invalid');
213
- if (o.redeem.output && !a.redeem.output.equals(o.redeem.output))
570
+ }
571
+ if (this.redeem.output && !equals(this.#inputRedeem.output, this.redeem.output)) {
214
572
  throw new TypeError('Redeem.output and witness mismatch');
573
+ }
215
574
  }
216
- if (a.redeem.witness) {
217
- if (o.redeem.witness && !stacksEqual(a.redeem.witness, o.redeem.witness))
575
+ if (this.#inputRedeem.witness) {
576
+ if (this.redeem.witness &&
577
+ !stacksEqual(this.#inputRedeem.witness, this.redeem.witness)) {
218
578
  throw new TypeError('Redeem.witness and witness mismatch');
579
+ }
219
580
  }
220
581
  }
221
- if (witness && witness.length) {
582
+ if (witness && witness.length > 0) {
222
583
  if (witness.length === 1) {
223
- if (a.signature && !a.signature.equals(witness[0]))
584
+ // Key-path spending
585
+ if (this.#inputSignature && !equals(this.#inputSignature, witness[0])) {
224
586
  throw new TypeError('Signature mismatch');
587
+ }
225
588
  }
226
589
  else {
590
+ // Script-path spending
227
591
  const controlBlock = witness[witness.length - 1];
228
- if (controlBlock.length < 33)
592
+ if (controlBlock.length < 33) {
229
593
  throw new TypeError(`The control-block length is too small. Got ${controlBlock.length}, expected min 33.`);
230
- if ((controlBlock.length - 33) % 32 !== 0)
594
+ }
595
+ if ((controlBlock.length - 33) % 32 !== 0) {
231
596
  throw new TypeError(`The control-block length of ${controlBlock.length} is incorrect!`);
597
+ }
232
598
  const m = (controlBlock.length - 33) / 32;
233
- if (m > 128)
599
+ if (m > 128) {
234
600
  throw new TypeError(`The script path is too long. Got ${m}, expected max 128.`);
235
- const internalPubkey = controlBlock.subarray(1, 33);
236
- if (a.internalPubkey && !a.internalPubkey.equals(internalPubkey))
601
+ }
602
+ const internalPk = controlBlock.subarray(1, 33);
603
+ if (this.#inputInternalPubkey && !equals(this.#inputInternalPubkey, internalPk)) {
237
604
  throw new TypeError('Internal pubkey mismatch');
238
- if (!getEccLib().isXOnlyPoint(internalPubkey))
605
+ }
606
+ if (!getEccLib().isXOnlyPoint(internalPk)) {
239
607
  throw new TypeError('Invalid internalPubkey for p2tr witness');
608
+ }
240
609
  const leafVersion = controlBlock[0] & TAPLEAF_VERSION_MASK;
241
610
  const script = witness[witness.length - 2];
242
611
  const leafHash = tapleafHash({
243
612
  output: script,
244
613
  version: leafVersion,
245
614
  });
246
- const hash = rootHashFromPath(controlBlock, leafHash);
247
- const outputKey = tweakKey(internalPubkey, hash);
248
- if (!outputKey)
615
+ const computedHash = rootHashFromPath(controlBlock, leafHash);
616
+ const outputKey = tweakKey(internalPk, computedHash);
617
+ if (!outputKey) {
249
618
  throw new TypeError('Invalid outputKey for p2tr witness');
250
- if (pubkey.length && !pubkey.equals(outputKey.x))
619
+ }
620
+ if (pubkey.length > 0 && !equals(pubkey, outputKey.x)) {
251
621
  throw new TypeError('Pubkey mismatch for p2tr witness');
252
- if (outputKey.parity !== (controlBlock[0] & 1))
622
+ }
623
+ if (outputKey.parity !== (controlBlock[0] & 1)) {
253
624
  throw new Error('Incorrect parity');
625
+ }
254
626
  }
255
627
  }
256
628
  }
257
- return Object.assign(o, a);
258
629
  }
630
+ /**
631
+ * Creates a Pay-to-Taproot (P2TR) payment object.
632
+ *
633
+ * This is the legacy factory function for backwards compatibility.
634
+ * For new code, prefer using the P2TR class directly.
635
+ *
636
+ * @param a - The payment object containing the necessary data
637
+ * @param opts - Optional payment options
638
+ * @returns The P2TR payment object
639
+ * @throws {TypeError} If the required data is not provided or if the data is invalid
640
+ *
641
+ * @example
642
+ * ```typescript
643
+ * import { p2tr } from '@btc-vision/bitcoin';
644
+ *
645
+ * // Key-path only
646
+ * const payment = p2tr({ internalPubkey });
647
+ *
648
+ * // With script tree
649
+ * const withScripts = p2tr({ internalPubkey, scriptTree });
650
+ * ```
651
+ */
652
+ export function p2tr(a, opts) {
653
+ if (!a.address &&
654
+ !a.output &&
655
+ !a.pubkey &&
656
+ !a.internalPubkey &&
657
+ !(a.witness && a.witness.length > 1)) {
658
+ throw new TypeError('Not enough data');
659
+ }
660
+ const instance = new P2TR({
661
+ address: a.address,
662
+ pubkey: a.pubkey,
663
+ internalPubkey: a.internalPubkey,
664
+ hash: a.hash,
665
+ scriptTree: a.scriptTree,
666
+ signature: a.signature,
667
+ output: a.output,
668
+ witness: a.witness,
669
+ redeem: a.redeem,
670
+ redeemVersion: a.redeemVersion,
671
+ network: a.network,
672
+ }, opts);
673
+ // Return a merged object for backwards compatibility
674
+ return Object.assign(instance.toPayment(), a);
675
+ }
676
+ //# sourceMappingURL=p2tr.js.map