@aztec/simulator 0.0.0-test.0 → 0.0.1-commit.023c3e5

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 (528) hide show
  1. package/README.md +8 -0
  2. package/dest/client.d.ts +6 -4
  3. package/dest/client.d.ts.map +1 -1
  4. package/dest/client.js +4 -2
  5. package/dest/common/errors.d.ts +6 -9
  6. package/dest/common/errors.d.ts.map +1 -1
  7. package/dest/common/errors.js +51 -32
  8. package/dest/common/index.d.ts +1 -2
  9. package/dest/common/index.d.ts.map +1 -1
  10. package/dest/common/index.js +0 -1
  11. package/dest/common/stats/index.d.ts +1 -1
  12. package/dest/common/stats/stats.d.ts +1 -1
  13. package/dest/private/acvm/acvm.d.ts +15 -7
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +14 -19
  16. package/dest/private/acvm/acvm_types.d.ts +2 -2
  17. package/dest/private/acvm/acvm_types.d.ts.map +1 -1
  18. package/dest/private/acvm/deserialize.d.ts +19 -20
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +32 -24
  21. package/dest/private/acvm/index.d.ts +1 -2
  22. package/dest/private/acvm/index.d.ts.map +1 -1
  23. package/dest/private/acvm/index.js +0 -1
  24. package/dest/private/acvm/serialize.d.ts +21 -4
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +54 -1
  27. package/dest/private/acvm_native.d.ts +41 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +34 -26
  30. package/dest/private/acvm_wasm.d.ts +16 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/acvm_wasm.js +65 -0
  33. package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
  34. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
  35. package/dest/private/acvm_wasm_with_blobs.js +35 -0
  36. package/dest/private/circuit_recording/circuit_recorder.d.ts +109 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +212 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +32 -0
  40. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  41. package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
  42. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +10 -0
  43. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  44. package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
  45. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
  46. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
  47. package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
  48. package/dest/private/circuit_simulator.d.ts +35 -0
  49. package/dest/private/circuit_simulator.d.ts.map +1 -0
  50. package/dest/private/circuit_simulator.js +43 -0
  51. package/dest/private/factory.d.ts +12 -0
  52. package/dest/private/factory.d.ts.map +1 -0
  53. package/dest/private/{providers/factory.js → factory.js} +8 -5
  54. package/dest/public/avm/avm_context.d.ts +8 -8
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +8 -6
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +12 -8
  59. package/dest/public/avm/avm_execution_environment.d.ts +9 -6
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +5 -3
  62. package/dest/public/avm/avm_gas.d.ts +5 -21
  63. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  64. package/dest/public/avm/avm_gas.js +27 -35
  65. package/dest/public/avm/avm_machine_state.d.ts +9 -6
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +5 -2
  68. package/dest/public/avm/avm_memory_types.d.ts +100 -89
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +21 -7
  71. package/dest/public/avm/avm_simulator.d.ts +8 -7
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +32 -42
  74. package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
  75. package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
  76. package/dest/public/avm/avm_simulator_interface.js +3 -0
  77. package/dest/public/avm/calldata.d.ts +51 -0
  78. package/dest/public/avm/calldata.d.ts.map +1 -0
  79. package/dest/public/avm/calldata.js +63 -0
  80. package/dest/public/avm/errors.d.ts +11 -29
  81. package/dest/public/avm/errors.d.ts.map +1 -1
  82. package/dest/public/avm/errors.js +19 -57
  83. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  84. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/avm_simulation_tester.js +26 -18
  86. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  87. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  88. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  89. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  90. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/initializers.js +45 -0
  92. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  93. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  94. package/dest/public/avm/fixtures/utils.js +96 -0
  95. package/dest/public/avm/index.d.ts +1 -3
  96. package/dest/public/avm/index.d.ts.map +1 -1
  97. package/dest/public/avm/index.js +0 -2
  98. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  99. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/accrued_substate.js +58 -55
  101. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  102. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  104. package/dest/public/avm/opcodes/arithmetic.d.ts +14 -2
  105. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  107. package/dest/public/avm/opcodes/bitwise.d.ts +8 -16
  108. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/bitwise.js +22 -29
  110. package/dest/public/avm/opcodes/comparators.d.ts +1 -1
  111. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/comparators.js +3 -3
  113. package/dest/public/avm/opcodes/contract.d.ts +3 -4
  114. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/contract.js +11 -12
  116. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  117. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/control_flow.js +13 -11
  119. package/dest/public/avm/opcodes/conversion.d.ts +4 -3
  120. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/conversion.js +270 -6
  122. package/dest/public/avm/opcodes/ec_add.d.ts +3 -3
  123. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/ec_add.js +21 -12
  125. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  126. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/environment_getters.js +20 -22
  128. package/dest/public/avm/opcodes/external_calls.d.ts +14 -13
  129. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/external_calls.js +52 -46
  131. package/dest/public/avm/opcodes/hashing.d.ts +7 -7
  132. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  133. package/dest/public/avm/opcodes/hashing.js +24 -19
  134. package/dest/public/avm/opcodes/index.d.ts +1 -1
  135. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  136. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/instruction.js +23 -19
  138. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  139. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  140. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  141. package/dest/public/avm/opcodes/memory.d.ts +15 -15
  142. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  143. package/dest/public/avm/opcodes/memory.js +52 -48
  144. package/dest/public/avm/opcodes/misc.d.ts +4 -3
  145. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  146. package/dest/public/avm/opcodes/misc.js +42 -17
  147. package/dest/public/avm/opcodes/storage.d.ts +14 -13
  148. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  149. package/dest/public/avm/opcodes/storage.js +39 -27
  150. package/dest/public/avm/revert_reason.d.ts +18 -0
  151. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  152. package/dest/public/avm/revert_reason.js +39 -0
  153. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  154. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  155. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  156. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  157. package/dest/public/avm/serialization/bytecode_serialization.js +79 -75
  158. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  159. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  160. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  161. package/dest/public/avm/test_utils.d.ts +12 -15
  162. package/dest/public/avm/test_utils.d.ts.map +1 -1
  163. package/dest/public/avm/test_utils.js +17 -25
  164. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  165. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  166. package/dest/public/contracts_db_checkpoint.js +30 -0
  167. package/dest/public/db_interfaces.d.ts +68 -0
  168. package/dest/public/db_interfaces.d.ts.map +1 -0
  169. package/dest/public/db_interfaces.js +3 -0
  170. package/dest/public/debug_fn_name.d.ts +18 -0
  171. package/dest/public/debug_fn_name.d.ts.map +1 -0
  172. package/dest/public/debug_fn_name.js +37 -0
  173. package/dest/public/executor_metrics.d.ts +12 -4
  174. package/dest/public/executor_metrics.d.ts.map +1 -1
  175. package/dest/public/executor_metrics.js +33 -23
  176. package/dest/public/executor_metrics_interface.d.ts +10 -0
  177. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  178. package/dest/public/executor_metrics_interface.js +1 -0
  179. package/dest/public/fixtures/amm_test.d.ts +10 -0
  180. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  181. package/dest/public/fixtures/amm_test.js +213 -0
  182. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  183. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  184. package/dest/public/fixtures/bulk_test.js +262 -0
  185. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  186. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  187. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  188. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  189. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  190. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  191. package/dest/public/fixtures/index.d.ts +10 -1
  192. package/dest/public/fixtures/index.d.ts.map +1 -1
  193. package/dest/public/fixtures/index.js +9 -0
  194. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  195. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  196. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  197. package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
  198. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  199. package/dest/public/fixtures/opcode_spammer.js +1653 -0
  200. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +55 -15
  201. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  202. package/dest/public/fixtures/public_tx_simulation_tester.js +138 -72
  203. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  204. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  205. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  206. package/dest/public/fixtures/token_test.d.ts +12 -0
  207. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  208. package/dest/public/fixtures/token_test.js +96 -0
  209. package/dest/public/fixtures/utils.d.ts +18 -5
  210. package/dest/public/fixtures/utils.d.ts.map +1 -1
  211. package/dest/public/fixtures/utils.js +102 -59
  212. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
  213. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  214. package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
  215. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  216. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  217. package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
  218. package/dest/public/hinting_db_sources.d.ts +80 -0
  219. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  220. package/dest/public/hinting_db_sources.js +355 -0
  221. package/dest/public/index.d.ts +6 -9
  222. package/dest/public/index.d.ts.map +1 -1
  223. package/dest/public/index.js +4 -7
  224. package/dest/public/public_db_sources.d.ts +54 -103
  225. package/dest/public/public_db_sources.d.ts.map +1 -1
  226. package/dest/public/public_db_sources.js +222 -195
  227. package/dest/public/public_errors.d.ts +12 -0
  228. package/dest/public/public_errors.d.ts.map +1 -0
  229. package/dest/public/public_errors.js +13 -0
  230. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  231. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  232. package/dest/public/public_processor/guarded_merkle_tree.js +113 -0
  233. package/dest/public/public_processor/public_processor.d.ts +28 -38
  234. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  235. package/dest/public/public_processor/public_processor.js +576 -136
  236. package/dest/public/public_processor/public_processor_metrics.d.ts +4 -4
  237. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  238. package/dest/public/public_processor/public_processor_metrics.js +29 -46
  239. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
  240. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  241. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  242. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  243. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  244. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +132 -0
  245. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  246. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  247. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  248. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  249. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  250. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  251. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
  252. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  253. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  254. package/dest/public/public_tx_simulator/factories.d.ts +14 -0
  255. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  256. package/dest/public/public_tx_simulator/factories.js +28 -0
  257. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  258. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  259. package/dest/public/public_tx_simulator/index.js +5 -0
  260. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  261. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  262. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  263. package/dest/public/public_tx_simulator/public_tx_context.d.ts +25 -31
  264. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  265. package/dest/public/public_tx_simulator/public_tx_context.js +75 -95
  266. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +38 -58
  267. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  268. package/dest/public/public_tx_simulator/public_tx_simulator.js +220 -207
  269. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  270. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  271. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  272. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  273. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  274. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
  275. package/dest/public/side_effect_errors.d.ts +42 -2
  276. package/dest/public/side_effect_errors.d.ts.map +1 -1
  277. package/dest/public/side_effect_errors.js +70 -1
  278. package/dest/public/side_effect_trace.d.ts +24 -69
  279. package/dest/public/side_effect_trace.d.ts.map +1 -1
  280. package/dest/public/side_effect_trace.js +74 -124
  281. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  282. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  283. package/dest/public/state_manager/index.d.ts +2 -0
  284. package/dest/public/state_manager/index.d.ts.map +1 -0
  285. package/dest/public/state_manager/index.js +1 -0
  286. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  287. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  288. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  289. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  290. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  291. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  292. package/dest/public/state_manager/state_manager.d.ts +170 -0
  293. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  294. package/dest/public/state_manager/state_manager.js +402 -0
  295. package/dest/public/test_executor_metrics.d.ts +56 -0
  296. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  297. package/dest/public/test_executor_metrics.js +307 -0
  298. package/dest/public/unique_class_ids.d.ts +1 -1
  299. package/dest/public/unique_class_ids.d.ts.map +1 -1
  300. package/dest/public/utils.d.ts +3 -5
  301. package/dest/public/utils.d.ts.map +1 -1
  302. package/dest/public/utils.js +4 -21
  303. package/dest/server.d.ts +7 -4
  304. package/dest/server.d.ts.map +1 -1
  305. package/dest/server.js +5 -2
  306. package/dest/testing.d.ts +2 -0
  307. package/dest/testing.d.ts.map +1 -0
  308. package/dest/testing.js +1 -0
  309. package/package.json +39 -33
  310. package/src/client.ts +5 -3
  311. package/src/common/errors.ts +80 -45
  312. package/src/common/index.ts +0 -1
  313. package/src/private/acvm/acvm.ts +21 -35
  314. package/src/private/acvm/acvm_types.ts +1 -1
  315. package/src/private/acvm/deserialize.ts +36 -30
  316. package/src/private/acvm/index.ts +0 -1
  317. package/src/private/acvm/serialize.ts +64 -1
  318. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +57 -28
  319. package/src/private/acvm_wasm.ts +76 -0
  320. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  321. package/src/private/circuit_recording/circuit_recorder.ts +263 -0
  322. package/src/private/circuit_recording/file_circuit_recorder.ts +163 -0
  323. package/src/private/circuit_recording/memory_circuit_recorder.ts +13 -0
  324. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  325. package/src/private/circuit_simulator.ts +90 -0
  326. package/src/private/{providers/factory.ts → factory.ts} +13 -10
  327. package/src/public/avm/avm_context.ts +6 -6
  328. package/src/public/avm/avm_contract_call_result.ts +23 -9
  329. package/src/public/avm/avm_execution_environment.ts +17 -5
  330. package/src/public/avm/avm_gas.ts +26 -38
  331. package/src/public/avm/avm_machine_state.ts +12 -6
  332. package/src/public/avm/avm_memory_types.ts +24 -7
  333. package/src/public/avm/avm_simulator.ts +57 -62
  334. package/src/public/avm/avm_simulator_interface.ts +8 -0
  335. package/src/public/avm/calldata.ts +100 -0
  336. package/src/public/avm/errors.ts +20 -75
  337. package/src/public/avm/fixtures/avm_simulation_tester.ts +41 -24
  338. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  339. package/src/public/avm/fixtures/initializers.ts +103 -0
  340. package/src/public/avm/fixtures/utils.ts +151 -0
  341. package/src/public/avm/index.ts +0 -2
  342. package/src/public/avm/opcodes/accrued_substate.ts +81 -48
  343. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  344. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  345. package/src/public/avm/opcodes/bitwise.ts +33 -29
  346. package/src/public/avm/opcodes/comparators.ts +6 -3
  347. package/src/public/avm/opcodes/contract.ts +10 -10
  348. package/src/public/avm/opcodes/control_flow.ts +19 -10
  349. package/src/public/avm/opcodes/conversion.ts +29 -5
  350. package/src/public/avm/opcodes/ec_add.ts +22 -10
  351. package/src/public/avm/opcodes/environment_getters.ts +28 -23
  352. package/src/public/avm/opcodes/external_calls.ts +70 -36
  353. package/src/public/avm/opcodes/hashing.ts +39 -13
  354. package/src/public/avm/opcodes/instruction.ts +31 -21
  355. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  356. package/src/public/avm/opcodes/memory.ts +81 -42
  357. package/src/public/avm/opcodes/misc.ts +61 -19
  358. package/src/public/avm/opcodes/storage.ts +47 -23
  359. package/src/public/avm/revert_reason.ts +58 -0
  360. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  361. package/src/public/avm/serialization/bytecode_serialization.ts +89 -80
  362. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  363. package/src/public/avm/test_utils.ts +25 -42
  364. package/src/public/contracts_db_checkpoint.ts +41 -0
  365. package/src/public/db_interfaces.ts +76 -0
  366. package/src/public/debug_fn_name.ts +52 -0
  367. package/src/public/executor_metrics.ts +49 -23
  368. package/src/public/executor_metrics_interface.ts +15 -0
  369. package/src/public/fixtures/amm_test.ts +331 -0
  370. package/src/public/fixtures/bulk_test.ts +169 -0
  371. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  372. package/src/public/fixtures/custom_bytecode_tests.ts +228 -0
  373. package/src/public/fixtures/index.ts +13 -0
  374. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  375. package/src/public/fixtures/opcode_spammer.ts +1721 -0
  376. package/src/public/fixtures/public_tx_simulation_tester.ts +223 -114
  377. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  378. package/src/public/fixtures/token_test.ts +148 -0
  379. package/src/public/fixtures/utils.ts +141 -69
  380. package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
  381. package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
  382. package/src/public/hinting_db_sources.ts +607 -0
  383. package/src/public/index.ts +11 -8
  384. package/src/public/public_db_sources.ts +290 -260
  385. package/src/public/public_errors.ts +14 -0
  386. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  387. package/src/public/public_processor/public_processor.ts +257 -179
  388. package/src/public/public_processor/public_processor_metrics.ts +18 -46
  389. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +124 -0
  390. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +211 -0
  391. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
  392. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
  393. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
  394. package/src/public/public_tx_simulator/factories.ts +43 -0
  395. package/src/public/public_tx_simulator/index.ts +7 -0
  396. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  397. package/src/public/public_tx_simulator/public_tx_context.ts +179 -199
  398. package/src/public/public_tx_simulator/public_tx_simulator.ts +316 -263
  399. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  400. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  401. package/src/public/side_effect_errors.ts +91 -1
  402. package/src/public/side_effect_trace.ts +99 -322
  403. package/src/public/side_effect_trace_interface.ts +11 -59
  404. package/src/public/state_manager/index.ts +1 -0
  405. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  406. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  407. package/src/public/state_manager/state_manager.ts +569 -0
  408. package/src/public/test_executor_metrics.ts +397 -0
  409. package/src/public/utils.ts +5 -21
  410. package/src/server.ts +6 -3
  411. package/src/testing.ts +1 -0
  412. package/dest/common/db_interfaces.d.ts +0 -80
  413. package/dest/common/db_interfaces.d.ts.map +0 -1
  414. package/dest/common/db_interfaces.js +0 -1
  415. package/dest/common/debug_fn_name.d.ts +0 -5
  416. package/dest/common/debug_fn_name.d.ts.map +0 -1
  417. package/dest/common/debug_fn_name.js +0 -6
  418. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  419. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  420. package/dest/common/message_load_oracle_inputs.js +0 -15
  421. package/dest/private/acvm/oracle/index.d.ts +0 -14
  422. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  423. package/dest/private/acvm/oracle/index.js +0 -2
  424. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  425. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  426. package/dest/private/acvm/oracle/oracle.js +0 -263
  427. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  428. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  429. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  430. package/dest/private/execution_data_provider.d.ts +0 -261
  431. package/dest/private/execution_data_provider.d.ts.map +0 -1
  432. package/dest/private/execution_data_provider.js +0 -14
  433. package/dest/private/execution_note_cache.d.ts +0 -93
  434. package/dest/private/execution_note_cache.d.ts.map +0 -1
  435. package/dest/private/execution_note_cache.js +0 -180
  436. package/dest/private/hashed_values_cache.d.ts +0 -28
  437. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  438. package/dest/private/hashed_values_cache.js +0 -46
  439. package/dest/private/index.d.ts +0 -13
  440. package/dest/private/index.d.ts.map +0 -1
  441. package/dest/private/index.js +0 -12
  442. package/dest/private/pick_notes.d.ts +0 -85
  443. package/dest/private/pick_notes.d.ts.map +0 -1
  444. package/dest/private/pick_notes.js +0 -51
  445. package/dest/private/private_execution.d.ts +0 -25
  446. package/dest/private/private_execution.d.ts.map +0 -1
  447. package/dest/private/private_execution.js +0 -92
  448. package/dest/private/private_execution_oracle.d.ts +0 -215
  449. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  450. package/dest/private/private_execution_oracle.js +0 -382
  451. package/dest/private/providers/acvm_native.d.ts +0 -40
  452. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  453. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  454. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  455. package/dest/private/providers/acvm_wasm.js +0 -62
  456. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  457. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  458. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  459. package/dest/private/providers/factory.d.ts +0 -12
  460. package/dest/private/providers/factory.d.ts.map +0 -1
  461. package/dest/private/providers/simulation_provider.d.ts +0 -19
  462. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  463. package/dest/private/providers/simulation_provider.js +0 -24
  464. package/dest/private/simulator.d.ts +0 -34
  465. package/dest/private/simulator.d.ts.map +0 -1
  466. package/dest/private/simulator.js +0 -76
  467. package/dest/private/unconstrained_execution.d.ts +0 -10
  468. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  469. package/dest/private/unconstrained_execution.js +0 -27
  470. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  471. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  472. package/dest/private/unconstrained_execution_oracle.js +0 -258
  473. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  474. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  475. package/dest/public/avm/bytecode_utils.js +0 -17
  476. package/dest/public/avm/fixtures/index.d.ts +0 -84
  477. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  478. package/dest/public/avm/fixtures/index.js +0 -175
  479. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  480. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  481. package/dest/public/avm/journal/index.d.ts +0 -2
  482. package/dest/public/avm/journal/index.d.ts.map +0 -1
  483. package/dest/public/avm/journal/index.js +0 -1
  484. package/dest/public/avm/journal/journal.d.ts +0 -209
  485. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  486. package/dest/public/avm/journal/journal.js +0 -486
  487. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  488. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  489. package/dest/public/bytecode_errors.d.ts +0 -4
  490. package/dest/public/bytecode_errors.d.ts.map +0 -1
  491. package/dest/public/bytecode_errors.js +0 -6
  492. package/dest/public/execution.d.ts +0 -108
  493. package/dest/public/execution.d.ts.map +0 -1
  494. package/dest/public/execution.js +0 -9
  495. package/dest/public/tx_contract_cache.d.ts +0 -41
  496. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  497. package/dest/public/tx_contract_cache.js +0 -49
  498. package/dest/test/utils.d.ts +0 -13
  499. package/dest/test/utils.d.ts.map +0 -1
  500. package/dest/test/utils.js +0 -22
  501. package/src/common/db_interfaces.ts +0 -94
  502. package/src/common/debug_fn_name.ts +0 -18
  503. package/src/common/message_load_oracle_inputs.ts +0 -15
  504. package/src/private/acvm/oracle/index.ts +0 -16
  505. package/src/private/acvm/oracle/oracle.ts +0 -455
  506. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  507. package/src/private/execution_data_provider.ts +0 -323
  508. package/src/private/execution_note_cache.ts +0 -217
  509. package/src/private/hashed_values_cache.ts +0 -55
  510. package/src/private/index.ts +0 -16
  511. package/src/private/pick_notes.ts +0 -141
  512. package/src/private/private_execution.ts +0 -151
  513. package/src/private/private_execution_oracle.ts +0 -614
  514. package/src/private/providers/acvm_wasm.ts +0 -63
  515. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  516. package/src/private/providers/simulation_provider.ts +0 -45
  517. package/src/private/simulator.ts +0 -147
  518. package/src/private/unconstrained_execution.ts +0 -50
  519. package/src/private/unconstrained_execution_oracle.ts +0 -373
  520. package/src/public/avm/bytecode_utils.ts +0 -17
  521. package/src/public/avm/fixtures/index.ts +0 -296
  522. package/src/public/avm/journal/index.ts +0 -1
  523. package/src/public/avm/journal/journal.ts +0 -742
  524. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  525. package/src/public/bytecode_errors.ts +0 -6
  526. package/src/public/execution.ts +0 -140
  527. package/src/public/tx_contract_cache.ts +0 -69
  528. package/src/test/utils.ts +0 -36
