@aztec/simulator 0.0.1-commit.5daedc8 → 0.0.1-commit.6201a7b05

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 (332) hide show
  1. package/README.md +6 -4
  2. package/dest/common/errors.d.ts +8 -2
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.d.ts +4 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +4 -3
  7. package/dest/private/acvm/deserialize.d.ts +2 -2
  8. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  9. package/dest/private/acvm/deserialize.js +1 -1
  10. package/dest/private/acvm/serialize.d.ts +2 -2
  11. package/dest/private/acvm/serialize.d.ts.map +1 -1
  12. package/dest/private/acvm/serialize.js +1 -1
  13. package/dest/private/acvm_native.d.ts +5 -3
  14. package/dest/private/acvm_native.d.ts.map +1 -1
  15. package/dest/private/acvm_native.js +8 -6
  16. package/dest/private/acvm_wasm.d.ts +4 -3
  17. package/dest/private/acvm_wasm.d.ts.map +1 -1
  18. package/dest/private/acvm_wasm.js +4 -4
  19. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  20. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  21. package/dest/private/circuit_recording/circuit_recorder.js +23 -20
  22. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  23. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  24. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  25. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  26. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  27. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  28. package/dest/private/factory.d.ts +3 -3
  29. package/dest/private/factory.d.ts.map +1 -1
  30. package/dest/private/factory.js +7 -4
  31. package/dest/public/avm/avm_context.d.ts +3 -3
  32. package/dest/public/avm/avm_context.d.ts.map +1 -1
  33. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  34. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  35. package/dest/public/avm/avm_contract_call_result.js +3 -3
  36. package/dest/public/avm/avm_execution_environment.d.ts +7 -6
  37. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  38. package/dest/public/avm/avm_execution_environment.js +1 -1
  39. package/dest/public/avm/avm_gas.d.ts +1 -1
  40. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  41. package/dest/public/avm/avm_gas.js +3 -3
  42. package/dest/public/avm/avm_machine_state.d.ts +7 -6
  43. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  44. package/dest/public/avm/avm_machine_state.js +3 -2
  45. package/dest/public/avm/avm_memory_types.d.ts +2 -2
  46. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  47. package/dest/public/avm/avm_memory_types.js +4 -1
  48. package/dest/public/avm/avm_simulator.d.ts +4 -3
  49. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  50. package/dest/public/avm/avm_simulator.js +12 -10
  51. package/dest/public/avm/calldata.d.ts +51 -0
  52. package/dest/public/avm/calldata.d.ts.map +1 -0
  53. package/dest/public/avm/calldata.js +64 -0
  54. package/dest/public/avm/errors.d.ts +8 -2
  55. package/dest/public/avm/errors.d.ts.map +1 -1
  56. package/dest/public/avm/errors.js +14 -2
  57. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  58. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  59. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  60. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  61. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  62. package/dest/public/avm/fixtures/avm_simulation_tester.js +4 -3
  63. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -2
  64. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  65. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +1 -1
  66. package/dest/public/avm/fixtures/initializers.d.ts +2 -2
  67. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  68. package/dest/public/avm/fixtures/initializers.js +5 -4
  69. package/dest/public/avm/fixtures/utils.d.ts +4 -3
  70. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  71. package/dest/public/avm/fixtures/utils.js +3 -2
  72. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  73. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  74. package/dest/public/avm/opcodes/accrued_substate.js +42 -43
  75. package/dest/public/avm/opcodes/addressing_mode.js +2 -2
  76. package/dest/public/avm/opcodes/arithmetic.d.ts +10 -8
  77. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  78. package/dest/public/avm/opcodes/arithmetic.js +12 -2
  79. package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
  80. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  81. package/dest/public/avm/opcodes/bitwise.js +5 -5
  82. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  83. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  84. package/dest/public/avm/opcodes/comparators.js +1 -1
  85. package/dest/public/avm/opcodes/contract.d.ts +3 -3
  86. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  87. package/dest/public/avm/opcodes/contract.js +8 -8
  88. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  89. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  90. package/dest/public/avm/opcodes/control_flow.js +4 -4
  91. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  92. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  93. package/dest/public/avm/opcodes/conversion.js +4 -4
  94. package/dest/public/avm/opcodes/ec_add.d.ts +4 -4
  95. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  96. package/dest/public/avm/opcodes/ec_add.js +17 -8
  97. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  98. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  99. package/dest/public/avm/opcodes/environment_getters.js +6 -6
  100. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  101. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  102. package/dest/public/avm/opcodes/external_calls.js +23 -22
  103. package/dest/public/avm/opcodes/hashing.d.ts +8 -8
  104. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  105. package/dest/public/avm/opcodes/hashing.js +21 -16
  106. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  107. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  108. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  109. package/dest/public/avm/opcodes/memory.d.ts +14 -14
  110. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  111. package/dest/public/avm/opcodes/memory.js +26 -26
  112. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  113. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  114. package/dest/public/avm/opcodes/misc.js +6 -6
  115. package/dest/public/avm/opcodes/storage.d.ts +16 -15
  116. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  117. package/dest/public/avm/opcodes/storage.js +34 -24
  118. package/dest/public/avm/revert_reason.d.ts +2 -2
  119. package/dest/public/avm/revert_reason.d.ts.map +1 -1
  120. package/dest/public/avm/revert_reason.js +3 -2
  121. package/dest/public/avm/serialization/bytecode_serialization.d.ts +1 -1
  122. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  123. package/dest/public/avm/serialization/bytecode_serialization.js +12 -9
  124. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  125. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  126. package/dest/public/avm/serialization/instruction_serialization.js +2 -2
  127. package/dest/public/avm/test_utils.d.ts +2 -2
  128. package/dest/public/avm/test_utils.d.ts.map +1 -1
  129. package/dest/public/avm/test_utils.js +1 -1
  130. package/dest/public/contracts_db_checkpoint.d.ts +3 -3
  131. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -1
  132. package/dest/public/contracts_db_checkpoint.js +1 -1
  133. package/dest/public/db_interfaces.d.ts +2 -2
  134. package/dest/public/db_interfaces.d.ts.map +1 -1
  135. package/dest/public/debug_fn_name.d.ts +16 -3
  136. package/dest/public/debug_fn_name.d.ts.map +1 -1
  137. package/dest/public/debug_fn_name.js +31 -3
  138. package/dest/public/executor_metrics.d.ts +1 -1
  139. package/dest/public/executor_metrics.d.ts.map +1 -1
  140. package/dest/public/executor_metrics.js +12 -33
  141. package/dest/public/fixtures/amm_test.js +4 -4
  142. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  143. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  144. package/dest/public/fixtures/bulk_test.js +9 -73
  145. package/dest/public/fixtures/custom_bytecode_tester.d.ts +28 -6
  146. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  147. package/dest/public/fixtures/custom_bytecode_tester.js +36 -12
  148. package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -8
  149. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  150. package/dest/public/fixtures/custom_bytecode_tests.js +143 -18
  151. package/dest/public/fixtures/index.d.ts +4 -2
  152. package/dest/public/fixtures/index.d.ts.map +1 -1
  153. package/dest/public/fixtures/index.js +3 -1
  154. package/dest/public/fixtures/minimal_public_tx.d.ts +2 -7
  155. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
  156. package/dest/public/fixtures/minimal_public_tx.js +4 -14
  157. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  158. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  159. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  160. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +27 -7
  161. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  162. package/dest/public/fixtures/public_tx_simulation_tester.js +87 -23
  163. package/dest/public/fixtures/simple_contract_data_source.d.ts +5 -4
  164. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
  165. package/dest/public/fixtures/simple_contract_data_source.js +4 -4
  166. package/dest/public/fixtures/token_test.d.ts +6 -2
  167. package/dest/public/fixtures/token_test.d.ts.map +1 -1
  168. package/dest/public/fixtures/token_test.js +13 -11
  169. package/dest/public/fixtures/utils.d.ts +3 -3
  170. package/dest/public/fixtures/utils.d.ts.map +1 -1
  171. package/dest/public/fixtures/utils.js +14 -13
  172. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  173. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  174. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  175. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  176. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  177. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  178. package/dest/public/hinting_db_sources.d.ts +8 -6
  179. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  180. package/dest/public/hinting_db_sources.js +13 -7
  181. package/dest/public/index.d.ts +2 -2
  182. package/dest/public/index.d.ts.map +1 -1
  183. package/dest/public/index.js +1 -1
  184. package/dest/public/public_db_sources.d.ts +7 -6
  185. package/dest/public/public_db_sources.d.ts.map +1 -1
  186. package/dest/public/public_db_sources.js +15 -15
  187. package/dest/public/public_processor/guarded_merkle_tree.d.ts +7 -5
  188. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  189. package/dest/public/public_processor/guarded_merkle_tree.js +9 -4
  190. package/dest/public/public_processor/public_processor.d.ts +11 -7
  191. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  192. package/dest/public/public_processor/public_processor.js +507 -88
  193. package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
  194. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  195. package/dest/public/public_processor/public_processor_metrics.js +36 -45
  196. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -14
  197. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  198. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +22 -56
  199. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +24 -37
  200. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  201. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +65 -144
  202. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  203. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  204. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  205. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  206. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  207. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  208. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  209. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  210. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  211. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  212. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  213. package/dest/public/public_tx_simulator/factories.js +28 -0
  214. package/dest/public/public_tx_simulator/index.d.ts +4 -1
  215. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  216. package/dest/public/public_tx_simulator/index.js +3 -0
  217. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +3 -3
  218. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
  219. package/dest/public/public_tx_simulator/public_tx_context.d.ts +11 -6
  220. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  221. package/dest/public/public_tx_simulator/public_tx_context.js +17 -19
  222. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +13 -7
  223. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  224. package/dest/public/public_tx_simulator/public_tx_simulator.js +37 -21
  225. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +24 -1
  226. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
  227. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +2 -2
  228. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
  229. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  230. package/dest/public/side_effect_trace.d.ts +6 -5
  231. package/dest/public/side_effect_trace.d.ts.map +1 -1
  232. package/dest/public/side_effect_trace.js +4 -4
  233. package/dest/public/side_effect_trace_interface.d.ts +2 -2
  234. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  235. package/dest/public/state_manager/nullifiers.d.ts +2 -2
  236. package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
  237. package/dest/public/state_manager/public_storage.d.ts +2 -2
  238. package/dest/public/state_manager/public_storage.d.ts.map +1 -1
  239. package/dest/public/state_manager/public_storage.js +1 -1
  240. package/dest/public/state_manager/state_manager.d.ts +16 -5
  241. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  242. package/dest/public/state_manager/state_manager.js +19 -9
  243. package/dest/public/test_executor_metrics.d.ts +8 -2
  244. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  245. package/dest/public/test_executor_metrics.js +24 -2
  246. package/package.json +19 -20
  247. package/src/common/errors.ts +1 -1
  248. package/src/private/acvm/acvm.ts +4 -3
  249. package/src/private/acvm/deserialize.ts +1 -1
  250. package/src/private/acvm/serialize.ts +1 -1
  251. package/src/private/acvm_native.ts +11 -5
  252. package/src/private/acvm_wasm.ts +7 -3
  253. package/src/private/circuit_recording/circuit_recorder.ts +24 -21
  254. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  255. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  256. package/src/private/factory.ts +7 -4
  257. package/src/public/avm/avm_context.ts +2 -2
  258. package/src/public/avm/avm_contract_call_result.ts +8 -6
  259. package/src/public/avm/avm_execution_environment.ts +10 -5
  260. package/src/public/avm/avm_gas.ts +5 -5
  261. package/src/public/avm/avm_machine_state.ts +7 -6
  262. package/src/public/avm/avm_memory_types.ts +5 -1
  263. package/src/public/avm/avm_simulator.ts +17 -11
  264. package/src/public/avm/calldata.ts +101 -0
  265. package/src/public/avm/errors.ts +17 -3
  266. package/src/public/avm/fixtures/account_proof.json +553 -0
  267. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  268. package/src/public/avm/fixtures/avm_simulation_tester.ts +9 -3
  269. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +1 -1
  270. package/src/public/avm/fixtures/initializers.ts +5 -4
  271. package/src/public/avm/fixtures/utils.ts +3 -2
  272. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  273. package/src/public/avm/opcodes/addressing_mode.ts +2 -2
  274. package/src/public/avm/opcodes/arithmetic.ts +14 -2
  275. package/src/public/avm/opcodes/bitwise.ts +3 -3
  276. package/src/public/avm/opcodes/comparators.ts +1 -1
  277. package/src/public/avm/opcodes/contract.ts +4 -7
  278. package/src/public/avm/opcodes/control_flow.ts +2 -2
  279. package/src/public/avm/opcodes/conversion.ts +3 -3
  280. package/src/public/avm/opcodes/ec_add.ts +15 -6
  281. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  282. package/src/public/avm/opcodes/external_calls.ts +18 -16
  283. package/src/public/avm/opcodes/hashing.ts +16 -10
  284. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  285. package/src/public/avm/opcodes/memory.ts +20 -20
  286. package/src/public/avm/opcodes/misc.ts +4 -4
  287. package/src/public/avm/opcodes/storage.ts +30 -22
  288. package/src/public/avm/revert_reason.ts +6 -3
  289. package/src/public/avm/serialization/bytecode_serialization.ts +19 -8
  290. package/src/public/avm/serialization/instruction_serialization.ts +2 -2
  291. package/src/public/avm/test_utils.ts +1 -1
  292. package/src/public/contracts_db_checkpoint.ts +2 -2
  293. package/src/public/db_interfaces.ts +1 -1
  294. package/src/public/debug_fn_name.ts +39 -5
  295. package/src/public/executor_metrics.ts +9 -33
  296. package/src/public/fixtures/amm_test.ts +4 -4
  297. package/src/public/fixtures/bulk_test.ts +11 -13
  298. package/src/public/fixtures/custom_bytecode_tester.ts +53 -19
  299. package/src/public/fixtures/custom_bytecode_tests.ts +249 -18
  300. package/src/public/fixtures/index.ts +7 -1
  301. package/src/public/fixtures/minimal_public_tx.ts +6 -15
  302. package/src/public/fixtures/opcode_spammer.ts +1717 -0
  303. package/src/public/fixtures/public_tx_simulation_tester.ts +116 -19
  304. package/src/public/fixtures/simple_contract_data_source.ts +8 -9
  305. package/src/public/fixtures/token_test.ts +18 -9
  306. package/src/public/fixtures/utils.ts +19 -15
  307. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  308. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  309. package/src/public/hinting_db_sources.ts +16 -9
  310. package/src/public/index.ts +7 -1
  311. package/src/public/public_db_sources.ts +28 -20
  312. package/src/public/public_processor/guarded_merkle_tree.ts +11 -6
  313. package/src/public/public_processor/public_processor.ts +153 -91
  314. package/src/public/public_processor/public_processor_metrics.ts +28 -44
  315. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +27 -64
  316. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +82 -178
  317. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  318. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  319. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  320. package/src/public/public_tx_simulator/factories.ts +44 -0
  321. package/src/public/public_tx_simulator/index.ts +3 -0
  322. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +1 -1
  323. package/src/public/public_tx_simulator/public_tx_context.ts +22 -17
  324. package/src/public/public_tx_simulator/public_tx_simulator.ts +56 -26
  325. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +23 -0
  326. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +1 -1
  327. package/src/public/side_effect_trace.ts +6 -3
  328. package/src/public/side_effect_trace_interface.ts +1 -1
  329. package/src/public/state_manager/nullifiers.ts +1 -1
  330. package/src/public/state_manager/public_storage.ts +1 -1
  331. package/src/public/state_manager/state_manager.ts +39 -23
  332. package/src/public/test_executor_metrics.ts +27 -3
