@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.24de95ac

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 (466) hide show
  1. package/README.md +6 -0
  2. package/dest/client.d.ts +5 -3
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +4 -7
  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 +0 -1
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/private/acvm/acvm.d.ts +11 -5
  12. package/dest/private/acvm/acvm.d.ts.map +1 -1
  13. package/dest/private/acvm/acvm.js +10 -16
  14. package/dest/private/acvm/acvm_types.d.ts +1 -1
  15. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  16. package/dest/private/acvm/deserialize.d.ts +17 -18
  17. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.js +31 -23
  19. package/dest/private/acvm/index.d.ts +0 -1
  20. package/dest/private/acvm/index.d.ts.map +1 -1
  21. package/dest/private/acvm/index.js +0 -1
  22. package/dest/private/acvm/serialize.d.ts +19 -2
  23. package/dest/private/acvm/serialize.d.ts.map +1 -1
  24. package/dest/private/acvm/serialize.js +53 -0
  25. package/dest/private/{providers/acvm_native.d.ts → acvm_native.d.ts} +9 -10
  26. package/dest/private/acvm_native.d.ts.map +1 -0
  27. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  28. package/dest/private/acvm_wasm.d.ts +15 -0
  29. package/dest/private/acvm_wasm.d.ts.map +1 -0
  30. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  31. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  32. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  33. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  34. package/dest/private/circuit_recording/circuit_recorder.d.ts +108 -0
  35. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  36. package/dest/private/circuit_recording/circuit_recorder.js +209 -0
  37. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -0
  38. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  40. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +5 -0
  41. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  43. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  44. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  46. package/dest/private/circuit_simulator.d.ts +35 -0
  47. package/dest/private/circuit_simulator.d.ts.map +1 -0
  48. package/dest/private/circuit_simulator.js +43 -0
  49. package/dest/private/factory.d.ts +12 -0
  50. package/dest/private/factory.d.ts.map +1 -0
  51. package/dest/private/{providers/factory.js → factory.js} +2 -2
  52. package/dest/public/avm/avm_context.d.ts +5 -5
  53. package/dest/public/avm/avm_context.d.ts.map +1 -1
  54. package/dest/public/avm/avm_contract_call_result.d.ts +4 -2
  55. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.js +11 -7
  57. package/dest/public/avm/avm_execution_environment.d.ts +3 -1
  58. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  59. package/dest/public/avm/avm_execution_environment.js +7 -2
  60. package/dest/public/avm/avm_gas.d.ts +4 -20
  61. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  62. package/dest/public/avm/avm_gas.js +27 -35
  63. package/dest/public/avm/avm_machine_state.d.ts +2 -0
  64. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  65. package/dest/public/avm/avm_machine_state.js +2 -0
  66. package/dest/public/avm/avm_memory_types.d.ts +98 -87
  67. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  68. package/dest/public/avm/avm_memory_types.js +17 -6
  69. package/dest/public/avm/avm_simulator.d.ts +4 -5
  70. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  71. package/dest/public/avm/avm_simulator.js +23 -35
  72. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  73. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  74. package/dest/public/avm/avm_simulator_interface.js +3 -0
  75. package/dest/public/avm/errors.d.ts +6 -30
  76. package/dest/public/avm/errors.d.ts.map +1 -1
  77. package/dest/public/avm/errors.js +7 -57
  78. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +5 -4
  79. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  80. package/dest/public/avm/fixtures/avm_simulation_tester.js +12 -14
  81. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +6 -4
  82. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +37 -14
  84. package/dest/public/avm/fixtures/initializers.d.ts +43 -0
  85. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  86. package/dest/public/avm/fixtures/initializers.js +42 -0
  87. package/dest/public/avm/fixtures/utils.d.ts +38 -0
  88. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  89. package/dest/public/avm/fixtures/utils.js +95 -0
  90. package/dest/public/avm/index.d.ts +0 -2
  91. package/dest/public/avm/index.d.ts.map +1 -1
  92. package/dest/public/avm/index.js +0 -2
  93. package/dest/public/avm/opcodes/accrued_substate.d.ts +2 -2
  94. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  95. package/dest/public/avm/opcodes/accrued_substate.js +28 -25
  96. package/dest/public/avm/opcodes/addressing_mode.d.ts +11 -7
  97. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  98. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  99. package/dest/public/avm/opcodes/arithmetic.d.ts +11 -1
  100. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  101. package/dest/public/avm/opcodes/arithmetic.js +16 -2
  102. package/dest/public/avm/opcodes/bitwise.d.ts +5 -13
  103. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  104. package/dest/public/avm/opcodes/bitwise.js +19 -26
  105. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/comparators.js +3 -3
  107. package/dest/public/avm/opcodes/contract.d.ts +1 -2
  108. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/contract.js +9 -10
  110. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  111. package/dest/public/avm/opcodes/control_flow.js +10 -8
  112. package/dest/public/avm/opcodes/conversion.d.ts +1 -0
  113. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  114. package/dest/public/avm/opcodes/conversion.js +267 -3
  115. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  116. package/dest/public/avm/opcodes/ec_add.js +6 -6
  117. package/dest/public/avm/opcodes/environment_getters.d.ts +2 -2
  118. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  119. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  120. package/dest/public/avm/opcodes/external_calls.d.ts +8 -7
  121. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  122. package/dest/public/avm/opcodes/external_calls.js +39 -34
  123. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/hashing.js +6 -6
  125. package/dest/public/avm/opcodes/instruction.d.ts +14 -10
  126. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/instruction.js +23 -19
  128. package/dest/public/avm/opcodes/memory.d.ts +4 -4
  129. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/memory.js +37 -33
  131. package/dest/public/avm/opcodes/misc.d.ts +2 -1
  132. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/misc.js +41 -16
  134. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  135. package/dest/public/avm/opcodes/storage.js +7 -5
  136. package/dest/public/avm/revert_reason.d.ts +18 -0
  137. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  138. package/dest/public/avm/revert_reason.js +38 -0
  139. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -2
  140. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  141. package/dest/public/avm/serialization/bytecode_serialization.d.ts +2 -6
  142. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  143. package/dest/public/avm/serialization/bytecode_serialization.js +70 -69
  144. package/dest/public/avm/serialization/instruction_serialization.d.ts +13 -4
  145. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  146. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  147. package/dest/public/avm/test_utils.d.ts +10 -13
  148. package/dest/public/avm/test_utils.d.ts.map +1 -1
  149. package/dest/public/avm/test_utils.js +16 -24
  150. package/dest/public/db_interfaces.d.ts +56 -0
  151. package/dest/public/db_interfaces.d.ts.map +1 -0
  152. package/dest/public/db_interfaces.js +3 -0
  153. package/dest/public/debug_fn_name.d.ts +5 -0
  154. package/dest/public/debug_fn_name.d.ts.map +1 -0
  155. package/dest/public/debug_fn_name.js +9 -0
  156. package/dest/public/executor_metrics.d.ts +10 -3
  157. package/dest/public/executor_metrics.d.ts.map +1 -1
  158. package/dest/public/executor_metrics.js +37 -6
  159. package/dest/public/executor_metrics_interface.d.ts +9 -0
  160. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  161. package/dest/public/executor_metrics_interface.js +1 -0
  162. package/dest/public/fixtures/amm_test.d.ts +10 -0
  163. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  164. package/dest/public/fixtures/amm_test.js +213 -0
  165. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  166. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  167. package/dest/public/fixtures/bulk_test.js +326 -0
  168. package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
  169. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  170. package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
  171. package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
  172. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  173. package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
  174. package/dest/public/fixtures/index.d.ts +7 -0
  175. package/dest/public/fixtures/index.d.ts.map +1 -1
  176. package/dest/public/fixtures/index.js +7 -0
  177. package/dest/public/fixtures/minimal_public_tx.d.ts +10 -0
  178. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  179. package/dest/public/fixtures/minimal_public_tx.js +29 -0
  180. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -13
  181. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  182. package/dest/public/fixtures/public_tx_simulation_tester.js +96 -71
  183. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.d.ts +6 -6
  184. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  185. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  186. package/dest/public/fixtures/token_test.d.ts +8 -0
  187. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  188. package/dest/public/fixtures/token_test.js +95 -0
  189. package/dest/public/fixtures/utils.d.ts +16 -3
  190. package/dest/public/fixtures/utils.d.ts.map +1 -1
  191. package/dest/public/fixtures/utils.js +100 -58
  192. package/dest/public/hinting_db_sources.d.ts +70 -0
  193. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  194. package/dest/public/hinting_db_sources.js +297 -0
  195. package/dest/public/index.d.ts +4 -8
  196. package/dest/public/index.d.ts.map +1 -1
  197. package/dest/public/index.js +4 -7
  198. package/dest/public/public_db_sources.d.ts +30 -39
  199. package/dest/public/public_db_sources.d.ts.map +1 -1
  200. package/dest/public/public_db_sources.js +151 -67
  201. package/dest/public/public_errors.d.ts +12 -0
  202. package/dest/public/public_errors.d.ts.map +1 -0
  203. package/dest/public/public_errors.js +13 -0
  204. package/dest/public/public_processor/guarded_merkle_tree.d.ts +49 -0
  205. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  206. package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
  207. package/dest/public/public_processor/public_processor.d.ts +25 -30
  208. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  209. package/dest/public/public_processor/public_processor.js +141 -96
  210. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  211. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  212. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  213. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +41 -0
  214. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  215. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +89 -0
  216. package/dest/public/public_tx_simulator/index.d.ts +4 -0
  217. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  218. package/dest/public/public_tx_simulator/index.js +2 -0
  219. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +24 -0
  220. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  221. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  222. package/dest/public/public_tx_simulator/public_tx_context.d.ts +19 -29
  223. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  224. package/dest/public/public_tx_simulator/public_tx_context.js +63 -91
  225. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +45 -47
  226. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  227. package/dest/public/public_tx_simulator/public_tx_simulator.js +209 -184
  228. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -0
  229. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  230. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  231. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  232. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  233. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  234. package/dest/public/side_effect_errors.d.ts +41 -1
  235. package/dest/public/side_effect_errors.d.ts.map +1 -1
  236. package/dest/public/side_effect_errors.js +70 -1
  237. package/dest/public/side_effect_trace.d.ts +20 -65
  238. package/dest/public/side_effect_trace.d.ts.map +1 -1
  239. package/dest/public/side_effect_trace.js +71 -121
  240. package/dest/public/side_effect_trace_interface.d.ts +11 -22
  241. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  242. package/dest/public/state_manager/index.d.ts +2 -0
  243. package/dest/public/state_manager/index.d.ts.map +1 -0
  244. package/dest/public/state_manager/index.js +1 -0
  245. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +2 -5
  246. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  247. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  248. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +2 -2
  249. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  250. package/dest/public/{avm/journal/journal.d.ts → state_manager/state_manager.d.ts} +42 -85
  251. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  252. package/dest/public/state_manager/state_manager.js +391 -0
  253. package/dest/public/test_executor_metrics.d.ts +54 -0
  254. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  255. package/dest/public/test_executor_metrics.js +306 -0
  256. package/dest/public/unique_class_ids.d.ts.map +1 -1
  257. package/dest/public/utils.d.ts +2 -4
  258. package/dest/public/utils.d.ts.map +1 -1
  259. package/dest/public/utils.js +4 -21
  260. package/dest/server.d.ts +6 -3
  261. package/dest/server.d.ts.map +1 -1
  262. package/dest/server.js +5 -2
  263. package/dest/testing.d.ts +2 -0
  264. package/dest/testing.d.ts.map +1 -0
  265. package/dest/testing.js +1 -0
  266. package/package.json +36 -31
  267. package/src/client.ts +5 -3
  268. package/src/common/errors.ts +79 -44
  269. package/src/common/index.ts +0 -1
  270. package/src/private/acvm/acvm.ts +17 -32
  271. package/src/private/acvm/acvm_types.ts +1 -1
  272. package/src/private/acvm/deserialize.ts +35 -29
  273. package/src/private/acvm/index.ts +0 -1
  274. package/src/private/acvm/serialize.ts +63 -0
  275. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  276. package/src/private/acvm_wasm.ts +72 -0
  277. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  278. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  279. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  280. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  281. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  282. package/src/private/circuit_simulator.ts +90 -0
  283. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  284. package/src/public/avm/avm_context.ts +4 -4
  285. package/src/public/avm/avm_contract_call_result.ts +17 -5
  286. package/src/public/avm/avm_execution_environment.ts +10 -1
  287. package/src/public/avm/avm_gas.ts +23 -35
  288. package/src/public/avm/avm_machine_state.ts +5 -0
  289. package/src/public/avm/avm_memory_types.ts +19 -6
  290. package/src/public/avm/avm_simulator.ts +44 -54
  291. package/src/public/avm/avm_simulator_interface.ts +8 -0
  292. package/src/public/avm/errors.ts +8 -77
  293. package/src/public/avm/fixtures/avm_simulation_tester.ts +23 -20
  294. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
  295. package/src/public/avm/fixtures/initializers.ts +104 -0
  296. package/src/public/avm/fixtures/utils.ts +150 -0
  297. package/src/public/avm/index.ts +0 -2
  298. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  299. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  300. package/src/public/avm/opcodes/arithmetic.ts +24 -2
  301. package/src/public/avm/opcodes/bitwise.ts +33 -29
  302. package/src/public/avm/opcodes/comparators.ts +6 -3
  303. package/src/public/avm/opcodes/contract.ts +10 -7
  304. package/src/public/avm/opcodes/control_flow.ts +19 -10
  305. package/src/public/avm/opcodes/conversion.ts +27 -3
  306. package/src/public/avm/opcodes/ec_add.ts +9 -6
  307. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  308. package/src/public/avm/opcodes/external_calls.ts +61 -29
  309. package/src/public/avm/opcodes/hashing.ts +28 -8
  310. package/src/public/avm/opcodes/instruction.ts +31 -21
  311. package/src/public/avm/opcodes/memory.ts +71 -32
  312. package/src/public/avm/opcodes/misc.ts +60 -18
  313. package/src/public/avm/opcodes/storage.ts +22 -6
  314. package/src/public/avm/revert_reason.ts +55 -0
  315. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  316. package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
  317. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  318. package/src/public/avm/test_utils.ts +24 -41
  319. package/src/public/db_interfaces.ts +61 -0
  320. package/src/{common → public}/debug_fn_name.ts +7 -7
  321. package/src/public/executor_metrics.ts +55 -6
  322. package/src/public/executor_metrics_interface.ts +14 -0
  323. package/src/public/fixtures/amm_test.ts +331 -0
  324. package/src/public/fixtures/bulk_test.ts +169 -0
  325. package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
  326. package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
  327. package/src/public/fixtures/index.ts +7 -0
  328. package/src/public/fixtures/minimal_public_tx.ts +36 -0
  329. package/src/public/fixtures/public_tx_simulation_tester.ts +158 -113
  330. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
  331. package/src/public/fixtures/token_test.ts +140 -0
  332. package/src/public/fixtures/utils.ts +141 -68
  333. package/src/public/hinting_db_sources.ts +505 -0
  334. package/src/public/index.ts +9 -8
  335. package/src/public/public_db_sources.ts +196 -97
  336. package/src/public/public_errors.ts +14 -0
  337. package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
  338. package/src/public/public_processor/public_processor.ts +191 -153
  339. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  340. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +128 -0
  341. package/src/public/public_tx_simulator/index.ts +3 -0
  342. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +109 -0
  343. package/src/public/public_tx_simulator/public_tx_context.ts +160 -193
  344. package/src/public/public_tx_simulator/public_tx_simulator.ts +294 -220
  345. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +11 -0
  346. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  347. package/src/public/side_effect_errors.ts +91 -1
  348. package/src/public/side_effect_trace.ts +94 -320
  349. package/src/public/side_effect_trace_interface.ts +10 -58
  350. package/src/public/state_manager/index.ts +1 -0
  351. package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
  352. package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
  353. package/src/public/state_manager/state_manager.ts +560 -0
  354. package/src/public/test_executor_metrics.ts +395 -0
  355. package/src/public/utils.ts +5 -21
  356. package/src/server.ts +6 -3
  357. package/src/testing.ts +1 -0
  358. package/dest/common/db_interfaces.d.ts +0 -80
  359. package/dest/common/db_interfaces.d.ts.map +0 -1
  360. package/dest/common/db_interfaces.js +0 -1
  361. package/dest/common/debug_fn_name.d.ts +0 -5
  362. package/dest/common/debug_fn_name.d.ts.map +0 -1
  363. package/dest/common/debug_fn_name.js +0 -6
  364. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  365. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  366. package/dest/common/message_load_oracle_inputs.js +0 -15
  367. package/dest/private/acvm/oracle/index.d.ts +0 -14
  368. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  369. package/dest/private/acvm/oracle/index.js +0 -2
  370. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  371. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  372. package/dest/private/acvm/oracle/oracle.js +0 -263
  373. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  374. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  375. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  376. package/dest/private/execution_data_provider.d.ts +0 -261
  377. package/dest/private/execution_data_provider.d.ts.map +0 -1
  378. package/dest/private/execution_data_provider.js +0 -14
  379. package/dest/private/execution_note_cache.d.ts +0 -93
  380. package/dest/private/execution_note_cache.d.ts.map +0 -1
  381. package/dest/private/execution_note_cache.js +0 -180
  382. package/dest/private/hashed_values_cache.d.ts +0 -28
  383. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  384. package/dest/private/hashed_values_cache.js +0 -46
  385. package/dest/private/index.d.ts +0 -13
  386. package/dest/private/index.d.ts.map +0 -1
  387. package/dest/private/index.js +0 -12
  388. package/dest/private/pick_notes.d.ts +0 -85
  389. package/dest/private/pick_notes.d.ts.map +0 -1
  390. package/dest/private/pick_notes.js +0 -51
  391. package/dest/private/private_execution.d.ts +0 -25
  392. package/dest/private/private_execution.d.ts.map +0 -1
  393. package/dest/private/private_execution.js +0 -92
  394. package/dest/private/private_execution_oracle.d.ts +0 -215
  395. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  396. package/dest/private/private_execution_oracle.js +0 -382
  397. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  398. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  399. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  400. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  401. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  402. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  403. package/dest/private/providers/factory.d.ts +0 -12
  404. package/dest/private/providers/factory.d.ts.map +0 -1
  405. package/dest/private/providers/simulation_provider.d.ts +0 -19
  406. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  407. package/dest/private/providers/simulation_provider.js +0 -24
  408. package/dest/private/simulator.d.ts +0 -34
  409. package/dest/private/simulator.d.ts.map +0 -1
  410. package/dest/private/simulator.js +0 -76
  411. package/dest/private/unconstrained_execution.d.ts +0 -10
  412. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  413. package/dest/private/unconstrained_execution.js +0 -27
  414. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  415. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  416. package/dest/private/unconstrained_execution_oracle.js +0 -258
  417. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  418. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  419. package/dest/public/avm/bytecode_utils.js +0 -17
  420. package/dest/public/avm/fixtures/index.d.ts +0 -84
  421. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  422. package/dest/public/avm/fixtures/index.js +0 -175
  423. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  424. package/dest/public/avm/journal/index.d.ts +0 -2
  425. package/dest/public/avm/journal/index.d.ts.map +0 -1
  426. package/dest/public/avm/journal/index.js +0 -1
  427. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  428. package/dest/public/avm/journal/journal.js +0 -486
  429. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  430. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  431. package/dest/public/bytecode_errors.d.ts +0 -4
  432. package/dest/public/bytecode_errors.d.ts.map +0 -1
  433. package/dest/public/bytecode_errors.js +0 -6
  434. package/dest/public/execution.d.ts +0 -108
  435. package/dest/public/execution.d.ts.map +0 -1
  436. package/dest/public/execution.js +0 -9
  437. package/dest/test/utils.d.ts +0 -13
  438. package/dest/test/utils.d.ts.map +0 -1
  439. package/dest/test/utils.js +0 -22
  440. package/src/common/db_interfaces.ts +0 -94
  441. package/src/common/message_load_oracle_inputs.ts +0 -15
  442. package/src/private/acvm/oracle/index.ts +0 -16
  443. package/src/private/acvm/oracle/oracle.ts +0 -455
  444. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  445. package/src/private/execution_data_provider.ts +0 -323
  446. package/src/private/execution_note_cache.ts +0 -217
  447. package/src/private/hashed_values_cache.ts +0 -55
  448. package/src/private/index.ts +0 -16
  449. package/src/private/pick_notes.ts +0 -141
  450. package/src/private/private_execution.ts +0 -151
  451. package/src/private/private_execution_oracle.ts +0 -614
  452. package/src/private/providers/acvm_wasm.ts +0 -63
  453. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  454. package/src/private/providers/simulation_provider.ts +0 -45
  455. package/src/private/simulator.ts +0 -147
  456. package/src/private/unconstrained_execution.ts +0 -50
  457. package/src/private/unconstrained_execution_oracle.ts +0 -373
  458. package/src/public/avm/bytecode_utils.ts +0 -17
  459. package/src/public/avm/fixtures/index.ts +0 -296
  460. package/src/public/avm/journal/index.ts +0 -1
  461. package/src/public/avm/journal/journal.ts +0 -742
  462. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  463. package/src/public/bytecode_errors.ts +0 -6
  464. package/src/public/execution.ts +0 -140
  465. package/src/test/utils.ts +0 -36
  466. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -1,36 +1,49 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import { AVM_MAX_PROCESSABLE_L2_GAS, DEFAULT_MAX_DEBUG_LOG_MEMORY_READS } from '@aztec/constants';
