@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,474 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import { Timer } from '@aztec/foundation/timer';
4
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
5
+ import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
6
+ import type { AvmProvingRequest, RevertCode } from '@aztec/stdlib/avm';
7
+ import { SimulationError } from '@aztec/stdlib/errors';
8
+ import type { Gas, GasUsed } from '@aztec/stdlib/gas';
9
+ import type { MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
10
+ import type { PublicCallRequest } from '@aztec/stdlib/kernel';
11
+ import type { AvmSimulationStats } from '@aztec/stdlib/stats';
12
+ import {
13
+ type GlobalVariables,
14
+ NestedProcessReturnValues,
15
+ PublicExecutionRequest,
16
+ Tx,
17
+ TxExecutionPhase,
18
+ } from '@aztec/stdlib/tx';
19
+ import { Attributes, type TelemetryClient, type Tracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
20
+
21
+ import { strict as assert } from 'assert';
22
+
23
+ import { getPublicFunctionDebugName } from '../../common/debug_fn_name.js';
24
+ import type { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
25
+ import { type AvmPersistableStateManager, AvmSimulator } from '../avm/index.js';
26
+ import { NullifierCollisionError } from '../avm/journal/nullifiers.js';
27
+ import { ExecutorMetrics } from '../executor_metrics.js';
28
+ import type { WorldStateDB } from '../public_db_sources.js';
29
+ import { PublicTxContext } from './public_tx_context.js';
30
+
31
+ export type ProcessedPhase = {
32
+ phase: TxExecutionPhase;
33
+ durationMs: number;
34
+ returnValues: NestedProcessReturnValues[];
35
+ reverted: boolean;
36
+ revertReason?: SimulationError;
37
+ };
38
+
39
+ export type PublicTxResult = {
40
+ avmProvingRequest: AvmProvingRequest;
41
+ /** Gas used during the execution of this tx */
42
+ gasUsed: GasUsed;
43
+ revertCode: RevertCode;
44
+ /** Revert reason, if any */
45
+ revertReason?: SimulationError;
46
+ processedPhases: ProcessedPhase[];
47
+ };
48
+
49
+ export class PublicTxSimulator {
50
+ metrics: ExecutorMetrics;
51
+
52
+ private log: Logger;
53
+
54
+ constructor(
55
+ private db: MerkleTreeReadOperations,
56
+ private worldStateDB: WorldStateDB,
57
+ private globalVariables: GlobalVariables,
58
+ private doMerkleOperations: boolean = false,
59
+ private skipFeeEnforcement: boolean = false,
60
+ telemetryClient: TelemetryClient = getTelemetryClient(),
61
+ ) {
62
+ this.log = createLogger(`simulator:public_tx_simulator`);
63
+ this.metrics = new ExecutorMetrics(telemetryClient, 'PublicTxSimulator');
64
+ }
65
+
66
+ get tracer(): Tracer {
67
+ return this.metrics.tracer;
68
+ }
69
+ /**
70
+ * Simulate a transaction's public portion including all of its phases.
71
+ * @param tx - The transaction to simulate.
72
+ * @returns The result of the transaction's public execution.
73
+ */
74
+ public async simulate(tx: Tx): Promise<PublicTxResult> {
75
+ try {
76
+ const startTime = process.hrtime.bigint();
77
+
78
+ const txHash = await tx.getTxHash();
79
+ this.log.debug(`Simulating ${tx.enqueuedPublicFunctionCalls.length} public calls for tx ${txHash}`, { txHash });
80
+
81
+ const context = await PublicTxContext.create(
82
+ this.db,
83
+ this.worldStateDB,
84
+ tx,
85
+ this.globalVariables,
86
+ this.doMerkleOperations,
87
+ );
88
+
89
+ const nonRevertStart = process.hrtime.bigint();
90
+ await this.insertNonRevertiblesFromPrivate(context);
91
+ // add new contracts to the contracts db so that their functions may be found and called
92
+ // TODO(#6464): Should we allow emitting contracts in the private setup phase?
93
+ await this.worldStateDB.addNewNonRevertibleContracts(tx);
94
+ const nonRevertEnd = process.hrtime.bigint();
95
+ this.metrics.recordPrivateEffectsInsertion(Number(nonRevertEnd - nonRevertStart) / 1_000, 'non-revertible');
96
+
97
+ const processedPhases: ProcessedPhase[] = [];
98
+ if (context.hasPhase(TxExecutionPhase.SETUP)) {
99
+ const setupResult: ProcessedPhase = await this.simulateSetupPhase(context);
100
+ processedPhases.push(setupResult);
101
+ }
102
+
103
+ const revertStart = process.hrtime.bigint();
104
+ const success = await this.insertRevertiblesFromPrivate(context);
105
+ if (success) {
106
+ // add new contracts to the contracts db so that their functions may be found and called
107
+ await this.worldStateDB.addNewRevertibleContracts(tx);
108
+ const revertEnd = process.hrtime.bigint();
109
+ this.metrics.recordPrivateEffectsInsertion(Number(revertEnd - revertStart) / 1_000, 'revertible');
110
+
111
+ // Only proceed with app logic if there was no revert during revertible insertion
112
+ if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
113
+ const appLogicResult: ProcessedPhase = await this.simulateAppLogicPhase(context);
114
+ processedPhases.push(appLogicResult);
115
+ }
116
+ } else {
117
+ this.log.debug(`Revertible insertions failed. Skipping app logic.`);
118
+ }
119
+
120
+ if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
121
+ const teardownResult: ProcessedPhase = await this.simulateTeardownPhase(context);
122
+ processedPhases.push(teardownResult);
123
+ }
124
+
125
+ await context.halt();
126
+ await this.payFee(context);
127
+
128
+ const endStateReference = await this.db.getStateReference();
129
+
130
+ const avmProvingRequest = await context.generateProvingRequest(endStateReference);
131
+
132
+ const revertCode = context.getFinalRevertCode();
133
+
134
+ if (!revertCode.isOK()) {
135
+ await tx.filterRevertedLogs();
136
+ }
137
+ // Commit contracts from this TX to the block-level cache and clear tx cache
138
+ // If the tx reverted, only commit non-revertible contracts
139
+ // NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
140
+ this.worldStateDB.commitContractsForTx(/*onlyNonRevertibles=*/ !revertCode.isOK());
141
+
142
+ const endTime = process.hrtime.bigint();
143
+ this.log.debug(`Public TX simulator took ${Number(endTime - startTime) / 1_000_000} ms\n`);
144
+
145
+ return {
146
+ avmProvingRequest,
147
+ gasUsed: {
148
+ totalGas: context.getActualGasUsed(),
149
+ teardownGas: context.teardownGasUsed,
150
+ publicGas: context.getActualPublicGasUsed(),
151
+ billedGas: context.getTotalGasUsed(),
152
+ },
153
+ revertCode,
154
+ revertReason: context.revertReason,
155
+ processedPhases: processedPhases,
156
+ };
157
+ } finally {
158
+ // Make sure there are no new contracts in the tx-level cache.
159
+ // They should either be committed to block-level cache or cleared.
160
+ this.worldStateDB.clearContractsForTx();
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Simulate the setup phase of a transaction's public execution.
166
+ * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
167
+ * @returns The phase result.
168
+ */
169
+ private async simulateSetupPhase(context: PublicTxContext): Promise<ProcessedPhase> {
170
+ return await this.simulatePhase(TxExecutionPhase.SETUP, context);
171
+ }
172
+
173
+ /**
174
+ * Simulate the app logic phase of a transaction's public execution.
175
+ * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
176
+ * @returns The phase result.
177
+ */
178
+ private async simulateAppLogicPhase(context: PublicTxContext): Promise<ProcessedPhase> {
179
+ assert(context.state.isForked(), 'App logic phase should operate with forked state.');
180
+
181
+ const result = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
182
+
183
+ if (result.reverted) {
184
+ // Drop the currently active forked state manager and rollback to end of setup.
185
+ await context.state.discardForkedState();
186
+ } else {
187
+ if (!context.hasPhase(TxExecutionPhase.TEARDOWN)) {
188
+ // Nothing to do after this (no teardown), so merge state updates now instead of letting teardown handle it.
189
+ await context.state.mergeForkedState();
190
+ }
191
+ }
192
+
193
+ return result;
194
+ }
195
+
196
+ /**
197
+ * Simulate the teardown phase of a transaction's public execution.
198
+ * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
199
+ * @returns The phase result.
200
+ */
201
+ private async simulateTeardownPhase(context: PublicTxContext): Promise<ProcessedPhase> {
202
+ if (!context.state.isForked()) {
203
+ // If state isn't forked (app logic reverted), fork now
204
+ // so we can rollback to the end of setup if teardown reverts.
205
+ await context.state.fork();
206
+ }
207
+
208
+ const result = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
209
+
210
+ if (result.reverted) {
211
+ // Drop the currently active forked state manager and rollback to end of setup.
212
+ await context.state.discardForkedState();
213
+ } else {
214
+ // Merge state updates from teardown,
215
+ await context.state.mergeForkedState();
216
+ }
217
+
218
+ return result;
219
+ }
220
+
221
+ /**
222
+ * Simulate a phase of a transaction's public execution.
223
+ * @param phase - The current phase
224
+ * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
225
+ * @returns The phase result.
226
+ */
227
+ private async simulatePhase(phase: TxExecutionPhase, context: PublicTxContext): Promise<ProcessedPhase> {
228
+ const callRequests = context.getCallRequestsForPhase(phase);
229
+ const executionRequests = context.getExecutionRequestsForPhase(phase);
230
+
231
+ this.log.debug(`Processing phase ${TxExecutionPhase[phase]} for tx ${context.txHash}`, {
232
+ txHash: context.txHash.toString(),
233
+ phase: TxExecutionPhase[phase],
234
+ callRequests: callRequests.length,
235
+ executionRequests: executionRequests.length,
236
+ });
237
+
238
+ const returnValues: NestedProcessReturnValues[] = [];
239
+ let reverted = false;
240
+ let revertReason: SimulationError | undefined;
241
+ const phaseTimer = new Timer();
242
+ for (let i = callRequests.length - 1; i >= 0; i--) {
243
+ if (reverted) {
244
+ break;
245
+ }
246
+
247
+ const callRequest = callRequests[i];
248
+ const executionRequest = executionRequests[i];
249
+
250
+ const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest, executionRequest);
251
+
252
+ returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output));
253
+
254
+ if (enqueuedCallResult.reverted) {
255
+ reverted = true;
256
+ revertReason = enqueuedCallResult.revertReason;
257
+ }
258
+ }
259
+
260
+ return {
261
+ phase,
262
+ durationMs: phaseTimer.ms(),
263
+ returnValues,
264
+ reverted,
265
+ revertReason,
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Simulate an enqueued public call.
271
+ * @param phase - The current phase of public execution
272
+ * @param context - WILL BE MUTATED. The context of the currently executing public transaction portion
273
+ * @param callRequest - The enqueued call to execute
274
+ * @param executionRequest - The execution request (includes args)
275
+ * @returns The result of execution.
276
+ */
277
+ @trackSpan('PublicTxSimulator.simulateEnqueuedCall', (phase, context, _callRequest, executionRequest) => ({
278
+ [Attributes.TX_HASH]: context.txHash.toString(),
279
+ [Attributes.TARGET_ADDRESS]: executionRequest.callContext.contractAddress.toString(),
280
+ [Attributes.SENDER_ADDRESS]: executionRequest.callContext.msgSender.toString(),
281
+ [Attributes.SIMULATOR_PHASE]: TxExecutionPhase[phase].toString(),
282
+ }))
283
+ private async simulateEnqueuedCall(
284
+ phase: TxExecutionPhase,
285
+ context: PublicTxContext,
286
+ callRequest: PublicCallRequest,
287
+ executionRequest: PublicExecutionRequest,
288
+ ): Promise<AvmFinalizedCallResult> {
289
+ const stateManager = context.state.getActiveStateManager();
290
+ const address = executionRequest.callContext.contractAddress;
291
+ const fnName = await getPublicFunctionDebugName(this.worldStateDB, address, executionRequest.args);
292
+
293
+ const allocatedGas = context.getGasLeftAtPhase(phase);
294
+
295
+ const result = await this.simulateEnqueuedCallInternal(
296
+ context.state.getActiveStateManager(),
297
+ executionRequest,
298
+ allocatedGas,
299
+ /*transactionFee=*/ context.getTransactionFee(phase),
300
+ fnName,
301
+ );
302
+
303
+ const gasUsed = allocatedGas.sub(result.gasLeft); // by enqueued call
304
+ context.consumeGas(phase, gasUsed);
305
+ this.log.debug(
306
+ `Simulated enqueued public call (${fnName}) consumed ${gasUsed.l2Gas} L2 gas ending with ${result.gasLeft.l2Gas} L2 gas left.`,
307
+ );
308
+
309
+ stateManager.traceEnqueuedCall(callRequest, executionRequest.args, result.reverted);
310
+
311
+ if (result.reverted) {
312
+ const culprit = `${executionRequest.callContext.contractAddress}:${executionRequest.callContext.functionSelector}`;
313
+ context.revert(phase, result.revertReason, culprit); // throws if in setup (non-revertible) phase
314
+ }
315
+
316
+ return result;
317
+ }
318
+
319
+ /**
320
+ * Simulate an enqueued public call, without modifying the context (PublicTxContext).
321
+ * Resulting modifications to the context can be applied by the caller.
322
+ *
323
+ * This function can be mocked for testing to skip actual AVM simulation
324
+ * while still simulating phases and generating a proving request.
325
+ *
326
+ * @param stateManager - The state manager for AvmSimulation
327
+ * @param context - The context of the currently executing public transaction portion
328
+ * @param executionRequest - The execution request (includes args)
329
+ * @param allocatedGas - The gas allocated to the enqueued call
330
+ * @param fnName - The name of the function
331
+ * @returns The result of execution.
332
+ */
333
+ @trackSpan(
334
+ 'PublicTxSimulator.simulateEnqueuedCallInternal',
335
+ (_stateManager, _executionRequest, _allocatedGas, _transactionFee, fnName) => ({
336
+ [Attributes.APP_CIRCUIT_NAME]: fnName,
337
+ }),
338
+ )
339
+ private async simulateEnqueuedCallInternal(
340
+ stateManager: AvmPersistableStateManager,
341
+ executionRequest: PublicExecutionRequest,
342
+ allocatedGas: Gas,
343
+ transactionFee: Fr,
344
+ fnName: string,
345
+ ): Promise<AvmFinalizedCallResult> {
346
+ const address = executionRequest.callContext.contractAddress;
347
+ const sender = executionRequest.callContext.msgSender;
348
+
349
+ this.log.debug(
350
+ `Executing enqueued public call to external function ${fnName}@${address} with ${allocatedGas.l2Gas} allocated L2 gas.`,
351
+ );
352
+ const timer = new Timer();
353
+
354
+ const simulator = await AvmSimulator.create(
355
+ stateManager,
356
+ address,
357
+ sender,
358
+ transactionFee,
359
+ this.globalVariables,
360
+ executionRequest.callContext.isStaticCall,
361
+ executionRequest.args,
362
+ allocatedGas,
363
+ );
364
+ const avmCallResult = await simulator.execute();
365
+ const result = avmCallResult.finalize();
366
+
367
+ this.log.verbose(
368
+ result.reverted
369
+ ? `Simulation of enqueued public call ${fnName} reverted with reason ${result.revertReason}.`
370
+ : `Simulation of enqueued public call ${fnName} completed successfully.`,
371
+ {
372
+ eventName: 'avm-simulation',
373
+ appCircuitName: fnName,
374
+ duration: timer.ms(),
375
+ } satisfies AvmSimulationStats,
376
+ );
377
+
378
+ if (result.reverted) {
379
+ this.metrics.recordFunctionSimulationFailure();
380
+ } else {
381
+ this.metrics.recordFunctionSimulation(timer.ms(), allocatedGas.sub(result.gasLeft).l2Gas, fnName);
382
+ }
383
+
384
+ return result;
385
+ }
386
+
387
+ /**
388
+ * Insert the non-revertible accumulated data from private into the public state.
389
+ */
390
+ public async insertNonRevertiblesFromPrivate(context: PublicTxContext) {
391
+ const stateManager = context.state.getActiveStateManager();
392
+ try {
393
+ await stateManager.writeSiloedNullifiersFromPrivate(context.nonRevertibleAccumulatedDataFromPrivate.nullifiers);
394
+ } catch (e) {
395
+ if (e instanceof NullifierCollisionError) {
396
+ throw new NullifierCollisionError(
397
+ `Nullifier collision encountered when inserting non-revertible nullifiers from private.\nDetails: ${e.message}\nStack:${e.stack}`,
398
+ );
399
+ }
400
+ }
401
+ for (const noteHash of context.nonRevertibleAccumulatedDataFromPrivate.noteHashes) {
402
+ if (!noteHash.isEmpty()) {
403
+ await stateManager.writeUniqueNoteHash(noteHash);
404
+ }
405
+ }
406
+ }
407
+
408
+ /**
409
+ * Insert the revertible accumulated data from private into the public state.
410
+ * Start by forking state so we can rollback to the end of setup if app logic or teardown reverts.
411
+ */
412
+ public async insertRevertiblesFromPrivate(context: PublicTxContext): /*success=*/ Promise<boolean> {
413
+ // Fork the state manager so we can rollback to end of setup if app logic reverts.
414
+ await context.state.fork();
415
+ const stateManager = context.state.getActiveStateManager();
416
+ try {
417
+ await stateManager.writeSiloedNullifiersFromPrivate(context.revertibleAccumulatedDataFromPrivate.nullifiers);
418
+ } catch (e) {
419
+ if (e instanceof NullifierCollisionError) {
420
+ // Instead of throwing, revert the app_logic phase
421
+ context.revert(
422
+ TxExecutionPhase.APP_LOGIC,
423
+ new SimulationError(
424
+ `Nullifier collision encountered when inserting revertible nullifiers from private\nDetails: ${e.message}\nError stack: ${e.stack}`,
425
+ [],
426
+ ),
427
+ /*culprit=*/ 'insertRevertiblesFromPrivate',
428
+ );
429
+ return /*success=*/ false;
430
+ } else {
431
+ throw e;
432
+ }
433
+ }
434
+ for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes) {
435
+ if (!noteHash.isEmpty()) {
436
+ // Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can.
437
+ await stateManager.writeSiloedNoteHash(noteHash);
438
+ }
439
+ }
440
+ return /*success=*/ true;
441
+ }
442
+
443
+ private async payFee(context: PublicTxContext) {
444
+ const txFee = context.getTransactionFee(TxExecutionPhase.TEARDOWN);
445
+
446
+ if (context.feePayer.isZero()) {
447
+ this.log.debug(`No one is paying the fee of ${txFee.toBigInt()}`);
448
+ return;
449
+ }
450
+
451
+ const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
452
+ const balanceSlot = await computeFeePayerBalanceStorageSlot(context.feePayer);
453
+
454
+ this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${context.feePayer}`);
455
+ const stateManager = context.state.getActiveStateManager();
456
+
457
+ let currentBalance = await stateManager.readStorage(feeJuiceAddress, balanceSlot);
458
+ // We allow to fake the balance of the fee payer to allow fee estimation
459
+ // When mocking the balance of the fee payer, the circuit should not be able to prove the simulation
460
+
461
+ if (currentBalance.lt(txFee)) {
462
+ if (!this.skipFeeEnforcement) {
463
+ throw new Error(
464
+ `Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`,
465
+ );
466
+ } else {
467
+ currentBalance = txFee;
468
+ }
469
+ }
470
+
471
+ const updatedBalance = currentBalance.sub(txFee);
472
+ await stateManager.writeStorage(feeJuiceAddress, balanceSlot, updatedBalance, true);
473
+ }
474
+ }
@@ -0,0 +1,6 @@
1
+ export class SideEffectLimitReachedError extends Error {
2
+ constructor(sideEffectType: string, limit: number) {
3
+ super(`Reached the limit (${limit}) on number of '${sideEffectType}' per tx`);
4
+ this.name = 'SideEffectLimitReachedError';
5
+ }
6
+ }