@aztec/simulator 0.0.1-commit.24de95ac → 0.0.1-commit.2606882

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 (371) hide show
  1. package/README.md +6 -4
  2. package/dest/client.d.ts +1 -1
  3. package/dest/common/errors.d.ts +2 -2
  4. package/dest/common/errors.d.ts.map +1 -1
  5. package/dest/common/index.d.ts +1 -1
  6. package/dest/common/stats/index.d.ts +1 -1
  7. package/dest/common/stats/stats.d.ts +1 -1
  8. package/dest/private/acvm/acvm.d.ts +4 -2
  9. package/dest/private/acvm/acvm.d.ts.map +1 -1
  10. package/dest/private/acvm/acvm.js +4 -3
  11. package/dest/private/acvm/acvm_types.d.ts +1 -1
  12. package/dest/private/acvm/deserialize.d.ts +2 -2
  13. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  14. package/dest/private/acvm/deserialize.js +1 -1
  15. package/dest/private/acvm/index.d.ts +1 -1
  16. package/dest/private/acvm/serialize.d.ts +2 -2
  17. package/dest/private/acvm/serialize.d.ts.map +1 -1
  18. package/dest/private/acvm/serialize.js +1 -1
  19. package/dest/private/acvm_native.d.ts +5 -3
  20. package/dest/private/acvm_native.d.ts.map +1 -1
  21. package/dest/private/acvm_native.js +8 -6
  22. package/dest/private/acvm_wasm.d.ts +4 -3
  23. package/dest/private/acvm_wasm.d.ts.map +1 -1
  24. package/dest/private/acvm_wasm.js +7 -5
  25. package/dest/private/acvm_wasm_with_blobs.d.ts +1 -1
  26. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -1
  27. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  28. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  29. package/dest/private/circuit_recording/circuit_recorder.js +23 -20
  30. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  31. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  32. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  33. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  34. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  35. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  36. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
  37. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
  38. package/dest/private/circuit_simulator.d.ts +1 -1
  39. package/dest/private/factory.d.ts +3 -3
  40. package/dest/private/factory.d.ts.map +1 -1
  41. package/dest/private/factory.js +7 -4
  42. package/dest/public/avm/avm_context.d.ts +3 -3
  43. package/dest/public/avm/avm_context.d.ts.map +1 -1
  44. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  45. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  46. package/dest/public/avm/avm_contract_call_result.js +3 -3
  47. package/dest/public/avm/avm_execution_environment.d.ts +9 -8
  48. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  49. package/dest/public/avm/avm_execution_environment.js +5 -8
  50. package/dest/public/avm/avm_gas.d.ts +2 -2
  51. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  52. package/dest/public/avm/avm_gas.js +3 -3
  53. package/dest/public/avm/avm_machine_state.d.ts +7 -6
  54. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  55. package/dest/public/avm/avm_machine_state.js +3 -2
  56. package/dest/public/avm/avm_memory_types.d.ts +14 -14
  57. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  58. package/dest/public/avm/avm_memory_types.js +4 -1
  59. package/dest/public/avm/avm_simulator.d.ts +5 -3
  60. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  61. package/dest/public/avm/avm_simulator.js +14 -12
  62. package/dest/public/avm/avm_simulator_interface.d.ts +1 -1
  63. package/dest/public/avm/calldata.d.ts +51 -0
  64. package/dest/public/avm/calldata.d.ts.map +1 -0
  65. package/dest/public/avm/calldata.js +64 -0
  66. package/dest/public/avm/errors.d.ts +8 -2
  67. package/dest/public/avm/errors.d.ts.map +1 -1
  68. package/dest/public/avm/errors.js +14 -2
  69. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  70. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  71. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  72. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  73. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  74. package/dest/public/avm/fixtures/avm_simulation_tester.js +15 -5
  75. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +3 -2
  76. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  77. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +18 -3
  78. package/dest/public/avm/fixtures/initializers.d.ts +2 -3
  79. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  80. package/dest/public/avm/fixtures/initializers.js +8 -5
  81. package/dest/public/avm/fixtures/utils.d.ts +4 -3
  82. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  83. package/dest/public/avm/fixtures/utils.js +6 -2
  84. package/dest/public/avm/index.d.ts +1 -1
  85. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  86. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  87. package/dest/public/avm/opcodes/accrued_substate.js +42 -43
  88. package/dest/public/avm/opcodes/addressing_mode.d.ts +1 -1
  89. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  90. package/dest/public/avm/opcodes/addressing_mode.js +2 -2
  91. package/dest/public/avm/opcodes/arithmetic.d.ts +3 -1
  92. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  93. package/dest/public/avm/opcodes/arithmetic.js +12 -2
  94. package/dest/public/avm/opcodes/bitwise.d.ts +3 -3
  95. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  96. package/dest/public/avm/opcodes/bitwise.js +5 -5
  97. package/dest/public/avm/opcodes/comparators.d.ts +1 -1
  98. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  99. package/dest/public/avm/opcodes/comparators.js +1 -1
  100. package/dest/public/avm/opcodes/contract.d.ts +5 -4
  101. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  102. package/dest/public/avm/opcodes/contract.js +13 -9
  103. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  104. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  105. package/dest/public/avm/opcodes/control_flow.js +4 -4
  106. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  107. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  108. package/dest/public/avm/opcodes/conversion.js +4 -4
  109. package/dest/public/avm/opcodes/ec_add.d.ts +3 -5
  110. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  111. package/dest/public/avm/opcodes/ec_add.js +24 -29
  112. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  113. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  114. package/dest/public/avm/opcodes/environment_getters.js +6 -6
  115. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  116. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  117. package/dest/public/avm/opcodes/external_calls.js +23 -22
  118. package/dest/public/avm/opcodes/hashing.d.ts +7 -7
  119. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  120. package/dest/public/avm/opcodes/hashing.js +21 -16
  121. package/dest/public/avm/opcodes/index.d.ts +1 -1
  122. package/dest/public/avm/opcodes/instruction.d.ts +2 -2
  123. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  125. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  126. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  127. package/dest/public/avm/opcodes/memory.d.ts +13 -13
  128. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  129. package/dest/public/avm/opcodes/memory.js +26 -26
  130. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  131. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  132. package/dest/public/avm/opcodes/misc.js +8 -8
  133. package/dest/public/avm/opcodes/storage.d.ts +14 -13
  134. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  135. package/dest/public/avm/opcodes/storage.js +34 -24
  136. package/dest/public/avm/revert_reason.d.ts +2 -2
  137. package/dest/public/avm/revert_reason.d.ts.map +1 -1
  138. package/dest/public/avm/revert_reason.js +3 -2
  139. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -1
  140. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  141. package/dest/public/avm/serialization/bytecode_serialization.d.ts +1 -1
  142. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  143. package/dest/public/avm/serialization/bytecode_serialization.js +12 -9
  144. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  145. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  146. package/dest/public/avm/serialization/instruction_serialization.js +2 -2
  147. package/dest/public/avm/test_utils.d.ts +2 -2
  148. package/dest/public/avm/test_utils.d.ts.map +1 -1
  149. package/dest/public/avm/test_utils.js +1 -1
  150. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  151. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  152. package/dest/public/contracts_db_checkpoint.js +30 -0
  153. package/dest/public/db_interfaces.d.ts +14 -2
  154. package/dest/public/db_interfaces.d.ts.map +1 -1
  155. package/dest/public/debug_fn_name.d.ts +16 -3
  156. package/dest/public/debug_fn_name.d.ts.map +1 -1
  157. package/dest/public/debug_fn_name.js +31 -3
  158. package/dest/public/executor_metrics.d.ts +3 -2
  159. package/dest/public/executor_metrics.d.ts.map +1 -1
  160. package/dest/public/executor_metrics.js +13 -34
  161. package/dest/public/executor_metrics_interface.d.ts +3 -2
  162. package/dest/public/executor_metrics_interface.d.ts.map +1 -1
  163. package/dest/public/fixtures/amm_test.d.ts +1 -1
  164. package/dest/public/fixtures/amm_test.js +4 -4
  165. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  166. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  167. package/dest/public/fixtures/bulk_test.js +36 -73
  168. package/dest/public/fixtures/custom_bytecode_tester.d.ts +29 -7
  169. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  170. package/dest/public/fixtures/custom_bytecode_tester.js +36 -12
  171. package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -8
  172. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  173. package/dest/public/fixtures/custom_bytecode_tests.js +143 -18
  174. package/dest/public/fixtures/index.d.ts +4 -2
  175. package/dest/public/fixtures/index.d.ts.map +1 -1
  176. package/dest/public/fixtures/index.js +3 -1
  177. package/dest/public/fixtures/minimal_public_tx.d.ts +2 -8
  178. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
  179. package/dest/public/fixtures/minimal_public_tx.js +6 -16
  180. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  181. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  182. package/dest/public/fixtures/opcode_spammer.js +1645 -0
  183. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +29 -10
  184. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  185. package/dest/public/fixtures/public_tx_simulation_tester.js +97 -29
  186. package/dest/public/fixtures/simple_contract_data_source.d.ts +5 -4
  187. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
  188. package/dest/public/fixtures/simple_contract_data_source.js +4 -4
  189. package/dest/public/fixtures/token_test.d.ts +6 -2
  190. package/dest/public/fixtures/token_test.d.ts.map +1 -1
  191. package/dest/public/fixtures/token_test.js +13 -12
  192. package/dest/public/fixtures/utils.d.ts +3 -3
  193. package/dest/public/fixtures/utils.d.ts.map +1 -1
  194. package/dest/public/fixtures/utils.js +23 -23
  195. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  196. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  197. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  198. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  199. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  200. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  201. package/dest/public/hinting_db_sources.d.ts +17 -7
  202. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  203. package/dest/public/hinting_db_sources.js +77 -18
  204. package/dest/public/index.d.ts +3 -2
  205. package/dest/public/index.d.ts.map +1 -1
  206. package/dest/public/index.js +1 -1
  207. package/dest/public/public_db_sources.d.ts +29 -66
  208. package/dest/public/public_db_sources.d.ts.map +1 -1
  209. package/dest/public/public_db_sources.js +83 -134
  210. package/dest/public/public_errors.d.ts +1 -1
  211. package/dest/public/public_errors.d.ts.map +1 -1
  212. package/dest/public/public_processor/guarded_merkle_tree.d.ts +9 -7
  213. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  214. package/dest/public/public_processor/guarded_merkle_tree.js +9 -4
  215. package/dest/public/public_processor/public_processor.d.ts +19 -21
  216. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  217. package/dest/public/public_processor/public_processor.js +554 -124
  218. package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
  219. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  220. package/dest/public/public_processor/public_processor_metrics.js +36 -45
  221. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
  222. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  223. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +99 -0
  224. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +35 -23
  225. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  226. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +95 -53
  227. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  228. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  229. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  230. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  231. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  232. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  233. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  234. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  235. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  236. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  237. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  238. package/dest/public/public_tx_simulator/factories.js +28 -0
  239. package/dest/public/public_tx_simulator/index.d.ts +5 -1
  240. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  241. package/dest/public/public_tx_simulator/index.js +3 -0
  242. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +14 -7
  243. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
  244. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +5 -5
  245. package/dest/public/public_tx_simulator/public_tx_context.d.ts +14 -6
  246. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  247. package/dest/public/public_tx_simulator/public_tx_context.js +25 -19
  248. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +20 -34
  249. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  250. package/dest/public/public_tx_simulator/public_tx_simulator.js +127 -134
  251. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +25 -2
  252. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
  253. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +4 -4
  254. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
  255. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  256. package/dest/public/side_effect_errors.d.ts +1 -1
  257. package/dest/public/side_effect_errors.d.ts.map +1 -1
  258. package/dest/public/side_effect_trace.d.ts +5 -5
  259. package/dest/public/side_effect_trace.d.ts.map +1 -1
  260. package/dest/public/side_effect_trace.js +4 -4
  261. package/dest/public/side_effect_trace_interface.d.ts +3 -4
  262. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  263. package/dest/public/state_manager/index.d.ts +1 -1
  264. package/dest/public/state_manager/nullifiers.d.ts +2 -2
  265. package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
  266. package/dest/public/state_manager/public_storage.d.ts +2 -2
  267. package/dest/public/state_manager/public_storage.d.ts.map +1 -1
  268. package/dest/public/state_manager/public_storage.js +1 -1
  269. package/dest/public/state_manager/state_manager.d.ts +16 -12
  270. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  271. package/dest/public/state_manager/state_manager.js +21 -10
  272. package/dest/public/test_executor_metrics.d.ts +11 -4
  273. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  274. package/dest/public/test_executor_metrics.js +29 -6
  275. package/dest/public/unique_class_ids.d.ts +1 -1
  276. package/dest/public/unique_class_ids.d.ts.map +1 -1
  277. package/dest/public/utils.d.ts +1 -1
  278. package/dest/server.d.ts +1 -1
  279. package/dest/testing.d.ts +1 -1
  280. package/package.json +21 -20
  281. package/src/common/errors.ts +1 -1
  282. package/src/private/acvm/acvm.ts +4 -3
  283. package/src/private/acvm/deserialize.ts +1 -1
  284. package/src/private/acvm/serialize.ts +1 -1
  285. package/src/private/acvm_native.ts +11 -5
  286. package/src/private/acvm_wasm.ts +11 -4
  287. package/src/private/circuit_recording/circuit_recorder.ts +24 -21
  288. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  289. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  290. package/src/private/factory.ts +7 -4
  291. package/src/public/avm/avm_context.ts +2 -2
  292. package/src/public/avm/avm_contract_call_result.ts +8 -6
  293. package/src/public/avm/avm_execution_environment.ts +13 -10
  294. package/src/public/avm/avm_gas.ts +5 -5
  295. package/src/public/avm/avm_machine_state.ts +7 -6
  296. package/src/public/avm/avm_memory_types.ts +5 -1
  297. package/src/public/avm/avm_simulator.ts +20 -15
  298. package/src/public/avm/calldata.ts +101 -0
  299. package/src/public/avm/errors.ts +17 -3
  300. package/src/public/avm/fixtures/account_proof.json +553 -0
  301. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  302. package/src/public/avm/fixtures/avm_simulation_tester.ts +18 -4
  303. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +23 -3
  304. package/src/public/avm/fixtures/initializers.ts +10 -11
  305. package/src/public/avm/fixtures/utils.ts +6 -2
  306. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  307. package/src/public/avm/opcodes/addressing_mode.ts +2 -2
  308. package/src/public/avm/opcodes/arithmetic.ts +14 -2
  309. package/src/public/avm/opcodes/bitwise.ts +3 -3
  310. package/src/public/avm/opcodes/comparators.ts +1 -1
  311. package/src/public/avm/opcodes/contract.ts +9 -8
  312. package/src/public/avm/opcodes/control_flow.ts +2 -2
  313. package/src/public/avm/opcodes/conversion.ts +3 -3
  314. package/src/public/avm/opcodes/ec_add.ts +23 -33
  315. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  316. package/src/public/avm/opcodes/external_calls.ts +18 -16
  317. package/src/public/avm/opcodes/hashing.ts +16 -10
  318. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  319. package/src/public/avm/opcodes/memory.ts +20 -20
  320. package/src/public/avm/opcodes/misc.ts +6 -6
  321. package/src/public/avm/opcodes/storage.ts +30 -22
  322. package/src/public/avm/revert_reason.ts +6 -3
  323. package/src/public/avm/serialization/bytecode_serialization.ts +19 -8
  324. package/src/public/avm/serialization/instruction_serialization.ts +2 -2
  325. package/src/public/avm/test_utils.ts +1 -1
  326. package/src/public/contracts_db_checkpoint.ts +41 -0
  327. package/src/public/db_interfaces.ts +16 -1
  328. package/src/public/debug_fn_name.ts +39 -5
  329. package/src/public/executor_metrics.ts +11 -34
  330. package/src/public/executor_metrics_interface.ts +2 -1
  331. package/src/public/fixtures/amm_test.ts +4 -4
  332. package/src/public/fixtures/bulk_test.ts +38 -13
  333. package/src/public/fixtures/custom_bytecode_tester.ts +54 -20
  334. package/src/public/fixtures/custom_bytecode_tests.ts +249 -18
  335. package/src/public/fixtures/index.ts +7 -1
  336. package/src/public/fixtures/minimal_public_tx.ts +7 -17
  337. package/src/public/fixtures/opcode_spammer.ts +1713 -0
  338. package/src/public/fixtures/public_tx_simulation_tester.ts +129 -24
  339. package/src/public/fixtures/simple_contract_data_source.ts +8 -9
  340. package/src/public/fixtures/token_test.ts +18 -10
  341. package/src/public/fixtures/utils.ts +28 -25
  342. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  343. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  344. package/src/public/hinting_db_sources.ts +121 -16
  345. package/src/public/index.ts +6 -4
  346. package/src/public/public_db_sources.ts +112 -174
  347. package/src/public/public_processor/guarded_merkle_tree.ts +13 -8
  348. package/src/public/public_processor/public_processor.ts +226 -137
  349. package/src/public/public_processor/public_processor_metrics.ts +28 -44
  350. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +125 -0
  351. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +141 -59
  352. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  353. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  354. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  355. package/src/public/public_tx_simulator/factories.ts +44 -0
  356. package/src/public/public_tx_simulator/index.ts +4 -0
  357. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +10 -14
  358. package/src/public/public_tx_simulator/public_tx_context.ts +30 -19
  359. package/src/public/public_tx_simulator/public_tx_simulator.ts +185 -202
  360. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +24 -2
  361. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +3 -3
  362. package/src/public/side_effect_trace.ts +6 -3
  363. package/src/public/side_effect_trace_interface.ts +1 -1
  364. package/src/public/state_manager/nullifiers.ts +1 -1
  365. package/src/public/state_manager/public_storage.ts +1 -1
  366. package/src/public/state_manager/state_manager.ts +35 -26
  367. package/src/public/test_executor_metrics.ts +34 -8
  368. package/dest/public/tx_contract_cache.d.ts +0 -41
  369. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  370. package/dest/public/tx_contract_cache.js +0 -49
  371. package/src/public/tx_contract_cache.ts +0 -69
