@aztec/simulator 0.0.0-test.0 → 0.0.1-commit.001888fc

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 (533) hide show
  1. package/README.md +12 -4
  2. package/dest/client.d.ts +6 -4
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +6 -9
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +1 -2
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/common/stats/index.d.ts +1 -1
  12. package/dest/common/stats/stats.d.ts +1 -1
  13. package/dest/private/acvm/acvm.d.ts +15 -7
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +14 -19
  16. package/dest/private/acvm/acvm_types.d.ts +2 -2
  17. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.d.ts +19 -20
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +32 -24
  21. package/dest/private/acvm/index.d.ts +1 -2
  22. package/dest/private/acvm/index.d.ts.map +1 -1
  23. package/dest/private/acvm/index.js +0 -1
  24. package/dest/private/acvm/serialize.d.ts +21 -4
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +54 -1
  27. package/dest/private/acvm_native.d.ts +41 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +34 -26
  30. package/dest/private/acvm_wasm.d.ts +16 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/acvm_wasm.js +65 -0
  33. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  34. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  35. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  36. package/dest/private/circuit_recording/circuit_recorder.d.ts +109 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +212 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +32 -0
  40. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  41. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +10 -0
  43. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  44. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  46. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  47. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  48. package/dest/private/circuit_simulator.d.ts +35 -0
  49. package/dest/private/circuit_simulator.d.ts.map +1 -0
  50. package/dest/private/circuit_simulator.js +43 -0
  51. package/dest/private/factory.d.ts +12 -0
  52. package/dest/private/factory.d.ts.map +1 -0
  53. package/dest/private/{providers/factory.js → factory.js} +8 -5
  54. package/dest/public/avm/avm_context.d.ts +8 -8
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +8 -6
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +12 -8
  59. package/dest/public/avm/avm_execution_environment.d.ts +9 -6
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +5 -3
  62. package/dest/public/avm/avm_gas.d.ts +5 -21
  63. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  64. package/dest/public/avm/avm_gas.js +29 -37
  65. package/dest/public/avm/avm_machine_state.d.ts +9 -6
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +5 -2
  68. package/dest/public/avm/avm_memory_types.d.ts +100 -89
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +21 -7
  71. package/dest/public/avm/avm_simulator.d.ts +8 -7
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +32 -42
  74. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  75. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  76. package/dest/public/avm/avm_simulator_interface.js +3 -0
  77. package/dest/public/avm/calldata.d.ts +51 -0
  78. package/dest/public/avm/calldata.d.ts.map +1 -0
  79. package/dest/public/avm/calldata.js +63 -0
  80. package/dest/public/avm/errors.d.ts +11 -29
  81. package/dest/public/avm/errors.d.ts.map +1 -1
  82. package/dest/public/avm/errors.js +19 -57
  83. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  84. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  85. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  86. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  87. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  88. package/dest/public/avm/fixtures/avm_simulation_tester.js +26 -18
  89. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  90. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  91. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  92. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  93. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  94. package/dest/public/avm/fixtures/initializers.js +45 -0
  95. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  96. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  97. package/dest/public/avm/fixtures/utils.js +96 -0
  98. package/dest/public/avm/index.d.ts +1 -3
  99. package/dest/public/avm/index.d.ts.map +1 -1
  100. package/dest/public/avm/index.js +0 -2
  101. package/dest/public/avm/opcodes/accrued_substate.d.ts +18 -19
  102. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/accrued_substate.js +61 -59
  104. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  105. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  107. package/dest/public/avm/opcodes/arithmetic.d.ts +14 -2
  108. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  110. package/dest/public/avm/opcodes/bitwise.d.ts +8 -16
  111. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/bitwise.js +22 -29
  113. package/dest/public/avm/opcodes/comparators.d.ts +1 -1
  114. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/comparators.js +3 -3
  116. package/dest/public/avm/opcodes/contract.d.ts +3 -4
  117. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/contract.js +11 -12
  119. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  120. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/control_flow.js +13 -11
  122. package/dest/public/avm/opcodes/conversion.d.ts +4 -3
  123. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/conversion.js +270 -6
  125. package/dest/public/avm/opcodes/ec_add.d.ts +3 -3
  126. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/ec_add.js +21 -12
  128. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  129. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/environment_getters.js +20 -22
  131. package/dest/public/avm/opcodes/external_calls.d.ts +14 -13
  132. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/external_calls.js +52 -46
  134. package/dest/public/avm/opcodes/hashing.d.ts +7 -7
  135. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  136. package/dest/public/avm/opcodes/hashing.js +24 -19
  137. package/dest/public/avm/opcodes/index.d.ts +1 -1
  138. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  139. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  140. package/dest/public/avm/opcodes/instruction.js +23 -19
  141. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  142. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  143. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  144. package/dest/public/avm/opcodes/memory.d.ts +15 -15
  145. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  146. package/dest/public/avm/opcodes/memory.js +52 -48
  147. package/dest/public/avm/opcodes/misc.d.ts +4 -3
  148. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  149. package/dest/public/avm/opcodes/misc.js +42 -17
  150. package/dest/public/avm/opcodes/storage.d.ts +14 -13
  151. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  152. package/dest/public/avm/opcodes/storage.js +39 -27
  153. package/dest/public/avm/revert_reason.d.ts +18 -0
  154. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  155. package/dest/public/avm/revert_reason.js +39 -0
  156. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  157. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  158. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  159. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  160. package/dest/public/avm/serialization/bytecode_serialization.js +81 -77
  161. package/dest/public/avm/serialization/instruction_serialization.d.ts +15 -6
  162. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  163. package/dest/public/avm/serialization/instruction_serialization.js +71 -36
  164. package/dest/public/avm/test_utils.d.ts +12 -15
  165. package/dest/public/avm/test_utils.d.ts.map +1 -1
  166. package/dest/public/avm/test_utils.js +17 -25
  167. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  168. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  169. package/dest/public/contracts_db_checkpoint.js +30 -0
  170. package/dest/public/db_interfaces.d.ts +68 -0
  171. package/dest/public/db_interfaces.d.ts.map +1 -0
  172. package/dest/public/db_interfaces.js +3 -0
  173. package/dest/public/debug_fn_name.d.ts +18 -0
  174. package/dest/public/debug_fn_name.d.ts.map +1 -0
  175. package/dest/public/debug_fn_name.js +37 -0
  176. package/dest/public/executor_metrics.d.ts +12 -4
  177. package/dest/public/executor_metrics.d.ts.map +1 -1
  178. package/dest/public/executor_metrics.js +33 -23
  179. package/dest/public/executor_metrics_interface.d.ts +10 -0
  180. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  181. package/dest/public/executor_metrics_interface.js +1 -0
  182. package/dest/public/fixtures/amm_test.d.ts +10 -0
  183. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  184. package/dest/public/fixtures/amm_test.js +213 -0
  185. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  186. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  187. package/dest/public/fixtures/bulk_test.js +262 -0
  188. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  189. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  190. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  191. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  192. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  193. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  194. package/dest/public/fixtures/index.d.ts +10 -1
  195. package/dest/public/fixtures/index.d.ts.map +1 -1
  196. package/dest/public/fixtures/index.js +9 -0
  197. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  198. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  199. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  200. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  201. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  202. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  203. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +56 -15
  204. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  205. package/dest/public/fixtures/public_tx_simulation_tester.js +164 -71
  206. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  207. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  208. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  209. package/dest/public/fixtures/token_test.d.ts +12 -0
  210. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  211. package/dest/public/fixtures/token_test.js +96 -0
  212. package/dest/public/fixtures/utils.d.ts +18 -5
  213. package/dest/public/fixtures/utils.d.ts.map +1 -1
  214. package/dest/public/fixtures/utils.js +102 -59
  215. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  216. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  217. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  218. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  219. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  220. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  221. package/dest/public/hinting_db_sources.d.ts +80 -0
  222. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  223. package/dest/public/hinting_db_sources.js +356 -0
  224. package/dest/public/index.d.ts +6 -9
  225. package/dest/public/index.d.ts.map +1 -1
  226. package/dest/public/index.js +4 -7
  227. package/dest/public/public_db_sources.d.ts +54 -103
  228. package/dest/public/public_db_sources.d.ts.map +1 -1
  229. package/dest/public/public_db_sources.js +222 -195
  230. package/dest/public/public_errors.d.ts +12 -0
  231. package/dest/public/public_errors.d.ts.map +1 -0
  232. package/dest/public/public_errors.js +13 -0
  233. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  234. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  235. package/dest/public/public_processor/guarded_merkle_tree.js +113 -0
  236. package/dest/public/public_processor/public_processor.d.ts +30 -38
  237. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  238. package/dest/public/public_processor/public_processor.js +602 -153
  239. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -4
  240. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  241. package/dest/public/public_processor/public_processor_metrics.js +29 -46
  242. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
  243. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  244. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  245. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  246. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  247. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +131 -0
  248. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  249. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  250. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  251. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  252. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  253. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  254. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  255. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  256. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  257. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  258. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  259. package/dest/public/public_tx_simulator/factories.js +28 -0
  260. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  261. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  262. package/dest/public/public_tx_simulator/index.js +5 -0
  263. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  264. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  265. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  266. package/dest/public/public_tx_simulator/public_tx_context.d.ts +25 -31
  267. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  268. package/dest/public/public_tx_simulator/public_tx_context.js +75 -95
  269. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +38 -58
  270. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  271. package/dest/public/public_tx_simulator/public_tx_simulator.js +220 -207
  272. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  273. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  274. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  275. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  276. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  277. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
  278. package/dest/public/side_effect_errors.d.ts +42 -2
  279. package/dest/public/side_effect_errors.d.ts.map +1 -1
  280. package/dest/public/side_effect_errors.js +70 -1
  281. package/dest/public/side_effect_trace.d.ts +24 -69
  282. package/dest/public/side_effect_trace.d.ts.map +1 -1
  283. package/dest/public/side_effect_trace.js +74 -124
  284. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  285. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  286. package/dest/public/state_manager/index.d.ts +2 -0
  287. package/dest/public/state_manager/index.d.ts.map +1 -0
  288. package/dest/public/state_manager/index.js +1 -0
  289. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  290. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  291. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  292. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  293. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  294. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  295. package/dest/public/state_manager/state_manager.d.ts +170 -0
  296. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  297. package/dest/public/state_manager/state_manager.js +402 -0
  298. package/dest/public/test_executor_metrics.d.ts +61 -0
  299. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  300. package/dest/public/test_executor_metrics.js +329 -0
  301. package/dest/public/unique_class_ids.d.ts +1 -1
  302. package/dest/public/unique_class_ids.d.ts.map +1 -1
  303. package/dest/public/utils.d.ts +3 -5
  304. package/dest/public/utils.d.ts.map +1 -1
  305. package/dest/public/utils.js +4 -21
  306. package/dest/server.d.ts +7 -4
  307. package/dest/server.d.ts.map +1 -1
  308. package/dest/server.js +5 -2
  309. package/dest/testing.d.ts +2 -0
  310. package/dest/testing.d.ts.map +1 -0
  311. package/dest/testing.js +1 -0
  312. package/package.json +38 -33
  313. package/src/client.ts +5 -3
  314. package/src/common/errors.ts +80 -45
  315. package/src/common/index.ts +0 -1
  316. package/src/private/acvm/acvm.ts +21 -35
  317. package/src/private/acvm/acvm_types.ts +1 -1
  318. package/src/private/acvm/deserialize.ts +36 -30
  319. package/src/private/acvm/index.ts +0 -1
  320. package/src/private/acvm/serialize.ts +64 -1
  321. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +57 -28
  322. package/src/private/acvm_wasm.ts +76 -0
  323. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  324. package/src/private/circuit_recording/circuit_recorder.ts +263 -0
  325. package/src/private/circuit_recording/file_circuit_recorder.ts +163 -0
  326. package/src/private/circuit_recording/memory_circuit_recorder.ts +13 -0
  327. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  328. package/src/private/circuit_simulator.ts +90 -0
  329. package/src/private/{providers/factory.ts → factory.ts} +13 -10
  330. package/src/public/avm/avm_context.ts +6 -6
  331. package/src/public/avm/avm_contract_call_result.ts +23 -9
  332. package/src/public/avm/avm_execution_environment.ts +17 -5
  333. package/src/public/avm/avm_gas.ts +27 -39
  334. package/src/public/avm/avm_machine_state.ts +12 -6
  335. package/src/public/avm/avm_memory_types.ts +24 -7
  336. package/src/public/avm/avm_simulator.ts +57 -62
  337. package/src/public/avm/avm_simulator_interface.ts +8 -0
  338. package/src/public/avm/calldata.ts +100 -0
  339. package/src/public/avm/errors.ts +20 -75
  340. package/src/public/avm/fixtures/account_proof.json +553 -0
  341. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  342. package/src/public/avm/fixtures/avm_simulation_tester.ts +41 -24
  343. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  344. package/src/public/avm/fixtures/initializers.ts +103 -0
  345. package/src/public/avm/fixtures/utils.ts +151 -0
  346. package/src/public/avm/index.ts +0 -2
  347. package/src/public/avm/opcodes/accrued_substate.ts +84 -52
  348. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  349. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  350. package/src/public/avm/opcodes/bitwise.ts +33 -29
  351. package/src/public/avm/opcodes/comparators.ts +6 -3
  352. package/src/public/avm/opcodes/contract.ts +10 -10
  353. package/src/public/avm/opcodes/control_flow.ts +19 -10
  354. package/src/public/avm/opcodes/conversion.ts +29 -5
  355. package/src/public/avm/opcodes/ec_add.ts +22 -10
  356. package/src/public/avm/opcodes/environment_getters.ts +28 -23
  357. package/src/public/avm/opcodes/external_calls.ts +70 -36
  358. package/src/public/avm/opcodes/hashing.ts +39 -13
  359. package/src/public/avm/opcodes/instruction.ts +31 -21
  360. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  361. package/src/public/avm/opcodes/memory.ts +81 -42
  362. package/src/public/avm/opcodes/misc.ts +61 -19
  363. package/src/public/avm/opcodes/storage.ts +47 -23
  364. package/src/public/avm/revert_reason.ts +58 -0
  365. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  366. package/src/public/avm/serialization/bytecode_serialization.ts +90 -81
  367. package/src/public/avm/serialization/instruction_serialization.ts +76 -35
  368. package/src/public/avm/test_utils.ts +25 -42
  369. package/src/public/contracts_db_checkpoint.ts +41 -0
  370. package/src/public/db_interfaces.ts +76 -0
  371. package/src/public/debug_fn_name.ts +52 -0
  372. package/src/public/executor_metrics.ts +49 -23
  373. package/src/public/executor_metrics_interface.ts +15 -0
  374. package/src/public/fixtures/amm_test.ts +331 -0
  375. package/src/public/fixtures/bulk_test.ts +169 -0
  376. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  377. package/src/public/fixtures/custom_bytecode_tests.ts +228 -0
  378. package/src/public/fixtures/index.ts +13 -0
  379. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  380. package/src/public/fixtures/opcode_spammer.ts +1717 -0
  381. package/src/public/fixtures/public_tx_simulation_tester.ts +269 -114
  382. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  383. package/src/public/fixtures/token_test.ts +148 -0
  384. package/src/public/fixtures/utils.ts +142 -69
  385. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  386. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  387. package/src/public/hinting_db_sources.ts +609 -0
  388. package/src/public/index.ts +11 -8
  389. package/src/public/public_db_sources.ts +290 -260
  390. package/src/public/public_errors.ts +14 -0
  391. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  392. package/src/public/public_processor/public_processor.ts +294 -205
  393. package/src/public/public_processor/public_processor_metrics.ts +18 -46
  394. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +124 -0
  395. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +210 -0
  396. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  397. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  398. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  399. package/src/public/public_tx_simulator/factories.ts +44 -0
  400. package/src/public/public_tx_simulator/index.ts +7 -0
  401. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  402. package/src/public/public_tx_simulator/public_tx_context.ts +179 -199
  403. package/src/public/public_tx_simulator/public_tx_simulator.ts +316 -263
  404. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  405. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  406. package/src/public/side_effect_errors.ts +91 -1
  407. package/src/public/side_effect_trace.ts +99 -322
  408. package/src/public/side_effect_trace_interface.ts +11 -59
  409. package/src/public/state_manager/index.ts +1 -0
  410. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  411. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  412. package/src/public/state_manager/state_manager.ts +569 -0
  413. package/src/public/test_executor_metrics.ts +421 -0
  414. package/src/public/utils.ts +5 -21
  415. package/src/server.ts +6 -3
  416. package/src/testing.ts +1 -0
  417. package/dest/common/db_interfaces.d.ts +0 -80
  418. package/dest/common/db_interfaces.d.ts.map +0 -1
  419. package/dest/common/db_interfaces.js +0 -1
  420. package/dest/common/debug_fn_name.d.ts +0 -5
  421. package/dest/common/debug_fn_name.d.ts.map +0 -1
  422. package/dest/common/debug_fn_name.js +0 -6
  423. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  424. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  425. package/dest/common/message_load_oracle_inputs.js +0 -15
  426. package/dest/private/acvm/oracle/index.d.ts +0 -14
  427. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  428. package/dest/private/acvm/oracle/index.js +0 -2
  429. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  430. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  431. package/dest/private/acvm/oracle/oracle.js +0 -263
  432. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  433. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  434. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  435. package/dest/private/execution_data_provider.d.ts +0 -261
  436. package/dest/private/execution_data_provider.d.ts.map +0 -1
  437. package/dest/private/execution_data_provider.js +0 -14
  438. package/dest/private/execution_note_cache.d.ts +0 -93
  439. package/dest/private/execution_note_cache.d.ts.map +0 -1
  440. package/dest/private/execution_note_cache.js +0 -180
  441. package/dest/private/hashed_values_cache.d.ts +0 -28
  442. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  443. package/dest/private/hashed_values_cache.js +0 -46
  444. package/dest/private/index.d.ts +0 -13
  445. package/dest/private/index.d.ts.map +0 -1
  446. package/dest/private/index.js +0 -12
  447. package/dest/private/pick_notes.d.ts +0 -85
  448. package/dest/private/pick_notes.d.ts.map +0 -1
  449. package/dest/private/pick_notes.js +0 -51
  450. package/dest/private/private_execution.d.ts +0 -25
  451. package/dest/private/private_execution.d.ts.map +0 -1
  452. package/dest/private/private_execution.js +0 -92
  453. package/dest/private/private_execution_oracle.d.ts +0 -215
  454. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  455. package/dest/private/private_execution_oracle.js +0 -382
  456. package/dest/private/providers/acvm_native.d.ts +0 -40
  457. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  458. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  459. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  460. package/dest/private/providers/acvm_wasm.js +0 -62
  461. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  462. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  463. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  464. package/dest/private/providers/factory.d.ts +0 -12
  465. package/dest/private/providers/factory.d.ts.map +0 -1
  466. package/dest/private/providers/simulation_provider.d.ts +0 -19
  467. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  468. package/dest/private/providers/simulation_provider.js +0 -24
  469. package/dest/private/simulator.d.ts +0 -34
  470. package/dest/private/simulator.d.ts.map +0 -1
  471. package/dest/private/simulator.js +0 -76
  472. package/dest/private/unconstrained_execution.d.ts +0 -10
  473. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  474. package/dest/private/unconstrained_execution.js +0 -27
  475. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  476. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  477. package/dest/private/unconstrained_execution_oracle.js +0 -258
  478. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  479. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  480. package/dest/public/avm/bytecode_utils.js +0 -17
  481. package/dest/public/avm/fixtures/index.d.ts +0 -84
  482. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  483. package/dest/public/avm/fixtures/index.js +0 -175
  484. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  485. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  486. package/dest/public/avm/journal/index.d.ts +0 -2
  487. package/dest/public/avm/journal/index.d.ts.map +0 -1
  488. package/dest/public/avm/journal/index.js +0 -1
  489. package/dest/public/avm/journal/journal.d.ts +0 -209
  490. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  491. package/dest/public/avm/journal/journal.js +0 -486
  492. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  493. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  494. package/dest/public/bytecode_errors.d.ts +0 -4
  495. package/dest/public/bytecode_errors.d.ts.map +0 -1
  496. package/dest/public/bytecode_errors.js +0 -6
  497. package/dest/public/execution.d.ts +0 -108
  498. package/dest/public/execution.d.ts.map +0 -1
  499. package/dest/public/execution.js +0 -9
  500. package/dest/public/tx_contract_cache.d.ts +0 -41
  501. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  502. package/dest/public/tx_contract_cache.js +0 -49
  503. package/dest/test/utils.d.ts +0 -13
  504. package/dest/test/utils.d.ts.map +0 -1
  505. package/dest/test/utils.js +0 -22
  506. package/src/common/db_interfaces.ts +0 -94
  507. package/src/common/debug_fn_name.ts +0 -18
  508. package/src/common/message_load_oracle_inputs.ts +0 -15
  509. package/src/private/acvm/oracle/index.ts +0 -16
  510. package/src/private/acvm/oracle/oracle.ts +0 -455
  511. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  512. package/src/private/execution_data_provider.ts +0 -323
  513. package/src/private/execution_note_cache.ts +0 -217
  514. package/src/private/hashed_values_cache.ts +0 -55
  515. package/src/private/index.ts +0 -16
  516. package/src/private/pick_notes.ts +0 -141
  517. package/src/private/private_execution.ts +0 -151
  518. package/src/private/private_execution_oracle.ts +0 -614
  519. package/src/private/providers/acvm_wasm.ts +0 -63
  520. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  521. package/src/private/providers/simulation_provider.ts +0 -45
  522. package/src/private/simulator.ts +0 -147
  523. package/src/private/unconstrained_execution.ts +0 -50
  524. package/src/private/unconstrained_execution_oracle.ts +0 -373
  525. package/src/public/avm/bytecode_utils.ts +0 -17
  526. package/src/public/avm/fixtures/index.ts +0 -296
  527. package/src/public/avm/journal/index.ts +0 -1
  528. package/src/public/avm/journal/journal.ts +0 -742
  529. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  530. package/src/public/bytecode_errors.ts +0 -6
  531. package/src/public/execution.ts +0 -140
  532. package/src/public/tx_contract_cache.ts +0 -69
  533. package/src/test/utils.ts +0 -36
