@aztec/simulator 0.0.0-test.0 → 0.0.1-commit.03f7ef2

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 (521) hide show
  1. package/README.md +6 -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 -15
  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 +12 -6
  14. package/dest/private/acvm/acvm.d.ts.map +1 -1
  15. package/dest/private/acvm/acvm.js +10 -16
  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 +39 -0
  28. package/dest/private/acvm_native.d.ts.map +1 -0
  29. package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
  30. package/dest/private/acvm_wasm.d.ts +15 -0
  31. package/dest/private/acvm_wasm.d.ts.map +1 -0
  32. package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
  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 +108 -0
  37. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
  38. package/dest/private/circuit_recording/circuit_recorder.js +209 -0
  39. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -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 +5 -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} +2 -2
  54. package/dest/public/avm/avm_context.d.ts +7 -7
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +6 -4
  57. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  58. package/dest/public/avm/avm_contract_call_result.js +11 -7
  59. package/dest/public/avm/avm_execution_environment.d.ts +5 -3
  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 +4 -2
  66. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  67. package/dest/public/avm/avm_machine_state.js +2 -0
  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 +18 -7
  71. package/dest/public/avm/avm_simulator.d.ts +7 -7
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +28 -39
  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/errors.d.ts +11 -29
  78. package/dest/public/avm/errors.d.ts.map +1 -1
  79. package/dest/public/avm/errors.js +19 -57
  80. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +6 -5
  81. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  82. package/dest/public/avm/fixtures/avm_simulation_tester.js +23 -16
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +8 -6
  84. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  85. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +38 -15
  86. package/dest/public/avm/fixtures/initializers.d.ts +42 -0
  87. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
  88. package/dest/public/avm/fixtures/initializers.js +44 -0
  89. package/dest/public/avm/fixtures/utils.d.ts +39 -0
  90. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/utils.js +96 -0
  92. package/dest/public/avm/index.d.ts +1 -3
  93. package/dest/public/avm/index.d.ts.map +1 -1
  94. package/dest/public/avm/index.js +0 -2
  95. package/dest/public/avm/opcodes/accrued_substate.d.ts +3 -3
  96. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  97. package/dest/public/avm/opcodes/accrued_substate.js +28 -25
  98. package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
  99. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  100. package/dest/public/avm/opcodes/addressing_mode.js +46 -26
  101. package/dest/public/avm/opcodes/arithmetic.d.ts +19 -7
  102. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/arithmetic.js +27 -3
  104. package/dest/public/avm/opcodes/bitwise.d.ts +10 -18
  105. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  106. package/dest/public/avm/opcodes/bitwise.js +19 -26
  107. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  108. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  109. package/dest/public/avm/opcodes/comparators.js +3 -3
  110. package/dest/public/avm/opcodes/contract.d.ts +2 -3
  111. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  112. package/dest/public/avm/opcodes/contract.js +9 -10
  113. package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
  114. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  115. package/dest/public/avm/opcodes/control_flow.js +10 -8
  116. package/dest/public/avm/opcodes/conversion.d.ts +2 -1
  117. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  118. package/dest/public/avm/opcodes/conversion.js +267 -3
  119. package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
  120. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  121. package/dest/public/avm/opcodes/ec_add.js +8 -8
  122. package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
  123. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  124. package/dest/public/avm/opcodes/environment_getters.js +17 -19
  125. package/dest/public/avm/opcodes/external_calls.d.ts +9 -8
  126. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  127. package/dest/public/avm/opcodes/external_calls.js +39 -34
  128. package/dest/public/avm/opcodes/hashing.d.ts +2 -2
  129. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  130. package/dest/public/avm/opcodes/hashing.js +15 -10
  131. package/dest/public/avm/opcodes/index.d.ts +1 -1
  132. package/dest/public/avm/opcodes/instruction.d.ts +15 -11
  133. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  134. package/dest/public/avm/opcodes/instruction.js +23 -19
  135. package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
  136. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  137. package/dest/public/avm/opcodes/memory.d.ts +6 -6
  138. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  139. package/dest/public/avm/opcodes/memory.js +37 -33
  140. package/dest/public/avm/opcodes/misc.d.ts +3 -2
  141. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  142. package/dest/public/avm/opcodes/misc.js +41 -16
  143. package/dest/public/avm/opcodes/storage.d.ts +3 -3
  144. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  145. package/dest/public/avm/opcodes/storage.js +7 -5
  146. package/dest/public/avm/revert_reason.d.ts +18 -0
  147. package/dest/public/avm/revert_reason.d.ts.map +1 -0
  148. package/dest/public/avm/revert_reason.js +39 -0
  149. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
  150. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  151. package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
  152. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  153. package/dest/public/avm/serialization/bytecode_serialization.js +79 -75
  154. package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
  155. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  156. package/dest/public/avm/serialization/instruction_serialization.js +70 -35
  157. package/dest/public/avm/test_utils.d.ts +12 -15
  158. package/dest/public/avm/test_utils.d.ts.map +1 -1
  159. package/dest/public/avm/test_utils.js +17 -25
  160. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  161. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  162. package/dest/public/contracts_db_checkpoint.js +30 -0
  163. package/dest/public/db_interfaces.d.ts +68 -0
  164. package/dest/public/db_interfaces.d.ts.map +1 -0
  165. package/dest/public/db_interfaces.js +3 -0
  166. package/dest/public/debug_fn_name.d.ts +18 -0
  167. package/dest/public/debug_fn_name.d.ts.map +1 -0
  168. package/dest/public/debug_fn_name.js +35 -0
  169. package/dest/public/executor_metrics.d.ts +12 -4
  170. package/dest/public/executor_metrics.d.ts.map +1 -1
  171. package/dest/public/executor_metrics.js +37 -6
  172. package/dest/public/executor_metrics_interface.d.ts +10 -0
  173. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  174. package/dest/public/executor_metrics_interface.js +1 -0
  175. package/dest/public/fixtures/amm_test.d.ts +10 -0
  176. package/dest/public/fixtures/amm_test.d.ts.map +1 -0
  177. package/dest/public/fixtures/amm_test.js +213 -0
  178. package/dest/public/fixtures/bulk_test.d.ts +6 -0
  179. package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
  180. package/dest/public/fixtures/bulk_test.js +278 -0
  181. package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
  182. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  183. package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
  184. package/dest/public/fixtures/custom_bytecode_tests.d.ts +12 -0
  185. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  186. package/dest/public/fixtures/custom_bytecode_tests.js +174 -0
  187. package/dest/public/fixtures/index.d.ts +10 -1
  188. package/dest/public/fixtures/index.d.ts.map +1 -1
  189. package/dest/public/fixtures/index.js +9 -0
  190. package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
  191. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  192. package/dest/public/fixtures/minimal_public_tx.js +19 -0
  193. package/dest/public/fixtures/opcode_spammer.d.ts +123 -0
  194. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
  195. package/dest/public/fixtures/opcode_spammer.js +1681 -0
  196. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +55 -15
  197. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  198. package/dest/public/fixtures/public_tx_simulation_tester.js +138 -72
  199. package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
  200. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  201. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  202. package/dest/public/fixtures/token_test.d.ts +12 -0
  203. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  204. package/dest/public/fixtures/token_test.js +96 -0
  205. package/dest/public/fixtures/utils.d.ts +18 -5
  206. package/dest/public/fixtures/utils.d.ts.map +1 -1
  207. package/dest/public/fixtures/utils.js +102 -59
  208. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +46 -0
  209. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
  210. package/dest/public/fuzzing/avm_fuzzer_simulator.js +139 -0
  211. package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
  212. package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
  213. package/dest/public/fuzzing/avm_simulator_bin.js +100 -0
  214. package/dest/public/hinting_db_sources.d.ts +80 -0
  215. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  216. package/dest/public/hinting_db_sources.js +353 -0
  217. package/dest/public/index.d.ts +6 -9
  218. package/dest/public/index.d.ts.map +1 -1
  219. package/dest/public/index.js +4 -7
  220. package/dest/public/public_db_sources.d.ts +52 -102
  221. package/dest/public/public_db_sources.d.ts.map +1 -1
  222. package/dest/public/public_db_sources.js +220 -193
  223. package/dest/public/public_errors.d.ts +12 -0
  224. package/dest/public/public_errors.d.ts.map +1 -0
  225. package/dest/public/public_errors.js +13 -0
  226. package/dest/public/public_processor/guarded_merkle_tree.d.ts +51 -0
  227. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  228. package/dest/public/public_processor/guarded_merkle_tree.js +111 -0
  229. package/dest/public/public_processor/public_processor.d.ts +26 -38
  230. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  231. package/dest/public/public_processor/public_processor.js +177 -121
  232. package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
  233. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  234. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  235. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +18 -0
  236. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  237. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +98 -0
  238. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +53 -0
  239. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  240. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +131 -0
  241. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  242. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  243. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  244. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  245. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  246. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
  247. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +22 -0
  248. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
  249. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
  250. package/dest/public/public_tx_simulator/factories.d.ts +13 -0
  251. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
  252. package/dest/public/public_tx_simulator/factories.js +28 -0
  253. package/dest/public/public_tx_simulator/index.d.ts +8 -0
  254. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  255. package/dest/public/public_tx_simulator/index.js +5 -0
  256. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  257. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  258. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  259. package/dest/public/public_tx_simulator/public_tx_context.d.ts +24 -31
  260. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  261. package/dest/public/public_tx_simulator/public_tx_context.js +72 -92
  262. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -58
  263. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  264. package/dest/public/public_tx_simulator/public_tx_simulator.js +213 -205
  265. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
  266. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  267. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  268. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  269. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  270. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  271. package/dest/public/side_effect_errors.d.ts +42 -2
  272. package/dest/public/side_effect_errors.d.ts.map +1 -1
  273. package/dest/public/side_effect_errors.js +70 -1
  274. package/dest/public/side_effect_trace.d.ts +22 -68
  275. package/dest/public/side_effect_trace.d.ts.map +1 -1
  276. package/dest/public/side_effect_trace.js +72 -122
  277. package/dest/public/side_effect_trace_interface.d.ts +13 -25
  278. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  279. package/dest/public/state_manager/index.d.ts +2 -0
  280. package/dest/public/state_manager/index.d.ts.map +1 -0
  281. package/dest/public/state_manager/index.js +1 -0
  282. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
  283. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  284. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  285. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
  286. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  287. package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
  288. package/dest/public/state_manager/state_manager.d.ts +164 -0
  289. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  290. package/dest/public/state_manager/state_manager.js +395 -0
  291. package/dest/public/test_executor_metrics.d.ts +55 -0
  292. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  293. package/dest/public/test_executor_metrics.js +307 -0
  294. package/dest/public/unique_class_ids.d.ts +1 -1
  295. package/dest/public/unique_class_ids.d.ts.map +1 -1
  296. package/dest/public/utils.d.ts +3 -5
  297. package/dest/public/utils.d.ts.map +1 -1
  298. package/dest/public/utils.js +4 -21
  299. package/dest/server.d.ts +7 -4
  300. package/dest/server.d.ts.map +1 -1
  301. package/dest/server.js +5 -2
  302. package/dest/testing.d.ts +2 -0
  303. package/dest/testing.d.ts.map +1 -0
  304. package/dest/testing.js +1 -0
  305. package/package.json +39 -33
  306. package/src/client.ts +5 -3
  307. package/src/common/errors.ts +80 -45
  308. package/src/common/index.ts +0 -1
  309. package/src/private/acvm/acvm.ts +17 -32
  310. package/src/private/acvm/acvm_types.ts +1 -1
  311. package/src/private/acvm/deserialize.ts +36 -30
  312. package/src/private/acvm/index.ts +0 -1
  313. package/src/private/acvm/serialize.ts +64 -1
  314. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  315. package/src/private/acvm_wasm.ts +72 -0
  316. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  317. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  318. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  319. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  320. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  321. package/src/private/circuit_simulator.ts +90 -0
  322. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  323. package/src/public/avm/avm_context.ts +5 -5
  324. package/src/public/avm/avm_contract_call_result.ts +18 -6
  325. package/src/public/avm/avm_execution_environment.ts +9 -2
  326. package/src/public/avm/avm_gas.ts +26 -38
  327. package/src/public/avm/avm_machine_state.ts +6 -1
  328. package/src/public/avm/avm_memory_types.ts +20 -7
  329. package/src/public/avm/avm_simulator.ts +50 -58
  330. package/src/public/avm/avm_simulator_interface.ts +8 -0
  331. package/src/public/avm/errors.ts +20 -75
  332. package/src/public/avm/fixtures/avm_simulation_tester.ts +33 -22
  333. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +46 -13
  334. package/src/public/avm/fixtures/initializers.ts +102 -0
  335. package/src/public/avm/fixtures/utils.ts +151 -0
  336. package/src/public/avm/index.ts +0 -2
  337. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  338. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  339. package/src/public/avm/opcodes/arithmetic.ts +37 -3
  340. package/src/public/avm/opcodes/bitwise.ts +33 -29
  341. package/src/public/avm/opcodes/comparators.ts +6 -3
  342. package/src/public/avm/opcodes/contract.ts +10 -7
  343. package/src/public/avm/opcodes/control_flow.ts +19 -10
  344. package/src/public/avm/opcodes/conversion.ts +27 -3
  345. package/src/public/avm/opcodes/ec_add.ts +11 -8
  346. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  347. package/src/public/avm/opcodes/external_calls.ts +61 -29
  348. package/src/public/avm/opcodes/hashing.ts +38 -12
  349. package/src/public/avm/opcodes/instruction.ts +31 -21
  350. package/src/public/avm/opcodes/memory.ts +71 -32
  351. package/src/public/avm/opcodes/misc.ts +60 -18
  352. package/src/public/avm/opcodes/storage.ts +22 -6
  353. package/src/public/avm/revert_reason.ts +58 -0
  354. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  355. package/src/public/avm/serialization/bytecode_serialization.ts +89 -80
  356. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  357. package/src/public/avm/test_utils.ts +25 -42
  358. package/src/public/contracts_db_checkpoint.ts +41 -0
  359. package/src/public/db_interfaces.ts +76 -0
  360. package/src/public/debug_fn_name.ts +50 -0
  361. package/src/public/executor_metrics.ts +56 -6
  362. package/src/public/executor_metrics_interface.ts +15 -0
  363. package/src/public/fixtures/amm_test.ts +331 -0
  364. package/src/public/fixtures/bulk_test.ts +169 -0
  365. package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
  366. package/src/public/fixtures/custom_bytecode_tests.ts +219 -0
  367. package/src/public/fixtures/index.ts +13 -0
  368. package/src/public/fixtures/minimal_public_tx.ts +26 -0
  369. package/src/public/fixtures/opcode_spammer.ts +1638 -0
  370. package/src/public/fixtures/public_tx_simulation_tester.ts +223 -114
  371. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
  372. package/src/public/fixtures/token_test.ts +148 -0
  373. package/src/public/fixtures/utils.ts +141 -69
  374. package/src/public/fuzzing/avm_fuzzer_simulator.ts +240 -0
  375. package/src/public/fuzzing/avm_simulator_bin.ts +140 -0
  376. package/src/public/hinting_db_sources.ts +607 -0
  377. package/src/public/index.ts +11 -8
  378. package/src/public/public_db_sources.ts +279 -259
  379. package/src/public/public_errors.ts +14 -0
  380. package/src/public/public_processor/guarded_merkle_tree.ts +158 -0
  381. package/src/public/public_processor/public_processor.ts +242 -178
  382. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  383. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +121 -0
  384. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +200 -0
  385. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +132 -0
  386. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +237 -0
  387. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +81 -0
  388. package/src/public/public_tx_simulator/factories.ts +41 -0
  389. package/src/public/public_tx_simulator/index.ts +7 -0
  390. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  391. package/src/public/public_tx_simulator/public_tx_context.ts +168 -195
  392. package/src/public/public_tx_simulator/public_tx_simulator.ts +302 -260
  393. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
  394. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  395. package/src/public/side_effect_errors.ts +91 -1
  396. package/src/public/side_effect_trace.ts +95 -321
  397. package/src/public/side_effect_trace_interface.ts +11 -59
  398. package/src/public/state_manager/index.ts +1 -0
  399. package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
  400. package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
  401. package/src/public/state_manager/state_manager.ts +560 -0
  402. package/src/public/test_executor_metrics.ts +397 -0
  403. package/src/public/utils.ts +5 -21
  404. package/src/server.ts +6 -3
  405. package/src/testing.ts +1 -0
  406. package/dest/common/db_interfaces.d.ts +0 -80
  407. package/dest/common/db_interfaces.d.ts.map +0 -1
  408. package/dest/common/db_interfaces.js +0 -1
  409. package/dest/common/debug_fn_name.d.ts +0 -5
  410. package/dest/common/debug_fn_name.d.ts.map +0 -1
  411. package/dest/common/debug_fn_name.js +0 -6
  412. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  413. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  414. package/dest/common/message_load_oracle_inputs.js +0 -15
  415. package/dest/private/acvm/oracle/index.d.ts +0 -14
  416. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  417. package/dest/private/acvm/oracle/index.js +0 -2
  418. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  419. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  420. package/dest/private/acvm/oracle/oracle.js +0 -263
  421. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  422. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  423. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  424. package/dest/private/execution_data_provider.d.ts +0 -261
  425. package/dest/private/execution_data_provider.d.ts.map +0 -1
  426. package/dest/private/execution_data_provider.js +0 -14
  427. package/dest/private/execution_note_cache.d.ts +0 -93
  428. package/dest/private/execution_note_cache.d.ts.map +0 -1
  429. package/dest/private/execution_note_cache.js +0 -180
  430. package/dest/private/hashed_values_cache.d.ts +0 -28
  431. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  432. package/dest/private/hashed_values_cache.js +0 -46
  433. package/dest/private/index.d.ts +0 -13
  434. package/dest/private/index.d.ts.map +0 -1
  435. package/dest/private/index.js +0 -12
  436. package/dest/private/pick_notes.d.ts +0 -85
  437. package/dest/private/pick_notes.d.ts.map +0 -1
  438. package/dest/private/pick_notes.js +0 -51
  439. package/dest/private/private_execution.d.ts +0 -25
  440. package/dest/private/private_execution.d.ts.map +0 -1
  441. package/dest/private/private_execution.js +0 -92
  442. package/dest/private/private_execution_oracle.d.ts +0 -215
  443. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  444. package/dest/private/private_execution_oracle.js +0 -382
  445. package/dest/private/providers/acvm_native.d.ts +0 -40
  446. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  447. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  448. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  449. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  450. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  451. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  452. package/dest/private/providers/factory.d.ts +0 -12
  453. package/dest/private/providers/factory.d.ts.map +0 -1
  454. package/dest/private/providers/simulation_provider.d.ts +0 -19
  455. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  456. package/dest/private/providers/simulation_provider.js +0 -24
  457. package/dest/private/simulator.d.ts +0 -34
  458. package/dest/private/simulator.d.ts.map +0 -1
  459. package/dest/private/simulator.js +0 -76
  460. package/dest/private/unconstrained_execution.d.ts +0 -10
  461. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  462. package/dest/private/unconstrained_execution.js +0 -27
  463. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  464. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  465. package/dest/private/unconstrained_execution_oracle.js +0 -258
  466. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  467. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  468. package/dest/public/avm/bytecode_utils.js +0 -17
  469. package/dest/public/avm/fixtures/index.d.ts +0 -84
  470. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  471. package/dest/public/avm/fixtures/index.js +0 -175
  472. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  473. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  474. package/dest/public/avm/journal/index.d.ts +0 -2
  475. package/dest/public/avm/journal/index.d.ts.map +0 -1
  476. package/dest/public/avm/journal/index.js +0 -1
  477. package/dest/public/avm/journal/journal.d.ts +0 -209
  478. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  479. package/dest/public/avm/journal/journal.js +0 -486
  480. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  481. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  482. package/dest/public/bytecode_errors.d.ts +0 -4
  483. package/dest/public/bytecode_errors.d.ts.map +0 -1
  484. package/dest/public/bytecode_errors.js +0 -6
  485. package/dest/public/execution.d.ts +0 -108
  486. package/dest/public/execution.d.ts.map +0 -1
  487. package/dest/public/execution.js +0 -9
  488. package/dest/public/tx_contract_cache.d.ts +0 -41
  489. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  490. package/dest/public/tx_contract_cache.js +0 -49
  491. package/dest/test/utils.d.ts +0 -13
  492. package/dest/test/utils.d.ts.map +0 -1
  493. package/dest/test/utils.js +0 -22
  494. package/src/common/db_interfaces.ts +0 -94
  495. package/src/common/debug_fn_name.ts +0 -18
  496. package/src/common/message_load_oracle_inputs.ts +0 -15
  497. package/src/private/acvm/oracle/index.ts +0 -16
  498. package/src/private/acvm/oracle/oracle.ts +0 -455
  499. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  500. package/src/private/execution_data_provider.ts +0 -323
  501. package/src/private/execution_note_cache.ts +0 -217
  502. package/src/private/hashed_values_cache.ts +0 -55
  503. package/src/private/index.ts +0 -16
  504. package/src/private/pick_notes.ts +0 -141
  505. package/src/private/private_execution.ts +0 -151
  506. package/src/private/private_execution_oracle.ts +0 -614
  507. package/src/private/providers/acvm_wasm.ts +0 -63
  508. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  509. package/src/private/providers/simulation_provider.ts +0 -45
  510. package/src/private/simulator.ts +0 -147
  511. package/src/private/unconstrained_execution.ts +0 -50
  512. package/src/private/unconstrained_execution_oracle.ts +0 -373
  513. package/src/public/avm/bytecode_utils.ts +0 -17
  514. package/src/public/avm/fixtures/index.ts +0 -296
  515. package/src/public/avm/journal/index.ts +0 -1
  516. package/src/public/avm/journal/journal.ts +0 -742
  517. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  518. package/src/public/bytecode_errors.ts +0 -6
  519. package/src/public/execution.ts +0 -140
  520. package/src/public/tx_contract_cache.ts +0 -69
  521. package/src/test/utils.ts +0 -36
