@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.5476d83

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 (492) hide show
  1. package/README.md +6 -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 +5 -14
  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 +12 -6
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +10 -16
  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 +18 -19
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +31 -23
  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 +20 -3
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +53 -0
  27. package/dest/private/acvm_native.d.ts +39 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  30. package/dest/private/acvm_wasm.d.ts +15 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  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 +108 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +209 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -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 +5 -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} +2 -2
  54. package/dest/public/avm/avm_context.d.ts +6 -6
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +5 -3
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +11 -7
  59. package/dest/public/avm/avm_execution_environment.d.ts +4 -2
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +4 -2
  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 +3 -1
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +2 -0
  68. package/dest/public/avm/avm_memory_types.d.ts +99 -88
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +17 -6
  71. package/dest/public/avm/avm_simulator.d.ts +6 -6
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +23 -35
  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/errors.d.ts +7 -31
  78. package/dest/public/avm/errors.d.ts.map +1 -1
  79. package/dest/public/avm/errors.js +7 -57
  80. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  81. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  82. package/dest/public/avm/fixtures/avm_simulation_tester.js +22 -15
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +7 -5
  84. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +37 -14
  86. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  87. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  88. package/dest/public/avm/fixtures/initializers.js +44 -0
  89. package/dest/public/avm/fixtures/utils.d.ts +38 -0
  90. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/utils.js +95 -0
  92. package/dest/public/avm/index.d.ts +1 -3
  93. package/dest/public/avm/index.d.ts.map +1 -1
  94. package/dest/public/avm/index.js +0 -2
  95. package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -3
  96. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  97. package/dest/public/avm/opcodes/accrued_substate.js +28 -25
  98. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  99. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  101. package/dest/public/avm/opcodes/arithmetic.d.ts +17 -7
  102. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/arithmetic.js +16 -2
  104. package/dest/public/avm/opcodes/bitwise.d.ts +10 -18
  105. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/bitwise.js +19 -26
  107. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  108. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/comparators.js +3 -3
  110. package/dest/public/avm/opcodes/contract.d.ts +2 -3
  111. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/contract.js +9 -10
  113. package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
  114. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/control_flow.js +10 -8
  116. package/dest/public/avm/opcodes/conversion.d.ts +2 -1
  117. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/conversion.js +267 -3
  119. package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
  120. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/ec_add.js +6 -6
  122. package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
  123. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  125. package/dest/public/avm/opcodes/external_calls.d.ts +9 -8
  126. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/external_calls.js +39 -34
  128. package/dest/public/avm/opcodes/hashing.d.ts +2 -2
  129. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/hashing.js +6 -6
  131. package/dest/public/avm/opcodes/index.d.ts +1 -1
  132. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  133. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  134. package/dest/public/avm/opcodes/instruction.js +23 -19
  135. package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
  136. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/memory.d.ts +6 -6
  138. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  139. package/dest/public/avm/opcodes/memory.js +37 -33
  140. package/dest/public/avm/opcodes/misc.d.ts +3 -2
  141. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  142. package/dest/public/avm/opcodes/misc.js +41 -16
  143. package/dest/public/avm/opcodes/storage.d.ts +3 -3
  144. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  145. package/dest/public/avm/opcodes/storage.js +7 -5
  146. package/dest/public/avm/revert_reason.d.ts +18 -0
  147. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  148. package/dest/public/avm/revert_reason.js +38 -0
  149. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  150. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  151. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  152. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  153. package/dest/public/avm/serialization/bytecode_serialization.js +70 -69
  154. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  155. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  156. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  157. package/dest/public/avm/test_utils.d.ts +11 -14
  158. package/dest/public/avm/test_utils.d.ts.map +1 -1
  159. package/dest/public/avm/test_utils.js +16 -24
  160. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  161. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  162. package/dest/public/contracts_db_checkpoint.js +30 -0
  163. package/dest/public/db_interfaces.d.ts +68 -0
  164. package/dest/public/db_interfaces.d.ts.map +1 -0
  165. package/dest/public/db_interfaces.js +3 -0
  166. package/dest/public/debug_fn_name.d.ts +5 -0
  167. package/dest/public/debug_fn_name.d.ts.map +1 -0
  168. package/dest/public/debug_fn_name.js +9 -0
  169. package/dest/public/executor_metrics.d.ts +12 -4
  170. package/dest/public/executor_metrics.d.ts.map +1 -1
  171. package/dest/public/executor_metrics.js +37 -6
  172. package/dest/public/executor_metrics_interface.d.ts +10 -0
  173. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  174. package/dest/public/executor_metrics_interface.js +1 -0
  175. package/dest/public/fixtures/amm_test.d.ts +10 -0
  176. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  177. package/dest/public/fixtures/amm_test.js +213 -0
  178. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  179. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  180. package/dest/public/fixtures/bulk_test.js +326 -0
  181. package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
  182. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  183. package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
  184. package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
  185. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  186. package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
  187. package/dest/public/fixtures/index.d.ts +8 -1
  188. package/dest/public/fixtures/index.d.ts.map +1 -1
  189. package/dest/public/fixtures/index.js +7 -0
  190. package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
  191. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  192. package/dest/public/fixtures/minimal_public_tx.js +29 -0
  193. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -14
  194. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  195. package/dest/public/fixtures/public_tx_simulation_tester.js +100 -71
  196. package/dest/public/fixtures/simple_contract_data_source.d.ts +35 -0
  197. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  198. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  199. package/dest/public/fixtures/token_test.d.ts +8 -0
  200. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  201. package/dest/public/fixtures/token_test.js +94 -0
  202. package/dest/public/fixtures/utils.d.ts +17 -4
  203. package/dest/public/fixtures/utils.d.ts.map +1 -1
  204. package/dest/public/fixtures/utils.js +100 -58
  205. package/dest/public/hinting_db_sources.d.ts +78 -0
  206. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  207. package/dest/public/hinting_db_sources.js +350 -0
  208. package/dest/public/index.d.ts +6 -9
  209. package/dest/public/index.d.ts.map +1 -1
  210. package/dest/public/index.js +4 -7
  211. package/dest/public/public_db_sources.d.ts +51 -101
  212. package/dest/public/public_db_sources.d.ts.map +1 -1
  213. package/dest/public/public_db_sources.js +219 -192
  214. package/dest/public/public_errors.d.ts +12 -0
  215. package/dest/public/public_errors.d.ts.map +1 -0
  216. package/dest/public/public_errors.js +13 -0
  217. package/dest/public/public_processor/guarded_merkle_tree.d.ts +49 -0
  218. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  219. package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
  220. package/dest/public/public_processor/public_processor.d.ts +25 -37
  221. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  222. package/dest/public/public_processor/public_processor.js +154 -111
  223. package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
  224. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  225. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  226. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +30 -0
  227. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  228. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +133 -0
  229. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +66 -0
  230. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  231. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +210 -0
  232. package/dest/public/public_tx_simulator/index.d.ts +5 -0
  233. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  234. package/dest/public/public_tx_simulator/index.js +2 -0
  235. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  236. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  237. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  238. package/dest/public/public_tx_simulator/public_tx_context.d.ts +23 -30
  239. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  240. package/dest/public/public_tx_simulator/public_tx_context.js +71 -91
  241. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -58
  242. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  243. package/dest/public/public_tx_simulator/public_tx_simulator.js +208 -206
  244. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -0
  245. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  246. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  247. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  248. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  249. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  250. package/dest/public/side_effect_errors.d.ts +42 -2
  251. package/dest/public/side_effect_errors.d.ts.map +1 -1
  252. package/dest/public/side_effect_errors.js +70 -1
  253. package/dest/public/side_effect_trace.d.ts +21 -67
  254. package/dest/public/side_effect_trace.d.ts.map +1 -1
  255. package/dest/public/side_effect_trace.js +71 -121
  256. package/dest/public/side_effect_trace_interface.d.ts +12 -24
  257. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  258. package/dest/public/state_manager/index.d.ts +2 -0
  259. package/dest/public/state_manager/index.d.ts.map +1 -0
  260. package/dest/public/state_manager/index.js +1 -0
  261. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +3 -6
  262. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  263. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  264. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +3 -3
  265. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  266. package/dest/public/state_manager/state_manager.d.ts +159 -0
  267. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  268. package/dest/public/state_manager/state_manager.js +392 -0
  269. package/dest/public/test_executor_metrics.d.ts +55 -0
  270. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  271. package/dest/public/test_executor_metrics.js +307 -0
  272. package/dest/public/unique_class_ids.d.ts +1 -1
  273. package/dest/public/unique_class_ids.d.ts.map +1 -1
  274. package/dest/public/utils.d.ts +3 -5
  275. package/dest/public/utils.d.ts.map +1 -1
  276. package/dest/public/utils.js +4 -21
  277. package/dest/server.d.ts +7 -4
  278. package/dest/server.d.ts.map +1 -1
  279. package/dest/server.js +5 -2
  280. package/dest/testing.d.ts +2 -0
  281. package/dest/testing.d.ts.map +1 -0
  282. package/dest/testing.js +1 -0
  283. package/package.json +39 -33
  284. package/src/client.ts +5 -3
  285. package/src/common/errors.ts +79 -44
  286. package/src/common/index.ts +0 -1
  287. package/src/private/acvm/acvm.ts +17 -32
  288. package/src/private/acvm/acvm_types.ts +1 -1
  289. package/src/private/acvm/deserialize.ts +35 -29
  290. package/src/private/acvm/index.ts +0 -1
  291. package/src/private/acvm/serialize.ts +63 -0
  292. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  293. package/src/private/acvm_wasm.ts +72 -0
  294. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  295. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  296. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  297. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  298. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  299. package/src/private/circuit_simulator.ts +90 -0
  300. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  301. package/src/public/avm/avm_context.ts +4 -4
  302. package/src/public/avm/avm_contract_call_result.ts +17 -5
  303. package/src/public/avm/avm_execution_environment.ts +8 -1
  304. package/src/public/avm/avm_gas.ts +23 -35
  305. package/src/public/avm/avm_machine_state.ts +5 -0
  306. package/src/public/avm/avm_memory_types.ts +19 -6
  307. package/src/public/avm/avm_simulator.ts +43 -54
  308. package/src/public/avm/avm_simulator_interface.ts +8 -0
  309. package/src/public/avm/errors.ts +8 -77
  310. package/src/public/avm/fixtures/avm_simulation_tester.ts +32 -21
  311. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
  312. package/src/public/avm/fixtures/initializers.ts +102 -0
  313. package/src/public/avm/fixtures/utils.ts +150 -0
  314. package/src/public/avm/index.ts +0 -2
  315. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  316. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  317. package/src/public/avm/opcodes/arithmetic.ts +24 -2
  318. package/src/public/avm/opcodes/bitwise.ts +33 -29
  319. package/src/public/avm/opcodes/comparators.ts +6 -3
  320. package/src/public/avm/opcodes/contract.ts +10 -7
  321. package/src/public/avm/opcodes/control_flow.ts +19 -10
  322. package/src/public/avm/opcodes/conversion.ts +27 -3
  323. package/src/public/avm/opcodes/ec_add.ts +9 -6
  324. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  325. package/src/public/avm/opcodes/external_calls.ts +61 -29
  326. package/src/public/avm/opcodes/hashing.ts +28 -8
  327. package/src/public/avm/opcodes/instruction.ts +31 -21
  328. package/src/public/avm/opcodes/memory.ts +71 -32
  329. package/src/public/avm/opcodes/misc.ts +60 -18
  330. package/src/public/avm/opcodes/storage.ts +22 -6
  331. package/src/public/avm/revert_reason.ts +55 -0
  332. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  333. package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
  334. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  335. package/src/public/avm/test_utils.ts +24 -41
  336. package/src/public/contracts_db_checkpoint.ts +41 -0
  337. package/src/public/db_interfaces.ts +76 -0
  338. package/src/{common → public}/debug_fn_name.ts +7 -7
  339. package/src/public/executor_metrics.ts +56 -6
  340. package/src/public/executor_metrics_interface.ts +15 -0
  341. package/src/public/fixtures/amm_test.ts +331 -0
  342. package/src/public/fixtures/bulk_test.ts +169 -0
  343. package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
  344. package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
  345. package/src/public/fixtures/index.ts +7 -0
  346. package/src/public/fixtures/minimal_public_tx.ts +35 -0
  347. package/src/public/fixtures/public_tx_simulation_tester.ts +166 -113
  348. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
  349. package/src/public/fixtures/token_test.ts +139 -0
  350. package/src/public/fixtures/utils.ts +141 -68
  351. package/src/public/hinting_db_sources.ts +602 -0
  352. package/src/public/index.ts +5 -8
  353. package/src/public/public_db_sources.ts +278 -258
  354. package/src/public/public_errors.ts +14 -0
  355. package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
  356. package/src/public/public_processor/public_processor.ts +212 -164
  357. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  358. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +162 -0
  359. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +306 -0
  360. package/src/public/public_tx_simulator/index.ts +4 -0
  361. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  362. package/src/public/public_tx_simulator/public_tx_context.ts +167 -194
  363. package/src/public/public_tx_simulator/public_tx_simulator.ts +292 -265
  364. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +10 -0
  365. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  366. package/src/public/side_effect_errors.ts +91 -1
  367. package/src/public/side_effect_trace.ts +94 -320
  368. package/src/public/side_effect_trace_interface.ts +10 -58
  369. package/src/public/state_manager/index.ts +1 -0
  370. package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
  371. package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
  372. package/src/public/state_manager/state_manager.ts +553 -0
  373. package/src/public/test_executor_metrics.ts +397 -0
  374. package/src/public/utils.ts +5 -21
  375. package/src/server.ts +6 -3
  376. package/src/testing.ts +1 -0
  377. package/dest/common/db_interfaces.d.ts +0 -80
  378. package/dest/common/db_interfaces.d.ts.map +0 -1
  379. package/dest/common/db_interfaces.js +0 -1
  380. package/dest/common/debug_fn_name.d.ts +0 -5
  381. package/dest/common/debug_fn_name.d.ts.map +0 -1
  382. package/dest/common/debug_fn_name.js +0 -6
  383. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  384. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  385. package/dest/common/message_load_oracle_inputs.js +0 -15
  386. package/dest/private/acvm/oracle/index.d.ts +0 -14
  387. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  388. package/dest/private/acvm/oracle/index.js +0 -2
  389. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  390. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  391. package/dest/private/acvm/oracle/oracle.js +0 -263
  392. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  393. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  394. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  395. package/dest/private/execution_data_provider.d.ts +0 -261
  396. package/dest/private/execution_data_provider.d.ts.map +0 -1
  397. package/dest/private/execution_data_provider.js +0 -14
  398. package/dest/private/execution_note_cache.d.ts +0 -93
  399. package/dest/private/execution_note_cache.d.ts.map +0 -1
  400. package/dest/private/execution_note_cache.js +0 -180
  401. package/dest/private/hashed_values_cache.d.ts +0 -28
  402. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  403. package/dest/private/hashed_values_cache.js +0 -46
  404. package/dest/private/index.d.ts +0 -13
  405. package/dest/private/index.d.ts.map +0 -1
  406. package/dest/private/index.js +0 -12
  407. package/dest/private/pick_notes.d.ts +0 -85
  408. package/dest/private/pick_notes.d.ts.map +0 -1
  409. package/dest/private/pick_notes.js +0 -51
  410. package/dest/private/private_execution.d.ts +0 -25
  411. package/dest/private/private_execution.d.ts.map +0 -1
  412. package/dest/private/private_execution.js +0 -92
  413. package/dest/private/private_execution_oracle.d.ts +0 -215
  414. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  415. package/dest/private/private_execution_oracle.js +0 -382
  416. package/dest/private/providers/acvm_native.d.ts +0 -40
  417. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  418. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  419. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  420. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  421. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  422. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  423. package/dest/private/providers/factory.d.ts +0 -12
  424. package/dest/private/providers/factory.d.ts.map +0 -1
  425. package/dest/private/providers/simulation_provider.d.ts +0 -19
  426. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  427. package/dest/private/providers/simulation_provider.js +0 -24
  428. package/dest/private/simulator.d.ts +0 -34
  429. package/dest/private/simulator.d.ts.map +0 -1
  430. package/dest/private/simulator.js +0 -76
  431. package/dest/private/unconstrained_execution.d.ts +0 -10
  432. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  433. package/dest/private/unconstrained_execution.js +0 -27
  434. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  435. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  436. package/dest/private/unconstrained_execution_oracle.js +0 -258
  437. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  438. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  439. package/dest/public/avm/bytecode_utils.js +0 -17
  440. package/dest/public/avm/fixtures/index.d.ts +0 -84
  441. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  442. package/dest/public/avm/fixtures/index.js +0 -175
  443. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  444. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  445. package/dest/public/avm/journal/index.d.ts +0 -2
  446. package/dest/public/avm/journal/index.d.ts.map +0 -1
  447. package/dest/public/avm/journal/index.js +0 -1
  448. package/dest/public/avm/journal/journal.d.ts +0 -209
  449. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  450. package/dest/public/avm/journal/journal.js +0 -486
  451. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  452. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  453. package/dest/public/bytecode_errors.d.ts +0 -4
  454. package/dest/public/bytecode_errors.d.ts.map +0 -1
  455. package/dest/public/bytecode_errors.js +0 -6
  456. package/dest/public/execution.d.ts +0 -108
  457. package/dest/public/execution.d.ts.map +0 -1
  458. package/dest/public/execution.js +0 -9
  459. package/dest/public/tx_contract_cache.d.ts +0 -41
  460. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  461. package/dest/public/tx_contract_cache.js +0 -49
  462. package/dest/test/utils.d.ts +0 -13
  463. package/dest/test/utils.d.ts.map +0 -1
  464. package/dest/test/utils.js +0 -22
  465. package/src/common/db_interfaces.ts +0 -94
  466. package/src/common/message_load_oracle_inputs.ts +0 -15
  467. package/src/private/acvm/oracle/index.ts +0 -16
  468. package/src/private/acvm/oracle/oracle.ts +0 -455
  469. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  470. package/src/private/execution_data_provider.ts +0 -323
  471. package/src/private/execution_note_cache.ts +0 -217
  472. package/src/private/hashed_values_cache.ts +0 -55
  473. package/src/private/index.ts +0 -16
  474. package/src/private/pick_notes.ts +0 -141
  475. package/src/private/private_execution.ts +0 -151
  476. package/src/private/private_execution_oracle.ts +0 -614
  477. package/src/private/providers/acvm_wasm.ts +0 -63
  478. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  479. package/src/private/providers/simulation_provider.ts +0 -45
  480. package/src/private/simulator.ts +0 -147
  481. package/src/private/unconstrained_execution.ts +0 -50
  482. package/src/private/unconstrained_execution_oracle.ts +0 -373
  483. package/src/public/avm/bytecode_utils.ts +0 -17
  484. package/src/public/avm/fixtures/index.ts +0 -296
  485. package/src/public/avm/journal/index.ts +0 -1
  486. package/src/public/avm/journal/journal.ts +0 -742
  487. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  488. package/src/public/bytecode_errors.ts +0 -6
  489. package/src/public/execution.ts +0 -140
  490. package/src/public/tx_contract_cache.ts +0 -69
  491. package/src/test/utils.ts +0 -36
  492. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -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,260 @@