@@ -1,25 +1,40 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
- import { Fr } from '@aztec/foundation/fields';
4
- import { createLogger } from '@aztec/foundation/log';
5
- import { type DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
+ import { sleep } from '@aztec/foundation/sleep';
6
+ import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
6
7
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
7
- import { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer';
8
+ import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
8
9
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
9
- import { PublicDataWrite } from '@aztec/stdlib/avm';
10
+ import {
11
+ AvmCircuitInputs,
12
+ AvmCircuitPublicInputs,
13
+ AvmExecutionHints,
14
+ type AvmProvingRequest,
15
+ PublicDataWrite,
16
+ PublicSimulatorConfig,
17
+ } from '@aztec/stdlib/avm';
10
18
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
11
19
  import type { ContractDataSource } from '@aztec/stdlib/contract';
20
+ import { computeTransactionFee } from '@aztec/stdlib/fees';
12
21
  import { Gas } from '@aztec/stdlib/gas';
13
- import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
22
+ import type {
23
+ MerkleTreeWriteOperations,
24
+ PublicProcessorLimits,
25
+ PublicProcessorValidator,
26
+ SequencerConfig,
27
+ } from '@aztec/stdlib/interfaces/server';
28
+ import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs';
29
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
14
30
  import { MerkleTreeId } from '@aztec/stdlib/trees';
15
31
  import {
16
32
  type FailedTx,
17
33
  GlobalVariables,
18
34
  NestedProcessReturnValues,
19
35
  type ProcessedTx,
36
+ StateReference,
20
37
  Tx,
21
- TxExecutionPhase,
22
- type TxValidator,
23
38
  makeProcessedTxFromPrivateOnlyTx,
24
39
  makeProcessedTxFromTxWithPublicCalls,
25
40
  } from '@aztec/stdlib/tx';
@@ -33,23 +48,33 @@ import {
33
48
  } from '@aztec/telemetry-client';
34
49
  import { ForkCheckpoint } from '@aztec/world-state/native';
35
50
 
36
- import { WorldStateDB } from '../public_db_sources.js';
37
- import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
51
+ import { AssertionError } from 'assert';
52
+
53
+ import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
54
+ import {
55
+ type PublicTxSimulatorConfig,
56
+ type PublicTxSimulatorInterface,
57
+ TelemetryCppPublicTxSimulator,
58
+ } from '../public_tx_simulator/index.js';
59
+ import { GuardedMerkleTreeOperations } from './guarded_merkle_tree.js';
38
60
  import { PublicProcessorMetrics } from './public_processor_metrics.js';
39
61
 
40
62
  /**
41
63
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
42
64
  */
43
65
  export class PublicProcessorFactory {
66
+ private log: Logger;
44
67
  constructor(
45
68
  private contractDataSource: ContractDataSource,
46
- private dateProvider: DateProvider,
47
- private telemetryClient: TelemetryClient = getTelemetryClient(),
48
- ) {}
69
+ private dateProvider: DateProvider = new DateProvider(),
70
+ protected telemetryClient: TelemetryClient = getTelemetryClient(),
71
+ bindings?: LoggerBindings,
72
+ ) {
73
+ this.log = createLogger('simulator:public-processor-factory', bindings);
74
+ }
49
75
 
50
76
  /**
51
77
  * Creates a new instance of a PublicProcessor.
52
- * @param historicalHeader - The header of a block previous to the one in which the tx is included.
53
78
  * @param globalVariables - The global variables for the block being processed.
54
79
  * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
55
80
  * @returns A new instance of a PublicProcessor.
@@ -57,43 +82,38 @@ export class PublicProcessorFactory {
57
82
  public create(
58
83
  merkleTree: MerkleTreeWriteOperations,
59
84
  globalVariables: GlobalVariables,
60
- skipFeeEnforcement: boolean,
85
+ config: PublicSimulatorConfig,
61
86
  ): PublicProcessor {
62
- const worldStateDB = new WorldStateDB(merkleTree, this.contractDataSource);
63
- const publicTxSimulator = this.createPublicTxSimulator(
64
- merkleTree,
65
- worldStateDB,
66
- globalVariables,
67
- /*doMerkleOperations=*/ true,
68
- skipFeeEnforcement,
69
- this.telemetryClient,
70
- );
87
+ const bindings = this.log.getBindings();
88
+ const contractsDB = new PublicContractsDB(this.contractDataSource, bindings);
89
+
90
+ const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
91
+ const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
71
92
 
72
93
  return new PublicProcessor(
73
- merkleTree,
74
94
  globalVariables,
75
- worldStateDB,
95
+ guardedFork,
96
+ contractsDB,
76
97
  publicTxSimulator,
77
98
  this.dateProvider,
78
99
  this.telemetryClient,
100
+ createLogger('simulator:public-processor', bindings),
79
101
  );
80
102
  }