@@ -1,27 +1,24 @@
1
- import { MAX_L2_GAS_PER_TX_PUBLIC_PORTION } from '@aztec/constants';
2
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import { Timer } from '@aztec/foundation/timer';
4
+ import type { PublicSimulatorConfig } from '@aztec/stdlib/avm';
4
5
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
6
  import type { GlobalVariables } from '@aztec/stdlib/tx';
6
7
 
7
8
  import { strict as assert } from 'assert';
8
9
 
9
- import { SideEffectLimitReachedError } from '../side_effect_errors.js';
10
+ import { CheckedPublicExecutionError } from '../public_errors.js';
11
+ import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
10
12
  import { AvmContext } from './avm_context.js';
11
13
  import { AvmContractCallResult } from './avm_contract_call_result.js';
12
14
  import { AvmExecutionEnvironment } from './avm_execution_environment.js';
13
15
  import type { Gas } from './avm_gas.js';
14
16
  import { AvmMachineState } from './avm_machine_state.js';
15
- import { isAvmBytecode } from './bytecode_utils.js';
16
- import {
17
- AvmExecutionError,
18
- AvmRevertReason,
19
- InvalidProgramCounterError,
20
- revertReasonFromExceptionalHalt,
21
- revertReasonFromExplicitRevert,
22
- } from './errors.js';
23
- import type { AvmPersistableStateManager } from './journal/journal.js';
17
+ import type { AvmSimulatorInterface } from './avm_simulator_interface.js';
18
+ import { type CallData, ReturnDataArray } from './calldata.js';
19
+ import { AvmRevertReason, InvalidProgramCounterError } from './errors.js';
24
20
  import type { Instruction } from './opcodes/instruction.js';
