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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/README.md +6 -0
  2. package/dest/client.d.ts +5 -3
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +4 -7
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +0 -1
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/private/acvm/acvm.d.ts +11 -5
  12. package/dest/private/acvm/acvm.d.ts.map +1 -1
  13. package/dest/private/acvm/acvm.js +10 -16
  14. package/dest/private/acvm/acvm_types.d.ts +1 -1
  15. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  16. package/dest/private/acvm/deserialize.d.ts +17 -18
  17. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.js +31 -23
  19. package/dest/private/acvm/index.d.ts +0 -1
  20. package/dest/private/acvm/index.d.ts.map +1 -1
  21. package/dest/private/acvm/index.js +0 -1
  22. package/dest/private/acvm/serialize.d.ts +19 -2
  23. package/dest/private/acvm/serialize.d.ts.map +1 -1
  24. package/dest/private/acvm/serialize.js +53 -0
  25. package/dest/private/{providers/acvm_native.d.ts → acvm_native.d.ts} +9 -10
  26. package/dest/private/acvm_native.d.ts.map +1 -0
  27. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  28. package/dest/private/acvm_wasm.d.ts +15 -0
  29. package/dest/private/acvm_wasm.d.ts.map +1 -0
  30. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  31. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  32. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  33. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  34. package/dest/private/circuit_recording/circuit_recorder.d.ts +108 -0
  35. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  36. package/dest/private/circuit_recording/circuit_recorder.js +209 -0
  37. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -0
  38. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  40. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +5 -0
  41. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  43. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  44. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  46. package/dest/private/circuit_simulator.d.ts +35 -0
  47. package/dest/private/circuit_simulator.d.ts.map +1 -0
  48. package/dest/private/circuit_simulator.js +43 -0
  49. package/dest/private/factory.d.ts +12 -0
  50. package/dest/private/factory.d.ts.map +1 -0
  51. package/dest/private/{providers/factory.js → factory.js} +2 -2
  52. package/dest/public/avm/avm_context.d.ts +5 -5
  53. package/dest/public/avm/avm_context.d.ts.map +1 -1
  54. package/dest/public/avm/avm_contract_call_result.d.ts +4 -2
  55. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.js +11 -7
  57. package/dest/public/avm/avm_execution_environment.d.ts +3 -1
  58. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  59. package/dest/public/avm/avm_execution_environment.js +7 -2
  60. package/dest/public/avm/avm_gas.d.ts +4 -20
  61. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  62. package/dest/public/avm/avm_gas.js +27 -35
  63. package/dest/public/avm/avm_machine_state.d.ts +2 -0
  64. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  65. package/dest/public/avm/avm_machine_state.js +2 -0
  66. package/dest/public/avm/avm_memory_types.d.ts +98 -87
  67. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  68. package/dest/public/avm/avm_memory_types.js +17 -6
  69. package/dest/public/avm/avm_simulator.d.ts +4 -5
  70. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  71. package/dest/public/avm/avm_simulator.js +23 -35
  72. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  73. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  74. package/dest/public/avm/avm_simulator_interface.js +3 -0
  75. package/dest/public/avm/errors.d.ts +6 -30
  76. package/dest/public/avm/errors.d.ts.map +1 -1
  77. package/dest/public/avm/errors.js +7 -57
  78. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +5 -4
  79. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  80. package/dest/public/avm/fixtures/avm_simulation_tester.js +12 -14
  81. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +6 -4
  82. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +37 -14
  84. package/dest/public/avm/fixtures/initializers.d.ts +43 -0
  85. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  86. package/dest/public/avm/fixtures/initializers.js +42 -0
  87. package/dest/public/avm/fixtures/utils.d.ts +38 -0
  88. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  89. package/dest/public/avm/fixtures/utils.js +95 -0
  90. package/dest/public/avm/index.d.ts +0 -2
  91. package/dest/public/avm/index.d.ts.map +1 -1
  92. package/dest/public/avm/index.js +0 -2
  93. package/dest/public/avm/opcodes/accrued_substate.d.ts +2 -2
  94. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  95. package/dest/public/avm/opcodes/accrued_substate.js +28 -25
  96. package/dest/public/avm/opcodes/addressing_mode.d.ts +11 -7
  97. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  98. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  99. package/dest/public/avm/opcodes/arithmetic.d.ts +11 -1
  100. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  101. package/dest/public/avm/opcodes/arithmetic.js +16 -2
  102. package/dest/public/avm/opcodes/bitwise.d.ts +5 -13
  103. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  104. package/dest/public/avm/opcodes/bitwise.js +19 -26
  105. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/comparators.js +3 -3
  107. package/dest/public/avm/opcodes/contract.d.ts +1 -2
  108. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/contract.js +9 -10
  110. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  111. package/dest/public/avm/opcodes/control_flow.js +10 -8
  112. package/dest/public/avm/opcodes/conversion.d.ts +1 -0
  113. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  114. package/dest/public/avm/opcodes/conversion.js +267 -3
  115. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  116. package/dest/public/avm/opcodes/ec_add.js +6 -6
  117. package/dest/public/avm/opcodes/environment_getters.d.ts +2 -2
  118. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  119. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  120. package/dest/public/avm/opcodes/external_calls.d.ts +8 -7
  121. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  122. package/dest/public/avm/opcodes/external_calls.js +39 -34
  123. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/hashing.js +6 -6
  125. package/dest/public/avm/opcodes/instruction.d.ts +14 -10
  126. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/instruction.js +23 -19
  128. package/dest/public/avm/opcodes/memory.d.ts +4 -4
  129. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/memory.js +37 -33
  131. package/dest/public/avm/opcodes/misc.d.ts +2 -1
  132. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/misc.js +41 -16
  134. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  135. package/dest/public/avm/opcodes/storage.js +7 -5
  136. package/dest/public/avm/revert_reason.d.ts +18 -0
  137. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  138. package/dest/public/avm/revert_reason.js +38 -0
  139. package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -2
  140. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  141. package/dest/public/avm/serialization/bytecode_serialization.d.ts +2 -6
  142. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  143. package/dest/public/avm/serialization/bytecode_serialization.js +70 -69
  144. package/dest/public/avm/serialization/instruction_serialization.d.ts +13 -4
  145. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  146. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  147. package/dest/public/avm/test_utils.d.ts +10 -13
  148. package/dest/public/avm/test_utils.d.ts.map +1 -1
  149. package/dest/public/avm/test_utils.js +16 -24
  150. package/dest/public/db_interfaces.d.ts +56 -0
  151. package/dest/public/db_interfaces.d.ts.map +1 -0
  152. package/dest/public/db_interfaces.js +3 -0
  153. package/dest/public/debug_fn_name.d.ts +5 -0
  154. package/dest/public/debug_fn_name.d.ts.map +1 -0
  155. package/dest/public/debug_fn_name.js +9 -0
  156. package/dest/public/executor_metrics.d.ts +10 -3
  157. package/dest/public/executor_metrics.d.ts.map +1 -1
  158. package/dest/public/executor_metrics.js +37 -6
  159. package/dest/public/executor_metrics_interface.d.ts +9 -0
  160. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  161. package/dest/public/executor_metrics_interface.js +1 -0
  162. package/dest/public/fixtures/amm_test.d.ts +10 -0
  163. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  164. package/dest/public/fixtures/amm_test.js +213 -0
  165. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  166. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  167. package/dest/public/fixtures/bulk_test.js +326 -0
  168. package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
  169. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  170. package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
  171. package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
  172. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  173. package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
  174. package/dest/public/fixtures/index.d.ts +7 -0
  175. package/dest/public/fixtures/index.d.ts.map +1 -1
  176. package/dest/public/fixtures/index.js +7 -0
  177. package/dest/public/fixtures/minimal_public_tx.d.ts +10 -0
  178. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  179. package/dest/public/fixtures/minimal_public_tx.js +29 -0
  180. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -13
  181. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  182. package/dest/public/fixtures/public_tx_simulation_tester.js +96 -71
  183. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.d.ts +6 -6
  184. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  185. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  186. package/dest/public/fixtures/token_test.d.ts +8 -0
  187. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  188. package/dest/public/fixtures/token_test.js +95 -0
  189. package/dest/public/fixtures/utils.d.ts +16 -3
  190. package/dest/public/fixtures/utils.d.ts.map +1 -1
  191. package/dest/public/fixtures/utils.js +100 -58
  192. package/dest/public/hinting_db_sources.d.ts +70 -0
  193. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  194. package/dest/public/hinting_db_sources.js +297 -0
  195. package/dest/public/index.d.ts +4 -8
  196. package/dest/public/index.d.ts.map +1 -1
  197. package/dest/public/index.js +4 -7
  198. package/dest/public/public_db_sources.d.ts +30 -39
  199. package/dest/public/public_db_sources.d.ts.map +1 -1
  200. package/dest/public/public_db_sources.js +151 -67
  201. package/dest/public/public_errors.d.ts +12 -0
  202. package/dest/public/public_errors.d.ts.map +1 -0
  203. package/dest/public/public_errors.js +13 -0
  204. package/dest/public/public_processor/guarded_merkle_tree.d.ts +49 -0
  205. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  206. package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
  207. package/dest/public/public_processor/public_processor.d.ts +25 -30
  208. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  209. package/dest/public/public_processor/public_processor.js +141 -96
  210. package/dest/public/public_processor/public_processor_metrics.d.ts +2 -2
  211. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  212. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  213. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +41 -0
  214. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  215. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +89 -0
  216. package/dest/public/public_tx_simulator/index.d.ts +4 -0
  217. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  218. package/dest/public/public_tx_simulator/index.js +2 -0
  219. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +24 -0
  220. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  221. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  222. package/dest/public/public_tx_simulator/public_tx_context.d.ts +19 -29
  223. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  224. package/dest/public/public_tx_simulator/public_tx_context.js +63 -91
  225. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +45 -47
  226. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  227. package/dest/public/public_tx_simulator/public_tx_simulator.js +209 -184
  228. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -0
  229. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  230. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  231. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  232. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  233. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  234. package/dest/public/side_effect_errors.d.ts +41 -1
  235. package/dest/public/side_effect_errors.d.ts.map +1 -1
  236. package/dest/public/side_effect_errors.js +70 -1
  237. package/dest/public/side_effect_trace.d.ts +20 -65
  238. package/dest/public/side_effect_trace.d.ts.map +1 -1
  239. package/dest/public/side_effect_trace.js +71 -121
  240. package/dest/public/side_effect_trace_interface.d.ts +11 -22
  241. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  242. package/dest/public/state_manager/index.d.ts +2 -0
  243. package/dest/public/state_manager/index.d.ts.map +1 -0
  244. package/dest/public/state_manager/index.js +1 -0
  245. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +2 -5
  246. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  247. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  248. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +2 -2
  249. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  250. package/dest/public/{avm/journal/journal.d.ts → state_manager/state_manager.d.ts} +42 -85
  251. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  252. package/dest/public/state_manager/state_manager.js +391 -0
  253. package/dest/public/test_executor_metrics.d.ts +54 -0
  254. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  255. package/dest/public/test_executor_metrics.js +306 -0
  256. package/dest/public/unique_class_ids.d.ts.map +1 -1
  257. package/dest/public/utils.d.ts +2 -4
  258. package/dest/public/utils.d.ts.map +1 -1
  259. package/dest/public/utils.js +4 -21
  260. package/dest/server.d.ts +6 -3
  261. package/dest/server.d.ts.map +1 -1
  262. package/dest/server.js +5 -2
  263. package/dest/testing.d.ts +2 -0
  264. package/dest/testing.d.ts.map +1 -0
  265. package/dest/testing.js +1 -0
  266. package/package.json +36 -31
  267. package/src/client.ts +5 -3
  268. package/src/common/errors.ts +79 -44
  269. package/src/common/index.ts +0 -1
  270. package/src/private/acvm/acvm.ts +17 -32
  271. package/src/private/acvm/acvm_types.ts +1 -1
  272. package/src/private/acvm/deserialize.ts +35 -29
  273. package/src/private/acvm/index.ts +0 -1
  274. package/src/private/acvm/serialize.ts +63 -0
  275. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  276. package/src/private/acvm_wasm.ts +72 -0
  277. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  278. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  279. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  280. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  281. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  282. package/src/private/circuit_simulator.ts +90 -0
  283. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  284. package/src/public/avm/avm_context.ts +4 -4
  285. package/src/public/avm/avm_contract_call_result.ts +17 -5
  286. package/src/public/avm/avm_execution_environment.ts +10 -1
  287. package/src/public/avm/avm_gas.ts +23 -35
  288. package/src/public/avm/avm_machine_state.ts +5 -0
  289. package/src/public/avm/avm_memory_types.ts +19 -6
  290. package/src/public/avm/avm_simulator.ts +44 -54
  291. package/src/public/avm/avm_simulator_interface.ts +8 -0
  292. package/src/public/avm/errors.ts +8 -77
  293. package/src/public/avm/fixtures/avm_simulation_tester.ts +23 -20
  294. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
  295. package/src/public/avm/fixtures/initializers.ts +104 -0
  296. package/src/public/avm/fixtures/utils.ts +150 -0
  297. package/src/public/avm/index.ts +0 -2
  298. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  299. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  300. package/src/public/avm/opcodes/arithmetic.ts +24 -2
  301. package/src/public/avm/opcodes/bitwise.ts +33 -29
  302. package/src/public/avm/opcodes/comparators.ts +6 -3
  303. package/src/public/avm/opcodes/contract.ts +10 -7
  304. package/src/public/avm/opcodes/control_flow.ts +19 -10
  305. package/src/public/avm/opcodes/conversion.ts +27 -3
  306. package/src/public/avm/opcodes/ec_add.ts +9 -6
  307. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  308. package/src/public/avm/opcodes/external_calls.ts +61 -29
  309. package/src/public/avm/opcodes/hashing.ts +28 -8
  310. package/src/public/avm/opcodes/instruction.ts +31 -21
  311. package/src/public/avm/opcodes/memory.ts +71 -32
  312. package/src/public/avm/opcodes/misc.ts +60 -18
  313. package/src/public/avm/opcodes/storage.ts +22 -6
  314. package/src/public/avm/revert_reason.ts +55 -0
  315. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  316. package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
  317. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  318. package/src/public/avm/test_utils.ts +24 -41
  319. package/src/public/db_interfaces.ts +61 -0
  320. package/src/{common → public}/debug_fn_name.ts +7 -7
  321. package/src/public/executor_metrics.ts +55 -6
  322. package/src/public/executor_metrics_interface.ts +14 -0
  323. package/src/public/fixtures/amm_test.ts +331 -0
  324. package/src/public/fixtures/bulk_test.ts +169 -0
  325. package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
  326. package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
  327. package/src/public/fixtures/index.ts +7 -0
  328. package/src/public/fixtures/minimal_public_tx.ts +36 -0
  329. package/src/public/fixtures/public_tx_simulation_tester.ts +158 -113
  330. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
  331. package/src/public/fixtures/token_test.ts +140 -0
  332. package/src/public/fixtures/utils.ts +141 -68
  333. package/src/public/hinting_db_sources.ts +505 -0
  334. package/src/public/index.ts +9 -8
  335. package/src/public/public_db_sources.ts +196 -97
  336. package/src/public/public_errors.ts +14 -0
  337. package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
  338. package/src/public/public_processor/public_processor.ts +191 -153
  339. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  340. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +128 -0
  341. package/src/public/public_tx_simulator/index.ts +3 -0
  342. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +109 -0
  343. package/src/public/public_tx_simulator/public_tx_context.ts +160 -193
  344. package/src/public/public_tx_simulator/public_tx_simulator.ts +294 -220
  345. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +11 -0
  346. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  347. package/src/public/side_effect_errors.ts +91 -1
  348. package/src/public/side_effect_trace.ts +94 -320
  349. package/src/public/side_effect_trace_interface.ts +10 -58
  350. package/src/public/state_manager/index.ts +1 -0
  351. package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
  352. package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
  353. package/src/public/state_manager/state_manager.ts +560 -0
  354. package/src/public/test_executor_metrics.ts +395 -0
  355. package/src/public/utils.ts +5 -21
  356. package/src/server.ts +6 -3
  357. package/src/testing.ts +1 -0
  358. package/dest/common/db_interfaces.d.ts +0 -80
  359. package/dest/common/db_interfaces.d.ts.map +0 -1
  360. package/dest/common/db_interfaces.js +0 -1
  361. package/dest/common/debug_fn_name.d.ts +0 -5
  362. package/dest/common/debug_fn_name.d.ts.map +0 -1
  363. package/dest/common/debug_fn_name.js +0 -6
  364. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  365. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  366. package/dest/common/message_load_oracle_inputs.js +0 -15
  367. package/dest/private/acvm/oracle/index.d.ts +0 -14
  368. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  369. package/dest/private/acvm/oracle/index.js +0 -2
  370. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  371. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  372. package/dest/private/acvm/oracle/oracle.js +0 -263
  373. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  374. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  375. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  376. package/dest/private/execution_data_provider.d.ts +0 -261
  377. package/dest/private/execution_data_provider.d.ts.map +0 -1
  378. package/dest/private/execution_data_provider.js +0 -14
  379. package/dest/private/execution_note_cache.d.ts +0 -93
  380. package/dest/private/execution_note_cache.d.ts.map +0 -1
  381. package/dest/private/execution_note_cache.js +0 -180
  382. package/dest/private/hashed_values_cache.d.ts +0 -28
  383. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  384. package/dest/private/hashed_values_cache.js +0 -46
  385. package/dest/private/index.d.ts +0 -13
  386. package/dest/private/index.d.ts.map +0 -1
  387. package/dest/private/index.js +0 -12
  388. package/dest/private/pick_notes.d.ts +0 -85
  389. package/dest/private/pick_notes.d.ts.map +0 -1
  390. package/dest/private/pick_notes.js +0 -51
  391. package/dest/private/private_execution.d.ts +0 -25
  392. package/dest/private/private_execution.d.ts.map +0 -1
  393. package/dest/private/private_execution.js +0 -92
  394. package/dest/private/private_execution_oracle.d.ts +0 -215
  395. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  396. package/dest/private/private_execution_oracle.js +0 -382
  397. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  398. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  399. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  400. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  401. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  402. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  403. package/dest/private/providers/factory.d.ts +0 -12
  404. package/dest/private/providers/factory.d.ts.map +0 -1
  405. package/dest/private/providers/simulation_provider.d.ts +0 -19
  406. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  407. package/dest/private/providers/simulation_provider.js +0 -24
  408. package/dest/private/simulator.d.ts +0 -34
  409. package/dest/private/simulator.d.ts.map +0 -1
  410. package/dest/private/simulator.js +0 -76
  411. package/dest/private/unconstrained_execution.d.ts +0 -10
  412. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  413. package/dest/private/unconstrained_execution.js +0 -27
  414. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  415. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  416. package/dest/private/unconstrained_execution_oracle.js +0 -258
  417. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  418. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  419. package/dest/public/avm/bytecode_utils.js +0 -17
  420. package/dest/public/avm/fixtures/index.d.ts +0 -84
  421. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  422. package/dest/public/avm/fixtures/index.js +0 -175
  423. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  424. package/dest/public/avm/journal/index.d.ts +0 -2
  425. package/dest/public/avm/journal/index.d.ts.map +0 -1
  426. package/dest/public/avm/journal/index.js +0 -1
  427. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  428. package/dest/public/avm/journal/journal.js +0 -486
  429. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  430. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  431. package/dest/public/bytecode_errors.d.ts +0 -4
  432. package/dest/public/bytecode_errors.d.ts.map +0 -1
  433. package/dest/public/bytecode_errors.js +0 -6
  434. package/dest/public/execution.d.ts +0 -108
  435. package/dest/public/execution.d.ts.map +0 -1
  436. package/dest/public/execution.js +0 -9
  437. package/dest/test/utils.d.ts +0 -13
  438. package/dest/test/utils.d.ts.map +0 -1
  439. package/dest/test/utils.js +0 -22
  440. package/src/common/db_interfaces.ts +0 -94
  441. package/src/common/message_load_oracle_inputs.ts +0 -15
  442. package/src/private/acvm/oracle/index.ts +0 -16
  443. package/src/private/acvm/oracle/oracle.ts +0 -455
  444. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  445. package/src/private/execution_data_provider.ts +0 -323
  446. package/src/private/execution_note_cache.ts +0 -217
  447. package/src/private/hashed_values_cache.ts +0 -55
  448. package/src/private/index.ts +0 -16
  449. package/src/private/pick_notes.ts +0 -141
  450. package/src/private/private_execution.ts +0 -151
  451. package/src/private/private_execution_oracle.ts +0 -614
  452. package/src/private/providers/acvm_wasm.ts +0 -63
  453. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  454. package/src/private/providers/simulation_provider.ts +0 -45
  455. package/src/private/simulator.ts +0 -147
  456. package/src/private/unconstrained_execution.ts +0 -50
  457. package/src/private/unconstrained_execution_oracle.ts +0 -373
  458. package/src/public/avm/bytecode_utils.ts +0 -17
  459. package/src/public/avm/fixtures/index.ts +0 -296
  460. package/src/public/avm/journal/index.ts +0 -1
  461. package/src/public/avm/journal/journal.ts +0 -742
  462. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  463. package/src/public/bytecode_errors.ts +0 -6
  464. package/src/public/execution.ts +0 -140
  465. package/src/test/utils.ts +0 -36
  466. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -2,24 +2,31 @@ import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/fields';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