81
103
 
82
104
  protected createPublicTxSimulator(
83
- db: MerkleTreeWriteOperations,
84
- worldStateDB: WorldStateDB,
105
+ merkleTree: MerkleTreeWriteOperations,
106
+ contractsDB: PublicContractsDB,
85
107
  globalVariables: GlobalVariables,
86
- doMerkleOperations: boolean,
87
- skipFeeEnforcement: boolean,
88
- telemetryClient: TelemetryClient,
89
- ) {
90
- return new PublicTxSimulator(
91
- db,
92
- worldStateDB,
108
+ config?: Partial<PublicTxSimulatorConfig>,
109
+ ): PublicTxSimulatorInterface {
110
+ return new TelemetryCppPublicTxSimulator(
111
+ merkleTree,
112
+ contractsDB,
93
113
  globalVariables,
94
- doMerkleOperations,
95
- skipFeeEnforcement,
96
- telemetryClient,
114
+ this.telemetryClient,
115
+ config,
116
+ this.log.getBindings(),
97
117
  );
98
118
  }
99
119
  }
@@ -112,13 +132,15 @@ class PublicProcessorTimeoutError extends Error {
112
132
  export class PublicProcessor implements Traceable {
113
133
  private metrics: PublicProcessorMetrics;
114
134
  constructor(
115
- protected db: MerkleTreeWriteOperations,
116
135
  protected globalVariables: GlobalVariables,
117
- protected worldStateDB: WorldStateDB,
118
- protected publicTxSimulator: PublicTxSimulator,
136
+ private guardedMerkleTree: GuardedMerkleTreeOperations,
137
+ protected contractsDB: PublicContractsDB,
138
+ protected publicTxSimulator: PublicTxSimulatorInterface,
119
139
  private dateProvider: DateProvider,
120
140
  telemetryClient: TelemetryClient = getTelemetryClient(),
121
- private log = createLogger('simulator:public-processor'),
141
+ private log: Logger,
142
+ private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
143
+ private debugLogStore: DebugLogStore = new NullDebugLogStore(),
122
144
  ) {
123
145
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
124
146
  }
@@ -130,35 +152,30 @@ export class PublicProcessor implements Traceable {
130
152
  /**
131
153
  * Run each tx through the public circuit and the public kernel circuit if needed.
132
154
  * @param txs - Txs to process.
133
- * @param processedTxHandler - Handler for processed txs in the context of block building or proving.
155
+ * @param limits - Limits for processing the txs.
156
+ * @param validator - Pre-process validator and nullifier cache to use for processing the txs.
134
157
  * @returns The list of processed txs with their circuit simulation outputs.
135
158
  */
136
159
  public async process(
137
160
  txs: Iterable<Tx> | AsyncIterable<Tx>,
138
- limits: {
139
- maxTransactions?: number;
140
- maxBlockSize?: number;
141
- maxBlockGas?: Gas;
142
- deadline?: Date;
143
- } = {},
144
- validators: {
145
- preprocessValidator?: TxValidator<Tx>;
146
- postprocessValidator?: TxValidator<ProcessedTx>;
147
- nullifierCache?: { addNullifiers: (nullifiers: Buffer[]) => void };
148
- } = {},
149
- ): Promise<[ProcessedTx[], FailedTx[], NestedProcessReturnValues[]]> {
150
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas } = limits;
151
- const { preprocessValidator, postprocessValidator, nullifierCache } = validators;
161
+ limits: PublicProcessorLimits = {},
162
+ validator: PublicProcessorValidator = {},
163
+ ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], DebugLog[]]> {
164
+ const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal } = limits;
165
+ const { preprocessValidator, nullifierCache } = validator;
152
166
  const result: ProcessedTx[] = [];
167
+ const usedTxs: Tx[] = [];
153
168
  const failed: FailedTx[] = [];
169
+ const debugLogs: DebugLog[] = [];
154
170
  const timer = new Timer();
155
171
 
156
172
  let totalSizeInBytes = 0;
157
173
  let returns: NestedProcessReturnValues[] = [];
158
174
  let totalPublicGas = new Gas(0, 0);
159
175
  let totalBlockGas = new Gas(0, 0);
176
+ let totalBlobFields = 0;
160
177
 
161
- for await (const origTx of txs) {
178
+ for await (const tx of txs) {
162
179
  // Only process up to the max tx limit
163
180
  if (maxTransactions !== undefined && result.length >= maxTransactions) {
164
181
  this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
@@ -171,22 +188,23 @@ export class PublicProcessor implements Traceable {
171
188
  break;
172
189
  }
173
190
 
174
- // Skip this tx if it'd exceed max block size
175
- const txHash = (await origTx.getTxHash()).toString();
176
- const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
177
- if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
178
- this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
179
- txHash,
180
- sizeInBytes: preTxSizeInBytes,
181
- totalSizeInBytes,
182
- maxBlockSize,
183
- });
191
+ const txHash = tx.getTxHash().toString();
192
+
193
+ // Skip this tx if its estimated blob fields would exceed the limit.
194
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
195
+ const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
196
+ if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
197
+ this.log.warn(
198
+ `Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`,
199
+ { txHash, txBlobFields, totalBlobFields, maxBlobFields },
200
+ );
184
201
  continue;
185
202
  }
186
203
 
187
- // Skip this tx if its gas limit would exceed the block gas limit
188
- const txGasLimit = origTx.data.constants.txContext.gasSettings.gasLimits;
189
- if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
204
+ // Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
205
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
206
+ const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
207
+ if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
190
208
  this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
191
209
  txHash,
192
210
  txGasLimit,
@@ -196,22 +214,19 @@ export class PublicProcessor implements Traceable {
196
214
  continue;
197
215
  }
198
216
 
199
- // The processor modifies the tx objects in place, so we need to clone them.
200
- const tx = Tx.clone(origTx);
201
-
202
217
  // We validate the tx before processing it, to avoid unnecessary work.
203
218
  if (preprocessValidator) {
204
219
  const result = await preprocessValidator.validateTx(tx);
205
- const txHash = await tx.getTxHash();
220
+ const txHash = tx.getTxHash();
206
221
  if (result.result === 'invalid') {
207
222
  const reason = result.reason.join(', ');
208
- this.log.warn(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
223
+ this.log.debug(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
209
224
  failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
210
225
  returns.push(new NestedProcessReturnValues([]));
211
226
  continue;
212
227
  } else if (result.result === 'skipped') {
213
228
  const reason = result.reason.join(', ');
214
- this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
229
+ this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
215
230
  returns.push(new NestedProcessReturnValues([]));
216
231
  continue;
217
232
  } else {
@@ -222,79 +237,124 @@ export class PublicProcessor implements Traceable {
222
237
  // We checkpoint the transaction here, then within the try/catch we
223
238
  // 1. Revert the checkpoint if the tx fails or needs to be discarded for any reason
224
239
  // 2. Commit the transaction in the finally block. Note that by using the ForkCheckpoint lifecycle only the first commit/revert takes effect
225
- const checkpoint = await ForkCheckpoint.new(this.worldStateDB);
240
+ // By doing this, every transaction starts on a fresh checkpoint and it's state updates only make it to the fork if this checkpoint is committed.
241
+ // Note: We use the underlying fork here not the guarded one, this ensures that it's not impacted by stopping the guarded version
242
+ const checkpoint = await ForkCheckpoint.new(this.guardedMerkleTree.getUnderlyingFork());
243
+ const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
244
+ this.contractsDB.createCheckpoint();
226
245
 
227
246
  try {
228
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
247
+ const [processedTx, returnValues, txDebugLogs] = await this.processTx(tx, deadline);
229
248
 
230
- // If the actual size of this tx would exceed block size, skip it
231
- const txSize = processedTx.txEffect.getDASize();
232
- if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
233
- this.log.warn(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
234
- txHash,
235
- sizeInBytes: txSize,
236
- totalSizeInBytes,
237
- maxBlockSize,
238
- });
249
+ // Inject a fake processing failure after N txs if requested
250
+ const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
251
+ if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
252
+ throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
253
+ }
254
+
255
+ const txBlobFields = processedTx.txEffect.getNumBlobFields();
256
+ const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
257
+
258
+ // If the actual blob fields of this tx would exceed the limit, skip it.
259
+ // Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
260
+ if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
261
+ this.log.debug(
262
+ `Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`,
263
+ {
264
+ txHash,
265
+ txBlobFields,
266
+ totalBlobFields,
267
+ maxBlobFields,
268
+ },
269
+ );
239
270
  // Need to revert the checkpoint here and don't go any further
240
271
  await checkpoint.revert();
272
+ this.contractsDB.revertCheckpoint();
241
273
  continue;
242
274
  }
243
275
 
244
- // Re-validate the transaction
245
- if (postprocessValidator) {
246
- // Only accept processed transactions that are not double-spends,
247
- // public functions emitting nullifiers would pass earlier check but fail here.
248
- // Note that we're checking all nullifiers generated in the private execution twice,
249
- // we could store the ones already checked and skip them here as an optimization.
250
- // TODO(palla/txs): Can we get into this case? AVM validates this. We should be able to remove it.
251
- const result = await postprocessValidator.validateTx(processedTx);
252
- if (result.result !== 'valid') {
253
- const reason = result.reason.join(', ');
254
- this.log.error(`Rejecting tx ${processedTx.hash} after processing: ${reason}.`);
255
- failed.push({ tx, error: new Error(`Tx failed post-process validation: ${reason}`) });
256
- // Need to revert the checkpoint here and don't go any further
257
- await checkpoint.revert();
258
- continue;
259
- } else {
260
- this.log.trace(`Tx ${txHash.toString()} is valid post processing.`);
261
- }
262
- }
263
-
264
- if (!tx.hasPublicCalls()) {
265
- // If there are no public calls, perform all tree insertions for side effects from private
266
- // When there are public calls, the PublicTxSimulator & AVM handle tree insertions.
267
- await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
268
- // Add any contracts registered/deployed in this private-only tx to the block-level cache
269
- // (add to tx-level cache and then commit to block-level cache)
270
- await this.worldStateDB.addNewContracts(tx);
271
- this.worldStateDB.commitContractsForTx();
276
+ // During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
277
+ // Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
278
+ // this uses actual gas and stops processing when the limit is exceeded.
279
+ if (
280
+ !isBuildingProposal &&
281
+ maxBlockGas !== undefined &&
282
+ totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)
283
+ ) {
284
+ this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
285
+ txHash,
286
+ txGas: processedTx.gasUsed.totalGas,
287
+ totalBlockGas,
288
+ maxBlockGas,
289
+ });
290
+ await checkpoint.revert();
291
+ this.contractsDB.revertCheckpoint();
292
+ break;
272
293
  }
273
294
 
295
+ // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
296
+ // I'd rather pass the validators the processedTx as well and let them deal with it.
274
297
  nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
275
298
  result.push(processedTx);
299
+ usedTxs.push(tx);
276
300
  returns = returns.concat(returnValues);
301
+ debugLogs.push(...txDebugLogs);
302
+
303
+ this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
277
304
 
278
305
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
279
306
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
280
307
  totalSizeInBytes += txSize;
308
+ totalBlobFields += txBlobFields;
281
309
  } catch (err: any) {
282
- // Roll back state to start of TX before proceeding to next TX
283
- await checkpoint.revert();
284
310
  if (err?.name === 'PublicProcessorTimeoutError') {
285
311
  this.log.warn(`Stopping tx processing due to timeout.`);
312
+ // We hit the transaction execution deadline.
313
+ // There may still be a transaction executing on a worker thread (C++ via NAPI).
314
+ // Signal cancellation AND WAIT for the simulation to actually stop.
315
+ // This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
316
+ // and won't check the cancellation flag until that operation completes.
317
+ // Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
318
+ // Wait for C++ to stop gracefully.
319
+ await this.publicTxSimulator.cancel?.();
320
+
321
+ // Now stop the guarded fork to prevent any further TS-side access to the world state.
322
+ await this.guardedMerkleTree.stop();
323
+
324
+ // We now know there can't be any further access to world state. The fork is in a state where there is:
325
+ // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
326
+ // 2. Possible state updates on that checkpoint or any others created during execution.
327
+
328
+ // Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
329
+ // updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
330
+ // created by callers below our depth.
331
+ await checkpoint.revertToCheckpoint();
332
+
333
+ // Revert any contracts added to the DB for the tx.
334
+ this.contractsDB.revertCheckpoint();
335
+
336
+ // Ensure we're at the same state as when we started processing this tx.
337
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
338
+
339
+ // We should now be in a position where the fork is in a clean state and no further updates can be made to it.
286
340
  break;
287
341
  }
288
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
289
- this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
290
342
 
343
+ // Roll back state to start of TX before proceeding to next TX.
344
+ // Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
345
+ await checkpoint.revertToCheckpoint();
346
+ this.contractsDB.revertCheckpoint();
347
+ const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
348
+ this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
291
349
  failed.push({ tx, error: err instanceof Error ? err : new Error(errorMessage) });
292
350
  returns.push(new NestedProcessReturnValues([]));
351
+
352
+ // Ensure we're at the same state as when we started processing this tx.
353
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
293
354
  } finally {
294
- // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was reverted
355
+ // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
295
356
  await checkpoint.commit();
296
- // The tx-level contracts cache should not live on to the next tx
297
- this.worldStateDB.clearContractsForTx();
357
+ this.contractsDB.commitCheckpointOkIfNone();
298
358
  }
299
359
  }
