@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.5476d83

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 (492) 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 +5 -14
  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 +18 -19
  19. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  20. package/dest/private/acvm/deserialize.js +31 -23
  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 +20 -3
  25. package/dest/private/acvm/serialize.d.ts.map +1 -1
  26. package/dest/private/acvm/serialize.js +53 -0
  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 +6 -6
  55. package/dest/public/avm/avm_context.d.ts.map +1 -1
  56. package/dest/public/avm/avm_contract_call_result.d.ts +5 -3
  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 +4 -2
  60. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  61. package/dest/public/avm/avm_execution_environment.js +4 -2
  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 +3 -1
  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 +99 -88
  69. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  70. package/dest/public/avm/avm_memory_types.js +17 -6
  71. package/dest/public/avm/avm_simulator.d.ts +6 -6
  72. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  73. package/dest/public/avm/avm_simulator.js +23 -35
  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 +7 -31
  78. package/dest/public/avm/errors.d.ts.map +1 -1
  79. package/dest/public/avm/errors.js +7 -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 +22 -15
  83. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +7 -5
  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 +37 -14
  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 +38 -0
  90. package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
  91. package/dest/public/avm/fixtures/utils.js +95 -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 +17 -7
  102. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  103. package/dest/public/avm/opcodes/arithmetic.js +16 -2
  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 +6 -6
  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 +6 -6
  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 +38 -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 +70 -69
  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 +11 -14
  158. package/dest/public/avm/test_utils.d.ts.map +1 -1
  159. package/dest/public/avm/test_utils.js +16 -24
  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 +5 -0
  167. package/dest/public/debug_fn_name.d.ts.map +1 -0
  168. package/dest/public/debug_fn_name.js +9 -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 +326 -0
  181. package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
  182. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
  183. package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
  184. package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
  185. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
  186. package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
  187. package/dest/public/fixtures/index.d.ts +8 -1
  188. package/dest/public/fixtures/index.d.ts.map +1 -1
  189. package/dest/public/fixtures/index.js +7 -0
  190. package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
  191. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  192. package/dest/public/fixtures/minimal_public_tx.js +29 -0
  193. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -14
  194. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  195. package/dest/public/fixtures/public_tx_simulation_tester.js +100 -71
  196. package/dest/public/fixtures/simple_contract_data_source.d.ts +35 -0
  197. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
  198. package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
  199. package/dest/public/fixtures/token_test.d.ts +8 -0
  200. package/dest/public/fixtures/token_test.d.ts.map +1 -0
  201. package/dest/public/fixtures/token_test.js +94 -0
  202. package/dest/public/fixtures/utils.d.ts +17 -4
  203. package/dest/public/fixtures/utils.d.ts.map +1 -1
  204. package/dest/public/fixtures/utils.js +100 -58
  205. package/dest/public/hinting_db_sources.d.ts +78 -0
  206. package/dest/public/hinting_db_sources.d.ts.map +1 -0
  207. package/dest/public/hinting_db_sources.js +350 -0
  208. package/dest/public/index.d.ts +6 -9
  209. package/dest/public/index.d.ts.map +1 -1
  210. package/dest/public/index.js +4 -7
  211. package/dest/public/public_db_sources.d.ts +51 -101
  212. package/dest/public/public_db_sources.d.ts.map +1 -1
  213. package/dest/public/public_db_sources.js +219 -192
  214. package/dest/public/public_errors.d.ts +12 -0
  215. package/dest/public/public_errors.d.ts.map +1 -0
  216. package/dest/public/public_errors.js +13 -0
  217. package/dest/public/public_processor/guarded_merkle_tree.d.ts +49 -0
  218. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  219. package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
  220. package/dest/public/public_processor/public_processor.d.ts +25 -37
  221. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  222. package/dest/public/public_processor/public_processor.js +154 -111
  223. package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
  224. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  225. package/dest/public/public_processor/public_processor_metrics.js +1 -1
  226. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +30 -0
  227. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  228. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +133 -0
  229. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +66 -0
  230. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
  231. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +210 -0
  232. package/dest/public/public_tx_simulator/index.d.ts +5 -0
  233. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  234. package/dest/public/public_tx_simulator/index.js +2 -0
  235. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
  236. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  237. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
  238. package/dest/public/public_tx_simulator/public_tx_context.d.ts +23 -30
  239. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  240. package/dest/public/public_tx_simulator/public_tx_context.js +71 -91
  241. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -58
  242. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  243. package/dest/public/public_tx_simulator/public_tx_simulator.js +208 -206
  244. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -0
  245. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
  246. package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
  247. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
  248. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  249. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  250. package/dest/public/side_effect_errors.d.ts +42 -2
  251. package/dest/public/side_effect_errors.d.ts.map +1 -1
  252. package/dest/public/side_effect_errors.js +70 -1
  253. package/dest/public/side_effect_trace.d.ts +21 -67
  254. package/dest/public/side_effect_trace.d.ts.map +1 -1
  255. package/dest/public/side_effect_trace.js +71 -121
  256. package/dest/public/side_effect_trace_interface.d.ts +12 -24
  257. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  258. package/dest/public/state_manager/index.d.ts +2 -0
  259. package/dest/public/state_manager/index.d.ts.map +1 -0
  260. package/dest/public/state_manager/index.js +1 -0
  261. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +3 -6
  262. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  263. package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
  264. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +3 -3
  265. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  266. package/dest/public/state_manager/state_manager.d.ts +159 -0
  267. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  268. package/dest/public/state_manager/state_manager.js +392 -0
  269. package/dest/public/test_executor_metrics.d.ts +55 -0
  270. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  271. package/dest/public/test_executor_metrics.js +307 -0
  272. package/dest/public/unique_class_ids.d.ts +1 -1
  273. package/dest/public/unique_class_ids.d.ts.map +1 -1
  274. package/dest/public/utils.d.ts +3 -5
  275. package/dest/public/utils.d.ts.map +1 -1
  276. package/dest/public/utils.js +4 -21
  277. package/dest/server.d.ts +7 -4
  278. package/dest/server.d.ts.map +1 -1
  279. package/dest/server.js +5 -2
  280. package/dest/testing.d.ts +2 -0
  281. package/dest/testing.d.ts.map +1 -0
  282. package/dest/testing.js +1 -0
  283. package/package.json +39 -33
  284. package/src/client.ts +5 -3
  285. package/src/common/errors.ts +79 -44
  286. package/src/common/index.ts +0 -1
  287. package/src/private/acvm/acvm.ts +17 -32
  288. package/src/private/acvm/acvm_types.ts +1 -1
  289. package/src/private/acvm/deserialize.ts +35 -29
  290. package/src/private/acvm/index.ts +0 -1
  291. package/src/private/acvm/serialize.ts +63 -0
  292. package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
  293. package/src/private/acvm_wasm.ts +72 -0
  294. package/src/private/acvm_wasm_with_blobs.ts +54 -0
  295. package/src/private/circuit_recording/circuit_recorder.ts +260 -0
  296. package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
  297. package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -0
  298. package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
  299. package/src/private/circuit_simulator.ts +90 -0
  300. package/src/private/{providers/factory.ts → factory.ts} +6 -6
  301. package/src/public/avm/avm_context.ts +4 -4
  302. package/src/public/avm/avm_contract_call_result.ts +17 -5
  303. package/src/public/avm/avm_execution_environment.ts +8 -1
  304. package/src/public/avm/avm_gas.ts +23 -35
  305. package/src/public/avm/avm_machine_state.ts +5 -0
  306. package/src/public/avm/avm_memory_types.ts +19 -6
  307. package/src/public/avm/avm_simulator.ts +43 -54
  308. package/src/public/avm/avm_simulator_interface.ts +8 -0
  309. package/src/public/avm/errors.ts +8 -77
  310. package/src/public/avm/fixtures/avm_simulation_tester.ts +32 -21
  311. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
  312. package/src/public/avm/fixtures/initializers.ts +102 -0
  313. package/src/public/avm/fixtures/utils.ts +150 -0
  314. package/src/public/avm/index.ts +0 -2
  315. package/src/public/avm/opcodes/accrued_substate.ts +64 -29
  316. package/src/public/avm/opcodes/addressing_mode.ts +56 -32
  317. package/src/public/avm/opcodes/arithmetic.ts +24 -2
  318. package/src/public/avm/opcodes/bitwise.ts +33 -29
  319. package/src/public/avm/opcodes/comparators.ts +6 -3
  320. package/src/public/avm/opcodes/contract.ts +10 -7
  321. package/src/public/avm/opcodes/control_flow.ts +19 -10
  322. package/src/public/avm/opcodes/conversion.ts +27 -3
  323. package/src/public/avm/opcodes/ec_add.ts +9 -6
  324. package/src/public/avm/opcodes/environment_getters.ts +27 -22
  325. package/src/public/avm/opcodes/external_calls.ts +61 -29
  326. package/src/public/avm/opcodes/hashing.ts +28 -8
  327. package/src/public/avm/opcodes/instruction.ts +31 -21
  328. package/src/public/avm/opcodes/memory.ts +71 -32
  329. package/src/public/avm/opcodes/misc.ts +60 -18
  330. package/src/public/avm/opcodes/storage.ts +22 -6
  331. package/src/public/avm/revert_reason.ts +55 -0
  332. package/src/public/avm/serialization/buffer_cursor.ts +4 -1
  333. package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
  334. package/src/public/avm/serialization/instruction_serialization.ts +75 -34
  335. package/src/public/avm/test_utils.ts +24 -41
  336. package/src/public/contracts_db_checkpoint.ts +41 -0
  337. package/src/public/db_interfaces.ts +76 -0
  338. package/src/{common → public}/debug_fn_name.ts +7 -7
  339. package/src/public/executor_metrics.ts +56 -6
  340. package/src/public/executor_metrics_interface.ts +15 -0
  341. package/src/public/fixtures/amm_test.ts +331 -0
  342. package/src/public/fixtures/bulk_test.ts +169 -0
  343. package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
  344. package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
  345. package/src/public/fixtures/index.ts +7 -0
  346. package/src/public/fixtures/minimal_public_tx.ts +35 -0
  347. package/src/public/fixtures/public_tx_simulation_tester.ts +166 -113
  348. package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
  349. package/src/public/fixtures/token_test.ts +139 -0
  350. package/src/public/fixtures/utils.ts +141 -68
  351. package/src/public/hinting_db_sources.ts +602 -0
  352. package/src/public/index.ts +5 -8
  353. package/src/public/public_db_sources.ts +278 -258
  354. package/src/public/public_errors.ts +14 -0
  355. package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
  356. package/src/public/public_processor/public_processor.ts +212 -164
  357. package/src/public/public_processor/public_processor_metrics.ts +2 -2
  358. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +162 -0
  359. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +306 -0
  360. package/src/public/public_tx_simulator/index.ts +4 -0
  361. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
  362. package/src/public/public_tx_simulator/public_tx_context.ts +167 -194
  363. package/src/public/public_tx_simulator/public_tx_simulator.ts +292 -265
  364. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +10 -0
  365. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
  366. package/src/public/side_effect_errors.ts +91 -1
  367. package/src/public/side_effect_trace.ts +94 -320
  368. package/src/public/side_effect_trace_interface.ts +10 -58
  369. package/src/public/state_manager/index.ts +1 -0
  370. package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
  371. package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
  372. package/src/public/state_manager/state_manager.ts +553 -0
  373. package/src/public/test_executor_metrics.ts +397 -0
  374. package/src/public/utils.ts +5 -21
  375. package/src/server.ts +6 -3
  376. package/src/testing.ts +1 -0
  377. package/dest/common/db_interfaces.d.ts +0 -80
  378. package/dest/common/db_interfaces.d.ts.map +0 -1
  379. package/dest/common/db_interfaces.js +0 -1
  380. package/dest/common/debug_fn_name.d.ts +0 -5
  381. package/dest/common/debug_fn_name.d.ts.map +0 -1
  382. package/dest/common/debug_fn_name.js +0 -6
  383. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  384. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  385. package/dest/common/message_load_oracle_inputs.js +0 -15
  386. package/dest/private/acvm/oracle/index.d.ts +0 -14
  387. package/dest/private/acvm/oracle/index.d.ts.map +0 -1
  388. package/dest/private/acvm/oracle/index.js +0 -2
  389. package/dest/private/acvm/oracle/oracle.d.ts +0 -49
  390. package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
  391. package/dest/private/acvm/oracle/oracle.js +0 -263
  392. package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
  393. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
  394. package/dest/private/acvm/oracle/typed_oracle.js +0 -132
  395. package/dest/private/execution_data_provider.d.ts +0 -261
  396. package/dest/private/execution_data_provider.d.ts.map +0 -1
  397. package/dest/private/execution_data_provider.js +0 -14
  398. package/dest/private/execution_note_cache.d.ts +0 -93
  399. package/dest/private/execution_note_cache.d.ts.map +0 -1
  400. package/dest/private/execution_note_cache.js +0 -180
  401. package/dest/private/hashed_values_cache.d.ts +0 -28
  402. package/dest/private/hashed_values_cache.d.ts.map +0 -1
  403. package/dest/private/hashed_values_cache.js +0 -46
  404. package/dest/private/index.d.ts +0 -13
  405. package/dest/private/index.d.ts.map +0 -1
  406. package/dest/private/index.js +0 -12
  407. package/dest/private/pick_notes.d.ts +0 -85
  408. package/dest/private/pick_notes.d.ts.map +0 -1
  409. package/dest/private/pick_notes.js +0 -51
  410. package/dest/private/private_execution.d.ts +0 -25
  411. package/dest/private/private_execution.d.ts.map +0 -1
  412. package/dest/private/private_execution.js +0 -92
  413. package/dest/private/private_execution_oracle.d.ts +0 -215
  414. package/dest/private/private_execution_oracle.d.ts.map +0 -1
  415. package/dest/private/private_execution_oracle.js +0 -382
  416. package/dest/private/providers/acvm_native.d.ts +0 -40
  417. package/dest/private/providers/acvm_native.d.ts.map +0 -1
  418. package/dest/private/providers/acvm_wasm.d.ts +0 -15
  419. package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
  420. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
  421. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  422. package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
  423. package/dest/private/providers/factory.d.ts +0 -12
  424. package/dest/private/providers/factory.d.ts.map +0 -1
  425. package/dest/private/providers/simulation_provider.d.ts +0 -19
  426. package/dest/private/providers/simulation_provider.d.ts.map +0 -1
  427. package/dest/private/providers/simulation_provider.js +0 -24
  428. package/dest/private/simulator.d.ts +0 -34
  429. package/dest/private/simulator.d.ts.map +0 -1
  430. package/dest/private/simulator.js +0 -76
  431. package/dest/private/unconstrained_execution.d.ts +0 -10
  432. package/dest/private/unconstrained_execution.d.ts.map +0 -1
  433. package/dest/private/unconstrained_execution.js +0 -27
  434. package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
  435. package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
  436. package/dest/private/unconstrained_execution_oracle.js +0 -258
  437. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  438. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  439. package/dest/public/avm/bytecode_utils.js +0 -17
  440. package/dest/public/avm/fixtures/index.d.ts +0 -84
  441. package/dest/public/avm/fixtures/index.d.ts.map +0 -1
  442. package/dest/public/avm/fixtures/index.js +0 -175
  443. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
  444. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  445. package/dest/public/avm/journal/index.d.ts +0 -2
  446. package/dest/public/avm/journal/index.d.ts.map +0 -1
  447. package/dest/public/avm/journal/index.js +0 -1
  448. package/dest/public/avm/journal/journal.d.ts +0 -209
  449. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  450. package/dest/public/avm/journal/journal.js +0 -486
  451. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  452. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  453. package/dest/public/bytecode_errors.d.ts +0 -4
  454. package/dest/public/bytecode_errors.d.ts.map +0 -1
  455. package/dest/public/bytecode_errors.js +0 -6
  456. package/dest/public/execution.d.ts +0 -108
  457. package/dest/public/execution.d.ts.map +0 -1
  458. package/dest/public/execution.js +0 -9
  459. package/dest/public/tx_contract_cache.d.ts +0 -41
  460. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  461. package/dest/public/tx_contract_cache.js +0 -49
  462. package/dest/test/utils.d.ts +0 -13
  463. package/dest/test/utils.d.ts.map +0 -1
  464. package/dest/test/utils.js +0 -22
  465. package/src/common/db_interfaces.ts +0 -94
  466. package/src/common/message_load_oracle_inputs.ts +0 -15
  467. package/src/private/acvm/oracle/index.ts +0 -16
  468. package/src/private/acvm/oracle/oracle.ts +0 -455
  469. package/src/private/acvm/oracle/typed_oracle.ts +0 -259
  470. package/src/private/execution_data_provider.ts +0 -323
  471. package/src/private/execution_note_cache.ts +0 -217
  472. package/src/private/hashed_values_cache.ts +0 -55
  473. package/src/private/index.ts +0 -16
  474. package/src/private/pick_notes.ts +0 -141
  475. package/src/private/private_execution.ts +0 -151
  476. package/src/private/private_execution_oracle.ts +0 -614
  477. package/src/private/providers/acvm_wasm.ts +0 -63
  478. package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
  479. package/src/private/providers/simulation_provider.ts +0 -45
  480. package/src/private/simulator.ts +0 -147
  481. package/src/private/unconstrained_execution.ts +0 -50
  482. package/src/private/unconstrained_execution_oracle.ts +0 -373
  483. package/src/public/avm/bytecode_utils.ts +0 -17
  484. package/src/public/avm/fixtures/index.ts +0 -296
  485. package/src/public/avm/journal/index.ts +0 -1
  486. package/src/public/avm/journal/journal.ts +0 -742
  487. package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
  488. package/src/public/bytecode_errors.ts +0 -6
  489. package/src/public/execution.ts +0 -140
  490. package/src/public/tx_contract_cache.ts +0 -69
  491. package/src/test/utils.ts +0 -36
  492. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -1,742 +0,0 @@