- import { type DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
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
10
  import { PublicDataWrite } from '@aztec/stdlib/avm';
10
11
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
11
12
  import type { ContractDataSource } from '@aztec/stdlib/contract';
13
+ import { computeTransactionFee } from '@aztec/stdlib/fees';
12
14
  import { Gas } from '@aztec/stdlib/gas';
13
- import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
15
+ import type {
16
+ MerkleTreeWriteOperations,
17
+ PublicProcessorLimits,
18
+ PublicProcessorValidator,
19
+ SequencerConfig,
20
+ } from '@aztec/stdlib/interfaces/server';
14
21
  import { MerkleTreeId } from '@aztec/stdlib/trees';
15
22
  import {
16
23
  type FailedTx,
17
24
  GlobalVariables,
18
25
  NestedProcessReturnValues,
19
26
  type ProcessedTx,
27
+ StateReference,
20
28
  Tx,
21
29
  TxExecutionPhase,
22
- type TxValidator,
23
30
  makeProcessedTxFromPrivateOnlyTx,
24
31
  makeProcessedTxFromTxWithPublicCalls,
25
32
  } from '@aztec/stdlib/tx';
@@ -33,8 +40,15 @@ import {
33
40
  } from '@aztec/telemetry-client';
34
41
  import { ForkCheckpoint } from '@aztec/world-state/native';
35
42
 
36
- import { WorldStateDB } from '../public_db_sources.js';
37
- import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
43
+ import { AssertionError } from 'assert';
44
+
45
+ import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
46
+ import {
47
+ type PublicTxSimulator,
48
+ type PublicTxSimulatorConfig,
49
+ TelemetryPublicTxSimulator,
50
+ } from '../public_tx_simulator/index.js';
51
+ import { GuardedMerkleTreeOperations } from './guarded_merkle_tree.js';
38
52
  import { PublicProcessorMetrics } from './public_processor_metrics.js';
39
53
 
40
54
  /**
@@ -43,13 +57,12 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
43
57
  export class PublicProcessorFactory {
44
58
  constructor(
45
59
  private contractDataSource: ContractDataSource,
46
- private dateProvider: DateProvider,
47
- private telemetryClient: TelemetryClient = getTelemetryClient(),
60
+ private dateProvider: DateProvider = new DateProvider(),
61
+ protected telemetryClient: TelemetryClient = getTelemetryClient(),
48
62
  ) {}
49
63
 
50
64
  /**
51
65
  * 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
66
  * @param globalVariables - The global variables for the block being processed.
54
67
  * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
55
68
  * @returns A new instance of a PublicProcessor.
@@ -57,22 +70,28 @@ export class PublicProcessorFactory {
57
70
  public create(
58
71
  merkleTree: MerkleTreeWriteOperations,
59
72
  globalVariables: GlobalVariables,
60
- skipFeeEnforcement: boolean,
73
+ config: {
74
+ skipFeeEnforcement: boolean;
75
+ clientInitiatedSimulation: boolean;
76
+ proverId?: Fr;
77
+ maxDebugLogMemoryReads?: number;
78
+ },
61
79
  ): 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
- );
80
+ const contractsDB = new PublicContractsDB(this.contractDataSource);
81
+
82
+ const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
83
+ const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, {
84
+ proverId: config.proverId,
85
+ doMerkleOperations: true,
86
+ skipFeeEnforcement: config.skipFeeEnforcement,
87
+ clientInitiatedSimulation: config.clientInitiatedSimulation,
88
+ maxDebugLogMemoryReads: config.maxDebugLogMemoryReads,
89
+ });
71
90
 
72
91
  return new PublicProcessor(
73
- merkleTree,
74
92
  globalVariables,
75
- worldStateDB,
93
+ guardedFork,
94
+ contractsDB,
76
95
  publicTxSimulator,
77
96
  this.dateProvider,
78
97
  this.telemetryClient,
@@ -80,21 +99,12 @@ export class PublicProcessorFactory {
80
99
  }
81
100
 
82
101
  protected createPublicTxSimulator(
83
- db: MerkleTreeWriteOperations,
84
- worldStateDB: WorldStateDB,
102
+ merkleTree: MerkleTreeWriteOperations,
103
+ contractsDB: PublicContractsDB,
85
104
  globalVariables: GlobalVariables,
86
- doMerkleOperations: boolean,
87
- skipFeeEnforcement: boolean,
88
- telemetryClient: TelemetryClient,
89
- ) {
90
- return new PublicTxSimulator(
91
- db,
92
- worldStateDB,
93
- globalVariables,
94
- doMerkleOperations,
95
- skipFeeEnforcement,
96
- telemetryClient,
97
- );
105
+ config?: Partial<PublicTxSimulatorConfig>,
106
+ ): PublicTxSimulator {
107
+ return new TelemetryPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
98
108
  }
99
109
  }
100
110
 
@@ -111,14 +121,16 @@ class PublicProcessorTimeoutError extends Error {
111
121
  */
112
122
  export class PublicProcessor implements Traceable {
113
123
  private metrics: PublicProcessorMetrics;
124
+
114
125
  constructor(
115
- protected db: MerkleTreeWriteOperations,
116
126
  protected globalVariables: GlobalVariables,
117
- protected worldStateDB: WorldStateDB,
127
+ private guardedMerkleTree: GuardedMerkleTreeOperations,
128
+ protected contractsDB: PublicContractsDB,
118
129
  protected publicTxSimulator: PublicTxSimulator,
119
130
  private dateProvider: DateProvider,
120
131
  telemetryClient: TelemetryClient = getTelemetryClient(),
121
132
  private log = createLogger('simulator:public-processor'),
133
+ private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs'> = {},
122
134
  ) {
123
135
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
124
136
  }
@@ -130,26 +142,19 @@ export class PublicProcessor implements Traceable {
130
142
  /**
131
143
  * Run each tx through the public circuit and the public kernel circuit if needed.
132
144
  * @param txs - Txs to process.
133
- * @param processedTxHandler - Handler for processed txs in the context of block building or proving.
145
+ * @param limits - Limits for processing the txs.
146
+ * @param validator - Pre-process validator and nullifier cache to use for processing the txs.
134
147
  * @returns The list of processed txs with their circuit simulation outputs.
135
148
  */
136
149
  public async process(
137
150
  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;
151
+ limits: PublicProcessorLimits = {},
152
+ validator: PublicProcessorValidator = {},
153
+ ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[]]> {
154
+ const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
155
+ const { preprocessValidator, nullifierCache } = validator;
152
156
  const result: ProcessedTx[] = [];
157
+ const usedTxs: Tx[] = [];
153
158
  const failed: FailedTx[] = [];
154
159
  const timer = new Timer();
155
160
 
@@ -157,6 +162,7 @@ export class PublicProcessor implements Traceable {
157
162
  let returns: NestedProcessReturnValues[] = [];
158
163
  let totalPublicGas = new Gas(0, 0);
159
164
  let totalBlockGas = new Gas(0, 0);
165
+ let totalBlobFields = 0;
160
166
 
161
167
  for await (const origTx of txs) {
162
168
  // Only process up to the max tx limit
@@ -172,7 +178,7 @@ export class PublicProcessor implements Traceable {
172
178
  }
173
179
 
174
180
  // Skip this tx if it'd exceed max block size
175
- const txHash = (await origTx.getTxHash()).toString();
181
+ const txHash = origTx.getTxHash().toString();
176
182
  const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
177
183
  if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
178
184
  this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
@@ -202,16 +208,16 @@ export class PublicProcessor implements Traceable {
202
208
  // We validate the tx before processing it, to avoid unnecessary work.
203
209
  if (preprocessValidator) {
204
210
  const result = await preprocessValidator.validateTx(tx);
205
- const txHash = await tx.getTxHash();
211
+ const txHash = tx.getTxHash();
206
212
  if (result.result === 'invalid') {
207
213
  const reason = result.reason.join(', ');
208
- this.log.warn(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
214
+ this.log.debug(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
209
215
  failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
210
216
  returns.push(new NestedProcessReturnValues([]));
211
217
  continue;
212
218
  } else if (result.result === 'skipped') {
213
219
  const reason = result.reason.join(', ');
214
- this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
220
+ this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
215
221
  returns.push(new NestedProcessReturnValues([]));
216
222
  continue;
217
223
  } else {
@@ -222,7 +228,10 @@ export class PublicProcessor implements Traceable {
222
228
  // We checkpoint the transaction here, then within the try/catch we
223
229
  // 1. Revert the checkpoint if the tx fails or needs to be discarded for any reason
224
230
  // 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);
231
+ // 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.
232
+ // Note: We use the underlying fork here not the guarded one, this ensures that it's not impacted by stopping the guarded version
233
+ const checkpoint = await ForkCheckpoint.new(this.guardedMerkleTree.getUnderlyingFork());
234
+ const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
226
235
 
227
236
  try {
228
237
  const [processedTx, returnValues] = await this.processTx(tx, deadline);
@@ -230,7 +239,7 @@ export class PublicProcessor implements Traceable {
230
239
  // If the actual size of this tx would exceed block size, skip it
231
240
  const txSize = processedTx.txEffect.getDASize();
232
241
  if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
233
- this.log.warn(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
242
+ this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
234
243
  txHash,
235
244
  sizeInBytes: txSize,
236
245
  totalSizeInBytes,
@@ -241,60 +250,76 @@ export class PublicProcessor implements Traceable {
241
250
  continue;
242
251
  }
243
252
 
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();
253
+ // If the actual blob fields of this tx would exceed the limit, skip it
254
+ const txBlobFields = processedTx.txEffect.toBlobFields().length;
255
+ if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
256
+ this.log.debug(
257
+ `Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`,
258
+ {
259
+ txHash,
260
+ txBlobFields,
261
+ totalBlobFields,
262
+ maxBlobFields,
263
+ },
264
+ );
265
+ // Need to revert the checkpoint here and don't go any further
266
+ await checkpoint.revert();
267
+ continue;
272
268
  }
273
269
 
270
+ // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
271
+ // I'd rather pass the validators the processedTx as well and let them deal with it.
274
272
  nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
275
273
  result.push(processedTx);
274
+ usedTxs.push(tx);
276
275
  returns = returns.concat(returnValues);
277
276
 
278
277
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
279
278
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
280
279
  totalSizeInBytes += txSize;
280
+ totalBlobFields += txBlobFields;
281
281
  } catch (err: any) {
282
- // Roll back state to start of TX before proceeding to next TX
283
- await checkpoint.revert();
284
282
  if (err?.name === 'PublicProcessorTimeoutError') {
285
283
  this.log.warn(`Stopping tx processing due to timeout.`);
284
+ // We hit the transaction execution deadline.
285
+ // There may still be a transaction executing. We stop the guarded fork to prevent any further access to the world state.
286
+ await this.guardedMerkleTree.stop();
287
+
288
+ // We now know there can't be any further access to world state. The fork is in a state where there is:
289
+ // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
290
+ // 2. Possible state updates on that checkpoint or any others created during execution.
291
+
292
+ // First we revert a checkpoint as managed by the ForkCheckpoint. This will revert whatever is the current checkpoint
293
+ // which may not be the one originally created by this object. But that is ok, we do this to fulfil the ForkCheckpoint
294
+ // lifecycle expectations and ensure it doesn't attempt to commit later on.
295
+ await checkpoint.revert();
296
+
297
+ // Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
298
+ // This needs to be done directly on the underlying fork as the guarded fork has been stopped.
299
+ await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
300
+
301
+ // Ensure we're at the same state as when we started processing this tx.
302
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
303
+
304
+ // 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
305
  break;
287
306
  }
288
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
289
- this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
290
307
 
308
+ // Roll back state to start of TX before proceeding to next TX
309
+ await checkpoint.revert();
310
+ await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
311
+ const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
312
+ this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
291
313
  failed.push({ tx, error: err instanceof Error ? err : new Error(errorMessage) });
292
314
  returns.push(new NestedProcessReturnValues([]));
315
+
316
+ // Ensure we're at the same state as when we started processing this tx.
317
+ await this.checkWorldStateUnchanged(startStateReference, txHash, err);
293
318
  } finally {
294
- // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was reverted
319
+ // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
295
320
  await checkpoint.commit();
296
321
  // The tx-level contracts cache should not live on to the next tx
297
- this.worldStateDB.clearContractsForTx();
322
+ this.contractsDB.clearContractsForTx();
298
323
  }
299
324
  }
300
325
 
@@ -310,17 +335,33 @@ export class PublicProcessor implements Traceable {
310
335
  totalSizeInBytes,
311
336
  });
312
337
 
313
- return [result, failed, returns];
338
+ return [result, failed, usedTxs, returns];
339
+ }
340
+
341
+ private async checkWorldStateUnchanged(
342
+ startStateReference: StateReference,
343
+ txHash: `0x${string}`,
344
+ cause: Error,
345
+ ): Promise<void> {
346
+ const endStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
347
+ if (!startStateReference.equals(endStateReference)) {
348
+ this.log.warn(`Fork state reference changed by tx ${txHash} after error in public processor`, {
349
+ expected: startStateReference.toInspect(),
350
+ actual: endStateReference.toInspect(),
351
+ cause,
352
+ });
353
+ throw new Error(`Fork state reference changed by tx ${txHash} after error in public processor`, { cause });
354
+ }
314
355
  }
315
356
 
316
- @trackSpan('PublicProcessor.processTx', async tx => ({ [Attributes.TX_HASH]: (await tx.getTxHash()).toString() }))
317
- private async processTx(tx: Tx, deadline?: Date): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
357
+ @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
358
+ private async processTx(tx: Tx, deadline: Date | undefined): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
318
359
  const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline));
319
360
 
320
361
  this.log.verbose(
321
362
  !tx.hasPublicCalls()
322
363
  ? `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`,
364
+ : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`,
324
365
  {
325
366
  txHash: processedTx.hash,
326
367
  txFee: processedTx.txEffect.transactionFee.toBigInt(),
@@ -341,10 +382,7 @@ export class PublicProcessor implements Traceable {
341
382
  return [processedTx, returnValues ?? []];
342
383
  }
343
384
 
344
- private async doTreeInsertionsForPrivateOnlyTx(
345
- processedTx: ProcessedTx,
346
- txValidator?: TxValidator<ProcessedTx>,
347
- ): Promise<void> {
385
+ private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
348
386
  const treeInsertionStart = process.hrtime.bigint();
349
387
 
350
388
  // Update the state so that the next tx in the loop has the correct .startState
@@ -353,31 +391,20 @@ export class PublicProcessor implements Traceable {
353
391
  // 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
392
  // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
355
393
  // The below is taken from buildBaseRollupHints:
356
- await this.db.appendLeaves(
394
+ await this.guardedMerkleTree.appendLeaves(
357
395
  MerkleTreeId.NOTE_HASH_TREE,
358
396
  padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
359
397
  );
360
398
  try {
361
- await this.db.batchInsert(
399
+ await this.guardedMerkleTree.batchInsert(
362
400
  MerkleTreeId.NULLIFIER_TREE,
363
401
  padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()),
364
402
  NULLIFIER_SUBTREE_HEIGHT,
365
403
  );
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
- }
404
+ } catch (cause) {
405
+ throw new Error(`Transaction ${processedTx.hash} failed with duplicate nullifiers`, { cause });
374
406
  }
375
407
 
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
408
  const treeInsertionEnd = process.hrtime.bigint();
382
409
  this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
383
410
  }
@@ -385,17 +412,29 @@ export class PublicProcessor implements Traceable {
385
412
  /** Processes the given tx within deadline. Returns timeout if deadline is hit. */
386
413
  private async processTxWithinDeadline(
387
414
  tx: Tx,
388
- deadline?: Date,
415
+ deadline: Date | undefined,
389
416
  ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> {
390
- const processFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls()
417
+ const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls()
391
418
  ? () => this.processTxWithPublicCalls(tx)
392
419
  : () => this.processPrivateOnlyTx(tx);
393
420
 
421
+ // Fake a delay per tx if instructed (used for tests)
422
+ const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
423
+ const processFn =
424
+ fakeDelayPerTxMs && fakeDelayPerTxMs > 0
425
+ ? async () => {
426
+ const result = await innerProcessFn();
427
+ this.log.warn(`Sleeping ${fakeDelayPerTxMs}ms after processing tx ${tx.getTxHash().toString()}`);
428
+ await sleep(fakeDelayPerTxMs);
429
+ return result;
430
+ }
431
+ : innerProcessFn;
432
+
394
433
  if (!deadline) {
395
434
  return await processFn();
396
435
  }
397
436
 
398
- const txHash = await tx.getTxHash();
437
+ const txHash = tx.getTxHash();
399
438
  const timeout = +deadline - this.dateProvider.now();
400
439
  if (timeout <= 0) {
401
440
  throw new PublicProcessorTimeoutError();
@@ -419,14 +458,16 @@ export class PublicProcessor implements Traceable {
419
458
  * This is used in private only txs, since for txs with public calls
420
459
  * the avm handles the fee payment itself.
421
460
  */
422
- private async getFeePaymentPublicDataWrite(txFee: Fr, feePayer: AztecAddress): Promise<PublicDataWrite> {
461
+ private async performFeePaymentPublicDataWrite(txFee: Fr, feePayer: AztecAddress): Promise<PublicDataWrite> {
423
462
  const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
424
463
  const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
425
464
  const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
465
+ // This high-level db is used as a convenient helper. It could be done with the merkleTree directly.
466
+ const treesDB = new PublicTreesDB(this.guardedMerkleTree);
426
467
 
427
468
  this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
428
469
 
429
- const balance = await this.worldStateDB.storageRead(feeJuiceAddress, balanceSlot);
470
+ const balance = await treesDB.storageRead(feeJuiceAddress, balanceSlot);
430
471
 
431
472
  if (balance.lt(txFee)) {
432
473
  throw new Error(
@@ -435,42 +476,47 @@ export class PublicProcessor implements Traceable {
435
476
  }
436
477
 
437
478
  const updatedBalance = balance.sub(txFee);
438
- await this.worldStateDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
479
+ await treesDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
439
480
 
440
481
  return new PublicDataWrite(leafSlot, updatedBalance);
441
482
  }
442
483
 
443
- @trackSpan('PublicProcessor.processPrivateOnlyTx', async (tx: Tx) => ({
444
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
484
+ @trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
485
+ [Attributes.TX_HASH]: tx.getTxHash().toString(),
445
486
  }))
446
487
  private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
447
488
  const gasFees = this.globalVariables.gasFees;
448
- const transactionFee = tx.data.gasUsed.computeFee(gasFees);
489
+ const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
449
490
 
450
- const feePaymentPublicDataWrite = await this.getFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
491
+ const feePaymentPublicDataWrite = await this.performFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
451
492
 
452
- const processedTx = await makeProcessedTxFromPrivateOnlyTx(
493
+ const processedTx = makeProcessedTxFromPrivateOnlyTx(
453
494
  tx,
454
495
  transactionFee,
455
496
  feePaymentPublicDataWrite,
456
497
  this.globalVariables,
457
498
  );
458
499
 
459
- const siloedContractClassLogs = await tx.filterContractClassLogs(
460
- tx.data.getNonEmptyContractClassLogsHashes(),
461
- true,
500
+ this.metrics.recordClassPublication(
501
+ ...tx
502
+ .getContractClassLogs()
503
+ .filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
504
+ .map(log => ContractClassPublishedEvent.fromLog(log)),
462
505
  );
463
506
 
464
- this.metrics.recordClassRegistration(
465
- ...siloedContractClassLogs
466
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log))
467
- .map(log => ContractClassRegisteredEvent.fromLog(log)),
468
- );
507
+ // Fee payment insertion has already been done. Do the rest.
508
+ await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
509
+
510
+ // Add any contracts registered/deployed in this private-only tx to the block-level cache
511
+ // (add to tx-level cache and then commit to block-level cache)
512
+ await this.contractsDB.addNewContracts(tx);
513
+ this.contractsDB.commitContractsForTx();
514
+
469
515
  return [processedTx, undefined];
470
516
  }
471
517
 
472
- @trackSpan('PublicProcessor.processTxWithPublicCalls', async tx => ({
473
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
518
+ @trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
519
+ [Attributes.TX_HASH]: tx.getTxHash().toString(),
474
520
  }))
475
521
  private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
476
522
  const timer = new Timer();
@@ -487,32 +533,24 @@ export class PublicProcessor implements Traceable {
487
533
  if (phase.reverted) {
488
534
  this.metrics.recordRevertedPhase(phase.phase);
489
535
  } else {
490
- this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
536
+ this.metrics.recordPhaseDuration(phase.phase, phase.durationMs ?? 0);
491
537
  }
492
538
  });
493
539
 
494
- const siloedContractClassLogs = await tx.filterContractClassLogs(
495
- tx.data.getNonEmptyContractClassLogsHashes(),
496
- true,
497
- );
498
-
499
- this.metrics.recordClassRegistration(
500
- ...siloedContractClassLogs
501
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log))
502
- .map(log => ContractClassRegisteredEvent.fromLog(log)),
540
+ const contractClassLogs = revertCode.isOK()
541
+ ? tx.getContractClassLogs()
542
+ : tx.getSplitContractClassLogs(false /* revertible */);
543
+ this.metrics.recordClassPublication(
544
+ ...contractClassLogs
545
+ .filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
546
+ .map(log => ContractClassPublishedEvent.fromLog(log)),
503
547
  );
504
548
 
505
549
  const phaseCount = processedPhases.length;
506
550
  const durationMs = timer.ms();
507
551
  this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
508
552
 
509
- const processedTx = await makeProcessedTxFromTxWithPublicCalls(
510
- tx,
511
- avmProvingRequest,
512
- gasUsed,
513
- revertCode,
514
- revertReason,
515
- );
553
+ const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, avmProvingRequest, gasUsed, revertCode, revertReason);
516
554
 
517
555
  const returnValues = processedPhases.find(({ phase }) => phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
518
556
 
@@ -1,4 +1,4 @@
1
- import type { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer';
1
+ import type { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
2
2
  import type { Gas } from '@aztec/stdlib/gas';
3
3
  import type { TxExecutionPhase } from '@aztec/stdlib/tx';
4
4
  import {
@@ -137,7 +137,7 @@ export class PublicProcessorMetrics {
137
137
  this.phaseCount.add(1, { [Attributes.TX_PHASE_NAME]: phaseName, [Attributes.OK]: false });
138
138
  }
139
139
 
140
- recordClassRegistration(...events: ContractClassRegisteredEvent[]) {
140
+ recordClassPublication(...events: ContractClassPublishedEvent[]) {
141
141
  let totalBytecode = 0;
142
142
  for (const event of events) {
143
143
  totalBytecode += event.packedPublicBytecode.length;