@@ -1,29 +1,397 @@
1
- function _ts_decorate(decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1
+ function applyDecs2203RFactory() {
2
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
3
+ return function addInitializer(initializer) {
4
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
5
+ assertCallable(initializer, "An initializer");
6
+ initializers.push(initializer);
7
+ };
8
+ }
9
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
10
+ var kindStr;
11
+ switch(kind){
12
+ case 1:
13
+ kindStr = "accessor";
14
+ break;
15
+ case 2:
16
+ kindStr = "method";
17
+ break;
18
+ case 3:
19
+ kindStr = "getter";
20
+ break;
21
+ case 4:
22
+ kindStr = "setter";
23
+ break;
24
+ default:
25
+ kindStr = "field";
26
+ }
27
+ var ctx = {
28
+ kind: kindStr,
29
+ name: isPrivate ? "#" + name : name,
30
+ static: isStatic,
31
+ private: isPrivate,
32
+ metadata: metadata
33
+ };
34
+ var decoratorFinishedRef = {
35
+ v: false
36
+ };
37
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
38
+ var get, set;
39
+ if (kind === 0) {
40
+ if (isPrivate) {
41
+ get = desc.get;
42
+ set = desc.set;
43
+ } else {
44
+ get = function() {
45
+ return this[name];
46
+ };
47
+ set = function(v) {
48
+ this[name] = v;
49
+ };
50
+ }
51
+ } else if (kind === 2) {
52
+ get = function() {
53
+ return desc.value;
54
+ };
55
+ } else {
56
+ if (kind === 1 || kind === 3) {
57
+ get = function() {
58
+ return desc.get.call(this);
59
+ };
60
+ }
61
+ if (kind === 1 || kind === 4) {
62
+ set = function(v) {
63
+ desc.set.call(this, v);
64
+ };
65
+ }
66
+ }
67
+ ctx.access = get && set ? {
68
+ get: get,
69
+ set: set
70
+ } : get ? {
71
+ get: get
72
+ } : {
73
+ set: set
74
+ };
75
+ try {
76
+ return dec(value, ctx);
77
+ } finally{
78
+ decoratorFinishedRef.v = true;
79
+ }
80
+ }
81
+ function assertNotFinished(decoratorFinishedRef, fnName) {
82
+ if (decoratorFinishedRef.v) {
83
+ throw new Error("attempted to call " + fnName + " after decoration was finished");
84
+ }
85
+ }
86
+ function assertCallable(fn, hint) {
87
+ if (typeof fn !== "function") {
88
+ throw new TypeError(hint + " must be a function");
89
+ }
90
+ }
91
+ function assertValidReturnValue(kind, value) {
92
+ var type = typeof value;
93
+ if (kind === 1) {
94
+ if (type !== "object" || value === null) {
95
+ throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
96
+ }
97
+ if (value.get !== undefined) {
98
+ assertCallable(value.get, "accessor.get");
99
+ }
100
+ if (value.set !== undefined) {
101
+ assertCallable(value.set, "accessor.set");
102
+ }
103
+ if (value.init !== undefined) {
104
+ assertCallable(value.init, "accessor.init");
105
+ }
106
+ } else if (type !== "function") {
107
+ var hint;
108
+ if (kind === 0) {
109
+ hint = "field";
110
+ } else if (kind === 10) {
111
+ hint = "class";
112
+ } else {
113
+ hint = "method";
114
+ }
115
+ throw new TypeError(hint + " decorators must return a function or void 0");
116
+ }
117
+ }
118
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
119
+ var decs = decInfo[0];
120
+ var desc, init, value;
121
+ if (isPrivate) {
122
+ if (kind === 0 || kind === 1) {
123
+ desc = {
124
+ get: decInfo[3],
125
+ set: decInfo[4]
126
+ };
127
+ } else if (kind === 3) {
128
+ desc = {
129
+ get: decInfo[3]
130
+ };
131
+ } else if (kind === 4) {
132
+ desc = {
133
+ set: decInfo[3]
134
+ };
135
+ } else {
136
+ desc = {
137
+ value: decInfo[3]
138
+ };
139
+ }
140
+ } else if (kind !== 0) {
141
+ desc = Object.getOwnPropertyDescriptor(base, name);
142
+ }
143
+ if (kind === 1) {
144
+ value = {
145
+ get: desc.get,
146
+ set: desc.set
147
+ };
148
+ } else if (kind === 2) {
149
+ value = desc.value;
150
+ } else if (kind === 3) {
151
+ value = desc.get;
152
+ } else if (kind === 4) {
153
+ value = desc.set;
154
+ }
155
+ var newValue, get, set;
156
+ if (typeof decs === "function") {
157
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
158
+ if (newValue !== void 0) {
159
+ assertValidReturnValue(kind, newValue);
160
+ if (kind === 0) {
161
+ init = newValue;
162
+ } else if (kind === 1) {
163
+ init = newValue.init;
164
+ get = newValue.get || value.get;
165
+ set = newValue.set || value.set;
166
+ value = {
167
+ get: get,
168
+ set: set
169
+ };
170
+ } else {
171
+ value = newValue;
172
+ }
173
+ }
174
+ } else {
175
+ for(var i = decs.length - 1; i >= 0; i--){
176
+ var dec = decs[i];
177
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
178
+ if (newValue !== void 0) {
179
+ assertValidReturnValue(kind, newValue);
180
+ var newInit;
181
+ if (kind === 0) {
182
+ newInit = newValue;
183
+ } else if (kind === 1) {
184
+ newInit = newValue.init;
185
+ get = newValue.get || value.get;
186
+ set = newValue.set || value.set;
187
+ value = {
188
+ get: get,
189
+ set: set
190
+ };
191
+ } else {
192
+ value = newValue;
193
+ }
194
+ if (newInit !== void 0) {
195
+ if (init === void 0) {
196
+ init = newInit;
197
+ } else if (typeof init === "function") {
198
+ init = [
199
+ init,
200
+ newInit
201
+ ];
202
+ } else {
203
+ init.push(newInit);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ if (kind === 0 || kind === 1) {
210
+ if (init === void 0) {
211
+ init = function(instance, init) {
212
+ return init;
213
+ };
214
+ } else if (typeof init !== "function") {
215
+ var ownInitializers = init;
216
+ init = function(instance, init) {
217
+ var value = init;
218
+ for(var i = 0; i < ownInitializers.length; i++){
219
+ value = ownInitializers[i].call(instance, value);
220
+ }
221
+ return value;
222
+ };
223
+ } else {
224
+ var originalInitializer = init;
225
+ init = function(instance, init) {
226
+ return originalInitializer.call(instance, init);
227
+ };
228
+ }
229
+ ret.push(init);
230
+ }
231
+ if (kind !== 0) {
232
+ if (kind === 1) {
233
+ desc.get = value.get;
234
+ desc.set = value.set;
235
+ } else if (kind === 2) {
236
+ desc.value = value;
237
+ } else if (kind === 3) {
238
+ desc.get = value;
239
+ } else if (kind === 4) {
240
+ desc.set = value;
241
+ }
242
+ if (isPrivate) {
243
+ if (kind === 1) {
244
+ ret.push(function(instance, args) {
245
+ return value.get.call(instance, args);
246
+ });
247
+ ret.push(function(instance, args) {
248
+ return value.set.call(instance, args);
249
+ });
250
+ } else if (kind === 2) {
251
+ ret.push(value);
252
+ } else {
253
+ ret.push(function(instance, args) {
254
+ return value.call(instance, args);
255
+ });
256
+ }
257
+ } else {
258
+ Object.defineProperty(base, name, desc);
259
+ }
260
+ }
261
+ }
262
+ function applyMemberDecs(Class, decInfos, metadata) {
263
+ var ret = [];
264
+ var protoInitializers;
265
+ var staticInitializers;
266
+ var existingProtoNonFields = new Map();
267
+ var existingStaticNonFields = new Map();
268
+ for(var i = 0; i < decInfos.length; i++){
269
+ var decInfo = decInfos[i];
270
+ if (!Array.isArray(decInfo)) continue;
271
+ var kind = decInfo[1];
272
+ var name = decInfo[2];
273
+ var isPrivate = decInfo.length > 3;
274
+ var isStatic = kind >= 5;
275
+ var base;
276
+ var initializers;
277
+ if (isStatic) {
278
+ base = Class;
279
+ kind = kind - 5;
280
+ staticInitializers = staticInitializers || [];
281
+ initializers = staticInitializers;
282
+ } else {
283
+ base = Class.prototype;
284
+ protoInitializers = protoInitializers || [];
285
+ initializers = protoInitializers;
286
+ }
287
+ if (kind !== 0 && !isPrivate) {
288
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
289
+ var existingKind = existingNonFields.get(name) || 0;
290
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
291
+ throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
292
+ } else if (!existingKind && kind > 2) {
293
+ existingNonFields.set(name, kind);
294
+ } else {
295
+ existingNonFields.set(name, true);
296
+ }
297
+ }
298
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
299
+ }
300
+ pushInitializers(ret, protoInitializers);
301
+ pushInitializers(ret, staticInitializers);
302
+ return ret;
303
+ }
304
+ function pushInitializers(ret, initializers) {
305
+ if (initializers) {
306
+ ret.push(function(instance) {
307
+ for(var i = 0; i < initializers.length; i++){
308
+ initializers[i].call(instance);
309
+ }
310
+ return instance;
311
+ });
312
+ }
313
+ }
314
+ function applyClassDecs(targetClass, classDecs, metadata) {
315
+ if (classDecs.length > 0) {
316
+ var initializers = [];
317
+ var newClass = targetClass;
318
+ var name = targetClass.name;
319
+ for(var i = classDecs.length - 1; i >= 0; i--){
320
+ var decoratorFinishedRef = {
321
+ v: false
322
+ };
323
+ try {
324
+ var nextNewClass = classDecs[i](newClass, {
325
+ kind: "class",
326
+ name: name,
327
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
328
+ metadata
329
+ });
330
+ } finally{
331
+ decoratorFinishedRef.v = true;
332
+ }
333
+ if (nextNewClass !== undefined) {
334
+ assertValidReturnValue(10, nextNewClass);
335
+ newClass = nextNewClass;
336
+ }
337
+ }
338
+ return [
339
+ defineMetadata(newClass, metadata),
340
+ function() {
341
+ for(var i = 0; i < initializers.length; i++){
342
+ initializers[i].call(newClass);
343
+ }
344
+ }
345
+ ];
346
+ }
347
+ }
348
+ function defineMetadata(Class, metadata) {
349
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
350
+ configurable: true,
351
+ enumerable: true,
352
+ value: metadata
353
+ });
354
+ }
355
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
356
+ if (parentClass !== void 0) {
357
+ var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
358
+ }
359
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
360
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
361
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
362
+ return {
363
+ e: e,
364
+ get c () {
365
+ return applyClassDecs(targetClass, classDecs, metadata);
366
+ }
367
+ };
368
+ };
369
+ }
370
+ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
+ return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
6
372
  }