1
- import {
2
- CANONICAL_AUTH_REGISTRY_ADDRESS,
3
- DEPLOYER_CONTRACT_ADDRESS,
4
- FEE_JUICE_ADDRESS,
5
- MULTI_CALL_ENTRYPOINT_ADDRESS,
6
- REGISTERER_CONTRACT_ADDRESS,
7
- ROUTER_ADDRESS,
8
- } from '@aztec/constants';
9
- import { poseidon2Hash } from '@aztec/foundation/crypto';
10
- import { Fr } from '@aztec/foundation/fields';
11
- import { jsonStringify } from '@aztec/foundation/json-rpc';
12
- import { createLogger } from '@aztec/foundation/log';
13
- import type { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
14
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
15
- import { AvmPublicDataReadTreeHint, PublicDataWrite } from '@aztec/stdlib/avm';
16
- import { AztecAddress } from '@aztec/stdlib/aztec-address';
17
- import { SerializableContractInstance } from '@aztec/stdlib/contract';
18
- import type { ContractClassWithCommitment } from '@aztec/stdlib/contract';
19
- import {
20
- computeNoteHashNonce,
21
- computePublicDataTreeLeafSlot,
22
- computeUniqueNoteHash,
23
- siloNoteHash,
24
- siloNullifier,
25
- } from '@aztec/stdlib/hash';
26
- import type { IndexedTreeId, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
27
- import type { PublicCallRequest } from '@aztec/stdlib/kernel';
28
- import { SharedMutableValues, SharedMutableValuesWithHash } from '@aztec/stdlib/shared-mutable';
29
- import { MerkleTreeId, NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
30
-
31
- import { strict as assert } from 'assert';
32
- import cloneDeep from 'lodash.clonedeep';
33
-
34
- import { getPublicFunctionDebugName } from '../../../common/debug_fn_name.js';
35
- import type { WorldStateDB } from '../../../public/public_db_sources.js';
36
- import type { PublicSideEffectTraceInterface } from '../../side_effect_trace_interface.js';
37
- import type { AvmExecutionEnvironment } from '../avm_execution_environment.js';
38
- import { NullifierCollisionError, NullifierManager } from './nullifiers.js';
39
- import { PublicStorage } from './public_storage.js';
40
-
41
- /**
42
- * The result of fetching a leaf from an indexed tree. Contains the preimage and wether the leaf was already present
43
- * or it's a low leaf.
44
- */
45
- type GetLeafResult<T extends IndexedTreeLeafPreimage> = {
46
- preimage: T;
47
- leafOrLowLeafIndex: bigint;
48
- alreadyPresent: boolean;
49
- };
50
-
51
- type NullifierMembershipResult = {
52
- exists: boolean;
53
- leafOrLowLeafPreimage: NullifierLeafPreimage;
54
- leafOrLowLeafIndex: bigint;
55
- leafOrLowLeafPath: Fr[];
56
- };
57
-
58
- /**
59
- * A class to manage persistable AVM state for contract calls.
60
- * Maintains a cache of the current world state,
61
- * a trace of all side effects.
62
- *
63
- * The simulator should make any world state / tree queries through this object.
64
- *
65
- * Manages merging of successful/reverted child state into current state.
66
- */
67
- export class AvmPersistableStateManager {
68
- private readonly log = createLogger('simulator:avm:state_manager');
69
-
70
- /** Make sure a forked state is never merged twice. */
71
- private alreadyMergedIntoParent = false;
72
-
73
- constructor(
74
- /** Reference to node storage */
75
- private readonly worldStateDB: WorldStateDB,
76
- /** Side effect trace */
77
- // TODO(5818): make private once no longer accessed in executor
78
- public readonly trace: PublicSideEffectTraceInterface,
79
- /** Public storage, including cached writes */
80
- private readonly publicStorage: PublicStorage = new PublicStorage(worldStateDB),
81
- /** Nullifier set, including cached/recently-emitted nullifiers */
82
- private readonly nullifiers: NullifierManager = new NullifierManager(worldStateDB),
83
- private readonly doMerkleOperations: boolean = false,
84
- /** DB interface for merkle tree operations */
85
- public db: MerkleTreeWriteOperations,
86
- public readonly firstNullifier: Fr,
87
- ) {}
88
-
89
- /**
90
- * Create a new state manager
91
- */
92
- public static create(
93
- worldStateDB: WorldStateDB,
94
- trace: PublicSideEffectTraceInterface,
95
- doMerkleOperations: boolean = false,
96
- firstNullifier: Fr,
97
- ): AvmPersistableStateManager {
98
- // TODO(dbanks12): temporary until we establish a better world state interface
99
- const db = worldStateDB.getMerkleInterface();
100
-
101
- return new AvmPersistableStateManager(
102
- worldStateDB,
103
- trace,
104
- /*publicStorage=*/ new PublicStorage(worldStateDB),
105
- /*nullifiers=*/ new NullifierManager(worldStateDB),
106
- /*doMerkleOperations=*/ doMerkleOperations,
107
- db,
108
- firstNullifier,
109
- );
110
- }
111
-
112
- /**
113
- * Create a new state manager forked from this one
114
- */
115
- public async fork() {
116
- await this.worldStateDB.createCheckpoint();
117
- return new AvmPersistableStateManager(
118
- this.worldStateDB,
119
- this.trace.fork(),
120
- this.publicStorage.fork(),
121
- this.nullifiers.fork(),
122
- this.doMerkleOperations,
123
- this.db,
124
- this.firstNullifier,
125
- );
126
- }
127
-
128
- /**
129
- * Accept forked world state modifications & traced side effects / hints
130
- */
131
- public async merge(forkedState: AvmPersistableStateManager) {
132
- await this._merge(forkedState, /*reverted=*/ false);
133
- }
134
-
135
- /**
136
- * Reject forked world state modifications & traced side effects, keep traced hints
137
- */
138
- public async reject(forkedState: AvmPersistableStateManager) {
139
- await this._merge(forkedState, /*reverted=*/ true);
140
- }
141
-
142
- private async _merge(forkedState: AvmPersistableStateManager, reverted: boolean) {
143
- // sanity check to avoid merging the same forked trace twice
144
- assert(
145
- !forkedState.alreadyMergedIntoParent,
146
- 'Cannot merge forked state that has already been merged into its parent!',
147
- );
148
- forkedState.alreadyMergedIntoParent = true;
149
- this.publicStorage.acceptAndMerge(forkedState.publicStorage);
150
- this.nullifiers.acceptAndMerge(forkedState.nullifiers);
151
- this.trace.merge(forkedState.trace, reverted);
152
- if (reverted) {
153
- await this.worldStateDB.revertCheckpoint();
154
- if (this.doMerkleOperations) {
155
- this.log.trace(
156
- `Rolled back nullifier tree to root ${new Fr((await this.db.getTreeInfo(MerkleTreeId.NULLIFIER_TREE)).root)}`,
157
- );
158
- }
159
- } else {
160
- this.log.trace('Merging forked state into parent...');
161
- await this.worldStateDB.commitCheckpoint();
162
- }
163
- }
164
-
165
- /**
166
- * Write to public storage, journal/trace the write.
167
- *
168
- * @param contractAddress - the address of the contract whose storage is being written to
169
- * @param slot - the slot in the contract's storage being written to
170
- * @param value - the value being written to the slot
171
- */
172
- public async writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite = false): Promise<void> {
173
- const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
174
- this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}, leafSlot=${leafSlot}`);
175
-
176
- if (this.doMerkleOperations) {
177
- // write to native merkle trees
178
- const publicDataWrite = new PublicDataWrite(leafSlot, value);
179
- const result = await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [publicDataWrite.toBuffer()]);
180
- assert(result !== undefined, 'Public data tree insertion error. You might want to disable doMerkleOperations.');
181
- this.log.trace(`Inserted public data tree leaf at leafSlot ${leafSlot}, value: ${value}`);
182
-
183
- // low leaf hint
184
- const lowLeafPreimage = result.lowLeavesWitnessData[0].leafPreimage as PublicDataTreeLeafPreimage;
185
- const lowLeafIndex = result.lowLeavesWitnessData[0].index;
186
- const lowLeafPath = result.lowLeavesWitnessData[0].siblingPath.toFields();
187
- // new leaf insertion
188
- const newLeafPreimage: PublicDataTreeLeafPreimage = cloneDeep(lowLeafPreimage);
189
- let insertionPath: Fr[] | undefined;
190
-
191
- if (result.insertionWitnessData.length === 0) {
192
- assert(
193
- newLeafPreimage.value.equals(value),
194
- `Value mismatch when performing public data write (got value: ${value}, value in tree: ${newLeafPreimage.value})`,
195
- );
196
- } else {
197
- // The new leaf preimage should have the new value and slot
198
- newLeafPreimage.slot = leafSlot;
199
- newLeafPreimage.value = value;
200
- // TODO: is this necessary?! Why doesn't sequentialInsert return the newLeafPreimage via
201
- // result.insertionWitnessData[0].leafPreimage?
202
-
203
- this.log.trace(
204
- `newLeafPreimage.slot: ${newLeafPreimage.slot}, newLeafPreimage.value: ${newLeafPreimage.value}, insertionIndex: ${result.insertionWitnessData[0].index}`,
205
- );
206
- insertionPath = result.insertionWitnessData[0].siblingPath.toFields();
207
- }
208
-
209
- await this.trace.tracePublicStorageWrite(
210
- contractAddress,
211
- slot,
212
- value,
213
- protocolWrite,
214
- lowLeafPreimage,
215
- new Fr(lowLeafIndex),
216
- lowLeafPath,
217
- newLeafPreimage,
218
- insertionPath,
219
- );
220
- } else {
221
- // Cache storage writes for later reference/reads
222
- this.publicStorage.write(contractAddress, slot, value);
223
- await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
224
- }
225
- }
226
-
227
- /**
228
- * Read from public storage, trace the read.
229
- *
230
- * @param contractAddress - the address of the contract whose storage is being read from
231
- * @param slot - the slot in the contract's storage being read from
232
- * @returns the latest value written to slot, or 0 if never written to before
233
- */
234
- public async readStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
235
- if (this.doMerkleOperations) {
236
- const { value, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(contractAddress, slot);
237
- this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, leafPath);
238
- return value;
239
- } else {
240
- const read = await this.publicStorage.read(contractAddress, slot);
241
- this.log.trace(
242
- `Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`,
243
- );
244
- this.trace.tracePublicStorageRead(contractAddress, slot, read.value);
245
- return read.value;
246
- }
247
- }
248
-
249
- async getPublicDataMembership(
250
- contractAddress: AztecAddress,
251
- slot: Fr,
252
- ): Promise<{
253
- value: Fr;
254
- leafPreimage: PublicDataTreeLeafPreimage;
255
- leafIndex: Fr;
256
- leafPath: Fr[];
257
- }> {
258
- const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
259
- const treeId = MerkleTreeId.PUBLIC_DATA_TREE;
260
-
261
- // Get leaf if present, low leaf if absent
262
- // If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
263
- const { preimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo<
264
- typeof treeId,
265
- PublicDataTreeLeafPreimage
266
- >(treeId, leafSlot.toBigInt());
267
- // The index and preimage here is either the low leaf or the leaf itself (depending on the value of update flag)
268
- // In either case, we just want the sibling path to this leaf - it's up to the avm to distinguish if it's a low leaf or not
269
- const leafPath = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafOrLowLeafIndex);
270
- const leafPreimage = preimage as PublicDataTreeLeafPreimage;
271
-
272
- const value = alreadyPresent ? leafPreimage.value : Fr.zero(); // default value of 0
273
- if (!alreadyPresent) {
274
- this.log.trace(`Slot has never been written before!`);
275
- // Sanity check that the leaf slot is skipped by low leaf when it doesn't exist
276
- assert(
277
- leafPreimage.slot.toBigInt() < leafSlot.toBigInt() &&
278
- (leafPreimage.nextIndex === 0n || leafPreimage.nextSlot.toBigInt() > leafSlot.toBigInt()),
279
- 'Public data tree low leaf should skip the target leaf slot when the target leaf does not exist or is the max value.',
280
- );
281
- }
282
-
283
- this.log.trace(
284
- `Storage read results (address=${contractAddress}, slot=${slot}, leafSlot=${leafSlot}): value=${value}, previouslyWritten=${alreadyPresent}`,
285
- );
286
-
287
- return {
288
- value,
289
- leafPreimage,
290
- leafIndex: new Fr(leafOrLowLeafIndex),
291
- leafPath: leafPath.toFields(),
292
- };
293
- }
294
-
295
- /**
296
- * Read from public storage, don't trace the read.
297
- *
298
- * @param contractAddress - the address of the contract whose storage is being read from
299
- * @param slot - the slot in the contract's storage being read from
300
- * @returns the latest value written to slot, or 0 if never written to before
301
- */
302
- public async peekStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
303
- const { value, cached } = await this.publicStorage.read(contractAddress, slot);
304
- this.log.trace(`Storage peek (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`);
305
- return Promise.resolve(value);
306
- }
307
-
308
- // TODO(4886): We currently don't silo note hashes.
309
- /**
310
- * Check if a note hash exists at the given leaf index, trace the check.
311
- *
312
- * @param contractAddress - the address of the contract whose storage is being read from
313
- * @param noteHash - the unsiloed note hash being checked
314
- * @param leafIndex - the leaf index being checked
315
- * @returns true if the note hash exists at the given leaf index, false otherwise
316
- */
317
- public async checkNoteHashExists(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
318
- const gotLeafValue = (await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt())) ?? Fr.ZERO;
319
- const exists = gotLeafValue.equals(noteHash);
320
- this.log.trace(
321
- `noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
322
- );
323
- if (this.doMerkleOperations) {
324
- const path = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
325
- this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path.toFields());
326
- } else {
327
- this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists);
328
- }
329
- return Promise.resolve(exists);
330
- }
331
-
332
- /**
333
- * Write a raw note hash, silo it and make it unique, then trace the write.
334
- * @param noteHash - the unsiloed note hash to write
335
- */
336
- public async writeNoteHash(contractAddress: AztecAddress, noteHash: Fr): Promise<void> {
337
- this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
338
- const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
339
-
340
- await this.writeSiloedNoteHash(siloedNoteHash);
341
- }
342
-
343
- /**
344
- * Write a note hash, make it unique, trace the write.
345
- * @param siloedNoteHash - the non unique note hash to write
346
- */
347
- public async writeSiloedNoteHash(siloedNoteHash: Fr): Promise<void> {
348
- const nonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
349
- const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
350
-
351
- await this.writeUniqueNoteHash(uniqueNoteHash);
352
- }
353
-
354
- /**
355
- * Write a note hash, trace the write.
356
- * @param uniqueNoteHash - the siloed unique hash to write
357
- */
358
- public async writeUniqueNoteHash(uniqueNoteHash: Fr): Promise<void> {
359
- this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
360
-
361
- if (this.doMerkleOperations) {
362
- // Should write a helper for this
363
- const treeInfo = await this.db.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE);
364
- const leafIndex = new Fr(treeInfo.size);
365
- await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [uniqueNoteHash]);
366
- const insertionPath = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
367
- this.trace.traceNewNoteHash(uniqueNoteHash, leafIndex, insertionPath.toFields());
368
- } else {
369
- this.trace.traceNewNoteHash(uniqueNoteHash);
370
- }
371
- }
372
-
373
- /**
374
- * Check if a nullifier exists, trace the check.
375
- * @param contractAddress - address of the contract that the nullifier is associated with
376
- * @param nullifier - the unsiloed nullifier to check
377
- * @returns exists - whether the nullifier exists in the nullifier set
378
- */
379
- public async checkNullifierExists(contractAddress: AztecAddress, nullifier: Fr): Promise<boolean> {
380
- this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
381
- const siloedNullifier = await siloNullifier(contractAddress, nullifier);
382
-
383
- if (this.doMerkleOperations) {
384
- const { exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath } =
385
- await this.getNullifierMembership(siloedNullifier);
386
- this.trace.traceNullifierCheck(
387
- siloedNullifier,
388
- exists,
389
- leafOrLowLeafPreimage,
390
- new Fr(leafOrLowLeafIndex!),
391
- leafOrLowLeafPath,
392
- );
393
- return Promise.resolve(exists);
394
- } else {
395
- const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
396
- this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
397
- this.trace.traceNullifierCheck(siloedNullifier, exists);
398
- return Promise.resolve(exists);
399
- }
400
- }
401
-
402
- /**
403
- * Helper to get membership information for a siloed nullifier when checking its existence.
404
- * Optionally trace the nullifier check.
405
- *
406
- * @param siloedNullifier - the siloed nullifier to get membership information for
407
- * @returns
408
- * - exists - whether the nullifier exists in the nullifier set
409
- * - leafOrLowLeafPreimage - the preimage of the nullifier leaf or its low-leaf if it doesn't exist
410
- * - leafOrLowLeafIndex - the leaf index of the nullifier leaf or its low-leaf if it doesn't exist
411
- * - leafOrLowLeafPath - the sibling path of the nullifier leaf or its low-leaf if it doesn't exist
412
- */
413
- private async getNullifierMembership(siloedNullifier: Fr): Promise<NullifierMembershipResult> {
414
- // Get leaf if present, low leaf if absent
415
- // If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
416
- const treeId = MerkleTreeId.NULLIFIER_TREE;
417
- const {
418
- preimage: leafPreimage,
419
- leafOrLowLeafIndex,
420
- alreadyPresent,
421
- } = await this.getLeafOrLowLeafInfo<typeof treeId, NullifierLeafPreimage>(treeId, siloedNullifier.toBigInt());
422
- this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${alreadyPresent})`);
423
-
424
- const leafPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex!);
425
-
426
- if (alreadyPresent) {
427
- this.log.trace(`Siloed nullifier ${siloedNullifier} exists at leafIndex=${leafOrLowLeafIndex}`);
428
- } else {
429
- // Sanity check that the leaf value is skipped by low leaf when it doesn't exist
430
- assert(
431
- leafPreimage.nullifier.toBigInt() < siloedNullifier.toBigInt() &&
432
- (leafPreimage.nextIndex === 0n || leafPreimage.nextNullifier.toBigInt() > siloedNullifier.toBigInt()),
433
- 'Nullifier tree low leaf should skip the target leaf nullifier when the target leaf does not exist.',
434
- );
435
- }
436
- return {
437
- exists: alreadyPresent,
438
- leafOrLowLeafPreimage: leafPreimage,
439
- leafOrLowLeafIndex,
440
- leafOrLowLeafPath: leafPath.toFields(),
441
- };
442
- }
443
-
444
- /**
445
- * Write a nullifier to the nullifier set, trace the write.
446
- * @param contractAddress - address of the contract that the nullifier is associated with
447
- * @param nullifier - the unsiloed nullifier to write
448
- */
449
- public async writeNullifier(contractAddress: AztecAddress, nullifier: Fr) {
450
- this.log.trace(`Inserting new nullifier (address=${nullifier}, nullifier=${contractAddress})`);
451
- const siloedNullifier = await siloNullifier(contractAddress, nullifier);
452
- await this.writeSiloedNullifier(siloedNullifier);
453
- }
454
-
455
- /**
456
- * Write a nullifier to the nullifier set, trace the write.
457
- * @param siloedNullifier - the siloed nullifier to write
458
- */
459
- public async writeSiloedNullifier(siloedNullifier: Fr) {
460
- this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
461
-
462
- if (this.doMerkleOperations) {
463
- const treeId = MerkleTreeId.NULLIFIER_TREE;
464
- const {
465
- preimage: leafPreimage,
466
- leafOrLowLeafIndex,
467
- alreadyPresent,
468
- } = await this.getLeafOrLowLeafInfo<typeof treeId, NullifierLeafPreimage>(treeId, siloedNullifier.toBigInt());
469
-
470
- if (alreadyPresent) {
471
- this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${leafOrLowLeafIndex}!`);
472
- // If the nullifier is already present, we should not insert it again
473
- // instead we provide the direct membership path
474
- const membershipPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
475
- // This just becomes a nullifier read hint
476
- this.trace.traceNullifierCheck(
477
- siloedNullifier,
478
- /*exists=*/ alreadyPresent,
479
- leafPreimage,
480
- new Fr(leafOrLowLeafIndex),
481
- membershipPath.toFields(),
482
- );
483
- throw new NullifierCollisionError(
484
- `Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`,
485
- );
486
- } else {
487
- const appendResult = await this.db.sequentialInsert(treeId, [siloedNullifier.toBuffer()]);
488
- const lowLeafWitnessData = appendResult.lowLeavesWitnessData![0];
489
- const lowLeafPreimage = lowLeafWitnessData.leafPreimage as NullifierLeafPreimage;
490
- const lowLeafIndex = lowLeafWitnessData.index;
491
- const lowLeafPath = lowLeafWitnessData.siblingPath.toFields();
492
- const insertionPath = appendResult.insertionWitnessData[0].siblingPath.toFields();
493
-
494
- this.trace.traceNewNullifier(
495
- siloedNullifier,
496
- lowLeafPreimage,
497
- new Fr(lowLeafIndex),
498
- lowLeafPath,
499
- insertionPath,
500
- );
501
- }
502
- } else {
503
- // Cache pending nullifiers for later access
504
- await this.nullifiers.append(siloedNullifier);
505
- this.trace.traceNewNullifier(siloedNullifier);
506
- }
507
- }
508
-
509
- public async writeSiloedNullifiersFromPrivate(siloedNullifiers: Fr[]) {
510
- for (const siloedNullifier of siloedNullifiers.filter(n => !n.isEmpty())) {
511
- await this.writeSiloedNullifier(siloedNullifier);
512
- }
513
- }
514
-
515
- /**
516
- * Check if an L1 to L2 message exists, trace the check.
517
- * @param msgHash - the message hash to check existence of
518
- * @param msgLeafIndex - the message leaf index to use in the check
519
- * @returns exists - whether the message exists in the L1 to L2 Messages tree
520
- */
521
- public async checkL1ToL2MessageExists(
522
- contractAddress: AztecAddress,
523
- msgHash: Fr,
524
- msgLeafIndex: Fr,
525
- ): Promise<boolean> {
526
- const valueAtIndex = (await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt())) ?? Fr.ZERO;
527
- const exists = valueAtIndex.equals(msgHash);
528
- this.log.trace(
529
- `l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
530
- );
531
-
532
- if (this.doMerkleOperations) {
533
- const path = await this.db.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, msgLeafIndex.toBigInt());
534
- this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists, path.toFields());
535
- } else {
536
- this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists);
537
- }
538
- return Promise.resolve(exists);
539
- }
540
-
541
- /**
542
- * Write an L2 to L1 message.
543
- * @param contractAddress - L2 contract address that created this message
544
- * @param recipient - L1 contract address to send the message to.
545
- * @param content - Message content.
546
- */
547
- public writeL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
548
- this.log.trace(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
549
- this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
550
- }
551
-
552
- /**
553
- * Write a public log
554
- * @param contractAddress - address of the contract that emitted the log
555
- * @param log - log contents
556
- */
557
- public writePublicLog(contractAddress: AztecAddress, log: Fr[]) {
558
- this.log.trace(`PublicLog(${contractAddress}) += event with ${log.length} fields.`);
559
- this.trace.tracePublicLog(contractAddress, log);
560
- }
561
-
562
- /**
563
- * Get a contract instance.
564
- * @param contractAddress - address of the contract instance to retrieve.
565
- * @returns the contract instance or undefined if it does not exist.
566
- */
567
- public async getContractInstance(contractAddress: AztecAddress): Promise<SerializableContractInstance | undefined> {
568
- this.log.trace(`Getting contract instance for address ${contractAddress}`);
569
- const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress);
570
- const exists = instanceWithAddress !== undefined;
571
-
572
- const instance = exists ? new SerializableContractInstance(instanceWithAddress) : undefined;
573
- if (!exists) {
574
- this.log.debug(`Contract instance NOT FOUND (address=${contractAddress})`);
575
- this.trace.traceGetContractInstance(contractAddress, exists);
576
- return undefined;
577
- }
578
-
579
- this.log.trace(`Got contract instance (address=${contractAddress}): instance=${jsonStringify(instance!)}`);
580
- // Canonical addresses do not trigger nullifier & public storage checks
581
- if (contractAddressIsCanonical(contractAddress)) {
582
- this.trace.traceGetContractInstance(contractAddress, exists, instance);
583
- return instance;
584
- }
585
-
586
- // This will decide internally whether to check the nullifier tree or not depending on doMerkleOperations.
587
- const nullifierExistsInTree = await this.checkNullifierExists(
588
- AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS),
589
- contractAddress.toField(),
590
- );
591
- assert(
592
- exists == nullifierExistsInTree,
593
- 'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!',
594
- );
595
-
596
- if (this.doMerkleOperations) {
597
- // TODO(fcarreiro): this should be done via a public read.
598
- const { updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress);
599
-
600
- this.trace.traceGetContractInstance(contractAddress, exists, instance, updateMembership, updatePreimage);
601
- } else {
602
- this.trace.traceGetContractInstance(contractAddress, exists, instance);
603
- }
604
-
605
- return instance;
606
- }
607
-
608
- /**
609
- * Get a contract class.
610
- * @param classId - class id to retrieve.
611
- * @returns the contract class or undefined if it does not exist.
612
- */
613
- public async getContractClass(classId: Fr): Promise<ContractClassWithCommitment | undefined> {
614
- this.log.trace(`Getting contract class for id ${classId}`);
615
- const klass = await this.worldStateDB.getContractClass(classId);
616
- const exists = klass !== undefined;
617
- let extendedClass: ContractClassWithCommitment | undefined = undefined;
618
-
619
- // Note: We currently do not generate info to check the nullifier tree, because
620
- // this is not needed for our use cases.
621
- if (exists) {
622
- this.log.trace(`Got contract class (id=${classId})`);
623
- // Extend class information with public bytecode commitment.
624
- const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(classId);
625
- assert(
626
- bytecodeCommitment,
627
- `Bytecode commitment was not found in DB for contract class (${classId}). This should not happen!`,
628
- );
629
- extendedClass = {
630
- ...klass,
631
- publicBytecodeCommitment: bytecodeCommitment,
632
- };
633
- } else {
634
- this.log.debug(`Contract instance NOT FOUND (id=${classId})`);
635
- }
636
-
637
- this.trace.traceGetContractClass(classId, exists, extendedClass);
638
- return extendedClass;
639
- }
640
-
641
- /**
642
- * Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
643
- */
644
- public async getBytecode(contractAddress: AztecAddress): Promise<Buffer | undefined> {
645
- this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
646
- const contractInstance = await this.getContractInstance(contractAddress);
647
-
648
- if (!contractInstance) {
649
- return undefined;
650
- }
651
-
652
- const contractClass = await this.getContractClass(contractInstance.currentContractClassId);
653
- assert(
654
- contractClass,
655
- `Contract class not found in DB, but a contract instance was found with this class ID (${contractInstance.currentContractClassId}). This should not happen!`,
656
- );
657
-
658
- // NOTE: If the contract instance is not found, we assume it has not been deployed.
659
- // It doesnt matter what the values of the contract instance are in this case, as long as we tag it with exists=false.
660
- // This will hint to the avm circuit to just perform the non-membership check on the address and disregard the bytecode hash
661
- return contractClass.packedBytecode;
662
- }
663
-
664
- async getContractUpdateHints(contractAddress: AztecAddress) {
665
- const { sharedMutableSlot, sharedMutableHashSlot } = await SharedMutableValuesWithHash.getContractUpdateSlots(
666
- contractAddress,
667
- );
668
-
669
- const {
670
- value: hash,
671
- leafPreimage,
672
- leafIndex,
673
- leafPath,
674
- } = await this.getPublicDataMembership(ProtocolContractAddress.ContractInstanceDeployer, sharedMutableHashSlot);
675
- const updateMembership = new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, leafPath);
676
-
677
- const readStorage = async (storageSlot: Fr) =>
678
- (await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value;
679
-
680
- const sharedMutableValues = await SharedMutableValues.readFromTree(sharedMutableSlot, readStorage);
681
-
682
- const updatePreimage = sharedMutableValues.toFields();
683
-
684
- if (!hash.isZero()) {
685
- const hashed = await poseidon2Hash(updatePreimage);
686
- if (!hashed.equals(hash)) {
687
- throw new Error(`Update hint hash mismatch: ${hash} != ${hashed}`);
688
- }
689
- this.log.trace(`Non empty update hint found for contract ${contractAddress}`);
690
- } else {
691
- if (updatePreimage.some(f => !f.isZero())) {
692
- throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`);
693
- }
694
- this.log.trace(`No update hint found for contract ${contractAddress}`);
695
- }
696
-
697
- return {
698
- updateMembership,
699
- updatePreimage,
700
- };
701
- }
702
-
703
- public traceEnqueuedCall(publicCallRequest: PublicCallRequest, calldata: Fr[], reverted: boolean) {
704
- this.trace.traceEnqueuedCall(publicCallRequest, calldata, reverted);
705
- }
706
-
707
- public async getPublicFunctionDebugName(avmEnvironment: AvmExecutionEnvironment): Promise<string> {
708
- return await getPublicFunctionDebugName(this.worldStateDB, avmEnvironment.address, avmEnvironment.calldata);
709
- }
710
-
711
- public async getLeafOrLowLeafInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
712
- treeId: ID,
713
- key: bigint,
714
- ): Promise<GetLeafResult<T>> {
715
- // "key" is siloed slot (leafSlot) or siloed nullifier
716
- const leafOrLowLeafInfo = await this.db.getPreviousValueIndex(treeId, key);
717
- assert(
718
- leafOrLowLeafInfo !== undefined,
719
- `${MerkleTreeId[treeId]} low leaf index should always be found (even if target leaf does not exist)`,
720
- );
721
- const { index: leafOrLowLeafIndex, alreadyPresent } = leafOrLowLeafInfo;
722
-
723
- const leafPreimage = await this.db.getLeafPreimage(treeId, leafOrLowLeafIndex);
724
- assert(
725
- leafPreimage !== undefined,
726
- `${MerkleTreeId[treeId]} low leaf preimage should never be undefined (even if target leaf does not exist)`,
727
- );
728
-
729
- return { preimage: leafPreimage as T, leafOrLowLeafIndex, alreadyPresent };
730
- }
731
- }
732
-
733
- function contractAddressIsCanonical(contractAddress: AztecAddress): boolean {
734
- return (
735
- contractAddress.equals(AztecAddress.fromNumber(CANONICAL_AUTH_REGISTRY_ADDRESS)) ||
736
- contractAddress.equals(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS)) ||
737
- contractAddress.equals(AztecAddress.fromNumber(REGISTERER_CONTRACT_ADDRESS)) ||
738
- contractAddress.equals(AztecAddress.fromNumber(MULTI_CALL_ENTRYPOINT_ADDRESS)) ||
739
- contractAddress.equals(AztecAddress.fromNumber(FEE_JUICE_ADDRESS)) ||
740
- contractAddress.equals(AztecAddress.fromNumber(ROUTER_ADDRESS))
741
- );
742
- }