@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.023c3e5

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 (528) hide show
  1. package/README.md +8 -0
  2. package/dest/client.d.ts +6 -4
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +6 -9
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +1 -2
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/common/stats/index.d.ts +1 -1
  12. package/dest/common/stats/stats.d.ts +1 -1
  13. package/dest/private/acvm/acvm.d.ts +15 -7
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +14 -19
  16. package/dest/private/acvm/acvm_types.d.ts +2 -2
  17. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.d.ts +19 -20
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +32 -24
  21. package/dest/private/acvm/index.d.ts +1 -2
  22. package/dest/private/acvm/index.d.ts.map +1 -1
  23. package/dest/private/acvm/index.js +0 -1
  24. package/dest/private/acvm/serialize.d.ts +21 -4
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +54 -1
  27. package/dest/private/acvm_native.d.ts +41 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +34 -26
  30. package/dest/private/acvm_wasm.d.ts +16 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/acvm_wasm.js +65 -0
  33. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  34. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  35. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  36. package/dest/private/circuit_recording/circuit_recorder.d.ts +109 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +212 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +32 -0
  40. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  41. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +10 -0
  43. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  44. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  46. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  47. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  48. package/dest/private/circuit_simulator.d.ts +35 -0
  49. package/dest/private/circuit_simulator.d.ts.map +1 -0
  50. package/dest/private/circuit_simulator.js +43 -0
  51. package/dest/private/factory.d.ts +12 -0
  52. package/dest/private/factory.d.ts.map +1 -0
  53. package/dest/private/{providers/factory.js → factory.js} +8 -5
  54. package/dest/public/avm/avm_context.d.ts +8 -8
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +8 -6
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +12 -8
  59. package/dest/public/avm/avm_execution_environment.d.ts +9 -6
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +5 -3
  62. package/dest/public/avm/avm_gas.d.ts +5 -21
  63. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  64. package/dest/public/avm/avm_gas.js +27 -35
  65. package/dest/public/avm/avm_machine_state.d.ts +9 -6
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +5 -2
  68. package/dest/public/avm/avm_memory_types.d.ts +100 -89
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +21 -7
  71. package/dest/public/avm/avm_simulator.d.ts +8 -7
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +32 -42
  74. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  75. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  76. package/dest/public/avm/avm_simulator_interface.js +3 -0
  77. package/dest/public/avm/calldata.d.ts +51 -0
  78. package/dest/public/avm/calldata.d.ts.map +1 -0
  79. package/dest/public/avm/calldata.js +63 -0
  80. package/dest/public/avm/errors.d.ts +11 -29
  81. package/dest/public/avm/errors.d.ts.map +1 -1
  82. package/dest/public/avm/errors.js +19 -57
  83. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  84. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/avm_simulation_tester.js +26 -18
  86. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  87. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  88. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  89. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  90. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/initializers.js +45 -0
  92. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  93. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  94. package/dest/public/avm/fixtures/utils.js +96 -0
  95. package/dest/public/avm/index.d.ts +1 -3
  96. package/dest/public/avm/index.d.ts.map +1 -1
  97. package/dest/public/avm/index.js +0 -2
  98. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  99. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/accrued_substate.js +58 -55
  101. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  102. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  104. package/dest/public/avm/opcodes/arithmetic.d.ts +14 -2
  105. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  107. package/dest/public/avm/opcodes/bitwise.d.ts +8 -16
  108. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/bitwise.js +22 -29
  110. package/dest/public/avm/opcodes/comparators.d.ts +1 -1
  111. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/comparators.js +3 -3
  113. package/dest/public/avm/opcodes/contract.d.ts +3 -4
  114. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/contract.js +11 -12
  116. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  117. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/control_flow.js +13 -11
  119. package/dest/public/avm/opcodes/conversion.d.ts +4 -3
  120. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/conversion.js +270 -6
  122. package/dest/public/avm/opcodes/ec_add.d.ts +3 -3
  123. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/ec_add.js +21 -12
  125. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  126. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/environment_getters.js +20 -22
  128. package/dest/public/avm/opcodes/external_calls.d.ts +14 -13
  129. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/external_calls.js +52 -46
  131. package/dest/public/avm/opcodes/hashing.d.ts +7 -7
  132. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/hashing.js +24 -19
  134. package/dest/public/avm/opcodes/index.d.ts +1 -1
  135. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  136. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/instruction.js +23 -19
  138. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  139. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  140. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  141. package/dest/public/avm/opcodes/memory.d.ts +15 -15
  142. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  143. package/dest/public/avm/opcodes/memory.js +52 -48
  144. package/dest/public/avm/opcodes/misc.d.ts +4 -3
  145. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  146. package/dest/public/avm/opcodes/misc.js +42 -17
  147. package/dest/public/avm/opcodes/storage.d.ts +14 -13
  148. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  149. package/dest/public/avm/opcodes/storage.js +39 -27
  150. package/dest/public/avm/revert_reason.d.ts +18 -0
  151. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  152. package/dest/public/avm/revert_reason.js +39 -0
  153. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  154. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  155. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  156. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  157. package/dest/public/avm/serialization/bytecode_serialization.js +79 -75
  158. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  159. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  160. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  161. package/dest/public/avm/test_utils.d.ts +12 -15
  162. package/dest/public/avm/test_utils.d.ts.map +1 -1
  163. package/dest/public/avm/test_utils.js +17 -25
  164. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  165. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  166. package/dest/public/contracts_db_checkpoint.js +30 -0
  167. package/dest/public/db_interfaces.d.ts +68 -0
  168. package/dest/public/db_interfaces.d.ts.map +1 -0
  169. package/dest/public/db_interfaces.js +3 -0
  170. package/dest/public/debug_fn_name.d.ts +18 -0
  171. package/dest/public/debug_fn_name.d.ts.map +1 -0
  172. package/dest/public/debug_fn_name.js +37 -0
  173. package/dest/public/executor_metrics.d.ts +12 -4
  174. package/dest/public/executor_metrics.d.ts.map +1 -1
  175. package/dest/public/executor_metrics.js +33 -23
  176. package/dest/public/executor_metrics_interface.d.ts +10 -0
  177. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  178. package/dest/public/executor_metrics_interface.js +1 -0
  179. package/dest/public/fixtures/amm_test.d.ts +10 -0
  180. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  181. package/dest/public/fixtures/amm_test.js +213 -0
  182. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  183. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  184. package/dest/public/fixtures/bulk_test.js +262 -0
  185. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  186. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  187. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  188. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  189. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  190. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  191. package/dest/public/fixtures/index.d.ts +10 -1
  192. package/dest/public/fixtures/index.d.ts.map +1 -1
  193. package/dest/public/fixtures/index.js +9 -0
  194. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  195. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  196. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  197. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  198. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  199. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  200. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +55 -15
  201. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  202. package/dest/public/fixtures/public_tx_simulation_tester.js +138 -72
  203. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  204. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  205. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  206. package/dest/public/fixtures/token_test.d.ts +12 -0
  207. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  208. package/dest/public/fixtures/token_test.js +96 -0
  209. package/dest/public/fixtures/utils.d.ts +18 -5
  210. package/dest/public/fixtures/utils.d.ts.map +1 -1
  211. package/dest/public/fixtures/utils.js +102 -59
  212. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  213. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  214. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  215. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  216. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  217. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  218. package/dest/public/hinting_db_sources.d.ts +80 -0
  219. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  220. package/dest/public/hinting_db_sources.js +355 -0
  221. package/dest/public/index.d.ts +6 -9
  222. package/dest/public/index.d.ts.map +1 -1
  223. package/dest/public/index.js +4 -7
  224. package/dest/public/public_db_sources.d.ts +54 -103
  225. package/dest/public/public_db_sources.d.ts.map +1 -1
  226. package/dest/public/public_db_sources.js +222 -195
  227. package/dest/public/public_errors.d.ts +12 -0
  228. package/dest/public/public_errors.d.ts.map +1 -0
  229. package/dest/public/public_errors.js +13 -0
  230. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  231. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  232. package/dest/public/public_processor/guarded_merkle_tree.js +113 -0
  233. package/dest/public/public_processor/public_processor.d.ts +28 -38
  234. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  235. package/dest/public/public_processor/public_processor.js +576 -136
  236. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -4
  237. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  238. package/dest/public/public_processor/public_processor_metrics.js +29 -46
  239. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
  240. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  241. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  242. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  243. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  244. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +132 -0
  245. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  246. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  247. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  248. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  249. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  250. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  251. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  252. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  253. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  254. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  255. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  256. package/dest/public/public_tx_simulator/factories.js +28 -0
  257. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  258. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  259. package/dest/public/public_tx_simulator/index.js +5 -0
  260. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  261. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  262. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  263. package/dest/public/public_tx_simulator/public_tx_context.d.ts +25 -31
  264. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  265. package/dest/public/public_tx_simulator/public_tx_context.js +75 -95
  266. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +38 -58
  267. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  268. package/dest/public/public_tx_simulator/public_tx_simulator.js +220 -207
  269. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  270. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  271. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  272. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  273. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  274. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
  275. package/dest/public/side_effect_errors.d.ts +42 -2
  276. package/dest/public/side_effect_errors.d.ts.map +1 -1
  277. package/dest/public/side_effect_errors.js +70 -1
  278. package/dest/public/side_effect_trace.d.ts +24 -69
  279. package/dest/public/side_effect_trace.d.ts.map +1 -1
  280. package/dest/public/side_effect_trace.js +74 -124
  281. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  282. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  283. package/dest/public/state_manager/index.d.ts +2 -0
  284. package/dest/public/state_manager/index.d.ts.map +1 -0
  285. package/dest/public/state_manager/index.js +1 -0
  286. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  287. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  288. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  289. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  290. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  291. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  292. package/dest/public/state_manager/state_manager.d.ts +170 -0
  293. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  294. package/dest/public/state_manager/state_manager.js +402 -0
  295. package/dest/public/test_executor_metrics.d.ts +56 -0
  296. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  297. package/dest/public/test_executor_metrics.js +307 -0
  298. package/dest/public/unique_class_ids.d.ts +1 -1
  299. package/dest/public/unique_class_ids.d.ts.map +1 -1
  300. package/dest/public/utils.d.ts +3 -5
  301. package/dest/public/utils.d.ts.map +1 -1
  302. package/dest/public/utils.js +4 -21
  303. package/dest/server.d.ts +7 -4
  304. package/dest/server.d.ts.map +1 -1
  305. package/dest/server.js +5 -2
  306. package/dest/testing.d.ts +2 -0
  307. package/dest/testing.d.ts.map +1 -0
  308. package/dest/testing.js +1 -0
  309. package/package.json +39 -33
  310. package/src/client.ts +5 -3
  311. package/src/common/errors.ts +80 -45
  312. package/src/common/index.ts +0 -1
  313. package/src/private/acvm/acvm.ts +21 -35
  314. package/src/private/acvm/acvm_types.ts +1 -1
  315. package/src/private/acvm/deserialize.ts +36 -30
  316. package/src/private/acvm/index.ts +0 -1
  317. package/src/private/acvm/serialize.ts +64 -1
  318. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +57 -28
  319. package/src/private/acvm_wasm.ts +76 -0
  320. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  321. package/src/private/circuit_recording/circuit_recorder.ts +263 -0
  322. package/src/private/circuit_recording/file_circuit_recorder.ts +163 -0
  323. package/src/private/circuit_recording/memory_circuit_recorder.ts +13 -0
  324. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  325. package/src/private/circuit_simulator.ts +90 -0
  326. package/src/private/{providers/factory.ts → factory.ts} +13 -10
  327. package/src/public/avm/avm_context.ts +6 -6
  328. package/src/public/avm/avm_contract_call_result.ts +23 -9
  329. package/src/public/avm/avm_execution_environment.ts +17 -5
  330. package/src/public/avm/avm_gas.ts +26 -38
  331. package/src/public/avm/avm_machine_state.ts +12 -6
  332. package/src/public/avm/avm_memory_types.ts +24 -7
  333. package/src/public/avm/avm_simulator.ts +57 -62
  334. package/src/public/avm/avm_simulator_interface.ts +8 -0
  335. package/src/public/avm/calldata.ts +100 -0
  336. package/src/public/avm/errors.ts +20 -75
  337. package/src/public/avm/fixtures/avm_simulation_tester.ts +41 -24
  338. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  339. package/src/public/avm/fixtures/initializers.ts +103 -0
  340. package/src/public/avm/fixtures/utils.ts +151 -0
  341. package/src/public/avm/index.ts +0 -2
  342. package/src/public/avm/opcodes/accrued_substate.ts +81 -48
  343. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  344. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  345. package/src/public/avm/opcodes/bitwise.ts +33 -29
  346. package/src/public/avm/opcodes/comparators.ts +6 -3
  347. package/src/public/avm/opcodes/contract.ts +10 -10
  348. package/src/public/avm/opcodes/control_flow.ts +19 -10
  349. package/src/public/avm/opcodes/conversion.ts +29 -5
  350. package/src/public/avm/opcodes/ec_add.ts +22 -10
  351. package/src/public/avm/opcodes/environment_getters.ts +28 -23
  352. package/src/public/avm/opcodes/external_calls.ts +70 -36
  353. package/src/public/avm/opcodes/hashing.ts +39 -13
  354. package/src/public/avm/opcodes/instruction.ts +31 -21
  355. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  356. package/src/public/avm/opcodes/memory.ts +81 -42
  357. package/src/public/avm/opcodes/misc.ts +61 -19
  358. package/src/public/avm/opcodes/storage.ts +47 -23
  359. package/src/public/avm/revert_reason.ts +58 -0
  360. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  361. package/src/public/avm/serialization/bytecode_serialization.ts +89 -80
  362. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  363. package/src/public/avm/test_utils.ts +25 -42
  364. package/src/public/contracts_db_checkpoint.ts +41 -0
  365. package/src/public/db_interfaces.ts +76 -0
  366. package/src/public/debug_fn_name.ts +52 -0
  367. package/src/public/executor_metrics.ts +49 -23
  368. package/src/public/executor_metrics_interface.ts +15 -0
  369. package/src/public/fixtures/amm_test.ts +331 -0
  370. package/src/public/fixtures/bulk_test.ts +169 -0
  371. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  372. package/src/public/fixtures/custom_bytecode_tests.ts +228 -0
  373. package/src/public/fixtures/index.ts +13 -0
  374. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  375. package/src/public/fixtures/opcode_spammer.ts +1721 -0
  376. package/src/public/fixtures/public_tx_simulation_tester.ts +223 -114
  377. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  378. package/src/public/fixtures/token_test.ts +148 -0
  379. package/src/public/fixtures/utils.ts +141 -69
  380. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  381. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  382. package/src/public/hinting_db_sources.ts +607 -0
  383. package/src/public/index.ts +11 -8
  384. package/src/public/public_db_sources.ts +290 -260
  385. package/src/public/public_errors.ts +14 -0
  386. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  387. package/src/public/public_processor/public_processor.ts +257 -179
  388. package/src/public/public_processor/public_processor_metrics.ts +18 -46
  389. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +124 -0
  390. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +211 -0
  391. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  392. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  393. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  394. package/src/public/public_tx_simulator/factories.ts +43 -0
  395. package/src/public/public_tx_simulator/index.ts +7 -0
  396. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  397. package/src/public/public_tx_simulator/public_tx_context.ts +179 -199
  398. package/src/public/public_tx_simulator/public_tx_simulator.ts +316 -263
  399. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  400. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  401. package/src/public/side_effect_errors.ts +91 -1
  402. package/src/public/side_effect_trace.ts +99 -322
  403. package/src/public/side_effect_trace_interface.ts +11 -59
  404. package/src/public/state_manager/index.ts +1 -0
  405. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  406. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  407. package/src/public/state_manager/state_manager.ts +569 -0
  408. package/src/public/test_executor_metrics.ts +397 -0
  409. package/src/public/utils.ts +5 -21
  410. package/src/server.ts +6 -3
  411. package/src/testing.ts +1 -0
  412. package/dest/common/db_interfaces.d.ts +0 -80
  413. package/dest/common/db_interfaces.d.ts.map +0 -1
  414. package/dest/common/db_interfaces.js +0 -1
  415. package/dest/common/debug_fn_name.d.ts +0 -5
  416. package/dest/common/debug_fn_name.d.ts.map +0 -1
  417. package/dest/common/debug_fn_name.js +0 -6
  418. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  419. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  420. package/dest/common/message_load_oracle_inputs.js +0 -15
  421. package/dest/private/acvm/oracle/index.d.ts +0 -14
  422. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  423. package/dest/private/acvm/oracle/index.js +0 -2
  424. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  425. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  426. package/dest/private/acvm/oracle/oracle.js +0 -263
  427. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  428. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  429. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  430. package/dest/private/execution_data_provider.d.ts +0 -261
  431. package/dest/private/execution_data_provider.d.ts.map +0 -1
  432. package/dest/private/execution_data_provider.js +0 -14
  433. package/dest/private/execution_note_cache.d.ts +0 -93
  434. package/dest/private/execution_note_cache.d.ts.map +0 -1
  435. package/dest/private/execution_note_cache.js +0 -180
  436. package/dest/private/hashed_values_cache.d.ts +0 -28
  437. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  438. package/dest/private/hashed_values_cache.js +0 -46
  439. package/dest/private/index.d.ts +0 -13
  440. package/dest/private/index.d.ts.map +0 -1
  441. package/dest/private/index.js +0 -12
  442. package/dest/private/pick_notes.d.ts +0 -85
  443. package/dest/private/pick_notes.d.ts.map +0 -1
  444. package/dest/private/pick_notes.js +0 -51
  445. package/dest/private/private_execution.d.ts +0 -25
  446. package/dest/private/private_execution.d.ts.map +0 -1
  447. package/dest/private/private_execution.js +0 -92
  448. package/dest/private/private_execution_oracle.d.ts +0 -215
  449. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  450. package/dest/private/private_execution_oracle.js +0 -382
  451. package/dest/private/providers/acvm_native.d.ts +0 -40
  452. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  453. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  454. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  455. package/dest/private/providers/acvm_wasm.js +0 -62
  456. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  457. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  458. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  459. package/dest/private/providers/factory.d.ts +0 -12
  460. package/dest/private/providers/factory.d.ts.map +0 -1
  461. package/dest/private/providers/simulation_provider.d.ts +0 -19
  462. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  463. package/dest/private/providers/simulation_provider.js +0 -24
  464. package/dest/private/simulator.d.ts +0 -34
  465. package/dest/private/simulator.d.ts.map +0 -1
  466. package/dest/private/simulator.js +0 -76
  467. package/dest/private/unconstrained_execution.d.ts +0 -10
  468. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  469. package/dest/private/unconstrained_execution.js +0 -27
  470. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  471. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  472. package/dest/private/unconstrained_execution_oracle.js +0 -258
  473. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  474. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  475. package/dest/public/avm/bytecode_utils.js +0 -17
  476. package/dest/public/avm/fixtures/index.d.ts +0 -84
  477. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  478. package/dest/public/avm/fixtures/index.js +0 -175
  479. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  480. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  481. package/dest/public/avm/journal/index.d.ts +0 -2
  482. package/dest/public/avm/journal/index.d.ts.map +0 -1
  483. package/dest/public/avm/journal/index.js +0 -1
  484. package/dest/public/avm/journal/journal.d.ts +0 -209
  485. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  486. package/dest/public/avm/journal/journal.js +0 -486
  487. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  488. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  489. package/dest/public/bytecode_errors.d.ts +0 -4
  490. package/dest/public/bytecode_errors.d.ts.map +0 -1
  491. package/dest/public/bytecode_errors.js +0 -6
  492. package/dest/public/execution.d.ts +0 -108
  493. package/dest/public/execution.d.ts.map +0 -1
  494. package/dest/public/execution.js +0 -9
  495. package/dest/public/tx_contract_cache.d.ts +0 -41
  496. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  497. package/dest/public/tx_contract_cache.js +0 -49
  498. package/dest/test/utils.d.ts +0 -13
  499. package/dest/test/utils.d.ts.map +0 -1
  500. package/dest/test/utils.js +0 -22
  501. package/src/common/db_interfaces.ts +0 -94
  502. package/src/common/debug_fn_name.ts +0 -18
  503. package/src/common/message_load_oracle_inputs.ts +0 -15
  504. package/src/private/acvm/oracle/index.ts +0 -16
  505. package/src/private/acvm/oracle/oracle.ts +0 -455
  506. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  507. package/src/private/execution_data_provider.ts +0 -323
  508. package/src/private/execution_note_cache.ts +0 -217
  509. package/src/private/hashed_values_cache.ts +0 -55
  510. package/src/private/index.ts +0 -16
  511. package/src/private/pick_notes.ts +0 -141
  512. package/src/private/private_execution.ts +0 -151
  513. package/src/private/private_execution_oracle.ts +0 -614
  514. package/src/private/providers/acvm_wasm.ts +0 -63
  515. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  516. package/src/private/providers/simulation_provider.ts +0 -45
  517. package/src/private/simulator.ts +0 -147
  518. package/src/private/unconstrained_execution.ts +0 -50
  519. package/src/private/unconstrained_execution_oracle.ts +0 -373
  520. package/src/public/avm/bytecode_utils.ts +0 -17
  521. package/src/public/avm/fixtures/index.ts +0 -296
  522. package/src/public/avm/journal/index.ts +0 -1
  523. package/src/public/avm/journal/journal.ts +0 -742
  524. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  525. package/src/public/bytecode_errors.ts +0 -6
  526. package/src/public/execution.ts +0 -140
  527. package/src/public/tx_contract_cache.ts +0 -69
  528. package/src/test/utils.ts +0 -36