373
+ var _dec, _dec1, _dec2, _initProto;
7
374
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
8
375
  import { padArrayEnd } from '@aztec/foundation/collection';
9
- import { Fr } from '@aztec/foundation/fields';
376
+ import { Fr } from '@aztec/foundation/curves/bn254';
10
377
  import { createLogger } from '@aztec/foundation/log';
11
378
  import { sleep } from '@aztec/foundation/sleep';
12
379
  import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
13
380
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
14
381
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
15
382
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
16
- import { AvmCircuitInputs, PublicDataWrite } from '@aztec/stdlib/avm';
383
+ import { AvmCircuitInputs, AvmExecutionHints, PublicDataWrite } from '@aztec/stdlib/avm';
17
384
  import { computeTransactionFee } from '@aztec/stdlib/fees';
18
385
  import { Gas } from '@aztec/stdlib/gas';
386
+ import { NullDebugLogStore } from '@aztec/stdlib/logs';
19
387
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
20
388
  import { MerkleTreeId } from '@aztec/stdlib/trees';
21
- import { NestedProcessReturnValues, Tx, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
389
+ import { NestedProcessReturnValues, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
22
390
  import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
23
391
  import { ForkCheckpoint } from '@aztec/world-state/native';
24
392
  import { AssertionError } from 'assert';
25
393
  import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
26
- import { TelemetryPublicTxSimulator } from '../public_tx_simulator/index.js';
394
+ import { TelemetryCppPublicTxSimulator } from '../public_tx_simulator/index.js';
27
395
  import { GuardedMerkleTreeOperations } from './guarded_merkle_tree.js';
28
396
  import { PublicProcessorMetrics } from './public_processor_metrics.js';
29
397
  /**
@@ -32,10 +400,12 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
32
400
  contractDataSource;
33
401
  dateProvider;
34
402
  telemetryClient;
35
- constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient()){
403
+ log;
404
+ constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), bindings){
36
405
  this.contractDataSource = contractDataSource;
37
406
  this.dateProvider = dateProvider;
38
407
  this.telemetryClient = telemetryClient;
408
+ this.log = createLogger('simulator:public-processor-factory', bindings);
39
409
  }
40
410
  /**
41
411
  * Creates a new instance of a PublicProcessor.
@@ -43,13 +413,14 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
43
413
  * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
44
414
  * @returns A new instance of a PublicProcessor.
45
415
  */ create(merkleTree, globalVariables, config) {
46
- const contractsDB = new PublicContractsDB(this.contractDataSource);
416
+ const bindings = this.log.getBindings();
417
+ const contractsDB = new PublicContractsDB(this.contractDataSource, bindings);
47
418
  const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
48
419
  const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
49
- return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
420
+ return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient, createLogger('simulator:public-processor', bindings));
50
421
  }
51
422
  createPublicTxSimulator(merkleTree, contractsDB, globalVariables, config) {
52
- return new TelemetryPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
423
+ return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config, this.log.getBindings());
53
424
  }
