@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,196 +1,494 @@
1
+ /**
2
+ * Pay-to-OPNet (P2OP) payment class.
3
+ *
4
+ * P2OP is a custom witness version 16 output type for the OPNet network.
5
+ * The witness program contains a deployment version and hash160.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
1
10
  import { bech32m } from 'bech32';
2
- import { Buffer as NBuffer } from 'buffer';
3
11
  import { fromBech32 } from '../bech32utils.js';
4
- import { bitcoin as BITCOIN_NETWORK, Network } from '../networks.js';
12
+ import { bitcoin as BITCOIN_NETWORK, type Network } from '../networks.js';
5
13
  import * as bscript from '../script.js';
6
- import { typeforce as typef } from '../types.js';
7
- import { BasePayment, P2OPPayment, PaymentOpts, PaymentType } from './types.js';
8
- import * as lazy from './lazy.js';
14
+ import { alloc, concat, equals } from '../io/index.js';
15
+ import type { Bytes20, Script } from '../types.js';
16
+ import { type P2OPPayment, type PaymentOpts, PaymentType } from './types.js';
9
17
 
10
18
  const OPS = bscript.opcodes;
11
19
  const P2OP_WITNESS_VERSION = 0x10;
12
20
  const MIN_SIZE = 2;
13
21
  const MAX_SIZE = 40;
14
22
 
15
- interface P2OPBase extends BasePayment {
16
- name: PaymentType.P2OP;
17
- }
23
+ /**
24
+ * Pay-to-OPNet (P2OP) payment class.
25
+ *
26
+ * Creates locking scripts of the form: `OP_16 {program}`
27
+ * where program = `{deploymentVersion:uint8}{hash160:20-bytes|...}`
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * import { P2OP } from '@btc-vision/bitcoin';
32
+ *
33
+ * // Create from program
34
+ * const payment = P2OP.fromProgram(program);
35
+ * console.log(payment.address); // opnet address
36
+ *
37
+ * // Create from deployment version and hash160
38
+ * const fromParts = P2OP.fromParts(deploymentVersion, hash160);
39
+ *
40
+ * // Decode an existing output
41
+ * const decoded = P2OP.fromOutput(scriptPubKey);
42
+ * console.log(decoded.program);
43
+ * ```
44
+ */
45
+ export class P2OP {
46
+ // Static public fields
47
+ static readonly NAME = PaymentType.P2OP;
48
+
49
+ // Private instance fields
50
+ readonly #network: Network;
51
+ readonly #opts: Required<PaymentOpts>;
52
+
53
+ // Input data (provided by user)
54
+ #inputAddress?: string | undefined;
55
+ #inputProgram?: Uint8Array | undefined;
56
+ #inputDeploymentVersion?: number | undefined;
57
+ #inputHash160?: Uint8Array | undefined;
58
+ #inputOutput?: Uint8Array | undefined;
59
+
60
+ // Cached computed values
61
+ #address?: string | undefined;
62
+ #program?: Uint8Array | undefined;
63
+ #deploymentVersion?: number | undefined;
64
+ #hash160?: Uint8Array | undefined;
65
+ #output?: Uint8Array | undefined;
66
+
67
+ // Cache flags
68
+ #addressComputed = false;
69
+ #programComputed = false;
70
+ #deploymentVersionComputed = false;
71
+ #hash160Computed = false;
72
+ #outputComputed = false;
73
+
74
+ // Decoded address cache
75
+ #decodedAddress?: { version: number; prefix: string; data: Uint8Array } | undefined;
76
+ #decodedAddressComputed = false;
77
+
78
+ /**
79
+ * Creates a new P2OP payment instance.
80
+ *
81
+ * @param params - Payment parameters
82
+ * @param params.address - Bech32m encoded OPNet address
83
+ * @param params.program - Witness program (2-40 bytes)
84
+ * @param params.deploymentVersion - Deployment version (0-255)
85
+ * @param params.hash160 - 20-byte hash
86
+ * @param params.output - The scriptPubKey
87
+ * @param params.network - Network parameters (defaults to mainnet)
88
+ * @param opts - Payment options
89
+ * @param opts.validate - Whether to validate inputs (default: true)
90
+ *
91
+ * @throws {TypeError} If validation is enabled and data is invalid
92
+ */
93
+ constructor(
94
+ params: {
95
+ address?: string | undefined;
96
+ program?: Uint8Array | undefined;
97
+ deploymentVersion?: number | undefined;
98
+ hash160?: Uint8Array | undefined;
99
+ output?: Uint8Array | undefined;
100
+ network?: Network | undefined;
101
+ },
102
+ opts?: PaymentOpts,
103
+ ) {
104
+ this.#network = params.network ?? BITCOIN_NETWORK;
105
+ this.#opts = {
106
+ validate: opts?.validate ?? true,
107
+ allowIncomplete: opts?.allowIncomplete ?? false,
108
+ };
109
+
110
+ // Store input data
111
+ this.#inputAddress = params.address;
112
+ this.#inputProgram = params.program;
113
+ this.#inputDeploymentVersion = params.deploymentVersion;
114
+ this.#inputHash160 = params.hash160;
115
+ this.#inputOutput = params.output;
116
+
117
+ // Validate if requested
118
+ if (this.#opts.validate) {
119
+ this.#validate();
120
+ }
121
+ }
18
122
 
