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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  2. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  3. package/benchmark/signing.bench.ts +147 -0
  4. package/browser/address.d.ts +56 -9
  5. package/browser/address.d.ts.map +1 -0
  6. package/browser/bech32utils.d.ts +9 -1
  7. package/browser/bech32utils.d.ts.map +1 -0
  8. package/browser/bip66.d.ts +11 -6
  9. package/browser/bip66.d.ts.map +1 -0
  10. package/browser/block.d.ts +117 -11
  11. package/browser/block.d.ts.map +1 -0
  12. package/browser/branded.d.ts +20 -0
  13. package/browser/branded.d.ts.map +1 -0
  14. package/browser/crypto/crypto.d.ts +1 -0
  15. package/browser/crypto/crypto.d.ts.map +1 -0
  16. package/browser/crypto.d.ts +46 -7
  17. package/browser/crypto.d.ts.map +1 -0
  18. package/browser/ecc/context.d.ts +129 -0
  19. package/browser/ecc/context.d.ts.map +1 -0
  20. package/browser/ecc/index.d.ts +11 -0
  21. package/browser/ecc/index.d.ts.map +1 -0
  22. package/browser/ecc/types.d.ts +128 -0
  23. package/browser/ecc/types.d.ts.map +1 -0
  24. package/browser/ecpair.d.ts +99 -0
  25. package/browser/errors.d.ts +124 -0
  26. package/browser/errors.d.ts.map +1 -0
  27. package/browser/index.d.ts +32 -5
  28. package/browser/index.d.ts.map +1 -0
  29. package/browser/index.js +12482 -101
  30. package/browser/io/BinaryReader.d.ts +276 -0
  31. package/browser/io/BinaryReader.d.ts.map +1 -0
  32. package/browser/io/BinaryWriter.d.ts +391 -0
  33. package/browser/io/BinaryWriter.d.ts.map +1 -0
  34. package/browser/io/MemoryPool.d.ts +220 -0
  35. package/browser/io/MemoryPool.d.ts.map +1 -0
  36. package/browser/io/base64.d.ts +13 -0
  37. package/browser/io/base64.d.ts.map +1 -0
  38. package/browser/io/hex.d.ts +67 -0
  39. package/browser/io/hex.d.ts.map +1 -0
  40. package/browser/io/index.d.ts +17 -0
  41. package/browser/io/index.d.ts.map +1 -0
  42. package/browser/io/utils.d.ts +199 -0
  43. package/browser/io/utils.d.ts.map +1 -0
  44. package/browser/merkle.d.ts +10 -1
  45. package/browser/merkle.d.ts.map +1 -0
  46. package/browser/networks.d.ts +70 -9
  47. package/browser/networks.d.ts.map +1 -0
  48. package/browser/opcodes.d.ts +1 -0
  49. package/browser/opcodes.d.ts.map +1 -0
  50. package/browser/payments/bip341.d.ts +35 -9
  51. package/browser/payments/bip341.d.ts.map +1 -0
  52. package/browser/payments/embed.d.ts +112 -1
  53. package/browser/payments/embed.d.ts.map +1 -0
  54. package/browser/payments/index.d.ts +17 -10
  55. package/browser/payments/index.d.ts.map +1 -0
  56. package/browser/payments/p2ms.d.ts +150 -0
  57. package/browser/payments/p2ms.d.ts.map +1 -0
  58. package/browser/payments/p2op.d.ts +150 -24
  59. package/browser/payments/p2op.d.ts.map +1 -0
  60. package/browser/payments/p2pk.d.ts +154 -1
  61. package/browser/payments/p2pk.d.ts.map +1 -0
  62. package/browser/payments/p2pkh.d.ts +176 -1
  63. package/browser/payments/p2pkh.d.ts.map +1 -0
  64. package/browser/payments/p2sh.d.ts +150 -1
  65. package/browser/payments/p2sh.d.ts.map +1 -0
  66. package/browser/payments/p2tr.d.ts +185 -1
  67. package/browser/payments/p2tr.d.ts.map +1 -0
  68. package/browser/payments/p2wpkh.d.ts +161 -1
  69. package/browser/payments/p2wpkh.d.ts.map +1 -0
  70. package/browser/payments/p2wsh.d.ts +146 -1
  71. package/browser/payments/p2wsh.d.ts.map +1 -0
  72. package/browser/payments/types.d.ts +94 -64
  73. package/browser/payments/types.d.ts.map +1 -0
  74. package/browser/psbt/bip371.d.ts +34 -8
  75. package/browser/psbt/bip371.d.ts.map +1 -0
  76. package/browser/psbt/psbtutils.d.ts +56 -16
  77. package/browser/psbt/psbtutils.d.ts.map +1 -0
  78. package/browser/psbt/types.d.ts +245 -0
  79. package/browser/psbt/types.d.ts.map +1 -0
  80. package/browser/psbt/utils.d.ts +64 -0
  81. package/browser/psbt/utils.d.ts.map +1 -0
  82. package/browser/psbt/validation.d.ts +84 -0
  83. package/browser/psbt/validation.d.ts.map +1 -0
  84. package/browser/psbt.d.ts +82 -118
  85. package/browser/psbt.d.ts.map +1 -0
  86. package/browser/pubkey.d.ts +27 -6
  87. package/browser/pubkey.d.ts.map +1 -0
  88. package/browser/push_data.d.ts +24 -2
  89. package/browser/push_data.d.ts.map +1 -0
  90. package/browser/script.d.ts +33 -8
  91. package/browser/script.d.ts.map +1 -0
  92. package/browser/script_number.d.ts +17 -0
  93. package/browser/script_number.d.ts.map +1 -0
  94. package/browser/script_signature.d.ts +23 -5
  95. package/browser/script_signature.d.ts.map +1 -0
  96. package/browser/transaction.d.ts +160 -18
  97. package/browser/transaction.d.ts.map +1 -0
  98. package/browser/types.d.ts +36 -38
  99. package/browser/types.d.ts.map +1 -0
  100. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  101. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  103. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  104. package/browser/workers/ecc-bundle.d.ts +25 -0
  105. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  106. package/browser/workers/index.d.ts +91 -0
  107. package/browser/workers/index.d.ts.map +1 -0
  108. package/browser/workers/psbt-parallel.d.ts +88 -0
  109. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  110. package/browser/workers/signing-worker.d.ts +37 -0
  111. package/browser/workers/signing-worker.d.ts.map +1 -0
  112. package/browser/workers/types.d.ts +365 -0
  113. package/browser/workers/types.d.ts.map +1 -0
  114. package/build/address.d.ts +57 -10
  115. package/build/address.d.ts.map +1 -0
  116. package/build/address.js +80 -24
  117. package/build/address.js.map +1 -0
  118. package/build/bech32utils.d.ts +9 -1
  119. package/build/bech32utils.d.ts.map +1 -0
  120. package/build/bech32utils.js +10 -2
  121. package/build/bech32utils.js.map +1 -0
  122. package/build/bip66.d.ts +11 -6
  123. package/build/bip66.d.ts.map +1 -0
  124. package/build/bip66.js +32 -3
  125. package/build/bip66.js.map +1 -0
  126. package/build/block.d.ts +117 -11
  127. package/build/block.d.ts.map +1 -0
  128. package/build/block.js +204 -72
  129. package/build/block.js.map +1 -0
  130. package/build/branded.d.ts +20 -0
  131. package/build/branded.d.ts.map +1 -0
  132. package/build/branded.js +7 -0
  133. package/build/branded.js.map +1 -0
  134. package/build/crypto/crypto.d.ts +1 -0
  135. package/build/crypto/crypto.d.ts.map +1 -0
  136. package/build/crypto/crypto.js +1 -0
  137. package/build/crypto/crypto.js.map +1 -0
  138. package/build/crypto.d.ts +46 -7
  139. package/build/crypto.d.ts.map +1 -0
  140. package/build/crypto.js +65 -20
  141. package/build/crypto.js.map +1 -0
  142. package/build/ecc/context.d.ts +135 -0
  143. package/build/ecc/context.d.ts.map +1 -0
  144. package/build/ecc/context.js +232 -0
  145. package/build/ecc/context.js.map +1 -0
  146. package/build/ecc/index.d.ts +11 -0
  147. package/build/ecc/index.d.ts.map +1 -0
  148. package/build/ecc/index.js +11 -0
  149. package/build/ecc/index.js.map +1 -0
  150. package/build/ecc/types.d.ts +134 -0
  151. package/build/ecc/types.d.ts.map +1 -0
  152. package/build/ecc/types.js +8 -0
  153. package/build/ecc/types.js.map +1 -0
  154. package/build/errors.d.ts +124 -0
  155. package/build/errors.d.ts.map +1 -0
  156. package/build/errors.js +155 -0
  157. package/build/errors.js.map +1 -0
  158. package/build/index.d.ts +32 -5
  159. package/build/index.d.ts.map +1 -0
  160. package/build/index.js +26 -3
  161. package/build/index.js.map +1 -0
  162. package/build/io/BinaryReader.d.ts +276 -0
  163. package/build/io/BinaryReader.d.ts.map +1 -0
  164. package/build/io/BinaryReader.js +425 -0
  165. package/build/io/BinaryReader.js.map +1 -0
  166. package/build/io/BinaryWriter.d.ts +391 -0
  167. package/build/io/BinaryWriter.d.ts.map +1 -0
  168. package/build/io/BinaryWriter.js +611 -0
  169. package/build/io/BinaryWriter.js.map +1 -0
  170. package/build/io/MemoryPool.d.ts +220 -0
  171. package/build/io/MemoryPool.d.ts.map +1 -0
  172. package/build/io/MemoryPool.js +309 -0
  173. package/build/io/MemoryPool.js.map +1 -0
  174. package/build/io/base64.d.ts +13 -0
  175. package/build/io/base64.d.ts.map +1 -0
  176. package/build/io/base64.js +20 -0
  177. package/build/io/base64.js.map +1 -0
  178. package/build/io/hex.d.ts +67 -0
  179. package/build/io/hex.d.ts.map +1 -0
  180. package/build/io/hex.js +138 -0
  181. package/build/io/hex.js.map +1 -0
  182. package/build/io/index.d.ts +17 -0
  183. package/build/io/index.d.ts.map +1 -0
  184. package/build/io/index.js +23 -0
  185. package/build/io/index.js.map +1 -0
  186. package/build/io/utils.d.ts +199 -0
  187. package/build/io/utils.d.ts.map +1 -0
  188. package/build/io/utils.js +271 -0
  189. package/build/io/utils.js.map +1 -0
  190. package/build/merkle.d.ts +10 -1
  191. package/build/merkle.d.ts.map +1 -0
  192. package/build/merkle.js +12 -1
  193. package/build/merkle.js.map +1 -0
  194. package/build/networks.d.ts +70 -9
  195. package/build/networks.d.ts.map +1 -0
  196. package/build/networks.js +90 -4
  197. package/build/networks.js.map +1 -0
  198. package/build/opcodes.d.ts +1 -0
  199. package/build/opcodes.d.ts.map +1 -0
  200. package/build/opcodes.js +1 -0
  201. package/build/opcodes.js.map +1 -0
  202. package/build/payments/bip341.d.ts +36 -9
  203. package/build/payments/bip341.d.ts.map +1 -0
  204. package/build/payments/bip341.js +35 -15
  205. package/build/payments/bip341.js.map +1 -0
  206. package/build/payments/embed.d.ts +120 -1
  207. package/build/payments/embed.d.ts.map +1 -0
  208. package/build/payments/embed.js +215 -34
  209. package/build/payments/embed.js.map +1 -0
  210. package/build/payments/index.d.ts +17 -10
  211. package/build/payments/index.d.ts.map +1 -0
  212. package/build/payments/index.js +20 -10
  213. package/build/payments/index.js.map +1 -0
  214. package/build/payments/p2ms.d.ts +159 -1
  215. package/build/payments/p2ms.d.ts.map +1 -0
  216. package/build/payments/p2ms.js +427 -108
  217. package/build/payments/p2ms.js.map +1 -0
  218. package/build/payments/p2op.d.ts +158 -24
  219. package/build/payments/p2op.d.ts.map +1 -0
  220. package/build/payments/p2op.js +379 -93
  221. package/build/payments/p2op.js.map +1 -0
  222. package/build/payments/p2pk.d.ts +162 -1
  223. package/build/payments/p2pk.d.ts.map +1 -0
  224. package/build/payments/p2pk.js +327 -58
  225. package/build/payments/p2pk.js.map +1 -0
  226. package/build/payments/p2pkh.d.ts +185 -1
  227. package/build/payments/p2pkh.d.ts.map +1 -0
  228. package/build/payments/p2pkh.js +467 -114
  229. package/build/payments/p2pkh.js.map +1 -0
  230. package/build/payments/p2sh.d.ts +159 -1
  231. package/build/payments/p2sh.d.ts.map +1 -0
  232. package/build/payments/p2sh.js +500 -152
  233. package/build/payments/p2sh.js.map +1 -0
  234. package/build/payments/p2tr.d.ts +193 -1
  235. package/build/payments/p2tr.d.ts.map +1 -0
  236. package/build/payments/p2tr.js +592 -174
  237. package/build/payments/p2tr.js.map +1 -0
  238. package/build/payments/p2wpkh.d.ts +170 -1
  239. package/build/payments/p2wpkh.d.ts.map +1 -0
  240. package/build/payments/p2wpkh.js +429 -104
  241. package/build/payments/p2wpkh.js.map +1 -0
  242. package/build/payments/p2wsh.d.ts +155 -1
  243. package/build/payments/p2wsh.d.ts.map +1 -0
  244. package/build/payments/p2wsh.js +466 -144
  245. package/build/payments/p2wsh.js.map +1 -0
  246. package/build/payments/types.d.ts +98 -64
  247. package/build/payments/types.d.ts.map +1 -0
  248. package/build/payments/types.js +17 -13
  249. package/build/payments/types.js.map +1 -0
  250. package/build/psbt/bip371.d.ts +35 -9
  251. package/build/psbt/bip371.d.ts.map +1 -0
  252. package/build/psbt/bip371.js +113 -28
  253. package/build/psbt/bip371.js.map +1 -0
  254. package/build/psbt/psbtutils.d.ts +56 -16
  255. package/build/psbt/psbtutils.d.ts.map +1 -0
  256. package/build/psbt/psbtutils.js +71 -16
  257. package/build/psbt/psbtutils.js.map +1 -0
  258. package/build/psbt/types.d.ts +249 -0
  259. package/build/psbt/types.d.ts.map +1 -0
  260. package/build/psbt/types.js +6 -0
  261. package/build/psbt/types.js.map +1 -0
  262. package/build/psbt/utils.d.ts +68 -0
  263. package/build/psbt/utils.d.ts.map +1 -0
  264. package/build/psbt/utils.js +171 -0
  265. package/build/psbt/utils.js.map +1 -0
  266. package/build/psbt/validation.d.ts +88 -0
  267. package/build/psbt/validation.d.ts.map +1 -0
  268. package/build/psbt/validation.js +149 -0
  269. package/build/psbt/validation.js.map +1 -0
  270. package/build/psbt.d.ts +84 -120
  271. package/build/psbt.d.ts.map +1 -0
  272. package/build/psbt.js +411 -412
  273. package/build/psbt.js.map +1 -0
  274. package/build/pubkey.d.ts +27 -6
  275. package/build/pubkey.d.ts.map +1 -0
  276. package/build/pubkey.js +36 -12
  277. package/build/pubkey.js.map +1 -0
  278. package/build/push_data.d.ts +24 -2
  279. package/build/push_data.d.ts.map +1 -0
  280. package/build/push_data.js +44 -12
  281. package/build/push_data.js.map +1 -0
  282. package/build/script.d.ts +33 -8
  283. package/build/script.d.ts.map +1 -0
  284. package/build/script.js +100 -36
  285. package/build/script.js.map +1 -0
  286. package/build/script_number.d.ts +17 -0
  287. package/build/script_number.d.ts.map +1 -0
  288. package/build/script_number.js +19 -0
  289. package/build/script_number.js.map +1 -0
  290. package/build/script_signature.d.ts +23 -5
  291. package/build/script_signature.d.ts.map +1 -0
  292. package/build/script_signature.js +48 -15
  293. package/build/script_signature.js.map +1 -0
  294. package/build/transaction.d.ts +160 -18
  295. package/build/transaction.d.ts.map +1 -0
  296. package/build/transaction.js +443 -176
  297. package/build/transaction.js.map +1 -0
  298. package/build/tsconfig.build.tsbuildinfo +1 -0
  299. package/build/types.d.ts +36 -38
  300. package/build/types.d.ts.map +1 -0
  301. package/build/types.js +175 -57
  302. package/build/types.js.map +1 -0
  303. package/build/workers/WorkerSigningPool.d.ts +174 -0
  304. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  305. package/build/workers/WorkerSigningPool.js +553 -0
  306. package/build/workers/WorkerSigningPool.js.map +1 -0
  307. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  308. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.js +753 -0
  310. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  311. package/build/workers/ecc-bundle.d.ts +25 -0
  312. package/build/workers/ecc-bundle.d.ts.map +1 -0
  313. package/build/workers/ecc-bundle.js +25 -0
  314. package/build/workers/ecc-bundle.js.map +1 -0
  315. package/build/workers/index.d.ts +91 -0
  316. package/build/workers/index.d.ts.map +1 -0
  317. package/build/workers/index.js +114 -0
  318. package/build/workers/index.js.map +1 -0
  319. package/build/workers/psbt-parallel.d.ts +117 -0
  320. package/build/workers/psbt-parallel.d.ts.map +1 -0
  321. package/build/workers/psbt-parallel.js +233 -0
  322. package/build/workers/psbt-parallel.js.map +1 -0
  323. package/build/workers/signing-worker.d.ts +37 -0
  324. package/build/workers/signing-worker.d.ts.map +1 -0
  325. package/build/workers/signing-worker.js +350 -0
  326. package/build/workers/signing-worker.js.map +1 -0
  327. package/build/workers/types.d.ts +365 -0
  328. package/build/workers/types.d.ts.map +1 -0
  329. package/build/workers/types.js +60 -0
  330. package/build/workers/types.js.map +1 -0
  331. package/package.json +66 -8
  332. package/scripts/bundle-ecc.ts +111 -0
  333. package/src/address.ts +81 -44
  334. package/src/bech32utils.ts +3 -3
  335. package/src/bip66.ts +34 -24
  336. package/src/block.ts +196 -84
  337. package/src/branded.ts +18 -0
  338. package/src/crypto.ts +64 -26
  339. package/src/ecc/context.ts +277 -0
  340. package/src/ecc/index.ts +14 -0
  341. package/src/ecc/types.ts +154 -0
  342. package/src/ecpair.d.ts +99 -0
  343. package/src/errors.ts +163 -0
  344. package/src/index.ts +113 -9
  345. package/src/io/BinaryReader.ts +461 -0
  346. package/src/io/BinaryWriter.ts +696 -0
  347. package/src/io/MemoryPool.ts +343 -0
  348. package/src/io/base64.ts +20 -0
  349. package/src/io/hex.ts +155 -0
  350. package/src/io/index.ts +41 -0
  351. package/src/io/utils.ts +283 -0
  352. package/src/merkle.ts +14 -9
  353. package/src/networks.ts +9 -9
  354. package/src/payments/bip341.ts +34 -33
  355. package/src/payments/embed.ts +244 -41
  356. package/src/payments/index.ts +12 -10
  357. package/src/payments/p2ms.ts +490 -118
  358. package/src/payments/p2op.ts +431 -133
  359. package/src/payments/p2pk.ts +370 -72
  360. package/src/payments/p2pkh.ts +524 -130
  361. package/src/payments/p2sh.ts +572 -172
  362. package/src/payments/p2tr.ts +686 -194
  363. package/src/payments/p2wpkh.ts +484 -107
  364. package/src/payments/p2wsh.ts +526 -164
  365. package/src/payments/types.ts +80 -66
  366. package/src/psbt/bip371.ts +68 -51
  367. package/src/psbt/psbtutils.ts +39 -40
  368. package/src/psbt/types.ts +331 -0
  369. package/src/psbt/utils.ts +188 -0
  370. package/src/psbt/validation.ts +192 -0
  371. package/src/psbt.ts +566 -809
  372. package/src/pubkey.ts +22 -23
  373. package/src/push_data.ts +18 -16
  374. package/src/script.ts +82 -64
  375. package/src/script_number.ts +6 -6
  376. package/src/script_signature.ts +33 -36
  377. package/src/transaction.ts +458 -238
  378. package/src/types.ts +231 -100
  379. package/src/workers/WorkerSigningPool.node.ts +887 -0
  380. package/src/workers/WorkerSigningPool.ts +670 -0
  381. package/src/workers/ecc-bundle.ts +26 -0
  382. package/src/workers/index.ts +165 -0
  383. package/src/workers/psbt-parallel.ts +332 -0
  384. package/src/workers/signing-worker.ts +353 -0
  385. package/src/workers/types.ts +413 -0
  386. package/test/address.spec.ts +9 -6
  387. package/test/bitcoin.core.spec.ts +16 -17
  388. package/test/block.spec.ts +8 -7
  389. package/test/bufferutils.spec.ts +228 -214
  390. package/test/crypto.spec.ts +19 -11
  391. package/test/fixtures/p2pk.json +0 -8
  392. package/test/fixtures/p2pkh.json +1 -1
  393. package/test/fixtures/p2sh.json +1 -1
  394. package/test/fixtures/script.json +1 -1
  395. package/test/fixtures/transaction.json +2 -2
  396. package/test/integration/_regtest.ts +25 -0
  397. package/test/integration/addresses.spec.ts +4 -3
  398. package/test/integration/bip32.spec.ts +2 -1
  399. package/test/integration/blocks.spec.ts +1 -1
  400. package/test/integration/cltv.spec.ts +18 -16
  401. package/test/integration/csv.spec.ts +37 -64
  402. package/test/integration/payments.spec.ts +5 -3
  403. package/test/integration/taproot.spec.ts +76 -83
  404. package/test/integration/transactions.spec.ts +38 -35
  405. package/test/payments.spec.ts +35 -13
  406. package/test/payments.utils.ts +17 -16
  407. package/test/psbt.spec.ts +111 -100
  408. package/test/script.spec.ts +11 -10
  409. package/test/script_signature.spec.ts +9 -11
  410. package/test/taproot-cache.spec.ts +694 -0
  411. package/test/transaction.spec.ts +32 -40
  412. package/test/types.spec.ts +74 -29
  413. package/test/workers-pool.spec.ts +963 -0
  414. package/test/workers-signing.spec.ts +635 -0
  415. package/test/workers.spec.ts +1390 -0
  416. package/tsconfig.base.json +34 -18
  417. package/tsconfig.browser.json +15 -0
  418. package/tsconfig.build.json +5 -0
  419. package/tsconfig.json +5 -14
  420. package/vite.config.browser.ts +3 -42
  421. package/vitest.config.integration.ts +2 -0
  422. package/browser/bufferutils.d.ts +0 -34
  423. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  424. package/browser/chunks/payments-B1wlSccx.js +0 -1089
  425. package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
  426. package/browser/chunks/script-DyPItFEl.js +0 -318
  427. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  428. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  429. package/browser/ecc_lib.d.ts +0 -3
  430. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  431. package/browser/hooks/HookedSigner.d.ts +0 -4
  432. package/browser/hooks/SignatureManager.d.ts +0 -13
  433. package/browser/payments/lazy.d.ts +0 -2
  434. package/browser/typeforce.d.ts +0 -38
  435. package/build/bufferutils.d.ts +0 -34
  436. package/build/bufferutils.js +0 -141
  437. package/build/ecc_lib.d.ts +0 -3
  438. package/build/ecc_lib.js +0 -61
  439. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  440. package/build/hooks/AdvancedSignatureManager.js +0 -52
  441. package/build/hooks/HookedSigner.d.ts +0 -4
  442. package/build/hooks/HookedSigner.js +0 -64
  443. package/build/hooks/SignatureManager.d.ts +0 -13
  444. package/build/hooks/SignatureManager.js +0 -45
  445. package/build/payments/lazy.d.ts +0 -2
  446. package/build/payments/lazy.js +0 -28
  447. package/build/tsconfig.tsbuildinfo +0 -1
  448. package/src/bufferutils.ts +0 -188
  449. package/src/ecc_lib.ts +0 -94
  450. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  451. package/src/hooks/HookedSigner.ts +0 -108
  452. package/src/hooks/SignatureManager.ts +0 -84
  453. package/src/payments/lazy.ts +0 -28
  454. package/src/typeforce.d.ts +0 -38
  455. package/tsconfig.webpack.json +0 -18