2
+ import { Fr } from '@aztec/foundation/fields';
2
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
- import { Timer } from '@aztec/foundation/timer';
4
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
4
+ import { ProtocolContractAddress, ProtocolContractsList } from '@aztec/protocol-contracts';
5
5
  import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
6
- import type { AvmProvingRequest, RevertCode } from '@aztec/stdlib/avm';
6
+ import {
7
+ AvmCircuitInputs,
8
+ AvmCircuitPublicInputs,
9
+ AvmExecutionHints,
10
+ type AvmProvingRequest,
11
+ AvmTxHint,
12
+ type RevertCode,
13
+ } from '@aztec/stdlib/avm';
7
14
  import { SimulationError } from '@aztec/stdlib/errors';
8
15
  import type { Gas, GasUsed } from '@aztec/stdlib/gas';
9
- import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
10
- import type { PublicCallRequest } from '@aztec/stdlib/kernel';
11
- import type { AvmSimulationStats } from '@aztec/stdlib/stats';
16
+ import type { DebugLog } from '@aztec/stdlib/logs';
17
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
18
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
12
19
  import {
13
20
  type GlobalVariables,
14
21
  NestedProcessReturnValues,
15
- PublicExecutionRequest,
22
+ PublicCallRequestWithCalldata,
16
23
  Tx,
17
24
  TxExecutionPhase,
18
25
  } from '@aztec/stdlib/tx';