21
+ import { revertReasonFromExceptionalHalt, revertReasonFromExplicitRevert } from './revert_reason.js';
25
22
  import {
26
23
  INSTRUCTION_SET,
27
24
  type InstructionSet,
@@ -33,7 +30,7 @@ type OpcodeTally = {
33
30
  gas: Gas;
34
31
  };
35
32
 
36
- export class AvmSimulator {
33
+ export class AvmSimulator implements AvmSimulatorInterface {
37
34
  private log: Logger;
38
35
  private bytecode: Buffer | undefined;
39
36
  private opcodeTallies: Map<string, OpcodeTally> = new Map();
@@ -53,11 +50,7 @@ export class AvmSimulator {
53
50
  // This will be used by the CALL opcode to create a new simulator. It is required to
54
51
  // avoid a dependency cycle.
55
52
  context.provideSimulator = AvmSimulator.build;
56
- assert(
57
- context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_TX_PUBLIC_PORTION,
58
- `Cannot allocate more than ${MAX_L2_GAS_PER_TX_PUBLIC_PORTION} to the AVM for execution.`,
59
- );
60
- this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata[0]})`);
53
+ this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata.read(0)})`);
61
54
  // Turn on tallying if explicitly enabled or if trace logging
62
55
  if (enableTallying || this.log.isLevelEnabled('trace')) {
63
56
  this.tallyPrintFunction = this.printOpcodeTallies;
@@ -76,14 +69,15 @@ export class AvmSimulator {
76
69
  }
77
70
 
78
71
  public static async create(
79
- stateManager: AvmPersistableStateManager,
72
+ stateManager: PublicPersistableStateManager,
80
73
  address: AztecAddress,
81
74
  sender: AztecAddress,
82
75
  transactionFee: Fr,
83
76
  globals: GlobalVariables,
84
77
  isStaticCall: boolean,
85
- calldata: Fr[],
78
+ calldata: CallData,
86
79
  allocatedGas: Gas,
80
+ config: PublicSimulatorConfig,
87
81
  ) {
88
82
  const avmExecutionEnv = new AvmExecutionEnvironment(
89
83
  address,
@@ -93,6 +87,7 @@ export class AvmSimulator {
93
87
  globals,
94
88
  isStaticCall,
95
89
  calldata,
90
+ config,
96
91
  );
97
92
 
98
93
  const avmMachineState = new AvmMachineState(allocatedGas);
@@ -104,22 +99,13 @@ export class AvmSimulator {
104
99
  * Fetch the bytecode and execute it in the current context.
105
100
  */
106
101
  public async execute(): Promise<AvmContractCallResult> {
107
- let bytecode: Buffer | undefined;
108
- try {
109
- bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
110
- } catch (err: any) {
111
- if (!(err instanceof AvmExecutionError || err instanceof SideEffectLimitReachedError)) {
112
- this.log.error(`Unknown error thrown by AVM during bytecode retrieval: ${err}`);
113
- throw err;
114
- }
115
- return await this.handleFailureToRetrieveBytecode(
116
- `Bytecode retrieval for contract '${this.context.environment.address}' failed with ${err}. Reverting...`,
117
- );
118
- }
102
+ const bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
103
+ // getBytecode returns undefined if bytecode is not found or if the limit of contract calls to unique class IDs is reached.
104
+ // If it throws an error that reaches this point, it is a bug.
119
105
 
120
106
  if (!bytecode) {
121
107
  return await this.handleFailureToRetrieveBytecode(
122
- `No bytecode found at: ${this.context.environment.address}. Reverting...`,
108
+ `No bytecode found. Contract is not deployed, or limit encountered for max calls to unique contract class IDs. Contract address: ${this.context.environment.address}. Reverting...`,
123
109
  );
124
110
  }
125
111
 
@@ -138,18 +124,17 @@ export class AvmSimulator {
138
124
  * This method is useful for testing and debugging.
139
125
  */
140
126
  public async executeBytecode(bytecode: Buffer): Promise<AvmContractCallResult> {
141
- const startTotalTime = performance.now();
142
- assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
127
+ const timer = new Timer();
143
128
  assert(bytecode.length > 0, "AVM simulator can't execute empty bytecode");
144
129
 
145
130
  this.bytecode = bytecode;
131
+ let instructionName = 'NONE'; // This is used for logging purposes
146
132
 
147
133
  const { machineState } = this.context;
148
134
  const callStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
149
135
  try {
150
136
  // Execute instruction pointed to by the current program counter
151
137
  // continuing until the machine state signifies a halt
152
- let instrCounter = 0;
153
138
  while (!machineState.getHalted()) {
154
139
  // Get the instruction from cache, or deserialize for the first time
155
140
  let cachedInstruction = this.deserializedInstructionsCache.get(machineState.pc);
@@ -165,15 +150,14 @@ export class AvmSimulator {
165
150
  if (this.log.isLevelEnabled('trace')) {
166
151
  // Skip this entirely to avoid toStringing etc if trace is not enabled
167
152
  this.log.trace(
168
- `[PC:${machineState.pc}] [IC:${instrCounter}] ${instruction.toString()} (gasLeft l2=${
153
+ `[PC:${machineState.pc}] [IC:${machineState.instrCounter}] ${instruction.toString()} (gasLeft l2=${
169
154
  machineState.l2GasLeft
170
155
  } da=${machineState.daGasLeft})`,
171
156
  );
172
157
  }
173
- instrCounter++;
174
-
175
158
  machineState.nextPc = machineState.pc + bytesRead;
176
159
 
160
+ instructionName = instruction.constructor.name;
177
161
  // Execute the instruction.
178
162
  // Normal returns and reverts will return normally here.
179
163
  // "Exceptional halts" will throw.
@@ -183,6 +167,8 @@ export class AvmSimulator {
183
167
  machineState.pc += bytesRead;
184
168
  }
185
169
 
170
+ machineState.instrCounter++;
171
+
186
172
  // gas used by this instruction - used for profiling/tallying
187
173
  const gasUsed: Gas = {
188
174
  l2Gas: instrStartGas.l2Gas - machineState.l2GasLeft,
@@ -192,42 +178,42 @@ export class AvmSimulator {
192
178
 
193
179
  if (machineState.pc >= bytecode.length) {
194
180
  this.log.warn('Passed end of program');
195
- throw new InvalidProgramCounterError(machineState.pc, /*max=*/ bytecode.length);
181
+ throw new InvalidProgramCounterError(machineState.pc, /*max=*/ bytecode.length - 1);
196
182
  }
197
183
  }
198
184
 
199
185
  const output = machineState.getOutput();
200
186
  const reverted = machineState.getReverted();
201
- const revertReason = reverted ? await revertReasonFromExplicitRevert(output, this.context) : undefined;
202
- const results = new AvmContractCallResult(reverted, output, machineState.gasLeft, revertReason);
187
+ const revertReason = reverted
188
+ ? await revertReasonFromExplicitRevert(output.bestEffortReadAll(), this.context)
189
+ : undefined;
190
+ const results = new AvmContractCallResult(
191
+ reverted,
192
+ output,
193
+ machineState.gasLeft,
194
+ revertReason,
195
+ machineState.instrCounter,
196
+ );
203
197
  this.log.debug(`Context execution results: ${results.toString()}`);
204
198
  const totalGasUsed: Gas = {
205
199
  l2Gas: callStartGas.l2Gas - machineState.l2GasLeft,
206
200
  daGas: callStartGas.daGas - machineState.daGasLeft,
207
201
  };
208
- this.log.debug(`Executed ${instrCounter} instructions and consumed ${totalGasUsed.l2Gas} L2 Gas`);
202
+ this.log.debug(`Executed ${machineState.instrCounter} instructions and consumed ${totalGasUsed.l2Gas} L2 Gas`);
209
203
 
210
204
  this.tallyPrintFunction();
211
205
 
212
- const endTotalTime = performance.now();
213
- const totalTime = endTotalTime - startTotalTime;
214
- this.log.debug(`Core AVM simulation took ${totalTime}ms`);
206
+ this.log.debug(`Core AVM simulation took ${timer.ms()}ms`);
215
207
 
216
208
  // Return results for processing by calling context
217
209
  return results;
218
210
  } catch (err: any) {
219
- this.log.verbose('Exceptional halt (revert by something other than REVERT opcode)');
220
- // FIXME: weird that we have to do this OutOfGasError check because:
221
- // 1. OutOfGasError is an AvmExecutionError, so that check should cover both
222
- // 2. We should at least be able to do instanceof OutOfGasError instead of checking the constructor name
223
- if (
224
- !(
225
- err.constructor.name == 'OutOfGasError' ||
226
- err instanceof AvmExecutionError ||
227
- err instanceof SideEffectLimitReachedError
228
- )
229
- ) {
230
- this.log.error(`Unknown error thrown by AVM: ${err}`);
211
+ this.log.info(
212
+ `Exceptional halt (revert by something other than REVERT opcode) for instruction
213
+ ${instructionName} at pc ${machineState.pc} and instruction counter ${machineState.instrCounter}`,
214
+ );
215
+ if (!(err instanceof CheckedPublicExecutionError)) {
216
+ this.log.error(`Unchecked/unknown error thrown by AVM. This is a bug. Error: ${err}`);
231
217
  throw err;
232
218
  }
233
219
 
@@ -235,7 +221,13 @@ export class AvmSimulator {
235
221
  // Exceptional halts consume all allocated gas
236
222
  const noGasLeft = { l2Gas: 0, daGas: 0 };
237
223
  // Note: "exceptional halts" cannot return data, hence [].
238
- const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], noGasLeft, revertReason);
224
+ const results = new AvmContractCallResult(
225
+ /*reverted=*/ true,
226
+ /*output=*/ new ReturnDataArray([]),
227
+ noGasLeft,
228
+ revertReason,
229
+ machineState.instrCounter,
230
+ );
239
231
  this.log.debug(`Context execution results: ${results.toString()}`);
240
232
 
241
233
  this.tallyPrintFunction();
@@ -246,19 +238,22 @@ export class AvmSimulator {
246
238
 
247
239
  private async handleFailureToRetrieveBytecode(message: string): Promise<AvmContractCallResult> {
248
240
  // revert, consuming all gas
249
- const fnName = await this.context.persistableState.getPublicFunctionDebugName(this.context.environment);
241
+ const { functionSelector, functionName } = await this.context.persistableState.getPublicFunctionSelectorAndName(
242
+ this.context.environment,
243
+ );
250
244
  const revertReason = new AvmRevertReason(
251
245
  message,
252
246
  /*failingFunction=*/ {
253
247
  contractAddress: this.context.environment.address,
254
- functionName: fnName,
248
+ functionSelector,
249
+ functionName,
255
250
  },
256
251
  /*noirCallStack=*/ [],
257
252
  );
258
253
  this.log.warn(message);
259
254
  return new AvmContractCallResult(
260
255
  /*reverted=*/ true,
261
- /*output=*/ [],
256
+ /*output=*/ new ReturnDataArray([]),
262
257
  /*gasLeft=*/ { l2Gas: 0, daGas: 0 }, // consumes all allocated gas
263
258
  revertReason,
264
259
  );
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Interface for AvmSimulator to break the circular dependency between avm_context.ts and avm_simulator.ts
3
+ */
4
+ export interface AvmSimulatorInterface {
5
+ execute(): Promise<any>; // Using any here to avoid importing AvmContractCallResult
6
+ executeBytecode(bytecode: Buffer): Promise<any>;
7
+ getBytecode(): Buffer | undefined;
8
+ }
@@ -0,0 +1,100 @@
1
+ import type { Fr } from '@aztec/foundation/schemas';
2
+
3
+ import { TaggedMemory } from './avm_memory_types.js';
4
+
5
+ // Allow reading up to 300 kB of return data when unspecified.
6
+ const DEFAULT_BEST_EFFORT_READ_CAP = 10000;
7
+
8
+ export interface LazyReader {
9
+ bestEffortReadAll(readCap?: number): Fr[];
10
+ readAll(): Fr[];
11
+ read(idx: number): Fr | undefined;
12
+ slice(start: number, end: number): Fr[];
13
+ length(): number;
14
+ }
15
+
16
+ export class LazyReaderMemory implements LazyReader {
17
+ constructor(
18
+ private memory: TaggedMemory,
19
+ private offset: number,
20
+ private size: number,
21
+ ) {}
22
+
23
+ public bestEffortReadAll(readCap = DEFAULT_BEST_EFFORT_READ_CAP): Fr[] {
24
+ const size = Math.min(this.size, readCap, TaggedMemory.MAX_MEMORY_SIZE - this.offset);
25
+ return this.memory.getSlice(this.offset, size).map(word => word.toFr());
26
+ }
27
+
28
+ public read(idx: number): Fr | undefined {
29
+ if (idx >= this.size) {
30
+ return undefined;
31
+ }
32
+ return this.memory.get(this.offset + idx).toFr();
33
+ }
34
+
35
+ public slice(start: number, end: number): Fr[] {
36
+ const clampedEnd = Math.min(end, this.size);
37
+ const length = Math.max(0, clampedEnd - start);
38
+ return this.memory.getSlice(this.offset + start, length).map(word => word.toFr());
39
+ }
40
+
41
+ public readAll(): Fr[] {
42
+ return this.memory.getSlice(this.offset, this.size).map(word => word.toFr());
43
+ }
44
+
45
+ public length(): number {
46
+ return this.size;
47
+ }
48
+ }
49
+
50
+ export class LazyReaderArray implements LazyReader {
51
+ constructor(private array: Fr[]) {}
52
+
53
+ public bestEffortReadAll(readCap = DEFAULT_BEST_EFFORT_READ_CAP): Fr[] {
54
+ return this.array.slice(0, readCap);
55
+ }
56
+
57
+ public read(idx: number): Fr | undefined {
58
+ return this.array[idx];
59
+ }
60
+
61
+ public slice(start: number, end: number): Fr[] {
62
+ return this.array.slice(start, end);
63
+ }
64
+
65
+ public readAll(): Fr[] {
66
+ return this.array;
67
+ }
68
+
69
+ public length(): number {
70
+ return this.array.length;
71
+ }
72
+ }
73
+
74
+ // Compile time branding to avoid swapping CallData and ReturnData by accident.
75
+ declare const CallDataBrand: unique symbol;
76
+ declare const ReturnDataBrand: unique symbol;
77
+
78
+ export type CallData = LazyReader & {
79
+ readonly [CallDataBrand]: true;
80
+ };
81
+
82
+ export type ReturnData = LazyReader & {
83
+ readonly [ReturnDataBrand]: true;
84
+ };
85
+
86
+ export class CallDataArray extends LazyReaderArray implements CallData {
87
+ declare readonly [CallDataBrand]: true;
88
+ }
89
+
90
+ export class CallDataMemory extends LazyReaderMemory implements CallData {
91
+ declare readonly [CallDataBrand]: true;
92
+ }
93
+
94
+ export class ReturnDataArray extends LazyReaderArray implements ReturnData {
95
+ declare readonly [ReturnDataBrand]: true;
96
+ }
97
+
98
+ export class ReturnDataMemory extends LazyReaderMemory implements ReturnData {
99
+ declare readonly [ReturnDataBrand]: true;
100
+ }
@@ -1,27 +1,19 @@
1
- import type { Fr, Point } from '@aztec/foundation/fields';
2
- import type { AztecAddress } from '@aztec/stdlib/aztec-address';
1
+ import type { Point } from '@aztec/foundation/curves/grumpkin';
3
2
  import type { FailingFunction, NoirCallStack } from '@aztec/stdlib/errors';
4
3
 
5
4
  import { ExecutionError } from '../../common/errors.js';
6
- import type { AvmContext } from './avm_context.js';
5
+ import { CheckedPublicExecutionError } from '../public_errors.js';
7
6
 
8
7
  /**
9
8
  * Avm-specific errors should derive from this
10
9
  */
11
- export abstract class AvmExecutionError extends Error {
10
+ export abstract class AvmExecutionError extends CheckedPublicExecutionError {
12
11
  constructor(message: string) {
13
12
  super(message);
14
13
  this.name = 'AvmExecutionError';
15
14
  }
16
15
  }
17
16
 
18
- export class NoBytecodeForContractError extends AvmExecutionError {
19
- constructor(contractAddress: AztecAddress) {
20
- super(`No bytecode found at: ${contractAddress}`);
21
- this.name = 'NoBytecodeFoundInterpreterError';
22
- }
23
- }
24
-
25
17
  export class ArithmeticError extends AvmExecutionError {
26
18
  constructor(message: string) {
27
19
  super(message);
@@ -66,7 +58,7 @@ export class AvmParsingError extends AvmExecutionError {
66
58
  */
67
59
  export class InvalidTagValueError extends AvmExecutionError {
68
60
  constructor(tagValue: number) {
69
- super(`Tag value ${tagValue} is invalid.`);
61
+ super(`Tag check failed: Tag value ${tagValue} is invalid.`);
70
62
  this.name = 'InvalidTagValueError';
71
63
  }
72
64
  }
@@ -85,6 +77,12 @@ export class InstructionExecutionError extends AvmExecutionError {
85
77
  * Error thrown on failed AVM memory tag check.
86
78
  */
87
79
  export class TagCheckError extends AvmExecutionError {
80
+ public static forBaseAddress(gotTag: string): TagCheckError {
81
+ return new TagCheckError(`Base address (mem[0]) is not a valid address (has tag ${gotTag})`);
82
+ }
83
+ public static forIndirectAddress(address: number, gotTag: string): TagCheckError {
84
+ return new TagCheckError(`Address after indirection is not a valid address (address ${address} has tag ${gotTag})`);
85
+ }
88
86
  public static forOffset(offset: number, gotTag: string, expectedTag: string): TagCheckError {
89
87
  return new TagCheckError(`Tag mismatch at offset ${offset}, got ${gotTag}, expected ${expectedTag}`);
90
88
  }
@@ -105,7 +103,7 @@ export class TagCheckError extends AvmExecutionError {
105
103
  */
106
104
  export class RelativeAddressOutOfRangeError extends AvmExecutionError {
107
105
  constructor(baseAddr: number, relOffset: number) {
108
- super(`Address out of range. Base address ${baseAddr}, relative offset ${relOffset}`);
106
+ super(`Relative address out of range. Base address ${baseAddr}, relative offset ${relOffset}`);
109
107
  this.name = 'RelativeAddressOutOfRangeError';
110
108
  }
111
109
  }
@@ -130,22 +128,12 @@ export class OutOfGasError extends AvmExecutionError {
130
128
  }
131
129
 
132
130
  /**
133
- * Error is thrown when the supplied points length is not a multiple of 3. Specific for MSM opcode.
134
- */
135
- export class MSMPointsLengthError extends AvmExecutionError {
136
- constructor(pointsReadLength: number) {
137
- super(`Points vector length should be a multiple of 3, was ${pointsReadLength}`);
138
- this.name = 'MSMPointsLengthError';
139
- }
140
- }
141
-
142
- /**
143
- * Error is thrown when one of the supplied points does not lie on the Grumpkin curve. Specific for MSM opcode.
131
+ * Error is thrown when one of the supplied points does not lie on the Grumpkin curve. Specific for ECADD opcode.
144
132
  */
145
- export class MSMPointNotOnCurveError extends AvmExecutionError {
146
- constructor(point: Point) {
147
- super(`Point ${point.toString()} is not on the curve.`);
148
- this.name = 'MSMPointNotOnCurveError';
133
+ export class EcAddPointNotOnCurveError extends AvmExecutionError {
134
+ constructor(pointIndex: number, point: Point) {
135
+ super(`EcAdd point${pointIndex} (${point.toString()}) is not on the curve.`);
136
+ this.name = 'EcAddPointNotOnCurveError';
149
137
  }
150
138
  }
151
139
 
@@ -180,53 +168,10 @@ export class AvmRevertReason extends ExecutionError {
180
168
  }
181
169
  }
182
170
 
183
- async function createRevertReason(message: string, revertData: Fr[], context: AvmContext): Promise<AvmRevertReason> {
184
- // We drop the returnPc information.
185
- const internalCallStack = context.machineState.internalCallStack.map(entry => entry.callPc);
186
-
187
- // If we are reverting due to the same error that we have been tracking, we use the nested error as the cause.
188
- let nestedError = undefined;
189
- const revertDataEquals = (a: Fr[], b: Fr[]) => a.length === b.length && a.every((v, i) => v.equals(b[i]));
190
- if (
191
- context.machineState.collectedRevertInfo &&
192
- revertDataEquals(context.machineState.collectedRevertInfo.revertDataRepresentative, revertData)
193
- ) {
194
- nestedError = context.machineState.collectedRevertInfo.recursiveRevertReason;
195
- message = context.machineState.collectedRevertInfo.recursiveRevertReason.message;
196
- }
197
-
198
- const fnName = await context.persistableState.getPublicFunctionDebugName(context.environment);
199
-
200
- return new AvmRevertReason(
201
- message,
202
- /*failingFunction=*/ {
203
- contractAddress: context.environment.address,
204
- functionName: fnName,
205
- },
206
- /*noirCallStack=*/ [...internalCallStack, context.machineState.pc].map(pc => `0.${pc}`),
207
- /*options=*/ { cause: nestedError },
208
- );
209
- }
210
-
211
- /**
212
- * Create a "revert reason" error for an exceptional halt.
213
- *
214
- * @param haltingError - the lower-level error causing the exceptional halt
215
- * @param context - the context of the AVM execution used to extract the failingFunction and noirCallStack
216
- */
217
- export async function revertReasonFromExceptionalHalt(
218
- haltingError: AvmExecutionError,
219
- context: AvmContext,
220
- ): Promise<AvmRevertReason> {
221
- return await createRevertReason(haltingError.message, [], context);
222
- }
223
-
224
171
  /**
225
- * Create a "revert reason" error for an explicit revert (a root cause).
226
- *
227
- * @param revertData - output data of the explicit REVERT instruction
228
- * @param context - the context of the AVM execution used to extract the failingFunction and noirCallStack
172
+ * Helper to annotate errors occurring during instruction fetching.
229
173
  */
230
- export async function revertReasonFromExplicitRevert(revertData: Fr[], context: AvmContext): Promise<AvmRevertReason> {
231
- return await createRevertReason('Assertion failed: ', revertData, context);
174
+ export function duringInstrFetch(error: Error, pc: number) {
175
+ error.message = `Instruction fetching error at pc ${pc}: ${error.message}`;
176
+ return error;
232
177
  }
@@ -1,5 +1,6 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { encodeArguments } from '@aztec/stdlib/abi';
3
+ import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
3
4
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
5
  import { GasFees } from '@aztec/stdlib/gas';
5
6
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
@@ -8,20 +9,20 @@ import { NativeWorldStateService } from '@aztec/world-state';
8
9
 
9
10
  import { SideEffectTrace } from '../../../public/side_effect_trace.js';
10
11
  import type { AvmContractCallResult } from '../../avm/avm_contract_call_result.js';
12
+ import { SimpleContractDataSource } from '../../fixtures/simple_contract_data_source.js';
13
+ import { PublicContractsDB, PublicTreesDB } from '../../public_db_sources.js';
14
+ import { PublicPersistableStateManager } from '../../state_manager/state_manager.js';
15
+ import { AvmSimulator } from '../avm_simulator.js';
16
+ import { CallDataArray } from '../calldata.js';
17
+ import { BaseAvmSimulationTester } from './base_avm_simulation_tester.js';
18
+ import { initContext, initExecutionEnvironment } from './initializers.js';
11
19
  import {
12
- getContractFunctionArtifact,
20
+ DEFAULT_TIMESTAMP,
21
+ getContractFunctionAbi,
13
22
  getFunctionSelector,
14
- initContext,
15
- initExecutionEnvironment,
16
23
  resolveContractAssertionMessage,
17
- } from '../../avm/fixtures/index.js';
18
- import { AvmPersistableStateManager } from '../../avm/journal/journal.js';
19
- import { WorldStateDB } from '../../public_db_sources.js';
20
- import { AvmSimulator } from '../avm_simulator.js';
21
- import { BaseAvmSimulationTester } from './base_avm_simulation_tester.js';
22
- import { SimpleContractDataSource } from './simple_contract_data_source.js';
24
+ } from './utils.js';
23
25
 
24
- const TIMESTAMP = new Fr(99833);
25
26
  const DEFAULT_GAS_FEES = new GasFees(2, 3);
26
27
 
27
28
  /**
@@ -33,24 +34,27 @@ export class AvmSimulationTester extends BaseAvmSimulationTester {
33
34
  constructor(
34
35
  contractDataSource: SimpleContractDataSource,
35
36
  merkleTrees: MerkleTreeWriteOperations,
36
- private stateManager: AvmPersistableStateManager,
37
+ private stateManager: PublicPersistableStateManager,
37
38
  ) {
38
39
  super(contractDataSource, merkleTrees);
39
40
  }
40
41
 
41
- static async create(): Promise<AvmSimulationTester> {
42
+ static async create(
43
+ worldStateService: NativeWorldStateService, // make sure to close this later
44
+ ): Promise<AvmSimulationTester> {
42
45
  const contractDataSource = new SimpleContractDataSource();
43
- const merkleTrees = await (await NativeWorldStateService.tmp()).fork();
44
- const worldStateDB = new WorldStateDB(merkleTrees, contractDataSource);
46
+ const merkleTrees = await worldStateService.fork();
47
+ const treesDB = new PublicTreesDB(merkleTrees);
48
+ const contractsDB = new PublicContractsDB(contractDataSource);
45
49
  const trace = new SideEffectTrace();
46
50
  const firstNullifier = new Fr(420000);
47
- // FIXME: merkle ops should work, but I'm seeing frequent (but inconsistent) bytecode retrieval
48
- // failures on 2nd call to simulateCall with merkle ops on
49
- const stateManager = AvmPersistableStateManager.create(
50
- worldStateDB,
51
+
52
+ const stateManager = PublicPersistableStateManager.create(
53
+ treesDB,
54
+ contractsDB,
51
55
  trace,
52
- /*doMerkleOperations=*/ false,
53
56
  firstNullifier,
57
+ DEFAULT_TIMESTAMP,
54
58
  );
55
59
  return new AvmSimulationTester(contractDataSource, merkleTrees, stateManager);
56
60
  }
@@ -70,20 +74,28 @@ export class AvmSimulationTester extends BaseAvmSimulationTester {
70
74
  throw new Error(`Contract not found at address: ${address}`);
71
75
  }
72
76
  const fnSelector = await getFunctionSelector(fnName, contractArtifact);
73
- const fnAbi = getContractFunctionArtifact(fnName, contractArtifact);
77
+ const fnAbi = getContractFunctionAbi(fnName, contractArtifact);
74
78
  const encodedArgs = encodeArguments(fnAbi!, args);
75
79
  const calldata = [fnSelector.toField(), ...encodedArgs];
76
80
 
77
81
  const globals = GlobalVariables.empty();
78
- globals.timestamp = TIMESTAMP;
82
+ globals.timestamp = DEFAULT_TIMESTAMP;
79
83
  globals.gasFees = DEFAULT_GAS_FEES;
80
84
 
85
+ const config = PublicSimulatorConfig.from({
86
+ skipFeeEnforcement: false,
87
+ collectDebugLogs: true,
88
+ collectHints: false,
89
+ collectStatistics: false,
90
+ collectCallMetadata: true,
91
+ });
81
92
  const environment = initExecutionEnvironment({
82
- calldata,
93
+ calldata: new CallDataArray(calldata),
83
94
  globals,
84
95
  address,
85
96
  sender,
86
97
  isStaticCall,
98
+ config,
87
99
  });
88
100
  const persistableState = await this.stateManager.fork();
89
101
  const context = initContext({ env: environment, persistableState });
@@ -94,7 +106,12 @@ export class AvmSimulationTester extends BaseAvmSimulationTester {
94
106
  if (result.reverted) {
95
107
  this.logger.error(`Error in ${fnName}:`);
96
108
  this.logger.error(
97
- resolveContractAssertionMessage(fnName, result.revertReason!, result.output, contractArtifact)!,
109
+ resolveContractAssertionMessage(
110
+ fnName,
111
+ result.revertReason!,
112
+ result.output.bestEffortReadAll(),
113
+ contractArtifact,
114
+ )!,
98
115
  );
99
116
  } else {
100
117
  this.logger.info(`Simulation of function ${fnName} succeeded!`);