300
360
 
@@ -310,17 +370,38 @@ export class PublicProcessor implements Traceable {
310
370
  totalSizeInBytes,
311
371
  });
312
372
 
313
- return [result, failed, returns];
373
+ return [result, failed, usedTxs, returns, debugLogs];
314
374
  }
315
375
 
316
- @trackSpan('PublicProcessor.processTx', async tx => ({ [Attributes.TX_HASH]: (await tx.getTxHash()).toString() }))
317
- private async processTx(tx: Tx, deadline?: Date): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
318
- const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline));
376
+ private async checkWorldStateUnchanged(
377
+ startStateReference: StateReference,
378
+ txHash: `0x${string}`,
379
+ cause: Error,
380
+ ): Promise<void> {
381
+ const endStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
382
+ if (!startStateReference.equals(endStateReference)) {
383
+ this.log.warn(`Fork state reference changed by tx ${txHash} after error in public processor`, {
384
+ expected: startStateReference.toInspect(),
385
+ actual: endStateReference.toInspect(),
386
+ cause,
387
+ });
388
+ throw new Error(`Fork state reference changed by tx ${txHash} after error in public processor`, { cause });
389
+ }
390
+ }
391
+
392
+ @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
393
+ private async processTx(
394
+ tx: Tx,
395
+ deadline: Date | undefined,
396
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
397
+ const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
398
+ this.processTxWithinDeadline(tx, deadline),
399
+ );
319
400
 
