@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
@@ -0,0 +1,696 @@
1
+ /**
2
+ * Stateful binary writer with a single DataView instance.
3
+ *
4
+ * Zero allocations during write operations. The DataView is created once
5
+ * in the constructor and reused for all writes.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+
10
+ import { toHex } from './hex.js';
11
+
12
+ /**
13
+ * High-performance binary writer for serializing binary data.
14
+ *
15
+ * Creates exactly ONE DataView instance that is reused for all write operations.
16
+ * This eliminates garbage collection pressure from repeated DataView allocations.
17
+ *
18
+ * Methods return `this` for chaining.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { BinaryWriter } from '@btc-vision/bitcoin';
23
+ *
24
+ * // Serialize a simple structure
25
+ * const writer = new BinaryWriter(16);
26
+ * writer
27
+ * .writeInt32LE(1) // version
28
+ * .writeUInt32LE(0) // input count
29
+ * .writeUInt32LE(0) // output count
30
+ * .writeUInt32LE(0); // locktime
31
+ *
32
+ * const bytes = writer.finish();
33
+ * ```
34
+ */
35
+ export class BinaryWriter {
36
+ /**
37
+ * The underlying byte array.
38
+ */
39
+ readonly #data: Uint8Array;
40
+
41
+ /**
42
+ * Single DataView instance reused for all writes.
43
+ */
44
+ readonly #view: DataView;
45
+
46
+ /**
47
+ * Current write position.
48
+ */
49
+ #offset: number;
50
+
51
+ /**
52
+ * Creates a new BinaryWriter with a pre-allocated buffer.
53
+ *
54
+ * @param size - Size of the buffer in bytes
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * import { BinaryWriter } from '@btc-vision/bitcoin';
59
+ *
60
+ * const writer = new BinaryWriter(1024);
61
+ * writer.writeUInt32LE(42);
62
+ * ```
63
+ */
64
+ public constructor(size: number);
65
+
66
+ /**
67
+ * Creates a new BinaryWriter wrapping an existing buffer.
68
+ *
69
+ * @param buffer - Existing buffer to write into
70
+ * @param offset - Initial write position (default 0)
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * import { BinaryWriter } from '@btc-vision/bitcoin';
75
+ *
76
+ * const buffer = new Uint8Array(1024);
77
+ * const writer = new BinaryWriter(buffer, 10); // Start at offset 10
78
+ * writer.writeUInt32LE(42);
79
+ * ```
80
+ */
81
+ public constructor(buffer: Uint8Array, offset?: number);
82
+
83
+ public constructor(arg: number | Uint8Array, offset: number = 0) {
84
+ if (typeof arg === 'number') {
85
+ this.#data = new Uint8Array(arg);
86
+ this.#offset = 0;
87
+ } else {
88
+ this.#data = arg;
89
+ this.#offset = offset;
90
+ }
91
+ this.#view = new DataView(this.#data.buffer, this.#data.byteOffset, this.#data.byteLength);
92
+ }
93
+
94
+ /**
95
+ * Current write position in the buffer.
96
+ */
97
+ public get offset(): number {
98
+ return this.#offset;
99
+ }
100
+
101
+ /**
102
+ * Sets the write position.
103
+ *
104
+ * @param value - New offset value
105
+ * @throws RangeError if offset is negative or beyond buffer length
106
+ */
107
+ public set offset(value: number) {
108
+ if (value < 0 || value > this.#data.length) {
109
+ throw new RangeError(`Offset ${value} is out of bounds [0, ${this.#data.length}]`);
110
+ }
111
+ this.#offset = value;
112
+ }
113
+
114
+ /**
115
+ * Total capacity of the underlying buffer.
116
+ */
117
+ public get capacity(): number {
118
+ return this.#data.length;
119
+ }
120
+
121
+ /**
122
+ * Number of bytes remaining in the buffer.
123
+ */
124
+ public get remaining(): number {
125
+ return this.#data.length - this.#offset;
126
+ }
127
+
128
+ /**
129
+ * The underlying data buffer.
130
+ */
131
+ public get data(): Uint8Array {
132
+ return this.#data;
133
+ }
134
+
135
+ /**
136
+ * Creates a BinaryWriter with automatic capacity management.
137
+ *
138
+ * Initial capacity is 256 bytes, grows as needed.
139
+ *
140
+ * @returns A new GrowableBinaryWriter instance
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * import { BinaryWriter } from '@btc-vision/bitcoin';
145
+ *
146
+ * const writer = BinaryWriter.growable();
147
+ * writer.writeUInt32LE(1);
148
+ * writer.writeBytes(new Uint8Array(1000)); // Automatically grows
149
+ * ```
150
+ */
151
+ public static growable(initialCapacity: number = 256): GrowableBinaryWriter {
152
+ return new GrowableBinaryWriter(initialCapacity);
153
+ }
154
+
155
+ /**
156
+ * Writes an 8-bit unsigned integer.
157
+ *
158
+ * @param value - Value to write (0-255)
159
+ * @returns This writer for chaining
160
+ * @throws RangeError if writing past end of buffer
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * writer.writeUInt8(255);
165
+ * ```
166
+ */
167
+ public writeUInt8(value: number): this {
168
+ if (this.#offset >= this.#data.length) {
169
+ throw new RangeError('Write past end of buffer');
170
+ }
171
+ this.#data[this.#offset++] = value & 0xff;
172
+ return this;
173
+ }
174
+
175
+ /**
176
+ * Writes an 8-bit signed integer.
177
+ *
178
+ * @param value - Value to write (-128 to 127)
179
+ * @returns This writer for chaining
180
+ * @throws RangeError if writing past end of buffer
181
+ */
182
+ public writeInt8(value: number): this {
183
+ return this.writeUInt8(value < 0 ? value + 256 : value);
184
+ }
185
+
186
+ /**
187
+ * Writes a 16-bit unsigned integer in little-endian format.
188
+ *
189
+ * @param value - Value to write (0-65535)
190
+ * @returns This writer for chaining
191
+ * @throws RangeError if writing past end of buffer
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * writer.writeUInt16LE(1); // Writes 01 00
196
+ * ```
197
+ */
198
+ public writeUInt16LE(value: number): this {
199
+ if (this.#offset + 2 > this.#data.length) {
200
+ throw new RangeError('Write past end of buffer');
201
+ }
202
+ this.#view.setUint16(this.#offset, value, true);
203
+ this.#offset += 2;
204
+ return this;
205
+ }
206
+
207
+ /**
208
+ * Writes a 16-bit signed integer in little-endian format.
209
+ *
210
+ * @param value - Value to write (-32768 to 32767)
211
+ * @returns This writer for chaining
212
+ * @throws RangeError if writing past end of buffer
213
+ */
214
+ public writeInt16LE(value: number): this {
215
+ if (this.#offset + 2 > this.#data.length) {
216
+ throw new RangeError('Write past end of buffer');
217
+ }
218
+ this.#view.setInt16(this.#offset, value, true);
219
+ this.#offset += 2;
220
+ return this;
221
+ }
222
+
223
+ /**
224
+ * Writes a 32-bit unsigned integer in little-endian format.
225
+ *
226
+ * @param value - Value to write (0 to 4294967295)
227
+ * @returns This writer for chaining
228
+ * @throws RangeError if writing past end of buffer
229
+ *
230
+ * @example
231
+ * ```typescript
232
+ * writer.writeUInt32LE(1); // Writes 01 00 00 00
233
+ * ```
234
+ */
235
+ public writeUInt32LE(value: number): this {
236
+ if (this.#offset + 4 > this.#data.length) {
237
+ throw new RangeError('Write past end of buffer');
238
+ }
239
+ this.#view.setUint32(this.#offset, value, true);
240
+ this.#offset += 4;
241
+ return this;
242
+ }
243
+
244
+ /**
245
+ * Writes a 32-bit signed integer in little-endian format.
246
+ *
247
+ * @param value - Value to write (-2147483648 to 2147483647)
248
+ * @returns This writer for chaining
249
+ * @throws RangeError if writing past end of buffer
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * writer.writeInt32LE(-1); // Writes ff ff ff ff
254
+ * ```
255
+ */
256
+ public writeInt32LE(value: number): this {
257
+ if (this.#offset + 4 > this.#data.length) {
258
+ throw new RangeError('Write past end of buffer');
259
+ }
260
+ this.#view.setInt32(this.#offset, value, true);
261
+ this.#offset += 4;
262
+ return this;
263
+ }
264
+
265
+ /**
266
+ * Writes a 64-bit unsigned integer in little-endian format.
267
+ *
268
+ * @param value - Value to write as bigint
269
+ * @returns This writer for chaining
270
+ * @throws RangeError if writing past end of buffer
271
+ *
272
+ * @example
273
+ * ```typescript
274
+ * writer.writeUInt64LE(50000n); // Writes 50 c3 00 00 00 00 00 00
275
+ * ```
276
+ */
277
+ public writeUInt64LE(value: bigint): this {
278
+ if (this.#offset + 8 > this.#data.length) {
279
+ throw new RangeError('Write past end of buffer');
280
+ }
281
+ this.#view.setBigUint64(this.#offset, value, true);
282
+ this.#offset += 8;
283
+ return this;
284
+ }
285
+
286
+ /**
287
+ * Writes a 64-bit signed integer in little-endian format.
288
+ *
289
+ * @param value - Value to write as bigint
290
+ * @returns This writer for chaining
291
+ * @throws RangeError if writing past end of buffer
292
+ */
293
+ public writeInt64LE(value: bigint): this {
294
+ if (this.#offset + 8 > this.#data.length) {
295
+ throw new RangeError('Write past end of buffer');
296
+ }
297
+ this.#view.setBigInt64(this.#offset, value, true);
298
+ this.#offset += 8;
299
+ return this;
300
+ }
301
+
302
+ /**
303
+ * Writes raw bytes.
304
+ *
305
+ * @param bytes - Bytes to write
306
+ * @returns This writer for chaining
307
+ * @throws RangeError if writing past end of buffer
308
+ *
309
+ * @example
310
+ * ```typescript
311
+ * writer.writeBytes(new Uint8Array([0xde, 0xad, 0xbe, 0xef]));
312
+ * ```
313
+ */
314
+ public writeBytes(bytes: Uint8Array): this {
315
+ if (this.#offset + bytes.length > this.#data.length) {
316
+ throw new RangeError('Write past end of buffer');
317
+ }
318
+ this.#data.set(bytes, this.#offset);
319
+ this.#offset += bytes.length;
320
+ return this;
321
+ }
322
+
323
+ /**
324
+ * Writes a Bitcoin CompactSize variable-length integer.
325
+ *
326
+ * CompactSize encoding:
327
+ * - 0x00-0xFC: 1 byte (value as-is)
328
+ * - 0xFD-0xFFFF: 3 bytes (0xFD + 2-byte LE uint16)
329
+ * - 0x10000-0xFFFFFFFF: 5 bytes (0xFE + 4-byte LE uint32)
330
+ * - Larger: 9 bytes (0xFF + 8-byte LE uint64)
331
+ *
332
+ * @param value - Value to write
333
+ * @returns This writer for chaining
334
+ * @throws RangeError if writing past end of buffer
335
+ *
336
+ * @example
337
+ * ```typescript
338
+ * writer.writeVarInt(252); // Writes fc
339
+ * writer.writeVarInt(253); // Writes fd fd 00
340
+ * writer.writeVarInt(65535); // Writes fd ff ff
341
+ * writer.writeVarInt(65536); // Writes fe 00 00 01 00
342
+ * ```
343
+ */
344
+ public writeVarInt(value: number): this {
345
+ if (value < 0xfd) {
346
+ return this.writeUInt8(value);
347
+ }
348
+
349
+ if (value <= 0xffff) {
350
+ this.writeUInt8(0xfd);
351
+ return this.writeUInt16LE(value);
352
+ }
353
+
354
+ if (value <= 0xffffffff) {
355
+ this.writeUInt8(0xfe);
356
+ return this.writeUInt32LE(value);
357
+ }
358
+
359
+ this.writeUInt8(0xff);
360
+ return this.writeUInt64LE(BigInt(value));
361
+ }
362
+
363
+ /**
364
+ * Writes a Bitcoin CompactSize variable-length integer from bigint.
365
+ *
366
+ * @param value - Value to write as bigint
367
+ * @returns This writer for chaining
368
+ * @throws RangeError if writing past end of buffer
369
+ */
370
+ public writeVarIntBig(value: bigint): this {
371
+ if (value < 0xfdn) {
372
+ return this.writeUInt8(Number(value));
373
+ }
374
+
375
+ if (value <= 0xffffn) {
376
+ this.writeUInt8(0xfd);
377
+ return this.writeUInt16LE(Number(value));
378
+ }
379
+
380
+ if (value <= 0xffffffffn) {
381
+ this.writeUInt8(0xfe);
382
+ return this.writeUInt32LE(Number(value));
383
+ }
384
+
385
+ this.writeUInt8(0xff);
386
+ return this.writeUInt64LE(value);
387
+ }
388
+
389
+ /**
390
+ * Writes a length-prefixed byte array (VarInt length + bytes).
391
+ *
392
+ * @param bytes - Bytes to write
393
+ * @returns This writer for chaining
394
+ * @throws RangeError if writing past end of buffer
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * writer.writeVarBytes(new Uint8Array([0xde, 0xad])); // Writes 02 de ad
399
+ * ```
400
+ */
401
+ public writeVarBytes(bytes: Uint8Array): this {
402
+ this.writeVarInt(bytes.length);
403
+ return this.writeBytes(bytes);
404
+ }
405
+
406
+ /**
407
+ * Writes an array of length-prefixed byte arrays.
408
+ *
409
+ * Format: VarInt count + (VarInt length + bytes) for each item.
410
+ *
411
+ * @param vector - Array of byte arrays to write
412
+ * @returns This writer for chaining
413
+ * @throws RangeError if writing past end of buffer
414
+ */
415
+ public writeVector(vector: readonly Uint8Array[]): this {
416
+ this.writeVarInt(vector.length);
417
+ for (const item of vector) {
418
+ this.writeVarBytes(item);
419
+ }
420
+ return this;
421
+ }
422
+
423
+ /**
424
+ * Fills a region with a specific byte value.
425
+ *
426
+ * @param value - Byte value to fill with
427
+ * @param length - Number of bytes to fill
428
+ * @returns This writer for chaining
429
+ * @throws RangeError if writing past end of buffer
430
+ */
431
+ public fill(value: number, length: number): this {
432
+ if (this.#offset + length > this.#data.length) {
433
+ throw new RangeError('Write past end of buffer');
434
+ }
435
+ this.#data.fill(value, this.#offset, this.#offset + length);
436
+ this.#offset += length;
437
+ return this;
438
+ }
439
+
440
+ /**
441
+ * Skips a specified number of bytes (leaves them unchanged).
442
+ *
443
+ * @param length - Number of bytes to skip
444
+ * @returns This writer for chaining
445
+ * @throws RangeError if skipping past end of buffer
446
+ */
447
+ public skip(length: number): this {
448
+ if (this.#offset + length > this.#data.length) {
449
+ throw new RangeError('Skip past end of buffer');
450
+ }
451
+ this.#offset += length;
452
+ return this;
453
+ }
454
+
455
+ /**
456
+ * Resets the write position to the beginning.
457
+ *
458
+ * @returns This writer for chaining
459
+ */
460
+ public reset(): this {
461
+ this.#offset = 0;
462
+ return this;
463
+ }
464
+
465
+ /**
466
+ * Verifies the buffer was fully written and returns it.
467
+ *
468
+ * Unlike {@link finish}, this method throws if the writer has not
469
+ * written exactly to the end of the buffer.
470
+ *
471
+ * @returns The underlying buffer
472
+ * @throws Error if the buffer was not fully written
473
+ *
474
+ * @example
475
+ * ```typescript
476
+ * const writer = new BinaryWriter(8);
477
+ * writer.writeUInt32LE(1);
478
+ * writer.writeUInt32LE(2);
479
+ * const bytes = writer.end(); // OK: wrote exactly 8 bytes
480
+ *
481
+ * const writer2 = new BinaryWriter(8);
482
+ * writer2.writeUInt32LE(1);
483
+ * writer2.end(); // throws: buffer size 8, offset 4
484
+ * ```
485
+ */
486
+ public end(): Uint8Array {
487
+ if (this.#offset === this.#data.length) {
488
+ return this.#data;
489
+ }
490
+ throw new Error(`buffer size ${this.#data.length}, offset ${this.#offset}`);
491
+ }
492
+
493
+ /**
494
+ * Returns the written portion of the buffer.
495
+ *
496
+ * If the entire buffer was written, returns the buffer directly (no copy).
497
+ * Otherwise, returns a subarray view.
498
+ *
499
+ * @returns Uint8Array containing the written data
500
+ *
501
+ * @example
502
+ * ```typescript
503
+ * const writer = new BinaryWriter(100);
504
+ * writer.writeUInt32LE(42);
505
+ * const bytes = writer.finish(); // 4 bytes
506
+ * ```
507
+ */
508
+ public finish(): Uint8Array {
509
+ return this.#offset === this.#data.length
510
+ ? this.#data
511
+ : this.#data.subarray(0, this.#offset);
512
+ }
513
+
514
+ /**
515
+ * Returns the written portion as a hex string.
516
+ *
517
+ * @returns Hex string representation
518
+ *
519
+ * @example
520
+ * ```typescript
521
+ * const writer = new BinaryWriter(4);
522
+ * writer.writeUInt32LE(1);
523
+ * writer.toHex(); // '01000000'
524
+ * ```
525
+ */
526
+ public toHex(): string {
527
+ return toHex(this.finish());
528
+ }
529
+ }
530
+
531
+ /**
532
+ * A BinaryWriter that automatically grows its buffer as needed.
533
+ *
534
+ * Use when the final size is unknown.
535
+ *
536
+ * @example
537
+ * ```typescript
538
+ * const writer = BinaryWriter.growable();
539
+ * writer.writeBytes(largeData); // Automatically grows
540
+ * const bytes = writer.finish();
541
+ * ```
542
+ */
543
+ export class GrowableBinaryWriter {
544
+ #data: Uint8Array;
545
+ #view: DataView;
546
+ #offset: number = 0;
547
+
548
+ /**
549
+ * Creates a new GrowableBinaryWriter.
550
+ *
551
+ * @param initialCapacity - Initial buffer size (default 256)
552
+ */
553
+ public constructor(initialCapacity: number = 256) {
554
+ this.#data = new Uint8Array(initialCapacity);
555
+ this.#view = new DataView(this.#data.buffer);
556
+ }
557
+
558
+ /**
559
+ * Current write position.
560
+ */
561
+ public get offset(): number {
562
+ return this.#offset;
563
+ }
564
+
565
+ /**
566
+ * Sets the write position.
567
+ *
568
+ * @param value - New offset value
569
+ * @throws RangeError if offset is negative
570
+ */
571
+ public set offset(value: number) {
572
+ if (value < 0) {
573
+ throw new RangeError(`Offset ${value} cannot be negative`);
574
+ }
575
+ // GrowableBinaryWriter can grow, so allow setting offset beyond current capacity
576
+ this.#offset = value;
577
+ }
578
+
579
+ /**
580
+ * Current buffer capacity.
581
+ */
582
+ public get capacity(): number {
583
+ return this.#data.length;
584
+ }
585
+
586
+ public writeUInt8(value: number): this {
587
+ this.#ensureCapacity(1);
588
+ this.#data[this.#offset++] = value & 0xff;
589
+ return this;
590
+ }
591
+
592
+ public writeUInt16LE(value: number): this {
593
+ this.#ensureCapacity(2);
594
+ this.#view.setUint16(this.#offset, value, true);
595
+ this.#offset += 2;
596
+ return this;
597
+ }
598
+
599
+ public writeUInt32LE(value: number): this {
600
+ this.#ensureCapacity(4);
601
+ this.#view.setUint32(this.#offset, value, true);
602
+ this.#offset += 4;
603
+ return this;
604
+ }
605
+
606
+ public writeInt32LE(value: number): this {
607
+ this.#ensureCapacity(4);
608
+ this.#view.setInt32(this.#offset, value, true);
609
+ this.#offset += 4;
610
+ return this;
611
+ }
612
+
613
+ public writeUInt64LE(value: bigint): this {
614
+ this.#ensureCapacity(8);
615
+ this.#view.setBigUint64(this.#offset, value, true);
616
+ this.#offset += 8;
617
+ return this;
618
+ }
619
+
620
+ public writeBytes(bytes: Uint8Array): this {
621
+ this.#ensureCapacity(bytes.length);
622
+ this.#data.set(bytes, this.#offset);
623
+ this.#offset += bytes.length;
624
+ return this;
625
+ }
626
+
627
+ public writeVarInt(value: number): this {
628
+ if (value < 0xfd) {
629
+ return this.writeUInt8(value);
630
+ }
631
+ if (value <= 0xffff) {
632
+ this.writeUInt8(0xfd);
633
+ return this.writeUInt16LE(value);
634
+ }
635
+ if (value <= 0xffffffff) {
636
+ this.writeUInt8(0xfe);
637
+ return this.writeUInt32LE(value);
638
+ }
639
+ this.writeUInt8(0xff);
640
+ return this.writeUInt64LE(BigInt(value));
641
+ }
642
+
643
+ public writeVarBytes(bytes: Uint8Array): this {
644
+ this.writeVarInt(bytes.length);
645
+ return this.writeBytes(bytes);
646
+ }
647
+
648
+ public writeVector(vector: readonly Uint8Array[]): this {
649
+ this.writeVarInt(vector.length);
650
+ for (const item of vector) {
651
+ this.writeVarBytes(item);
652
+ }
653
+ return this;
654
+ }
655
+
656
+ /**
657
+ * Returns the written data as a new Uint8Array.
658
+ *
659
+ * @returns Copy of the written data
660
+ */
661
+ public finish(): Uint8Array {
662
+ return this.#data.slice(0, this.#offset);
663
+ }
664
+
665
+ /**
666
+ * Returns the written data as a hex string.
667
+ *
668
+ * @returns Hex string representation
669
+ */
670
+ public toHex(): string {
671
+ return toHex(this.finish());
672
+ }
673
+
674
+ /**
675
+ * Ensures the buffer has enough space for additional bytes.
676
+ *
677
+ * @param additionalBytes - Number of additional bytes needed
678
+ */
679
+ #ensureCapacity(additionalBytes: number): void {
680
+ const required = this.#offset + additionalBytes;
681
+ if (required <= this.#data.length) {
682
+ return;
683
+ }
684
+
685
+ // Grow by at least 2x or to required size
686
+ let newCapacity = this.#data.length * 2;
687
+ while (newCapacity < required) {
688
+ newCapacity *= 2;
689
+ }
690
+
691
+ const newData = new Uint8Array(newCapacity);
692
+ newData.set(this.#data.subarray(0, this.#offset));
693
+ this.#data = newData;
694
+ this.#view = new DataView(this.#data.buffer);
695
+ }
696
+ }