@@ -1,24 +1,16 @@
1
- import { AVM_MAX_PROCESSABLE_L2_GAS, DEFAULT_MAX_DEBUG_LOG_MEMORY_READS } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
3
- import { type Logger, createLogger } from '@aztec/foundation/log';
1
+ import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
4
  import { ProtocolContractAddress, ProtocolContractsList } from '@aztec/protocol-contracts';
5
5
  import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
6
- import {
7
- AvmCircuitInputs,
8
- AvmCircuitPublicInputs,
9
- AvmExecutionHints,
10
- type AvmProvingRequest,
11
- AvmTxHint,
12
- type RevertCode,
13
- } from '@aztec/stdlib/avm';
6
+ import { AvmExecutionHints, AvmTxHint, PublicSimulatorConfig, PublicTxEffect, PublicTxResult } from '@aztec/stdlib/avm';
14
7
  import { SimulationError } from '@aztec/stdlib/errors';
15
- import type { Gas, GasUsed } from '@aztec/stdlib/gas';
16
- import type { DebugLog } from '@aztec/stdlib/logs';
17
- import { ProvingRequestType } from '@aztec/stdlib/proofs';
8
+ import { Gas } from '@aztec/stdlib/gas';
18
9
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
19
10
  import {
20
11
  type GlobalVariables,
21
12
  NestedProcessReturnValues,
13
+ ProtocolContracts,
22
14
  PublicCallRequestWithCalldata,
23
15
  Tx,
24
16
  TxExecutionPhase,
@@ -27,6 +19,7 @@ import {
27
19
  import { strict as assert } from 'assert';
28
20
 
29
21
  import type { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
22
+ import { CallDataArray } from '../avm/calldata.js';
30
23
  import { AvmSimulator } from '../avm/index.js';
31
24
  import { getPublicFunctionDebugName } from '../debug_fn_name.js';
32
25
  import { HintingMerkleWriteOperations, HintingPublicContractsDB } from '../hinting_db_sources.js';
@@ -34,40 +27,12 @@ import { type PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
34
27
  import {
35
28
  L2ToL1MessageLimitReachedError,
36
29
  NoteHashLimitReachedError,
37
- NullifierCollisionError,
38
30
  NullifierLimitReachedError,
39
31
  } from '../side_effect_errors.js';
40
32
  import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
41
33
  import { PublicTxContext } from './public_tx_context.js';
42
34
  import type { PublicTxSimulatorInterface } from './public_tx_simulator_interface.js';
43
35
 
44
- export type ProcessedPhase = {
45
- phase: TxExecutionPhase;
46
- durationMs?: number;
47
- returnValues: NestedProcessReturnValues[];
48
- reverted: boolean;
49
- revertReason?: SimulationError;
50
- };
51
-
52
- export type PublicTxResult = {
53
- avmProvingRequest: AvmProvingRequest;
54
- /** Gas used during the execution of this tx */
55
- gasUsed: GasUsed;
56
- revertCode: RevertCode;
57
- /** Revert reason, if any */
58
- revertReason?: SimulationError;
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;
69
- };
70
-
71
36
  // The errors below are only thrown here in the public tx simulator,
72
37
  // and only during revertible phases (revertible insertions, app logic and teardown).
73
38
  // These are strictly "checked" errors (not exported and never propagated).
@@ -103,24 +68,31 @@ class TxSimTeardownRevert extends Error {
103
68
  }
104
69
  }
105
70
 
71
+ /** Only used internally. */
72
+ type ProcessedPhase = {
73
+ phase: TxExecutionPhase;
74
+ durationMs?: number;
75
+ returnValues: NestedProcessReturnValues[];
76
+ reverted: boolean;
77
+ revertReason?: SimulationError;
78
+ };
79
+
106
80
  export class PublicTxSimulator implements PublicTxSimulatorInterface {
107
81
  protected log: Logger;
108
- private config: PublicTxSimulatorConfig;
82
+ protected readonly config: PublicSimulatorConfig;
83
+ protected readonly bindings?: LoggerBindings;
109
84
 
110
85
  constructor(
111
86
  protected merkleTree: MerkleTreeWriteOperations,
112
87
  protected contractsDB: PublicContractsDB,
113
88
  protected globalVariables: GlobalVariables,
114
- config?: Partial<PublicTxSimulatorConfig>,
89
+ config?: Partial<PublicSimulatorConfig>,
90
+ protected protocolContracts: ProtocolContracts = ProtocolContractsList,
91
+ bindings?: LoggerBindings,
115
92
  ) {
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
- };
123
- this.log = createLogger(`simulator:public_tx_simulator`);
93
+ this.config = PublicSimulatorConfig.from(config ?? {});
94
+ this.bindings = bindings;
95
+ this.log = createLogger(`simulator:public_tx_simulator`, bindings);
124
96
  }
125
97
 
126
98
  /**
@@ -129,136 +101,145 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
129
101
  * @returns The result of the transaction's public execution.
130
102
  */
131
103
  public async simulate(tx: Tx): Promise<PublicTxResult> {
132
- try {
133
- const txHash = this.computeTxHash(tx);
134
- this.log.debug(`Simulating ${tx.publicFunctionCalldata.length} public calls for tx ${txHash}`, { txHash });
135
-
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);
145
-
146
- const context = await PublicTxContext.create(
147
- hintingTreesDB,
148
- hintingContractsDB,
149
- tx,
150
- this.globalVariables,
151
- ProtocolContractsList, // imported from file
152
- this.config.doMerkleOperations,
153
- this.config.proverId,
154
- );
104
+ const txHash = this.computeTxHash(tx);
105
+ this.log.debug(`Simulating ${tx.publicFunctionCalldata.length} public calls for tx ${txHash}`, { txHash });
155
106
 
156
- // This will throw if there is a nullifier collision.
107
+ // Create hinting DBs.
108
+ const hints = new AvmExecutionHints(
109
+ this.globalVariables,
110
+ AvmTxHint.fromTx(tx, this.globalVariables.gasFees),
111
+ this.protocolContracts,
112
+ );
113
+ const hintingMerkleTree = await HintingMerkleWriteOperations.create(this.merkleTree, hints);
114
+ const hintingTreesDB = new PublicTreesDB(hintingMerkleTree);
115
+ const hintingContractsDB = new HintingPublicContractsDB(this.contractsDB, hints);
116
+
117
+ const context = await PublicTxContext.create(
118
+ hintingTreesDB,
119
+ hintingContractsDB,
120
+ tx,
121
+ this.globalVariables,
122
+ this.protocolContracts,
123
+ this.config.proverId,
124
+ this.bindings,
125
+ );
126
+
127
+ // This will throw if there is a nullifier collision.
128
+ // In that case the transaction will be thrown out.
129
+ await this.insertNonRevertiblesFromPrivate(context);
130
+
131
+ const processedPhases: ProcessedPhase[] = [];
132
+ if (context.hasPhase(TxExecutionPhase.SETUP)) {
133
+ // This will throw if the setup phase reverts.
157
134
  // In that case the transaction will be thrown out.
158
- await this.insertNonRevertiblesFromPrivate(context, tx);
159
-
160
- const processedPhases: ProcessedPhase[] = [];
161
- if (context.hasPhase(TxExecutionPhase.SETUP)) {
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
- }
170
- processedPhases.push(setupResult);
135
+ const setupResult = await this.simulatePhase(TxExecutionPhase.SETUP, context);
136
+ if (setupResult.reverted) {
137
+ throw new Error(
138
+ `[SETUP] UNRECOVERABLE ERROR! The transaction will be thrown out. ${setupResult.revertReason?.message}`,
139
+ );
171
140
  }
141
+ processedPhases.push(setupResult);
142
+ }
172
143
 
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);
144
+ // The checkpoint we should go back to if anything from now on reverts.
145
+ await context.state.fork();
146
+ hintingContractsDB.createCheckpoint();
179
147
 
180
- // Only proceed with app logic if there was no revert during revertible insertion.
181
- if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
182
- const appLogicResult = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
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;
148
+ try {
149
+ // This may throw: a side-effect limit error triggers a soft revert (caught below), while a
150
+ // nullifier collision is unrecoverable and propagates out of simulate() to throw out the tx.
151
+ await this.insertRevertiblesFromPrivate(context);
152
+
153
+ // Only proceed with app logic if there was no revert during revertible insertion.
154
+ if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
155
+ const appLogicResult = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
156
+ processedPhases.push(appLogicResult);
157
+ if (appLogicResult.reverted) {
158
+ throw new TxSimAppLogicRevert();
198
159
  }
199
160
  }
161
+ } catch (e: any) {
162
+ if (e instanceof TxSimRevertibleInsertionsRevert || e instanceof TxSimAppLogicRevert) {
163
+ // We revert to the post-setup state.
164
+ await context.state.discardForkedState();
165
+ hintingContractsDB.revertCheckpoint();
166
+ // But we also create a new fork so that the teardown phase can transparently
167
+ // commit or rollback at the end of teardown.
168
+ await context.state.fork();
169
+ hintingContractsDB.createCheckpoint();
170
+ } else {
171
+ // Unchecked/unknown error - re-throw as-is
172
+ throw e;
173
+ }
174
+ }
200
175
 
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;
176
+ try {
177
+ if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
178
+ const teardownResult = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
179
+ processedPhases.push(teardownResult);
180
+ if (teardownResult.reverted) {
181
+ throw new TxSimTeardownRevert();
218
182
  }
219
183
  }
184
+ // We commit the forked state and we are done.
185
+ await context.state.mergeForkedState();
186
+ hintingContractsDB.commitCheckpoint();
187
+ } catch (e: any) {
188
+ if (e instanceof TxSimTeardownRevert) {
189
+ // We revert to the post-setup state and we are done.
190
+ await context.state.discardForkedState();
191
+ hintingContractsDB.revertCheckpoint();
192
+ } else {
193
+ // Unchecked/unknown error - re-throw as-is
194
+ throw e;
195
+ }
196
+ }
220
197
 
221
- context.halt();
198
+ context.halt();
222
199
 
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);
229
-
230
- const publicInputs = await context.generateAvmCircuitPublicInputs();
231
- const avmProvingRequest = PublicTxSimulator.generateProvingRequest(publicInputs, hints);
232
-
233
- const revertCode = context.getFinalRevertCode();
234
-
235
- // Commit contracts from this TX to the block-level cache and clear tx cache
236
- // If the tx reverted, only commit non-revertible contracts
237
- // NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
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());
241
-
242
- return {
243
- avmProvingRequest,
244
- gasUsed: {
245
- totalGas: context.getActualGasUsed(),
246
- teardownGas: context.teardownGasUsed,
247
- publicGas: context.getActualPublicGasUsed(),
248
- billedGas: context.getTotalGasUsed(),
249
- },
250
- revertCode,
251
- revertReason: context.revertReason,
252
- processedPhases: processedPhases,
253
- logs: context.state.getActiveStateManager().getLogs(),
254
- };
255
- } finally {
256
- // Make sure there are no new contracts in the tx-level cache.
257
- // They should either be committed to block-level cache or cleared.
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();
200
+ // Such transactions should be filtered by GasTxValidator.
201
+ assert(
202
+ context.getActualGasUsed().l2Gas <= MAX_PROCESSABLE_L2_GAS,
203
+ `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the maximum processable gas of ${MAX_PROCESSABLE_L2_GAS}`,
204
+ );
205
+ await this.payFee(context);
206
+
207
+ const publicInputs = await context.generateAvmCircuitPublicInputs();
208
+ const revertCode = context.getFinalRevertCode();
209
+
210
+ // We only return the app logic phase information, and only 1 per phase.
211
+ const appLogicReturnValues: NestedProcessReturnValues[] =
212
+ processedPhases.find(({ phase }) => phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
213
+
214
+ // TODO(fcarreiro): This is a temporary backwards compatibility layer until we migrate to the C++ simulator.
215
+ if (context.revertReason !== undefined) {
216
+ (appLogicReturnValues as any).revertReason = context.revertReason;
261
217
  }
218
+
219
+ // Create PublicTxEffect from PublicInputs.
220
+ const publicTxEffect = new PublicTxEffect(
221
+ publicInputs.transactionFee,
222
+ publicInputs.accumulatedData.noteHashes.filter(h => !h.isEmpty()),
223
+ publicInputs.accumulatedData.nullifiers.filter(n => !n.isEmpty()),
224
+ publicInputs.accumulatedData.l2ToL1Msgs.filter(m => !m.isEmpty()),
225
+ publicInputs.accumulatedData.publicLogs.toLogs(),
226
+ publicInputs.accumulatedData.publicDataWrites.filter(w => !w.isEmpty()),
227
+ );
228
+
229
+ return new PublicTxResult(
230
+ /*gasUsed=*/ {
231
+ totalGas: context.getActualGasUsed(),
232
+ teardownGas: context.teardownGasUsed,
233
+ publicGas: context.getActualPublicGasUsed(),
234
+ billedGas: context.getTotalGasUsed(),
235
+ },
236
+ /*revertCode=*/ revertCode,
237
+ /*publicTxEffect=*/ publicTxEffect,
238
+ /*callStackMetadata=*/ appLogicReturnValues,
239
+ /*logs=*/ context.state.getActiveStateManager().getLogs(),
240
+ /*hints=*/ hints,
241
+ /*publicInputs=*/ publicInputs,
242
+ );
262
243
  }
263
244
 
264
245
  protected computeTxHash(tx: Tx) {
@@ -291,7 +272,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
291
272
 
292
273
  const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest);
293
274
 
294
- returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output));
275
+ returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output.bestEffortReadAll()));
295
276
 