19
- interface P2OP_fromOutput extends P2OPBase {
20
- output: Buffer;
123
+ // Public getters
21
124
 
22
- program?: undefined;
23
- deploymentVersion?: undefined;
24
- hash160?: undefined;
25
- }
125
+ /**
126
+ * Payment type discriminant.
127
+ */
128
+ get name(): typeof PaymentType.P2OP {
129
+ return PaymentType.P2OP;
130
+ }
26
131
 
27
- interface P2OP_fromProgram extends P2OPBase {
28
- program: Buffer;
132
+ /**
133
+ * Network parameters.
134
+ */
135
+ get network(): Network {
136
+ return this.#network;
137
+ }
29
138
 
30
- output?: undefined;
31
- deploymentVersion?: never;
32
- hash160?: never;
33
- }
139
+ /**
140
+ * Bech32m encoded OPNet address.
141
+ */
142
+ get address(): string | undefined {
143
+ if (!this.#addressComputed) {
144
+ this.#address = this.#computeAddress();
145
+ this.#addressComputed = true;
146
+ }
147
+ return this.#address;
148
+ }
34
149
 
35
- interface P2OP_fromParts extends P2OPBase {
36
- deploymentVersion: number;
37
- hash160: Buffer;
150
+ /**
151
+ * Witness program (2-40 bytes).
152
+ * Format: `{deploymentVersion:uint8}{hash160:20-bytes|...}`
153
+ */
154
+ get program(): Uint8Array | undefined {
155
+ if (!this.#programComputed) {
156
+ this.#program = this.#computeProgram();
157
+ this.#programComputed = true;
158
+ }
159
+ return this.#program;
160
+ }
38
161
 
39
- output?: undefined;
40
- program?: undefined;
41
- }
162
+ /**
163
+ * Deployment version (first byte of program).
164
+ */
165
+ get deploymentVersion(): number | undefined {
166
+ if (!this.#deploymentVersionComputed) {
167
+ this.#deploymentVersion = this.#computeDeploymentVersion();
168
+ this.#deploymentVersionComputed = true;
169
+ }
170
+ return this.#deploymentVersion;
171
+ }
42
172
 
43
- export type P2OPPaymentParams = P2OP_fromOutput | P2OP_fromProgram | P2OP_fromParts;
173
+ /**
174
+ * Hash160 (remaining bytes of program).
175
+ */
176
+ get hash160(): Bytes20 | undefined {
177
+ if (!this.#hash160Computed) {
178
+ this.#hash160 = this.#computeHash160();
179
+ this.#hash160Computed = true;
180
+ }
181
+ return this.#hash160 as Bytes20 | undefined;
182
+ }
44
183
 