54
425
  }
55
426
  class PublicProcessorTimeoutError extends Error {
@@ -58,6 +429,13 @@ class PublicProcessorTimeoutError extends Error {
58
429
  this.name = 'PublicProcessorTimeoutError';
59
430
  }
60
431
  }
432
+ _dec = trackSpan('PublicProcessor.processTx', (tx)=>({
433
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
434
+ })), _dec1 = trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
435
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
436
+ })), _dec2 = trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
437
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
438
+ }));
61
439
  /**
62
440
  * Converts Txs lifted from the P2P module into ProcessedTx objects by executing
63
441
  * any public function calls in them. Txs with private calls only are unaffected.
@@ -69,8 +447,28 @@ class PublicProcessorTimeoutError extends Error {
69
447
  dateProvider;
70
448
  log;
71
449
  opts;
450
+ debugLogStore;
451
+ static{
452
+ ({ e: [_initProto] } = _apply_decs_2203_r(this, [
453
+ [
454
+ _dec,
455
+ 2,
456
+ "processTx"
457
+ ],
458
+ [
459
+ _dec1,
460
+ 2,
461
+ "processPrivateOnlyTx"
462
+ ],
463
+ [
464
+ _dec2,
465
+ 2,
466
+ "processTxWithPublicCalls"
467
+ ]
468
+ ], []));
469
+ }
72
470
  metrics;
73
- constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor'), opts = {}){
471
+ constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log, opts = {}, debugLogStore = new NullDebugLogStore()){
74
472
  this.globalVariables = globalVariables;
75
473
  this.guardedMerkleTree = guardedMerkleTree;
76
474
  this.contractsDB = contractsDB;
@@ -78,6 +476,8 @@ class PublicProcessorTimeoutError extends Error {
78
476
  this.dateProvider = dateProvider;
79
477
  this.log = log;
80
478
  this.opts = opts;
479
+ this.debugLogStore = debugLogStore;
480
+ _initProto(this);
81
481
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
82
482
  }
83
483
  get tracer() {
@@ -90,18 +490,21 @@ class PublicProcessorTimeoutError extends Error {
90
490
  * @param validator - Pre-process validator and nullifier cache to use for processing the txs.
91
491
  * @returns The list of processed txs with their circuit simulation outputs.
92
492
  */ async process(txs, limits = {}, validator = {}) {
93
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
493
+ const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal } = limits;
94
494
  const { preprocessValidator, nullifierCache } = validator;