@@ -1,77 +1,387 @@
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
+ #getDecodedAddress() {
295
+ if (!this.#decodedAddressComputed) {
296
+ if (this.#inputAddress) {
297
+ const decoded = fromBech32(this.#inputAddress);
298
+ if (decoded) {
299
+ this.#decodedAddress = {
300
+ version: decoded.version,
301
+ prefix: decoded.prefix,
302
+ data: decoded.data,
303
+ };
304
+ }
305
+ }
306
+ this.#decodedAddressComputed = true;
307
+ }
308
+ return this.#decodedAddress;
309
+ }
310
+ #getWitnessWithoutAnnex() {
311
+ if (!this.#witnessWithoutAnnexComputed) {
312
+ if (this.#inputWitness && this.#inputWitness.length > 0) {
313
+ // Remove annex if present
314
+ if (this.#inputWitness.length >= 2 &&
315
+ this.#inputWitness[this.#inputWitness.length - 1][0] === ANNEX_PREFIX) {
316
+ this.#witnessWithoutAnnex = this.#inputWitness.slice(0, -1);
317
+ }
318
+ else {
319
+ this.#witnessWithoutAnnex = this.#inputWitness.slice();
320
+ }
321
+ }
322
+ this.#witnessWithoutAnnexComputed = true;
323
+ }
324
+ return this.#witnessWithoutAnnex;
325
+ }
326
+ #getHashTree() {
327
+ if (!this.#hashTreeComputed) {
328
+ if (this.#inputScriptTree) {
329
+ this.#hashTree = toHashTree(this.#inputScriptTree);
330
+ }
331
+ else if (this.#inputHash) {
332
+ this.#hashTree = { hash: this.#inputHash };
333
+ }
334
+ this.#hashTreeComputed = true;
335
+ }
336
+ return this.#hashTree;
337
+ }
338
+ // Private computation methods
339
+ #computeAddress() {
340
+ if (this.#inputAddress) {
341
+ return this.#inputAddress;
342
+ }
343
+ const pk = this.pubkey;
344
+ if (!pk)
345
+ return undefined;
346
+ const words = bech32m.toWords(pk);
67
347
  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)