296
277
  if (enqueuedCallResult.reverted) {
297
278
  reverted = true;
@@ -321,7 +302,11 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
321
302
  ): Promise<AvmFinalizedCallResult> {
322
303
  const stateManager = context.state.getActiveStateManager();
323
304
  const contractAddress = callRequest.request.contractAddress;
324
- const fnName = await getPublicFunctionDebugName(this.contractsDB, contractAddress, callRequest.calldata);
305
+ const fnName = await getPublicFunctionDebugName(
306
+ this.contractsDB,
307
+ contractAddress,
308
+ new CallDataArray(callRequest.calldata),
309
+ );
325
310
 
326
311
  const allocatedGas = context.getGasLeftAtPhase(phase);
327
312
 
@@ -340,7 +325,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
340
325
  );
341
326
 
342
327
  if (result.reverted) {
343
- const culprit = `${contractAddress}:${callRequest.functionSelector}`;
328
+ const culprit = `${contractAddress}:${fnName}`;
344
329
  context.revert(phase, result.revertReason, culprit);
345
330
  }
346
331
 
@@ -381,10 +366,9 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
381
366
  transactionFee,
382
367
  this.globalVariables,
383
368
  request.isStaticCall,
384
- calldata,
369
+ new CallDataArray(calldata),
385
370
  allocatedGas,