95
495
  const result = [];
96
496
  const usedTxs = [];
97
497
  const failed = [];
498
+ const debugLogs = [];
98
499
  const timer = new Timer();
99
500
  let totalSizeInBytes = 0;
100
501
  let returns = [];
101
502
  let totalPublicGas = new Gas(0, 0);
102
503
  let totalBlockGas = new Gas(0, 0);
103
504
  let totalBlobFields = 0;
104
- for await (const origTx of txs){
505
+ let silentlySkippedCount = 0;
506
+ let totalSilentlySkippedDurationMs = 0;
507
+ for await (const tx of txs){
105
508
  // Only process up to the max tx limit
106
509
  if (maxTransactions !== undefined && result.length >= maxTransactions) {
107
510
  this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
@@ -112,21 +515,23 @@ class PublicProcessorTimeoutError extends Error {
112
515
  this.log.warn(`Stopping tx processing due to timeout.`);
113
516
  break;
114
517
  }
115
- // Skip this tx if it'd exceed max block size
116
- const txHash = origTx.getTxHash().toString();
117
- const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
118
- if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
119
- this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
518
+ const txHash = tx.getTxHash().toString();
519
+ // Skip this tx if its estimated blob fields would exceed the limit.
520
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
521
+ const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
522
+ if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
523
+ this.log.warn(`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`, {
120
524
  txHash,
121
- sizeInBytes: preTxSizeInBytes,
122
- totalSizeInBytes,
123
- maxBlockSize
525
+ txBlobFields,
526
+ totalBlobFields,
527
+ maxBlobFields
124
528
  });
125
529
  continue;
126
530
  }
127
- // Skip this tx if its gas limit would exceed the block gas limit
128
- const txGasLimit = origTx.data.constants.txContext.gasSettings.gasLimits;
129
- if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
531
+ // Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
532
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
533
+ const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
534
+ if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
130
535
  this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
131
536
  txHash,
132
537
  txGasLimit,
@@ -135,8 +540,6 @@ class PublicProcessorTimeoutError extends Error {
135
540
  });
136
541
  continue;
137
542
  }
