@aztec/simulator 0.0.0-test.0

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 (367) hide show
  1. package/README.md +49 -0
  2. package/dest/client.d.ts +5 -0
  3. package/dest/client.d.ts.map +1 -0
  4. package/dest/client.js +3 -0
  5. package/dest/common/db_interfaces.d.ts +80 -0
  6. package/dest/common/db_interfaces.d.ts.map +1 -0
  7. package/dest/common/db_interfaces.js +1 -0
  8. package/dest/common/debug_fn_name.d.ts +5 -0
  9. package/dest/common/debug_fn_name.d.ts.map +1 -0
  10. package/dest/common/debug_fn_name.js +6 -0
  11. package/dest/common/errors.d.ts +54 -0
  12. package/dest/common/errors.d.ts.map +1 -0
  13. package/dest/common/errors.js +135 -0
  14. package/dest/common/index.d.ts +4 -0
  15. package/dest/common/index.d.ts.map +1 -0
  16. package/dest/common/index.js +3 -0
  17. package/dest/common/message_load_oracle_inputs.d.ts +15 -0
  18. package/dest/common/message_load_oracle_inputs.d.ts.map +1 -0
  19. package/dest/common/message_load_oracle_inputs.js +15 -0
  20. package/dest/common/stats/index.d.ts +2 -0
  21. package/dest/common/stats/index.d.ts.map +1 -0
  22. package/dest/common/stats/index.js +1 -0
  23. package/dest/common/stats/stats.d.ts +4 -0
  24. package/dest/common/stats/stats.d.ts.map +1 -0
  25. package/dest/common/stats/stats.js +10 -0
  26. package/dest/private/acvm/acvm.d.ts +35 -0
  27. package/dest/private/acvm/acvm.d.ts.map +1 -0
  28. package/dest/private/acvm/acvm.js +70 -0
  29. package/dest/private/acvm/acvm_types.d.ts +10 -0
  30. package/dest/private/acvm/acvm_types.d.ts.map +1 -0
  31. package/dest/private/acvm/acvm_types.js +3 -0
  32. package/dest/private/acvm/deserialize.d.ts +36 -0
  33. package/dest/private/acvm/deserialize.d.ts.map +1 -0
  34. package/dest/private/acvm/deserialize.js +42 -0
  35. package/dest/private/acvm/index.d.ts +6 -0
  36. package/dest/private/acvm/index.d.ts.map +1 -0
  37. package/dest/private/acvm/index.js +5 -0
  38. package/dest/private/acvm/oracle/index.d.ts +14 -0
  39. package/dest/private/acvm/oracle/index.d.ts.map +1 -0
  40. package/dest/private/acvm/oracle/index.js +2 -0
  41. package/dest/private/acvm/oracle/oracle.d.ts +49 -0
  42. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -0
  43. package/dest/private/acvm/oracle/oracle.js +263 -0
  44. package/dest/private/acvm/oracle/typed_oracle.d.ts +83 -0
  45. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -0
  46. package/dest/private/acvm/oracle/typed_oracle.js +132 -0
  47. package/dest/private/acvm/serialize.d.ts +24 -0
  48. package/dest/private/acvm/serialize.d.ts.map +1 -0
  49. package/dest/private/acvm/serialize.js +46 -0
  50. package/dest/private/execution_data_provider.d.ts +261 -0
  51. package/dest/private/execution_data_provider.d.ts.map +1 -0
  52. package/dest/private/execution_data_provider.js +14 -0
  53. package/dest/private/execution_note_cache.d.ts +93 -0
  54. package/dest/private/execution_note_cache.d.ts.map +1 -0
  55. package/dest/private/execution_note_cache.js +180 -0
  56. package/dest/private/hashed_values_cache.d.ts +28 -0
  57. package/dest/private/hashed_values_cache.d.ts.map +1 -0
  58. package/dest/private/hashed_values_cache.js +46 -0
  59. package/dest/private/index.d.ts +13 -0
  60. package/dest/private/index.d.ts.map +1 -0
  61. package/dest/private/index.js +12 -0
  62. package/dest/private/pick_notes.d.ts +85 -0
  63. package/dest/private/pick_notes.d.ts.map +1 -0
  64. package/dest/private/pick_notes.js +51 -0
  65. package/dest/private/private_execution.d.ts +25 -0
  66. package/dest/private/private_execution.d.ts.map +1 -0
  67. package/dest/private/private_execution.js +92 -0
  68. package/dest/private/private_execution_oracle.d.ts +215 -0
  69. package/dest/private/private_execution_oracle.d.ts.map +1 -0
  70. package/dest/private/private_execution_oracle.js +382 -0
  71. package/dest/private/providers/acvm_native.d.ts +40 -0
  72. package/dest/private/providers/acvm_native.d.ts.map +1 -0
  73. package/dest/private/providers/acvm_native.js +139 -0
  74. package/dest/private/providers/acvm_wasm.d.ts +15 -0
  75. package/dest/private/providers/acvm_wasm.d.ts.map +1 -0
  76. package/dest/private/providers/acvm_wasm.js +62 -0
  77. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +19 -0
  78. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -0
  79. package/dest/private/providers/acvm_wasm_with_blobs.js +32 -0
  80. package/dest/private/providers/factory.d.ts +12 -0
  81. package/dest/private/providers/factory.d.ts.map +1 -0
  82. package/dest/private/providers/factory.js +27 -0
  83. package/dest/private/providers/simulation_provider.d.ts +19 -0
  84. package/dest/private/providers/simulation_provider.d.ts.map +1 -0
  85. package/dest/private/providers/simulation_provider.js +24 -0
  86. package/dest/private/simulator.d.ts +34 -0
  87. package/dest/private/simulator.d.ts.map +1 -0
  88. package/dest/private/simulator.js +76 -0
  89. package/dest/private/unconstrained_execution.d.ts +10 -0
  90. package/dest/private/unconstrained_execution.d.ts.map +1 -0
  91. package/dest/private/unconstrained_execution.js +27 -0
  92. package/dest/private/unconstrained_execution_oracle.d.ts +161 -0
  93. package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -0
  94. package/dest/private/unconstrained_execution_oracle.js +258 -0
  95. package/dest/public/avm/avm_context.d.ts +41 -0
  96. package/dest/public/avm/avm_context.d.ts.map +1 -0
  97. package/dest/public/avm/avm_context.js +44 -0
  98. package/dest/public/avm/avm_contract_call_result.d.ts +30 -0
  99. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -0
  100. package/dest/public/avm/avm_contract_call_result.js +50 -0
  101. package/dest/public/avm/avm_execution_environment.d.ts +21 -0
  102. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -0
  103. package/dest/public/avm/avm_execution_environment.js +31 -0
  104. package/dest/public/avm/avm_gas.d.ts +60 -0
  105. package/dest/public/avm/avm_gas.d.ts.map +1 -0
  106. package/dest/public/avm/avm_gas.js +203 -0
  107. package/dest/public/avm/avm_machine_state.d.ts +95 -0
  108. package/dest/public/avm/avm_machine_state.d.ts.map +1 -0
  109. package/dest/public/avm/avm_machine_state.js +107 -0
  110. package/dest/public/avm/avm_memory_types.d.ts +264 -0
  111. package/dest/public/avm/avm_memory_types.d.ts.map +1 -0
  112. package/dest/public/avm/avm_memory_types.js +340 -0
  113. package/dest/public/avm/avm_simulator.d.ts +40 -0
  114. package/dest/public/avm/avm_simulator.d.ts.map +1 -0
  115. package/dest/public/avm/avm_simulator.js +202 -0
  116. package/dest/public/avm/bytecode_utils.d.ts +5 -0
  117. package/dest/public/avm/bytecode_utils.d.ts.map +1 -0
  118. package/dest/public/avm/bytecode_utils.js +17 -0
  119. package/dest/public/avm/errors.d.ts +122 -0
  120. package/dest/public/avm/errors.d.ts.map +1 -0
  121. package/dest/public/avm/errors.js +179 -0
  122. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +21 -0
  123. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -0
  124. package/dest/public/avm/fixtures/avm_simulation_tester.js +76 -0
  125. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +36 -0
  126. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -0
  127. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +83 -0
  128. package/dest/public/avm/fixtures/index.d.ts +84 -0
  129. package/dest/public/avm/fixtures/index.d.ts.map +1 -0
  130. package/dest/public/avm/fixtures/index.js +175 -0
  131. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +35 -0
  132. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -0
  133. package/dest/public/avm/fixtures/simple_contract_data_source.js +74 -0
  134. package/dest/public/avm/index.d.ts +4 -0
  135. package/dest/public/avm/index.d.ts.map +1 -0
  136. package/dest/public/avm/index.js +3 -0
  137. package/dest/public/avm/journal/index.d.ts +2 -0
  138. package/dest/public/avm/journal/index.d.ts.map +1 -0
  139. package/dest/public/avm/journal/index.js +1 -0
  140. package/dest/public/avm/journal/journal.d.ts +209 -0
  141. package/dest/public/avm/journal/journal.d.ts.map +1 -0
  142. package/dest/public/avm/journal/journal.js +486 -0
  143. package/dest/public/avm/journal/nullifiers.d.ts +64 -0
  144. package/dest/public/avm/journal/nullifiers.d.ts.map +1 -0
  145. package/dest/public/avm/journal/nullifiers.js +97 -0
  146. package/dest/public/avm/journal/public_storage.d.ts +66 -0
  147. package/dest/public/avm/journal/public_storage.d.ts.map +1 -0
  148. package/dest/public/avm/journal/public_storage.js +145 -0
  149. package/dest/public/avm/opcodes/accrued_substate.d.ts +75 -0
  150. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -0
  151. package/dest/public/avm/opcodes/accrued_substate.js +252 -0
  152. package/dest/public/avm/opcodes/addressing_mode.d.ts +27 -0
  153. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -0
  154. package/dest/public/avm/opcodes/addressing_mode.js +74 -0
  155. package/dest/public/avm/opcodes/arithmetic.d.ts +37 -0
  156. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -0
  157. package/dest/public/avm/opcodes/arithmetic.js +73 -0
  158. package/dest/public/avm/opcodes/bitwise.d.ts +50 -0
  159. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -0
  160. package/dest/public/avm/opcodes/bitwise.js +106 -0
  161. package/dest/public/avm/opcodes/comparators.d.ts +25 -0
  162. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -0
  163. package/dest/public/avm/opcodes/comparators.js +43 -0
  164. package/dest/public/avm/opcodes/contract.d.ts +21 -0
  165. package/dest/public/avm/opcodes/contract.d.ts.map +1 -0
  166. package/dest/public/avm/opcodes/contract.js +66 -0
  167. package/dest/public/avm/opcodes/control_flow.d.ts +41 -0
  168. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -0
  169. package/dest/public/avm/opcodes/control_flow.js +105 -0
  170. package/dest/public/avm/opcodes/conversion.d.ts +17 -0
  171. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -0
  172. package/dest/public/avm/opcodes/conversion.js +69 -0
  173. package/dest/public/avm/opcodes/ec_add.d.ts +19 -0
  174. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -0
  175. package/dest/public/avm/opcodes/ec_add.js +84 -0
  176. package/dest/public/avm/opcodes/environment_getters.d.ts +28 -0
  177. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -0
  178. package/dest/public/avm/opcodes/environment_getters.js +79 -0
  179. package/dest/public/avm/opcodes/external_calls.d.ts +58 -0
  180. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -0
  181. package/dest/public/avm/opcodes/external_calls.js +204 -0
  182. package/dest/public/avm/opcodes/hashing.d.ts +36 -0
  183. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -0
  184. package/dest/public/avm/opcodes/hashing.js +114 -0
  185. package/dest/public/avm/opcodes/index.d.ts +16 -0
  186. package/dest/public/avm/opcodes/index.d.ts.map +1 -0
  187. package/dest/public/avm/opcodes/index.js +15 -0
  188. package/dest/public/avm/opcodes/instruction.d.ts +70 -0
  189. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -0
  190. package/dest/public/avm/opcodes/instruction.js +91 -0
  191. package/dest/public/avm/opcodes/instruction_impl.d.ts +19 -0
  192. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -0
  193. package/dest/public/avm/opcodes/instruction_impl.js +30 -0
  194. package/dest/public/avm/opcodes/memory.d.ts +74 -0
  195. package/dest/public/avm/opcodes/memory.d.ts.map +1 -0
  196. package/dest/public/avm/opcodes/memory.js +253 -0
  197. package/dest/public/avm/opcodes/misc.d.ts +17 -0
  198. package/dest/public/avm/opcodes/misc.d.ts.map +1 -0
  199. package/dest/public/avm/opcodes/misc.js +48 -0
  200. package/dest/public/avm/opcodes/storage.d.ts +24 -0
  201. package/dest/public/avm/opcodes/storage.d.ts.map +1 -0
  202. package/dest/public/avm/opcodes/storage.js +66 -0
  203. package/dest/public/avm/serialization/buffer_cursor.d.ts +28 -0
  204. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -0
  205. package/dest/public/avm/serialization/buffer_cursor.js +99 -0
  206. package/dest/public/avm/serialization/bytecode_serialization.d.ts +21 -0
  207. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -0
  208. package/dest/public/avm/serialization/bytecode_serialization.js +332 -0
  209. package/dest/public/avm/serialization/instruction_serialization.d.ts +105 -0
  210. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -0
  211. package/dest/public/avm/serialization/instruction_serialization.js +226 -0
  212. package/dest/public/avm/test_utils.d.ts +18 -0
  213. package/dest/public/avm/test_utils.d.ts.map +1 -0
  214. package/dest/public/avm/test_utils.js +52 -0
  215. package/dest/public/bytecode_errors.d.ts +4 -0
  216. package/dest/public/bytecode_errors.d.ts.map +1 -0
  217. package/dest/public/bytecode_errors.js +6 -0
  218. package/dest/public/execution.d.ts +108 -0
  219. package/dest/public/execution.d.ts.map +1 -0
  220. package/dest/public/execution.js +9 -0
  221. package/dest/public/executor_metrics.d.ts +13 -0
  222. package/dest/public/executor_metrics.d.ts.map +1 -0
  223. package/dest/public/executor_metrics.js +54 -0
  224. package/dest/public/fixtures/index.d.ts +3 -0
  225. package/dest/public/fixtures/index.d.ts.map +1 -0
  226. package/dest/public/fixtures/index.js +2 -0
  227. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +32 -0
  228. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
  229. package/dest/public/fixtures/public_tx_simulation_tester.js +93 -0
  230. package/dest/public/fixtures/utils.d.ts +13 -0
  231. package/dest/public/fixtures/utils.d.ts.map +1 -0
  232. package/dest/public/fixtures/utils.js +126 -0
  233. package/dest/public/index.d.ts +10 -0
  234. package/dest/public/index.d.ts.map +1 -0
  235. package/dest/public/index.js +8 -0
  236. package/dest/public/public_db_sources.d.ts +129 -0
  237. package/dest/public/public_db_sources.d.ts.map +1 -0
  238. package/dest/public/public_db_sources.js +264 -0
  239. package/dest/public/public_processor/public_processor.d.ts +74 -0
  240. package/dest/public/public_processor/public_processor.d.ts.map +1 -0
  241. package/dest/public/public_processor/public_processor.js +379 -0
  242. package/dest/public/public_processor/public_processor_metrics.d.ts +27 -0
  243. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
  244. package/dest/public/public_processor/public_processor_metrics.js +125 -0
  245. package/dest/public/public_tx_simulator/public_tx_context.d.ts +137 -0
  246. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -0
  247. package/dest/public/public_tx_simulator/public_tx_context.js +320 -0
  248. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +102 -0
  249. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
  250. package/dest/public/public_tx_simulator/public_tx_simulator.js +334 -0
  251. package/dest/public/side_effect_errors.d.ts +4 -0
  252. package/dest/public/side_effect_errors.d.ts.map +1 -0
  253. package/dest/public/side_effect_errors.js +6 -0
  254. package/dest/public/side_effect_trace.d.ts +132 -0
  255. package/dest/public/side_effect_trace.d.ts.map +1 -0
  256. package/dest/public/side_effect_trace.js +249 -0
  257. package/dest/public/side_effect_trace_interface.d.ts +34 -0
  258. package/dest/public/side_effect_trace_interface.d.ts.map +1 -0
  259. package/dest/public/side_effect_trace_interface.js +1 -0
  260. package/dest/public/tx_contract_cache.d.ts +41 -0
  261. package/dest/public/tx_contract_cache.d.ts.map +1 -0
  262. package/dest/public/tx_contract_cache.js +49 -0
  263. package/dest/public/unique_class_ids.d.ts +37 -0
  264. package/dest/public/unique_class_ids.d.ts.map +1 -0
  265. package/dest/public/unique_class_ids.js +61 -0
  266. package/dest/public/utils.d.ts +5 -0
  267. package/dest/public/utils.d.ts.map +1 -0
  268. package/dest/public/utils.js +35 -0
  269. package/dest/server.d.ts +6 -0
  270. package/dest/server.d.ts.map +1 -0
  271. package/dest/server.js +4 -0
  272. package/dest/test/utils.d.ts +13 -0
  273. package/dest/test/utils.d.ts.map +1 -0
  274. package/dest/test/utils.js +22 -0
  275. package/package.json +104 -0
  276. package/src/client.ts +4 -0
  277. package/src/common/db_interfaces.ts +94 -0
  278. package/src/common/debug_fn_name.ts +18 -0
  279. package/src/common/errors.ts +183 -0
  280. package/src/common/index.ts +3 -0
  281. package/src/common/message_load_oracle_inputs.ts +15 -0
  282. package/src/common/stats/index.ts +1 -0
  283. package/src/common/stats/stats.ts +20 -0
  284. package/src/private/acvm/acvm.ts +127 -0
  285. package/src/private/acvm/acvm_types.ts +11 -0
  286. package/src/private/acvm/deserialize.ts +52 -0
  287. package/src/private/acvm/index.ts +5 -0
  288. package/src/private/acvm/oracle/index.ts +16 -0
  289. package/src/private/acvm/oracle/oracle.ts +455 -0
  290. package/src/private/acvm/oracle/typed_oracle.ts +259 -0
  291. package/src/private/acvm/serialize.ts +60 -0
  292. package/src/private/execution_data_provider.ts +323 -0
  293. package/src/private/execution_note_cache.ts +217 -0
  294. package/src/private/hashed_values_cache.ts +55 -0
  295. package/src/private/index.ts +16 -0
  296. package/src/private/pick_notes.ts +141 -0
  297. package/src/private/private_execution.ts +151 -0
  298. package/src/private/private_execution_oracle.ts +614 -0
  299. package/src/private/providers/acvm_native.ts +171 -0
  300. package/src/private/providers/acvm_wasm.ts +63 -0
  301. package/src/private/providers/acvm_wasm_with_blobs.ts +50 -0
  302. package/src/private/providers/factory.ts +38 -0
  303. package/src/private/providers/simulation_provider.ts +45 -0
  304. package/src/private/simulator.ts +147 -0
  305. package/src/private/unconstrained_execution.ts +50 -0
  306. package/src/private/unconstrained_execution_oracle.ts +373 -0
  307. package/src/public/avm/avm_context.ts +61 -0
  308. package/src/public/avm/avm_contract_call_result.ts +55 -0
  309. package/src/public/avm/avm_execution_environment.ts +39 -0
  310. package/src/public/avm/avm_gas.ts +195 -0
  311. package/src/public/avm/avm_machine_state.ts +164 -0
  312. package/src/public/avm/avm_memory_types.ts +423 -0
  313. package/src/public/avm/avm_simulator.ts +284 -0
  314. package/src/public/avm/bytecode_utils.ts +17 -0
  315. package/src/public/avm/errors.ts +232 -0
  316. package/src/public/avm/fixtures/avm_simulation_tester.ts +105 -0
  317. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +109 -0
  318. package/src/public/avm/fixtures/index.ts +296 -0
  319. package/src/public/avm/fixtures/simple_contract_data_source.ts +105 -0
  320. package/src/public/avm/index.ts +3 -0
  321. package/src/public/avm/journal/index.ts +1 -0
  322. package/src/public/avm/journal/journal.ts +742 -0
  323. package/src/public/avm/journal/nullifiers.ts +109 -0
  324. package/src/public/avm/journal/public_storage.ts +174 -0
  325. package/src/public/avm/opcodes/.eslintrc.cjs +8 -0
  326. package/src/public/avm/opcodes/accrued_substate.ts +253 -0
  327. package/src/public/avm/opcodes/addressing_mode.ts +87 -0
  328. package/src/public/avm/opcodes/arithmetic.ts +95 -0
  329. package/src/public/avm/opcodes/bitwise.ts +109 -0
  330. package/src/public/avm/opcodes/comparators.ts +52 -0
  331. package/src/public/avm/opcodes/contract.ts +72 -0
  332. package/src/public/avm/opcodes/control_flow.ts +114 -0
  333. package/src/public/avm/opcodes/conversion.ts +80 -0
  334. package/src/public/avm/opcodes/ec_add.ts +93 -0
  335. package/src/public/avm/opcodes/environment_getters.ts +82 -0
  336. package/src/public/avm/opcodes/external_calls.ts +228 -0
  337. package/src/public/avm/opcodes/hashing.ts +125 -0
  338. package/src/public/avm/opcodes/index.ts +15 -0
  339. package/src/public/avm/opcodes/instruction.ts +126 -0
  340. package/src/public/avm/opcodes/instruction_impl.ts +36 -0
  341. package/src/public/avm/opcodes/memory.ts +254 -0
  342. package/src/public/avm/opcodes/misc.ts +60 -0
  343. package/src/public/avm/opcodes/storage.ts +71 -0
  344. package/src/public/avm/serialization/buffer_cursor.ts +115 -0
  345. package/src/public/avm/serialization/bytecode_serialization.ts +206 -0
  346. package/src/public/avm/serialization/instruction_serialization.ts +208 -0
  347. package/src/public/avm/test_utils.ts +81 -0
  348. package/src/public/bytecode_errors.ts +6 -0
  349. package/src/public/execution.ts +140 -0
  350. package/src/public/executor_metrics.ts +71 -0
  351. package/src/public/fixtures/index.ts +2 -0
  352. package/src/public/fixtures/public_tx_simulation_tester.ts +179 -0
  353. package/src/public/fixtures/utils.ts +199 -0
  354. package/src/public/index.ts +9 -0
  355. package/src/public/public_db_sources.ts +369 -0
  356. package/src/public/public_processor/public_processor.ts +521 -0
  357. package/src/public/public_processor/public_processor_metrics.ts +154 -0
  358. package/src/public/public_tx_simulator/public_tx_context.ts +504 -0
  359. package/src/public/public_tx_simulator/public_tx_simulator.ts +474 -0
  360. package/src/public/side_effect_errors.ts +6 -0
  361. package/src/public/side_effect_trace.ts +516 -0
  362. package/src/public/side_effect_trace_interface.ts +76 -0
  363. package/src/public/tx_contract_cache.ts +69 -0
  364. package/src/public/unique_class_ids.ts +80 -0
  365. package/src/public/utils.ts +32 -0
  366. package/src/server.ts +5 -0
  367. package/src/test/utils.ts +36 -0