386
- this.config.clientInitiatedSimulation,
387
- this.config.maxDebugLogMemoryReads,
371
+ this.config,
388
372
  );
389
373
  const avmCallResult = await simulator.execute();
390
374
  return avmCallResult.finalize();
@@ -393,7 +377,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
393
377
  /**
394
378
  * Insert the non-revertible accumulated data from private into the public state.
395
379
  */
396
- protected async insertNonRevertiblesFromPrivate(context: PublicTxContext, tx: Tx) {
380
+ protected async insertNonRevertiblesFromPrivate(context: PublicTxContext) {
397
381
  const stateManager = context.state.getActiveStateManager();
398
382
 
399
383
  for (const siloedNullifier of context.nonRevertibleAccumulatedDataFromPrivate.nullifiers.filter(
@@ -412,11 +396,12 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
412
396
  }
413
397
  }
414
398
 
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);
399
+ // add new contracts to the contracts db so that their code may be found and called
400
+ // FIXME(fcarreiro): this should conceptually use the hinting contracts db.
401
+ // However, things work as expected because later calls to getters on the hintingContractsDB
402
+ // will pick up the new contracts and will generate the necessary hints.
403
+ // So, a consumer of the hints will always see the new contracts.
404
+ this.contractsDB.addContractsFromLogs(context.nonRevertibleContractDeploymentData);
420
405
  }