138
- // The processor modifies the tx objects in place, so we need to clone them.
139
- const tx = Tx.clone(origTx);
140
543
  // We validate the tx before processing it, to avoid unnecessary work.
141
544
  if (preprocessValidator) {
142
545
  const result = await preprocessValidator.validateTx(tx);
@@ -168,34 +571,45 @@ class PublicProcessorTimeoutError extends Error {
168
571
  const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
169
572
  this.contractsDB.createCheckpoint();
170
573
  try {
171
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
574
+ const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(()=>this.processTx(tx, deadline));
575
+ // Inject a fake processing failure after N txs if requested
576
+ const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
577
+ if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
578
+ throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
579
+ }
172
580
  const txBlobFields = processedTx.txEffect.getNumBlobFields();
173
- // If the actual size of this tx would exceed block size, skip it
174
581
  const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
175
- if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
176
- this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
582
+ // If the actual blob fields of this tx would exceed the limit, skip it.
583
+ // Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
584
+ if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
585
+ this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
177
586
  txHash,
178
- sizeInBytes: txSize,
179
- totalSizeInBytes,
180
- maxBlockSize
587
+ txBlobFields,
588
+ totalBlobFields,
589
+ maxBlobFields,
590
+ txProcessingTimeMs
181
591
  });
592
+ silentlySkippedCount += 1;
593
+ totalSilentlySkippedDurationMs += txProcessingTimeMs;
594
+ this.metrics.recordSilentlySkipped(txProcessingTimeMs);
182
595
  // Need to revert the checkpoint here and don't go any further