@@ -0,0 +1,76 @@
1
+ import { type Logger, type LoggerBindings, resolveLogger } from '@aztec/foundation/log';
2
+ import { Timer } from '@aztec/foundation/timer';
3
+ import initACVM, { type ExecutionError, type ForeignCallHandler, executeCircuit } from '@aztec/noir-acvm_js';
4
+ import initAbi from '@aztec/noir-noirc_abi';
5
+ import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi';
6
+ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir';
7
+
8
+ import { type ACIRCallback, type ACIRExecutionResult, acvm } from './acvm/acvm.js';
9
+ import type { ACVMWitness } from './acvm/acvm_types.js';
10
+ import type { ACVMSuccess } from './acvm_native.js';
11
+ import { type CircuitSimulator, enrichNoirError } from './circuit_simulator.js';
12
+
13
+ export class WASMSimulator implements CircuitSimulator {
14
+ protected log: Logger;
15
+
16
+ constructor(loggerOrBindings?: Logger | LoggerBindings) {
17
+ this.log = resolveLogger('wasm-simulator', loggerOrBindings);
18
+ }
19
+
20
+ async init(): Promise<void> {
21
+ // If these are available, then we are in the
22
+ // web environment. For the node environment, this
23
+ // is a no-op.
24
+ if (typeof initAbi === 'function') {
25
+ /** @ts-expect-error The node bundle doesn't include these default imports, so TS complains */
26
+ await Promise.all([initAbi(), initACVM()]);
27
+ }
28
+ }
29
+
30
+ async executeProtocolCircuit(
31
+ input: ACVMWitness,
32
+ artifact: NoirCompiledCircuitWithName,
33
+ callback: ForeignCallHandler,
34
+ ): Promise<ACVMSuccess> {
35
+ this.log.debug('init', { hash: artifact.hash });
36
+ await this.init();
37
+
38
+ // Decode the bytecode from base64 since the acvm does not know about base64 encoding
39
+ const decodedBytecode = Buffer.from(artifact.bytecode, 'base64');
40
+ //
41
+ // Execute the circuit
42
+ try {
43
+ const timer = new Timer();
44
+ const result = await executeCircuit(
45
+ decodedBytecode,
46
+ input,
47
+ callback, // handle calls to debug_log
48
+ );
49
+ this.log.debug('execution successful', { hash: artifact.hash });
50
+ return { witness: result, duration: timer.ms() } as ACVMSuccess;
51
+ } catch (err) {
52
+ // Typescript types caught errors as unknown or any, so we need to narrow its type to check if it has raw
53
+ // assertion payload.
54
+ if (typeof err === 'object' && err !== null && 'rawAssertionPayload' in err) {
55
+ const parsed = enrichNoirError(artifact, err as ExecutionError);
56
+ this.log.debug('execution failed', {
57
+ hash: artifact.hash,
58
+ error: parsed,
59
+ message: parsed.message,
60
+ });
61
+ throw parsed;
62
+ }
63
+ this.log.debug('execution failed', { hash: artifact.hash, error: err });
64
+ throw new Error(`Circuit execution failed: ${err}`);
65
+ }
66
+ }
67
+
68
+ async executeUserCircuit(
69
+ input: ACVMWitness,
70
+ artifact: FunctionArtifactWithContractName,
71
+ callback: ACIRCallback,
72
+ ): Promise<ACIRExecutionResult> {
73
+ await this.init();
74
+ return acvm(artifact.bytecode, input, callback, this.log.createChild('acvm'));
75
+ }
76
+ }
@@ -0,0 +1,54 @@
1
+ import { Timer } from '@aztec/foundation/timer';
2
+ import { type ExecutionError, type ForeignCallHandler, executeCircuit } from '@aztec/noir-acvm_js';
3
+ import type { WitnessMap } from '@aztec/noir-types';
4
+ import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi';
5
+ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir';
6
+
7
+ import type { ACIRCallback, ACIRExecutionResult } from './acvm/acvm.js';
8
+ import type { ACVMWitness } from './acvm/acvm_types.js';
9
+ import type { ACVMSuccess } from './acvm_native.js';
10
+ import { type CircuitSimulator, enrichNoirError } from './circuit_simulator.js';
11
+
12
+ /**
13
+ * A circuit simulator that uses the WASM simulator with the ability to handle blobs via the foreign call handler.
14
+ * This class is temporary while brillig cannot handle the blob math, and it is kept separate
15
+ * because the zkg commitment library used in the blob code is not browser compatible.
16
+ *
17
+ * It is only used in the context of server-side code executing simulated protocol circuits.
18
+ */
19
+ export class WASMSimulatorWithBlobs implements CircuitSimulator {
20
+ async executeProtocolCircuit(
21
+ input: WitnessMap,
22
+ artifact: NoirCompiledCircuitWithName,
23
+ callback: ForeignCallHandler,
24
+ ): Promise<ACVMSuccess> {
25
+ // Decode the bytecode from base64 since the acvm does not know about base64 encoding
26
+ const decodedBytecode = Buffer.from(artifact.bytecode, 'base64');
27
+ //
28
+ // Execute the circuit
29
+ try {
30
+ const timer = new Timer();
31
+ const _witnessMap = await executeCircuit(
32
+ decodedBytecode,
33
+ input,
34
+ callback, // handle calls to debug_log and evaluate_blobs mock
35
+ );
36
+ return { witness: _witnessMap, duration: timer.ms() } as ACVMSuccess;
37
+ } catch (err) {
38
+ // Typescript types caught errors as unknown or any, so we need to narrow its type to check if it has raw
39
+ // assertion payload.
40
+ if (typeof err === 'object' && err !== null && 'rawAssertionPayload' in err) {
41
+ throw enrichNoirError(artifact, err as ExecutionError);
42
+ }
43
+ throw new Error(`Circuit execution failed: ${err}`);
44
+ }
45
+ }
46
+
47
+ executeUserCircuit(
48
+ _input: ACVMWitness,
49
+ _artifact: FunctionArtifactWithContractName,
50
+ _callback: ACIRCallback,
51
+ ): Promise<ACIRExecutionResult> {
52
+ throw new Error('Not implemented');
53
+ }
54
+ }
@@ -0,0 +1,263 @@
1
+ import { sha512 } from '@aztec/foundation/crypto/sha512';
2
+ import { type Logger, type LoggerBindings, resolveLogger } from '@aztec/foundation/log';
3
+ import { Timer } from '@aztec/foundation/timer';
4
+ import type { ForeignCallHandler, ForeignCallInput, ForeignCallOutput } from '@aztec/noir-acvm_js';
5
+
6
+ import type { ACIRCallback } from '../acvm/acvm.js';
7
+ import type { ACVMWitness } from '../acvm/acvm_types.js';
8
+
9
+ export type OracleCall = {
10
+ name: string;
11
+ inputs: unknown[];
12
+ outputs: unknown;
13
+ time: number;
14
+ // Due to the recursive nature of the simulator, we might have
15
+ // oracle calls performed after a foreign call (which is itself an oracle call)
16
+ // We keep track of the stack depth in this variable to ensure the recorded oracle
17
+ // calls are correctly associated with the right circuit.
18
+ // This is only use as a debugging tool
19
+ stackDepth: number;
20
+ };
21
+
22
+ export class CircuitRecording {
23
+ circuitName: string;
24
+ functionName: string;
25
+ bytecodeSHA512Hash: string;
26
+ timestamp: number;
27
+ inputs: Record<string, string>;
28
+ oracleCalls: OracleCall[];
29
+ error?: string;
30
+ parent?: CircuitRecording;
31
+
32
+ constructor(circuitName: string, functionName: string, bytecodeSHA512Hash: string, inputs: Record<string, string>) {
33
+ this.circuitName = circuitName;
34
+ this.functionName = functionName;
35
+ this.bytecodeSHA512Hash = bytecodeSHA512Hash;
36
+ this.timestamp = Date.now();
37
+ this.inputs = inputs;
38
+ this.oracleCalls = [];
39
+ }
40
+
41
+ setParent(recording?: CircuitRecording): void {
42
+ this.parent = recording;
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Class responsible for recording circuit inputs necessary to replay the circuit. These inputs are the initial witness
48
+ * map and the oracle calls made during the circuit execution/witness generation.
49
+ *
50
+ * Example recording object:
51
+ * ```json
52
+ * {
53
+ * "circuitName": "AMM",
54
+ * "functionName": "add_liquidity",
55
+ * "bytecodeSHA512Hash": "b46c640ed38f20eac5f61a5e41d8dd1e",
56
+ * "timestamp": 1740691464360,
57
+ * "inputs": {
58
+ * "0": "0x1e89de1f0ad5204263733b7ddf65bec45b8f44714a4da85a46474dad677679ef",
59
+ * "1": "0x00f4d59c0ff773427bb0fed5b422557ca4dc5655abe53d31fa9408cb3c5a672f",
60
+ * "5": "0x000000000000000000000000000000000000000000000000000000000000000f"
61
+ * },
62
+ * "oracleCalls": [
63
+ * {
64
+ * "name": "loadCapsule",
65
+ * "inputs": [
66
+ * [
67
+ * "0x102422483bad6abd385948435667e144ac4c272576e325e7563608876cd446fd"
68
+ * ],
69
+ * [
70
+ * "0x000000000000000000000000000000000000000000000000000000000000004d"
71
+ * ],
72
+ * [
73
+ * "0x0000000000000000000000000000000000000000000000000000000000000001"
74
+ * ]
75
+ * ],
76
+ * "outputs": [
77
+ * "0x0000000000000000000000000000000000000000000000000000000000000000",
78
+ * [
79
+ * "0x0000000000000000000000000000000000000000000000000000000000000000"
80
+ * ]
81
+ * ]
82
+ * },
83
+ * {
84
+ * "name": "fetchTaggedLogs",
85
+ * "inputs": []
86
+ * }
87
+ * ]
88
+ * }
89
+ * ```
90
+ */
91
+ export class CircuitRecorder {
92
+ protected readonly logger: Logger;
93
+
94
+ protected recording?: CircuitRecording;
95
+
96
+ private stackDepth: number = 0;
97
+ private newCircuit: boolean = true;
98
+
99
+ protected constructor(loggerOrBindings?: Logger | LoggerBindings) {
100
+ this.logger = resolveLogger('simulator:acvm:recording', loggerOrBindings);
101
+ }
102
+
103
+ /**
104
+ * Initializes a new circuit recording session.
105
+ * @param recordDir - Directory to store the recording
106
+ * @param input - Circuit input witness
107
+ * @param circuitBytecode - Compiled circuit bytecode
108
+ * @param circuitName - Name of the circuit
109
+ * @param functionName - Name of the circuit function (defaults to 'main'). This is meaningful only for
110
+ * contracts as protocol circuits artifacts always contain a single entrypoint function called 'main'.
111
+ */
112
+ start(input: ACVMWitness, circuitBytecode: Buffer, circuitName: string, functionName: string): Promise<void> {
113
+ if (this.newCircuit) {
114
+ const parentRef = this.recording;
115
+ this.recording = new CircuitRecording(
116
+ circuitName,
117
+ functionName,
118
+ sha512(circuitBytecode).toString('hex'),
119
+ Object.fromEntries(input),
120
+ );
121
+ this.recording.setParent(parentRef);
122
+ }
123
+
124
+ return Promise.resolve();
125
+ }
126
+
127
+ /**
128
+ * Wraps a callback to record all oracle/foreign calls.
129
+ * @param callback - The original callback to wrap, either a user circuit callback or protocol circuit callback.
130
+ * @returns A wrapped callback that records all oracle interactions.
131
+ */
132
+ wrapCallback(callback: ACIRCallback | ForeignCallHandler | undefined): ACIRCallback | ForeignCallHandler | undefined {
133
+ if (!callback) {
134
+ return undefined;
135
+ }
136
+ if (this.#isACIRCallback(callback)) {
137
+ return this.#wrapUserCircuitCallback(callback);
138
+ }
139
+ return this.#wrapProtocolCircuitCallback(callback);
140
+ }
141
+
142
+ /**
143
+ * Type guard to check if a callback is an ACIRCallback.
144
+ */
145
+ #isACIRCallback(callback: ACIRCallback | ForeignCallHandler): callback is ACIRCallback {
146
+ return typeof callback === 'object' && callback !== null && !('call' in callback);
147
+ }
148
+
149
+ /**
150
+ * Wraps a user circuit callback to record all oracle calls.
151
+ * @param callback - The original circuit callback.
152
+ * @returns A wrapped callback that records all oracle interactions which is to be provided to the ACVM.
153
+ */
154
+ #wrapUserCircuitCallback(callback: ACIRCallback): ACIRCallback {
155
+ const recordingCallback: ACIRCallback = {} as ACIRCallback;
156
+ const oracleMethods = Object.keys(callback);
157
+
158
+ for (const name of oracleMethods) {
159
+ const fn = callback[name as keyof ACIRCallback];
160
+ if (!fn || typeof fn !== 'function') {
161
+ throw new Error(`Oracle method ${name} not found when setting up recording callback`);
162
+ }
163
+
164
+ const isExternalCall = (name as keyof ACIRCallback) === 'privateCallPrivateFunction';
165
+
166
+ recordingCallback[name as keyof ACIRCallback] = (...args: ForeignCallInput[]): ReturnType<typeof fn> => {
167
+ const timer = new Timer();
168
+ // If we're entering another circuit via `privateCallPrivateFunction`, we increase the stack depth and set the
169
+ // newCircuit variable to ensure we are creating a new recording object.
170
+ if (isExternalCall) {
171
+ this.stackDepth++;
172
+ this.newCircuit = true;
173
+ }
174
+ const result = fn.call(callback, ...args);
175
+ if (result instanceof Promise) {
176
+ return result.then(async r => {
177
+ // Once we leave the nested circuit, we decrease the stack depth and set newCircuit to false
178
+ // so that the parent circuit continues with its existing recording
179
+ // Note: recording restoration is handled by finish()
180
+ if (isExternalCall) {
181
+ this.stackDepth--;
182
+ this.newCircuit = false;
183
+ }
184
+ await this.recordCall(name, args, r, timer.ms(), this.stackDepth);
185
+ return r;
186
+ }) as ReturnType<typeof fn>;
187
+ }
188
+ // Once we leave the nested circuit, we decrease the stack depth and set newCircuit to false
189
+ // so that the parent circuit continues with its existing recording
190
+ // Note: recording restoration is handled by finish()
191
+ if (isExternalCall) {
192
+ this.stackDepth--;
193
+ this.newCircuit = false;
194
+ }
195
+ void this.recordCall(name, args, result, timer.ms(), this.stackDepth);
196
+ return result;
197
+ };
198
+ }
199
+
200
+ return recordingCallback;
201
+ }
202
+
203
+ /**
204
+ * Wraps a protocol circuit callback to record all oracle calls.
205
+ * @param callback - The original oracle circuit callback.
206
+ * @returns A wrapped handler that records all oracle interactions which is to be provided to the ACVM.
207
+ */
208
+ #wrapProtocolCircuitCallback(callback: ForeignCallHandler): ForeignCallHandler {
209
+ return async (name: string, inputs: ForeignCallInput[]): Promise<ForeignCallOutput[]> => {
210
+ const timer = new Timer();
211
+ const result = await callback(name, inputs);
212
+ await this.recordCall(name, inputs, result, timer.ms(), 0);
213
+ return result;
214
+ };
215
+ }
216
+
217
+ /**
218
+ * Records a single oracle/foreign call with its inputs and outputs.
219
+ * @param name - Name of the call
220
+ * @param inputs - Input arguments
221
+ * @param outputs - Output results
222
+ */
223
+ recordCall(name: string, inputs: unknown[], outputs: unknown, time: number, stackDepth: number): Promise<OracleCall> {
224
+ const entry = {
225
+ name,
226
+ inputs,
227
+ outputs,
228
+ time,
229
+ stackDepth,
230
+ };
231
+ this.recording!.oracleCalls.push(entry);
232
+ return Promise.resolve(entry);
233
+ }
234
+
235
+ /**
236
+ * Finalizes the recording by resetting the state and returning the recording object.
237
+ */
238
+ finish(): Promise<CircuitRecording> {
239
+ const result = this.recording;
240
+ // If this is the top-level circuit recording, we reset the state for the next simulator call
241
+ if (!result!.parent) {
242
+ this.newCircuit = true;
243
+ this.recording = undefined;
244
+ } else {
245
+ // For nested circuits (utility calls, nested contract calls), restore to parent recording
246
+ // Note: we don't set newCircuit=false here because:
247
+ // - For privateCallPrivateFunction, the callback wrapper will set it to false
248
+ // - For utility calls, we want newCircuit to remain true so the next circuit creates its own recording
249
+ this.recording = result!.parent;
250
+ }
251
+ return Promise.resolve(result!);
252
+ }
253
+
254
+ /**
255
+ * Finalizes the recording by resetting the state and returning the recording object with an attached error.
256
+ * @param error - The error that occurred during circuit execution
257
+ */
258
+ async finishWithError(error: unknown): Promise<CircuitRecording> {
259
+ const result = await this.finish();
260
+ result.error = JSON.stringify(error);
261
+ return result;
262
+ }
263
+ }
@@ -0,0 +1,163 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+
6
+ import type { ACVMWitness } from '../acvm/acvm_types.js';
7
+ import { CircuitRecorder, type CircuitRecording } from './circuit_recorder.js';
8
+
9
+ export class FileCircuitRecorder extends CircuitRecorder {
10
+ declare recording?: CircuitRecording & { filePath: string; isFirstCall: boolean };
11
+
12
+ constructor(
13
+ private readonly recordDir: string,
14
+ logger?: Logger,
15
+ ) {
16
+ super(logger);
17
+ }
18
+
19
+ override async start(
20
+ input: ACVMWitness,
21
+ circuitBytecode: Buffer,
22
+ circuitName: string,
23
+ functionName: string = 'main',
24
+ ) {
25
+ await super.start(input, circuitBytecode, circuitName, functionName);
26
+
27
+ const recordingStringWithoutClosingBracket = JSON.stringify(
28
+ { ...this.recording, isFirstCall: undefined, parent: undefined, oracleCalls: undefined, filePath: undefined },
29
+ null,
30
+ 2,
31
+ ).slice(0, -2);
32
+
33
+ try {
34
+ // Check if the recording directory exists and is a directory
35
+ const stats = await fs.stat(this.recordDir);
36
+ if (!stats.isDirectory()) {
37
+ throw new Error(`Recording path ${this.recordDir} exists but is not a directory`);
38
+ }
39
+ } catch (err) {
40
+ if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
41
+ // The directory does not exist so we create it
42
+ await fs.mkdir(this.recordDir, { recursive: true });
43
+ } else {
44
+ throw err;
45
+ }
46
+ }
47
+
48
+ this.recording!.isFirstCall = true;
49
+ this.recording!.filePath = await FileCircuitRecorder.#computeFilePathAndStoreInitialRecording(
50
+ this.recordDir,
51
+ this.recording!.circuitName,
52
+ this.recording!.functionName,
53
+ recordingStringWithoutClosingBracket,
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Computes a unique file path for the recording by trying different counter values.
59
+ * This is needed because multiple recordings of the same circuit could be happening simultaneously or an older
60
+ * recording might be present.
61
+ * @param recordDir - Directory to store the recording
62
+ * @param circuitName - Name of the circuit
63
+ * @param functionName - Name of the circuit function
64
+ * @param recordingContent - Initial recording content
65
+ * @returns A unique file path for the recording
66
+ */
67
+ static async #computeFilePathAndStoreInitialRecording(
68
+ recordDir: string,
69
+ circuitName: string,
70
+ functionName: string,
71
+ recordingContent: string,
72
+ ): Promise<string> {
73
+ let counter = 0;
74
+ while (true) {
75
+ try {
76
+ const filePath = getFilePath(recordDir, circuitName, functionName, counter);
77
+ // Write the initial recording content to the file
78
+ await fs.writeFile(filePath, recordingContent + ',\n "oracleCalls": [\n', {
79
+ flag: 'wx', // wx flag fails if file exists
80
+ });
81
+ return filePath;
82
+ } catch (err) {
83
+ if ((err as NodeJS.ErrnoException).code === 'EEXIST') {
84
+ counter++;
85
+ continue;
86
+ }
87
+ throw err;
88
+ }
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Records a single oracle/foreign call with its inputs and outputs.
94
+ * @param name - Name of the call
95
+ * @param inputs - Input arguments
96
+ * @param outputs - Output results
97
+ */
98
+ override async recordCall(name: string, inputs: unknown[], outputs: unknown, time: number, stackDepth: number) {
99
+ const entry = await super.recordCall(name, inputs, outputs, time, stackDepth);
100
+ try {
101
+ const prefix = this.recording!.isFirstCall ? ' ' : ' ,';
102
+ this.recording!.isFirstCall = false;
103
+ await fs.appendFile(this.recording!.filePath, prefix + JSON.stringify(entry) + '\n');
104
+ } catch (err) {
105
+ this.logger.error('Failed to log circuit call', { error: err });
106
+ }
107
+ return entry;
108
+ }
109
+
110
+ /**
111
+ * Finalizes the recording file by adding closing brackets. Without calling this method, the recording file is
112
+ * incomplete and it fails to parse.
113
+ */
114
+ override async finish(): Promise<CircuitRecording> {
115
+ // Finish sets the recording to undefined if we are at the topmost circuit,
116
+ // so we save the current file path before that
117
+ const filePath = this.recording!.filePath;
118
+ const result = await super.finish();
119
+ try {
120
+ await fs.appendFile(filePath, ' ]\n}\n');
121
+ } catch (err) {
122
+ this.logger.error('Failed to finalize recording file', { error: err });
123
+ }
124
+ return result!;
125
+ }
126
+
127
+ /**
128
+ * Finalizes the recording file by adding the error and closing brackets. Without calling this method or `finish`,
129
+ * the recording file is incomplete and it fails to parse.
130
+ * @param error - The error that occurred during circuit execution
131
+ */
132
+ override async finishWithError(error: unknown): Promise<CircuitRecording> {
133
+ // Finish sets the recording to undefined if we are at the topmost circuit,
134
+ // so we save the current file path before that
135
+ const filePath = this.recording!.filePath;
136
+ const result = await super.finishWithError(error);
137
+ try {
138
+ await fs.appendFile(filePath, ' ],\n');
139
+ await fs.appendFile(filePath, ` "error": ${JSON.stringify(error)}\n`);
140
+ await fs.appendFile(filePath, '}\n');
141
+ } catch (err) {
142
+ this.logger.error('Failed to finalize recording file with error', { error: err });
143
+ }
144
+ return result!;
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Generates a file path for storing circuit recordings. The format of the filename is:
150
+ * `circuit_name_circuit_function_name_YYYY-MM-DD_N.json` where N is a counter to ensure unique filenames.
151
+ * @param recordDir - Base directory for recordings
152
+ * @param circuitName - Name of the circuit
153
+ * @param functionName - Name of the circuit function
154
+ * @param counter - Counter to ensure unique filenames. This is expected to be incremented in a loop until there is no
155
+ * existing file with the same name.
156
+ * @returns A file path for the recording.
157
+ */
158
+ function getFilePath(recordDir: string, circuitName: string, functionName: string, counter: number): string {
159
+ const date = new Date();
160
+ const formattedDate = date.toISOString().split('T')[0];
161
+ const filename = `${circuitName}_${functionName}_${formattedDate}_${counter}.json`;
162
+ return path.join(recordDir, filename);
163
+ }
@@ -0,0 +1,13 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+
3
+ import { CircuitRecorder } from './circuit_recorder.js';
4
+
5
+ /**
6
+ * In memory circuit recorder uses the default implementation. This is kept
7
+ * while we decide the fate of the FileCircuitRecorder.
8
+ */
9
+ export class MemoryCircuitRecorder extends CircuitRecorder {
10
+ constructor(logger?: Logger) {
11
+ super(logger);
12
+ }
13
+ }
@@ -0,0 +1,91 @@
1
+ import type { ForeignCallHandler } from '@aztec/noir-acvm_js';
2
+ import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi';
3
+ import type { NoirCompiledCircuitWithName } from '@aztec/stdlib/noir';
4
+
5
+ import type { ACIRCallback, ACIRCallbackStats, ACIRExecutionResult } from '../acvm/acvm.js';
6
+ import type { ACVMWitness } from '../acvm/acvm_types.js';
7
+ import type { ACVMSuccess } from '../acvm_native.js';
8
+ import type { CircuitSimulator } from '../circuit_simulator.js';
9
+ import type { CircuitRecorder } from './circuit_recorder.js';
10
+
11
+ /**
12
+ * Takes a circuit simulator and wraps it in a circuit recorder. See CircuitRecorder for more details on how circuit
13
+ * recording works.
14
+ */
15
+ export class SimulatorRecorderWrapper implements CircuitSimulator {
16
+ constructor(
17
+ private simulator: CircuitSimulator,
18
+ private recorder: CircuitRecorder,
19
+ ) {}
20
+
21
+ executeProtocolCircuit(
22
+ input: ACVMWitness,
23
+ artifact: NoirCompiledCircuitWithName,
24
+ callback: ForeignCallHandler | undefined,
25
+ ): Promise<ACVMSuccess> {
26
+ const bytecode = Buffer.from(artifact.bytecode, 'base64');
27
+
28
+ return this.#simulate<ForeignCallHandler | undefined, ACVMSuccess>(
29
+ wrappedCallback => this.simulator.executeProtocolCircuit(input, artifact, wrappedCallback),
30
+ input,
31
+ bytecode,
32
+ artifact.name,
33
+ 'main',
34
+ callback,
35
+ );
36
+ }
37
+
38
+ executeUserCircuit(
39
+ input: ACVMWitness,
40
+ artifact: FunctionArtifactWithContractName,
41
+ callback: ACIRCallback,
42
+ ): Promise<ACIRExecutionResult> {
43
+ return this.#simulate<ACIRCallback, ACIRExecutionResult>(
44
+ wrappedCallback => this.simulator.executeUserCircuit(input, artifact, wrappedCallback),
45
+ input,
46
+ artifact.bytecode,
47
+ artifact.contractName,
48
+ artifact.name,
49
+ callback,
50
+ );
51
+ }
52
+
53
+ async #simulate<C extends ACIRCallback | ForeignCallHandler | undefined, T extends ACIRExecutionResult | ACVMSuccess>(
54
+ simulateFn: (wrappedCallback: C) => Promise<T>,
55
+ input: ACVMWitness,
56
+ bytecode: Buffer,
57
+ contractName: string,
58
+ functionName: string,
59
+ callback: C,
60
+ ): Promise<T> {
61
+ // Start recording circuit execution
62
+ await this.recorder.start(input, bytecode, contractName, functionName);
63
+
64
+ // If callback was provided, we wrap it in a circuit recorder callback wrapper
65
+ const wrappedCallback = this.recorder.wrapCallback(callback);
66
+ let result: T;
67
+ try {
68
+ result = await simulateFn(wrappedCallback as C);
69
+ } catch (error) {
70
+ // If an error occurs, we finalize the recording file with the error
71
+ await this.recorder.finishWithError(error);
72
+ throw error;
73
+ }
74
+
75
+ // Witness generation is complete so we finish the circuit recorder
76
+ const recording = await this.recorder.finish();
77
+
78
+ (result as ACIRExecutionResult).oracles = recording.oracleCalls?.reduce(
79
+ (acc, { time, name }) => {
80
+ if (!acc[name]) {
81
+ acc[name] = { times: [] };
82
+ }
83
+ acc[name].times.push(time);
84
+ return acc;
85
+ },
86
+ {} as Record<string, ACIRCallbackStats>,
87
+ );
88
+
89
+ return result;
90
+ }
91
+ }