421
406
 
422
407
  /**
@@ -424,11 +409,15 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
424
409
  * Throws TxSimRevertibleInsertionsRevert if there is some checked error during revertible insertions.
425
410
  * This function checks for the following errors:
426
411
  * - NullifierLimitReachedError
427
- * - NullifierCollisionError
428
412
  * - NoteHashLimitReachedError
429
413
  * - L2ToL1MessageLimitReachedError
414
+ *
415
+ * Note: NullifierCollisionError is intentionally NOT caught here. A nullifier collision
416
+ * during revertible insertions is unprovable (the nullifier originated from private, so
417
+ * a collision indicates the tx should never have been proposed). It propagates as-is to
418
+ * make the transaction unrecoverable, matching the AVM circuit behavior.
430
419
  */
431
- protected async insertRevertiblesFromPrivate(context: PublicTxContext, tx: Tx) {
420
+ protected async insertRevertiblesFromPrivate(context: PublicTxContext) {
432
421
  const stateManager = context.state.getActiveStateManager();
433
422
 
434
423
  try {
@@ -436,7 +425,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
436
425
  await stateManager.writeSiloedNullifier(siloedNullifier);
437
426
  }
438
427
  } catch (e: any) {
439
- if (e instanceof NullifierLimitReachedError || e instanceof NullifierCollisionError) {
428
+ if (e instanceof NullifierLimitReachedError) {
440
429
  context.revert(
441
430
  TxExecutionPhase.APP_LOGIC,
442
431
  new SimulationError(
@@ -446,7 +435,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
446
435
  );
447
436
  throw new TxSimRevertibleInsertionsRevert();
448
437
  } else {
449
- // Unchecked/unknown error - re-throw as-is
438
+ // Unchecked/unknown error or NullifierCollisionError (unrecoverable) - re-throw as-is
450
439
  throw e;
451
440
  }
452
441
  }
@@ -497,16 +486,21 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
497
486
  }
498
487
 
499
488
  // 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);
489
+ // FIXME(fcarreiro): this should conceptually use the hinting contracts db.
490
+ // However, things work as expected because later calls to getters on the hintingContractsDB
491
+ // will pick up the new contracts and will generate the necessary hints.
492
+ // So, a consumer of the hints will always see the new contracts.
493
+ this.contractsDB.addContractsFromLogs(context.revertibleContractDeploymentData);
503
494
  }
504
495
 
505
496
  private async payFee(context: PublicTxContext) {
506
497
  const txFee = context.getTransactionFee(TxExecutionPhase.TEARDOWN);
507
498
 
508
499
  if (context.feePayer.isZero()) {
509
- this.log.debug(`No one is paying the fee of ${txFee.toBigInt()}`);
500
+ // Real transactions are enforced by private kernel to have nonzero fee payer.
501
+ // Real transactions cannot skip fee enforcement (skipping fee enforcement makes them unprovable).
502
+ assert(this.config.skipFeeEnforcement, 'Fee payer cannot be 0 unless skipping fee enforcement for simulation');
503
+ this.log.debug(`Fee payer is 0. Skipping fee enforcement. No one is paying the fee of ${txFee.toBigInt()}`);
510
504
  return;
511
505
  }
512
506
 
@@ -526,23 +520,12 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
526
520
  this.config.skipFeeEnforcement,
527
521
  `Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`,
528
522
  );
523
+ this.log.debug(`Fee payer balance insufficient, but we're skipping fee enforcement`);
524
+ // We still proceed and perform the storage write to minimize deviation from normal execution.
529
525
  currentBalance = txFee;
530
526
  }