@@ -1,6 +1,7 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
 
3
- import type { WorldStateDB } from '../../public_db_sources.js';
3
+ import type { PublicTreesDB } from '../public_db_sources.js';
4
+ import { NullifierCollisionError } from '../side_effect_errors.js';
4
5
 
5
6
  /**
6
7
  * A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
@@ -10,7 +11,7 @@ import type { WorldStateDB } from '../../public_db_sources.js';
10
11
  export class NullifierManager {
11
12
  constructor(
12
13
  /** Reference to node storage. Checked on parent cache-miss. */
13
- private readonly hostNullifiers: WorldStateDB,
14
+ private readonly hostNullifiers: PublicTreesDB,
14
15
  /** Cache of siloed nullifiers. */
15
16
  private cache: Set<bigint> = new Set(),
16
17
  /** Parent nullifier manager to fall back on */
@@ -64,8 +65,8 @@ export class NullifierManager {
64
65
  // `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]} low leaf index should always be found (even if target leaf does not exist)`,
65
66
  //);
66
67
  //existsInTree = leafOrLowLeafIndex.alreadyPresent;
67
- const leafIndex = await this.hostNullifiers.getNullifierIndex(siloedNullifier);
68
- existsInTree = leafIndex !== undefined;
68
+ const exists = await this.hostNullifiers.checkNullifierExists(siloedNullifier);
69
+ existsInTree = exists;
69
70
  }
