@aztec/simulator 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (304) hide show
  1. package/dest/acvm/acvm.js +18 -21
  2. package/dest/acvm/acvm_types.js +3 -2
  3. package/dest/acvm/deserialize.js +9 -13
  4. package/dest/acvm/index.js +0 -1
  5. package/dest/acvm/oracle/index.js +0 -1
  6. package/dest/acvm/oracle/oracle.js +42 -23
  7. package/dest/acvm/oracle/typed_oracle.js +36 -38
  8. package/dest/acvm/serialize.js +7 -14
  9. package/dest/avm/avm_context.js +24 -27
  10. package/dest/avm/avm_contract_call_result.js +12 -7
  11. package/dest/avm/avm_execution_environment.js +10 -7
  12. package/dest/avm/avm_gas.js +93 -56
  13. package/dest/avm/avm_machine_state.js +60 -61
  14. package/dest/avm/avm_memory_types.js +166 -255
  15. package/dest/avm/avm_simulator.js +68 -47
  16. package/dest/avm/avm_tree.js +282 -276
  17. package/dest/avm/bytecode_utils.js +8 -6
  18. package/dest/avm/errors.js +46 -63
  19. package/dest/avm/fixtures/avm_simulation_tester.js +18 -17
  20. package/dest/avm/fixtures/base_avm_simulation_tester.js +21 -16
  21. package/dest/avm/fixtures/index.js +27 -26
  22. package/dest/avm/fixtures/simple_contract_data_source.js +9 -13
  23. package/dest/avm/index.js +0 -1
  24. package/dest/avm/journal/index.js +0 -1
  25. package/dest/avm/journal/journal.js +147 -200
  26. package/dest/avm/journal/nullifiers.js +43 -46
  27. package/dest/avm/journal/public_storage.js +73 -87
  28. package/dest/avm/opcodes/accrued_substate.js +140 -110
  29. package/dest/avm/opcodes/addressing_mode.js +29 -31
  30. package/dest/avm/opcodes/arithmetic.js +17 -15
  31. package/dest/avm/opcodes/bitwise.js +40 -26
  32. package/dest/avm/opcodes/comparators.js +12 -10
  33. package/dest/avm/opcodes/contract.js +31 -29
  34. package/dest/avm/opcodes/control_flow.js +47 -43
  35. package/dest/avm/opcodes/conversion.js +30 -26
  36. package/dest/avm/opcodes/ec_add.js +35 -34
  37. package/dest/avm/opcodes/environment_getters.js +33 -33
  38. package/dest/avm/opcodes/external_calls.js +83 -74
  39. package/dest/avm/opcodes/hashing.js +69 -61
  40. package/dest/avm/opcodes/index.js +0 -1
  41. package/dest/avm/opcodes/instruction.js +31 -40
  42. package/dest/avm/opcodes/instruction_impl.js +12 -15
  43. package/dest/avm/opcodes/memory.js +177 -156
  44. package/dest/avm/opcodes/misc.js +27 -25
  45. package/dest/avm/opcodes/multi_scalar_mul.js +43 -41
  46. package/dest/avm/opcodes/storage.js +28 -25
  47. package/dest/avm/serialization/buffer_cursor.js +4 -4
  48. package/dest/avm/serialization/bytecode_serialization.js +292 -89
  49. package/dest/avm/serialization/instruction_serialization.js +67 -28
  50. package/dest/avm/test_utils.js +6 -9
  51. package/dest/client/client_execution_context.js +197 -219
  52. package/dest/client/db_oracle.js +4 -7
  53. package/dest/client/execution_note_cache.js +80 -81
  54. package/dest/client/index.js +0 -1
  55. package/dest/client/pick_notes.js +27 -30
  56. package/dest/client/private_execution.js +13 -14
  57. package/dest/client/simulator.js +44 -48
  58. package/dest/client/unconstrained_execution.js +8 -11
  59. package/dest/client/view_data_oracle.js +130 -139
  60. package/dest/common/debug_fn_name.js +1 -4
  61. package/dest/common/errors.js +30 -39
  62. package/dest/common/hashed_values_cache.js +16 -20
  63. package/dest/common/index.js +0 -1
  64. package/dest/common/message_load_oracle_inputs.js +7 -7
  65. package/dest/common/simulation_provider.js +3 -6
  66. package/dest/common.js +0 -1
  67. package/dest/providers/acvm_native.js +46 -32
  68. package/dest/providers/acvm_wasm.js +18 -10
  69. package/dest/providers/acvm_wasm_with_blobs.js +2 -5
  70. package/dest/providers/factory.js +5 -5
  71. package/dest/providers/index.js +0 -1
  72. package/dest/public/bytecode_errors.js +1 -2
  73. package/dest/public/db_interfaces.js +1 -2
  74. package/dest/public/execution.js +2 -4
  75. package/dest/public/executor_metrics.js +16 -12
  76. package/dest/public/fee_payment.js +2 -5
  77. package/dest/public/fixtures/index.js +0 -1
  78. package/dest/public/fixtures/public_tx_simulation_tester.js +13 -17
  79. package/dest/public/fixtures/utils.js +11 -14
  80. package/dest/public/index.js +0 -1
  81. package/dest/public/public_db_sources.js +79 -87
  82. package/dest/public/public_processor.js +310 -306
  83. package/dest/public/public_processor_metrics.js +46 -27
  84. package/dest/public/public_tx_context.js +97 -118
  85. package/dest/public/public_tx_simulator.js +299 -314
  86. package/dest/public/side_effect_errors.js +1 -2
  87. package/dest/public/side_effect_trace.js +44 -71
  88. package/dest/public/side_effect_trace_interface.js +1 -2
  89. package/dest/public/unique_class_ids.js +22 -27
  90. package/dest/public/utils.js +16 -11
  91. package/dest/server.js +0 -1
  92. package/dest/stats/index.js +0 -1
  93. package/dest/stats/stats.js +1 -2
  94. package/dest/test/utils.js +5 -4
  95. package/package.json +11 -11
  96. package/src/acvm/oracle/typed_oracle.ts +34 -34
  97. package/src/avm/avm_machine_state.ts +18 -14
  98. package/src/avm/avm_memory_types.ts +43 -183
  99. package/src/avm/avm_simulator.ts +37 -11
  100. package/src/avm/opcodes/accrued_substate.ts +7 -21
  101. package/src/avm/opcodes/addressing_mode.ts +9 -2
  102. package/src/avm/opcodes/arithmetic.ts +1 -3
  103. package/src/avm/opcodes/bitwise.ts +2 -6
  104. package/src/avm/opcodes/comparators.ts +1 -3
  105. package/src/avm/opcodes/contract.ts +1 -3
  106. package/src/avm/opcodes/control_flow.ts +1 -9
  107. package/src/avm/opcodes/conversion.ts +1 -3
  108. package/src/avm/opcodes/ec_add.ts +1 -3
  109. package/src/avm/opcodes/environment_getters.ts +1 -3
  110. package/src/avm/opcodes/external_calls.ts +3 -6
  111. package/src/avm/opcodes/hashing.ts +3 -9
  112. package/src/avm/opcodes/memory.ts +6 -20
  113. package/src/avm/opcodes/misc.ts +1 -3
  114. package/src/avm/opcodes/multi_scalar_mul.ts +1 -7
  115. package/src/avm/opcodes/storage.ts +2 -6
  116. package/src/client/index.ts +2 -2
  117. package/dest/acvm/acvm.d.ts +0 -35
  118. package/dest/acvm/acvm.d.ts.map +0 -1
  119. package/dest/acvm/acvm_types.d.ts +0 -10
  120. package/dest/acvm/acvm_types.d.ts.map +0 -1
  121. package/dest/acvm/deserialize.d.ts +0 -36
  122. package/dest/acvm/deserialize.d.ts.map +0 -1
  123. package/dest/acvm/index.d.ts +0 -6
  124. package/dest/acvm/index.d.ts.map +0 -1
  125. package/dest/acvm/oracle/index.d.ts +0 -14
  126. package/dest/acvm/oracle/index.d.ts.map +0 -1
  127. package/dest/acvm/oracle/oracle.d.ts +0 -49
  128. package/dest/acvm/oracle/oracle.d.ts.map +0 -1
  129. package/dest/acvm/oracle/typed_oracle.d.ts +0 -75
  130. package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
  131. package/dest/acvm/serialize.d.ts +0 -20
  132. package/dest/acvm/serialize.d.ts.map +0 -1
  133. package/dest/avm/avm_context.d.ts +0 -39
  134. package/dest/avm/avm_context.d.ts.map +0 -1
  135. package/dest/avm/avm_contract_call_result.d.ts +0 -30
  136. package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
  137. package/dest/avm/avm_execution_environment.d.ts +0 -21
  138. package/dest/avm/avm_execution_environment.d.ts.map +0 -1
  139. package/dest/avm/avm_gas.d.ts +0 -60
  140. package/dest/avm/avm_gas.d.ts.map +0 -1
  141. package/dest/avm/avm_machine_state.d.ts +0 -93
  142. package/dest/avm/avm_machine_state.d.ts.map +0 -1
  143. package/dest/avm/avm_memory_types.d.ts +0 -310
  144. package/dest/avm/avm_memory_types.d.ts.map +0 -1
  145. package/dest/avm/avm_simulator.d.ts +0 -37
  146. package/dest/avm/avm_simulator.d.ts.map +0 -1
  147. package/dest/avm/avm_tree.d.ts +0 -281
  148. package/dest/avm/avm_tree.d.ts.map +0 -1
  149. package/dest/avm/bytecode_utils.d.ts +0 -5
  150. package/dest/avm/bytecode_utils.d.ts.map +0 -1
  151. package/dest/avm/errors.d.ts +0 -121
  152. package/dest/avm/errors.d.ts.map +0 -1
  153. package/dest/avm/fixtures/avm_simulation_tester.d.ts +0 -21
  154. package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  155. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +0 -35
  156. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  157. package/dest/avm/fixtures/index.d.ts +0 -67
  158. package/dest/avm/fixtures/index.d.ts.map +0 -1
  159. package/dest/avm/fixtures/simple_contract_data_source.d.ts +0 -31
  160. package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  161. package/dest/avm/index.d.ts +0 -4
  162. package/dest/avm/index.d.ts.map +0 -1
  163. package/dest/avm/journal/index.d.ts +0 -2
  164. package/dest/avm/journal/index.d.ts.map +0 -1
  165. package/dest/avm/journal/journal.d.ts +0 -176
  166. package/dest/avm/journal/journal.d.ts.map +0 -1
  167. package/dest/avm/journal/nullifiers.d.ts +0 -62
  168. package/dest/avm/journal/nullifiers.d.ts.map +0 -1
  169. package/dest/avm/journal/public_storage.d.ts +0 -66
  170. package/dest/avm/journal/public_storage.d.ts.map +0 -1
  171. package/dest/avm/opcodes/accrued_substate.d.ts +0 -75
  172. package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
  173. package/dest/avm/opcodes/addressing_mode.d.ts +0 -27
  174. package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
  175. package/dest/avm/opcodes/arithmetic.d.ts +0 -37
  176. package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
  177. package/dest/avm/opcodes/bitwise.d.ts +0 -50
  178. package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
  179. package/dest/avm/opcodes/comparators.d.ts +0 -25
  180. package/dest/avm/opcodes/comparators.d.ts.map +0 -1
  181. package/dest/avm/opcodes/contract.d.ts +0 -21
  182. package/dest/avm/opcodes/contract.d.ts.map +0 -1
  183. package/dest/avm/opcodes/control_flow.d.ts +0 -41
  184. package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
  185. package/dest/avm/opcodes/conversion.d.ts +0 -17
  186. package/dest/avm/opcodes/conversion.d.ts.map +0 -1
  187. package/dest/avm/opcodes/ec_add.d.ts +0 -19
  188. package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
  189. package/dest/avm/opcodes/environment_getters.d.ts +0 -28
  190. package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
  191. package/dest/avm/opcodes/external_calls.d.ts +0 -50
  192. package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
  193. package/dest/avm/opcodes/hashing.d.ts +0 -36
  194. package/dest/avm/opcodes/hashing.d.ts.map +0 -1
  195. package/dest/avm/opcodes/index.d.ts +0 -16
  196. package/dest/avm/opcodes/index.d.ts.map +0 -1
  197. package/dest/avm/opcodes/instruction.d.ts +0 -70
  198. package/dest/avm/opcodes/instruction.d.ts.map +0 -1
  199. package/dest/avm/opcodes/instruction_impl.d.ts +0 -19
  200. package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
  201. package/dest/avm/opcodes/memory.d.ts +0 -74
  202. package/dest/avm/opcodes/memory.d.ts.map +0 -1
  203. package/dest/avm/opcodes/misc.d.ts +0 -17
  204. package/dest/avm/opcodes/misc.d.ts.map +0 -1
  205. package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
  206. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
  207. package/dest/avm/opcodes/storage.d.ts +0 -24
  208. package/dest/avm/opcodes/storage.d.ts.map +0 -1
  209. package/dest/avm/serialization/buffer_cursor.d.ts +0 -28
  210. package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
  211. package/dest/avm/serialization/bytecode_serialization.d.ts +0 -21
  212. package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  213. package/dest/avm/serialization/instruction_serialization.d.ts +0 -105
  214. package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
  215. package/dest/avm/test_utils.d.ts +0 -16
  216. package/dest/avm/test_utils.d.ts.map +0 -1
  217. package/dest/client/client_execution_context.d.ts +0 -214
  218. package/dest/client/client_execution_context.d.ts.map +0 -1
  219. package/dest/client/db_oracle.d.ts +0 -229
  220. package/dest/client/db_oracle.d.ts.map +0 -1
  221. package/dest/client/execution_note_cache.d.ts +0 -93
  222. package/dest/client/execution_note_cache.d.ts.map +0 -1
  223. package/dest/client/index.d.ts +0 -15
  224. package/dest/client/index.d.ts.map +0 -1
  225. package/dest/client/pick_notes.d.ts +0 -85
  226. package/dest/client/pick_notes.d.ts.map +0 -1
  227. package/dest/client/private_execution.d.ts +0 -19
  228. package/dest/client/private_execution.d.ts.map +0 -1
  229. package/dest/client/simulator.d.ts +0 -60
  230. package/dest/client/simulator.d.ts.map +0 -1
  231. package/dest/client/unconstrained_execution.d.ts +0 -10
  232. package/dest/client/unconstrained_execution.d.ts.map +0 -1
  233. package/dest/client/view_data_oracle.d.ts +0 -159
  234. package/dest/client/view_data_oracle.d.ts.map +0 -1
  235. package/dest/common/debug_fn_name.d.ts +0 -4
  236. package/dest/common/debug_fn_name.d.ts.map +0 -1
  237. package/dest/common/errors.d.ts +0 -54
  238. package/dest/common/errors.d.ts.map +0 -1
  239. package/dest/common/hashed_values_cache.d.ts +0 -28
  240. package/dest/common/hashed_values_cache.d.ts.map +0 -1
  241. package/dest/common/index.d.ts +0 -3
  242. package/dest/common/index.d.ts.map +0 -1
  243. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  244. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  245. package/dest/common/simulation_provider.d.ts +0 -19
  246. package/dest/common/simulation_provider.d.ts.map +0 -1
  247. package/dest/common.d.ts +0 -2
  248. package/dest/common.d.ts.map +0 -1
  249. package/dest/providers/acvm_native.d.ts +0 -40
  250. package/dest/providers/acvm_native.d.ts.map +0 -1
  251. package/dest/providers/acvm_wasm.d.ts +0 -15
  252. package/dest/providers/acvm_wasm.d.ts.map +0 -1
  253. package/dest/providers/acvm_wasm_with_blobs.d.ts +0 -19
  254. package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  255. package/dest/providers/factory.d.ts +0 -12
  256. package/dest/providers/factory.d.ts.map +0 -1
  257. package/dest/providers/index.d.ts +0 -5
  258. package/dest/providers/index.d.ts.map +0 -1
  259. package/dest/public/bytecode_errors.d.ts +0 -4
  260. package/dest/public/bytecode_errors.d.ts.map +0 -1
  261. package/dest/public/db_interfaces.d.ts +0 -105
  262. package/dest/public/db_interfaces.d.ts.map +0 -1
  263. package/dest/public/execution.d.ts +0 -102
  264. package/dest/public/execution.d.ts.map +0 -1
  265. package/dest/public/executor_metrics.d.ts +0 -13
  266. package/dest/public/executor_metrics.d.ts.map +0 -1
  267. package/dest/public/fee_payment.d.ts +0 -11
  268. package/dest/public/fee_payment.d.ts.map +0 -1
  269. package/dest/public/fixtures/index.d.ts +0 -3
  270. package/dest/public/fixtures/index.d.ts.map +0 -1
  271. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +0 -21
  272. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +0 -1
  273. package/dest/public/fixtures/utils.d.ts +0 -17
  274. package/dest/public/fixtures/utils.d.ts.map +0 -1
  275. package/dest/public/index.d.ts +0 -9
  276. package/dest/public/index.d.ts.map +0 -1
  277. package/dest/public/public_db_sources.d.ts +0 -81
  278. package/dest/public/public_db_sources.d.ts.map +0 -1
  279. package/dest/public/public_processor.d.ts +0 -72
  280. package/dest/public/public_processor.d.ts.map +0 -1
  281. package/dest/public/public_processor_metrics.d.ts +0 -27
  282. package/dest/public/public_processor_metrics.d.ts.map +0 -1
  283. package/dest/public/public_tx_context.d.ts +0 -131
  284. package/dest/public/public_tx_context.d.ts.map +0 -1
  285. package/dest/public/public_tx_simulator.d.ts +0 -99
  286. package/dest/public/public_tx_simulator.d.ts.map +0 -1
  287. package/dest/public/side_effect_errors.d.ts +0 -4
  288. package/dest/public/side_effect_errors.d.ts.map +0 -1
  289. package/dest/public/side_effect_trace.d.ts +0 -126
  290. package/dest/public/side_effect_trace.d.ts.map +0 -1
  291. package/dest/public/side_effect_trace_interface.d.ts +0 -32
  292. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  293. package/dest/public/unique_class_ids.d.ts +0 -37
  294. package/dest/public/unique_class_ids.d.ts.map +0 -1
  295. package/dest/public/utils.d.ts +0 -5
  296. package/dest/public/utils.d.ts.map +0 -1
  297. package/dest/server.d.ts +0 -6
  298. package/dest/server.d.ts.map +0 -1
  299. package/dest/stats/index.d.ts +0 -2
  300. package/dest/stats/index.d.ts.map +0 -1
  301. package/dest/stats/stats.d.ts +0 -4
  302. package/dest/stats/stats.d.ts.map +0 -1
  303. package/dest/test/utils.d.ts +0 -12
  304. package/dest/test/utils.d.ts.map +0 -1