531
527
 
532
528
  const updatedBalance = currentBalance.sub(txFee);
533
529
  await stateManager.writeStorage(feeJuiceAddress, balanceSlot, updatedBalance, true);
534
530
  }
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
- }
548
531
  }
@@ -1,11 +1,33 @@
1
+ import type { PublicTxResult } from '@aztec/stdlib/avm';
1
2
  import type { Tx } from '@aztec/stdlib/tx';
2
3
 
3
- import type { PublicTxResult } from './public_tx_simulator.js';
4
-
5
4
  export interface PublicTxSimulatorInterface {
6
5
  simulate(tx: Tx): Promise<PublicTxResult>;
6
+ /**
7
+ * Cancel the current simulation if one is in progress.
8
+ * This signals the underlying simulator (e.g., C++) to stop at the next safe point.
9
+ * Safe to call even if no simulation is in progress.
10
+ * Optional - not all implementations support cancellation.
11
+ *
12
+ * @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
13
+ * This is important because signaling cancellation doesn't immediately stop C++ -
14
+ * it only sets a flag that C++ checks at certain points. If C++ is in the middle
15
+ * of a slow operation (e.g., pad_trees), it won't stop until that completes.
16
+ * @returns Promise that resolves when cancellation is signaled (and optionally when simulation stops)
17
+ */
18
+ cancel?(waitTimeoutMs?: number): Promise<void>;
7
19
  }