183
596
  await checkpoint.revert();
184
597
  this.contractsDB.revertCheckpoint();
185
598
  continue;
186
599
  }
187
- // If the actual blob fields of this tx would exceed the limit, skip it
188
- if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
189
- this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
600
+ // During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
601
+ // Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
602
+ // this uses actual gas and stops processing when the limit is exceeded.
603
+ if (!isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)) {
604
+ this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
190
605
  txHash,
191
- txBlobFields,
192
- totalBlobFields,
193
- maxBlobFields
606
+ txGas: processedTx.gasUsed.totalGas,
607
+ totalBlockGas,
608
+ maxBlockGas
194
609
  });
195
- // Need to revert the checkpoint here and don't go any further
196
610
  await checkpoint.revert();
197
611
  this.contractsDB.revertCheckpoint();
198
- continue;
612
+ break;
199
613
  }
200
614
  // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
201
615
  // I'd rather pass the validators the processedTx as well and let them deal with it.
@@ -203,35 +617,43 @@ class PublicProcessorTimeoutError extends Error {
203
617
  result.push(processedTx);
204
618
  usedTxs.push(tx);
205
619
  returns = returns.concat(returnValues);
620
+ debugLogs.push(...txDebugLogs);
621
+ this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
206
622
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
207
623
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
208
624
  totalSizeInBytes += txSize;
209
625
  totalBlobFields += txBlobFields;
626
+ // Commit the tx-level contracts checkpoint on success
627
+ this.contractsDB.commitCheckpoint();
210
628
  } catch (err) {
211
629
  if (err?.name === 'PublicProcessorTimeoutError') {
212
630
  this.log.warn(`Stopping tx processing due to timeout.`);
213
631
  // We hit the transaction execution deadline.
214
- // There may still be a transaction executing. We stop the guarded fork to prevent any further access to the world state.
632
+ // There may still be a transaction executing on a worker thread (C++ via NAPI).
633
+ // Signal cancellation AND WAIT for the simulation to actually stop.
634
+ // This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
635
+ // and won't check the cancellation flag until that operation completes.
636
+ // Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
637
+ // Wait for C++ to stop gracefully.
638
+ await this.publicTxSimulator.cancel?.();
639
+ // Now stop the guarded fork to prevent any further TS-side access to the world state.
215
640
  await this.guardedMerkleTree.stop();
216
641
  // We now know there can't be any further access to world state. The fork is in a state where there is:
217
642
  // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
218
643
  // 2. Possible state updates on that checkpoint or any others created during execution.
219
- // First we revert a checkpoint as managed by the ForkCheckpoint. This will revert whatever is the current checkpoint
220
- // which may not be the one originally created by this object. But that is ok, we do this to fulfil the ForkCheckpoint
221
- // lifecycle expectations and ensure it doesn't attempt to commit later on.
222
- await checkpoint.revert();
223
- // Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
224
- // This needs to be done directly on the underlying fork as the guarded fork has been stopped.
225
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
644
+ // Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
645
+ // updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
646
+ // created by callers below our depth.
647
+ await checkpoint.revertToCheckpoint();
226
648
  // Revert any contracts added to the DB for the tx.
227
649
  this.contractsDB.revertCheckpoint();
228
650
  // Ensure we're at the same state as when we started processing this tx.
229
651
  await this.checkWorldStateUnchanged(startStateReference, txHash, err);
230
652
  break;
231
653
  }
232
- // Roll back state to start of TX before proceeding to next TX
233
- await checkpoint.revert();
234
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
654
+ // Roll back state to start of TX before proceeding to next TX.
655
+ // Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
656
+ await checkpoint.revertToCheckpoint();
235
657
  this.contractsDB.revertCheckpoint();
236
658
  const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
237
659
  this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
@@ -245,24 +667,30 @@ class PublicProcessorTimeoutError extends Error {
245
667
  } finally{
246
668
  // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
247
669
  await checkpoint.commit();
248
- this.contractsDB.commitCheckpointOkIfNone();
249
670
  }
250
671
  }