348
+ return bech32m.encode(this.#network.bech32, words);
349
+ }
350
+ #computePubkey() {
351
+ if (this.#inputPubkey) {
352
+ return this.#inputPubkey;
353
+ }
354
+ if (this.#inputOutput) {
355
+ return this.#inputOutput.subarray(2);
356
+ }
357
+ if (this.#inputAddress) {
358
+ return this.#getDecodedAddress()?.data;
359
+ }
360
+ const internalPk = this.internalPubkey;
361
+ if (internalPk) {
362
+ const tweakedKey = tweakKey(internalPk, this.hash);
363
+ if (tweakedKey) {
364
+ return tweakedKey.x;
365
+ }
366
+ }
367
+ return undefined;
368
+ }
369
+ #computeInternalPubkey() {
370
+ if (this.#inputInternalPubkey) {
371
+ return this.#inputInternalPubkey;
372
+ }
373
+ const witness = this.#getWitnessWithoutAnnex();
374
+ if (witness && witness.length > 1) {
375
+ return witness[witness.length - 1].subarray(1, 33);
376
+ }
377
+ return undefined;
378
+ }
379
+ #computeHash() {
380
+ const hashTree = this.#getHashTree();
381
+ if (hashTree) {
73
382
  return hashTree.hash;
74
- const w = _witness();
383
+ }
384
+ const w = this.#getWitnessWithoutAnnex();
75
385
  if (w && w.length > 1) {
76
386
  const controlBlock = w[w.length - 1];
77
387
  const leafVersion = controlBlock[0] & TAPLEAF_VERSION_MASK;
@@ -83,176 +393,284 @@ export function p2tr(a, opts) {
83
393
  return rootHashFromPath(controlBlock, leafHash);
84
394
  }
85
395
  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;
396
+ }
397
+ #computeSignature() {
398
+ if (this.#inputSignature) {
399
+ return this.#inputSignature;
400
+ }
401
+ const witness = this.#getWitnessWithoutAnnex();
402
+ if (witness && witness.length === 1) {
403
+ return witness[0];
404
+ }
405
+ return undefined;
406
+ }
407
+ #computeOutput() {
408
+ if (this.#inputOutput) {
409
+ return this.#inputOutput;
410
+ }
411
+ const pk = this.pubkey;
412
+ if (!pk)
413
+ return undefined;
414
+ return bscript.compile([OPS.OP_1, pk]);
415
+ }
416
+ #computeRedeem() {
417
+ if (this.#inputRedeem) {
418
+ return this.#inputRedeem;
419
+ }
420
+ const witness = this.#getWitnessWithoutAnnex();
421
+ if (!witness || witness.length < 2) {
422
+ return undefined;
97
423
  }