1
+ import { sha512 } from '@aztec/foundation/crypto';
2
+ import { createLogger } 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 = createLogger('simulator:acvm:recording');
93
+
94
+ protected recording?: CircuitRecording;
95
+
96
+ private stackDepth: number = 0;
97
+ private newCircuit: boolean = true;
98
+
99
+ protected constructor() {}
100
+
101
+ /**
102
+ * Initializes a new circuit recording session.
103
+ * @param recordDir - Directory to store the recording
104
+ * @param input - Circuit input witness
105
+ * @param circuitBytecode - Compiled circuit bytecode
106
+ * @param circuitName - Name of the circuit
107
+ * @param functionName - Name of the circuit function (defaults to 'main'). This is meaningful only for
108
+ * contracts as protocol circuits artifacts always contain a single entrypoint function called 'main'.
109
+ */
110
+ start(input: ACVMWitness, circuitBytecode: Buffer, circuitName: string, functionName: string): Promise<void> {
111
+ const parentRef = this.recording;
112
+ if (this.newCircuit) {
113
+ this.recording = new CircuitRecording(
114
+ circuitName,
115
+ functionName,
116
+ sha512(circuitBytecode).toString('hex'),
117
+ Object.fromEntries(input),
118
+ );
119
+ }
120
+ this.recording!.setParent(parentRef);
121
+
122
+ return Promise.resolve();
123
+ }
124
+
125
+ /**
126
+ * Wraps a callback to record all oracle/foreign calls.
127
+ * @param callback - The original callback to wrap, either a user circuit callback or protocol circuit callback.
128
+ * @returns A wrapped callback that records all oracle interactions.
129
+ */
130
+ wrapCallback(callback: ACIRCallback | ForeignCallHandler | undefined): ACIRCallback | ForeignCallHandler | undefined {
131
+ if (!callback) {
132
+ return undefined;
133
+ }
134
+ if (this.#isACIRCallback(callback)) {
135
+ return this.#wrapUserCircuitCallback(callback);
136
+ }
137
+ return this.#wrapProtocolCircuitCallback(callback);
138
+ }
139
+
140
+ /**
141
+ * Type guard to check if a callback is an ACIRCallback.
142
+ */
143
+ #isACIRCallback(callback: ACIRCallback | ForeignCallHandler): callback is ACIRCallback {
144
+ return typeof callback === 'object' && callback !== null && !('call' in callback);
145
+ }
146
+
147
+ /**
148
+ * Wraps a user circuit callback to record all oracle calls.
149
+ * @param callback - The original circuit callback.
150
+ * @returns A wrapped callback that records all oracle interactions which is to be provided to the ACVM.
151
+ */
152
+ #wrapUserCircuitCallback(callback: ACIRCallback): ACIRCallback {
153
+ const recordingCallback: ACIRCallback = {} as ACIRCallback;
154
+ const oracleMethods = Object.keys(callback);
155
+
156
+ for (const name of oracleMethods) {
157
+ const fn = callback[name as keyof ACIRCallback];
158
+ if (!fn || typeof fn !== 'function') {
159
+ throw new Error(`Oracle method ${name} not found when setting up recording callback`);
160
+ }
161
+
162
+ const isExternalCall = (name as keyof ACIRCallback) === 'privateCallPrivateFunction';
163
+
164
+ recordingCallback[name as keyof ACIRCallback] = (...args: ForeignCallInput[]): ReturnType<typeof fn> => {
165
+ const timer = new Timer();
166
+ // If we're entering another circuit via `privateCallPrivateFunction`, we increase the stack depth and set the
167
+ // newCircuit variable to ensure we are creating a new recording object.
168
+ if (isExternalCall) {
169
+ this.stackDepth++;
170
+ this.newCircuit = true;
171
+ }
172
+ const result = fn.call(callback, ...args);
173
+ if (result instanceof Promise) {
174
+ return result.then(async r => {
175
+ // Once we leave the nested circuit, we decrease the stack depth and set newCircuit to false
176
+ // since we are going back to the "parent" circuit which can never be new
177
+ if (isExternalCall) {
178
+ this.stackDepth--;
179
+ this.newCircuit = false;
180
+ this.recording = this.recording!.parent;
181
+ }
182
+ await this.recordCall(name, args, r, timer.ms(), this.stackDepth);
183
+ return r;
184
+ }) as ReturnType<typeof fn>;
185
+ }
186
+ // Once we leave the nested circuit, we decrease the stack depth and set newCircuit to false
187
+ // since we are going back to the "parent" circuit which can never be new
188
+ if (isExternalCall) {
189
+ this.stackDepth--;
190
+ this.newCircuit = false;
191
+ this.recording = this.recording!.parent;
192
+ }
193
+ void this.recordCall(name, args, result, timer.ms(), this.stackDepth);
194
+ return result;
195
+ };
196
+ }
197
+
198
+ return recordingCallback;
199
+ }
200
+
201
+ /**
202
+ * Wraps a protocol circuit callback to record all oracle calls.
203
+ * @param callback - The original oracle circuit callback.
204
+ * @returns A wrapped handler that records all oracle interactions which is to be provided to the ACVM.
205
+ */
206
+ #wrapProtocolCircuitCallback(callback: ForeignCallHandler): ForeignCallHandler {
207
+ return async (name: string, inputs: ForeignCallInput[]): Promise<ForeignCallOutput[]> => {
208
+ const timer = new Timer();
209
+ const result = await callback(name, inputs);
210
+ await this.recordCall(name, inputs, result, timer.ms(), 0);
211
+ return result;
212
+ };
213
+ }
214
+
215
+ /**
216
+ * Records a single oracle/foreign call with its inputs and outputs.
217
+ * @param name - Name of the call
218
+ * @param inputs - Input arguments
219
+ * @param outputs - Output results
220
+ */
221
+ recordCall(name: string, inputs: unknown[], outputs: unknown, time: number, stackDepth: number): Promise<OracleCall> {
222
+ const entry = {
223
+ name,
224
+ inputs,
225
+ outputs,
226
+ time,
227
+ stackDepth,
228
+ };
229
+ this.recording!.oracleCalls.push(entry);
230
+ return Promise.resolve(entry);
231
+ }
232
+
233
+ /**
234
+ * Finalizes the recording by resetting the state and returning the recording object.
235
+ */
236
+ finish(): Promise<CircuitRecording> {
237
+ const result = this.recording;
238
+ // If this is the top-level circuit recording, we reset the state for the next simulator call
239
+ if (!result!.parent) {
240
+ this.newCircuit = true;
241
+ this.recording = undefined;
242
+ }
243
+ return Promise.resolve(result!);
244
+ }
245
+
246
+ /**
247
+ * Finalizes the recording by resetting the state and returning the recording object with an attached error.
248
+ * @param error - The error that occurred during circuit execution
249
+ */
250
+ finishWithError(error: unknown): Promise<CircuitRecording> {
251
+ const result = this.recording;
252
+ // If this is the top-level circuit recording, we reset the state for the next simulator call
253
+ if (!result!.parent) {
254
+ this.newCircuit = true;
255
+ this.recording = undefined;
256
+ }
257
+ result!.error = JSON.stringify(error);
258
+ return Promise.resolve(result!);
259
+ }
260
+ }
@@ -0,0 +1,158 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+
4
+ import type { ACVMWitness } from '../acvm/acvm_types.js';
5
+ import { CircuitRecorder, type CircuitRecording } from './circuit_recorder.js';
6
+
7
+ export class FileCircuitRecorder extends CircuitRecorder {
8
+ declare recording?: CircuitRecording & { filePath: string; isFirstCall: boolean };
9
+
10
+ constructor(private readonly recordDir: string) {
11
+ super();
12
+ }
13
+
14
+ override async start(
15
+ input: ACVMWitness,
16
+ circuitBytecode: Buffer,
17
+ circuitName: string,
18
+ functionName: string = 'main',
19
+ ) {
20
+ await super.start(input, circuitBytecode, circuitName, functionName);
21
+
22
+ const recordingStringWithoutClosingBracket = JSON.stringify(
23
+ { ...this.recording, isFirstCall: undefined, parent: undefined, oracleCalls: undefined, filePath: undefined },
24
+ null,
25
+ 2,
26
+ ).slice(0, -2);
27
+
28
+ try {
29
+ // Check if the recording directory exists and is a directory
30
+ const stats = await fs.stat(this.recordDir);
31
+ if (!stats.isDirectory()) {
32
+ throw new Error(`Recording path ${this.recordDir} exists but is not a directory`);
33
+ }
34
+ } catch (err) {
35
+ if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
36
+ // The directory does not exist so we create it
37
+ await fs.mkdir(this.recordDir, { recursive: true });
38
+ } else {
39
+ throw err;
40
+ }
41
+ }
42
+
43
+ this.recording!.isFirstCall = true;
44
+ this.recording!.filePath = await FileCircuitRecorder.#computeFilePathAndStoreInitialRecording(
45
+ this.recordDir,
46
+ this.recording!.circuitName,
47
+ this.recording!.functionName,
48
+ recordingStringWithoutClosingBracket,
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Computes a unique file path for the recording by trying different counter values.
54
+ * This is needed because multiple recordings of the same circuit could be happening simultaneously or an older
55
+ * recording might be present.
56
+ * @param recordDir - Directory to store the recording
57
+ * @param circuitName - Name of the circuit
58
+ * @param functionName - Name of the circuit function
59
+ * @param recordingContent - Initial recording content
60
+ * @returns A unique file path for the recording
61
+ */
62
+ static async #computeFilePathAndStoreInitialRecording(
63
+ recordDir: string,
64
+ circuitName: string,
65
+ functionName: string,
66
+ recordingContent: string,
67
+ ): Promise<string> {
68
+ let counter = 0;
69
+ while (true) {
70
+ try {
71
+ const filePath = getFilePath(recordDir, circuitName, functionName, counter);
72
+ // Write the initial recording content to the file
73
+ await fs.writeFile(filePath, recordingContent + ',\n "oracleCalls": [\n', {
74
+ flag: 'wx', // wx flag fails if file exists
75
+ });
76
+ return filePath;
77
+ } catch (err) {
78
+ if ((err as NodeJS.ErrnoException).code === 'EEXIST') {
79
+ counter++;
80
+ continue;
81
+ }
82
+ throw err;
83
+ }
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Records a single oracle/foreign call with its inputs and outputs.
89
+ * @param name - Name of the call
90
+ * @param inputs - Input arguments
91
+ * @param outputs - Output results
92
+ */
93
+ override async recordCall(name: string, inputs: unknown[], outputs: unknown, time: number, stackDepth: number) {
94
+ const entry = await super.recordCall(name, inputs, outputs, time, stackDepth);
95
+ try {
96
+ const prefix = this.recording!.isFirstCall ? ' ' : ' ,';
97
+ this.recording!.isFirstCall = false;
98
+ await fs.appendFile(this.recording!.filePath, prefix + JSON.stringify(entry) + '\n');
99
+ } catch (err) {
100
+ this.logger.error('Failed to log circuit call', { error: err });
101
+ }
102
+ return entry;
103
+ }
104
+
105
+ /**
106
+ * Finalizes the recording file by adding closing brackets. Without calling this method, the recording file is
107
+ * incomplete and it fails to parse.
108
+ */
109
+ override async finish(): Promise<CircuitRecording> {
110
+ // Finish sets the recording to undefined if we are at the topmost circuit,
111
+ // so we save the current file path before that
112
+ const filePath = this.recording!.filePath;
113
+ const result = await super.finish();
114
+ try {
115
+ await fs.appendFile(filePath, ' ]\n}\n');
116
+ } catch (err) {
117
+ this.logger.error('Failed to finalize recording file', { error: err });
118
+ }
119
+ return result!;
120
+ }
121
+
122
+ /**
123
+ * Finalizes the recording file by adding the error and closing brackets. Without calling this method or `finish`,
124
+ * the recording file is incomplete and it fails to parse.
125
+ * @param error - The error that occurred during circuit execution
126
+ */
127
+ override async finishWithError(error: unknown): Promise<CircuitRecording> {
128
+ // Finish sets the recording to undefined if we are at the topmost circuit,
129
+ // so we save the current file path before that
130
+ const filePath = this.recording!.filePath;
131
+ const result = await super.finishWithError(error);
132
+ try {
133
+ await fs.appendFile(filePath, ' ],\n');
134
+ await fs.appendFile(filePath, ` "error": ${JSON.stringify(error)}\n`);
135
+ await fs.appendFile(filePath, '}\n');
136
+ } catch (err) {
137
+ this.logger.error('Failed to finalize recording file with error', { error: err });
138
+ }
139
+ return result!;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Generates a file path for storing circuit recordings. The format of the filename is:
145
+ * `circuit_name_circuit_function_name_YYYY-MM-DD_N.json` where N is a counter to ensure unique filenames.
146
+ * @param recordDir - Base directory for recordings
147
+ * @param circuitName - Name of the circuit
148
+ * @param functionName - Name of the circuit function
149
+ * @param counter - Counter to ensure unique filenames. This is expected to be incremented in a loop until there is no
150
+ * existing file with the same name.
151
+ * @returns A file path for the recording.
152
+ */
153
+ function getFilePath(recordDir: string, circuitName: string, functionName: string, counter: number): string {
154
+ const date = new Date();
155
+ const formattedDate = date.toISOString().split('T')[0];
156
+ const filename = `${circuitName}_${functionName}_${formattedDate}_${counter}.json`;
157
+ return path.join(recordDir, filename);
158
+ }
@@ -0,0 +1,11 @@
1
+ import { CircuitRecorder } from './circuit_recorder.js';
2
+
3
+ /*
4
+ * In memory circuit recorder uses the default implementation. This is kept
5
+ * while we decide the fate of the FileCircuitRecorder
6
+ */
7
+ export class MemoryCircuitRecorder extends CircuitRecorder {
8
+ constructor() {
9
+ super();
10
+ }
11
+ }
@@ -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
+ }
@@ -0,0 +1,90 @@
1
+ import type { ExecutionError, ForeignCallHandler } from '@aztec/noir-acvm_js';
2
+ import { abiDecodeError } from '@aztec/noir-noirc_abi';
3
+ import { parseDebugSymbols } from '@aztec/stdlib/abi';
4
+ import type { FunctionArtifactWithContractName } from '@aztec/stdlib/abi';
5
+ import type { NoirCompiledCircuit, NoirCompiledCircuitWithName } from '@aztec/stdlib/noir';
6
+
7
+ import { type ACIRCallback, type ACIRExecutionResult, extractCallStack } from './acvm/acvm.js';
8
+ import type { ACVMWitness } from './acvm/acvm_types.js';
9
+ import type { ACVMSuccess } from './acvm_native.js';
10
+
11
+ /**
12
+ * Low level simulation interface
13
+ */
14
+ export interface CircuitSimulator {
15
+ /**
16
+ * Execute a protocol circuit/generate a witness
17
+ * @param input - The initial witness map defining all of the inputs to `circuit`.
18
+ * @param artifact - ACIR circuit bytecode and its metadata.
19
+ * @param callback - A callback to process any foreign calls from the circuit. Can be undefined as for native
20
+ * ACVM simulator we don't process foreign calls.
21
+ * @returns The solved witness calculated by executing the circuit on the provided inputs.
22
+ */
23
+ executeProtocolCircuit(
24
+ input: ACVMWitness,
25
+ artifact: NoirCompiledCircuitWithName,
26
+ callback: ForeignCallHandler | undefined,
27
+ ): Promise<ACVMSuccess>;
28
+
29
+ /**
30
+ * Execute a user circuit (smart contract function)/generate a witness
31
+ * @param input - The initial witness map defining all of the inputs to `circuit`.
32
+ * @param artifact - Contract function ACIR circuit bytecode and its metadata.
33
+ * @param callback - A callback to process any foreign calls from the circuit.
34
+ * @returns The solved witness calculated by executing the circuit on the provided inputs, as well as the return
35
+ * witness indices as specified by the circuit.
36
+ */
37
+ executeUserCircuit(
38
+ input: ACVMWitness,
39
+ artifact: FunctionArtifactWithContractName,
40
+ callback: ACIRCallback,
41
+ ): Promise<ACIRExecutionResult>;
42
+ }
43
+
44
+ export type DecodedError = ExecutionError & { decodedAssertionPayload?: any; noirCallStack?: string[] };
45
+
46
+ // Payload parsing taken from noir/noir-repo/tooling/noir_js/src/witness_generation.ts.
47
+ // TODO: import this in isolation without having to import noir_js in its entirety.
48
+ export function enrichNoirError(artifact: NoirCompiledCircuit, originalError: ExecutionError): DecodedError {
49
+ const enrichedError = originalError as DecodedError;
50
+
51
+ if (originalError.rawAssertionPayload) {
52
+ try {
53
+ // Decode the payload
54
+ const decodedPayload = abiDecodeError(artifact.abi, originalError.rawAssertionPayload);
55
+
56
+ if (typeof decodedPayload === 'string') {
57
+ // If it's a string, just add it to the error message
58
+ enrichedError.message = `Circuit execution failed: ${decodedPayload}`;
59
+ } else {
60
+ // If not, attach the payload to the original error
61
+ enrichedError.decodedAssertionPayload = decodedPayload;
62
+ }
63
+ } catch {
64
+ // Ignore errors decoding the payload
65
+ }
66
+ }
67
+
68
+ try {
69
+ // Decode the callstack
70
+ const callStack = extractCallStack(originalError, {
71
+ // TODO(https://github.com/AztecProtocol/aztec-packages/issues/5813)
72
+ // We only support handling debug info for the circuit entry point.
73
+ // So for now we simply index into the first debug info.
74
+ debugSymbols: parseDebugSymbols(artifact.debug_symbols)[0],
75
+ files: artifact.file_map,
76
+ });
77
+
78
+ enrichedError.noirCallStack = callStack?.map(errorLocation => {
79
+ if (typeof errorLocation === 'string') {
80
+ return `at opcode ${errorLocation}`;
81
+ } else {
82
+ return `at ${errorLocation.locationText} (${errorLocation.filePath}:${errorLocation.line}:${errorLocation.column})`;
83
+ }
84
+ });
85
+ } catch {
86
+ // Ignore errors resolving the callstack
87
+ }
88
+
89
+ return enrichedError;
90
+ }