251
672
  const duration = timer.s();
252
673
  const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
253
674
  this.metrics.recordAllTxs(totalPublicGas, rate);
254
- this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs in ${duration}s`, {
675
+ const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
676
+ this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs ` + `(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` + `in ${duration}s`, {
677
+ blockNumber: this.globalVariables.blockNumber,
678
+ successfulCount: result.length,
679
+ failedCount: failed.length,
255
680
  duration,
256
681
  rate,
257
682
  totalPublicGas,
258
683
  totalBlockGas,
259
- totalSizeInBytes
684
+ totalSizeInBytes,
685
+ silentlySkippedCount,
686
+ silentlySkippedDurationMs
260
687
  });
261
688
  return [
262
689
  result,
263
690
  failed,
264
691
  usedTxs,
265
- returns
692
+ returns,
693
+ debugLogs
266
694
  ];
267
695
  }
268
696
  async checkWorldStateUnchanged(startStateReference, txHash, cause) {
@@ -279,7 +707,7 @@ class PublicProcessorTimeoutError extends Error {
279
707
  }
280
708
  }
281
709
  async processTx(tx, deadline) {
282
- const [time, [processedTx, returnValues]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
710
+ const [time, [processedTx, returnValues, debugLogs]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
283
711
  this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`, {
284
712
  txHash: processedTx.hash,
285
713
  txFee: processedTx.txEffect.transactionFee.toBigInt(),
@@ -297,7 +725,8 @@ class PublicProcessorTimeoutError extends Error {
297
725
  });
298
726
  return [
299
727
  processedTx,
300
- returnValues ?? []
728
+ returnValues ?? [],
729
+ debugLogs
301
730
  ];
302
731
  }
303
732
  async doTreeInsertionsForPrivateOnlyTx(processedTx) {
@@ -371,52 +800,42 @@ class PublicProcessorTimeoutError extends Error {
371
800
  this.metrics.recordClassPublication(...tx.getContractClassLogs().filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
372
801
  // Fee payment insertion has already been done. Do the rest.
373
802
  await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
374
- await this.contractsDB.addNewContracts(tx);
803
+ this.contractsDB.addNewContracts(tx);
375
804
  return [
376
805
  processedTx,
377
- undefined
806
+ undefined,
807
+ []
378
808
  ];
379
809
  }
380
810
  async processTxWithPublicCalls(tx) {
381
811
  const timer = new Timer();
382
- const { hints, publicInputs, gasUsed, revertCode, revertReason, appLogicReturnValues } = await this.publicTxSimulator.simulate(tx);
383
- if (!hints) {
384
- this.metrics.recordFailedTx();
385
- throw new Error('Avm proving result was not generated.');
386
- }
812
+ const result = await this.publicTxSimulator.simulate(tx);
813
+ // TODO: use the callStackMetadata here to extract more data about public execution
814
+ const { hints, publicInputs, publicTxEffect, gasUsed, revertCode/*callStackMetadata*/ } = result;
387
815
  const contractClassLogs = revertCode.isOK() ? tx.getContractClassLogs() : tx.getSplitContractClassLogs(false);
388
816
  this.metrics.recordClassPublication(...contractClassLogs.filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
389
817
  // TODO(fcarreiro): remove phase count metric.
390
- const phaseCount = 1;
391
818
  const durationMs = timer.ms();
392
- this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
393
- const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, PublicProcessor.generateProvingRequest(publicInputs, hints), gasUsed, revertCode, revertReason);
819
+ this.metrics.recordTx(/*phaseCount=*/ 1, durationMs, gasUsed.publicGas);
820
+ // Extract the return values from the call stack metadata.
821
+ const appLogicReturnValues = result.getAppLogicReturnValues();
822
+ // Extract the revert reason from the call stack metadata.
823
+ const revertReason = result.findRevertReason();
824
+ // Create proving request if we have hints and public inputs.
825
+ const avmProvingRequest = hints && publicInputs ? PublicProcessor.generateProvingRequest(publicInputs, hints) : undefined;
826
+ const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, this.globalVariables, avmProvingRequest, publicTxEffect, gasUsed, revertCode, revertReason);
394
827
  return [
395
828
  processedTx,
396
- appLogicReturnValues ?? []
829
+ appLogicReturnValues,
830
+ result.logs ?? []
397
831
  ];
398
832
  }
399
833
  /**
400
834
  * Generate the proving request for the AVM circuit.
401
- */ static generateProvingRequest(publicInputs, hints) {
835
+ */ static generateProvingRequest(publicInputs, hints = AvmExecutionHints.empty()) {
402
836
  return {
403
837
  type: ProvingRequestType.PUBLIC_VM,
404
838
  inputs: new AvmCircuitInputs(hints, publicInputs)
405
839
  };
406
840
  }
407
841
  }
408
- _ts_decorate([
409
- trackSpan('PublicProcessor.processTx', (tx)=>({
410
- [Attributes.TX_HASH]: tx.getTxHash().toString()
411
- }))
412
- ], PublicProcessor.prototype, "processTx", null);
413
- _ts_decorate([
414
- trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
415
- [Attributes.TX_HASH]: tx.getTxHash().toString()
416
- }))
417
- ], PublicProcessor.prototype, "processPrivateOnlyTx", null);
418
- _ts_decorate([
419
- trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
420
- [Attributes.TX_HASH]: tx.getTxHash().toString()
421
- }))
422
- ], PublicProcessor.prototype, "processTxWithPublicCalls", null);