@aztec/simulator 0.76.4 → 0.77.0-testnet-ignition.21

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 (517) hide show
  1. package/README.md +3 -3
  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/{public → common}/db_interfaces.d.ts +8 -33
  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 +3 -2
  9. package/dest/common/debug_fn_name.d.ts.map +1 -1
  10. package/dest/common/debug_fn_name.js +2 -5
  11. package/dest/common/errors.d.ts +4 -4
  12. package/dest/common/errors.d.ts.map +1 -1
  13. package/dest/common/errors.js +30 -39
  14. package/dest/common/index.d.ts +2 -1
  15. package/dest/common/index.d.ts.map +1 -1
  16. package/dest/common/index.js +2 -2
  17. package/dest/common/message_load_oracle_inputs.d.ts +2 -2
  18. package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
  19. package/dest/common/message_load_oracle_inputs.js +8 -8
  20. package/dest/common/stats/index.d.ts.map +1 -0
  21. package/dest/{stats → common/stats}/stats.d.ts +2 -2
  22. package/dest/common/stats/stats.d.ts.map +1 -0
  23. package/dest/common/stats/stats.js +10 -0
  24. package/dest/{acvm → private/acvm}/acvm.d.ts +4 -4
  25. package/dest/private/acvm/acvm.d.ts.map +1 -0
  26. package/dest/private/acvm/acvm.js +70 -0
  27. package/dest/{acvm → private/acvm}/acvm_types.d.ts +1 -1
  28. package/dest/private/acvm/acvm_types.d.ts.map +1 -0
  29. package/dest/private/acvm/acvm_types.js +3 -0
  30. package/dest/{acvm → private/acvm}/deserialize.d.ts +2 -2
  31. package/dest/private/acvm/deserialize.d.ts.map +1 -0
  32. package/dest/private/acvm/deserialize.js +42 -0
  33. package/dest/private/acvm/index.d.ts.map +1 -0
  34. package/dest/private/acvm/index.js +5 -0
  35. package/dest/{acvm → private/acvm}/oracle/index.d.ts +1 -1
  36. package/dest/private/acvm/oracle/index.d.ts.map +1 -0
  37. package/dest/private/acvm/oracle/index.js +2 -0
  38. package/dest/{acvm → private/acvm}/oracle/oracle.d.ts +4 -3
  39. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -0
  40. package/dest/private/acvm/oracle/oracle.js +263 -0
  41. package/dest/{acvm → private/acvm}/oracle/typed_oracle.d.ts +12 -6
  42. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -0
  43. package/dest/private/acvm/oracle/typed_oracle.js +132 -0
  44. package/dest/{acvm → private/acvm}/serialize.d.ts +7 -3
  45. package/dest/private/acvm/serialize.d.ts.map +1 -0
  46. package/dest/private/acvm/serialize.js +46 -0
  47. package/dest/{client → private}/client_execution_context.d.ts +20 -17
  48. package/dest/private/client_execution_context.d.ts.map +1 -0
  49. package/dest/private/client_execution_context.js +378 -0
  50. package/dest/{client → private}/db_oracle.d.ts +19 -7
  51. package/dest/private/db_oracle.d.ts.map +1 -0
  52. package/dest/private/db_oracle.js +14 -0
  53. package/dest/{client → private}/execution_note_cache.d.ts +2 -2
  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/{common → private}/hashed_values_cache.d.ts +2 -2
  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/{client → private}/pick_notes.d.ts +1 -1
  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 +24 -0
  66. package/dest/private/private_execution.d.ts.map +1 -0
  67. package/dest/private/private_execution.js +90 -0
  68. package/dest/{providers → private/providers}/acvm_native.d.ts +5 -5
  69. package/dest/private/providers/acvm_native.d.ts.map +1 -0
  70. package/dest/private/providers/acvm_native.js +139 -0
  71. package/dest/{providers → private/providers}/acvm_wasm.d.ts +4 -4
  72. package/dest/private/providers/acvm_wasm.d.ts.map +1 -0
  73. package/dest/private/providers/acvm_wasm.js +62 -0
  74. package/dest/{providers → private/providers}/acvm_wasm_with_blobs.d.ts +5 -5
  75. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -0
  76. package/dest/{providers → private/providers}/acvm_wasm_with_blobs.js +3 -6
  77. package/dest/{providers → private/providers}/factory.d.ts +1 -1
  78. package/dest/private/providers/factory.d.ts.map +1 -0
  79. package/dest/private/providers/factory.js +27 -0
  80. package/dest/{common → private/providers}/simulation_provider.d.ts +5 -5
  81. package/dest/private/providers/simulation_provider.d.ts.map +1 -0
  82. package/dest/private/providers/simulation_provider.js +24 -0
  83. package/dest/private/simulator.d.ts +36 -0
  84. package/dest/private/simulator.d.ts.map +1 -0
  85. package/dest/private/simulator.js +78 -0
  86. package/dest/{client → private}/unconstrained_execution.d.ts +5 -5
  87. package/dest/private/unconstrained_execution.d.ts.map +1 -0
  88. package/dest/private/unconstrained_execution.js +27 -0
  89. package/dest/{client → private}/view_data_oracle.d.ts +15 -7
  90. package/dest/private/view_data_oracle.d.ts.map +1 -0
  91. package/dest/private/view_data_oracle.js +260 -0
  92. package/dest/{avm → public/avm}/avm_context.d.ts +7 -5
  93. package/dest/public/avm/avm_context.d.ts.map +1 -0
  94. package/dest/public/avm/avm_context.js +44 -0
  95. package/dest/{avm → public/avm}/avm_contract_call_result.d.ts +5 -5
  96. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -0
  97. package/dest/public/avm/avm_contract_call_result.js +50 -0
  98. package/dest/{avm → public/avm}/avm_execution_environment.d.ts +2 -2
  99. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -0
  100. package/dest/public/avm/avm_execution_environment.js +31 -0
  101. package/dest/public/avm/avm_gas.d.ts.map +1 -0
  102. package/dest/public/avm/avm_gas.js +202 -0
  103. package/dest/{avm → public/avm}/avm_machine_state.d.ts +2 -2
  104. package/dest/public/avm/avm_machine_state.d.ts.map +1 -0
  105. package/dest/public/avm/avm_machine_state.js +106 -0
  106. package/dest/{avm → public/avm}/avm_memory_types.d.ts +2 -2
  107. package/dest/public/avm/avm_memory_types.d.ts.map +1 -0
  108. package/dest/public/avm/avm_memory_types.js +340 -0
  109. package/dest/{avm → public/avm}/avm_simulator.d.ts +5 -3
  110. package/dest/public/avm/avm_simulator.d.ts.map +1 -0
  111. package/dest/public/avm/avm_simulator.js +202 -0
  112. package/dest/public/avm/bytecode_utils.d.ts.map +1 -0
  113. package/dest/public/avm/bytecode_utils.js +17 -0
  114. package/dest/{avm → public/avm}/errors.d.ts +5 -4
  115. package/dest/public/avm/errors.d.ts.map +1 -0
  116. package/dest/public/avm/errors.js +179 -0
  117. package/dest/{avm → public/avm}/fixtures/avm_simulation_tester.d.ts +6 -6
  118. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -0
  119. package/dest/public/avm/fixtures/avm_simulation_tester.js +76 -0
  120. package/dest/{avm → public/avm}/fixtures/base_avm_simulation_tester.d.ts +13 -12
  121. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -0
  122. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +83 -0
  123. package/dest/{avm → public/avm}/fixtures/index.d.ts +24 -7
  124. package/dest/public/avm/fixtures/index.d.ts.map +1 -0
  125. package/dest/public/avm/fixtures/index.js +175 -0
  126. package/dest/{avm → public/avm}/fixtures/simple_contract_data_source.d.ts +10 -6
  127. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -0
  128. package/dest/public/avm/fixtures/simple_contract_data_source.js +74 -0
  129. package/dest/public/avm/index.d.ts +4 -0
  130. package/dest/public/avm/index.d.ts.map +1 -0
  131. package/dest/{avm/index.d.ts → public/avm/index.js} +1 -2
  132. package/dest/public/avm/journal/index.d.ts.map +1 -0
  133. package/dest/{avm → public/avm}/journal/journal.d.ts +51 -18
  134. package/dest/public/avm/journal/journal.d.ts.map +1 -0
  135. package/dest/public/avm/journal/journal.js +486 -0
  136. package/dest/{avm → public/avm}/journal/nullifiers.d.ts +8 -6
  137. package/dest/public/avm/journal/nullifiers.d.ts.map +1 -0
  138. package/dest/public/avm/journal/nullifiers.js +97 -0
  139. package/dest/{avm → public/avm}/journal/public_storage.d.ts +2 -2
  140. package/dest/public/avm/journal/public_storage.d.ts.map +1 -0
  141. package/dest/public/avm/journal/public_storage.js +145 -0
  142. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -0
  143. package/dest/public/avm/opcodes/accrued_substate.js +252 -0
  144. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -0
  145. package/dest/public/avm/opcodes/addressing_mode.js +74 -0
  146. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -0
  147. package/dest/public/avm/opcodes/arithmetic.js +73 -0
  148. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -0
  149. package/dest/public/avm/opcodes/bitwise.js +106 -0
  150. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -0
  151. package/dest/public/avm/opcodes/comparators.js +43 -0
  152. package/dest/public/avm/opcodes/contract.d.ts.map +1 -0
  153. package/dest/public/avm/opcodes/contract.js +66 -0
  154. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -0
  155. package/dest/public/avm/opcodes/control_flow.js +105 -0
  156. package/dest/{avm → public/avm}/opcodes/conversion.d.ts +1 -1
  157. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -0
  158. package/dest/public/avm/opcodes/conversion.js +69 -0
  159. package/dest/{avm → public/avm}/opcodes/ec_add.d.ts +1 -1
  160. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -0
  161. package/dest/public/avm/opcodes/ec_add.js +84 -0
  162. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -0
  163. package/dest/public/avm/opcodes/environment_getters.js +79 -0
  164. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -0
  165. package/dest/public/avm/opcodes/external_calls.js +180 -0
  166. package/dest/{avm → public/avm}/opcodes/hashing.d.ts +1 -1
  167. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -0
  168. package/dest/public/avm/opcodes/hashing.js +114 -0
  169. package/dest/public/avm/opcodes/index.d.ts.map +1 -0
  170. package/dest/{avm → public/avm}/opcodes/instruction.d.ts +2 -2
  171. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -0
  172. package/dest/public/avm/opcodes/instruction.js +91 -0
  173. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -0
  174. package/dest/public/avm/opcodes/instruction_impl.js +30 -0
  175. package/dest/public/avm/opcodes/memory.d.ts.map +1 -0
  176. package/dest/public/avm/opcodes/memory.js +253 -0
  177. package/dest/{avm → public/avm}/opcodes/misc.d.ts +1 -1
  178. package/dest/public/avm/opcodes/misc.d.ts.map +1 -0
  179. package/dest/public/avm/opcodes/misc.js +48 -0
  180. package/dest/public/avm/opcodes/storage.d.ts.map +1 -0
  181. package/dest/public/avm/opcodes/storage.js +66 -0
  182. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -0
  183. package/dest/public/avm/serialization/buffer_cursor.js +99 -0
  184. package/dest/{avm → public/avm}/serialization/bytecode_serialization.d.ts +1 -1
  185. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -0
  186. package/dest/public/avm/serialization/bytecode_serialization.js +328 -0
  187. package/dest/{avm → public/avm}/serialization/instruction_serialization.d.ts +1 -2
  188. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -0
  189. package/dest/public/avm/serialization/instruction_serialization.js +225 -0
  190. package/dest/{avm → public/avm}/test_utils.d.ts +6 -4
  191. package/dest/public/avm/test_utils.d.ts.map +1 -0
  192. package/dest/public/avm/test_utils.js +52 -0
  193. package/dest/public/bytecode_errors.js +1 -2
  194. package/dest/public/execution.d.ts +8 -2
  195. package/dest/public/execution.d.ts.map +1 -1
  196. package/dest/public/execution.js +4 -5
  197. package/dest/public/executor_metrics.js +16 -12
  198. package/dest/public/fixtures/index.js +0 -1
  199. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +15 -9
  200. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  201. package/dest/public/fixtures/public_tx_simulation_tester.js +54 -53
  202. package/dest/public/fixtures/utils.d.ts +7 -11
  203. package/dest/public/fixtures/utils.d.ts.map +1 -1
  204. package/dest/public/fixtures/utils.js +92 -32
  205. package/dest/public/index.d.ts +5 -4
  206. package/dest/public/index.d.ts.map +1 -1
  207. package/dest/public/index.js +5 -5
  208. package/dest/public/public_db_sources.d.ts +82 -34
  209. package/dest/public/public_db_sources.d.ts.map +1 -1
  210. package/dest/public/public_db_sources.js +171 -196
  211. package/dest/public/{public_processor.d.ts → public_processor/public_processor.d.ts} +10 -8
  212. package/dest/public/public_processor/public_processor.d.ts.map +1 -0
  213. package/dest/public/public_processor/public_processor.js +379 -0
  214. package/dest/public/{public_processor_metrics.d.ts → public_processor/public_processor_metrics.d.ts} +3 -3
  215. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
  216. package/dest/public/public_processor/public_processor_metrics.js +125 -0
  217. package/dest/public/{public_tx_context.d.ts → public_tx_simulator/public_tx_context.d.ts} +14 -8
  218. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -0
  219. package/dest/public/public_tx_simulator/public_tx_context.js +320 -0
  220. package/dest/public/{public_tx_simulator.d.ts → public_tx_simulator/public_tx_simulator.d.ts} +10 -7
  221. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
  222. package/dest/public/public_tx_simulator/public_tx_simulator.js +325 -0
  223. package/dest/public/side_effect_errors.js +1 -2
  224. package/dest/public/side_effect_trace.d.ts +16 -10
  225. package/dest/public/side_effect_trace.d.ts.map +1 -1
  226. package/dest/public/side_effect_trace.js +82 -149
  227. package/dest/public/side_effect_trace_interface.d.ts +9 -7
  228. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  229. package/dest/public/side_effect_trace_interface.js +1 -2
  230. package/dest/public/tx_contract_cache.d.ts +41 -0
  231. package/dest/public/tx_contract_cache.d.ts.map +1 -0
  232. package/dest/public/tx_contract_cache.js +49 -0
  233. package/dest/public/unique_class_ids.js +23 -28
  234. package/dest/public/utils.d.ts +2 -2
  235. package/dest/public/utils.d.ts.map +1 -1
  236. package/dest/public/utils.js +17 -12
  237. package/dest/server.d.ts +4 -4
  238. package/dest/server.d.ts.map +1 -1
  239. package/dest/server.js +3 -5
  240. package/dest/test/utils.d.ts +3 -2
  241. package/dest/test/utils.d.ts.map +1 -1
  242. package/dest/test/utils.js +9 -7
  243. package/package.json +19 -21
  244. package/src/client.ts +4 -0
  245. package/src/{public → common}/db_interfaces.ts +8 -40
  246. package/src/common/debug_fn_name.ts +4 -2
  247. package/src/common/errors.ts +5 -5
  248. package/src/common/index.ts +2 -1
  249. package/src/common/message_load_oracle_inputs.ts +2 -2
  250. package/src/common/stats/index.ts +1 -0
  251. package/src/{stats → common/stats}/stats.ts +2 -2
  252. package/src/{acvm → private/acvm}/acvm.ts +5 -5
  253. package/src/{acvm → private/acvm}/acvm_types.ts +1 -1
  254. package/src/{acvm → private/acvm}/deserialize.ts +2 -2
  255. package/src/{acvm → private/acvm}/oracle/index.ts +1 -1
  256. package/src/{acvm → private/acvm}/oracle/oracle.ts +22 -12
  257. package/src/{acvm → private/acvm}/oracle/typed_oracle.ts +50 -55
  258. package/src/{acvm → private/acvm}/serialize.ts +10 -3
  259. package/src/{client → private}/client_execution_context.ts +54 -37
  260. package/src/{client → private}/db_oracle.ts +20 -20
  261. package/src/{client → private}/execution_note_cache.ts +3 -3
  262. package/src/{common → private}/hashed_values_cache.ts +2 -2
  263. package/src/private/index.ts +12 -0
  264. package/src/{client → private}/pick_notes.ts +1 -1
  265. package/src/{client → private}/private_execution.ts +46 -14
  266. package/src/{providers → private/providers}/acvm_native.ts +6 -6
  267. package/src/{providers → private/providers}/acvm_wasm.ts +4 -4
  268. package/src/{providers → private/providers}/acvm_wasm_with_blobs.ts +5 -5
  269. package/src/{providers → private/providers}/factory.ts +1 -1
  270. package/src/{common → private/providers}/simulation_provider.ts +5 -5
  271. package/src/{client → private}/simulator.ts +31 -123
  272. package/src/{client → private}/unconstrained_execution.ts +7 -7
  273. package/src/{client → private}/view_data_oracle.ts +25 -28
  274. package/src/{avm → public/avm}/avm_context.ts +12 -7
  275. package/src/{avm → public/avm}/avm_contract_call_result.ts +6 -6
  276. package/src/{avm → public/avm}/avm_execution_environment.ts +2 -2
  277. package/src/{avm → public/avm}/avm_gas.ts +1 -3
  278. package/src/{avm → public/avm}/avm_machine_state.ts +2 -2
  279. package/src/{avm → public/avm}/avm_memory_types.ts +4 -4
  280. package/src/{avm → public/avm}/avm_simulator.ts +12 -6
  281. package/src/{avm → public/avm}/errors.ts +5 -4
  282. package/src/{avm → public/avm}/fixtures/avm_simulation_tester.ts +16 -15
  283. package/src/{avm → public/avm}/fixtures/base_avm_simulation_tester.ts +45 -40
  284. package/src/{avm → public/avm}/fixtures/index.ts +77 -12
  285. package/src/{avm → public/avm}/fixtures/simple_contract_data_source.ts +26 -19
  286. package/src/{avm → public/avm}/index.ts +1 -1
  287. package/src/public/avm/journal/index.ts +1 -0
  288. package/src/{avm → public/avm}/journal/journal.ts +330 -305
  289. package/src/{avm → public/avm}/journal/nullifiers.ts +20 -19
  290. package/src/{avm → public/avm}/journal/public_storage.ts +2 -2
  291. package/src/{avm → public/avm}/opcodes/contract.ts +1 -1
  292. package/src/{avm → public/avm}/opcodes/control_flow.ts +1 -1
  293. package/src/{avm → public/avm}/opcodes/conversion.ts +1 -1
  294. package/src/{avm → public/avm}/opcodes/ec_add.ts +2 -2
  295. package/src/{avm → public/avm}/opcodes/external_calls.ts +5 -6
  296. package/src/{avm → public/avm}/opcodes/hashing.ts +1 -1
  297. package/src/public/avm/opcodes/index.ts +15 -0
  298. package/src/{avm → public/avm}/opcodes/instruction.ts +2 -2
  299. package/src/{avm → public/avm}/opcodes/misc.ts +1 -1
  300. package/src/public/avm/serialization/bytecode_serialization.ts +204 -0
  301. package/src/{avm → public/avm}/serialization/instruction_serialization.ts +0 -1
  302. package/src/{avm → public/avm}/test_utils.ts +10 -7
  303. package/src/public/execution.ts +9 -12
  304. package/src/public/fixtures/public_tx_simulation_tester.ts +66 -72
  305. package/src/public/fixtures/utils.ts +122 -33
  306. package/src/public/index.ts +5 -4
  307. package/src/public/public_db_sources.ts +216 -222
  308. package/src/public/{public_processor.ts → public_processor/public_processor.ts} +78 -53
  309. package/src/public/{public_processor_metrics.ts → public_processor/public_processor_metrics.ts} +3 -3
  310. package/src/public/{public_tx_context.ts → public_tx_simulator/public_tx_context.ts} +70 -75
  311. package/src/public/{public_tx_simulator.ts → public_tx_simulator/public_tx_simulator.ts} +104 -91
  312. package/src/public/side_effect_trace.ts +85 -160
  313. package/src/public/side_effect_trace_interface.ts +10 -23
  314. package/src/public/tx_contract_cache.ts +69 -0
  315. package/src/public/unique_class_ids.ts +1 -1
  316. package/src/public/utils.ts +2 -2
  317. package/src/server.ts +4 -4
  318. package/src/test/utils.ts +5 -3
  319. package/dest/acvm/acvm.d.ts.map +0 -1
  320. package/dest/acvm/acvm.js +0 -73
  321. package/dest/acvm/acvm_types.d.ts.map +0 -1
  322. package/dest/acvm/acvm_types.js +0 -2
  323. package/dest/acvm/deserialize.d.ts.map +0 -1
  324. package/dest/acvm/deserialize.js +0 -46
  325. package/dest/acvm/index.d.ts.map +0 -1
  326. package/dest/acvm/index.js +0 -6
  327. package/dest/acvm/oracle/index.d.ts.map +0 -1
  328. package/dest/acvm/oracle/index.js +0 -3
  329. package/dest/acvm/oracle/oracle.d.ts.map +0 -1
  330. package/dest/acvm/oracle/oracle.js +0 -230
  331. package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
  332. package/dest/acvm/oracle/typed_oracle.js +0 -131
  333. package/dest/acvm/serialize.d.ts.map +0 -1
  334. package/dest/acvm/serialize.js +0 -48
  335. package/dest/avm/avm_context.d.ts.map +0 -1
  336. package/dest/avm/avm_context.js +0 -44
  337. package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
  338. package/dest/avm/avm_contract_call_result.js +0 -45
  339. package/dest/avm/avm_execution_environment.d.ts.map +0 -1
  340. package/dest/avm/avm_execution_environment.js +0 -28
  341. package/dest/avm/avm_gas.d.ts.map +0 -1
  342. package/dest/avm/avm_gas.js +0 -170
  343. package/dest/avm/avm_machine_state.d.ts.map +0 -1
  344. package/dest/avm/avm_machine_state.js +0 -112
  345. package/dest/avm/avm_memory_types.d.ts.map +0 -1
  346. package/dest/avm/avm_memory_types.js +0 -327
  347. package/dest/avm/avm_simulator.d.ts.map +0 -1
  348. package/dest/avm/avm_simulator.js +0 -193
  349. package/dest/avm/avm_tree.d.ts +0 -282
  350. package/dest/avm/avm_tree.d.ts.map +0 -1
  351. package/dest/avm/avm_tree.js +0 -684
  352. package/dest/avm/bytecode_utils.d.ts.map +0 -1
  353. package/dest/avm/bytecode_utils.js +0 -15
  354. package/dest/avm/errors.d.ts.map +0 -1
  355. package/dest/avm/errors.js +0 -196
  356. package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  357. package/dest/avm/fixtures/avm_simulation_tester.js +0 -73
  358. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  359. package/dest/avm/fixtures/base_avm_simulation_tester.js +0 -76
  360. package/dest/avm/fixtures/index.d.ts.map +0 -1
  361. package/dest/avm/fixtures/index.js +0 -134
  362. package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  363. package/dest/avm/fixtures/simple_contract_data_source.js +0 -75
  364. package/dest/avm/index.d.ts.map +0 -1
  365. package/dest/avm/index.js +0 -4
  366. package/dest/avm/journal/index.d.ts.map +0 -1
  367. package/dest/avm/journal/index.js +0 -2
  368. package/dest/avm/journal/journal.d.ts.map +0 -1
  369. package/dest/avm/journal/journal.js +0 -499
  370. package/dest/avm/journal/nullifiers.d.ts.map +0 -1
  371. package/dest/avm/journal/nullifiers.js +0 -99
  372. package/dest/avm/journal/public_storage.d.ts.map +0 -1
  373. package/dest/avm/journal/public_storage.js +0 -159
  374. package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
  375. package/dest/avm/opcodes/accrued_substate.js +0 -215
  376. package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
  377. package/dest/avm/opcodes/addressing_mode.js +0 -81
  378. package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
  379. package/dest/avm/opcodes/arithmetic.js +0 -70
  380. package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
  381. package/dest/avm/opcodes/bitwise.js +0 -90
  382. package/dest/avm/opcodes/comparators.d.ts.map +0 -1
  383. package/dest/avm/opcodes/comparators.js +0 -40
  384. package/dest/avm/opcodes/contract.d.ts.map +0 -1
  385. package/dest/avm/opcodes/contract.js +0 -63
  386. package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
  387. package/dest/avm/opcodes/control_flow.js +0 -97
  388. package/dest/avm/opcodes/conversion.d.ts.map +0 -1
  389. package/dest/avm/opcodes/conversion.js +0 -64
  390. package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
  391. package/dest/avm/opcodes/ec_add.js +0 -82
  392. package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
  393. package/dest/avm/opcodes/environment_getters.js +0 -78
  394. package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
  395. package/dest/avm/opcodes/external_calls.js +0 -169
  396. package/dest/avm/opcodes/hashing.d.ts.map +0 -1
  397. package/dest/avm/opcodes/hashing.js +0 -103
  398. package/dest/avm/opcodes/index.d.ts.map +0 -1
  399. package/dest/avm/opcodes/index.js +0 -16
  400. package/dest/avm/opcodes/instruction.d.ts.map +0 -1
  401. package/dest/avm/opcodes/instruction.js +0 -100
  402. package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
  403. package/dest/avm/opcodes/instruction_impl.js +0 -33
  404. package/dest/avm/opcodes/memory.d.ts.map +0 -1
  405. package/dest/avm/opcodes/memory.js +0 -226
  406. package/dest/avm/opcodes/misc.d.ts.map +0 -1
  407. package/dest/avm/opcodes/misc.js +0 -45
  408. package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
  409. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
  410. package/dest/avm/opcodes/multi_scalar_mul.js +0 -112
  411. package/dest/avm/opcodes/storage.d.ts.map +0 -1
  412. package/dest/avm/opcodes/storage.js +0 -61
  413. package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
  414. package/dest/avm/serialization/buffer_cursor.js +0 -99
  415. package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  416. package/dest/avm/serialization/bytecode_serialization.js +0 -132
  417. package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
  418. package/dest/avm/serialization/instruction_serialization.js +0 -187
  419. package/dest/avm/test_utils.d.ts.map +0 -1
  420. package/dest/avm/test_utils.js +0 -52
  421. package/dest/client/client_execution_context.d.ts.map +0 -1
  422. package/dest/client/client_execution_context.js +0 -392
  423. package/dest/client/db_oracle.d.ts.map +0 -1
  424. package/dest/client/db_oracle.js +0 -17
  425. package/dest/client/execution_note_cache.d.ts.map +0 -1
  426. package/dest/client/execution_note_cache.js +0 -181
  427. package/dest/client/index.d.ts +0 -16
  428. package/dest/client/index.d.ts.map +0 -1
  429. package/dest/client/index.js +0 -15
  430. package/dest/client/pick_notes.d.ts.map +0 -1
  431. package/dest/client/pick_notes.js +0 -54
  432. package/dest/client/private_execution.d.ts +0 -19
  433. package/dest/client/private_execution.d.ts.map +0 -1
  434. package/dest/client/private_execution.js +0 -72
  435. package/dest/client/simulator.d.ts +0 -60
  436. package/dest/client/simulator.d.ts.map +0 -1
  437. package/dest/client/simulator.js +0 -136
  438. package/dest/client/unconstrained_execution.d.ts.map +0 -1
  439. package/dest/client/unconstrained_execution.js +0 -30
  440. package/dest/client/view_data_oracle.d.ts.map +0 -1
  441. package/dest/client/view_data_oracle.js +0 -268
  442. package/dest/common/hashed_values_cache.d.ts.map +0 -1
  443. package/dest/common/hashed_values_cache.js +0 -50
  444. package/dest/common/simulation_provider.d.ts.map +0 -1
  445. package/dest/common/simulation_provider.js +0 -27
  446. package/dest/common.d.ts +0 -2
  447. package/dest/common.d.ts.map +0 -1
  448. package/dest/common.js +0 -2
  449. package/dest/providers/acvm_native.d.ts.map +0 -1
  450. package/dest/providers/acvm_native.js +0 -125
  451. package/dest/providers/acvm_wasm.d.ts.map +0 -1
  452. package/dest/providers/acvm_wasm.js +0 -54
  453. package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  454. package/dest/providers/factory.d.ts.map +0 -1
  455. package/dest/providers/factory.js +0 -27
  456. package/dest/providers/index.d.ts +0 -5
  457. package/dest/providers/index.d.ts.map +0 -1
  458. package/dest/providers/index.js +0 -5
  459. package/dest/public/db_interfaces.d.ts.map +0 -1
  460. package/dest/public/db_interfaces.js +0 -2
  461. package/dest/public/fee_payment.d.ts +0 -11
  462. package/dest/public/fee_payment.d.ts.map +0 -1
  463. package/dest/public/fee_payment.js +0 -21
  464. package/dest/public/public_processor.d.ts.map +0 -1
  465. package/dest/public/public_processor.js +0 -352
  466. package/dest/public/public_processor_metrics.d.ts.map +0 -1
  467. package/dest/public/public_processor_metrics.js +0 -106
  468. package/dest/public/public_tx_context.d.ts.map +0 -1
  469. package/dest/public/public_tx_context.js +0 -341
  470. package/dest/public/public_tx_simulator.d.ts.map +0 -1
  471. package/dest/public/public_tx_simulator.js +0 -333
  472. package/dest/stats/index.d.ts.map +0 -1
  473. package/dest/stats/index.js +0 -2
  474. package/dest/stats/stats.d.ts.map +0 -1
  475. package/dest/stats/stats.js +0 -11
  476. package/src/avm/avm_tree.ts +0 -887
  477. package/src/avm/opcodes/multi_scalar_mul.ts +0 -121
  478. package/src/avm/serialization/bytecode_serialization.ts +0 -212
  479. package/src/client/index.ts +0 -15
  480. package/src/common.ts +0 -1
  481. package/src/providers/index.ts +0 -4
  482. package/src/public/fee_payment.ts +0 -23
  483. /package/dest/{stats → common/stats}/index.d.ts +0 -0
  484. /package/{src/stats/index.ts → dest/common/stats/index.js} +0 -0
  485. /package/dest/{acvm → private/acvm}/index.d.ts +0 -0
  486. /package/dest/{avm → public/avm}/avm_gas.d.ts +0 -0
  487. /package/dest/{avm → public/avm}/bytecode_utils.d.ts +0 -0
  488. /package/dest/{avm → public/avm}/journal/index.d.ts +0 -0
  489. /package/{src/avm/journal/index.ts → dest/public/avm/journal/index.js} +0 -0
  490. /package/dest/{avm → public/avm}/opcodes/accrued_substate.d.ts +0 -0
  491. /package/dest/{avm → public/avm}/opcodes/addressing_mode.d.ts +0 -0
  492. /package/dest/{avm → public/avm}/opcodes/arithmetic.d.ts +0 -0
  493. /package/dest/{avm → public/avm}/opcodes/bitwise.d.ts +0 -0
  494. /package/dest/{avm → public/avm}/opcodes/comparators.d.ts +0 -0
  495. /package/dest/{avm → public/avm}/opcodes/contract.d.ts +0 -0
  496. /package/dest/{avm → public/avm}/opcodes/control_flow.d.ts +0 -0
  497. /package/dest/{avm → public/avm}/opcodes/environment_getters.d.ts +0 -0
  498. /package/dest/{avm → public/avm}/opcodes/external_calls.d.ts +0 -0
  499. /package/dest/{avm → public/avm}/opcodes/index.d.ts +0 -0
  500. /package/{src/avm/opcodes/index.ts → dest/public/avm/opcodes/index.js} +0 -0
  501. /package/dest/{avm → public/avm}/opcodes/instruction_impl.d.ts +0 -0
  502. /package/dest/{avm → public/avm}/opcodes/memory.d.ts +0 -0
  503. /package/dest/{avm → public/avm}/opcodes/storage.d.ts +0 -0
  504. /package/dest/{avm → public/avm}/serialization/buffer_cursor.d.ts +0 -0
  505. /package/src/{acvm → private/acvm}/index.ts +0 -0
  506. /package/src/{avm → public/avm}/bytecode_utils.ts +0 -0
  507. /package/src/{avm → public/avm}/opcodes/.eslintrc.cjs +0 -0
  508. /package/src/{avm → public/avm}/opcodes/accrued_substate.ts +0 -0
  509. /package/src/{avm → public/avm}/opcodes/addressing_mode.ts +0 -0
  510. /package/src/{avm → public/avm}/opcodes/arithmetic.ts +0 -0
  511. /package/src/{avm → public/avm}/opcodes/bitwise.ts +0 -0
  512. /package/src/{avm → public/avm}/opcodes/comparators.ts +0 -0
  513. /package/src/{avm → public/avm}/opcodes/environment_getters.ts +0 -0
  514. /package/src/{avm → public/avm}/opcodes/instruction_impl.ts +0 -0
  515. /package/src/{avm → public/avm}/opcodes/memory.ts +0 -0
  516. /package/src/{avm → public/avm}/opcodes/storage.ts +0 -0
  517. /package/src/{avm → public/avm}/serialization/buffer_cursor.ts +0 -0