320
401
  this.log.verbose(
321
402
  !tx.hasPublicCalls()
322
403
  ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms`
323
- : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls in ${time}ms`,
404
+ : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`,
324
405
  {
325
406
  txHash: processedTx.hash,
326
407
  txFee: processedTx.txEffect.transactionFee.toBigInt(),
@@ -338,13 +419,10 @@ export class PublicProcessor implements Traceable {
338
419
  },
339
420
  );
340
421
 
341
- return [processedTx, returnValues ?? []];
422
+ return [processedTx, returnValues ?? [], debugLogs];
342
423
  }
343
424
 
344
- private async doTreeInsertionsForPrivateOnlyTx(
345
- processedTx: ProcessedTx,
346
- txValidator?: TxValidator<ProcessedTx>,
347
- ): Promise<void> {
425
+ private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
348
426
  const treeInsertionStart = process.hrtime.bigint();
349
427
 
350
428
  // Update the state so that the next tx in the loop has the correct .startState
@@ -353,31 +431,20 @@ export class PublicProcessor implements Traceable {
353
431
  // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop
354
432
  // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
355
433
  // The below is taken from buildBaseRollupHints:
356
- await this.db.appendLeaves(
434
+ await this.guardedMerkleTree.appendLeaves(
357
435
  MerkleTreeId.NOTE_HASH_TREE,
358
436
  padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
359
437
  );
360
438
  try {
361
- await this.db.batchInsert(
439
+ await this.guardedMerkleTree.batchInsert(
362
440
  MerkleTreeId.NULLIFIER_TREE,
363
441
  padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()),
364
442
  NULLIFIER_SUBTREE_HEIGHT,
365
443
  );
366
- } catch (error) {
367
- if (txValidator) {
368
- // Ideally the validator has already caught this above, but just in case:
369
- throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`);
370
- } else {
371
- // We have no validator and assume this call should blindly process txs with duplicates being caught later
372
- this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`);
373
- }
444
+ } catch (cause) {
445
+ throw new Error(`Transaction ${processedTx.hash} failed with duplicate nullifiers`, { cause });
374
446
  }
375
447
 
376
- // The only public data write should be for fee payment
377
- await this.db.sequentialInsert(
378
- MerkleTreeId.PUBLIC_DATA_TREE,
379
- processedTx.txEffect.publicDataWrites.map(x => x.toBuffer()),
380
- );
381
448
  const treeInsertionEnd = process.hrtime.bigint();
382
449
  this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
383
450
  }
@@ -385,17 +452,28 @@ export class PublicProcessor implements Traceable {
385
452
  /** Processes the given tx within deadline. Returns timeout if deadline is hit. */
386
453
  private async processTxWithinDeadline(
387
454
  tx: Tx,
388
- deadline?: Date,
389
- ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> {
390
- const processFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls()
391
- ? () => this.processTxWithPublicCalls(tx)
392
- : () => this.processPrivateOnlyTx(tx);
455
+ deadline: Date | undefined,
456
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
457
+ const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
458
+ tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
459
+
460
+ // Fake a delay per tx if instructed (used for tests)
461
+ const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
462
+ const processFn =
463
+ fakeDelayPerTxMs && fakeDelayPerTxMs > 0
464
+ ? async () => {
465
+ const result = await innerProcessFn();
466
+ this.log.warn(`Sleeping ${fakeDelayPerTxMs}ms after processing tx ${tx.getTxHash().toString()}`);
467
+ await sleep(fakeDelayPerTxMs);
468
+ return result;
469
+ }
470
+ : innerProcessFn;
393
471
 
394
472
  if (!deadline) {
395
473
  return await processFn();
396
474
  }
397
475
 
398
- const txHash = await tx.getTxHash();
476
+ const txHash = tx.getTxHash();
399
477
  const timeout = +deadline - this.dateProvider.now();
400
478
  if (timeout <= 0) {
401
479
  throw new PublicProcessorTimeoutError();
@@ -419,14 +497,16 @@ export class PublicProcessor implements Traceable {
419
497
  * This is used in private only txs, since for txs with public calls
420
498
  * the avm handles the fee payment itself.
421
499
  */
422
- private async getFeePaymentPublicDataWrite(txFee: Fr, feePayer: AztecAddress): Promise<PublicDataWrite> {
500
+ private async performFeePaymentPublicDataWrite(txFee: Fr, feePayer: AztecAddress): Promise<PublicDataWrite> {
423
501
  const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
424
502
  const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
425
503
  const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
504
+ // This high-level db is used as a convenient helper. It could be done with the merkleTree directly.
505
+ const treesDB = new PublicTreesDB(this.guardedMerkleTree);
426
506
 
427
507
  this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
428
508
 
429
- const balance = await this.worldStateDB.storageRead(feeJuiceAddress, balanceSlot);
509
+ const balance = await treesDB.storageRead(feeJuiceAddress, balanceSlot);
430
510
 
431
511
  if (balance.lt(txFee)) {
432
512
  throw new Error(
@@ -435,87 +515,96 @@ export class PublicProcessor implements Traceable {
435
515
  }
436
516
 
437
517
  const updatedBalance = balance.sub(txFee);
438
- await this.worldStateDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
518
+ await treesDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
439
519
 
440
520
  return new PublicDataWrite(leafSlot, updatedBalance);
441
521
  }
442
522
 
443
- @trackSpan('PublicProcessor.processPrivateOnlyTx', async (tx: Tx) => ({
444
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
523
+ @trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
524
+ [Attributes.TX_HASH]: tx.getTxHash().toString(),
445
525
  }))
446
- private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
526
+ private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
447
527
  const gasFees = this.globalVariables.gasFees;
448
- const transactionFee = tx.data.gasUsed.computeFee(gasFees);
528
+ const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
449
529
 
450
- const feePaymentPublicDataWrite = await this.getFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
530
+ const feePaymentPublicDataWrite = await this.performFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
451
531
 
452
- const processedTx = await makeProcessedTxFromPrivateOnlyTx(
532
+ const processedTx = makeProcessedTxFromPrivateOnlyTx(
453
533
  tx,
454
534
  transactionFee,
455
535
  feePaymentPublicDataWrite,
456
536
  this.globalVariables,
457
537
  );
458
538
 
459
- const siloedContractClassLogs = await tx.filterContractClassLogs(
460
- tx.data.getNonEmptyContractClassLogsHashes(),
461
- true,
539
+ this.metrics.recordClassPublication(
540
+ ...tx
541
+ .getContractClassLogs()
542
+ .filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
543
+ .map(log => ContractClassPublishedEvent.fromLog(log)),
462
544
  );
463
545
 
464
- this.metrics.recordClassRegistration(
465
- ...siloedContractClassLogs
466
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log))
467
- .map(log => ContractClassRegisteredEvent.fromLog(log)),
468
- );
469
- return [processedTx, undefined];
546
+ // Fee payment insertion has already been done. Do the rest.
547
+ await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
548
+
549
+ await this.contractsDB.addNewContracts(tx);
550
+
551
+ return [processedTx, undefined, []];
470
552
  }
471
553
 
472
- @trackSpan('PublicProcessor.processTxWithPublicCalls', async tx => ({
473
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
554
+ @trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
555
+ [Attributes.TX_HASH]: tx.getTxHash().toString(),
474
556
  }))
475
- private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
557
+ private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
476
558
  const timer = new Timer();
477
559
 
478
- const { avmProvingRequest, gasUsed, revertCode, revertReason, processedPhases } =
479
- await this.publicTxSimulator.simulate(tx);
480
-
481
- if (!avmProvingRequest) {
482
- this.metrics.recordFailedTx();
483
- throw new Error('Avm proving result was not generated.');
484
- }
485
-
486
- processedPhases.forEach(phase => {
487
- if (phase.reverted) {
488
- this.metrics.recordRevertedPhase(phase.phase);
489
- } else {
490
- this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
491
- }
492
- });
493
-
494
- const siloedContractClassLogs = await tx.filterContractClassLogs(
495
- tx.data.getNonEmptyContractClassLogsHashes(),
496
- true,
560
+ const result = await this.publicTxSimulator.simulate(tx);
561
+ // TODO: use the callStackMetadata here to extract more data about public execution
562
+ const { hints, publicInputs, publicTxEffect, gasUsed, revertCode /*callStackMetadata*/ } = result;
563
+
564
+ const contractClassLogs = revertCode.isOK()
565
+ ? tx.getContractClassLogs()
566
+ : tx.getSplitContractClassLogs(false /* revertible */);
567
+ this.metrics.recordClassPublication(
568
+ ...contractClassLogs
569
+ .filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
570
+ .map(log => ContractClassPublishedEvent.fromLog(log)),
497
571
  );
498
572
 
499
- this.metrics.recordClassRegistration(
500
- ...siloedContractClassLogs
501
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log))
502
- .map(log => ContractClassRegisteredEvent.fromLog(log)),
503
- );
504
-
505
- const phaseCount = processedPhases.length;
573
+ // TODO(fcarreiro): remove phase count metric.
506
574
  const durationMs = timer.ms();
507
- this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
575
+ this.metrics.recordTx(/*phaseCount=*/ 1, durationMs, gasUsed.publicGas);
508
576
 
509
- const processedTx = await makeProcessedTxFromTxWithPublicCalls(
577
+ // Extract the return values from the call stack metadata.
578
+ const appLogicReturnValues: NestedProcessReturnValues[] = result.getAppLogicReturnValues();
579
+ // Extract the revert reason from the call stack metadata.
580
+ const revertReason = result.findRevertReason();
581
+ // Create proving request if we have hints and public inputs.
582
+ const avmProvingRequest =
583
+ hints && publicInputs ? PublicProcessor.generateProvingRequest(publicInputs, hints) : undefined;
584
+
585
+ const processedTx = makeProcessedTxFromTxWithPublicCalls(
510
586
  tx,
587
+ this.globalVariables,
511
588
  avmProvingRequest,
589
+ publicTxEffect,
512
590
  gasUsed,
513
591
  revertCode,
514
592
  revertReason,
515
593
  );
516
594
 
517
- const returnValues = processedPhases.find(({ phase }) => phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
595
+ return [processedTx, appLogicReturnValues, result.logs ?? []];
596
+ }
518
597
 
519
- return [processedTx, returnValues];
598
+ /**
599
+ * Generate the proving request for the AVM circuit.
600
+ */
601
+ private static generateProvingRequest(
602
+ publicInputs: AvmCircuitPublicInputs,
603
+ hints: AvmExecutionHints = AvmExecutionHints.empty(),
604
+ ): AvmProvingRequest {
605
+ return {
606
+ type: ProvingRequestType.PUBLIC_VM,
607
+ inputs: new AvmCircuitInputs(hints, publicInputs),
608
+ };
520
609
  }
521
610
  }