45
- /**
46
- * Pay-to-OPNet (P2OP) decoder / encoder.
47
- *
48
- * ▪ witness program = <deploymentVersion:uint8><hash160:20-bytes|...>
49
- * ▪ scriptPubKey = OP_16 <program>
50
- * ▪ address HRP = network.bech32Opnet, encoded with Bech32m
51
- *
52
- * Accepts any combination of { address, output, program } and returns a
53
- * fully lazy payment object, mirroring the style of `p2tr`.
54
- */
55
- export function p2op(a: Omit<P2OPPaymentParams, 'name'>, opts?: PaymentOpts): P2OPPayment {
56
- if (
57
- !a.address &&
58
- !a.output &&
59
- !a.program &&
60
- (typeof a.deploymentVersion === 'undefined' || !a.hash160)
61
- ) {
62
- throw new TypeError('At least one of address, output or program must be provided');
184
+ /**
185
+ * The scriptPubKey: `OP_16 {program}`
186
+ */
187
+ get output(): Uint8Array | undefined {
188
+ if (!this.#outputComputed) {
189
+ this.#output = this.#computeOutput();
190
+ this.#outputComputed = true;
191
+ }
192
+ return this.#output;
63
193
  }
64
194
 
65
- opts = Object.assign({ validate: true }, opts || {});
195
+ // Static factory methods
196
+
197
+ /**
198
+ * Creates a P2OP payment from a witness program.
199
+ *
200
+ * @param program - Witness program (2-40 bytes)
201
+ * @param network - Network parameters (defaults to mainnet)
202
+ * @returns A new P2OP payment instance
203
+ */
204
+ static fromProgram(program: Uint8Array, network?: Network): P2OP {
205
+ return new P2OP({ program, network });
206
+ }
66
207
 
67
- typef(
68
- {
69
- address: typef.maybe(typef.String),
70
- output: typef.maybe(typef.Buffer),
71
- program: typef.maybe(typef.Buffer),
72
- network: typef.maybe(typef.Object),
73
- deploymentVersion: typef.maybe(typef.Number),
74
- hash160: typef.maybe(typef.BufferN(20)),
75
- },
76
- a,
77
- );
208
+ /**
209
+ * Creates a P2OP payment from deployment version and hash160.
210
+ *
211
+ * @param deploymentVersion - Deployment version (0-255)
212
+ * @param hash160 - 20-byte hash
213
+ * @param network - Network parameters (defaults to mainnet)
214
+ * @returns A new P2OP payment instance
215
+ */
216
+ static fromParts(deploymentVersion: number, hash160: Uint8Array, network?: Network): P2OP {
217
+ return new P2OP({ deploymentVersion, hash160, network });
218
+ }
219
+
220
+ /**
221
+ * Creates a P2OP payment from an OPNet address.
222
+ *
223
+ * @param address - Bech32m encoded OPNet address
224
+ * @param network - Network parameters (defaults to mainnet)
225
+ * @returns A new P2OP payment instance
226
+ */
227
+ static fromAddress(address: string, network?: Network): P2OP {
228
+ return new P2OP({ address, network });
229
+ }
230
+
231
+ /**
232
+ * Creates a P2OP payment from a scriptPubKey.
233
+ *
234
+ * @param output - The scriptPubKey
235
+ * @param network - Network parameters (defaults to mainnet)
236
+ * @returns A new P2OP payment instance
237
+ */
238
+ static fromOutput(output: Uint8Array, network?: Network): P2OP {
239
+ return new P2OP({ output, network });
240
+ }
241
+
242
+ // Private helper methods
243
+
244
+ /**
245
+ * Converts to a plain P2OPPayment object for backwards compatibility.
246
+ *
247
+ * @returns A P2OPPayment object
248
+ */
249
+ toPayment(): P2OPPayment {
250
+ return {
251
+ name: this.name,
252
+ network: this.network,
253
+ address: this.address,
254
+ program: this.program,
255
+ deploymentVersion: this.deploymentVersion,
256
+ hash160: this.hash160,
257
+ output: this.output as Script | undefined,
258
+ };
259
+ }
78
260
 
79
- const makeProgramFromParts = (): Buffer | undefined => {
80
- if (typeof a.deploymentVersion !== 'undefined' && typeof a.hash160 !== 'undefined') {
81
- if (a.hash160.length !== 20) throw new TypeError('hash160 must be exactly 20 bytes');
82
- if (a.deploymentVersion < 0 || a.deploymentVersion > 0xff)
261
+ #getDecodedAddress(): { version: number; prefix: string; data: Uint8Array } | undefined {
262
+ if (!this.#decodedAddressComputed) {
263
+ if (this.#inputAddress) {
264
+ const decoded = fromBech32(this.#inputAddress);
265
+ if (decoded) {
266
+ this.#decodedAddress = {
267
+ version: decoded.version,
268
+ prefix: decoded.prefix,
269
+ data: decoded.data,
270
+ };
271
+ }
272
+ }
273
+ this.#decodedAddressComputed = true;
274
+ }
275
+ return this.#decodedAddress;
276
+ }
277
+
278
+ // Private computation methods
279
+
280
+ #makeProgramFromParts(): Uint8Array | undefined {
281
+ if (
282
+ typeof this.#inputDeploymentVersion !== 'undefined' &&
283
+ typeof this.#inputHash160 !== 'undefined'
284
+ ) {
285
+ if (this.#inputHash160.length !== 20) {
286
+ throw new TypeError('hash160 must be exactly 20 bytes');
287
+ }
288
+ if (this.#inputDeploymentVersion < 0 || this.#inputDeploymentVersion > 0xff) {
83
289
  throw new TypeError('deploymentVersion must fit in one byte');
84
- return Buffer.concat([Buffer.of(a.deploymentVersion), a.hash160]);
290
+ }
291
+ return concat([new Uint8Array([this.#inputDeploymentVersion]), this.#inputHash160]);
85
292
  }
86
293
  return undefined;
87
- };
88
-
89
- const _address = lazy.value(() => fromBech32(a.address!));
90
-
91
- const network: Network = a.network || BITCOIN_NETWORK;
92
- const o: P2OPPayment = {
93
- name: PaymentType.P2OP,
94
- network,
95
- deploymentVersion: 0,
96
- };
97
-
98
- lazy.prop(o, 'program', () => {
99
- if (a.program) return a.program;
100
-
101
- // NEW: build from deploymentVersion+hash160
102
- const fromParts = makeProgramFromParts();
103
- if (fromParts) return fromParts;
104
-
105
- if (a.output) {
106
- if (a.output[0] !== OPS.OP_16) throw new TypeError('Invalid P2OP script');
107
- let pushPos = 1,
108
- progLen: number;
109
- if (a.output[1] < 0x4c) {
110
- progLen = a.output[1];
294
+ }
295
+
296
+ #computeAddress(): string | undefined {
297
+ if (this.#inputAddress) {
298
+ return this.#inputAddress;
299
+ }
300
+ const prog = this.program;
301
+ if (!prog) return undefined;
302
+
303
+ if (!this.#network.bech32Opnet) {
304
+ throw new TypeError('Network does not support opnet');
305
+ }
306
+
307
+ const words = bech32m.toWords(prog);
308
+ words.unshift(P2OP_WITNESS_VERSION);
309
+ return bech32m.encode(this.#network.bech32Opnet, words);
310
+ }
311
+
312
+ #computeProgram(): Uint8Array | undefined {
313
+ if (this.#inputProgram) {
314
+ return this.#inputProgram;
315
+ }
316
+
317
+ // Build from deployment version + hash160
318
+ const fromParts = this.#makeProgramFromParts();
319
+ if (fromParts) {
320
+ return fromParts;
321
+ }
322
+
323
+ if (this.#inputOutput) {
324
+ if (this.#inputOutput[0] !== OPS.OP_16) {
325
+ throw new TypeError('Invalid P2OP script');
326
+ }
327
+ let pushPos = 1;
328
+ let progLen: number;
329
+ if (this.#inputOutput[1]! < 0x4c) {
330
+ progLen = this.#inputOutput[1]!;
111
331
  pushPos = 2;
112
- } else if (a.output[1] === 0x4c) {
113
- progLen = a.output[2];
332
+ } else if (this.#inputOutput[1] === 0x4c) {
333
+ progLen = this.#inputOutput[2]!;
114
334
  pushPos = 3;
115
335
  } else {
116
336
  throw new TypeError('Unsupported push opcode in P2OP script');
117
337
  }
118
- return a.output.subarray(pushPos, pushPos + progLen);
338
+ return this.#inputOutput.subarray(pushPos, pushPos + progLen);
119
339
  }
120
340
 
121
- if (a.address) {
122
- const dec = _address();
123
- return dec.data;
341
+ if (this.#inputAddress) {
342
+ return this.#getDecodedAddress()?.data;
124
343
  }
125
- });
126
-
127
- lazy.prop(o, 'deploymentVersion', () => {
128
- if (!o.program) return;
129
- return o.program[0];
130
- });
131
344
 
132
- lazy.prop(o, 'hash160', () => {
133
- if (!o.program) return;
134
- return o.program.subarray(1);
135
- });
345
+ return undefined;
346
+ }
136
347
 
137
- lazy.prop(o, 'output', () => {
138
- if (!o.program) return;
139
- return bscript.compile([OPS.OP_16, o.program]);
140
- });
348
+ #computeDeploymentVersion(): number | undefined {
349
+ if (this.#inputDeploymentVersion !== undefined) {
350
+ return this.#inputDeploymentVersion;
351
+ }
352
+ const prog = this.program;
353
+ if (!prog) return undefined;
354
+ return prog[0];
355
+ }
141
356
 
142
- lazy.prop(o, 'address', () => {
143
- if (!o.program) return;
144
- if (!network.bech32Opnet) {
145
- throw new TypeError('Network does not support opnet');
357
+ #computeHash160(): Uint8Array | undefined {
358
+ if (this.#inputHash160) {
359
+ return this.#inputHash160;
146
360
  }
361
+ const prog = this.program;
362
+ if (!prog) return undefined;
363
+ return prog.subarray(1) as Bytes20;
364
+ }
147
365
 
148
- const words = bech32m.toWords(o.program);
149
- words.unshift(P2OP_WITNESS_VERSION);
366
+ // Validation
150
367
 
151
- return bech32m.encode(network.bech32Opnet, words);
152
- });
368
+ #computeOutput(): Uint8Array | undefined {
369
+ if (this.#inputOutput) {
370
+ return this.#inputOutput;
371
+ }
372
+ const prog = this.program;
373
+ if (!prog) return undefined;
153
374
 
154
- // extended validation
155
- if (opts.validate) {
156
- let prog: Buffer = NBuffer.alloc(0);
375
+ return bscript.compile([OPS.OP_16, prog]);
376
+ }
157
377
 
158
- if (a.address) {
159
- const dec = _address();
160
- if (network.bech32Opnet !== dec.prefix)
378
+ #validate(): void {
379
+ let prog: Uint8Array = alloc(0);
380
+
381
+ if (this.#inputAddress) {
382
+ const dec = this.#getDecodedAddress();
383
+ if (!dec) {
384
+ throw new TypeError('Invalid address');
385
+ }
386
+ if (this.#network.bech32Opnet !== dec.prefix) {
161
387
  throw new TypeError('Invalid prefix or network mismatch');
162
- if (dec.version !== P2OP_WITNESS_VERSION)
388
+ }
389
+ if (dec.version !== P2OP_WITNESS_VERSION) {
163
390
  throw new TypeError('Invalid witness version for p2op');
164
- if (dec.data.length < MIN_SIZE || dec.data.length > MAX_SIZE)
391
+ }
392
+ if (dec.data.length < MIN_SIZE || dec.data.length > MAX_SIZE) {
165
393
  throw new TypeError('Invalid witness program length');
394
+ }
166
395
  prog = dec.data;
167
396
  }
168
397
 
169
- if (a.program) {
170
- if (prog.length && !prog.equals(a.program)) throw new TypeError('Program mismatch');
171
- prog = a.program;
398
+ if (this.#inputProgram) {
399
+ if (prog.length > 0 && !equals(prog, this.#inputProgram)) {
400
+ throw new TypeError('Program mismatch');
401
+ }
402
+ prog = this.#inputProgram;
172
403
  }
173
404
 
174
- if (!prog.length && a.deploymentVersion !== undefined && a.hash160) {
175
- prog = makeProgramFromParts()!;
405
+ if (!prog.length && this.#inputDeploymentVersion !== undefined && this.#inputHash160) {
406
+ const made = this.#makeProgramFromParts();
407
+ if (made) prog = made;
176
408
  }
177
409
 
178
- if (a.output) {
179
- const outProg = o.program!;
180
- if (prog.length && !prog.equals(outProg))
410
+ if (this.#inputOutput) {
411
+ const outProg = this.program;
412
+ if (!outProg) {
413
+ throw new TypeError('Output program is required');
414
+ }
415
+ if (prog.length > 0 && !equals(prog, outProg)) {
181
416
  throw new TypeError('Program mismatch (output vs other source)');
417
+ }
182
418
  prog = outProg;
183
419
  }
184
420
 
185
- if (prog.length < MIN_SIZE || prog.length > MAX_SIZE)
421
+ if (prog.length < MIN_SIZE || prog.length > MAX_SIZE) {
186
422
  throw new TypeError(`Witness program must be 2–40 bytes. Was ${prog.length} bytes`);
423
+ }
187
424
 
188
- if (a.deploymentVersion !== undefined && a.deploymentVersion !== prog[0])
425
+ if (
426
+ this.#inputDeploymentVersion !== undefined &&
427
+ this.#inputDeploymentVersion !== prog[0]
428
+ ) {
189
429
  throw new TypeError('deploymentVersion mismatch');
430
+ }
190
431
 
191
- if (a.hash160 && !a.hash160.equals(prog.subarray(1)))
432
+ if (this.#inputHash160 && !equals(this.#inputHash160, prog.subarray(1))) {
192
433
  throw new TypeError('hash160 mismatch');
434
+ }
193
435
  }
436
+ }
437
+
438
+ /**
439
+ * Creates a Pay-to-OPNet (P2OP) payment object.
440
+ *
441
+ * This is the legacy factory function for backwards compatibility.
442
+ * For new code, prefer using the P2OP class directly.
443
+ *
444
+ * @param a - The payment object containing the necessary data
445
+ * @param opts - Optional payment options
446
+ * @returns The P2OP payment object
447
+ * @throws {TypeError} If the required data is not provided or if the data is invalid
448
+ *
449
+ * @example
450
+ * ```typescript
451
+ * import { p2op } from '@btc-vision/bitcoin';
452
+ *
453
+ * // Create from program
454
+ * const payment = p2op({ program });
455
+ *
456
+ * // Create from parts
457
+ * const fromParts = p2op({ deploymentVersion: 0, hash160 });
458
+ * ```
459
+ */
460
+ export function p2op(
461
+ a: {
462
+ address?: string;
463
+ program?: Uint8Array;
464
+ deploymentVersion?: number;
465
+ hash160?: Uint8Array;
466
+ output?: Uint8Array;
467
+ network?: Network;
468
+ },
469
+ opts?: PaymentOpts,
470
+ ): P2OPPayment {
471
+ if (
472
+ !a.address &&
473
+ !a.output &&
474
+ !a.program &&
475
+ (typeof a.deploymentVersion === 'undefined' || !a.hash160)
476
+ ) {
477
+ throw new TypeError('At least one of address, output or program must be provided');
478
+ }
479
+
480
+ const instance = new P2OP(
481
+ {
482
+ address: a.address,
483
+ program: a.program,
484
+ deploymentVersion: a.deploymentVersion,
485
+ hash160: a.hash160,
486
+ output: a.output,
487
+ network: a.network,
488
+ },
489
+ opts,
490
+ );
194
491
 
195
- return Object.assign(o, a);
492
+ // Return a merged object for backwards compatibility
493
+ return Object.assign(instance.toPayment(), a);
196
494
  }