8
20
 
9
21
  export interface MeasuredPublicTxSimulatorInterface {
10
22
  simulate(tx: Tx, txLabel: string): Promise<PublicTxResult>;
23
+ /**
24
+ * Cancel the current simulation if one is in progress.
25
+ * This signals the underlying simulator (e.g., C++) to stop at the next safe point.
26
+ * Safe to call even if no simulation is in progress.
27
+ * Optional - not all implementations support cancellation.
28
+ *
29
+ * @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
30
+ * @returns Promise that resolves when cancellation is signaled (and optionally when simulation stops)
31
+ */
32
+ cancel?(waitTimeoutMs?: number): Promise<void>;
11
33
  }
@@ -1,4 +1,5 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import type { PublicSimulatorConfig } from '@aztec/stdlib/avm';
2
3
  import type { Gas } from '@aztec/stdlib/gas';
3
4
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
4
5
  import { type GlobalVariables, PublicCallRequestWithCalldata, TxExecutionPhase } from '@aztec/stdlib/tx';
@@ -10,7 +11,6 @@ import type { PublicContractsDB } from '../public_db_sources.js';
10
11
  import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
11
12
  import { MeasuredPublicTxSimulator } from './measured_public_tx_simulator.js';
12
13
  import { PublicTxContext } from './public_tx_context.js';