19
- import { Attributes, type TelemetryClient, type Tracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
20
26
 
21
27
  import { strict as assert } from 'assert';
22
28
 
23
- import { getPublicFunctionDebugName } from '../../common/debug_fn_name.js';
24
29
  import type { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
25
- import { type AvmPersistableStateManager, AvmSimulator } from '../avm/index.js';
26
- import { NullifierCollisionError } from '../avm/journal/nullifiers.js';
27
- import { ExecutorMetrics } from '../executor_metrics.js';
28
- import type { WorldStateDB } from '../public_db_sources.js';
30
+ import { AvmSimulator } from '../avm/index.js';
31
+ import { getPublicFunctionDebugName } from '../debug_fn_name.js';
32
+ import { HintingMerkleWriteOperations, HintingPublicContractsDB } from '../hinting_db_sources.js';
33
+ import { type PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
34
+ import {
35
+ L2ToL1MessageLimitReachedError,
36
+ NoteHashLimitReachedError,
37
+ NullifierCollisionError,
38
+ NullifierLimitReachedError,
39
+ } from '../side_effect_errors.js';
40
+ import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
29
41
  import { PublicTxContext } from './public_tx_context.js';
42
+ import type { PublicTxSimulatorInterface } from './public_tx_simulator_interface.js';
30
43
 
31
44
  export type ProcessedPhase = {
32
45
  phase: TxExecutionPhase;
33
- durationMs: number;
46
+ durationMs?: number;
34
47
  returnValues: NestedProcessReturnValues[];
35
48
  reverted: boolean;
36
49
  revertReason?: SimulationError;
@@ -44,28 +57,72 @@ export type PublicTxResult = {
44
57
  /** Revert reason, if any */
45
58
  revertReason?: SimulationError;
46
59
  processedPhases: ProcessedPhase[];
60
+ logs: DebugLog[];
61
+ };
62
+
63
+ export type PublicTxSimulatorConfig = {
64
+ proverId: Fr;
65
+ doMerkleOperations: boolean;
66
+ skipFeeEnforcement: boolean;
67
+ clientInitiatedSimulation: boolean;
68
+ maxDebugLogMemoryReads: number;
47
69
  };
48
70
 
49
- export class PublicTxSimulator {
50
- metrics: ExecutorMetrics;
71
+ // The errors below are only thrown here in the public tx simulator,
72
+ // and only during revertible phases (revertible insertions, app logic and teardown).
73
+ // These are strictly "checked" errors (not exported and never propagated).
74
+ // They are used internally for control flow to trigger rollbacks to the post-setup state.
75
+
76
+ /**
77
+ * Error thrown when public tx simulation reverts in a known/checked way during revertible insertions.
78
+ */
79
+ class TxSimRevertibleInsertionsRevert extends Error {
80
+ constructor() {
81
+ super('Public Tx Simulation reverted during Revertible Insertions');
82
+ this.name = 'TxSimRevertibleInsertionsRevert';
83
+ }
84
+ }
51
85
 
52
- private log: Logger;
86
+ /**
87
+ * Error thrown when public tx simulation reverts during app logic.
88
+ */
89
+ class TxSimAppLogicRevert extends Error {
90
+ constructor() {
91
+ super('Public Tx Simulation reverted during App Logic');
92
+ this.name = 'TxSimAppLogicRevert';
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Error thrown when public tx simulation reverts during teardown.
98
+ */
99
+ class TxSimTeardownRevert extends Error {
100
+ constructor() {
101
+ super('Public Tx Simulation reverted during Teardown');
102
+ this.name = 'TxSimTeardownRevert';
103
+ }
104
+ }
105
+
106
+ export class PublicTxSimulator implements PublicTxSimulatorInterface {
107
+ protected log: Logger;
108
+ private config: PublicTxSimulatorConfig;
53
109
 
54
110
  constructor(
55
- private db: MerkleTreeReadOperations,
56
- private worldStateDB: WorldStateDB,
57
- private globalVariables: GlobalVariables,
58
- private doMerkleOperations: boolean = false,
59
- private skipFeeEnforcement: boolean = false,
60
- telemetryClient: TelemetryClient = getTelemetryClient(),
111
+ protected merkleTree: MerkleTreeWriteOperations,
112
+ protected contractsDB: PublicContractsDB,
113
+ protected globalVariables: GlobalVariables,
114
+ config?: Partial<PublicTxSimulatorConfig>,
61
115
  ) {
116
+ this.config = {
117
+ proverId: config?.proverId ?? Fr.ZERO,
118
+ doMerkleOperations: config?.doMerkleOperations ?? false,
119
+ skipFeeEnforcement: config?.skipFeeEnforcement ?? false,
120
+ clientInitiatedSimulation: config?.clientInitiatedSimulation ?? false,
121
+ maxDebugLogMemoryReads: config?.maxDebugLogMemoryReads ?? DEFAULT_MAX_DEBUG_LOG_MEMORY_READS,
122
+ };
62
123
  this.log = createLogger(`simulator:public_tx_simulator`);
63
- this.metrics = new ExecutorMetrics(telemetryClient, 'PublicTxSimulator');
64
124
  }
65
125
 
66
- get tracer(): Tracer {
67
- return this.metrics.tracer;
68
- }
69
126
  /**
70
127
  * Simulate a transaction's public portion including all of its phases.
71
128
  * @param tx - The transaction to simulate.
@@ -73,74 +130,114 @@ export class PublicTxSimulator {
73
130
  */
74
131
  public async simulate(tx: Tx): Promise<PublicTxResult> {
75
132
  try {
76
- const startTime = process.hrtime.bigint();
133
+ const txHash = this.computeTxHash(tx);
134
+ this.log.debug(`Simulating ${tx.publicFunctionCalldata.length} public calls for tx ${txHash}`, { txHash });
77
135
 
78
- const txHash = await tx.getTxHash();
79
- this.log.debug(`Simulating ${tx.enqueuedPublicFunctionCalls.length} public calls for tx ${txHash}`, { txHash });
136
+ // Create hinting DBs.
137
+ const hints = new AvmExecutionHints(
138
+ this.globalVariables,
139
+ AvmTxHint.fromTx(tx, this.globalVariables.gasFees),
140
+ ProtocolContractsList, // imported from file
141
+ );
142
+ const hintingMerkleTree = await HintingMerkleWriteOperations.create(this.merkleTree, hints);
143
+ const hintingTreesDB = new PublicTreesDB(hintingMerkleTree);
144
+ const hintingContractsDB = new HintingPublicContractsDB(this.contractsDB, hints);
80
145
 
81
146
  const context = await PublicTxContext.create(
82
- this.db,
83
- this.worldStateDB,
147
+ hintingTreesDB,
148
+ hintingContractsDB,
84
149
  tx,
85
150
  this.globalVariables,
86
- this.doMerkleOperations,
151
+ ProtocolContractsList, // imported from file
152
+ this.config.doMerkleOperations,
153
+ this.config.proverId,
87
154
  );
88
155
 
89
- const nonRevertStart = process.hrtime.bigint();
90
- await this.insertNonRevertiblesFromPrivate(context);
91
- // add new contracts to the contracts db so that their functions may be found and called
92
- // TODO(#6464): Should we allow emitting contracts in the private setup phase?
93
- await this.worldStateDB.addNewNonRevertibleContracts(tx);
94
- const nonRevertEnd = process.hrtime.bigint();
95
- this.metrics.recordPrivateEffectsInsertion(Number(nonRevertEnd - nonRevertStart) / 1_000, 'non-revertible');
156
+ // This will throw if there is a nullifier collision.
157
+ // In that case the transaction will be thrown out.
158
+ await this.insertNonRevertiblesFromPrivate(context, tx);
96
159
 
97
160
  const processedPhases: ProcessedPhase[] = [];
98
161
  if (context.hasPhase(TxExecutionPhase.SETUP)) {
99
- const setupResult: ProcessedPhase = await this.simulateSetupPhase(context);
162
+ // This will throw if the setup phase reverts.
163
+ // In that case the transaction will be thrown out.
164
+ const setupResult = await this.simulatePhase(TxExecutionPhase.SETUP, context);
165
+ if (setupResult.reverted) {
166
+ throw new Error(
167
+ `Setup phase reverted! The transaction will be thrown out. ${setupResult.revertReason?.message}`,
168
+ );
169
+ }
100
170
  processedPhases.push(setupResult);
101
171
  }
102
172
 
103
- const revertStart = process.hrtime.bigint();
104
- const success = await this.insertRevertiblesFromPrivate(context);
105
- if (success) {
106
- // add new contracts to the contracts db so that their functions may be found and called
107
- await this.worldStateDB.addNewRevertibleContracts(tx);
108
- const revertEnd = process.hrtime.bigint();
109
- this.metrics.recordPrivateEffectsInsertion(Number(revertEnd - revertStart) / 1_000, 'revertible');
173
+ // The checkpoint we should go back to if anything from now on reverts.
174
+ await context.state.fork();
175
+
176
+ try {
177
+ // This will throw if there is a nullifier collision or other insertion error (limit reached).
178
+ await this.insertRevertiblesFromPrivate(context, tx);
110
179
 
111
- // Only proceed with app logic if there was no revert during revertible insertion
180
+ // Only proceed with app logic if there was no revert during revertible insertion.
112
181
  if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
113
- const appLogicResult: ProcessedPhase = await this.simulateAppLogicPhase(context);
182
+ const appLogicResult = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
114
183
  processedPhases.push(appLogicResult);
184
+ if (appLogicResult.reverted) {
185
+ throw new TxSimAppLogicRevert();
186
+ }
187
+ }
188
+ } catch (e: any) {
189
+ if (e instanceof TxSimRevertibleInsertionsRevert || e instanceof TxSimAppLogicRevert) {
190
+ // We revert to the post-setup state.
191
+ await context.state.discardForkedState();
192
+ // But we also create a new fork so that the teardown phase can transparently
193
+ // commit or rollback at the end of teardown.
194
+ await context.state.fork();
195
+ } else {
196
+ // Unchecked/unknown error - re-throw as-is
197
+ throw e;
115
198
  }
116
- } else {
117
- this.log.debug(`Revertible insertions failed. Skipping app logic.`);
118
199
  }
119
200
 
120
- if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
121
- const teardownResult: ProcessedPhase = await this.simulateTeardownPhase(context);
122
- processedPhases.push(teardownResult);
201
+ try {
202
+ if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
203
+ const teardownResult = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
204
+ processedPhases.push(teardownResult);
205
+ if (teardownResult.reverted) {
206
+ throw new TxSimTeardownRevert();
207
+ }
208
+ }
209
+ // We commit the forked state and we are done.
210
+ await context.state.mergeForkedState();
211
+ } catch (e: any) {
212
+ if (e instanceof TxSimTeardownRevert) {
213
+ // We revert to the post-setup state and we are done.
214
+ await context.state.discardForkedState();
215
+ } else {
216
+ // Unchecked/unknown error - re-throw as-is
217
+ throw e;
218
+ }
123
219
  }
124
220
 
125
- await context.halt();
126
- await this.payFee(context);
221
+ context.halt();
127
222
 
128
- const endStateReference = await this.db.getStateReference();
223
+ // Such transactions should be filtered by GasTxValidator.
224
+ assert(
225
+ context.getActualGasUsed().l2Gas <= AVM_MAX_PROCESSABLE_L2_GAS,
226
+ `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the AVM maximum processable gas of ${AVM_MAX_PROCESSABLE_L2_GAS}`,
227
+ );
228
+ await this.payFee(context);
129
229
 
130
- const avmProvingRequest = await context.generateProvingRequest(endStateReference);
230
+ const publicInputs = await context.generateAvmCircuitPublicInputs();
231
+ const avmProvingRequest = PublicTxSimulator.generateProvingRequest(publicInputs, hints);
131
232
 
132
233
  const revertCode = context.getFinalRevertCode();
133
234
 
134
- if (!revertCode.isOK()) {
135
- await tx.filterRevertedLogs();
136
- }
137
235
  // Commit contracts from this TX to the block-level cache and clear tx cache
138
236
  // If the tx reverted, only commit non-revertible contracts
139
237
  // NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
140
- this.worldStateDB.commitContractsForTx(/*onlyNonRevertibles=*/ !revertCode.isOK());
141
-
142
- const endTime = process.hrtime.bigint();
143
- this.log.debug(`Public TX simulator took ${Number(endTime - startTime) / 1_000_000} ms\n`);
238
+ // FIXME(fcarreiro): this should conceptually use the hinted contracts db.
239
+ // However things should work as they are now because the hinted db would still pick up the new contracts.
240
+ this.contractsDB.commitContractsForTx(/*onlyNonRevertibles=*/ !revertCode.isOK());
144
241
 
145
242
  return {
146
243
  avmProvingRequest,
@@ -153,101 +250,46 @@ export class PublicTxSimulator {
153
250
  revertCode,
154
251
  revertReason: context.revertReason,
155
252
  processedPhases: processedPhases,
253
+ logs: context.state.getActiveStateManager().getLogs(),
156
254
  };
157
255
  } finally {
158
256
  // Make sure there are no new contracts in the tx-level cache.
159
257
  // They should either be committed to block-level cache or cleared.
160
- this.worldStateDB.clearContractsForTx();
258
+ // FIXME(fcarreiro): this should conceptually use the hinted contracts db.
259
+ // However things should work as they are now because the hinted db would still pick up the new contracts.
260
+ this.contractsDB.clearContractsForTx();
161
261
  }
162
262
  }
163
263
 
164
- /**
165
- * Simulate the setup phase of a transaction's public execution.
166
- * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
167
- * @returns The phase result.
168
- */
169
- private async simulateSetupPhase(context: PublicTxContext): Promise<ProcessedPhase> {
170
- return await this.simulatePhase(TxExecutionPhase.SETUP, context);
171
- }
172
-
173
- /**
174
- * Simulate the app logic phase of a transaction's public execution.
175
- * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
176
- * @returns The phase result.
177
- */
178
- private async simulateAppLogicPhase(context: PublicTxContext): Promise<ProcessedPhase> {
179
- assert(context.state.isForked(), 'App logic phase should operate with forked state.');
180
-
181
- const result = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
182
-
183
- if (result.reverted) {
184
- // Drop the currently active forked state manager and rollback to end of setup.
185
- await context.state.discardForkedState();
186
- } else {
187
- if (!context.hasPhase(TxExecutionPhase.TEARDOWN)) {
188
- // Nothing to do after this (no teardown), so merge state updates now instead of letting teardown handle it.
189
- await context.state.mergeForkedState();
190
- }
191
- }
192
-
193
- return result;
194
- }
195
-
196
- /**
197
- * Simulate the teardown phase of a transaction's public execution.
198
- * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
199
- * @returns The phase result.
200
- */
201
- private async simulateTeardownPhase(context: PublicTxContext): Promise<ProcessedPhase> {
202
- if (!context.state.isForked()) {
203
- // If state isn't forked (app logic reverted), fork now
204
- // so we can rollback to the end of setup if teardown reverts.
205
- await context.state.fork();
206
- }
207
-
208
- const result = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
209
-
210
- if (result.reverted) {
211
- // Drop the currently active forked state manager and rollback to end of setup.
212
- await context.state.discardForkedState();
213
- } else {
214
- // Merge state updates from teardown,
215
- await context.state.mergeForkedState();
216
- }
217
-
218
- return result;
264
+ protected computeTxHash(tx: Tx) {
265
+ return tx.getTxHash();
219
266
  }
220
267
 
221
268
  /**
222
- * Simulate a phase of a transaction's public execution.
223
- * @param phase - The current phase
269
+ * Simulate the setup phase of a transaction's public execution.
224
270
  * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
225
271
  * @returns The phase result.
226
272
  */
227
- private async simulatePhase(phase: TxExecutionPhase, context: PublicTxContext): Promise<ProcessedPhase> {
273
+ protected async simulatePhase(phase: TxExecutionPhase, context: PublicTxContext): Promise<ProcessedPhase> {
228
274
  const callRequests = context.getCallRequestsForPhase(phase);
229
- const executionRequests = context.getExecutionRequestsForPhase(phase);
230
275
 
231
276
  this.log.debug(`Processing phase ${TxExecutionPhase[phase]} for tx ${context.txHash}`, {
232
277
  txHash: context.txHash.toString(),
233
278
  phase: TxExecutionPhase[phase],
234
279
  callRequests: callRequests.length,
235
- executionRequests: executionRequests.length,
236
280
  });
237
281
 
238
282
  const returnValues: NestedProcessReturnValues[] = [];
239
283
  let reverted = false;
240
284
  let revertReason: SimulationError | undefined;
241
- const phaseTimer = new Timer();
242
- for (let i = callRequests.length - 1; i >= 0; i--) {
285
+ for (let i = 0; i < callRequests.length; i++) {
243
286
  if (reverted) {
244
287
  break;
245
288
  }
246
289
 
247
290
  const callRequest = callRequests[i];
248
- const executionRequest = executionRequests[i];
249
291
 
250
- const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest, executionRequest);
292
+ const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest);
251
293
 
252
294
  returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output));
253
295
 
@@ -259,7 +301,6 @@ export class PublicTxSimulator {
259
301
 
260
302
  return {
261
303
  phase,
262
- durationMs: phaseTimer.ms(),
263
304
  returnValues,
264
305
  reverted,
265
306
  revertReason,
@@ -270,31 +311,23 @@ export class PublicTxSimulator {
270
311
  * Simulate an enqueued public call.
271
312
  * @param phase - The current phase of public execution
272
313
  * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
273
- * @param callRequest - The enqueued call to execute
274
- * @param executionRequest - The execution request (includes args)
314
+ * @param callRequest - The public function call request, including the calldata.
275
315
  * @returns The result of execution.
276
316
  */
277
- @trackSpan('PublicTxSimulator.simulateEnqueuedCall', (phase, context, _callRequest, executionRequest) => ({
278
- [Attributes.TX_HASH]: context.txHash.toString(),
279
- [Attributes.TARGET_ADDRESS]: executionRequest.callContext.contractAddress.toString(),
280
- [Attributes.SENDER_ADDRESS]: executionRequest.callContext.msgSender.toString(),
281
- [Attributes.SIMULATOR_PHASE]: TxExecutionPhase[phase].toString(),
282
- }))
283
- private async simulateEnqueuedCall(
317
+ protected async simulateEnqueuedCall(
284
318
  phase: TxExecutionPhase,
285
319
  context: PublicTxContext,
286
- callRequest: PublicCallRequest,
287
- executionRequest: PublicExecutionRequest,
320
+ callRequest: PublicCallRequestWithCalldata,
288
321
  ): Promise<AvmFinalizedCallResult> {
289
322
  const stateManager = context.state.getActiveStateManager();
290
- const address = executionRequest.callContext.contractAddress;
291
- const fnName = await getPublicFunctionDebugName(this.worldStateDB, address, executionRequest.args);
323
+ const contractAddress = callRequest.request.contractAddress;
324
+ const fnName = await getPublicFunctionDebugName(this.contractsDB, contractAddress, callRequest.calldata);
292
325
 
293
326
  const allocatedGas = context.getGasLeftAtPhase(phase);
294
327
 
295
328
  const result = await this.simulateEnqueuedCallInternal(
296
- context.state.getActiveStateManager(),
297
- executionRequest,
329
+ stateManager,
330
+ callRequest,
298
331
  allocatedGas,
299
332
  /*transactionFee=*/ context.getTransactionFee(phase),
300
333
  fnName,
@@ -306,11 +339,9 @@ export class PublicTxSimulator {
306
339
  `Simulated enqueued public call (${fnName}) consumed ${gasUsed.l2Gas} L2 gas ending with ${result.gasLeft.l2Gas} L2 gas left.`,
307
340
  );
308
341
 
309
- stateManager.traceEnqueuedCall(callRequest, executionRequest.args, result.reverted);
310
-
311
342
  if (result.reverted) {
312
- const culprit = `${executionRequest.callContext.contractAddress}:${executionRequest.callContext.functionSelector}`;
313
- context.revert(phase, result.revertReason, culprit); // throws if in setup (non-revertible) phase
343
+ const culprit = `${contractAddress}:${callRequest.functionSelector}`;
344
+ context.revert(phase, result.revertReason, culprit);
314
345
  }
315
346
 
316
347
  return result;
@@ -324,32 +355,24 @@ export class PublicTxSimulator {
324
355
  * while still simulating phases and generating a proving request.
325
356
  *
326
357
  * @param stateManager - The state manager for AvmSimulation
327
- * @param context - The context of the currently executing public transaction portion
328
- * @param executionRequest - The execution request (includes args)
358
+ * @param callRequest - The public function call request, including the calldata.
329
359
  * @param allocatedGas - The gas allocated to the enqueued call
330
360
  * @param fnName - The name of the function
331
361
  * @returns The result of execution.
332
362
  */
333
- @trackSpan(
334
- 'PublicTxSimulator.simulateEnqueuedCallInternal',
335
- (_stateManager, _executionRequest, _allocatedGas, _transactionFee, fnName) => ({
336
- [Attributes.APP_CIRCUIT_NAME]: fnName,
337
- }),
338
- )
339
- private async simulateEnqueuedCallInternal(
340
- stateManager: AvmPersistableStateManager,
341
- executionRequest: PublicExecutionRequest,
363
+ protected async simulateEnqueuedCallInternal(
364
+ stateManager: PublicPersistableStateManager,
365
+ { request, calldata }: PublicCallRequestWithCalldata,
342
366
  allocatedGas: Gas,
343
367
  transactionFee: Fr,
344
368
  fnName: string,
345
369
  ): Promise<AvmFinalizedCallResult> {
346
- const address = executionRequest.callContext.contractAddress;
347
- const sender = executionRequest.callContext.msgSender;
370
+ const address = request.contractAddress;
371
+ const sender = request.msgSender;
348
372
 
349
373
  this.log.debug(
350
374
  `Executing enqueued public call to external function ${fnName}@${address} with ${allocatedGas.l2Gas} allocated L2 gas.`,
351
375
  );
352
- const timer = new Timer();
353
376
 
354
377
  const simulator = await AvmSimulator.create(
355
378
  stateManager,
@@ -357,87 +380,126 @@ export class PublicTxSimulator {
357
380
  sender,
358
381
  transactionFee,
359
382
  this.globalVariables,
360
- executionRequest.callContext.isStaticCall,
361
- executionRequest.args,
383
+ request.isStaticCall,
384
+ calldata,
362
385
  allocatedGas,
386
+ this.config.clientInitiatedSimulation,
387
+ this.config.maxDebugLogMemoryReads,
363
388
  );
364
389
  const avmCallResult = await simulator.execute();
365
- const result = avmCallResult.finalize();
366
-
367
- this.log.verbose(
368
- result.reverted
369
- ? `Simulation of enqueued public call ${fnName} reverted with reason ${result.revertReason}.`
370
- : `Simulation of enqueued public call ${fnName} completed successfully.`,
371
- {
372
- eventName: 'avm-simulation',
373
- appCircuitName: fnName,
374
- duration: timer.ms(),
375
- } satisfies AvmSimulationStats,
376
- );
377
-
378
- if (result.reverted) {
379
- this.metrics.recordFunctionSimulationFailure();
380
- } else {
381
- this.metrics.recordFunctionSimulation(timer.ms(), allocatedGas.sub(result.gasLeft).l2Gas, fnName);
382
- }
383
-
384
- return result;
390
+ return avmCallResult.finalize();
385
391
  }
386
392
 
387
393
  /**
388
394
  * Insert the non-revertible accumulated data from private into the public state.
389
395
  */
390
- public async insertNonRevertiblesFromPrivate(context: PublicTxContext) {
396
+ protected async insertNonRevertiblesFromPrivate(context: PublicTxContext, tx: Tx) {
391
397
  const stateManager = context.state.getActiveStateManager();
392
- try {
393
- await stateManager.writeSiloedNullifiersFromPrivate(context.nonRevertibleAccumulatedDataFromPrivate.nullifiers);
394
- } catch (e) {
395
- if (e instanceof NullifierCollisionError) {
396
- throw new NullifierCollisionError(
397
- `Nullifier collision encountered when inserting non-revertible nullifiers from private.\nDetails: ${e.message}\nStack:${e.stack}`,
398
- );
399
- }
398
+
399
+ for (const siloedNullifier of context.nonRevertibleAccumulatedDataFromPrivate.nullifiers.filter(
400
+ n => !n.isEmpty(),
401
+ )) {
402
+ await stateManager.writeSiloedNullifier(siloedNullifier);
400
403
  }
401
404
  for (const noteHash of context.nonRevertibleAccumulatedDataFromPrivate.noteHashes) {
402
405
  if (!noteHash.isEmpty()) {
403
406
  await stateManager.writeUniqueNoteHash(noteHash);
404
407
  }
405
408
  }
409
+ for (const l2ToL1Message of context.nonRevertibleAccumulatedDataFromPrivate.l2ToL1Msgs) {
410
+ if (!l2ToL1Message.isEmpty()) {
411
+ stateManager.writeScopedL2ToL1Message(l2ToL1Message);
412
+ }
413
+ }
414
+
415
+ // add new contracts to the contracts db so that their functions may be found and called
416
+ // TODO(#6464): Should we allow emitting contracts in the private setup phase?
417
+ // FIXME(fcarreiro): this should conceptually use the hinted contracts db.
418
+ // However things should work as they are now because the hinted db would still pick up the new contracts.
419
+ await this.contractsDB.addNewNonRevertibleContracts(tx);
406
420
  }
407
421
 
408
422
  /**
409
423
  * Insert the revertible accumulated data from private into the public state.
410
- * Start by forking state so we can rollback to the end of setup if app logic or teardown reverts.
424
+ * Throws TxSimRevertibleInsertionsRevert if there is some checked error during revertible insertions.
425
+ * This function checks for the following errors:
426
+ * - NullifierLimitReachedError
427
+ * - NullifierCollisionError
428
+ * - NoteHashLimitReachedError
429
+ * - L2ToL1MessageLimitReachedError
411
430
  */
412
- public async insertRevertiblesFromPrivate(context: PublicTxContext): /*success=*/ Promise<boolean> {
413
- // Fork the state manager so we can rollback to end of setup if app logic reverts.
414
- await context.state.fork();
431
+ protected async insertRevertiblesFromPrivate(context: PublicTxContext, tx: Tx) {
415
432
  const stateManager = context.state.getActiveStateManager();
433
+
416
434
  try {
417
- await stateManager.writeSiloedNullifiersFromPrivate(context.revertibleAccumulatedDataFromPrivate.nullifiers);
418
- } catch (e) {
419
- if (e instanceof NullifierCollisionError) {
420
- // Instead of throwing, revert the app_logic phase
435
+ for (const siloedNullifier of context.revertibleAccumulatedDataFromPrivate.nullifiers.filter(n => !n.isEmpty())) {
436
+ await stateManager.writeSiloedNullifier(siloedNullifier);
437
+ }
438
+ } catch (e: any) {
439
+ if (e instanceof NullifierLimitReachedError || e instanceof NullifierCollisionError) {
421
440
  context.revert(
422
441
  TxExecutionPhase.APP_LOGIC,
423
442
  new SimulationError(
424
- `Nullifier collision encountered when inserting revertible nullifiers from private\nDetails: ${e.message}\nError stack: ${e.stack}`,
443
+ `Error encountered when inserting revertible nullifiers from private.\nDetails: ${e.message}`,
425
444
  [],
426
445
  ),
427
- /*culprit=*/ 'insertRevertiblesFromPrivate',
428
446
  );
429
- return /*success=*/ false;
447
+ throw new TxSimRevertibleInsertionsRevert();
430
448
  } else {
449
+ // Unchecked/unknown error - re-throw as-is
431
450
  throw e;
432
451
  }
433
452
  }
434
- for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes) {
435
- if (!noteHash.isEmpty()) {
436
- // Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can.
437
- await stateManager.writeSiloedNoteHash(noteHash);
453
+
454
+ try {
455
+ for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes) {
456
+ if (!noteHash.isEmpty()) {
457
+ // Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can.
458
+ await stateManager.writeSiloedNoteHash(noteHash);
459
+ }
460
+ }
461
+ } catch (e: any) {
462
+ if (e instanceof NoteHashLimitReachedError) {
463
+ context.revert(
464
+ TxExecutionPhase.APP_LOGIC,
465
+ new SimulationError(
466
+ `Error encountered when inserting revertible note hashes from private.\nDetails: ${e.message}`,
467
+ [],
468
+ ),
469
+ );
470
+ throw new TxSimRevertibleInsertionsRevert();
471
+ } else {
472
+ // Unchecked/unknown error - re-throw as-is
473
+ throw e;
438
474
  }
439
475
  }
440
- return /*success=*/ true;
476
+
477
+ try {
478
+ for (const l2ToL1Message of context.revertibleAccumulatedDataFromPrivate.l2ToL1Msgs) {
479
+ if (!l2ToL1Message.isEmpty()) {
480
+ stateManager.writeScopedL2ToL1Message(l2ToL1Message);
481
+ }
482
+ }
483
+ } catch (e: any) {
484
+ if (e instanceof L2ToL1MessageLimitReachedError) {
485
+ context.revert(
486
+ TxExecutionPhase.APP_LOGIC,
487
+ new SimulationError(
488
+ `Error encountered when inserting revertible L2-to-L1 messages from private.\nDetails: ${e.message}`,
489
+ [],
490
+ ),
491
+ );
492
+ throw new TxSimRevertibleInsertionsRevert();
493
+ } else {
494
+ // Unchecked/unknown error - re-throw as-is
495
+ throw e;
496
+ }
497
+ }
498
+
499
+ // add new contracts to the contracts db so that their functions may be found and called
500
+ // FIXME(fcarreiro): this should conceptually use the hinted contracts db.
501
+ // However things should work as they are now because the hinted db would still pick up the new contracts.
502
+ await this.contractsDB.addNewRevertibleContracts(tx);
441
503
  }
442
504
 
443
505
  private async payFee(context: PublicTxContext) {
@@ -459,16 +521,28 @@ export class PublicTxSimulator {
459
521
  // When mocking the balance of the fee payer, the circuit should not be able to prove the simulation
460
522
 
461
523
  if (currentBalance.lt(txFee)) {
462
- if (!this.skipFeeEnforcement) {
463
- throw new Error(
464
- `Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`,
465
- );
466
- } else {
467
- currentBalance = txFee;
468
- }
524
+ // Without "skipFeeEnforcement", such transactions should be filtered by GasTxValidator.
525
+ assert(
526
+ this.config.skipFeeEnforcement,
527
+ `Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`,
528
+ );
529
+ currentBalance = txFee;
469
530
  }
470
531
 
471
532
  const updatedBalance = currentBalance.sub(txFee);
472
533
  await stateManager.writeStorage(feeJuiceAddress, balanceSlot, updatedBalance, true);
473
534
  }
535
+
536
+ /**
537
+ * Generate the proving request for the AVM circuit.
538
+ */
539
+ private static generateProvingRequest(
540
+ publicInputs: AvmCircuitPublicInputs,
541
+ hints: AvmExecutionHints,
542
+ ): AvmProvingRequest {
543
+ return {
544
+ type: ProvingRequestType.PUBLIC_VM,
545
+ inputs: new AvmCircuitInputs(hints, publicInputs),
546
+ };
547
+ }
474
548
  }