98
- return LEAF_VERSION_TAPSCRIPT;
99
- });
100
- lazy.prop(o, 'redeem', () => {
101
- const witness = _witness();
102
- if (!witness || witness.length < 2)
103
- return;
104
424
  return {
105
425
  output: witness[witness.length - 2],
106
426
  witness: witness.slice(0, -2),
107
427
  redeemVersion: witness[witness.length - 1][0] & TAPLEAF_VERSION_MASK,
108
428
  };
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;
429
+ }
430
+ #computeRedeemVersion() {
431
+ if (this.#inputRedeemVersion !== undefined) {
432
+ return this.#inputRedeemVersion;
121
433
  }
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) {
434
+ if (this.#inputRedeem &&
435
+ this.#inputRedeem.redeemVersion !== undefined &&
436
+ this.#inputRedeem.redeemVersion !== null) {
437
+ return this.#inputRedeem.redeemVersion;
438
+ }
439
+ return LEAF_VERSION_TAPSCRIPT;
440
+ }
441
+ #computeWitness() {
442
+ if (this.#inputWitness) {
443
+ return this.#inputWitness;
444
+ }
445
+ const hashTree = this.#getHashTree();
446
+ if (hashTree && this.#inputRedeem?.output && this.#inputInternalPubkey) {
143
447
  const leafHash = tapleafHash({
144
- output: a.redeem.output,
145
- version: o.redeemVersion,
448
+ output: this.#inputRedeem.output,
449
+ version: this.redeemVersion,
146
450
  });
147
451
  const path = findScriptPath(hashTree, leafHash);
148
452
  if (!path)
149
- return;
150
- const outputKey = tweakKey(a.internalPubkey, hashTree.hash);
453
+ return undefined;
454
+ const outputKey = tweakKey(this.#inputInternalPubkey, hashTree.hash);
151
455
  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)
456
+ return undefined;
457
+ const version = this.redeemVersion ?? 0xc0;
458
+ const controlBlock = concat([
459
+ new Uint8Array([version | outputKey.parity]),
460
+ this.#inputInternalPubkey,
461
+ ...path,
462
+ ]);
463
+ return [this.#inputRedeem.output, controlBlock];
464
+ }
465
+ if (this.#inputSignature) {
466
+ return [this.#inputSignature];
467
+ }
468
+ return undefined;
469
+ }
470
+ // Validation
471
+ #validate() {
472
+ let pubkey = new Uint8Array(0);
473
+ if (this.#inputAddress) {
474
+ const addr = this.#getDecodedAddress();
475
+ if (!addr) {
476
+ throw new TypeError('Invalid address');
477
+ }
478
+ if (this.#network && this.#network.bech32 !== addr.prefix) {
163
479
  throw new TypeError('Invalid prefix or Network mismatch');
164
- if (_address().version !== TAPROOT_WITNESS_VERSION)
480
+ }
481
+ if (addr.version !== TAPROOT_WITNESS_VERSION) {
165
482
  throw new TypeError('Invalid address version');
166
- if (_address().data.length !== 32)
483
+ }
484
+ if (addr.data.length !== 32) {
167
485
  throw new TypeError('Invalid address data');
168
- pubkey = _address().data;
486
+ }
487
+ pubkey = addr.data;
169
488
  }
170
- if (a.pubkey) {
171
- if (pubkey.length > 0 && !pubkey.equals(a.pubkey))
489
+ if (this.#inputPubkey) {
490
+ if (pubkey.length > 0 && !equals(pubkey, this.#inputPubkey)) {
172
491
  throw new TypeError('Pubkey mismatch');
173
- else
174
- pubkey = a.pubkey;
492
+ }
493
+ else {
494
+ pubkey = this.#inputPubkey;
495
+ }
175
496
  }
176
- if (a.output) {
177
- if (a.output.length !== 34 || a.output[0] !== OPS.OP_1 || a.output[1] !== 0x20)
497
+ if (this.#inputOutput) {
498
+ if (this.#inputOutput.length !== 34 ||
499
+ this.#inputOutput[0] !== OPS.OP_1 ||
500
+ this.#inputOutput[1] !== 0x20) {
178
501
  throw new TypeError('Output is invalid');
179
- if (pubkey.length > 0 && !pubkey.equals(a.output.subarray(2)))
502
+ }
503
+ if (pubkey.length > 0 && !equals(pubkey, this.#inputOutput.subarray(2))) {
180
504
  throw new TypeError('Pubkey mismatch');
181
- else
182
- pubkey = a.output.subarray(2);
505
+ }
506
+ else {
507
+ pubkey = this.#inputOutput.subarray(2);
508
+ }
183
509
  }
184
- if (a.internalPubkey) {
185
- const tweakedKey = tweakKey(a.internalPubkey, o.hash);
186
- if (pubkey.length > 0 && !pubkey.equals(tweakedKey.x))
510
+ if (this.#inputInternalPubkey) {
511
+ const tweakedKey = tweakKey(this.#inputInternalPubkey, this.hash);
512
+ if (!tweakedKey) {
513
+ throw new TypeError('Invalid internal pubkey');
514
+ }
515
+ if (pubkey.length > 0 && !equals(pubkey, tweakedKey.x)) {
187
516
  throw new TypeError('Pubkey mismatch');
188
- else
517
+ }
518
+ else {
189
519
  pubkey = tweakedKey.x;
520
+ }
190
521
  }
191
- const hashTree = _hashTree();
192
- if (a.hash && hashTree) {
193
- if (!a.hash.equals(hashTree.hash))
522
+ const hashTree = this.#getHashTree();
523
+ if (this.#inputHash && hashTree) {
524
+ if (!equals(this.#inputHash, hashTree.hash)) {
194
525
  throw new TypeError('Hash mismatch');
526
+ }
195
527
  }
196
- if (a.redeem && a.redeem.output && hashTree) {
528
+ if (this.#inputRedeem?.output && hashTree) {
197
529
  const leafHash = tapleafHash({
198
- output: a.redeem.output,
199
- version: o.redeemVersion,
530
+ output: this.#inputRedeem.output,
531
+ version: this.redeemVersion,
200
532
  });
201
- if (!findScriptPath(hashTree, leafHash))
533
+ if (!findScriptPath(hashTree, leafHash)) {
202
534
  throw new TypeError('Redeem script not in tree');
535
+ }
203
536
  }
204
- const witness = _witness();
205
- if (a.redeem && o.redeem) {
206
- if (a.redeem.redeemVersion) {
207
- if (a.redeem.redeemVersion !== o.redeem.redeemVersion)
537
+ const witness = this.#getWitnessWithoutAnnex();
538
+ // Compare provided redeem with computed from witness
539
+ if (this.#inputRedeem && this.redeem) {
540
+ if (this.#inputRedeem.redeemVersion) {
541
+ if (this.#inputRedeem.redeemVersion !== this.redeem.redeemVersion) {
208
542
  throw new TypeError('Redeem.redeemVersion and witness mismatch');
543
+ }
209
544
  }
210
- if (a.redeem.output) {
211
- if (bscript.decompile(a.redeem.output).length === 0)
545
+ if (this.#inputRedeem.output) {
546
+ const decompiled = bscript.decompile(this.#inputRedeem.output);
547
+ if (!decompiled || decompiled.length === 0) {
212
548
  throw new TypeError('Redeem.output is invalid');
213
- if (o.redeem.output && !a.redeem.output.equals(o.redeem.output))
549
+ }
550
+ if (this.redeem.output && !equals(this.#inputRedeem.output, this.redeem.output)) {
214
551
  throw new TypeError('Redeem.output and witness mismatch');
552
+ }
215
553
  }
216
- if (a.redeem.witness) {
217
- if (o.redeem.witness && !stacksEqual(a.redeem.witness, o.redeem.witness))
554
+ if (this.#inputRedeem.witness) {
555
+ if (this.redeem.witness &&
556
+ !stacksEqual(this.#inputRedeem.witness, this.redeem.witness)) {
218
557
  throw new TypeError('Redeem.witness and witness mismatch');
558
+ }
219
559
  }
220
560
  }
221
- if (witness && witness.length) {
561
+ if (witness && witness.length > 0) {
222
562
  if (witness.length === 1) {
223
- if (a.signature && !a.signature.equals(witness[0]))
563
+ // Key-path spending
564
+ if (this.#inputSignature && !equals(this.#inputSignature, witness[0])) {
224
565
  throw new TypeError('Signature mismatch');
566
+ }
225
567
  }
226
568
  else {
569
+ // Script-path spending
227
570
  const controlBlock = witness[witness.length - 1];
228
- if (controlBlock.length < 33)
571
+ if (controlBlock.length < 33) {
229
572
  throw new TypeError(`The control-block length is too small. Got ${controlBlock.length}, expected min 33.`);
230
- if ((controlBlock.length - 33) % 32 !== 0)
573
+ }
574
+ if ((controlBlock.length - 33) % 32 !== 0) {
231
575
  throw new TypeError(`The control-block length of ${controlBlock.length} is incorrect!`);
576
+ }
232
577
  const m = (controlBlock.length - 33) / 32;
233
- if (m > 128)
578
+ if (m > 128) {
234
579
  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))
580
+ }
581
+ const internalPk = controlBlock.subarray(1, 33);
582
+ if (this.#inputInternalPubkey && !equals(this.#inputInternalPubkey, internalPk)) {
237
583
  throw new TypeError('Internal pubkey mismatch');
238
- if (!getEccLib().isXOnlyPoint(internalPubkey))
584
+ }
585
+ if (!getEccLib().isXOnlyPoint(internalPk)) {
239
586
  throw new TypeError('Invalid internalPubkey for p2tr witness');
587
+ }
240
588
  const leafVersion = controlBlock[0] & TAPLEAF_VERSION_MASK;
241
589
  const script = witness[witness.length - 2];
242
590
  const leafHash = tapleafHash({
243
591
  output: script,
244
592
  version: leafVersion,
245
593
  });
246
- const hash = rootHashFromPath(controlBlock, leafHash);
247
- const outputKey = tweakKey(internalPubkey, hash);
248
- if (!outputKey)
594
+ const computedHash = rootHashFromPath(controlBlock, leafHash);
595
+ const outputKey = tweakKey(internalPk, computedHash);
596
+ if (!outputKey) {
249
597
  throw new TypeError('Invalid outputKey for p2tr witness');
250
- if (pubkey.length && !pubkey.equals(outputKey.x))
598
+ }
599
+ if (pubkey.length > 0 && !equals(pubkey, outputKey.x)) {
251
600
  throw new TypeError('Pubkey mismatch for p2tr witness');
252
- if (outputKey.parity !== (controlBlock[0] & 1))
601
+ }
602
+ if (outputKey.parity !== (controlBlock[0] & 1)) {
253
603
  throw new Error('Incorrect parity');
604
+ }
254
605
  }
255
606
  }
256
607
  }
257
- return Object.assign(o, a);
608
+ /**
609
+ * Converts to a plain P2TRPayment object for backwards compatibility.
610
+ *
611
+ * @returns A P2TRPayment object
612
+ */
613
+ toPayment() {
614
+ return {
615
+ name: this.name,
616
+ network: this.network,
617
+ address: this.address,
618
+ pubkey: this.pubkey,
619
+ internalPubkey: this.internalPubkey,
620
+ hash: this.hash,
621
+ scriptTree: this.#inputScriptTree,
622
+ signature: this.signature,
623
+ output: this.output,
624
+ redeem: this.redeem,
625
+ redeemVersion: this.redeemVersion,
626
+ witness: this.witness,
627
+ };
628
+ }
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);
258
675
  }
676
+ //# sourceMappingURL=p2tr.js.map