@@ -3,32 +3,26 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  * A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
4
4
  * Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
5
5
  * When a contract call completes, its cached nullifier set can be merged into its parent's.
6
- */
7
- export class NullifierManager {
8
- constructor(
9
- /** Reference to node storage. Checked on parent cache-miss. */
10
- hostNullifiers,
11
- /** Cache of siloed nullifiers. */
12
- cache = new Set(),
13
- /** Parent nullifier manager to fall back on */
14
- parent) {
6
+ */ export class NullifierManager {
7
+ hostNullifiers;
8
+ cache;
9
+ parent;
10
+ 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){
15
11
  this.hostNullifiers = hostNullifiers;
16
12
  this.cache = cache;
17
13
  this.parent = parent;
18
14
  }
19
15
  /**
20
- * Create a new nullifiers manager forked from this one
21
- */
22
- fork() {
16
+ * Create a new nullifiers manager forked from this one
17
+ */ fork() {
23
18
  return new NullifierManager(this.hostNullifiers, new Set(), this);
24
19
  }
25
20
  /**
26
- * Get a nullifier's existence in this' cache or parent's (recursively).
27
- * DOES NOT CHECK HOST STORAGE!
28
- * @param siloedNullifier - the nullifier to check for
29
- * @returns exists: whether the nullifier exists in cache here or in parent's
30
- */
31
- checkExistsHereOrParent(siloedNullifier) {
21
+ * Get a nullifier's existence in this' cache or parent's (recursively).
22
+ * DOES NOT CHECK HOST STORAGE!
23
+ * @param siloedNullifier - the nullifier to check for
24
+ * @returns exists: whether the nullifier exists in cache here or in parent's
25
+ */ checkExistsHereOrParent(siloedNullifier) {
32
26
  // First check this cache
33
27
  let existsAsPending = this.cache.has(siloedNullifier.toBigInt());
34
28
  // Then try parent's nullifier cache
@@ -39,18 +33,17 @@ export class NullifierManager {
39
33
  return existsAsPending;
40
34
  }
41
35
  /**
42
- * Get a nullifier's existence status.
43
- * 1. Check cache.
44
- * 2. Check parent cache.
45
- * 3. Fall back to the host state.
46
- * 4. Not found! Nullifier does not exist.
47
- *
48
- * @param siloedNullifier - the nullifier to check for
49
- * @returns exists: whether the nullifier exists at all,
50
- * isPending: whether the nullifier was found in a cache,
51
- * leafIndex: the nullifier's leaf index if it exists and is not pending (comes from host state).
52
- */
53
- async checkExists(siloedNullifier) {
36
+ * Get a nullifier's existence status.
37
+ * 1. Check cache.
38
+ * 2. Check parent cache.
39
+ * 3. Fall back to the host state.
40
+ * 4. Not found! Nullifier does not exist.
41
+ *
42
+ * @param siloedNullifier - the nullifier to check for
43
+ * @returns exists: whether the nullifier exists at all,
44
+ * isPending: whether the nullifier was found in a cache,
45
+ * leafIndex: the nullifier's leaf index if it exists and is not pending (comes from host state).
46
+ */ async checkExists(siloedNullifier) {
54
47
  // Check this cache and parent's (recursively)
55
48
  const existsAsPending = this.checkExistsHereOrParent(siloedNullifier);
56
49
  // Finally try the host's Aztec state (a trip to the database)
@@ -62,38 +55,42 @@ export class NullifierManager {
62
55
  }
63
56
  const exists = existsAsPending || leafIndex !== undefined;
64
57
  leafIndex = leafIndex === undefined ? BigInt(0) : leafIndex;
65
- return Promise.resolve([exists, existsAsPending, new Fr(leafIndex)]);
58
+ return Promise.resolve([
59
+ exists,
60
+ existsAsPending,
61
+ new Fr(leafIndex)
62
+ ]);
66
63
  }
67
64
  /**
68
- * Stage a new nullifier (append it to the cache).
69
- *
70
- * @param siloedNullifier - the nullifier to stage
71
- */
72
- async append(siloedNullifier) {
73
- const [exists, ,] = await this.checkExists(siloedNullifier);
65
+ * Stage a new nullifier (append it to the cache).
66
+ *
67
+ * @param siloedNullifier - the nullifier to stage
68
+ */ async append(siloedNullifier) {
69
+ const [exists] = await this.checkExists(siloedNullifier);
74
70
  if (exists) {
75
71
  throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
76
72
  }
77
73
  this.cache.add(siloedNullifier.toBigInt());
78
74
  }
79
75
  /**
80
- * Merges another nullifier cache into this one.
81
- *
82
- * @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
83
- */
84
- acceptAndMerge(incomingNullifiers) {
85
- for (const incomingNullifier of incomingNullifiers.cache) {
76
+ * Merges another nullifier cache into this one.
77
+ *
78
+ * @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
79
+ */ acceptAndMerge(incomingNullifiers) {
80
+ for (const incomingNullifier of incomingNullifiers.cache){
86
81
  if (this.cache.has(incomingNullifier)) {
87
82
  throw new NullifierCollisionError(`Failed to merge in fork's cached nullifiers. Siloed nullifier ${incomingNullifier} already exists in parent cache.`);
88
83
  }
89
84
  }
90
- this.cache = new Set([...this.cache, ...incomingNullifiers.cache]);
85
+ this.cache = new Set([
86
+ ...this.cache,
87
+ ...incomingNullifiers.cache
88
+ ]);
91
89
  }
92
90
  }
93
91
  export class NullifierCollisionError extends Error {
94
- constructor(message, ...rest) {
92
+ constructor(message, ...rest){
95
93
  super(message, ...rest);
96
94
  this.name = 'NullifierCollisionError';
97
95
  }
98
96
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlmaWVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vam91cm5hbC9udWxsaWZpZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUk5Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjtJQUNFLCtEQUErRDtJQUM5QyxjQUE2QjtJQUM5QyxrQ0FBa0M7SUFDMUIsUUFBcUIsSUFBSSxHQUFHLEVBQUU7SUFDdEMsK0NBQStDO0lBQzlCLE1BQXlCO1FBSnpCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRXRDLFVBQUssR0FBTCxLQUFLLENBQXlCO1FBRXJCLFdBQU0sR0FBTixNQUFNLENBQW1CO0lBQ3pDLENBQUM7SUFFSjs7T0FFRztJQUNJLElBQUk7UUFDVCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLHVCQUF1QixDQUFDLGVBQW1CO1FBQ2pELHlCQUF5QjtRQUN6QixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNqRSxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsK0VBQStFO1lBQy9FLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUN0QixlQUFtQjtRQUVuQiw4Q0FBOEM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLDhEQUE4RDtRQUM5RCxrRkFBa0Y7UUFDbEYsSUFBSSxTQUFTLEdBQXVCLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsbUVBQW1FO1lBQ25FLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLGVBQWUsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDO1FBQzFELFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM1RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBbUI7UUFDckMsTUFBTSxDQUFDLE1BQU0sRUFBRSxBQUFELEVBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxvQkFBb0IsZUFBZSwwQ0FBMEMsQ0FBQyxDQUFDO1FBQ25ILENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsQ0FBQyxrQkFBb0M7UUFDeEQsS0FBSyxNQUFNLGlCQUFpQixJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksdUJBQXVCLENBQy9CLGlFQUFpRSxpQkFBaUIsa0NBQWtDLENBQ3JILENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxLQUFLO0lBQ2hELFlBQVksT0FBZSxFQUFFLEdBQUcsSUFBVztRQUN6QyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyx5QkFBeUIsQ0FBQztJQUN4QyxDQUFDO0NBQ0YifQ==
@@ -3,32 +3,28 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  * A class to manage public storage reads and writes during a contract call's AVM simulation.
4
4
  * Maintains a storage write cache, and ensures that reads fall back to the correct source.
5
5
  * When a contract call completes, its storage cache can be merged into its parent's.
6
- */
7
- export class PublicStorage {
8
- constructor(
9
- /** Reference to node storage. Checked on parent cache-miss. */
10
- hostPublicStorage,
11
- /** Parent's storage. Checked on this' cache-miss. */
12
- parent) {
6
+ */ export class PublicStorage {
7
+ hostPublicStorage;
8
+ parent;
9
+ /** Cached storage writes. */ cache;
10
+ constructor(/** Reference to node storage. Checked on parent cache-miss. */ hostPublicStorage, /** Parent's storage. Checked on this' cache-miss. */ parent){
13
11
  this.hostPublicStorage = hostPublicStorage;
14
12
  this.parent = parent;
15
13
  this.cache = new PublicStorageCache();
16
14
  }
17
15
  /**
18
- * Create a new public storage manager forked from this one
19
- */
20
- fork() {
16
+ * Create a new public storage manager forked from this one
17
+ */ fork() {
21
18
  return new PublicStorage(this.hostPublicStorage, this);
22
19
  }
23
20
  /**
24
- * Read a storage value from this' cache or parent's (recursively).
25
- * DOES NOT CHECK HOST STORAGE!
26
- *
27
- * @param contractAddress - the address of the contract whose storage is being read from
28
- * @param slot - the slot in the contract's storage being read from
29
- * @returns value: the latest value written according to this cache or the parent's. undefined on cache miss.
30
- */
31
- readHereOrParent(contractAddress, slot) {
21
+ * Read a storage value from this' cache or parent's (recursively).
22
+ * DOES NOT CHECK HOST STORAGE!
23
+ *
24
+ * @param contractAddress - the address of the contract whose storage is being read from
25
+ * @param slot - the slot in the contract's storage being read from
26
+ * @returns value: the latest value written according to this cache or the parent's. undefined on cache miss.
27
+ */ readHereOrParent(contractAddress, slot) {
32
28
  // First try check this storage cache
33
29
  let value = this.cache.read(contractAddress, slot);
34
30
  // Then try parent's storage cache
@@ -39,17 +35,16 @@ export class PublicStorage {
39
35
  return value;
40
36
  }
41
37
  /**
42
- * Read a value from storage.
43
- * 1. Check cache.
44
- * 2. Check parent cache.
45
- * 3. Fall back to the host state.
46
- * 4. Not found! Value has never been written to before. Flag it as non-existent and return value zero.
47
- *
48
- * @param contractAddress - the address of the contract whose storage is being read from
49
- * @param slot - the slot in the contract's storage being read from
50
- * @returns exists: whether the slot has EVER been written to before, value: the latest value written to slot, or 0 if never written to before
51
- */
52
- async read(contractAddress, slot) {
38
+ * Read a value from storage.
39
+ * 1. Check cache.
40
+ * 2. Check parent cache.
41
+ * 3. Fall back to the host state.
42
+ * 4. Not found! Value has never been written to before. Flag it as non-existent and return value zero.
43
+ *
44
+ * @param contractAddress - the address of the contract whose storage is being read from
45
+ * @param slot - the slot in the contract's storage being read from
46
+ * @returns exists: whether the slot has EVER been written to before, value: the latest value written to slot, or 0 if never written to before
47
+ */ async read(contractAddress, slot) {
53
48
  let cached = false;
54
49
  // Check this cache and parent's (recursively)
55
50
  let value = this.readHereOrParent(contractAddress, slot);
@@ -57,33 +52,33 @@ export class PublicStorage {
57
52
  if (!value) {
58
53
  // This functions returns Fr.ZERO if it has never been written to before
59
54
  // we explicity coalesce to Fr.ZERO in case we have some implementations that cause this to return undefined
60
- value = (await this.hostPublicStorage.storageRead(contractAddress, slot)) ?? Fr.ZERO;
61
- // TODO(dbanks12): if value retrieved from host storage, we can cache it here
62
- // any future reads to the same slot can read from cache instead of more expensive
63
- // DB access
64
- }
65
- else {
55
+ value = await this.hostPublicStorage.storageRead(contractAddress, slot) ?? Fr.ZERO;
56
+ // TODO(dbanks12): if value retrieved from host storage, we can cache it here
57
+ // any future reads to the same slot can read from cache instead of more expensive
58
+ // DB access
59
+ } else {
66
60
  cached = true;
67
61
  }
68
62
  // if value is Fr.ZERO here, it that means this slot has never been written to!
69
- return Promise.resolve({ value, cached });
63
+ return Promise.resolve({
64
+ value,
65
+ cached
66
+ });
70
67
  }
71
68
  /**
72
- * Stage a storage write.
73
- *
74
- * @param contractAddress - the address of the contract whose storage is being written to
75
- * @param slot - the slot in the contract's storage being written to
76
- * @param value - the value being written to the slot
77
- */
78
- write(contractAddress, slot, value) {
69
+ * Stage a storage write.
70
+ *
71
+ * @param contractAddress - the address of the contract whose storage is being written to
72
+ * @param slot - the slot in the contract's storage being written to
73
+ * @param value - the value being written to the slot
74
+ */ write(contractAddress, slot, value) {
79
75
  this.cache.write(contractAddress, slot, value);
80
76
  }
81
77
  /**
82
- * Merges another PublicStorage's cache (pending writes) into this one.
83
- *
84
- * @param incomingPublicStorage - the incoming public storage to merge into this instance's
85
- */
86
- acceptAndMerge(incomingPublicStorage) {
78
+ * Merges another PublicStorage's cache (pending writes) into this one.
79
+ *
80
+ * @param incomingPublicStorage - the incoming public storage to merge into this instance's
81
+ */ acceptAndMerge(incomingPublicStorage) {
87
82
  this.cache.acceptAndMerge(incomingPublicStorage.cache);
88
83
  }
89
84
  }
@@ -91,34 +86,28 @@ export class PublicStorage {
91
86
  * A class to cache writes to public storage during a contract call's AVM simulation.
92
87
  * "Writes" update a map, "reads" check that map or return undefined.
93
88
  * An instance of this class can merge another instance's staged writes into its own.
94
- */
95
- class PublicStorageCache {
96
- constructor() {
97
- /**
98
- * Map for staging storage writes.
99
- * One inner-map per contract storage address,
100
- * mapping storage slot to latest staged write value.
101
- */
102
- this.cachePerContract = new Map();
103
- }
89
+ */ class PublicStorageCache {
104
90
  /**
105
- * Read a staged value from storage, if it has been previously written to.
106
- *
107
- * @param contractAddress - the address of the contract whose storage is being read from
108
- * @param slot - the slot in the contract's storage being read from
109
- * @returns the latest value written to slot, or undefined if no value has been written
110
- */
111
- read(contractAddress, slot) {
91
+ * Map for staging storage writes.
92
+ * One inner-map per contract storage address,
93
+ * mapping storage slot to latest staged write value.
94
+ */ cachePerContract = new Map();
95
+ /**
96
+ * Read a staged value from storage, if it has been previously written to.
97
+ *
98
+ * @param contractAddress - the address of the contract whose storage is being read from
99
+ * @param slot - the slot in the contract's storage being read from
100
+ * @returns the latest value written to slot, or undefined if no value has been written
101
+ */ read(contractAddress, slot) {
112
102
  return this.cachePerContract.get(contractAddress.toBigInt())?.get(slot.toBigInt());
113
103
  }
114
104
  /**
115
- * Stage a storage write.
116
- *
117
- * @param contractAddress - the address of the contract whose storage is being written to
118
- * @param slot - the slot in the contract's storage being written to
119
- * @param value - the value being written to the slot
120
- */
121
- write(contractAddress, slot, value) {
105
+ * Stage a storage write.
106
+ *
107
+ * @param contractAddress - the address of the contract whose storage is being written to
108
+ * @param slot - the slot in the contract's storage being written to
109
+ * @param value - the value being written to the slot
110
+ */ write(contractAddress, slot, value) {
122
111
  let cacheAtContract = this.cachePerContract.get(contractAddress.toBigInt());
123
112
  if (!cacheAtContract) {
124
113
  // If this contract's storage has no staged modifications, create a new inner map to store them
@@ -128,32 +117,29 @@ class PublicStorageCache {
128
117
  cacheAtContract.set(slot.toBigInt(), value);
129
118
  }
130
119
  /**
131
- * Merges another cache's staged writes into this instance's cache.
132
- *
133
- * Staged modifications in "incoming" take precedence over those
134
- * present in "this" as they are assumed to occur after this' writes.
135
- *
136
- * In practice, "this" is a parent call's storage cache, and "incoming" is a nested call's.
137
- *
138
- * @param incomingStorageCache - the incoming storage write cache to merge into this instance's
139
- */
140
- acceptAndMerge(incomingStorageCache) {
120
+ * Merges another cache's staged writes into this instance's cache.
121
+ *
122
+ * Staged modifications in "incoming" take precedence over those
123
+ * present in "this" as they are assumed to occur after this' writes.
124
+ *
125
+ * In practice, "this" is a parent call's storage cache, and "incoming" is a nested call's.
126
+ *
127
+ * @param incomingStorageCache - the incoming storage write cache to merge into this instance's
128
+ */ acceptAndMerge(incomingStorageCache) {
141
129
  // Iterate over all incoming contracts with staged writes.
142
- for (const [incomingAddress, incomingCacheAtContract] of incomingStorageCache.cachePerContract) {
130
+ for (const [incomingAddress, incomingCacheAtContract] of incomingStorageCache.cachePerContract){
143
131
  const thisCacheAtContract = this.cachePerContract.get(incomingAddress);
144
132
  if (!thisCacheAtContract) {
145
133
  // The contract has no storage writes staged here
146
134
  // so just accept the incoming cache as-is for this contract.
147
135
  this.cachePerContract.set(incomingAddress, incomingCacheAtContract);
148
- }
149
- else {
136
+ } else {
150
137
  // "Incoming" and "this" both have staged writes for this contract.
151
138
  // Merge in incoming staged writes, giving them precedence over this'.
152
- for (const [slot, value] of incomingCacheAtContract) {
139
+ for (const [slot, value] of incomingCacheAtContract){
153
140
  thisCacheAtContract.set(slot, value);
154
141
  }
155
142
  }
156
143
  }
157
144
  }
158
145
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3N0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXZtL2pvdXJuYWwvcHVibGljX3N0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBUzlDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUl4QjtJQUNFLCtEQUErRDtJQUM5QyxpQkFBZ0M7SUFDakQscURBQXFEO0lBQ3BDLE1BQXNCO1FBRnRCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZTtRQUVoQyxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUV2QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1QsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxnQkFBZ0IsQ0FBQyxlQUE2QixFQUFFLElBQVE7UUFDN0QscUNBQXFDO1FBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsK0VBQStFO1lBQy9FLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBNkIsRUFBRSxJQUFRO1FBQ3ZELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztR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