70
71
  const exists = cacheHit || existsInTree;
71
72
  return Promise.resolve({ exists, cacheHit });
@@ -100,10 +101,3 @@ export class NullifierManager {
100
101
  this.cache = new Set([...this.cache, ...incomingNullifiers.cache]);
101
102
  }
102
103
  }
103
-
104
- export class NullifierCollisionError extends Error {
105
- constructor(message: string, ...rest: any[]) {
106
- super(message, ...rest);
107
- this.name = 'NullifierCollisionError';
108
- }
109
- }
@@ -1,7 +1,7 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
3
 
4
- import type { PublicStateDB } from '../../../common/db_interfaces.js';
4
+ import type { PublicStateDBInterface } from '../db_interfaces.js';
5
5
 
6
6
  type PublicStorageReadResult = {
7
7
  value: Fr;
@@ -19,7 +19,7 @@ export class PublicStorage {
19
19
 
20
20
  constructor(
21
21
  /** Reference to node storage. Checked on parent cache-miss. */
22
- private readonly hostPublicStorage: PublicStateDB,
22
+ private readonly hostPublicStorage: PublicStateDBInterface,
23
23
  /** Parent's storage. Checked on this' cache-miss. */
24
24
  private readonly parent?: PublicStorage,
25
25
  ) {
@@ -0,0 +1,560 @@
1
+ import {
2
+ CANONICAL_AUTH_REGISTRY_ADDRESS,
3
+ CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,
4
+ CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
5
+ FEE_JUICE_ADDRESS,
6
+ MULTI_CALL_ENTRYPOINT_ADDRESS,
7
+ ROUTER_ADDRESS,
8
+ } from '@aztec/constants';
9
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
10
+ import { Fr } from '@aztec/foundation/curves/bn254';
11
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
12
+ import { type LogLevel, createLogger } from '@aztec/foundation/log';
13
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
14
+ import { FunctionSelector } from '@aztec/stdlib/abi';
15
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
16
+ import type { ContractClassPublicWithCommitment, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
17
+ import { SerializableContractInstance } from '@aztec/stdlib/contract';
18
+ import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
19
+ import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
20
+ import type { DebugLog } from '@aztec/stdlib/logs';
21
+ import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
22
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
23
+ import type { TreeSnapshots } from '@aztec/stdlib/tx';
24
+ import type { UInt64 } from '@aztec/stdlib/types';
25
+
26
+ import { strict as assert } from 'assert';
27
+
28
+ import type { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
29
+ import type { PublicContractsDBInterface } from '../db_interfaces.js';
30
+ import { getPublicFunctionDebugName, getPublicFunctionSelectorAndName } from '../debug_fn_name.js';
31
+ import type { PublicTreesDB } from '../public_db_sources.js';
32
+ import {
33
+ L1ToL2MessageIndexOutOfRangeError,
34
+ MaxCallsToUniqueContractClassIdsError,
35
+ NoteHashIndexOutOfRangeError,
36
+ NullifierCollisionError,
37
+ } from '../side_effect_errors.js';
38
+ import type { PublicSideEffectTraceInterface } from '../side_effect_trace_interface.js';
39
+ import { NullifierManager } from './nullifiers.js';
40
+ import { PublicStorage } from './public_storage.js';
41
+
42
+ /**
43
+ * A class to manage persistable AVM state for contract calls.
44
+ * Maintains a cache of the current world state,
45
+ * a trace of all side effects.
46
+ *
47
+ * The simulator should make any world state / tree queries through this object.
48
+ *
49
+ * Manages merging of successful/reverted child state into current state.
50
+ */
51
+ export class PublicPersistableStateManager {
52
+ private readonly log = createLogger('simulator:state_manager');
53
+
54
+ /** Make sure a forked state is never merged twice. */
55
+ private alreadyMergedIntoParent = false;
56
+
57
+ constructor(
58
+ private readonly treesDB: PublicTreesDB,
59
+ private readonly contractsDB: PublicContractsDBInterface,
60
+ private readonly trace: PublicSideEffectTraceInterface,
61
+ private readonly firstNullifier: Fr, // Needed for note hashes.
62
+ private readonly timestamp: UInt64, // Needed for contract updates.
63
+ private readonly doMerkleOperations: boolean = true,
64
+ private readonly publicStorage: PublicStorage = new PublicStorage(treesDB),
65
+ private readonly nullifiers: NullifierManager = new NullifierManager(treesDB),
66
+ ) {}
67
+
68
+ /**
69
+ * Create a new state manager
70
+ */
71
+ public static create(
72
+ treesDB: PublicTreesDB,
73
+ contractsDB: PublicContractsDBInterface,
74
+ trace: PublicSideEffectTraceInterface,
75
+ firstNullifier: Fr,
76
+ timestamp: UInt64,
77
+ ): PublicPersistableStateManager {
78
+ return new PublicPersistableStateManager(treesDB, contractsDB, trace, firstNullifier, timestamp);
79
+ }
80
+
81
+ /**
82
+ * Create a new state manager forked from this one
83
+ */
84
+ public async fork() {
85
+ await this.treesDB.createCheckpoint();
86
+ return new PublicPersistableStateManager(
87
+ this.treesDB,
88
+ this.contractsDB,
89
+ this.trace.fork(),
90
+ this.firstNullifier,
91
+ this.timestamp,
92
+ this.doMerkleOperations,
93
+ this.publicStorage.fork(),
94
+ this.nullifiers.fork(),
95
+ );
96
+ }
97
+
98
+ /**
99
+ * Accept forked world state modifications & traced side effects / hints
100
+ */
101
+ public async merge(forkedState: PublicPersistableStateManager) {
102
+ await this._merge(forkedState, /*reverted=*/ false);
103
+ }
104
+
105
+ /**
106
+ * Reject forked world state modifications & traced side effects, keep traced hints
107
+ */
108
+ public async reject(forkedState: PublicPersistableStateManager) {
109
+ await this._merge(forkedState, /*reverted=*/ true);
110
+ }
111
+
112
+ private async _merge(forkedState: PublicPersistableStateManager, reverted: boolean) {
113
+ // sanity check to avoid merging the same forked trace twice
114
+ assert(
115
+ !forkedState.alreadyMergedIntoParent,
116
+ 'Cannot merge forked state that has already been merged into its parent!',
117
+ );
118
+ forkedState.alreadyMergedIntoParent = true;
119
+ this.publicStorage.acceptAndMerge(forkedState.publicStorage);
120
+ this.nullifiers.acceptAndMerge(forkedState.nullifiers);
121
+ this.trace.merge(forkedState.trace, reverted);
122
+ if (reverted) {
123
+ this.log.trace('Reverting forked state...');
124
+ await this.treesDB.revertCheckpoint();
125
+ } else {
126
+ this.log.trace('Merging forked state into parent...');
127
+ await this.treesDB.commitCheckpoint();
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Write to public storage, journal/trace the write.
133
+ *
134
+ * @param contractAddress - the address of the contract whose storage is being written to
135
+ * @param slot - the slot in the contract's storage being written to
136
+ * @param value - the value being written to the slot
137
+ */
138
+ public async writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite = false): Promise<void> {
139
+ this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}`);
140
+
141
+ await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
142
+
143
+ if (this.doMerkleOperations) {
144
+ // write to native merkle trees
145
+ await this.treesDB.storageWrite(contractAddress, slot, value);
146
+ } else {
147
+ // Cache storage writes for later reference/reads
148
+ this.publicStorage.write(contractAddress, slot, value);
149
+ }
150
+ }
151
+
152
+ public isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean {
153
+ return this.trace.isStorageCold(contractAddress, slot);
154
+ }
155
+
156
+ /**
157
+ * Read from public storage.
158
+ *
159
+ * @param contractAddress - the address of the contract whose storage is being read from
160
+ * @param slot - the slot in the contract's storage being read from
161
+ * @returns the latest value written to slot, or 0 if never written to before
162
+ */
163
+ public async readStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
164
+ if (this.doMerkleOperations) {
165
+ return await this.treesDB.storageRead(contractAddress, slot);
166
+ } else {
167
+ const read = await this.publicStorage.read(contractAddress, slot);
168
+ this.log.trace(
169
+ `Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`,
170
+ );
171
+ return read.value;
172
+ }
173
+ }
174
+
175
+ // TODO(4886): We currently don't silo note hashes.
176
+ /**
177
+ * Check if a note hash exists at the given leaf index, trace the check.
178
+ *
179
+ * @param contractAddress - the address of the contract whose storage is being read from
180
+ * @param noteHash - the unsiloed note hash being checked
181
+ * @param leafIndex - the leaf index being checked
182
+ * @returns true if the note hash exists at the given leaf index, false otherwise
183
+ */
184
+ public async checkNoteHashExists(contractAddress: AztecAddress, noteHash: Fr, leafIndex: bigint): Promise<boolean> {
185
+ try {
186
+ const gotLeafValue = await this.treesDB.getNoteHash(leafIndex);
187
+ const exists = gotLeafValue.equals(noteHash);
188
+ this.log.trace(
189
+ `noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
190
+ );
191
+ return Promise.resolve(exists);
192
+ } catch (error) {
193
+ // If the index is out of range, note_hash_leaf_in_range = 0 and the circuit returns false:
194
+ if (error instanceof NoteHashIndexOutOfRangeError) {
195
+ return Promise.resolve(false);
196
+ }
197
+ // Otherwise, unknown error. This is a bug.
198
+ throw error;
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Write a raw note hash, silo it and make it unique, then trace the write.
204
+ * @param noteHash - the unsiloed note hash to write
205
+ */
206
+ public async writeNoteHash(contractAddress: AztecAddress, noteHash: Fr): Promise<void> {
207
+ this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
208
+ const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
209
+ await this.writeSiloedNoteHash(siloedNoteHash);
210
+ }
211
+
212
+ /**
213
+ * Write a note hash, make it unique, trace the write.
214
+ * @param siloedNoteHash - the non unique note hash to write
215
+ */
216
+ public async writeSiloedNoteHash(siloedNoteHash: Fr): Promise<void> {
217
+ const noteNonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
218
+ const uniqueNoteHash = await computeUniqueNoteHash(noteNonce, siloedNoteHash);
219
+ await this.writeUniqueNoteHash(uniqueNoteHash);
220
+ }
221
+
222
+ /**
223
+ * Write a note hash, trace the write.
224
+ * @param uniqueNoteHash - the siloed unique hash to write
225
+ */
226
+ public async writeUniqueNoteHash(uniqueNoteHash: Fr): Promise<void> {
227
+ this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
228
+ this.trace.traceNewNoteHash(uniqueNoteHash);
229
+ if (this.doMerkleOperations) {
230
+ await this.treesDB.writeNoteHash(uniqueNoteHash);
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Check if a nullifier exists, trace the check.
236
+ * @param contractAddress - address of the contract that the nullifier is associated with
237
+ * @param nullifier - the unsiloed nullifier to check
238
+ * @returns exists - whether the nullifier exists in the nullifier set
239
+ */
240
+ public async checkNullifierExists(contractAddress: AztecAddress, nullifier: Fr): Promise<boolean> {
241
+ this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
242
+ const siloedNullifier = await siloNullifier(contractAddress, nullifier);
243
+
244
+ if (this.doMerkleOperations) {
245
+ const exists = await this.treesDB.checkNullifierExists(siloedNullifier);
246
+ this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists})`);
247
+ return Promise.resolve(exists);
248
+ } else {
249
+ const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
250
+ this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
251
+ return Promise.resolve(exists);
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Write a nullifier to the nullifier set, trace the write.
257
+ * @param contractAddress - address of the contract that the nullifier is associated with
258
+ * @param nullifier - the unsiloed nullifier to write
259
+ */
260
+ public async writeNullifier(contractAddress: AztecAddress, nullifier: Fr) {
261
+ this.log.trace(`Inserting new nullifier (address=${nullifier}, nullifier=${contractAddress})`);
262
+ const siloedNullifier = await siloNullifier(contractAddress, nullifier);
263
+ await this.writeSiloedNullifier(siloedNullifier);
264
+ }
265
+
266
+ /**
267
+ * Write a nullifier to the nullifier set, trace the write.
268
+ * @param siloedNullifier - the siloed nullifier to write
269
+ */
270
+ public async writeSiloedNullifier(siloedNullifier: Fr) {
271
+ this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
272
+
273
+ this.trace.traceNewNullifier(siloedNullifier);
274
+
275
+ if (this.doMerkleOperations) {
276
+ const exists = await this.treesDB.checkNullifierExists(siloedNullifier);
277
+
278
+ if (exists) {
279
+ this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree!`);
280
+ throw new NullifierCollisionError(
281
+ `Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`,
282
+ );
283
+ } else {
284
+ await this.treesDB.writeNullifier(siloedNullifier);
285
+ }
286
+ } else {
287
+ // Cache pending nullifiers for later access
288
+ await this.nullifiers.append(siloedNullifier);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Check if an L1 to L2 message exists, trace the check.
294
+ * @param msgHash - the message hash to check existence of
295
+ * @param msgLeafIndex - the message leaf index to use in the check
296
+ * @returns exists - whether the message exists in the L1 to L2 Messages tree
297
+ */
298
+ public async checkL1ToL2MessageExists(msgHash: Fr, msgLeafIndex: Fr): Promise<boolean> {
299
+ try {
300
+ const valueAtIndex = await this.treesDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt());
301
+ const exists = valueAtIndex.equals(msgHash);
302
+ this.log.trace(
303
+ `l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
304
+ );
305
+ return Promise.resolve(exists);
306
+ } catch (error) {
307
+ // If the index is out of range, l1_to_l2_msg_leaf_in_range = 0 and the circuit returns false:
308
+ if (error instanceof L1ToL2MessageIndexOutOfRangeError) {
309
+ return Promise.resolve(false);
310
+ }
311
+ // Otherwise, unknown error. This is a bug.
312
+ throw error;
313
+ }
314
+ }
315
+
316
+ /**
317
+ * Write an L2 to L1 message.
318
+ * @param contractAddress - L2 contract address that created this message
319
+ * @param recipient - L1 contract address to send the message to.
320
+ * @param content - Message content.
321
+ */
322
+ public writeL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
323
+ this.log.trace(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
324
+ this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
325
+ }
326
+
327
+ /**
328
+ * Write a scoped L2 to L1 message.
329
+ * @param l2ToL1Message - The L2 to L1 message to write.
330
+ */
331
+ public writeScopedL2ToL1Message(l2ToL1Message: ScopedL2ToL1Message) {
332
+ this.writeL2ToL1Message(
333
+ l2ToL1Message.contractAddress,
334
+ l2ToL1Message.message.recipient.toField(),
335
+ l2ToL1Message.message.content,
336
+ );
337
+ }
338
+
339
+ public writeDebugLog(contractAddress: AztecAddress, level: LogLevel, message: string, fields: Fr[]) {
340
+ this.trace.traceDebugLog(contractAddress, level, message, fields);
341
+ }
342
+
343
+ public writeDebugLogMemoryReads(memoryReads: number) {
344
+ this.trace.traceDebugLogMemoryReads(memoryReads);
345
+ }
346
+
347
+ public getDebugLogMemoryReads() {
348
+ return this.trace.getDebugLogMemoryReads();
349
+ }
350
+
351
+ public getLogs(): DebugLog[] {
352
+ return this.trace.getDebugLogs();
353
+ }
354
+
355
+ /**
356
+ * Write a public log
357
+ * @param contractAddress - address of the contract that emitted the log
358
+ * @param log - log contents
359
+ */
360
+ public writePublicLog(contractAddress: AztecAddress, log: Fr[]) {
361
+ this.log.trace(`PublicLog(${contractAddress}) += event with ${log.length} fields.`);
362
+ this.trace.tracePublicLog(contractAddress, log);
363
+ }
364
+
365
+ /**
366
+ * Get a contract instance.
367
+ * @param contractAddress - address of the contract instance to retrieve.
368
+ * @returns the contract instance or undefined if it does not exist.
369
+ */
370
+ public async getContractInstance(contractAddress: AztecAddress): Promise<SerializableContractInstance | undefined> {
371
+ this.log.trace(`Getting contract instance for address ${contractAddress}`);
372
+ const instanceWithAddress = await this.contractsDB.getContractInstance(contractAddress, this.timestamp);
373
+ const exists = instanceWithAddress !== undefined;
374
+
375
+ const instance = exists ? new SerializableContractInstance(instanceWithAddress) : undefined;
376
+
377
+ if (contractAddressIsCanonical(contractAddress)) {
378
+ this.log.trace(
379
+ `Got canonical contract instance (address=${contractAddress}): instance=${jsonStringify(instance!)}`,
380
+ );
381
+ return instance;
382
+ }
383
+
384
+ // Nullifier check! We do this regardless of whether or not the instance exists,
385
+ // as even for non-existence, we need to generate nullifier check hints.
386
+
387
+ // This will internally decide whether to check the nullifier tree or not depending on doMerkleOperations.
388
+ const nullifierExistsInTree = await this.checkNullifierExists(
389
+ AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS),
390
+ contractAddress.toField(),
391
+ );
392
+ assert(
393
+ exists == nullifierExistsInTree,
394
+ `Contract instance for address ${contractAddress} in DB: ${exists} != nullifier tree: ${nullifierExistsInTree}. This is a bug!`,
395
+ );
396
+
397
+ if (!exists) {
398
+ this.log.debug(`Contract instance NOT FOUND (address=${contractAddress})`);
399
+ return undefined;
400
+ }
401
+
402
+ this.log.trace(`Got contract instance (address=${contractAddress}): instance=${jsonStringify(instance!)}`);
403
+
404
+ // All that is left is to check that the contract updatability information is correct.
405
+ // That is, that the current and original contract class ids are correct.
406
+ await this.checkContractUpdateInformation(instanceWithAddress);
407
+
408
+ return instance;
409
+ }
410
+
411
+ private async checkContractUpdateInformation(instance: ContractInstanceWithAddress): Promise<void> {
412
+ // If "merkle operations" are not requested, we trust the DB.
413
+ // Otherwise we check that the contract updatability information is correct.
414
+ // That is, that the current and original contract class ids are correct.
415
+ // All failures are fatal and the simulation is not expected to be provable.
416
+ if (this.doMerkleOperations) {
417
+ // Conceptually, we want to do the following:
418
+ // * Read a DelayedPublicMutable at the contract update slot.
419
+ // * Obtain the expected current class id from the DelayedPublicMutable, at the current block.
420
+ // * if expectedId == 0 then currentClassId should be original contract class id
421
+ // * if expectedId != 0 then currentClassId should be expectedId
422
+ //
423
+ // However, we will also be checking the hash of the delayed public mutable values.
424
+ // This is a bit of a leak of information, since the circuit will use it to prove
425
+ // one public read instead of N of the delayed public mutable values.
426
+ const { delayedPublicMutableSlot, delayedPublicMutableHashSlot } =
427
+ await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(instance.address);
428
+ const readDeployerStorage = async (storageSlot: Fr) =>
429
+ await this.readStorage(ProtocolContractAddress.ContractInstanceRegistry, storageSlot);
430
+
431
+ const hash = await readDeployerStorage(delayedPublicMutableHashSlot);
432
+ // NOTE: The below reads are either not performed (if hash.isZero()) or only performed in unconstrained in c++ simulation.
433
+ // See UpdateCheck::check_current_class_id documentation - this means if we generate hints from the merkle db, they are unused:
434
+ const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(
435
+ delayedPublicMutableSlot,
436
+ readDeployerStorage,
437
+ );
438
+ const preImage = delayedPublicMutableValues.toFields();
439
+
440
+ // 1) update never scheduled: hash == 0 and preimage should be empty (but poseidon2hash(preimage) will not be 0s)
441
+ if (hash.isZero()) {
442
+ assert(
443
+ preImage.every(f => f.isZero()),
444
+ `Found updatability hash 0 but preimage is not empty for contract instance ${instance.address}.`,
445
+ );
446
+ assert(
447
+ instance.currentContractClassId.equals(instance.originalContractClassId),
448
+ `Found updatability hash 0 for contract instance ${instance.address} but original class id ${instance.originalContractClassId} != current class id ${instance.currentContractClassId}.`,
449
+ );
450
+ return;
451
+ }
452
+
453
+ // 2) At this point we know that the hash is not zero and this means that an update has at some point been scheduled.
454
+ const computedHash = await poseidon2Hash(preImage);
455
+ assert(
456
+ hash.equals(computedHash),
457
+ `Delayed public mutable values hash mismatch for contract instance ${instance.address}. Expected: ${hash}, computed: ${computedHash}`,
458
+ );
459
+
460
+ // We now check that, depending on the current block, the current class id is correct.
461
+ const expectedClassIdRaw = delayedPublicMutableValues.svc.getCurrentAt(this.timestamp).at(0)!;
462
+ const expectedClassId = expectedClassIdRaw.isZero() ? instance.originalContractClassId : expectedClassIdRaw;
463
+ assert(
464
+ instance.currentContractClassId.equals(expectedClassId),
465
+ `Current class id mismatch
466
+ for contract instance ${instance.address}. Expected: ${expectedClassId}, current: ${instance.currentContractClassId}`,
467
+ );
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Get a contract class.
473
+ * @param classId - class id to retrieve.
474
+ * @returns the contract class or undefined if it does not exist.
475
+ */
476
+ private async getContractClass(classId: Fr): Promise<ContractClassPublicWithCommitment | undefined> {
477
+ this.log.trace(`Getting contract class for id ${classId}`);
478
+ const contractClass = await this.contractsDB.getContractClass(classId);
479
+ const exists = contractClass !== undefined;
480
+ let extendedClass: ContractClassPublicWithCommitment | undefined = undefined;
481
+
482
+ // Note: We currently do not generate info to check the nullifier tree, because
483
+ // this is not needed for our use cases.
484
+ if (exists) {
485
+ this.log.trace(`Got contract class (id=${classId})`);
486
+ // Extend class information with public bytecode commitment.
487
+ const bytecodeCommitment = await this.contractsDB.getBytecodeCommitment(classId);
488
+ assert(
489
+ bytecodeCommitment,
490
+ `Bytecode commitment was not found in DB for contract class (${classId}). This should not happen!`,
491
+ );
492
+ extendedClass = {
493
+ ...contractClass,
494
+ publicBytecodeCommitment: bytecodeCommitment,
495
+ };
496
+ } else {
497
+ this.log.debug(`Contract class NOT FOUND (id=${classId})`);
498
+ }
499
+
500
+ // TODO(dbanks12): does this need to be moved to before the DB accesses as was done with writeNullifier?
501
+ this.trace.traceGetContractClass(classId, exists);
502
+ return extendedClass;
503
+ }
504
+
505
+ /**
506
+ * Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
507
+ */
508
+ public async getBytecode(contractAddress: AztecAddress): Promise<Buffer | undefined> {
509
+ this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
510
+ const contractInstance = await this.getContractInstance(contractAddress);
511
+
512
+ if (!contractInstance) {
513
+ return undefined;
514
+ }
515
+
516
+ try {
517
+ const contractClass = await this.getContractClass(contractInstance.currentContractClassId);
518
+ assert(
519
+ contractClass,
520
+ `Contract class not found in DB, but a contract instance was found with this class ID (${contractInstance.currentContractClassId}). This should not happen!`,
521
+ );
522
+ return contractClass.packedBytecode;
523
+ } catch (error) {
524
+ if (error instanceof MaxCallsToUniqueContractClassIdsError) {
525
+ return undefined;
526
+ }
527
+ // Otherwise, unknown error. This is a bug.
528
+ throw error;
529
+ }
530
+ }
531
+
532
+ public async getPublicFunctionDebugName(avmEnvironment: AvmExecutionEnvironment): Promise<string> {
533
+ return await getPublicFunctionDebugName(this.contractsDB, avmEnvironment.address, avmEnvironment.calldata);
534
+ }
535
+
536
+ public async getPublicFunctionSelectorAndName(
537
+ avmEnvironment: AvmExecutionEnvironment,
538
+ ): Promise<{ functionSelector?: FunctionSelector; functionName?: string }> {
539
+ return await getPublicFunctionSelectorAndName(this.contractsDB, avmEnvironment.address, avmEnvironment.calldata);
540
+ }
541
+
542
+ public async padTree(treeId: MerkleTreeId, leavesToInsert: number): Promise<void> {
543
+ await this.treesDB.padTree(treeId, leavesToInsert);
544
+ }
545
+
546
+ public async getTreeSnapshots(): Promise<TreeSnapshots> {
547
+ return await this.treesDB.getTreeSnapshots();
548
+ }
549
+ }
550
+
551
+ function contractAddressIsCanonical(contractAddress: AztecAddress): boolean {
552
+ return (
553
+ contractAddress.equals(AztecAddress.fromNumber(CANONICAL_AUTH_REGISTRY_ADDRESS)) ||
554
+ contractAddress.equals(AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS)) ||
555
+ contractAddress.equals(AztecAddress.fromNumber(CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS)) ||
556
+ contractAddress.equals(AztecAddress.fromNumber(MULTI_CALL_ENTRYPOINT_ADDRESS)) ||
557
+ contractAddress.equals(AztecAddress.fromNumber(FEE_JUICE_ADDRESS)) ||
558
+ contractAddress.equals(AztecAddress.fromNumber(ROUTER_ADDRESS))
559
+ );
560
+ }