@@ -0,0 +1,516 @@
1
+ import {
2
+ L1_TO_L2_MSG_TREE_HEIGHT,
3
+ MAX_ENQUEUED_CALLS_PER_TX,
4
+ MAX_L2_TO_L1_MSGS_PER_TX,
5
+ MAX_NOTE_HASHES_PER_TX,
6
+ MAX_NULLIFIERS_PER_TX,
7
+ MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
8
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
9
+ MAX_PUBLIC_LOGS_PER_TX,
10
+ MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
11
+ NOTE_HASH_TREE_HEIGHT,
12
+ NULLIFIER_TREE_HEIGHT,
13
+ PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
14
+ PUBLIC_DATA_TREE_HEIGHT,
15
+ PUBLIC_LOG_DATA_SIZE_IN_FIELDS,
16
+ } from '@aztec/constants';
17
+ import { padArrayEnd } from '@aztec/foundation/collection';
18
+ import { EthAddress } from '@aztec/foundation/eth-address';
19
+ import { Fr } from '@aztec/foundation/fields';
20
+ import { createLogger } from '@aztec/foundation/log';
21
+ import {
22
+ AvmAccumulatedData,
23
+ AvmAppendTreeHint,
24
+ AvmCircuitPublicInputs,
25
+ AvmContractClassHint,
26
+ AvmContractInstanceHint,
27
+ AvmEnqueuedCallHint,
28
+ AvmExecutionHints,
29
+ AvmNullifierReadTreeHint,
30
+ AvmNullifierWriteTreeHint,
31
+ AvmPublicDataReadTreeHint,
32
+ AvmPublicDataWriteTreeHint,
33
+ PublicDataUpdateRequest,
34
+ PublicDataWrite,
35
+ } from '@aztec/stdlib/avm';
36
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
37
+ import { type ContractClassWithCommitment, SerializableContractInstance } from '@aztec/stdlib/contract';
38
+ import type { Gas, GasSettings } from '@aztec/stdlib/gas';
39
+ import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
40
+ import {
41
+ NoteHash,
42
+ Nullifier,
43
+ PrivateToAvmAccumulatedData,
44
+ PrivateToAvmAccumulatedDataArrayLengths,
45
+ PublicCallRequest,
46
+ } from '@aztec/stdlib/kernel';
47
+ import { PublicLog } from '@aztec/stdlib/logs';
48
+ import { L2ToL1Message, ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
49
+ import { NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
50
+ import type { GlobalVariables, TreeSnapshots } from '@aztec/stdlib/tx';
51
+
52
+ import { strict as assert } from 'assert';
53
+
54
+ import { SideEffectLimitReachedError } from './side_effect_errors.js';
55
+ import type { PublicSideEffectTraceInterface } from './side_effect_trace_interface.js';
56
+ import { UniqueClassIds } from './unique_class_ids.js';
57
+
58
+ const emptyPublicDataPath = () => new Array(PUBLIC_DATA_TREE_HEIGHT).fill(Fr.zero());
59
+ const emptyNoteHashPath = () => new Array(NOTE_HASH_TREE_HEIGHT).fill(Fr.zero());
60
+ const emptyNullifierPath = () => new Array(NULLIFIER_TREE_HEIGHT).fill(Fr.zero());
61
+ const emptyL1ToL2MessagePath = () => new Array(L1_TO_L2_MSG_TREE_HEIGHT).fill(Fr.zero());
62
+
63
+ /**
64
+ * A struct containing just the side effects as regular arrays
65
+ * as opposed to "Tuple" arrays used by circuit public inputs.
66
+ * This struct is helpful for testing and checking array lengths.
67
+ **/
68
+ export type SideEffects = {
69
+ enqueuedCalls: PublicCallRequest[];
70
+
71
+ publicDataWrites: PublicDataUpdateRequest[];
72
+ noteHashes: NoteHash[];
73
+ nullifiers: Nullifier[];
74
+ l2ToL1Msgs: ScopedL2ToL1Message[];
75
+
76
+ publicLogs: PublicLog[];
77
+ };
78
+
79
+ export class SideEffectArrayLengths {
80
+ constructor(
81
+ public readonly publicDataWrites: number,
82
+ public readonly protocolPublicDataWrites: number,
83
+ public readonly noteHashes: number,
84
+ public readonly nullifiers: number,
85
+ public readonly l2ToL1Msgs: number,
86
+ public readonly publicLogs: number,
87
+ ) {}
88
+
89
+ static empty() {
90
+ return new this(0, 0, 0, 0, 0, 0);
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Trace side effects for an enqueued public call's execution.
96
+ */
97
+ export class SideEffectTrace implements PublicSideEffectTraceInterface {
98
+ public log = createLogger('simulator:side_effect_trace');
99
+
100
+ /** The side effect counter increments with every call to the trace. */
101
+ private sideEffectCounter: number;
102
+
103
+ private enqueuedCalls: PublicCallRequest[] = [];
104
+
105
+ private publicDataWrites: PublicDataUpdateRequest[] = [];
106
+ private protocolPublicDataWritesLength: number = 0;
107
+ private userPublicDataWritesLength: number = 0;
108
+ private noteHashes: NoteHash[] = [];
109
+ private nullifiers: Nullifier[] = [];
110
+ private l2ToL1Messages: ScopedL2ToL1Message[] = [];
111
+ private publicLogs: PublicLog[] = [];
112
+
113
+ private avmCircuitHints: AvmExecutionHints;
114
+
115
+ /** Make sure a forked trace is never merged twice. */
116
+ private alreadyMergedIntoParent = false;
117
+
118
+ constructor(
119
+ /** The counter of this trace's first side effect. */
120
+ public readonly startSideEffectCounter: number = 0,
121
+ /** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
122
+ * otherwise the public kernel can fail to prove because TX limits are breached.
123
+ */
124
+ private readonly previousSideEffectArrayLengths: SideEffectArrayLengths = SideEffectArrayLengths.empty(),
125
+ /** We need to track the set of class IDs used, to enforce limits. */
126
+ private uniqueClassIds: UniqueClassIds = new UniqueClassIds(),
127
+ ) {
128
+ this.sideEffectCounter = startSideEffectCounter;
129
+ this.avmCircuitHints = AvmExecutionHints.empty();
130
+ }
131
+
132
+ public fork() {
133
+ return new SideEffectTrace(
134
+ this.sideEffectCounter,
135
+ new SideEffectArrayLengths(
136
+ this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength,
137
+ this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength,
138
+ this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length,
139
+ this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length,
140
+ this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length,
141
+ this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length,
142
+ ),
143
+ this.uniqueClassIds.fork(),
144
+ );
145
+ }
146
+
147
+ public merge(forkedTrace: this, reverted: boolean = false) {
148
+ // sanity check to avoid merging the same forked trace twice
149
+ assert(
150
+ !forkedTrace.alreadyMergedIntoParent,
151
+ 'Bug! Cannot merge a forked trace that has already been merged into its parent!',
152
+ );
153
+ forkedTrace.alreadyMergedIntoParent = true;
154
+
155
+ this.sideEffectCounter = forkedTrace.sideEffectCounter;
156
+ this.enqueuedCalls.push(...forkedTrace.enqueuedCalls);
157
+
158
+ if (!reverted) {
159
+ this.publicDataWrites.push(...forkedTrace.publicDataWrites);
160
+ this.noteHashes.push(...forkedTrace.noteHashes);
161
+ this.nullifiers.push(...forkedTrace.nullifiers);
162
+ this.l2ToL1Messages.push(...forkedTrace.l2ToL1Messages);
163
+ this.publicLogs.push(...forkedTrace.publicLogs);
164
+ }
165
+ this.mergeHints(forkedTrace);
166
+ }
167
+
168
+ private mergeHints(forkedTrace: this) {
169
+ this.uniqueClassIds.acceptAndMerge(forkedTrace.uniqueClassIds);
170
+ this.avmCircuitHints.enqueuedCalls.push(...forkedTrace.avmCircuitHints.enqueuedCalls);
171
+ this.avmCircuitHints.contractInstances.push(...forkedTrace.avmCircuitHints.contractInstances);
172
+ this.avmCircuitHints.contractClasses.push(...forkedTrace.avmCircuitHints.contractClasses);
173
+ this.avmCircuitHints.publicDataReads.push(...forkedTrace.avmCircuitHints.publicDataReads);
174
+ this.avmCircuitHints.publicDataWrites.push(...forkedTrace.avmCircuitHints.publicDataWrites);
175
+ this.avmCircuitHints.nullifierReads.push(...forkedTrace.avmCircuitHints.nullifierReads);
176
+ this.avmCircuitHints.nullifierWrites.push(...forkedTrace.avmCircuitHints.nullifierWrites);
177
+ this.avmCircuitHints.noteHashReads.push(...forkedTrace.avmCircuitHints.noteHashReads);
178
+ this.avmCircuitHints.noteHashWrites.push(...forkedTrace.avmCircuitHints.noteHashWrites);
179
+ this.avmCircuitHints.l1ToL2MessageReads.push(...forkedTrace.avmCircuitHints.l1ToL2MessageReads);
180
+ }
181
+
182
+ public getCounter() {
183
+ return this.sideEffectCounter;
184
+ }
185
+
186
+ private incrementSideEffectCounter() {
187
+ this.sideEffectCounter++;
188
+ }
189
+
190
+ public getNoteHashCount() {
191
+ return this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length;
192
+ }
193
+
194
+ public tracePublicStorageRead(
195
+ contractAddress: AztecAddress,
196
+ slot: Fr,
197
+ value: Fr,
198
+ leafPreimage: PublicDataTreeLeafPreimage = PublicDataTreeLeafPreimage.empty(),
199
+ leafIndex: Fr = Fr.zero(),
200
+ path: Fr[] = emptyPublicDataPath(),
201
+ ) {
202
+ this.avmCircuitHints.publicDataReads.push(new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, path));
203
+ this.log.trace(
204
+ `Tracing storage read (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter})`,
205
+ );
206
+ this.incrementSideEffectCounter();
207
+ }
208
+
209
+ public async tracePublicStorageWrite(
210
+ contractAddress: AztecAddress,
211
+ slot: Fr,
212
+ value: Fr,
213
+ protocolWrite: boolean,
214
+ lowLeafPreimage: PublicDataTreeLeafPreimage = PublicDataTreeLeafPreimage.empty(),
215
+ lowLeafIndex: Fr = Fr.zero(),
216
+ lowLeafPath: Fr[] = emptyPublicDataPath(),
217
+ newLeafPreimage: PublicDataTreeLeafPreimage = PublicDataTreeLeafPreimage.empty(),
218
+ insertionPath: Fr[] = emptyPublicDataPath(),
219
+ ): Promise<void> {
220
+ if (protocolWrite) {
221
+ if (
222
+ this.protocolPublicDataWritesLength + this.previousSideEffectArrayLengths.protocolPublicDataWrites >=
223
+ PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
224
+ ) {
225
+ throw new SideEffectLimitReachedError(
226
+ 'protocol public data (contract storage) write',
227
+ PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
228
+ );
229
+ }
230
+ this.protocolPublicDataWritesLength++;
231
+ } else {
232
+ if (
233
+ this.userPublicDataWritesLength + this.previousSideEffectArrayLengths.publicDataWrites >=
234
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
235
+ ) {
236
+ throw new SideEffectLimitReachedError(
237
+ 'public data (contract storage) write',
238
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
239
+ );
240
+ }
241
+ this.userPublicDataWritesLength++;
242
+ }
243
+
244
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
245
+ this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
246
+
247
+ // New hinting
248
+ const readHint = new AvmPublicDataReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
249
+ this.avmCircuitHints.publicDataWrites.push(
250
+ new AvmPublicDataWriteTreeHint(readHint, newLeafPreimage, insertionPath),
251
+ );
252
+
253
+ this.log.trace(
254
+ `Traced public data write (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter}, isProtocol:${protocolWrite})`,
255
+ );
256
+ this.incrementSideEffectCounter();
257
+ }
258
+
259
+ // TODO(8287): _exists can be removed once we have the vm properly handling the equality check
260
+ public traceNoteHashCheck(
261
+ _contractAddress: AztecAddress,
262
+ noteHash: Fr,
263
+ leafIndex: Fr,
264
+ _exists: boolean,
265
+ path: Fr[] = emptyNoteHashPath(),
266
+ ) {
267
+ // New Hinting
268
+ this.avmCircuitHints.noteHashReads.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
269
+ // NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes)
270
+ this.log.trace(`Tracing note hash check (counter=${this.sideEffectCounter})`);
271
+ }
272
+
273
+ public traceNewNoteHash(noteHash: Fr, leafIndex: Fr = Fr.zero(), path: Fr[] = emptyNoteHashPath()) {
274
+ if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
275
+ throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX);
276
+ }
277
+
278
+ this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter));
279
+ this.avmCircuitHints.noteHashWrites.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
280
+ this.log.trace(`Tracing new note hash (counter=${this.sideEffectCounter})`);
281
+ this.incrementSideEffectCounter();
282
+ }
283
+
284
+ public traceNullifierCheck(
285
+ _siloedNullifier: Fr,
286
+ _exists: boolean,
287
+ lowLeafPreimage: NullifierLeafPreimage = NullifierLeafPreimage.empty(),
288
+ lowLeafIndex: Fr = Fr.zero(),
289
+ lowLeafPath: Fr[] = emptyNullifierPath(),
290
+ ) {
291
+ this.avmCircuitHints.nullifierReads.push(new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath));
292
+ this.log.trace(`Tracing nullifier check (counter=${this.sideEffectCounter})`);
293
+ this.incrementSideEffectCounter();
294
+ }
295
+
296
+ public traceNewNullifier(
297
+ siloedNullifier: Fr,
298
+ lowLeafPreimage: NullifierLeafPreimage = NullifierLeafPreimage.empty(),
299
+ lowLeafIndex: Fr = Fr.zero(),
300
+ lowLeafPath: Fr[] = emptyNullifierPath(),
301
+ insertionPath: Fr[] = emptyNullifierPath(),
302
+ ) {
303
+ if (this.nullifiers.length + this.previousSideEffectArrayLengths.nullifiers >= MAX_NULLIFIERS_PER_TX) {
304
+ throw new SideEffectLimitReachedError('nullifier', MAX_NULLIFIERS_PER_TX);
305
+ }
306
+
307
+ this.nullifiers.push(new Nullifier(siloedNullifier, this.sideEffectCounter, /*noteHash=*/ Fr.ZERO));
308
+
309
+ const lowLeafReadHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
310
+ this.avmCircuitHints.nullifierWrites.push(new AvmNullifierWriteTreeHint(lowLeafReadHint, insertionPath));
311
+ this.log.trace(`Tracing new nullifier (counter=${this.sideEffectCounter})`);
312
+ this.incrementSideEffectCounter();
313
+ }
314
+
315
+ // TODO(8287): _exists can be removed once we have the vm properly handling the equality check
316
+ public traceL1ToL2MessageCheck(
317
+ _contractAddress: AztecAddress,
318
+ msgHash: Fr,
319
+ msgLeafIndex: Fr,
320
+ _exists: boolean,
321
+ path: Fr[] = emptyL1ToL2MessagePath(),
322
+ ) {
323
+ this.avmCircuitHints.l1ToL2MessageReads.push(new AvmAppendTreeHint(msgLeafIndex, msgHash, path));
324
+ this.log.trace(`Tracing l1 to l2 message check (counter=${this.sideEffectCounter})`);
325
+ }
326
+
327
+ public traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
328
+ if (this.l2ToL1Messages.length + this.previousSideEffectArrayLengths.l2ToL1Msgs >= MAX_L2_TO_L1_MSGS_PER_TX) {
329
+ throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX);
330
+ }
331
+
332
+ const recipientAddress = EthAddress.fromField(recipient);
333
+ this.l2ToL1Messages.push(
334
+ new L2ToL1Message(recipientAddress, content, this.sideEffectCounter).scope(contractAddress),
335
+ );
336
+ this.log.trace(`Tracing new l2 to l1 message (counter=${this.sideEffectCounter})`);
337
+ this.incrementSideEffectCounter();
338
+ }
339
+
340
+ public tracePublicLog(contractAddress: AztecAddress, log: Fr[]) {
341
+ if (this.publicLogs.length + this.previousSideEffectArrayLengths.publicLogs >= MAX_PUBLIC_LOGS_PER_TX) {
342
+ throw new SideEffectLimitReachedError('public log', MAX_PUBLIC_LOGS_PER_TX);
343
+ }
344
+
345
+ if (log.length > PUBLIC_LOG_DATA_SIZE_IN_FIELDS) {
346
+ throw new Error(`Emitted public log is too large, max: ${PUBLIC_LOG_DATA_SIZE_IN_FIELDS}, passed: ${log.length}`);
347
+ }
348
+ const publicLog = new PublicLog(contractAddress, padArrayEnd(log, Fr.ZERO, PUBLIC_LOG_DATA_SIZE_IN_FIELDS));
349
+ this.publicLogs.push(publicLog);
350
+ this.log.trace(`Tracing new public log (counter=${this.sideEffectCounter})`);
351
+ this.incrementSideEffectCounter();
352
+ }
353
+
354
+ public traceGetContractInstance(
355
+ contractAddress: AztecAddress,
356
+ exists: boolean,
357
+ instance: SerializableContractInstance = SerializableContractInstance.default(),
358
+ updateMembershipHint: AvmPublicDataReadTreeHint = AvmPublicDataReadTreeHint.empty(),
359
+ updatePreimage: Fr[] = [],
360
+ ) {
361
+ this.avmCircuitHints.contractInstances.push(
362
+ new AvmContractInstanceHint(
363
+ contractAddress,
364
+ exists,
365
+ instance.salt,
366
+ instance.deployer,
367
+ instance.currentContractClassId,
368
+ instance.originalContractClassId,
369
+ instance.initializationHash,
370
+ instance.publicKeys,
371
+ updateMembershipHint,
372
+ updatePreimage,
373
+ ),
374
+ );
375
+ this.log.trace(`Tracing contract instance retrieval (counter=${this.sideEffectCounter})`);
376
+ this.incrementSideEffectCounter();
377
+ }
378
+
379
+ public traceGetContractClass(contractClassId: Fr, exists: boolean, contractClass?: ContractClassWithCommitment) {
380
+ if (!exists) {
381
+ this.avmCircuitHints.contractClasses.push(
382
+ new AvmContractClassHint(contractClassId, exists, Fr.zero(), Fr.zero(), Fr.zero(), Buffer.alloc(0)),
383
+ );
384
+ } else if (!this.uniqueClassIds.has(contractClassId.toString())) {
385
+ if (this.uniqueClassIds.size() >= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS) {
386
+ this.log.debug(`Bytecode retrieval failure for contract class ID ${contractClassId} (limit reached)`);
387
+ throw new SideEffectLimitReachedError(
388
+ 'contract calls to unique class IDs',
389
+ MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
390
+ );
391
+ }
392
+
393
+ this.uniqueClassIds.add(contractClassId.toString());
394
+ this.avmCircuitHints.contractClasses.push(
395
+ new AvmContractClassHint(
396
+ contractClassId,
397
+ exists,
398
+ contractClass!.artifactHash,
399
+ contractClass!.privateFunctionsRoot,
400
+ contractClass!.publicBytecodeCommitment,
401
+ contractClass!.packedBytecode,
402
+ ),
403
+ );
404
+
405
+ this.incrementSideEffectCounter();
406
+ }
407
+ }
408
+
409
+ /**
410
+ * Trace an enqueued call.
411
+ * Accept some results from a finished call's trace into this one.
412
+ */
413
+ public traceEnqueuedCall(
414
+ /** The call request from private that enqueued this call. */
415
+ publicCallRequest: PublicCallRequest,
416
+ /** The call's calldata */
417
+ calldata: Fr[],
418
+ /** Did the call revert? */
419
+ _reverted: boolean,
420
+ ) {
421
+ // TODO(4805): check if some threshold is reached for max enqueued or nested calls (to unique contracts?)
422
+ this.enqueuedCalls.push(publicCallRequest);
423
+ this.avmCircuitHints.enqueuedCalls.push(new AvmEnqueuedCallHint(publicCallRequest.contractAddress, calldata));
424
+ }
425
+
426
+ public getSideEffects(): SideEffects {
427
+ return {
428
+ enqueuedCalls: this.enqueuedCalls,
429
+ publicDataWrites: this.publicDataWrites,
430
+ noteHashes: this.noteHashes,
431
+ nullifiers: this.nullifiers,
432
+ l2ToL1Msgs: this.l2ToL1Messages,
433
+ publicLogs: this.publicLogs,
434
+ };
435
+ }
436
+
437
+ public toAvmCircuitPublicInputs(
438
+ /** Globals. */
439
+ globalVariables: GlobalVariables,
440
+ /** Start tree snapshots. */
441
+ startTreeSnapshots: TreeSnapshots,
442
+ /** Gas used at start of TX. */
443
+ startGasUsed: Gas,
444
+ /** How much gas was available for this public execution. */
445
+ gasLimits: GasSettings,
446
+ /** Address of the fee payer. */
447
+ feePayer: AztecAddress,
448
+ /** Call requests for setup phase. */
449
+ publicSetupCallRequests: PublicCallRequest[],
450
+ /** Call requests for app logic phase. */
451
+ publicAppLogicCallRequests: PublicCallRequest[],
452
+ /** Call request for teardown phase. */
453
+ publicTeardownCallRequest: PublicCallRequest,
454
+ /** End tree snapshots. */
455
+ endTreeSnapshots: TreeSnapshots,
456
+ /**
457
+ * Gas used by the whole transaction, assuming entire teardown limit is used.
458
+ * This is the gas used when computing transaction fee.
459
+ */
460
+ endGasUsed: Gas,
461
+ /** Transaction fee. */
462
+ transactionFee: Fr,
463
+ /** The call's results */
464
+ reverted: boolean,
465
+ ): AvmCircuitPublicInputs {
466
+ return new AvmCircuitPublicInputs(
467
+ globalVariables,
468
+ startTreeSnapshots,
469
+ startGasUsed,
470
+ gasLimits,
471
+ feePayer,
472
+ padArrayEnd(publicSetupCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
473
+ padArrayEnd(publicAppLogicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX),
474
+ publicTeardownCallRequest,
475
+ /*previousNonRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
476
+ /*previousRevertibleAccumulatedDataArrayLengths=*/ PrivateToAvmAccumulatedDataArrayLengths.empty(),
477
+ /*previousNonRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(),
478
+ /*previousRevertibleAccumulatedDataArray=*/ PrivateToAvmAccumulatedData.empty(),
479
+ endTreeSnapshots,
480
+ endGasUsed,
481
+ /*accumulatedData=*/ this.getAvmAccumulatedData(),
482
+ transactionFee,
483
+ reverted,
484
+ );
485
+ }
486
+
487
+ public getPublicLogs() {
488
+ return this.publicLogs;
489
+ }
490
+
491
+ public getAvmCircuitHints() {
492
+ return this.avmCircuitHints;
493
+ }
494
+
495
+ private getAvmAccumulatedData() {
496
+ return new AvmAccumulatedData(
497
+ padArrayEnd(
498
+ this.noteHashes.map(n => n.value),
499
+ Fr.zero(),
500
+ MAX_NOTE_HASHES_PER_TX,
501
+ ),
502
+ padArrayEnd(
503
+ this.nullifiers.map(n => n.value),
504
+ Fr.zero(),
505
+ MAX_NULLIFIERS_PER_TX,
506
+ ),
507
+ padArrayEnd(this.l2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
508
+ padArrayEnd(this.publicLogs, PublicLog.empty(), MAX_PUBLIC_LOGS_PER_TX),
509
+ padArrayEnd(
510
+ this.publicDataWrites.map(w => new PublicDataWrite(w.leafSlot, w.newValue)),
511
+ PublicDataWrite.empty(),
512
+ MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
513
+ ),
514
+ );
515
+ }
516
+ }
@@ -0,0 +1,76 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import type { AvmPublicDataReadTreeHint } from '@aztec/stdlib/avm';
3
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
+ import type { ContractClassWithCommitment, SerializableContractInstance } from '@aztec/stdlib/contract';
5
+ import type { PublicCallRequest } from '@aztec/stdlib/kernel';
6
+ import type { PublicLog } from '@aztec/stdlib/logs';
7
+ import type { NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
8
+
9
+ export interface PublicSideEffectTraceInterface {
10
+ fork(): PublicSideEffectTraceInterface;
11
+ merge(nestedTrace: PublicSideEffectTraceInterface, reverted?: boolean): void;
12
+ getCounter(): number;
13
+ // all "trace*" functions can throw SideEffectLimitReachedError
14
+ tracePublicStorageRead(
15
+ contractAddress: AztecAddress,
16
+ slot: Fr,
17
+ value: Fr,
18
+ leafPreimage?: PublicDataTreeLeafPreimage,
19
+ leafIndex?: Fr,
20
+ path?: Fr[],
21
+ ): void;
22
+ tracePublicStorageWrite(
23
+ contractAddress: AztecAddress,
24
+ slot: Fr, // This is the storage slot not the computed leaf slot
25
+ value: Fr,
26
+ protocolWrite: boolean,
27
+ lowLeafPreimage?: PublicDataTreeLeafPreimage,
28
+ lowLeafIndex?: Fr,
29
+ lowLeafPath?: Fr[],
30
+ newLeafPreimage?: PublicDataTreeLeafPreimage,
31
+ insertionPath?: Fr[],
32
+ ): Promise<void>;
33
+ traceNoteHashCheck(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, exists: boolean, path?: Fr[]): void;
34
+ traceNewNoteHash(uniqueNoteHash: Fr, leafIndex?: Fr, path?: Fr[]): void;
35
+ getNoteHashCount(): number;
36
+ traceNullifierCheck(
37
+ siloedNullifier: Fr,
38
+ exists: boolean,
39
+ lowLeafPreimage?: NullifierLeafPreimage,
40
+ lowLeafIndex?: Fr,
41
+ lowLeafPath?: Fr[],
42
+ ): void;
43
+ traceNewNullifier(
44
+ siloedNullifier: Fr,
45
+ lowLeafPreimage?: NullifierLeafPreimage,
46
+ lowLeafIndex?: Fr,
47
+ lowLeafPath?: Fr[],
48
+ insertionPath?: Fr[],
49
+ ): void;
50
+ traceL1ToL2MessageCheck(
51
+ contractAddress: AztecAddress,
52
+ msgHash: Fr,
53
+ msgLeafIndex: Fr,
54
+ exists: boolean,
55
+ path?: Fr[],
56
+ ): void;
57
+ traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
58
+ tracePublicLog(contractAddress: AztecAddress, log: Fr[]): void;
59
+ traceGetContractInstance(
60
+ contractAddress: AztecAddress,
61
+ exists: boolean,
62
+ instance?: SerializableContractInstance,
63
+ updateMembershipHint?: AvmPublicDataReadTreeHint,
64
+ updatePreimage?: Fr[],
65
+ ): void;
66
+ traceGetContractClass(contractClassId: Fr, exists: boolean, contractClass?: ContractClassWithCommitment): void;
67
+ traceEnqueuedCall(
68
+ /** The call request from private that enqueued this call. */
69
+ publicCallRequest: PublicCallRequest,
70
+ /** The call's calldata */
71
+ calldata: Fr[],
72
+ /** Did the call revert? */
73
+ reverted: boolean,
74
+ ): void;
75
+ getPublicLogs(): PublicLog[];
76
+ }
@@ -0,0 +1,69 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
4
+
5
+ /**
6
+ * A cache for contract classes and instances for a single transaction.
7
+ * Useful for tracking/retrieving contracts for a tx while leaving
8
+ * the option to clear them if the tx is reverted.
9
+ */
10
+ export class TxContractCache {
11
+ private instanceCache = new Map<string, ContractInstanceWithAddress>();
12
+ private classCache = new Map<string, ContractClassPublic>();
13
+
14
+ /**
15
+ * Add a contract instance to the cache
16
+ */
17
+ public addInstance(address: AztecAddress, instance: ContractInstanceWithAddress): void {
18
+ this.instanceCache.set(address.toString(), instance);
19
+ }
20
+
21
+ /**
22
+ * Add a contract class to the cache
23
+ */
24
+ public addClass(classId: Fr, contractClass: ContractClassPublic): void {
25
+ this.classCache.set(classId.toString(), contractClass);
26
+ }
27
+
28
+ /**
29
+ * Get a contract instance from the cache
30
+ */
31
+ public getInstance(address: AztecAddress): ContractInstanceWithAddress | undefined {
32
+ return this.instanceCache.get(address.toString());
33
+ }
34
+
35
+ /**
36
+ * Get a contract class from the cache
37
+ */
38
+ public getClass(classId: Fr): ContractClassPublic | undefined {
39
+ return this.classCache.get(classId.toString());
40
+ }
41
+
42
+ /**
43
+ * Check if the cache has a contract class
44
+ */
45
+ public hasClass(classId: Fr): boolean {
46
+ return this.classCache.has(classId.toString());
47
+ }
48
+
49
+ /**
50
+ * Clear all entries from the cache
51
+ */
52
+ public clear(): void {
53
+ this.instanceCache.clear();
54
+ this.classCache.clear();
55
+ }
56
+
57
+ /**
58
+ * Merge another cache into this one
59
+ */
60
+ public mergeFrom(other: TxContractCache): void {
61
+ other.instanceCache.forEach((value, key) => {
62
+ this.instanceCache.set(key, value);
63
+ });
64
+
65
+ other.classCache.forEach((value, key) => {
66
+ this.classCache.set(key, value);
67
+ });
68
+ }
69
+ }