@@ -0,0 +1,486 @@
1
+ import { CANONICAL_AUTH_REGISTRY_ADDRESS, DEPLOYER_CONTRACT_ADDRESS, FEE_JUICE_ADDRESS, MULTI_CALL_ENTRYPOINT_ADDRESS, REGISTERER_CONTRACT_ADDRESS, ROUTER_ADDRESS } from '@aztec/constants';
2
+ import { poseidon2Hash } from '@aztec/foundation/crypto';
3
+ import { Fr } from '@aztec/foundation/fields';
4
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
5
+ import { createLogger } from '@aztec/foundation/log';
6
+ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
7
+ import { AvmPublicDataReadTreeHint, PublicDataWrite } from '@aztec/stdlib/avm';
8
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import { SerializableContractInstance } from '@aztec/stdlib/contract';
10
+ import { computeNoteHashNonce, computePublicDataTreeLeafSlot, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
11
+ import { SharedMutableValues, SharedMutableValuesWithHash } from '@aztec/stdlib/shared-mutable';
12
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
13
+ import { strict as assert } from 'assert';
14
+ import cloneDeep from 'lodash.clonedeep';
15
+ import { getPublicFunctionDebugName } from '../../../common/debug_fn_name.js';
16
+ import { NullifierCollisionError, NullifierManager } from './nullifiers.js';
17
+ import { PublicStorage } from './public_storage.js';
18
+ /**
19
+ * A class to manage persistable AVM state for contract calls.
20
+ * Maintains a cache of the current world state,
21
+ * a trace of all side effects.
22
+ *
23
+ * The simulator should make any world state / tree queries through this object.
24
+ *
25
+ * Manages merging of successful/reverted child state into current state.
26
+ */ export class AvmPersistableStateManager {
27
+ worldStateDB;
28
+ trace;
29
+ publicStorage;
30
+ nullifiers;
31
+ doMerkleOperations;
32
+ db;
33
+ firstNullifier;
34
+ log;
35
+ /** Make sure a forked state is never merged twice. */ alreadyMergedIntoParent;
36
+ constructor(/** Reference to node storage */ worldStateDB, /** Side effect trace */ // TODO(5818): make private once no longer accessed in executor
37
+ trace, /** Public storage, including cached writes */ publicStorage = new PublicStorage(worldStateDB), /** Nullifier set, including cached/recently-emitted nullifiers */ nullifiers = new NullifierManager(worldStateDB), doMerkleOperations = false, /** DB interface for merkle tree operations */ db, firstNullifier){
38
+ this.worldStateDB = worldStateDB;
39
+ this.trace = trace;
40
+ this.publicStorage = publicStorage;
41
+ this.nullifiers = nullifiers;
42
+ this.doMerkleOperations = doMerkleOperations;
43
+ this.db = db;
44
+ this.firstNullifier = firstNullifier;
45
+ this.log = createLogger('simulator:avm:state_manager');
46
+ this.alreadyMergedIntoParent = false;
47
+ }
48
+ /**
49
+ * Create a new state manager
50
+ */ static create(worldStateDB, trace, doMerkleOperations = false, firstNullifier) {
51
+ // TODO(dbanks12): temporary until we establish a better world state interface
52
+ const db = worldStateDB.getMerkleInterface();
53
+ return new AvmPersistableStateManager(worldStateDB, trace, /*publicStorage=*/ new PublicStorage(worldStateDB), /*nullifiers=*/ new NullifierManager(worldStateDB), /*doMerkleOperations=*/ doMerkleOperations, db, firstNullifier);
54
+ }
55
+ /**
56
+ * Create a new state manager forked from this one
57
+ */ async fork() {
58
+ await this.worldStateDB.createCheckpoint();
59
+ return new AvmPersistableStateManager(this.worldStateDB, this.trace.fork(), this.publicStorage.fork(), this.nullifiers.fork(), this.doMerkleOperations, this.db, this.firstNullifier);
60
+ }
61
+ /**
62
+ * Accept forked world state modifications & traced side effects / hints
63
+ */ async merge(forkedState) {
64
+ await this._merge(forkedState, /*reverted=*/ false);
65
+ }
66
+ /**
67
+ * Reject forked world state modifications & traced side effects, keep traced hints
68
+ */ async reject(forkedState) {
69
+ await this._merge(forkedState, /*reverted=*/ true);
70
+ }
71
+ async _merge(forkedState, reverted) {
72
+ // sanity check to avoid merging the same forked trace twice
73
+ assert(!forkedState.alreadyMergedIntoParent, 'Cannot merge forked state that has already been merged into its parent!');
74
+ forkedState.alreadyMergedIntoParent = true;
75
+ this.publicStorage.acceptAndMerge(forkedState.publicStorage);
76
+ this.nullifiers.acceptAndMerge(forkedState.nullifiers);
77
+ this.trace.merge(forkedState.trace, reverted);
78
+ if (reverted) {
79
+ await this.worldStateDB.revertCheckpoint();
80
+ if (this.doMerkleOperations) {
81
+ this.log.trace(`Rolled back nullifier tree to root ${new Fr((await this.db.getTreeInfo(MerkleTreeId.NULLIFIER_TREE)).root)}`);
82
+ }
83
+ } else {
84
+ this.log.trace('Merging forked state into parent...');
85
+ await this.worldStateDB.commitCheckpoint();
86
+ }
87
+ }
88
+ /**
89
+ * Write to public storage, journal/trace the write.
90
+ *
91
+ * @param contractAddress - the address of the contract whose storage is being written to
92
+ * @param slot - the slot in the contract's storage being written to
93
+ * @param value - the value being written to the slot
94
+ */ async writeStorage(contractAddress, slot, value, protocolWrite = false) {
95
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
96
+ this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}, leafSlot=${leafSlot}`);
97
+ if (this.doMerkleOperations) {
98
+ // write to native merkle trees
99
+ const publicDataWrite = new PublicDataWrite(leafSlot, value);
100
+ const result = await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
101
+ publicDataWrite.toBuffer()
102
+ ]);
103
+ assert(result !== undefined, 'Public data tree insertion error. You might want to disable doMerkleOperations.');
104
+ this.log.trace(`Inserted public data tree leaf at leafSlot ${leafSlot}, value: ${value}`);
105
+ // low leaf hint
106
+ const lowLeafPreimage = result.lowLeavesWitnessData[0].leafPreimage;
107
+ const lowLeafIndex = result.lowLeavesWitnessData[0].index;
108
+ const lowLeafPath = result.lowLeavesWitnessData[0].siblingPath.toFields();
109
+ // new leaf insertion
110
+ const newLeafPreimage = cloneDeep(lowLeafPreimage);
111
+ let insertionPath;
112
+ if (result.insertionWitnessData.length === 0) {
113
+ assert(newLeafPreimage.value.equals(value), `Value mismatch when performing public data write (got value: ${value}, value in tree: ${newLeafPreimage.value})`);
114
+ } else {
115
+ // The new leaf preimage should have the new value and slot
116
+ newLeafPreimage.slot = leafSlot;
117
+ newLeafPreimage.value = value;
118
+ // TODO: is this necessary?! Why doesn't sequentialInsert return the newLeafPreimage via
119
+ // result.insertionWitnessData[0].leafPreimage?
120
+ this.log.trace(`newLeafPreimage.slot: ${newLeafPreimage.slot}, newLeafPreimage.value: ${newLeafPreimage.value}, insertionIndex: ${result.insertionWitnessData[0].index}`);
121
+ insertionPath = result.insertionWitnessData[0].siblingPath.toFields();
122
+ }
123
+ await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite, lowLeafPreimage, new Fr(lowLeafIndex), lowLeafPath, newLeafPreimage, insertionPath);
124
+ } else {
125
+ // Cache storage writes for later reference/reads
126
+ this.publicStorage.write(contractAddress, slot, value);
127
+ await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
128
+ }
129
+ }
130
+ /**
131
+ * Read from public storage, trace the read.
132
+ *
133
+ * @param contractAddress - the address of the contract whose storage is being read from
134
+ * @param slot - the slot in the contract's storage being read from
135
+ * @returns the latest value written to slot, or 0 if never written to before
136
+ */ async readStorage(contractAddress, slot) {
137
+ if (this.doMerkleOperations) {
138
+ const { value, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(contractAddress, slot);
139
+ this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, leafPath);
140
+ return value;
141
+ } else {
142
+ const read = await this.publicStorage.read(contractAddress, slot);
143
+ this.log.trace(`Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`);
144
+ this.trace.tracePublicStorageRead(contractAddress, slot, read.value);
145
+ return read.value;
146
+ }
147
+ }
148
+ async getPublicDataMembership(contractAddress, slot) {
149
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
150
+ const treeId = MerkleTreeId.PUBLIC_DATA_TREE;
151
+ // Get leaf if present, low leaf if absent
152
+ // If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
153
+ const { preimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, leafSlot.toBigInt());
154
+ // The index and preimage here is either the low leaf or the leaf itself (depending on the value of update flag)
155
+ // 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
156
+ const leafPath = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafOrLowLeafIndex);
157
+ const leafPreimage = preimage;
158
+ const value = alreadyPresent ? leafPreimage.value : Fr.zero(); // default value of 0
159
+ if (!alreadyPresent) {
160
+ this.log.trace(`Slot has never been written before!`);
161
+ // Sanity check that the leaf slot is skipped by low leaf when it doesn't exist
162
+ assert(leafPreimage.slot.toBigInt() < leafSlot.toBigInt() && (leafPreimage.nextIndex === 0n || leafPreimage.nextSlot.toBigInt() > leafSlot.toBigInt()), 'Public data tree low leaf should skip the target leaf slot when the target leaf does not exist or is the max value.');
163
+ }
164
+ this.log.trace(`Storage read results (address=${contractAddress}, slot=${slot}, leafSlot=${leafSlot}): value=${value}, previouslyWritten=${alreadyPresent}`);
165
+ return {
166
+ value,
167
+ leafPreimage,
168
+ leafIndex: new Fr(leafOrLowLeafIndex),
169
+ leafPath: leafPath.toFields()
170
+ };
171
+ }
172
+ /**
173
+ * Read from public storage, don't trace the read.
174
+ *
175
+ * @param contractAddress - the address of the contract whose storage is being read from
176
+ * @param slot - the slot in the contract's storage being read from
177
+ * @returns the latest value written to slot, or 0 if never written to before
178
+ */ async peekStorage(contractAddress, slot) {
179
+ const { value, cached } = await this.publicStorage.read(contractAddress, slot);
180
+ this.log.trace(`Storage peek (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`);
181
+ return Promise.resolve(value);
182
+ }
183
+ // TODO(4886): We currently don't silo note hashes.
184
+ /**
185
+ * Check if a note hash exists at the given leaf index, trace the check.
186
+ *
187
+ * @param contractAddress - the address of the contract whose storage is being read from
188
+ * @param noteHash - the unsiloed note hash being checked
189
+ * @param leafIndex - the leaf index being checked
190
+ * @returns true if the note hash exists at the given leaf index, false otherwise
191
+ */ async checkNoteHashExists(contractAddress, noteHash, leafIndex) {
192
+ const gotLeafValue = await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt()) ?? Fr.ZERO;
193
+ const exists = gotLeafValue.equals(noteHash);
194
+ this.log.trace(`noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`);
195
+ if (this.doMerkleOperations) {
196
+ const path = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
197
+ this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path.toFields());
198
+ } else {
199
+ this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists);
200
+ }
201
+ return Promise.resolve(exists);
202
+ }
203
+ /**
204
+ * Write a raw note hash, silo it and make it unique, then trace the write.
205
+ * @param noteHash - the unsiloed note hash to write
206
+ */ async writeNoteHash(contractAddress, noteHash) {
207
+ this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
208
+ const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
209
+ await this.writeSiloedNoteHash(siloedNoteHash);
210
+ }
211
+ /**
212
+ * Write a note hash, make it unique, trace the write.
213
+ * @param siloedNoteHash - the non unique note hash to write
214
+ */ async writeSiloedNoteHash(siloedNoteHash) {
215
+ const nonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
216
+ const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
217
+ await this.writeUniqueNoteHash(uniqueNoteHash);
218
+ }
219
+ /**
220
+ * Write a note hash, trace the write.
221
+ * @param uniqueNoteHash - the siloed unique hash to write
222
+ */ async writeUniqueNoteHash(uniqueNoteHash) {
223
+ this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
224
+ if (this.doMerkleOperations) {
225
+ // Should write a helper for this
226
+ const treeInfo = await this.db.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE);
227
+ const leafIndex = new Fr(treeInfo.size);
228
+ await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [
229
+ uniqueNoteHash
230
+ ]);
231
+ const insertionPath = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
232
+ this.trace.traceNewNoteHash(uniqueNoteHash, leafIndex, insertionPath.toFields());
233
+ } else {
234
+ this.trace.traceNewNoteHash(uniqueNoteHash);
235
+ }
236
+ }
237
+ /**
238
+ * Check if a nullifier exists, trace the check.
239
+ * @param contractAddress - address of the contract that the nullifier is associated with
240
+ * @param nullifier - the unsiloed nullifier to check
241
+ * @returns exists - whether the nullifier exists in the nullifier set
242
+ */ async checkNullifierExists(contractAddress, nullifier) {
243
+ this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
244
+ const siloedNullifier = await siloNullifier(contractAddress, nullifier);
245
+ if (this.doMerkleOperations) {
246
+ const { exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath } = await this.getNullifierMembership(siloedNullifier);
247
+ this.trace.traceNullifierCheck(siloedNullifier, exists, leafOrLowLeafPreimage, new Fr(leafOrLowLeafIndex), leafOrLowLeafPath);
248
+ return Promise.resolve(exists);
249
+ } else {
250
+ const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
251
+ this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
252
+ this.trace.traceNullifierCheck(siloedNullifier, exists);
253
+ return Promise.resolve(exists);
254
+ }
255
+ }
256
+ /**
257
+ * Helper to get membership information for a siloed nullifier when checking its existence.
258
+ * Optionally trace the nullifier check.
259
+ *
260
+ * @param siloedNullifier - the siloed nullifier to get membership information for
261
+ * @returns
262
+ * - exists - whether the nullifier exists in the nullifier set
263
+ * - leafOrLowLeafPreimage - the preimage of the nullifier leaf or its low-leaf if it doesn't exist
264
+ * - leafOrLowLeafIndex - the leaf index of the nullifier leaf or its low-leaf if it doesn't exist
265
+ * - leafOrLowLeafPath - the sibling path of the nullifier leaf or its low-leaf if it doesn't exist
266
+ */ async getNullifierMembership(siloedNullifier) {
267
+ // Get leaf if present, low leaf if absent
268
+ // If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
269
+ const treeId = MerkleTreeId.NULLIFIER_TREE;
270
+ const { preimage: leafPreimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, siloedNullifier.toBigInt());
271
+ this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${alreadyPresent})`);
272
+ const leafPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
273
+ if (alreadyPresent) {
274
+ this.log.trace(`Siloed nullifier ${siloedNullifier} exists at leafIndex=${leafOrLowLeafIndex}`);
275
+ } else {
276
+ // Sanity check that the leaf value is skipped by low leaf when it doesn't exist
277
+ assert(leafPreimage.nullifier.toBigInt() < siloedNullifier.toBigInt() && (leafPreimage.nextIndex === 0n || leafPreimage.nextNullifier.toBigInt() > siloedNullifier.toBigInt()), 'Nullifier tree low leaf should skip the target leaf nullifier when the target leaf does not exist.');
278
+ }
279
+ return {
280
+ exists: alreadyPresent,
281
+ leafOrLowLeafPreimage: leafPreimage,
282
+ leafOrLowLeafIndex,
283
+ leafOrLowLeafPath: leafPath.toFields()
284
+ };
285
+ }
286
+ /**
287
+ * Write a nullifier to the nullifier set, trace the write.
288
+ * @param contractAddress - address of the contract that the nullifier is associated with
289
+ * @param nullifier - the unsiloed nullifier to write
290
+ */ async writeNullifier(contractAddress, nullifier) {
291
+ this.log.trace(`Inserting new nullifier (address=${nullifier}, nullifier=${contractAddress})`);
292
+ const siloedNullifier = await siloNullifier(contractAddress, nullifier);
293
+ await this.writeSiloedNullifier(siloedNullifier);
294
+ }
295
+ /**
296
+ * Write a nullifier to the nullifier set, trace the write.
297
+ * @param siloedNullifier - the siloed nullifier to write
298
+ */ async writeSiloedNullifier(siloedNullifier) {
299
+ this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
300
+ if (this.doMerkleOperations) {
301
+ const treeId = MerkleTreeId.NULLIFIER_TREE;
302
+ const { preimage: leafPreimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, siloedNullifier.toBigInt());
303
+ if (alreadyPresent) {
304
+ this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${leafOrLowLeafIndex}!`);
305
+ // If the nullifier is already present, we should not insert it again
306
+ // instead we provide the direct membership path
307
+ const membershipPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
308
+ // This just becomes a nullifier read hint
309
+ this.trace.traceNullifierCheck(siloedNullifier, /*exists=*/ alreadyPresent, leafPreimage, new Fr(leafOrLowLeafIndex), membershipPath.toFields());
310
+ throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
311
+ } else {
312
+ const appendResult = await this.db.sequentialInsert(treeId, [
313
+ siloedNullifier.toBuffer()
314
+ ]);
315
+ const lowLeafWitnessData = appendResult.lowLeavesWitnessData[0];
316
+ const lowLeafPreimage = lowLeafWitnessData.leafPreimage;
317
+ const lowLeafIndex = lowLeafWitnessData.index;
318
+ const lowLeafPath = lowLeafWitnessData.siblingPath.toFields();
319
+ const insertionPath = appendResult.insertionWitnessData[0].siblingPath.toFields();
320
+ this.trace.traceNewNullifier(siloedNullifier, lowLeafPreimage, new Fr(lowLeafIndex), lowLeafPath, insertionPath);
321
+ }
322
+ } else {
323
+ // Cache pending nullifiers for later access
324
+ await this.nullifiers.append(siloedNullifier);
325
+ this.trace.traceNewNullifier(siloedNullifier);
326
+ }
327
+ }
328
+ async writeSiloedNullifiersFromPrivate(siloedNullifiers) {
329
+ for (const siloedNullifier of siloedNullifiers.filter((n)=>!n.isEmpty())){
330
+ await this.writeSiloedNullifier(siloedNullifier);
331
+ }
332
+ }
333
+ /**
334
+ * Check if an L1 to L2 message exists, trace the check.
335
+ * @param msgHash - the message hash to check existence of
336
+ * @param msgLeafIndex - the message leaf index to use in the check
337
+ * @returns exists - whether the message exists in the L1 to L2 Messages tree
338
+ */ async checkL1ToL2MessageExists(contractAddress, msgHash, msgLeafIndex) {
339
+ const valueAtIndex = await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt()) ?? Fr.ZERO;
340
+ const exists = valueAtIndex.equals(msgHash);
341
+ this.log.trace(`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`);
342
+ if (this.doMerkleOperations) {
343
+ const path = await this.db.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, msgLeafIndex.toBigInt());
344
+ this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists, path.toFields());
345
+ } else {
346
+ this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists);
347
+ }
348
+ return Promise.resolve(exists);
349
+ }
350
+ /**
351
+ * Write an L2 to L1 message.
352
+ * @param contractAddress - L2 contract address that created this message
353
+ * @param recipient - L1 contract address to send the message to.
354
+ * @param content - Message content.
355
+ */ writeL2ToL1Message(contractAddress, recipient, content) {
356
+ this.log.trace(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
357
+ this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
358
+ }
359
+ /**
360
+ * Write a public log
361
+ * @param contractAddress - address of the contract that emitted the log
362
+ * @param log - log contents
363
+ */ writePublicLog(contractAddress, log) {
364
+ this.log.trace(`PublicLog(${contractAddress}) += event with ${log.length} fields.`);
365
+ this.trace.tracePublicLog(contractAddress, log);
366
+ }
367
+ /**
368
+ * Get a contract instance.
369
+ * @param contractAddress - address of the contract instance to retrieve.
370
+ * @returns the contract instance or undefined if it does not exist.
371
+ */ async getContractInstance(contractAddress) {
372
+ this.log.trace(`Getting contract instance for address ${contractAddress}`);
373
+ const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress);
374
+ const exists = instanceWithAddress !== undefined;
375
+ const instance = exists ? new SerializableContractInstance(instanceWithAddress) : undefined;
376
+ if (!exists) {
377
+ this.log.debug(`Contract instance NOT FOUND (address=${contractAddress})`);
378
+ this.trace.traceGetContractInstance(contractAddress, exists);
379
+ return undefined;
380
+ }
381
+ this.log.trace(`Got contract instance (address=${contractAddress}): instance=${jsonStringify(instance)}`);
382
+ // Canonical addresses do not trigger nullifier & public storage checks
383
+ if (contractAddressIsCanonical(contractAddress)) {
384
+ this.trace.traceGetContractInstance(contractAddress, exists, instance);
385
+ return instance;
386
+ }
387
+ // This will decide internally whether to check the nullifier tree or not depending on doMerkleOperations.
388
+ const nullifierExistsInTree = await this.checkNullifierExists(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), contractAddress.toField());
389
+ assert(exists == nullifierExistsInTree, 'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!');
390
+ if (this.doMerkleOperations) {
391
+ // TODO(fcarreiro): this should be done via a public read.
392
+ const { updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress);
393
+ this.trace.traceGetContractInstance(contractAddress, exists, instance, updateMembership, updatePreimage);
394
+ } else {
395
+ this.trace.traceGetContractInstance(contractAddress, exists, instance);
396
+ }
397
+ return instance;
398
+ }
399
+ /**
400
+ * Get a contract class.
401
+ * @param classId - class id to retrieve.
402
+ * @returns the contract class or undefined if it does not exist.
403
+ */ async getContractClass(classId) {
404
+ this.log.trace(`Getting contract class for id ${classId}`);
405
+ const klass = await this.worldStateDB.getContractClass(classId);
406
+ const exists = klass !== undefined;
407
+ let extendedClass = undefined;
408
+ // Note: We currently do not generate info to check the nullifier tree, because
409
+ // this is not needed for our use cases.
410
+ if (exists) {
411
+ this.log.trace(`Got contract class (id=${classId})`);
412
+ // Extend class information with public bytecode commitment.
413
+ const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(classId);
414
+ assert(bytecodeCommitment, `Bytecode commitment was not found in DB for contract class (${classId}). This should not happen!`);
415
+ extendedClass = {
416
+ ...klass,
417
+ publicBytecodeCommitment: bytecodeCommitment
418
+ };
419
+ } else {
420
+ this.log.debug(`Contract instance NOT FOUND (id=${classId})`);
421
+ }
422
+ this.trace.traceGetContractClass(classId, exists, extendedClass);
423
+ return extendedClass;
424
+ }
425
+ /**
426
+ * Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
427
+ */ async getBytecode(contractAddress) {
428
+ this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
429
+ const contractInstance = await this.getContractInstance(contractAddress);
430
+ if (!contractInstance) {
431
+ return undefined;
432
+ }
433
+ const contractClass = await this.getContractClass(contractInstance.currentContractClassId);
434
+ assert(contractClass, `Contract class not found in DB, but a contract instance was found with this class ID (${contractInstance.currentContractClassId}). This should not happen!`);
435
+ // NOTE: If the contract instance is not found, we assume it has not been deployed.
436
+ // It doesnt matter what the values of the contract instance are in this case, as long as we tag it with exists=false.
437
+ // This will hint to the avm circuit to just perform the non-membership check on the address and disregard the bytecode hash
438
+ return contractClass.packedBytecode;
439
+ }
440
+ async getContractUpdateHints(contractAddress) {
441
+ const { sharedMutableSlot, sharedMutableHashSlot } = await SharedMutableValuesWithHash.getContractUpdateSlots(contractAddress);
442
+ const { value: hash, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(ProtocolContractAddress.ContractInstanceDeployer, sharedMutableHashSlot);
443
+ const updateMembership = new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, leafPath);
444
+ const readStorage = async (storageSlot)=>(await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value;
445
+ const sharedMutableValues = await SharedMutableValues.readFromTree(sharedMutableSlot, readStorage);
446
+ const updatePreimage = sharedMutableValues.toFields();
447
+ if (!hash.isZero()) {
448
+ const hashed = await poseidon2Hash(updatePreimage);
449
+ if (!hashed.equals(hash)) {
450
+ throw new Error(`Update hint hash mismatch: ${hash} != ${hashed}`);
451
+ }
452
+ this.log.trace(`Non empty update hint found for contract ${contractAddress}`);
453
+ } else {
454
+ if (updatePreimage.some((f)=>!f.isZero())) {
455
+ throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`);
456
+ }
457
+ this.log.trace(`No update hint found for contract ${contractAddress}`);
458
+ }
459
+ return {
460
+ updateMembership,
461
+ updatePreimage
462
+ };
463
+ }
464
+ traceEnqueuedCall(publicCallRequest, calldata, reverted) {
465
+ this.trace.traceEnqueuedCall(publicCallRequest, calldata, reverted);
466
+ }
467
+ async getPublicFunctionDebugName(avmEnvironment) {
468
+ return await getPublicFunctionDebugName(this.worldStateDB, avmEnvironment.address, avmEnvironment.calldata);
469
+ }
470
+ async getLeafOrLowLeafInfo(treeId, key) {
471
+ // "key" is siloed slot (leafSlot) or siloed nullifier
472
+ const leafOrLowLeafInfo = await this.db.getPreviousValueIndex(treeId, key);
473
+ assert(leafOrLowLeafInfo !== undefined, `${MerkleTreeId[treeId]} low leaf index should always be found (even if target leaf does not exist)`);
474
+ const { index: leafOrLowLeafIndex, alreadyPresent } = leafOrLowLeafInfo;
475
+ const leafPreimage = await this.db.getLeafPreimage(treeId, leafOrLowLeafIndex);
476
+ assert(leafPreimage !== undefined, `${MerkleTreeId[treeId]} low leaf preimage should never be undefined (even if target leaf does not exist)`);
477
+ return {
478
+ preimage: leafPreimage,
479
+ leafOrLowLeafIndex,
480
+ alreadyPresent
481
+ };
482
+ }
483
+ }
484
+ function contractAddressIsCanonical(contractAddress) {
485
+ return contractAddress.equals(AztecAddress.fromNumber(CANONICAL_AUTH_REGISTRY_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(REGISTERER_CONTRACT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(MULTI_CALL_ENTRYPOINT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(FEE_JUICE_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(ROUTER_ADDRESS));
486
+ }
@@ -1,5 +1,5 @@
1
- import { Fr } from '@aztec/foundation/fields';
2
- import type { CommitmentsDB } from '../../server.js';
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import type { WorldStateDB } from '../../public_db_sources.js';
3
3
  /**
4
4
  * A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
5
5
  * Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
@@ -14,7 +14,7 @@ export declare class NullifierManager {
14
14
  private readonly parent?;
15
15
  constructor(
16
16
  /** Reference to node storage. Checked on parent cache-miss. */
17
- hostNullifiers: CommitmentsDB,
17
+ hostNullifiers: WorldStateDB,
18
18
  /** Cache of siloed nullifiers. */
19
19
  cache?: Set<bigint>,
20
20
  /** Parent nullifier manager to fall back on */
@@ -39,10 +39,12 @@ export declare class NullifierManager {
39
39
  *
40
40
  * @param siloedNullifier - the nullifier to check for
41
41
  * @returns exists: whether the nullifier exists at all,
42
- * isPending: whether the nullifier was found in a cache,
43
- * leafIndex: the nullifier's leaf index if it exists and is not pending (comes from host state).
42
+ * cacheHit: whether the nullifier was found in a cache,
44
43
  */
45
- checkExists(siloedNullifier: Fr): Promise<[/*exists=*/ boolean, /*isPending=*/ boolean, /*leafIndex=*/ Fr]>;
44
+ checkExists(siloedNullifier: Fr): Promise<{
45
+ exists: boolean;
46
+ cacheHit: boolean;
47
+ }>;
46
48
  /**
47
49
  * Stage a new nullifier (append it to the cache).
48
50
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullifiers.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/journal/nullifiers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,gBAAgB;IAEzB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,kCAAkC;IAClC,OAAO,CAAC,KAAK;IACb,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IALxB,+DAA+D;IAC9C,cAAc,EAAE,YAAY;IAC7C,kCAAkC;IAC1B,KAAK,GAAE,GAAG,CAAC,MAAM,CAAa;IACtC,+CAA+C;IAC9B,MAAM,CAAC,8BAAkB;IAG5C;;OAEG;IACI,IAAI;IAIX;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;OAUG;IACU,WAAW,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAmB9F;;;;OAIG;IACU,MAAM,CAAC,eAAe,EAAE,EAAE;IAQvC;;;;OAIG;IACI,cAAc,CAAC,kBAAkB,EAAE,gBAAgB;CAU3D;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAI5C"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
3
+ * Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
4
+ * When a contract call completes, its cached nullifier set can be merged into its parent's.
5
+ */ export class NullifierManager {
6
+ hostNullifiers;
7
+ cache;
8
+ parent;
9
+ constructor(/** Reference to node storage. Checked on parent cache-miss. */ hostNullifiers, /** Cache of siloed nullifiers. */ cache = new Set(), /** Parent nullifier manager to fall back on */ parent){
10
+ this.hostNullifiers = hostNullifiers;
11
+ this.cache = cache;
12
+ this.parent = parent;
13
+ }
14
+ /**
15
+ * Create a new nullifiers manager forked from this one
16
+ */ fork() {
17
+ return new NullifierManager(this.hostNullifiers, new Set(), this);
18
+ }
19
+ /**
20
+ * Get a nullifier's existence in this' cache or parent's (recursively).
21
+ * DOES NOT CHECK HOST STORAGE!
22
+ * @param siloedNullifier - the nullifier to check for
23
+ * @returns exists: whether the nullifier exists in cache here or in parent's
24
+ */ checkExistsHereOrParent(siloedNullifier) {
25
+ // First check this cache
26
+ let existsAsPending = this.cache.has(siloedNullifier.toBigInt());
27
+ // Then try parent's nullifier cache
28
+ if (!existsAsPending && this.parent) {
29
+ // Note: this will recurse to grandparent/etc until a cache-hit is encountered.
30
+ existsAsPending = this.parent.checkExistsHereOrParent(siloedNullifier);
31
+ }
32
+ return existsAsPending;
33
+ }
34
+ /**
35
+ * Get a nullifier's existence status.
36
+ * 1. Check cache.
37
+ * 2. Check parent cache.
38
+ * 3. Fall back to the host state.
39
+ * 4. Not found! Nullifier does not exist.
40
+ *
41
+ * @param siloedNullifier - the nullifier to check for
42
+ * @returns exists: whether the nullifier exists at all,
43
+ * cacheHit: whether the nullifier was found in a cache,
44
+ */ async checkExists(siloedNullifier) {
45
+ // Check this cache and parent's (recursively)
46
+ const cacheHit = this.checkExistsHereOrParent(siloedNullifier);
47
+ let existsInTree = false;
48
+ if (!cacheHit) {
49
+ // Finally try the host's Aztec state (a trip to the database)
50
+ //const leafOrLowLeafIndex = await this.hostNullifiers.db.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, siloedNullifier.toBigInt());
51
+ //assert(
52
+ // leafOrLowLeafIndex !== undefined,
53
+ // `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]} low leaf index should always be found (even if target leaf does not exist)`,
54
+ //);
55
+ //existsInTree = leafOrLowLeafIndex.alreadyPresent;
56
+ const leafIndex = await this.hostNullifiers.getNullifierIndex(siloedNullifier);
57
+ existsInTree = leafIndex !== undefined;
58
+ }
59
+ const exists = cacheHit || existsInTree;
60
+ return Promise.resolve({
61
+ exists,
62
+ cacheHit
63
+ });
64
+ }
65
+ /**
66
+ * Stage a new nullifier (append it to the cache).
67
+ *
68
+ * @param siloedNullifier - the nullifier to stage
69
+ */ async append(siloedNullifier) {
70
+ const { exists } = await this.checkExists(siloedNullifier);
71
+ if (exists) {
72
+ throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
73
+ }
74
+ this.cache.add(siloedNullifier.toBigInt());
75
+ }
76
+ /**
77
+ * Merges another nullifier cache into this one.
78
+ *
79
+ * @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
80
+ */ acceptAndMerge(incomingNullifiers) {
81
+ for (const incomingNullifier of incomingNullifiers.cache){
82
+ if (this.cache.has(incomingNullifier)) {
83
+ throw new NullifierCollisionError(`Failed to merge in fork's cached nullifiers. Siloed nullifier ${incomingNullifier} already exists in parent cache.`);
84
+ }
85
+ }
86
+ this.cache = new Set([
87
+ ...this.cache,
88
+ ...incomingNullifiers.cache
89
+ ]);
90
+ }
91
+ }
92
+ export class NullifierCollisionError extends Error {
93
+ constructor(message, ...rest){
94
+ super(message, ...rest);
95
+ this.name = 'NullifierCollisionError';
96
+ }
97
+ }
@@ -1,6 +1,6 @@
1
- import { type AztecAddress } from '@aztec/circuits.js';
2
1
  import { Fr } from '@aztec/foundation/fields';
3
- import type { PublicStateDB } from '../../server.js';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { PublicStateDB } from '../../../common/db_interfaces.js';
4
4
  type PublicStorageReadResult = {
5
5
  value: Fr;
6
6
  cached: boolean;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public_storage.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/journal/public_storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAa;IAKtB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;;IAGzC,+DAA+D;IAC9C,iBAAiB,EAAE,aAAa;IACjD,qDAAqD;IACpC,MAAM,CAAC,2BAAe;IAKzC;;OAEG;IACI,IAAI;IAIX;;;;;;;OAOG;IACI,gBAAgB,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS;IAWhF;;;;;;;;;;OAUG;IACU,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmB5F;;;;;;OAMG;IACI,KAAK,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;IAI/D;;;;OAIG;IACI,cAAc,CAAC,qBAAqB,EAAE,aAAa;CAG3D"}