@aztec/bb.js 0.0.0-devnet

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 (545) hide show
  1. package/README.md +149 -0
  2. package/dest/browser/522.index.js +10 -0
  3. package/dest/browser/barretenberg/backend.d.ts +85 -0
  4. package/dest/browser/barretenberg/backend.d.ts.map +1 -0
  5. package/dest/browser/barretenberg/index.d.ts +47 -0
  6. package/dest/browser/barretenberg/index.d.ts.map +1 -0
  7. package/dest/browser/barretenberg/verifier.d.ts +16 -0
  8. package/dest/browser/barretenberg/verifier.d.ts.map +1 -0
  9. package/dest/browser/barretenberg_api/index.d.ts +113 -0
  10. package/dest/browser/barretenberg_api/index.d.ts.map +1 -0
  11. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +44 -0
  12. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -0
  13. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts +2 -0
  14. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts.map +1 -0
  15. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts +3 -0
  16. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts.map +1 -0
  17. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts +4 -0
  18. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts.map +1 -0
  19. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +21 -0
  20. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -0
  21. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +47 -0
  22. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -0
  23. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts +2 -0
  24. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts.map +1 -0
  25. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts +3 -0
  26. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts.map +1 -0
  27. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts +4 -0
  28. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts.map +1 -0
  29. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +28 -0
  30. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -0
  31. package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts +2 -0
  32. package/dest/browser/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -0
  33. package/dest/browser/barretenberg_wasm/fetch_code/index.d.ts +2 -0
  34. package/dest/browser/barretenberg_wasm/fetch_code/index.d.ts.map +1 -0
  35. package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts +2 -0
  36. package/dest/browser/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -0
  37. package/dest/browser/barretenberg_wasm/helpers/browser/index.d.ts +6 -0
  38. package/dest/browser/barretenberg_wasm/helpers/browser/index.d.ts.map +1 -0
  39. package/dest/browser/barretenberg_wasm/helpers/index.d.ts +2 -0
  40. package/dest/browser/barretenberg_wasm/helpers/index.d.ts.map +1 -0
  41. package/dest/browser/barretenberg_wasm/helpers/node/index.d.ts +22 -0
  42. package/dest/browser/barretenberg_wasm/helpers/node/index.d.ts.map +1 -0
  43. package/dest/browser/barretenberg_wasm/helpers/node/node_endpoint.d.ts +8 -0
  44. package/dest/browser/barretenberg_wasm/helpers/node/node_endpoint.d.ts.map +1 -0
  45. package/dest/browser/barretenberg_wasm/index.d.ts +18 -0
  46. package/dest/browser/barretenberg_wasm/index.d.ts.map +1 -0
  47. package/dest/browser/bigint-array/index.d.ts +3 -0
  48. package/dest/browser/bigint-array/index.d.ts.map +1 -0
  49. package/dest/browser/crs/browser/cached_net_crs.d.ts +43 -0
  50. package/dest/browser/crs/browser/cached_net_crs.d.ts.map +1 -0
  51. package/dest/browser/crs/browser/index.d.ts +2 -0
  52. package/dest/browser/crs/browser/index.d.ts.map +1 -0
  53. package/dest/browser/crs/index.d.ts +2 -0
  54. package/dest/browser/crs/index.d.ts.map +1 -0
  55. package/dest/browser/crs/net_crs.d.ts +61 -0
  56. package/dest/browser/crs/net_crs.d.ts.map +1 -0
  57. package/dest/browser/crs/node/index.d.ts +36 -0
  58. package/dest/browser/crs/node/index.d.ts.map +1 -0
  59. package/dest/browser/index.d.ts +5 -0
  60. package/dest/browser/index.d.ts.map +1 -0
  61. package/dest/browser/index.js +16205 -0
  62. package/dest/browser/proof/index.d.ts +19 -0
  63. package/dest/browser/proof/index.d.ts.map +1 -0
  64. package/dest/browser/random/browser/index.d.ts +2 -0
  65. package/dest/browser/random/browser/index.d.ts.map +1 -0
  66. package/dest/browser/random/index.d.ts +2 -0
  67. package/dest/browser/random/index.d.ts.map +1 -0
  68. package/dest/browser/random/node/index.d.ts +2 -0
  69. package/dest/browser/random/node/index.d.ts.map +1 -0
  70. package/dest/browser/serialize/buffer_reader.d.ts +28 -0
  71. package/dest/browser/serialize/buffer_reader.d.ts.map +1 -0
  72. package/dest/browser/serialize/index.d.ts +4 -0
  73. package/dest/browser/serialize/index.d.ts.map +1 -0
  74. package/dest/browser/serialize/output_type.d.ts +11 -0
  75. package/dest/browser/serialize/output_type.d.ts.map +1 -0
  76. package/dest/browser/serialize/serialize.d.ts +53 -0
  77. package/dest/browser/serialize/serialize.d.ts.map +1 -0
  78. package/dest/browser/types/fields.d.ts +43 -0
  79. package/dest/browser/types/fields.d.ts.map +1 -0
  80. package/dest/browser/types/fixed_size_buffer.d.ts +26 -0
  81. package/dest/browser/types/fixed_size_buffer.d.ts.map +1 -0
  82. package/dest/browser/types/index.d.ts +6 -0
  83. package/dest/browser/types/index.d.ts.map +1 -0
  84. package/dest/browser/types/point.d.ts +17 -0
  85. package/dest/browser/types/point.d.ts.map +1 -0
  86. package/dest/browser/types/ptr.d.ts +13 -0
  87. package/dest/browser/types/ptr.d.ts.map +1 -0
  88. package/dest/browser/types/raw_buffer.d.ts +3 -0
  89. package/dest/browser/types/raw_buffer.d.ts.map +1 -0
  90. package/dest/node/async_map/index.d.ts +10 -0
  91. package/dest/node/async_map/index.d.ts.map +1 -0
  92. package/dest/node/async_map/index.js +16 -0
  93. package/dest/node/barretenberg/backend.d.ts +85 -0
  94. package/dest/node/barretenberg/backend.d.ts.map +1 -0
  95. package/dest/node/barretenberg/backend.js +247 -0
  96. package/dest/node/barretenberg/blake2s.test.d.ts +2 -0
  97. package/dest/node/barretenberg/blake2s.test.d.ts.map +1 -0
  98. package/dest/node/barretenberg/blake2s.test.js +54 -0
  99. package/dest/node/barretenberg/common.test.d.ts +2 -0
  100. package/dest/node/barretenberg/common.test.d.ts.map +1 -0
  101. package/dest/node/barretenberg/common.test.js +20 -0
  102. package/dest/node/barretenberg/index.d.ts +47 -0
  103. package/dest/node/barretenberg/index.d.ts.map +1 -0
  104. package/dest/node/barretenberg/index.js +97 -0
  105. package/dest/node/barretenberg/pedersen.test.d.ts +2 -0
  106. package/dest/node/barretenberg/pedersen.test.d.ts.map +1 -0
  107. package/dest/node/barretenberg/pedersen.test.js +55 -0
  108. package/dest/node/barretenberg/poseidon.test.d.ts +2 -0
  109. package/dest/node/barretenberg/poseidon.test.d.ts.map +1 -0
  110. package/dest/node/barretenberg/poseidon.test.js +35 -0
  111. package/dest/node/barretenberg/schnorr.test.d.ts +2 -0
  112. package/dest/node/barretenberg/schnorr.test.d.ts.map +1 -0
  113. package/dest/node/barretenberg/schnorr.test.js +113 -0
  114. package/dest/node/barretenberg/verifier.d.ts +16 -0
  115. package/dest/node/barretenberg/verifier.d.ts.map +1 -0
  116. package/dest/node/barretenberg/verifier.js +40 -0
  117. package/dest/node/barretenberg_api/index.d.ts +113 -0
  118. package/dest/node/barretenberg_api/index.d.ts.map +1 -0
  119. package/dest/node/barretenberg_api/index.js +728 -0
  120. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  121. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +44 -0
  122. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -0
  123. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.js +125 -0
  124. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts +2 -0
  125. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts.map +1 -0
  126. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.js +10 -0
  127. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts +3 -0
  128. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts.map +1 -0
  129. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.js +12 -0
  130. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts +4 -0
  131. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts.map +1 -0
  132. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.js +18 -0
  133. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.d.ts +2 -0
  134. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.d.ts.map +1 -0
  135. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.js +9 -0
  136. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +21 -0
  137. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -0
  138. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +57 -0
  139. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +47 -0
  140. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -0
  141. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +107 -0
  142. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts +2 -0
  143. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts.map +1 -0
  144. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.js +10 -0
  145. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts +3 -0
  146. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts.map +1 -0
  147. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.js +12 -0
  148. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts +4 -0
  149. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts.map +1 -0
  150. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.js +18 -0
  151. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.d.ts +2 -0
  152. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.d.ts.map +1 -0
  153. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.js +9 -0
  154. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +28 -0
  155. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -0
  156. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/index.js +40 -0
  157. package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts +2 -0
  158. package/dest/node/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -0
  159. package/dest/node/barretenberg_wasm/fetch_code/browser/index.js +12 -0
  160. package/dest/node/barretenberg_wasm/fetch_code/index.d.ts +2 -0
  161. package/dest/node/barretenberg_wasm/fetch_code/index.d.ts.map +1 -0
  162. package/dest/node/barretenberg_wasm/fetch_code/index.js +2 -0
  163. package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts +2 -0
  164. package/dest/node/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -0
  165. package/dest/node/barretenberg_wasm/fetch_code/node/index.js +22 -0
  166. package/dest/node/barretenberg_wasm/helpers/browser/index.d.ts +6 -0
  167. package/dest/node/barretenberg_wasm/helpers/browser/index.d.ts.map +1 -0
  168. package/dest/node/barretenberg_wasm/helpers/browser/index.js +18 -0
  169. package/dest/node/barretenberg_wasm/helpers/index.d.ts +2 -0
  170. package/dest/node/barretenberg_wasm/helpers/index.d.ts.map +1 -0
  171. package/dest/node/barretenberg_wasm/helpers/index.js +2 -0
  172. package/dest/node/barretenberg_wasm/helpers/node/index.d.ts +22 -0
  173. package/dest/node/barretenberg_wasm/helpers/node/index.d.ts.map +1 -0
  174. package/dest/node/barretenberg_wasm/helpers/node/index.js +39 -0
  175. package/dest/node/barretenberg_wasm/helpers/node/node_endpoint.d.ts +8 -0
  176. package/dest/node/barretenberg_wasm/helpers/node/node_endpoint.d.ts.map +1 -0
  177. package/dest/node/barretenberg_wasm/helpers/node/node_endpoint.js +28 -0
  178. package/dest/node/barretenberg_wasm/index.d.ts +18 -0
  179. package/dest/node/barretenberg_wasm/index.d.ts.map +1 -0
  180. package/dest/node/barretenberg_wasm/index.js +45 -0
  181. package/dest/node/barretenberg_wasm/index.test.d.ts +2 -0
  182. package/dest/node/barretenberg_wasm/index.test.d.ts.map +1 -0
  183. package/dest/node/barretenberg_wasm/index.test.js +38 -0
  184. package/dest/node/benchmark/index.d.ts +3 -0
  185. package/dest/node/benchmark/index.d.ts.map +1 -0
  186. package/dest/node/benchmark/index.js +25 -0
  187. package/dest/node/benchmark/timer.d.ts +34 -0
  188. package/dest/node/benchmark/timer.d.ts.map +1 -0
  189. package/dest/node/benchmark/timer.js +41 -0
  190. package/dest/node/bigint-array/index.d.ts +3 -0
  191. package/dest/node/bigint-array/index.d.ts.map +1 -0
  192. package/dest/node/bigint-array/index.js +21 -0
  193. package/dest/node/bindgen/function_declaration.d.ts +11 -0
  194. package/dest/node/bindgen/function_declaration.d.ts.map +1 -0
  195. package/dest/node/bindgen/function_declaration.js +2 -0
  196. package/dest/node/bindgen/index.d.ts +2 -0
  197. package/dest/node/bindgen/index.d.ts.map +1 -0
  198. package/dest/node/bindgen/index.js +15 -0
  199. package/dest/node/bindgen/mappings.d.ts +4 -0
  200. package/dest/node/bindgen/mappings.d.ts.map +1 -0
  201. package/dest/node/bindgen/mappings.js +63 -0
  202. package/dest/node/bindgen/rust.d.ts +2 -0
  203. package/dest/node/bindgen/rust.d.ts.map +1 -0
  204. package/dest/node/bindgen/rust.js +43 -0
  205. package/dest/node/bindgen/to_camel_case.d.ts +2 -0
  206. package/dest/node/bindgen/to_camel_case.d.ts.map +1 -0
  207. package/dest/node/bindgen/to_camel_case.js +11 -0
  208. package/dest/node/bindgen/typescript.d.ts +2 -0
  209. package/dest/node/bindgen/typescript.d.ts.map +1 -0
  210. package/dest/node/bindgen/typescript.js +100 -0
  211. package/dest/node/crs/browser/cached_net_crs.d.ts +43 -0
  212. package/dest/node/crs/browser/cached_net_crs.d.ts.map +1 -0
  213. package/dest/node/crs/browser/cached_net_crs.js +90 -0
  214. package/dest/node/crs/browser/index.d.ts +2 -0
  215. package/dest/node/crs/browser/index.d.ts.map +1 -0
  216. package/dest/node/crs/browser/index.js +2 -0
  217. package/dest/node/crs/index.d.ts +2 -0
  218. package/dest/node/crs/index.d.ts.map +1 -0
  219. package/dest/node/crs/index.js +2 -0
  220. package/dest/node/crs/net_crs.d.ts +61 -0
  221. package/dest/node/crs/net_crs.d.ts.map +1 -0
  222. package/dest/node/crs/net_crs.js +97 -0
  223. package/dest/node/crs/node/ignition_files_crs.d.ts +38 -0
  224. package/dest/node/crs/node/ignition_files_crs.d.ts.map +1 -0
  225. package/dest/node/crs/node/ignition_files_crs.js +65 -0
  226. package/dest/node/crs/node/index.d.ts +36 -0
  227. package/dest/node/crs/node/index.d.ts.map +1 -0
  228. package/dest/node/crs/node/index.js +93 -0
  229. package/dest/node/examples/simple.rawtest.d.ts +2 -0
  230. package/dest/node/examples/simple.rawtest.d.ts.map +1 -0
  231. package/dest/node/examples/simple.rawtest.js +30 -0
  232. package/dest/node/examples/simple.test.d.ts +2 -0
  233. package/dest/node/examples/simple.test.d.ts.map +1 -0
  234. package/dest/node/examples/simple.test.js +23 -0
  235. package/dest/node/index.d.ts +5 -0
  236. package/dest/node/index.d.ts.map +1 -0
  237. package/dest/node/index.js +5 -0
  238. package/dest/node/main.d.ts +23 -0
  239. package/dest/node/main.d.ts.map +1 -0
  240. package/dest/node/main.js +712 -0
  241. package/dest/node/proof/index.d.ts +19 -0
  242. package/dest/node/proof/index.d.ts.map +1 -0
  243. package/dest/node/proof/index.js +85 -0
  244. package/dest/node/random/browser/index.d.ts +2 -0
  245. package/dest/node/random/browser/index.d.ts.map +1 -0
  246. package/dest/node/random/browser/index.js +31 -0
  247. package/dest/node/random/index.d.ts +2 -0
  248. package/dest/node/random/index.d.ts.map +1 -0
  249. package/dest/node/random/index.js +2 -0
  250. package/dest/node/random/node/index.d.ts +2 -0
  251. package/dest/node/random/node/index.d.ts.map +1 -0
  252. package/dest/node/random/node/index.js +5 -0
  253. package/dest/node/serialize/buffer_reader.d.ts +28 -0
  254. package/dest/node/serialize/buffer_reader.d.ts.map +1 -0
  255. package/dest/node/serialize/buffer_reader.js +66 -0
  256. package/dest/node/serialize/index.d.ts +4 -0
  257. package/dest/node/serialize/index.d.ts.map +1 -0
  258. package/dest/node/serialize/index.js +4 -0
  259. package/dest/node/serialize/output_type.d.ts +11 -0
  260. package/dest/node/serialize/output_type.d.ts.map +1 -0
  261. package/dest/node/serialize/output_type.js +44 -0
  262. package/dest/node/serialize/serialize.d.ts +53 -0
  263. package/dest/node/serialize/serialize.d.ts.map +1 -0
  264. package/dest/node/serialize/serialize.js +139 -0
  265. package/dest/node/types/fields.d.ts +43 -0
  266. package/dest/node/types/fields.d.ts.map +1 -0
  267. package/dest/node/types/fields.js +97 -0
  268. package/dest/node/types/fixed_size_buffer.d.ts +26 -0
  269. package/dest/node/types/fixed_size_buffer.d.ts.map +1 -0
  270. package/dest/node/types/fixed_size_buffer.js +51 -0
  271. package/dest/node/types/index.d.ts +6 -0
  272. package/dest/node/types/index.d.ts.map +1 -0
  273. package/dest/node/types/index.js +6 -0
  274. package/dest/node/types/point.d.ts +17 -0
  275. package/dest/node/types/point.d.ts.map +1 -0
  276. package/dest/node/types/point.js +31 -0
  277. package/dest/node/types/ptr.d.ts +13 -0
  278. package/dest/node/types/ptr.d.ts.map +1 -0
  279. package/dest/node/types/ptr.js +19 -0
  280. package/dest/node/types/raw_buffer.d.ts +3 -0
  281. package/dest/node/types/raw_buffer.d.ts.map +1 -0
  282. package/dest/node/types/raw_buffer.js +5 -0
  283. package/dest/node-cjs/async_map/index.d.ts +10 -0
  284. package/dest/node-cjs/async_map/index.d.ts.map +1 -0
  285. package/dest/node-cjs/async_map/index.js +20 -0
  286. package/dest/node-cjs/barretenberg/backend.d.ts +85 -0
  287. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -0
  288. package/dest/node-cjs/barretenberg/backend.js +253 -0
  289. package/dest/node-cjs/barretenberg/blake2s.test.d.ts +2 -0
  290. package/dest/node-cjs/barretenberg/blake2s.test.d.ts.map +1 -0
  291. package/dest/node-cjs/barretenberg/blake2s.test.js +56 -0
  292. package/dest/node-cjs/barretenberg/common.test.d.ts +2 -0
  293. package/dest/node-cjs/barretenberg/common.test.d.ts.map +1 -0
  294. package/dest/node-cjs/barretenberg/common.test.js +22 -0
  295. package/dest/node-cjs/barretenberg/index.d.ts +47 -0
  296. package/dest/node-cjs/barretenberg/index.d.ts.map +1 -0
  297. package/dest/node-cjs/barretenberg/index.js +106 -0
  298. package/dest/node-cjs/barretenberg/pedersen.test.d.ts +2 -0
  299. package/dest/node-cjs/barretenberg/pedersen.test.d.ts.map +1 -0
  300. package/dest/node-cjs/barretenberg/pedersen.test.js +57 -0
  301. package/dest/node-cjs/barretenberg/poseidon.test.d.ts +2 -0
  302. package/dest/node-cjs/barretenberg/poseidon.test.d.ts.map +1 -0
  303. package/dest/node-cjs/barretenberg/poseidon.test.js +37 -0
  304. package/dest/node-cjs/barretenberg/schnorr.test.d.ts +2 -0
  305. package/dest/node-cjs/barretenberg/schnorr.test.d.ts.map +1 -0
  306. package/dest/node-cjs/barretenberg/schnorr.test.js +115 -0
  307. package/dest/node-cjs/barretenberg/verifier.d.ts +16 -0
  308. package/dest/node-cjs/barretenberg/verifier.d.ts.map +1 -0
  309. package/dest/node-cjs/barretenberg/verifier.js +44 -0
  310. package/dest/node-cjs/barretenberg_api/index.d.ts +113 -0
  311. package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -0
  312. package/dest/node-cjs/barretenberg_api/index.js +733 -0
  313. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  314. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +44 -0
  315. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -0
  316. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.js +130 -0
  317. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts +2 -0
  318. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.d.ts.map +1 -0
  319. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.js +15 -0
  320. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts +3 -0
  321. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.d.ts.map +1 -0
  322. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.js +15 -0
  323. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts +4 -0
  324. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.d.ts.map +1 -0
  325. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.js +22 -0
  326. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.d.ts +2 -0
  327. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.d.ts.map +1 -0
  328. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.js +11 -0
  329. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts +21 -0
  330. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.d.ts.map +1 -0
  331. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.js +61 -0
  332. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +47 -0
  333. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -0
  334. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +112 -0
  335. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts +2 -0
  336. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.d.ts.map +1 -0
  337. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.js +15 -0
  338. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts +3 -0
  339. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.d.ts.map +1 -0
  340. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.js +15 -0
  341. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts +4 -0
  342. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.d.ts.map +1 -0
  343. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.js +22 -0
  344. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.d.ts +2 -0
  345. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.d.ts.map +1 -0
  346. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.js +11 -0
  347. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +28 -0
  348. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -0
  349. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/index.js +44 -0
  350. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts +2 -0
  351. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.d.ts.map +1 -0
  352. package/dest/node-cjs/barretenberg_wasm/fetch_code/browser/index.js +17 -0
  353. package/dest/node-cjs/barretenberg_wasm/fetch_code/index.d.ts +2 -0
  354. package/dest/node-cjs/barretenberg_wasm/fetch_code/index.d.ts.map +1 -0
  355. package/dest/node-cjs/barretenberg_wasm/fetch_code/index.js +5 -0
  356. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts +2 -0
  357. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.d.ts.map +1 -0
  358. package/dest/node-cjs/barretenberg_wasm/fetch_code/node/index.js +27 -0
  359. package/dest/node-cjs/barretenberg_wasm/helpers/browser/index.d.ts +6 -0
  360. package/dest/node-cjs/barretenberg_wasm/helpers/browser/index.d.ts.map +1 -0
  361. package/dest/node-cjs/barretenberg_wasm/helpers/browser/index.js +26 -0
  362. package/dest/node-cjs/barretenberg_wasm/helpers/index.d.ts +2 -0
  363. package/dest/node-cjs/barretenberg_wasm/helpers/index.d.ts.map +1 -0
  364. package/dest/node-cjs/barretenberg_wasm/helpers/index.js +5 -0
  365. package/dest/node-cjs/barretenberg_wasm/helpers/node/index.d.ts +22 -0
  366. package/dest/node-cjs/barretenberg_wasm/helpers/node/index.d.ts.map +1 -0
  367. package/dest/node-cjs/barretenberg_wasm/helpers/node/index.js +48 -0
  368. package/dest/node-cjs/barretenberg_wasm/helpers/node/node_endpoint.d.ts +8 -0
  369. package/dest/node-cjs/barretenberg_wasm/helpers/node/node_endpoint.d.ts.map +1 -0
  370. package/dest/node-cjs/barretenberg_wasm/helpers/node/node_endpoint.js +32 -0
  371. package/dest/node-cjs/barretenberg_wasm/index.d.ts +18 -0
  372. package/dest/node-cjs/barretenberg_wasm/index.d.ts.map +1 -0
  373. package/dest/node-cjs/barretenberg_wasm/index.js +51 -0
  374. package/dest/node-cjs/barretenberg_wasm/index.test.d.ts +2 -0
  375. package/dest/node-cjs/barretenberg_wasm/index.test.d.ts.map +1 -0
  376. package/dest/node-cjs/barretenberg_wasm/index.test.js +40 -0
  377. package/dest/node-cjs/benchmark/index.d.ts +3 -0
  378. package/dest/node-cjs/benchmark/index.d.ts.map +1 -0
  379. package/dest/node-cjs/benchmark/index.js +30 -0
  380. package/dest/node-cjs/benchmark/timer.d.ts +34 -0
  381. package/dest/node-cjs/benchmark/timer.d.ts.map +1 -0
  382. package/dest/node-cjs/benchmark/timer.js +45 -0
  383. package/dest/node-cjs/bigint-array/index.d.ts +3 -0
  384. package/dest/node-cjs/bigint-array/index.d.ts.map +1 -0
  385. package/dest/node-cjs/bigint-array/index.js +26 -0
  386. package/dest/node-cjs/bindgen/function_declaration.d.ts +11 -0
  387. package/dest/node-cjs/bindgen/function_declaration.d.ts.map +1 -0
  388. package/dest/node-cjs/bindgen/function_declaration.js +3 -0
  389. package/dest/node-cjs/bindgen/index.d.ts +2 -0
  390. package/dest/node-cjs/bindgen/index.d.ts.map +1 -0
  391. package/dest/node-cjs/bindgen/index.js +17 -0
  392. package/dest/node-cjs/bindgen/mappings.d.ts +4 -0
  393. package/dest/node-cjs/bindgen/mappings.d.ts.map +1 -0
  394. package/dest/node-cjs/bindgen/mappings.js +68 -0
  395. package/dest/node-cjs/bindgen/rust.d.ts +2 -0
  396. package/dest/node-cjs/bindgen/rust.d.ts.map +1 -0
  397. package/dest/node-cjs/bindgen/rust.js +48 -0
  398. package/dest/node-cjs/bindgen/to_camel_case.d.ts +2 -0
  399. package/dest/node-cjs/bindgen/to_camel_case.d.ts.map +1 -0
  400. package/dest/node-cjs/bindgen/to_camel_case.js +15 -0
  401. package/dest/node-cjs/bindgen/typescript.d.ts +2 -0
  402. package/dest/node-cjs/bindgen/typescript.d.ts.map +1 -0
  403. package/dest/node-cjs/bindgen/typescript.js +105 -0
  404. package/dest/node-cjs/crs/browser/cached_net_crs.d.ts +43 -0
  405. package/dest/node-cjs/crs/browser/cached_net_crs.d.ts.map +1 -0
  406. package/dest/node-cjs/crs/browser/cached_net_crs.js +95 -0
  407. package/dest/node-cjs/crs/browser/index.d.ts +2 -0
  408. package/dest/node-cjs/crs/browser/index.d.ts.map +1 -0
  409. package/dest/node-cjs/crs/browser/index.js +7 -0
  410. package/dest/node-cjs/crs/index.d.ts +2 -0
  411. package/dest/node-cjs/crs/index.d.ts.map +1 -0
  412. package/dest/node-cjs/crs/index.js +7 -0
  413. package/dest/node-cjs/crs/net_crs.d.ts +61 -0
  414. package/dest/node-cjs/crs/net_crs.d.ts.map +1 -0
  415. package/dest/node-cjs/crs/net_crs.js +102 -0
  416. package/dest/node-cjs/crs/node/ignition_files_crs.d.ts +38 -0
  417. package/dest/node-cjs/crs/node/ignition_files_crs.d.ts.map +1 -0
  418. package/dest/node-cjs/crs/node/ignition_files_crs.js +69 -0
  419. package/dest/node-cjs/crs/node/index.d.ts +36 -0
  420. package/dest/node-cjs/crs/node/index.d.ts.map +1 -0
  421. package/dest/node-cjs/crs/node/index.js +99 -0
  422. package/dest/node-cjs/examples/simple.rawtest.d.ts +2 -0
  423. package/dest/node-cjs/examples/simple.rawtest.d.ts.map +1 -0
  424. package/dest/node-cjs/examples/simple.rawtest.js +33 -0
  425. package/dest/node-cjs/examples/simple.test.d.ts +2 -0
  426. package/dest/node-cjs/examples/simple.test.d.ts.map +1 -0
  427. package/dest/node-cjs/examples/simple.test.js +25 -0
  428. package/dest/node-cjs/index.d.ts +5 -0
  429. package/dest/node-cjs/index.d.ts.map +1 -0
  430. package/dest/node-cjs/index.js +20 -0
  431. package/dest/node-cjs/main.d.ts +23 -0
  432. package/dest/node-cjs/main.d.ts.map +1 -0
  433. package/dest/node-cjs/main.js +735 -0
  434. package/dest/node-cjs/package.json +3 -0
  435. package/dest/node-cjs/proof/index.d.ts +19 -0
  436. package/dest/node-cjs/proof/index.d.ts.map +1 -0
  437. package/dest/node-cjs/proof/index.js +93 -0
  438. package/dest/node-cjs/random/browser/index.d.ts +2 -0
  439. package/dest/node-cjs/random/browser/index.d.ts.map +1 -0
  440. package/dest/node-cjs/random/browser/index.js +35 -0
  441. package/dest/node-cjs/random/index.d.ts +2 -0
  442. package/dest/node-cjs/random/index.d.ts.map +1 -0
  443. package/dest/node-cjs/random/index.js +5 -0
  444. package/dest/node-cjs/random/node/index.d.ts +2 -0
  445. package/dest/node-cjs/random/node/index.d.ts.map +1 -0
  446. package/dest/node-cjs/random/node/index.js +9 -0
  447. package/dest/node-cjs/serialize/buffer_reader.d.ts +28 -0
  448. package/dest/node-cjs/serialize/buffer_reader.d.ts.map +1 -0
  449. package/dest/node-cjs/serialize/buffer_reader.js +70 -0
  450. package/dest/node-cjs/serialize/index.d.ts +4 -0
  451. package/dest/node-cjs/serialize/index.d.ts.map +1 -0
  452. package/dest/node-cjs/serialize/index.js +7 -0
  453. package/dest/node-cjs/serialize/output_type.d.ts +11 -0
  454. package/dest/node-cjs/serialize/output_type.d.ts.map +1 -0
  455. package/dest/node-cjs/serialize/output_type.js +52 -0
  456. package/dest/node-cjs/serialize/serialize.d.ts +53 -0
  457. package/dest/node-cjs/serialize/serialize.d.ts.map +1 -0
  458. package/dest/node-cjs/serialize/serialize.js +161 -0
  459. package/dest/node-cjs/types/fields.d.ts +43 -0
  460. package/dest/node-cjs/types/fields.d.ts.map +1 -0
  461. package/dest/node-cjs/types/fields.js +102 -0
  462. package/dest/node-cjs/types/fixed_size_buffer.d.ts +26 -0
  463. package/dest/node-cjs/types/fixed_size_buffer.d.ts.map +1 -0
  464. package/dest/node-cjs/types/fixed_size_buffer.js +57 -0
  465. package/dest/node-cjs/types/index.d.ts +6 -0
  466. package/dest/node-cjs/types/index.d.ts.map +1 -0
  467. package/dest/node-cjs/types/index.js +9 -0
  468. package/dest/node-cjs/types/point.d.ts +17 -0
  469. package/dest/node-cjs/types/point.d.ts.map +1 -0
  470. package/dest/node-cjs/types/point.js +35 -0
  471. package/dest/node-cjs/types/ptr.d.ts +13 -0
  472. package/dest/node-cjs/types/ptr.d.ts.map +1 -0
  473. package/dest/node-cjs/types/ptr.js +23 -0
  474. package/dest/node-cjs/types/raw_buffer.d.ts +3 -0
  475. package/dest/node-cjs/types/raw_buffer.d.ts.map +1 -0
  476. package/dest/node-cjs/types/raw_buffer.js +9 -0
  477. package/package.json +105 -0
  478. package/src/async_map/index.ts +15 -0
  479. package/src/barretenberg/__snapshots__/pedersen.test.ts.snap +156 -0
  480. package/src/barretenberg/__snapshots__/poseidon.test.ts.snap +40 -0
  481. package/src/barretenberg/backend.ts +362 -0
  482. package/src/barretenberg/blake2s.test.ts +70 -0
  483. package/src/barretenberg/common.test.ts +23 -0
  484. package/src/barretenberg/index.ts +130 -0
  485. package/src/barretenberg/pedersen.test.ts +62 -0
  486. package/src/barretenberg/poseidon.test.ts +39 -0
  487. package/src/barretenberg/schnorr.test.ts +182 -0
  488. package/src/barretenberg/verifier.ts +55 -0
  489. package/src/barretenberg_api/index.ts +1305 -0
  490. package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +138 -0
  491. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.ts +10 -0
  492. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.ts +15 -0
  493. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.ts +18 -0
  494. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.ts +10 -0
  495. package/src/barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts +60 -0
  496. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +138 -0
  497. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.ts +10 -0
  498. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.ts +15 -0
  499. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.ts +18 -0
  500. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.ts +10 -0
  501. package/src/barretenberg_wasm/barretenberg_wasm_thread/index.ts +47 -0
  502. package/src/barretenberg_wasm/fetch_code/browser/index.ts +12 -0
  503. package/src/barretenberg_wasm/fetch_code/browser/wasm-module.d.ts +4 -0
  504. package/src/barretenberg_wasm/fetch_code/index.ts +1 -0
  505. package/src/barretenberg_wasm/fetch_code/node/index.ts +22 -0
  506. package/src/barretenberg_wasm/helpers/browser/index.ts +22 -0
  507. package/src/barretenberg_wasm/helpers/index.ts +1 -0
  508. package/src/barretenberg_wasm/helpers/node/index.ts +44 -0
  509. package/src/barretenberg_wasm/helpers/node/node_endpoint.ts +28 -0
  510. package/src/barretenberg_wasm/index.test.ts +45 -0
  511. package/src/barretenberg_wasm/index.ts +50 -0
  512. package/src/benchmark/index.ts +26 -0
  513. package/src/benchmark/timer.ts +45 -0
  514. package/src/bigint-array/index.ts +21 -0
  515. package/src/bindgen/function_declaration.ts +11 -0
  516. package/src/bindgen/index.ts +17 -0
  517. package/src/bindgen/mappings.ts +66 -0
  518. package/src/bindgen/rust.ts +52 -0
  519. package/src/bindgen/to_camel_case.ts +10 -0
  520. package/src/bindgen/typescript.ts +116 -0
  521. package/src/crs/browser/cached_net_crs.ts +99 -0
  522. package/src/crs/browser/index.ts +1 -0
  523. package/src/crs/index.ts +1 -0
  524. package/src/crs/net_crs.ts +115 -0
  525. package/src/crs/node/ignition_files_crs.ts +74 -0
  526. package/src/crs/node/index.ts +102 -0
  527. package/src/examples/simple.rawtest.ts +38 -0
  528. package/src/examples/simple.test.ts +28 -0
  529. package/src/index.html +9 -0
  530. package/src/index.ts +12 -0
  531. package/src/main.ts +834 -0
  532. package/src/proof/index.ts +120 -0
  533. package/src/random/browser/index.ts +32 -0
  534. package/src/random/index.ts +1 -0
  535. package/src/random/node/index.ts +5 -0
  536. package/src/serialize/buffer_reader.ts +82 -0
  537. package/src/serialize/index.ts +3 -0
  538. package/src/serialize/output_type.ts +53 -0
  539. package/src/serialize/serialize.ts +157 -0
  540. package/src/types/fields.ts +115 -0
  541. package/src/types/fixed_size_buffer.ts +59 -0
  542. package/src/types/index.ts +5 -0
  543. package/src/types/point.ts +35 -0
  544. package/src/types/ptr.ts +20 -0
  545. package/src/types/raw_buffer.ts +3 -0