13
- import type { PublicTxSimulatorConfig } from './public_tx_simulator.js';
14
14
 
15
15
  /**
16
16
  * A public tx simulator that tracks runtime/production metrics with telemetry.
@@ -24,7 +24,7 @@ export class TelemetryPublicTxSimulator extends MeasuredPublicTxSimulator {
24
24
  contractsDB: PublicContractsDB,
25
25
  globalVariables: GlobalVariables,
26
26
  telemetryClient: TelemetryClient = getTelemetryClient(),
27
- config?: Partial<PublicTxSimulatorConfig>,
27
+ config?: Partial<PublicSimulatorConfig>,
28
28
  ) {
29
29
  const metrics = new ExecutorMetrics(telemetryClient, 'PublicTxSimulator');
30
30
  super(merkleTree, contractsDB, globalVariables, metrics, config);
@@ -7,9 +7,9 @@ import {
7
7
  MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
8
8
  PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
9
9
  } from '@aztec/constants';
10
+ import { Fr } from '@aztec/foundation/curves/bn254';
10
11
  import { EthAddress } from '@aztec/foundation/eth-address';
11
- import { Fr } from '@aztec/foundation/fields';
12
- import { type LogLevel, createLogger } from '@aztec/foundation/log';
12
+ import { type LogLevel, type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
13
13
  import { PublicDataUpdateRequest } from '@aztec/stdlib/avm';
14
14
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
15
15
  import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
@@ -61,7 +61,7 @@ export class SideEffectArrayLengths {
61
61
  * Trace side effects for an enqueued public call's execution.
62
62
  */
63
63
  export class SideEffectTrace implements PublicSideEffectTraceInterface {
64
- public log = createLogger('simulator:side_effect_trace');
64
+ public log: Logger;
65
65
 
66
66
  /** The side effect counter increments with every call to the trace. */
67
67
  private sideEffectCounter: number;
@@ -79,6 +79,7 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface {
79
79
  constructor(
80
80
  /** The counter of this trace's first side effect. */
81
81
  public readonly startSideEffectCounter: number = 0,
82
+ bindings?: LoggerBindings,
82
83
  /** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
83
84
  * otherwise the public kernel can fail to prove because TX limits are breached.
84
85
  */
@@ -90,11 +91,13 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface {
90
91
  private debugLogMemoryReads: number = 0,
91
92
  ) {
92
93
  this.sideEffectCounter = startSideEffectCounter;
94
+ this.log = createLogger('simulator:side_effect_trace', bindings);
93
95
  }
94
96
 
95
97
  public fork() {
96
98
  return new SideEffectTrace(
97
99
  this.sideEffectCounter,
100
+ this.log.getBindings(),
98
101
  new SideEffectArrayLengths(
99
102
  this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength,
100
103
  this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength,
@@ -1,4 +1,4 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { LogLevel } from '@aztec/foundation/log';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import type { DebugLog } from '@aztec/stdlib/logs';
@@ -1,4 +1,4 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
 
3
3
  import type { PublicTreesDB } from '../public_db_sources.js';
4
4
  import { NullifierCollisionError } from '../side_effect_errors.js';
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
3
 
4
4
  import type { PublicStateDBInterface } from '../db_interfaces.js';