@@ -0,0 +1,712 @@
1
+ #!/usr/bin/env node
2
+ import 'source-map-support/register.js';
3
+ import { Crs, GrumpkinCrs, Barretenberg, RawBuffer } from './index.js';
4
+ import createDebug from 'debug';
5
+ import { readFileSync, writeFileSync } from 'fs';
6
+ import { gunzipSync } from 'zlib';
7
+ import { ungzip } from 'pako';
8
+ import { Command } from 'commander';
9
+ import { decode } from '@msgpack/msgpack';
10
+ import { Timer, writeBenchmark } from './benchmark/index.js';
11
+ import path from 'path';
12
+ createDebug.log = console.error.bind(console);
13
+ const debug = createDebug('bb.js');
14
+ // Maximum circuit size for plonk we support in node and the browser is 2^19.
15
+ // This is because both node and browser use barretenberg.wasm which has a 4GB memory limit.
16
+ //
17
+ // This is not a restriction in the bb binary and one should be
18
+ // aware of this discrepancy, when creating proofs in bb versus
19
+ // creating the same proofs in the node CLI.
20
+ const MAX_ULTRAPLONK_CIRCUIT_SIZE_IN_WASM = 2 ** 19;
21
+ const threads = +process.env.HARDWARE_CONCURRENCY || undefined;
22
+ function getBytecode(bytecodePath) {
23
+ const extension = bytecodePath.substring(bytecodePath.lastIndexOf('.') + 1);
24
+ if (extension == 'json') {
25
+ const encodedCircuit = JSON.parse(readFileSync(bytecodePath, 'utf8'));
26
+ const decompressed = gunzipSync(Buffer.from(encodedCircuit.bytecode, 'base64'));
27
+ return decompressed;
28
+ }
29
+ const encodedCircuit = readFileSync(bytecodePath);
30
+ const decompressed = gunzipSync(encodedCircuit);
31
+ return decompressed;
32
+ }
33
+ function base64ToUint8Array(base64) {
34
+ const binaryString = atob(base64);
35
+ const len = binaryString.length;
36
+ const bytes = new Uint8Array(len);
37
+ for (let i = 0; i < len; i++) {
38
+ bytes[i] = binaryString.charCodeAt(i);
39
+ }
40
+ return bytes;
41
+ }
42
+ function readStack(bytecodePath, numToDrop = 0) {
43
+ const encodedPackedZippedBytecodeArray = readFileSync(bytecodePath, 'utf-8');
44
+ const packedZippedBytecodeArray = base64ToUint8Array(encodedPackedZippedBytecodeArray);
45
+ const zipped = decode(packedZippedBytecodeArray.subarray(0, packedZippedBytecodeArray.length - numToDrop));
46
+ const bytecodeArray = zipped.map((arr) => ungzip(arr));
47
+ return bytecodeArray;
48
+ }
49
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/1126): split this into separate Plonk and Honk functions as their gate count differs
50
+ async function getGatesUltra(bytecodePath, recursive, honkRecursion, api) {
51
+ const { total } = await computeCircuitSize(bytecodePath, recursive, honkRecursion, api);
52
+ return total;
53
+ }
54
+ function getWitness(witnessPath) {
55
+ const data = readFileSync(witnessPath);
56
+ const decompressed = gunzipSync(data);
57
+ return decompressed;
58
+ }
59
+ async function computeCircuitSize(bytecodePath, recursive, honkRecursion, api) {
60
+ debug(`computing circuit size...`);
61
+ const bytecode = getBytecode(bytecodePath);
62
+ const [total, subgroup] = await api.acirGetCircuitSizes(bytecode, recursive, honkRecursion);
63
+ return { total, subgroup };
64
+ }
65
+ async function initUltraPlonk(bytecodePath, recursive, crsPath, subgroupSizeOverride = -1, honkRecursion = false) {
66
+ const api = await Barretenberg.new({ threads });
67
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/1126): use specific UltraPlonk function
68
+ const circuitSize = await getGatesUltra(bytecodePath, recursive, honkRecursion, api);
69
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): remove subgroupSizeOverride hack for goblin
70
+ const subgroupSize = Math.max(subgroupSizeOverride, Math.pow(2, Math.ceil(Math.log2(circuitSize))));
71
+ if (subgroupSize > MAX_ULTRAPLONK_CIRCUIT_SIZE_IN_WASM) {
72
+ throw new Error(`Circuit size of ${subgroupSize} exceeds max supported of ${MAX_ULTRAPLONK_CIRCUIT_SIZE_IN_WASM}`);
73
+ }
74
+ debug(`circuit size: ${circuitSize}`);
75
+ debug(`subgroup size: ${subgroupSize}`);
76
+ debug('loading crs...');
77
+ // Plus 1 needed! (Move +1 into Crs?)
78
+ const crs = await Crs.new(subgroupSize + 1, crsPath);
79
+ // // Important to init slab allocator as first thing, to ensure maximum memory efficiency for Plonk.
80
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/1129): Do slab allocator initialization?
81
+ // await api.commonInitSlabAllocator(subgroupSize);
82
+ // Load CRS into wasm global CRS state.
83
+ // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
84
+ await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
85
+ const acirComposer = await api.acirNewAcirComposer(subgroupSize);
86
+ return { api, acirComposer, circuitSize, subgroupSize };
87
+ }
88
+ async function initUltraHonk(bytecodePath, recursive, crsPath) {
89
+ const api = await Barretenberg.new({ threads });
90
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/1126): use specific UltraHonk function
91
+ const circuitSize = await getGatesUltra(bytecodePath, recursive, /*honkRecursion=*/ true, api);
92
+ // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): remove subgroupSizeOverride hack for goblin
93
+ const dyadicCircuitSize = Math.pow(2, Math.ceil(Math.log2(circuitSize)));
94
+ debug(`circuit size: ${circuitSize}`);
95
+ debug(`dyadic circuit size size: ${dyadicCircuitSize}`);
96
+ debug('loading crs...');
97
+ const crs = await Crs.new(dyadicCircuitSize + 1, crsPath);
98
+ // Load CRS into wasm global CRS state.
99
+ // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
100
+ await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
101
+ return { api, circuitSize, dyadicCircuitSize };
102
+ }
103
+ async function initClientIVC(crsPath) {
104
+ const api = await Barretenberg.new({ threads });
105
+ debug('loading BN254 and Grumpkin crs...');
106
+ const crs = await Crs.new(2 ** 21 + 1, crsPath);
107
+ const grumpkinCrs = await GrumpkinCrs.new(2 ** 16 + 1, crsPath);
108
+ // Load CRS into wasm global CRS state.
109
+ // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
110
+ await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
111
+ await api.srsInitGrumpkinSrs(new RawBuffer(grumpkinCrs.getG1Data()), grumpkinCrs.numPoints);
112
+ return { api };
113
+ }
114
+ async function initLite(crsPath) {
115
+ const api = await Barretenberg.new({ threads: 1 });
116
+ // Plus 1 needed! (Move +1 into Crs?)
117
+ const crs = await Crs.new(1, crsPath);
118
+ // Load CRS into wasm global CRS state.
119
+ await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
120
+ const acirComposer = await api.acirNewAcirComposer(0);
121
+ return { api, acirComposer };
122
+ }
123
+ export async function proveAndVerify(bytecodePath, recursive, witnessPath, crsPath) {
124
+ /* eslint-disable camelcase */
125
+ const acir_test = path.basename(process.cwd());
126
+ const { api, acirComposer, circuitSize, subgroupSize } = await initUltraPlonk(bytecodePath, recursive, crsPath);
127
+ try {
128
+ debug(`creating proof...`);
129
+ const bytecode = getBytecode(bytecodePath);
130
+ const witness = getWitness(witnessPath);
131
+ const pkTimer = new Timer();
132
+ await api.acirInitProvingKey(acirComposer, bytecode, recursive);
133
+ writeBenchmark('pk_construction_time', pkTimer.ms(), { acir_test, threads });
134
+ writeBenchmark('gate_count', circuitSize, { acir_test, threads });
135
+ writeBenchmark('subgroup_size', subgroupSize, { acir_test, threads });
136
+ const proofTimer = new Timer();
137
+ const proof = await api.acirCreateProof(acirComposer, bytecode, recursive, witness);
138
+ writeBenchmark('proof_construction_time', proofTimer.ms(), { acir_test, threads });
139
+ debug(`verifying...`);
140
+ const verified = await api.acirVerifyProof(acirComposer, proof);
141
+ debug(`verified: ${verified}`);
142
+ return verified;
143
+ }
144
+ finally {
145
+ await api.destroy();
146
+ }
147
+ /* eslint-enable camelcase */
148
+ }
149
+ export async function proveAndVerifyUltraHonk(bytecodePath, recursive, witnessPath, crsPath) {
150
+ /* eslint-disable camelcase */
151
+ const { api } = await initUltraHonk(bytecodePath, false, crsPath);
152
+ try {
153
+ const bytecode = getBytecode(bytecodePath);
154
+ const witness = getWitness(witnessPath);
155
+ const verified = await api.acirProveAndVerifyUltraHonk(bytecode, recursive, witness);
156
+ return verified;
157
+ }
158
+ finally {
159
+ await api.destroy();
160
+ }
161
+ /* eslint-enable camelcase */
162
+ }
163
+ export async function proveAndVerifyMegaHonk(bytecodePath, recursive, witnessPath, crsPath) {
164
+ /* eslint-disable camelcase */
165
+ const { api } = await initUltraPlonk(bytecodePath, false, crsPath);
166
+ try {
167
+ const bytecode = getBytecode(bytecodePath);
168
+ const witness = getWitness(witnessPath);
169
+ const verified = await api.acirProveAndVerifyMegaHonk(bytecode, recursive, witness);
170
+ return verified;
171
+ }
172
+ finally {
173
+ await api.destroy();
174
+ }
175
+ /* eslint-enable camelcase */
176
+ }
177
+ export async function proveAndVerifyAztecClient(bytecodePath, witnessPath, crsPath) {
178
+ /* eslint-disable camelcase */
179
+ const { api } = await initClientIVC(crsPath);
180
+ try {
181
+ const bytecode = readStack(bytecodePath);
182
+ const witness = readStack(witnessPath);
183
+ const verified = await api.acirProveAndVerifyAztecClient(bytecode, witness);
184
+ console.log(`verified?: ${verified}`);
185
+ return verified;
186
+ }
187
+ finally {
188
+ await api.destroy();
189
+ }
190
+ /* eslint-enable camelcase */
191
+ }
192
+ export async function foldAndVerifyProgram(bytecodePath, recursive, witnessPath, crsPath) {
193
+ /* eslint-disable camelcase */
194
+ const { api } = await initClientIVC(crsPath);
195
+ try {
196
+ const bytecode = getBytecode(bytecodePath);
197
+ const witness = getWitness(witnessPath);
198
+ const verified = await api.acirFoldAndVerifyProgramStack(bytecode, recursive, witness);
199
+ debug(`verified: ${verified}`);
200
+ return verified;
201
+ }
202
+ finally {
203
+ await api.destroy();
204
+ }
205
+ /* eslint-enable camelcase */
206
+ }
207
+ export async function prove(bytecodePath, recursive, witnessPath, crsPath, outputPath) {
208
+ const { api, acirComposer } = await initUltraPlonk(bytecodePath, recursive, crsPath);
209
+ try {
210
+ debug(`creating proof...`);
211
+ const bytecode = getBytecode(bytecodePath);
212
+ const witness = getWitness(witnessPath);
213
+ const proof = await api.acirCreateProof(acirComposer, bytecode, recursive, witness);
214
+ debug(`done.`);
215
+ if (outputPath === '-') {
216
+ process.stdout.write(proof);
217
+ debug(`proof written to stdout`);
218
+ }
219
+ else {
220
+ writeFileSync(outputPath, proof);
221
+ debug(`proof written to: ${outputPath}`);
222
+ }
223
+ }
224
+ finally {
225
+ await api.destroy();
226
+ }
227
+ }
228
+ export async function gateCountUltra(bytecodePath, recursive, honkRecursion) {
229
+ const api = await Barretenberg.new({ threads: 1 });
230
+ try {
231
+ const numberOfGates = await getGatesUltra(bytecodePath, recursive, honkRecursion, api);
232
+ debug(`number of gates: : ${numberOfGates}`);
233
+ // Create an 8-byte buffer and write the number into it.
234
+ // Writing number directly to stdout will result in a variable sized
235
+ // input depending on the size.
236
+ const buffer = Buffer.alloc(8);
237
+ buffer.writeBigInt64LE(BigInt(numberOfGates));
238
+ process.stdout.write(buffer);
239
+ }
240
+ finally {
241
+ await api.destroy();
242
+ }
243
+ }
244
+ export async function verify(proofPath, vkPath, crsPath) {
245
+ const { api, acirComposer } = await initLite(crsPath);
246
+ try {
247
+ await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
248
+ const verified = await api.acirVerifyProof(acirComposer, readFileSync(proofPath));
249
+ debug(`verified: ${verified}`);
250
+ return verified;
251
+ }
252
+ finally {
253
+ await api.destroy();
254
+ }
255
+ }
256
+ export async function contract(outputPath, vkPath, crsPath) {
257
+ const { api, acirComposer } = await initLite(crsPath);
258
+ try {
259
+ await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
260
+ const contract = await api.acirGetSolidityVerifier(acirComposer);
261
+ if (outputPath === '-') {
262
+ process.stdout.write(contract);
263
+ debug(`contract written to stdout`);
264
+ }
265
+ else {
266
+ writeFileSync(outputPath, contract);
267
+ debug(`contract written to: ${outputPath}`);
268
+ }
269
+ }
270
+ finally {
271
+ await api.destroy();
272
+ }
273
+ }
274
+ export async function contractUltraHonk(bytecodePath, vkPath, crsPath, outputPath) {
275
+ const { api } = await initUltraHonk(bytecodePath, false, crsPath);
276
+ try {
277
+ console.log('bytecodePath', bytecodePath);
278
+ const bytecode = getBytecode(bytecodePath);
279
+ console.log('vkPath', vkPath);
280
+ const vk = new RawBuffer(readFileSync(vkPath));
281
+ const contract = await api.acirHonkSolidityVerifier(bytecode, vk);
282
+ if (outputPath === '-') {
283
+ process.stdout.write(contract);
284
+ debug(`contract written to stdout`);
285
+ }
286
+ else {
287
+ writeFileSync(outputPath, contract);
288
+ debug(`contract written to: ${outputPath}`);
289
+ }
290
+ }
291
+ finally {
292
+ await api.destroy();
293
+ }
294
+ }
295
+ export async function writeVk(bytecodePath, recursive, crsPath, outputPath) {
296
+ const { api, acirComposer } = await initUltraPlonk(bytecodePath, recursive, crsPath);
297
+ try {
298
+ debug('initing proving key...');
299
+ const bytecode = getBytecode(bytecodePath);
300
+ await api.acirInitProvingKey(acirComposer, bytecode, recursive);
301
+ debug('initing verification key...');
302
+ const vk = await api.acirGetVerificationKey(acirComposer);
303
+ if (outputPath === '-') {
304
+ process.stdout.write(vk);
305
+ debug(`vk written to stdout`);
306
+ }
307
+ else {
308
+ writeFileSync(outputPath, vk);
309
+ debug(`vk written to: ${outputPath}`);
310
+ }
311
+ }
312
+ finally {
313
+ await api.destroy();
314
+ }
315
+ }
316
+ export async function writePk(bytecodePath, recursive, crsPath, outputPath) {
317
+ const { api, acirComposer } = await initUltraPlonk(bytecodePath, recursive, crsPath);
318
+ try {
319
+ debug('initing proving key...');
320
+ const bytecode = getBytecode(bytecodePath);
321
+ const pk = await api.acirGetProvingKey(acirComposer, bytecode, recursive);
322
+ if (outputPath === '-') {
323
+ process.stdout.write(pk);
324
+ debug(`pk written to stdout`);
325
+ }
326
+ else {
327
+ writeFileSync(outputPath, pk);
328
+ debug(`pk written to: ${outputPath}`);
329
+ }
330
+ }
331
+ finally {
332
+ await api.destroy();
333
+ }
334
+ }
335
+ export async function proofAsFields(proofPath, vkPath, outputPath, crsPath) {
336
+ const { api, acirComposer } = await initLite(crsPath);
337
+ try {
338
+ debug('serializing proof byte array into field elements');
339
+ const numPublicInputs = readFileSync(vkPath).readUint32BE(8);
340
+ const proofAsFields = await api.acirSerializeProofIntoFields(acirComposer, readFileSync(proofPath), numPublicInputs);
341
+ const jsonProofAsFields = JSON.stringify(proofAsFields.map(f => f.toString()));
342
+ if (outputPath === '-') {
343
+ process.stdout.write(jsonProofAsFields);
344
+ debug(`proofAsFields written to stdout`);
345
+ }
346
+ else {
347
+ writeFileSync(outputPath, jsonProofAsFields);
348
+ debug(`proofAsFields written to: ${outputPath}`);
349
+ }
350
+ debug('done.');
351
+ }
352
+ finally {
353
+ await api.destroy();
354
+ }
355
+ }
356
+ export async function vkAsFields(vkPath, vkeyOutputPath, crsPath) {
357
+ const { api, acirComposer } = await initLite(crsPath);
358
+ try {
359
+ debug('serializing vk byte array into field elements');
360
+ await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
361
+ const [vkAsFields, vkHash] = await api.acirSerializeVerificationKeyIntoFields(acirComposer);
362
+ const output = [vkHash, ...vkAsFields].map(f => f.toString());
363
+ const jsonVKAsFields = JSON.stringify(output);
364
+ if (vkeyOutputPath === '-') {
365
+ process.stdout.write(jsonVKAsFields);
366
+ debug(`vkAsFields written to stdout`);
367
+ }
368
+ else {
369
+ writeFileSync(vkeyOutputPath, jsonVKAsFields);
370
+ debug(`vkAsFields written to: ${vkeyOutputPath}`);
371
+ }
372
+ debug('done.');
373
+ }
374
+ finally {
375
+ await api.destroy();
376
+ }
377
+ }
378
+ export async function proveUltraHonk(bytecodePath, recursive, witnessPath, crsPath, outputPath, options) {
379
+ const { api } = await initUltraHonk(bytecodePath, recursive, crsPath);
380
+ try {
381
+ debug(`creating proof...`);
382
+ const bytecode = getBytecode(bytecodePath);
383
+ const witness = getWitness(witnessPath);
384
+ const acirProveUltraHonk = options?.keccak
385
+ ? api.acirProveUltraKeccakHonk.bind(api)
386
+ : api.acirProveUltraHonk.bind(api);
387
+ const proof = await acirProveUltraHonk(bytecode, recursive, witness);
388
+ debug(`done.`);
389
+ if (outputPath === '-') {
390
+ process.stdout.write(proof);
391
+ debug(`proof written to stdout`);
392
+ }
393
+ else {
394
+ writeFileSync(outputPath, proof);
395
+ debug(`proof written to: ${outputPath}`);
396
+ }
397
+ }
398
+ finally {
399
+ await api.destroy();
400
+ }
401
+ }
402
+ export async function writeVkUltraHonk(bytecodePath, recursive, crsPath, outputPath, options) {
403
+ const { api } = await initUltraHonk(bytecodePath, recursive, crsPath);
404
+ try {
405
+ const bytecode = getBytecode(bytecodePath);
406
+ debug('initing verification key...');
407
+ const acirWriteVkUltraHonk = options?.keccak
408
+ ? api.acirWriteVkUltraKeccakHonk.bind(api)
409
+ : api.acirWriteVkUltraHonk.bind(api);
410
+ const vk = await acirWriteVkUltraHonk(bytecode, recursive);
411
+ if (outputPath === '-') {
412
+ process.stdout.write(vk);
413
+ debug(`vk written to stdout`);
414
+ }
415
+ else {
416
+ writeFileSync(outputPath, vk);
417
+ debug(`vk written to: ${outputPath}`);
418
+ }
419
+ }
420
+ finally {
421
+ await api.destroy();
422
+ }
423
+ }
424
+ export async function verifyUltraHonk(proofPath, vkPath, crsPath, options) {
425
+ const { api } = await initLite(crsPath);
426
+ try {
427
+ const acirVerifyUltraHonk = options?.keccak
428
+ ? api.acirVerifyUltraKeccakHonk.bind(api)
429
+ : api.acirVerifyUltraHonk.bind(api);
430
+ const verified = await acirVerifyUltraHonk(readFileSync(proofPath), new RawBuffer(readFileSync(vkPath)));
431
+ debug(`verified: ${verified}`);
432
+ return verified;
433
+ }
434
+ finally {
435
+ await api.destroy();
436
+ }
437
+ }
438
+ export async function proofAsFieldsUltraHonk(proofPath, outputPath, crsPath) {
439
+ const { api } = await initLite(crsPath);
440
+ try {
441
+ debug('outputting proof as vector of fields');
442
+ const proofAsFields = await api.acirProofAsFieldsUltraHonk(readFileSync(proofPath));
443
+ const jsonProofAsFields = JSON.stringify(proofAsFields.map(f => f.toString()));
444
+ if (outputPath === '-') {
445
+ process.stdout.write(jsonProofAsFields);
446
+ debug(`proofAsFieldsUltraHonk written to stdout`);
447
+ }
448
+ else {
449
+ writeFileSync(outputPath, jsonProofAsFields);
450
+ debug(`proofAsFieldsUltraHonk written to: ${outputPath}`);
451
+ }
452
+ debug('done.');
453
+ }
454
+ finally {
455
+ await api.destroy();
456
+ }
457
+ }
458
+ export async function vkAsFieldsUltraHonk(vkPath, vkeyOutputPath, crsPath) {
459
+ const { api } = await initLite(crsPath);
460
+ try {
461
+ debug('serializing vk byte array into field elements');
462
+ const vkAsFields = await api.acirVkAsFieldsUltraHonk(new RawBuffer(readFileSync(vkPath)));
463
+ const jsonVKAsFields = JSON.stringify(vkAsFields.map(f => f.toString()));
464
+ if (vkeyOutputPath === '-') {
465
+ process.stdout.write(jsonVKAsFields);
466
+ debug(`vkAsFieldsUltraHonk written to stdout`);
467
+ }
468
+ else {
469
+ writeFileSync(vkeyOutputPath, jsonVKAsFields);
470
+ debug(`vkAsFieldsUltraHonk written to: ${vkeyOutputPath}`);
471
+ }
472
+ debug('done.');
473
+ }
474
+ finally {
475
+ await api.destroy();
476
+ }
477
+ }
478
+ const program = new Command('bb');
479
+ program.option('-v, --verbose', 'enable verbose logging', false);
480
+ program.option('-c, --crs-path <path>', 'set crs path', './crs');
481
+ function handleGlobalOptions() {
482
+ if (program.opts().verbose) {
483
+ createDebug.enable('bb.js*');
484
+ }
485
+ return { crsPath: program.opts().crsPath };
486
+ }
487
+ program
488
+ .command('prove_and_verify')
489
+ .description('Generate a proof and verify it. Process exits with success or failure code.')
490
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
491
+ .option('-r, --recursive', 'Whether to use a SNARK friendly proof', false)
492
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
493
+ .action(async ({ bytecodePath, recursive, witnessPath }) => {
494
+ const { crsPath } = handleGlobalOptions();
495
+ const result = await proveAndVerify(bytecodePath, recursive, witnessPath, crsPath);
496
+ process.exit(result ? 0 : 1);
497
+ });
498
+ program
499
+ .command('prove_and_verify_ultra_honk')
500
+ .description('Generate an UltraHonk proof and verify it. Process exits with success or failure code.')
501
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
502
+ .option('-r, --recursive', 'Whether to use a SNARK friendly proof', false)
503
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
504
+ .action(async ({ bytecodePath, recursive, witnessPath }) => {
505
+ const { crsPath } = handleGlobalOptions();
506
+ const result = await proveAndVerifyUltraHonk(bytecodePath, recursive, witnessPath, crsPath);
507
+ process.exit(result ? 0 : 1);
508
+ });
509
+ program
510
+ .command('prove_and_verify_mega_honk')
511
+ .description('Generate a MegaHonk proof and verify it. Process exits with success or failure code.')
512
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
513
+ .option('-r, --recursive', 'Whether to use a SNARK friendly proof', false)
514
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
515
+ .action(async ({ bytecodePath, recursive, witnessPath }) => {
516
+ const { crsPath } = handleGlobalOptions();
517
+ const result = await proveAndVerifyMegaHonk(bytecodePath, recursive, witnessPath, crsPath);
518
+ process.exit(result ? 0 : 1);
519
+ });
520
+ program
521
+ .command('client_ivc_prove_and_verify')
522
+ .description('Generate a ClientIVC proof.')
523
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/acir.msgpack.b64')
524
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witnesses.msgpack.b64')
525
+ .action(async ({ bytecodePath, witnessPath }) => {
526
+ const { crsPath } = handleGlobalOptions();
527
+ const result = await proveAndVerifyAztecClient(bytecodePath, witnessPath, crsPath);
528
+ process.exit(result ? 0 : 1);
529
+ });
530
+ program
531
+ .command('fold_and_verify_program')
532
+ .description('Accumulate a set of circuits using ClientIvc then verify. Process exits with success or failure code.')
533
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
534
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
535
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
536
+ .action(async ({ bytecodePath, recursive, witnessPath }) => {
537
+ const { crsPath } = handleGlobalOptions();
538
+ const result = await foldAndVerifyProgram(bytecodePath, recursive, witnessPath, crsPath);
539
+ process.exit(result ? 0 : 1);
540
+ });
541
+ program
542
+ .command('prove')
543
+ .description('Generate a proof and write it to a file.')
544
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
545
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
546
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
547
+ .option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
548
+ .action(async ({ bytecodePath, recursive, witnessPath, outputPath }) => {
549
+ const { crsPath } = handleGlobalOptions();
550
+ await prove(bytecodePath, recursive, witnessPath, crsPath, outputPath);
551
+ });
552
+ program
553
+ .command('gates')
554
+ .description('Print Ultra Builder gate count to standard output.')
555
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
556
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
557
+ .option('-hr, --honk-recursion', 'Specify whether to use UltraHonk recursion', false)
558
+ .action(async ({ bytecodePath, recursive, honkRecursion: honkRecursion }) => {
559
+ handleGlobalOptions();
560
+ await gateCountUltra(bytecodePath, recursive, honkRecursion);
561
+ });
562
+ program
563
+ .command('verify')
564
+ .description('Verify a proof. Process exists with success or failure code.')
565
+ .requiredOption('-p, --proof-path <path>', 'Specify the path to the proof')
566
+ .requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
567
+ .action(async ({ proofPath, vk }) => {
568
+ const { crsPath } = handleGlobalOptions();
569
+ const result = await verify(proofPath, vk, crsPath);
570
+ process.exit(result ? 0 : 1);
571
+ });
572
+ program
573
+ .command('contract')
574
+ .description('Output solidity verification key contract.')
575
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
576
+ .option('-o, --output-path <path>', 'Specify the path to write the contract', './target/contract.sol')
577
+ .requiredOption('-k, --vk-path <path>', 'Path to a verification key. avoids recomputation.')
578
+ .action(async ({ outputPath, vkPath }) => {
579
+ const { crsPath } = handleGlobalOptions();
580
+ await contract(outputPath, vkPath, crsPath);
581
+ });
582
+ program
583
+ .command('contract_ultra_honk')
584
+ .description('Output solidity verification key contract.')
585
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
586
+ .option('-o, --output-path <path>', 'Specify the path to write the contract', './target/contract.sol')
587
+ .requiredOption('-k, --vk-path <path>', 'Path to a verification key.')
588
+ .action(async ({ bytecodePath, outputPath, vkPath, crsPath }) => {
589
+ handleGlobalOptions();
590
+ await contractUltraHonk(bytecodePath, vkPath, crsPath, outputPath);
591
+ });
592
+ program
593
+ .command('write_vk')
594
+ .description('Output verification key.')
595
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
596
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
597
+ .option('-o, --output-path <path>', 'Specify the path to write the key')
598
+ .action(async ({ bytecodePath, recursive, outputPath }) => {
599
+ const { crsPath } = handleGlobalOptions();
600
+ await writeVk(bytecodePath, recursive, crsPath, outputPath);
601
+ });
602
+ program
603
+ .command('write_pk')
604
+ .description('Output proving key.')
605
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
606
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
607
+ .requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
608
+ .action(async ({ bytecodePath, recursive, outputPath }) => {
609
+ const { crsPath } = handleGlobalOptions();
610
+ await writePk(bytecodePath, recursive, crsPath, outputPath);
611
+ });
612
+ program
613
+ .command('proof_as_fields')
614
+ .description('Return the proof as fields elements')
615
+ .requiredOption('-p, --proof-path <path>', 'Specify the proof path')
616
+ .requiredOption('-k, --vk-path <path>', 'Path to verification key.')
617
+ .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the proof fields')
618
+ .action(async ({ proofPath, vkPath, outputPath }) => {
619
+ const { crsPath } = handleGlobalOptions();
620
+ await proofAsFields(proofPath, vkPath, outputPath, crsPath);
621
+ });
622
+ program
623
+ .command('vk_as_fields')
624
+ .description('Return the verification key represented as fields elements. Also return the verification key hash.')
625
+ .requiredOption('-k, --vk-path <path>', 'Path to verification key.')
626
+ .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the verification key fields and key hash')
627
+ .action(async ({ vkPath, outputPath }) => {
628
+ const { crsPath } = handleGlobalOptions();
629
+ await vkAsFields(vkPath, outputPath, crsPath);
630
+ });
631
+ program
632
+ .command('prove_ultra_honk')
633
+ .description('Generate a proof and write it to a file.')
634
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
635
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
636
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
637
+ .option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
638
+ .action(async ({ bytecodePath, recursive, witnessPath, outputPath }) => {
639
+ const { crsPath } = handleGlobalOptions();
640
+ await proveUltraHonk(bytecodePath, recursive, witnessPath, crsPath, outputPath);
641
+ });
642
+ program
643
+ .command('prove_ultra_keccak_honk')
644
+ .description('Generate a proof and write it to a file.')
645
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
646
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
647
+ .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
648
+ .option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
649
+ .action(async ({ bytecodePath, recursive, witnessPath, outputPath, crsPath }) => {
650
+ handleGlobalOptions();
651
+ await proveUltraHonk(bytecodePath, recursive, witnessPath, crsPath, outputPath, { keccak: true });
652
+ });
653
+ program
654
+ .command('write_vk_ultra_honk')
655
+ .description('Output verification key.')
656
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
657
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
658
+ .requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
659
+ .action(async ({ bytecodePath, recursive, outputPath }) => {
660
+ const { crsPath } = handleGlobalOptions();
661
+ await writeVkUltraHonk(bytecodePath, recursive, crsPath, outputPath);
662
+ });
663
+ program
664
+ .command('write_vk_ultra_keccak_honk')
665
+ .description('Output verification key.')
666
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
667
+ .option('-r, --recursive', 'Create a SNARK friendly proof', false)
668
+ .requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
669
+ .action(async ({ bytecodePath, recursive, outputPath, crsPath }) => {
670
+ handleGlobalOptions();
671
+ await writeVkUltraHonk(bytecodePath, recursive, crsPath, outputPath, { keccak: true });
672
+ });
673
+ program
674
+ .command('verify_ultra_honk')
675
+ .description('Verify a proof. Process exists with success or failure code.')
676
+ .requiredOption('-p, --proof-path <path>', 'Specify the path to the proof')
677
+ .requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
678
+ .action(async ({ proofPath, vk }) => {
679
+ const { crsPath } = handleGlobalOptions();
680
+ const result = await verifyUltraHonk(proofPath, vk, crsPath);
681
+ process.exit(result ? 0 : 1);
682
+ });
683
+ program
684
+ .command('verify_ultra_keccak_honk')
685
+ .description('Verify a proof. Process exists with success or failure code.')
686
+ .requiredOption('-p, --proof-path <path>', 'Specify the path to the proof')
687
+ .requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
688
+ .action(async ({ proofPath, vk }) => {
689
+ const { crsPath } = handleGlobalOptions();
690
+ const result = await verifyUltraHonk(proofPath, vk, crsPath, { keccak: true });
691
+ process.exit(result ? 0 : 1);
692
+ });
693
+ program
694
+ .command('proof_as_fields_honk')
695
+ .description('Return the proof as fields elements')
696
+ .requiredOption('-p, --proof-path <path>', 'Specify the proof path')
697
+ .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the proof fields')
698
+ .action(async ({ proofPath, outputPath }) => {
699
+ const { crsPath } = handleGlobalOptions();
700
+ await proofAsFieldsUltraHonk(proofPath, outputPath, crsPath);
701
+ });
702
+ program
703
+ .command('vk_as_fields_ultra_honk')
704
+ .description('Return the verification key represented as fields elements.')
705
+ .requiredOption('-k, --vk-path <path>', 'Path to verification key.')
706
+ .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the verification key fields.')
707
+ .action(async ({ vkPath, outputPath }) => {
708
+ const { crsPath } = handleGlobalOptions();
709
+ await vkAsFieldsUltraHonk(vkPath, outputPath, crsPath);
710
+ });
711
+ program.name('bb.js').parse(process.argv);
712
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkUsT0FBTyxXQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixXQUFXLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVuQyw2RUFBNkU7QUFDN0UsNEZBQTRGO0FBQzVGLEVBQUU7QUFDRiwrREFBK0Q7QUFDL0QsK0RBQStEO0FBQy9ELDRDQUE0QztBQUM1QyxNQUFNLG1DQUFtQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFxQixJQUFJLFNBQVMsQ0FBQztBQUVoRSxTQUFTLFdBQVcsQ0FBQyxZQUFvQjtJQUN2QyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLFlB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