@aztec/pxe 0.0.1-commit.6230efd → 0.0.1-commit.6a729f7

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 (233) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +11 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +68 -20
  5. package/dest/config/index.d.ts +3 -1
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +17 -0
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  10. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  11. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +9 -12
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +37 -28
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  16. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  18. package/dest/contract_function_simulator/index.d.ts +2 -2
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -1
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -3
  24. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  27. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  29. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
  30. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  32. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  34. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  36. package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/oracle.js +44 -33
  39. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  40. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -18
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +23 -39
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +34 -20
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +80 -76
  48. package/dest/contract_sync/index.d.ts +23 -0
  49. package/dest/contract_sync/index.d.ts.map +1 -0
  50. package/dest/contract_sync/index.js +54 -0
  51. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  52. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  53. package/dest/debug/pxe_debug_utils.js +20 -10
  54. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  55. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  56. package/dest/entrypoints/client/bundle/utils.js +22 -7
  57. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  58. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  59. package/dest/entrypoints/client/lazy/utils.js +23 -8
  60. package/dest/entrypoints/pxe_creation_options.d.ts +5 -3
  61. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  62. package/dest/entrypoints/server/index.d.ts +3 -1
  63. package/dest/entrypoints/server/index.d.ts.map +1 -1
  64. package/dest/entrypoints/server/index.js +2 -0
  65. package/dest/entrypoints/server/utils.d.ts +1 -1
  66. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  67. package/dest/entrypoints/server/utils.js +30 -15
  68. package/dest/events/event_service.d.ts +6 -6
  69. package/dest/events/event_service.d.ts.map +1 -1
  70. package/dest/events/event_service.js +19 -22
  71. package/dest/events/private_event_filter_validator.d.ts +5 -5
  72. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  73. package/dest/events/private_event_filter_validator.js +5 -6
  74. package/dest/job_coordinator/job_coordinator.d.ts +75 -0
  75. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  76. package/dest/job_coordinator/job_coordinator.js +94 -0
  77. package/dest/logs/log_service.d.ts +6 -4
  78. package/dest/logs/log_service.d.ts.map +1 -1
  79. package/dest/logs/log_service.js +21 -16
  80. package/dest/notes/note_service.d.ts +7 -7
  81. package/dest/notes/note_service.d.ts.map +1 -1
  82. package/dest/notes/note_service.js +31 -36
  83. package/dest/oracle_version.d.ts +3 -3
  84. package/dest/oracle_version.d.ts.map +1 -1
  85. package/dest/oracle_version.js +4 -3
  86. package/dest/private_kernel/hints/index.d.ts +2 -2
  87. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  88. package/dest/private_kernel/hints/index.js +1 -1
  89. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  90. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  91. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
  92. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  93. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  94. package/dest/private_kernel/private_kernel_execution_prover.js +6 -7
  95. package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
  96. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  97. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  98. package/dest/pxe.d.ts +8 -36
  99. package/dest/pxe.d.ts.map +1 -1
  100. package/dest/pxe.js +75 -96
  101. package/dest/storage/address_store/address_store.d.ts +1 -1
  102. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  103. package/dest/storage/address_store/address_store.js +12 -11
  104. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  105. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  106. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  107. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  108. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  109. package/dest/storage/capsule_store/capsule_store.js +130 -23
  110. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  111. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  112. package/dest/storage/contract_store/contract_store.js +22 -25
  113. package/dest/storage/metadata.d.ts +1 -1
  114. package/dest/storage/metadata.js +1 -1
  115. package/dest/storage/note_store/note_store.d.ts +51 -52
  116. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  117. package/dest/storage/note_store/note_store.js +282 -263
  118. package/dest/storage/note_store/stored_note.d.ts +16 -0
  119. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  120. package/dest/storage/note_store/stored_note.js +43 -0
  121. package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
  122. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  123. package/dest/storage/private_event_store/private_event_store.js +231 -73
  124. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  125. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  126. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  127. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  128. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  129. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  130. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  131. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  132. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  133. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  134. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  135. package/dest/storage/tagging_store/sender_tagging_store.js +253 -101
  136. package/dest/tagging/constants.d.ts +2 -0
  137. package/dest/tagging/constants.d.ts.map +1 -0
  138. package/dest/tagging/constants.js +10 -0
  139. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  140. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  141. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  142. package/dest/tagging/index.d.ts +3 -2
  143. package/dest/tagging/index.d.ts.map +1 -1
  144. package/dest/tagging/index.js +2 -10
  145. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  146. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  147. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
  148. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  149. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  150. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  151. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  152. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  153. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  154. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  155. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  156. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  157. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  158. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  159. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  160. package/package.json +18 -18
  161. package/src/bin/check_oracle_version.ts +1 -0
  162. package/src/block_synchronizer/block_synchronizer.ts +87 -32
  163. package/src/config/index.ts +14 -0
  164. package/src/config/package_info.ts +1 -1
  165. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  166. package/src/contract_function_simulator/contract_function_simulator.ts +43 -32
  167. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  168. package/src/contract_function_simulator/index.ts +1 -1
  169. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
  170. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  171. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  172. package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
  173. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  174. package/src/contract_function_simulator/oracle/oracle.ts +65 -40
  175. package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
  176. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +39 -48
  177. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +102 -82
  178. package/src/contract_sync/index.ts +98 -0
  179. package/src/debug/pxe_debug_utils.ts +26 -11
  180. package/src/entrypoints/client/bundle/utils.ts +15 -16
  181. package/src/entrypoints/client/lazy/utils.ts +16 -17
  182. package/src/entrypoints/pxe_creation_options.ts +4 -2
  183. package/src/entrypoints/server/index.ts +2 -0
  184. package/src/entrypoints/server/utils.ts +26 -34
  185. package/src/events/event_service.ts +19 -25
  186. package/src/events/private_event_filter_validator.ts +3 -5
  187. package/src/job_coordinator/job_coordinator.ts +150 -0
  188. package/src/logs/log_service.ts +32 -14
  189. package/src/notes/note_service.ts +38 -43
  190. package/src/oracle_version.ts +4 -3
  191. package/src/private_kernel/hints/index.ts +1 -1
  192. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  193. package/src/private_kernel/private_kernel_execution_prover.ts +9 -8
  194. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  195. package/src/pxe.ts +135 -131
  196. package/src/storage/address_store/address_store.ts +15 -15
  197. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  198. package/src/storage/capsule_store/capsule_store.ts +159 -23
  199. package/src/storage/contract_store/contract_store.ts +22 -31
  200. package/src/storage/metadata.ts +1 -1
  201. package/src/storage/note_store/note_store.ts +317 -318
  202. package/src/storage/note_store/stored_note.ts +48 -0
  203. package/src/storage/private_event_store/private_event_store.ts +301 -79
  204. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  205. package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
  206. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  207. package/src/storage/tagging_store/sender_tagging_store.ts +294 -109
  208. package/src/tagging/constants.ts +10 -0
  209. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  210. package/src/tagging/index.ts +2 -11
  211. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
  212. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  213. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
  214. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
  215. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  216. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  217. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  218. package/dest/contract_function_simulator/proxied_node.js +0 -27
  219. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  220. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  221. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  222. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  223. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  224. package/dest/public_storage/public_storage_service.d.ts +0 -24
  225. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  226. package/dest/public_storage/public_storage_service.js +0 -26
  227. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  228. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  229. package/dest/tree_membership/tree_membership_service.js +0 -84
  230. package/src/contract_function_simulator/proxied_node.ts +0 -33
  231. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  232. package/src/public_storage/public_storage_service.ts +0 -33
  233. package/src/tree_membership/tree_membership_service.ts +0 -112
@@ -18,27 +18,27 @@ function fromRawData(nonzeroNoteHashCounter: boolean, maybeNoteNonce: Fr): { sta
18
18
  }
19
19
 
20
20
  /**
21
- * Packs a note in a format that is compatible with the default Packable implementation of the retrieved note.
21
+ * Packs a note in a format that is compatible with the default Packable implementation of the hinted note.
22
22
  *
23
23
  * @dev Unlike the default Packable implementation, this function first constructs the note metadata from the inputs
24
- * and only after that it packs the retrieved note. Hence it doesn't map one to one with `RetrievedNote::pack()`.
24
+ * and only after that it packs the hinted note. Hence it doesn't map one to one with `HintedNote::pack()`.
25
25
  *
26
26
  * @param contractAddress - The address of the contract that owns the note
27
27
  * @param owner - The owner of the note
28
28
  * @param randomness - The randomness injected into the note to get the hiding property of commitments
29
29
  * @param storageSlot - The storage slot of the note
30
30
  * @param noteNonce - The nonce injected into the note hash preimage by kernels.
31
- * @param index - Optional index in the note hash tree. If undefined, indicates a transient note
31
+ * @param isPending - True if the note is pending, false if settled
32
32
  * @param note - The note content containing the actual note data
33
33
  * @returns The packed note as an array of field elements
34
34
  */
35
- export function packAsRetrievedNote({
35
+ export function packAsHintedNote({
36
36
  contractAddress,
37
37
  owner,
38
38
  randomness,
39
39
  storageSlot,
40
40
  noteNonce,
41
- index,
41
+ isPending,
42
42
  note,
43
43
  }: {
44
44
  contractAddress: AztecAddress;
@@ -46,14 +46,14 @@ export function packAsRetrievedNote({
46
46
  randomness: Fr;
47
47
  storageSlot: Fr;
48
48
  noteNonce: Fr;
49
- index?: bigint;
49
+ isPending: boolean;
50
50
  note: Note;
51
51
  }) {
52
- // If index is undefined, the note is transient which implies that the nonzero_note_hash_counter has to be true
53
- const nonzeroNoteHashCounter = index === undefined;
52
+ // If the note is pending it means it has a non-zero note hash counter associated with it.
53
+ const nonZeroNoteHashCounter = isPending;
54
54
 
55
- // To pack the note as retrieved note we first need to reconstruct the note metadata.
56
- const noteMetadata = fromRawData(nonzeroNoteHashCounter, noteNonce);
55
+ // To pack the note as hinted note we first need to reconstruct the note metadata.
56
+ const noteMetadata = fromRawData(nonZeroNoteHashCounter, noteNonce);
57
57
 
58
58
  // Pack in order: note, contract_address, owner, randomness, storage_slot, metadata (stage, maybe_note_nonce)
59
59
  return [
@@ -12,11 +12,11 @@ import {
12
12
  } from '@aztec/simulator/client';
13
13
  import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
14
14
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
15
+ import { BlockHash } from '@aztec/stdlib/block';
15
16
  import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
16
- import { MerkleTreeId } from '@aztec/stdlib/trees';
17
17
 
18
18
  import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
19
- import { packAsRetrievedNote } from './note_packing_utils.js';
19
+ import { packAsHintedNote } from './note_packing_utils.js';
20
20
 
21
21
  export class UnavailableOracleError extends Error {
22
22
  constructor(oracleName: string) {
@@ -137,77 +137,94 @@ export class Oracle {
137
137
  ].map(toACVMField);
138
138
  }
139
139
 
140
- async utilityGetMembershipWitness(
141
- [blockNumber]: ACVMField[],
142
- [treeId]: ACVMField[],
143
- [leafValue]: ACVMField[],
140
+ async utilityGetNoteHashMembershipWitness(
141
+ [anchorBlockHash]: ACVMField[],
142
+ [noteHash]: ACVMField[],
144
143
  ): Promise<(ACVMField | ACVMField[])[]> {
145
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
146
- const parsedTreeId = Fr.fromString(treeId).toNumber();
147
- const parsedLeafValue = Fr.fromString(leafValue);
144
+ const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
145
+ const parsedNoteHash = Fr.fromString(noteHash);
148
146
 
149
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(
150
- BlockNumber(parsedBlockNumber),
151
- parsedTreeId,
152
- parsedLeafValue,
147
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(
148
+ parsedAnchorBlockHash,
149
+ parsedNoteHash,
153
150
  );
154
151
  if (!witness) {
155
152
  throw new Error(
156
- `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
153
+ `Note hash ${noteHash} not found in the note hash tree at anchor block hash ${parsedAnchorBlockHash.toString()}.`,
157
154
  );
158
155
  }
159
- return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
156
+ return witness.toNoirRepresentation();
157
+ }
158
+
159
+ async utilityGetBlockHashMembershipWitness(
160
+ [anchorBlockHash]: ACVMField[],
161
+ [blockHash]: ACVMField[],
162
+ ): Promise<(ACVMField | ACVMField[])[]> {
163
+ const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
164
+ const parsedBlockHash = BlockHash.fromString(blockHash);
165
+
166
+ const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(
167
+ parsedAnchorBlockHash,
168
+ parsedBlockHash,
169
+ );
170
+ if (!witness) {
171
+ throw new Error(
172
+ `Block hash ${parsedBlockHash.toString()} not found in the archive tree at anchor block ${parsedAnchorBlockHash.toString()}.`,
173
+ );
174
+ }
175
+ return witness.toNoirRepresentation();
160
176
  }
161
177
 
162
178
  async utilityGetNullifierMembershipWitness(
163
- [blockNumber]: ACVMField[],
179
+ [blockHash]: ACVMField[],
164
180
  [nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
165
181
  ): Promise<(ACVMField | ACVMField[])[]> {
166
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
182
+ const parsedBlockHash = BlockHash.fromString(blockHash);
167
183
  const parsedNullifier = Fr.fromString(nullifier);
168
184
 
169
185
  const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(
170
- BlockNumber(parsedBlockNumber),
186
+ parsedBlockHash,
171
187
  parsedNullifier,
172
188
  );
173
189
  if (!witness) {
174
- throw new Error(`Nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`);
190
+ throw new Error(
191
+ `Nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
192
+ );
175
193
  }
176
194
  return witness.toNoirRepresentation();
177
195
  }
178
196
 
179
197
  async utilityGetLowNullifierMembershipWitness(
180
- [blockNumber]: ACVMField[],
198
+ [blockHash]: ACVMField[],
181
199
  [nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
182
200
  ): Promise<(ACVMField | ACVMField[])[]> {
183
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
201
+ const parsedBlockHash = BlockHash.fromString(blockHash);
184
202
  const parsedNullifier = Fr.fromString(nullifier);
185
203
 
186
204
  const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
187
- BlockNumber(parsedBlockNumber),
205
+ parsedBlockHash,
188
206
  parsedNullifier,
189
207
  );
190
208
  if (!witness) {
191
209
  throw new Error(
192
- `Low nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`,
210
+ `Low nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
193
211
  );
194
212
  }
195
213
  return witness.toNoirRepresentation();
196
214
  }
197
215
 
198
216
  async utilityGetPublicDataWitness(
199
- [blockNumber]: ACVMField[],
217
+ [blockHash]: ACVMField[],
200
218
  [leafSlot]: ACVMField[],
201
219
  ): Promise<(ACVMField | ACVMField[])[]> {
202
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
220
+ const parsedBlockHash = BlockHash.fromString(blockHash);
203
221
  const parsedLeafSlot = Fr.fromString(leafSlot);
204
222
 
205
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(
206
- BlockNumber(parsedBlockNumber),
207
- parsedLeafSlot,
208
- );
223
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(parsedBlockHash, parsedLeafSlot);
209
224
  if (!witness) {
210
- throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
225
+ throw new Error(
226
+ `Public data witness not found for slot ${parsedLeafSlot} at block hash ${parsedBlockHash.toString()}.`,
227
+ );
211
228
  }
212
229
  return witness.toNoirRepresentation();
213
230
  }
@@ -257,7 +274,7 @@ export class Oracle {
257
274
  [offset]: ACVMField[],
258
275
  [status]: ACVMField[],
259
276
  [maxNotes]: ACVMField[],
260
- [packedRetrievedNoteLength]: ACVMField[],
277
+ [packedHintedNoteLength]: ACVMField[],
261
278
  ): Promise<(ACVMField | ACVMField[])[]> {
262
279
  // Parse Option<AztecAddress>: ownerSome is 0 for None, 1 for Some
263
280
  const owner = Fr.fromString(ownerSome).toNumber() === 1 ? AztecAddress.fromString(ownerValue) : undefined;
@@ -279,25 +296,25 @@ export class Oracle {
279
296
  +status,
280
297
  );
281
298
 
282
- const returnDataAsArrayOfPackedRetrievedNotes = noteDatas.map(noteData =>
283
- packAsRetrievedNote({
299
+ const returnDataAsArrayOfPackedHintedNotes = noteDatas.map(noteData =>
300
+ packAsHintedNote({
284
301
  contractAddress: noteData.contractAddress,
285
302
  owner: noteData.owner,
286
303
  randomness: noteData.randomness,
287
304
  storageSlot: noteData.storageSlot,
288
305
  noteNonce: noteData.noteNonce,
289
- index: noteData.index,
306
+ isPending: noteData.isPending,
290
307
  note: noteData.note,
291
308
  }),
292
309
  );
293
310
 
294
311
  // Now we convert each sub-array to an array of ACVMField
295
- const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedRetrievedNotes.map(subArray =>
312
+ const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedHintedNotes.map(subArray =>
296
313
  subArray.map(toACVMField),
297
314
  );
298
315
 
299
316
  // At last we convert the array of arrays to a bounded vec of arrays
300
- return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedRetrievedNoteLength);
317
+ return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedHintedNoteLength);
301
318
  }
302
319
 
303
320
  privateNotifyCreatedNote(
@@ -339,6 +356,14 @@ export class Oracle {
339
356
  return [];
340
357
  }
341
358
 
359
+ async privateIsNullifierPending([innerNullifier]: ACVMField[], [contractAddress]: ACVMField[]): Promise<ACVMField[]> {
360
+ const isPending = await this.handlerAsPrivate().privateIsNullifierPending(
361
+ Fr.fromString(innerNullifier),
362
+ AztecAddress.fromString(contractAddress),
363
+ );
364
+ return [toACVMField(isPending)];
365
+ }
366
+
342
367
  async utilityCheckNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
343
368
  const exists = await this.handlerAsUtility().utilityCheckNullifierExists(Fr.fromString(innerNullifier));
344
369
  return [toACVMField(exists)];
@@ -358,15 +383,15 @@ export class Oracle {
358
383
  }
359
384
 
360
385
  async utilityStorageRead(
386
+ [blockHash]: ACVMField[],
361
387
  [contractAddress]: ACVMField[],
362
388
  [startStorageSlot]: ACVMField[],
363
- [blockNumber]: ACVMField[],
364
389
  [numberOfElements]: ACVMField[],
365
390
  ): Promise<ACVMField[][]> {
366
391
  const values = await this.handlerAsUtility().utilityStorageRead(
392
+ BlockHash.fromString(blockHash),
367
393
  new AztecAddress(Fr.fromString(contractAddress)),
368
394
  Fr.fromString(startStorageSlot),
369
- BlockNumber(+blockNumber),
370
395
  +numberOfElements,
371
396
  );
372
397
  return [values.map(toACVMField)];
@@ -476,12 +501,12 @@ export class Oracle {
476
501
  return [];
477
502
  }
478
503
 
479
- async utilityValidateEnqueuedNotesAndEvents(
504
+ async utilityValidateAndStoreEnqueuedNotesAndEvents(
480
505
  [contractAddress]: ACVMField[],
481
506
  [noteValidationRequestsArrayBaseSlot]: ACVMField[],
482
507
  [eventValidationRequestsArrayBaseSlot]: ACVMField[],
483
508
  ): Promise<ACVMField[]> {
484
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
509
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
485
510
  AztecAddress.fromString(contractAddress),
486
511
  Fr.fromString(noteValidationRequestsArrayBaseSlot),
487
512
  Fr.fromString(eventValidationRequestsArrayBaseSlot),
@@ -1,9 +1,7 @@
1
1
  import { PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, PRIVATE_CONTEXT_INPUTS_LENGTH } from '@aztec/constants';
2
- import { BlockNumber } from '@aztec/foundation/branded-types';
3
2
  import { Fr } from '@aztec/foundation/curves/bn254';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { Timer } from '@aztec/foundation/timer';
6
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
7
5
  import {
8
6
  type ACVMWitness,
9
7
  type CircuitSimulator,
@@ -19,15 +17,10 @@ import {
19
17
  countArgumentsSize,
20
18
  } from '@aztec/stdlib/abi';
21
19
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
22
- import type { ContractInstance } from '@aztec/stdlib/contract';
23
- import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
24
- import type { AztecNode } from '@aztec/stdlib/interfaces/client';
25
20
  import { PrivateCircuitPublicInputs } from '@aztec/stdlib/kernel';
26
21
  import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats';
27
- import { BlockHeader, PrivateCallExecutionResult } from '@aztec/stdlib/tx';
28
- import type { UInt64 } from '@aztec/stdlib/types';
22
+ import { PrivateCallExecutionResult } from '@aztec/stdlib/tx';
29
23
 
30
- import { ContractStore } from '../../storage/contract_store/index.js';
31
24
  import { Oracle } from './oracle.js';
32
25
  import type { PrivateExecutionOracle } from './private_execution_oracle.js';
33
26
 
@@ -85,7 +78,6 @@ export async function executePrivateFunction(
85
78
 
86
79
  const rawReturnValues = await privateExecutionOracle.privateLoadFromExecutionCache(publicInputs.returnsHash);
87
80
 
88
- const noteHashLeafIndexMap = privateExecutionOracle.getNoteHashLeafIndexMap();
89
81
  const newNotes = privateExecutionOracle.getNewNotes();
90
82
  const noteHashNullifierCounterMap = privateExecutionOracle.getNoteHashNullifierCounterMap();
91
83
  const offchainEffects = privateExecutionOracle.getOffchainEffects();
@@ -108,7 +100,6 @@ export async function executePrivateFunction(
108
100
  Buffer.from(artifact.verificationKey!, 'base64'),
109
101
  partialWitness,
110
102
  publicInputs,
111
- noteHashLeafIndexMap,
112
103
  newNotes,
113
104
  noteHashNullifierCounterMap,
114
105
  rawReturnValues,
@@ -148,62 +139,3 @@ export function extractPrivateCircuitPublicInputs(
148
139
  }
149
140
  return PrivateCircuitPublicInputs.fromFields(returnData);
150
141
  }
151
-
152
- /**
153
- * Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
154
- * from the instance is used.
155
- * @param contractAddress - The address of the contract to read the class id for.
156
- * @param instance - The instance of the contract.
157
- * @param executionStore - The execution data provider.
158
- * @param blockNumber - The block number at which to load the DelayedPublicMutable storing the class id.
159
- * @param timestamp - The timestamp at which to obtain the class id from the DelayedPublicMutable.
160
- * @returns The current class id.
161
- */
162
- export async function readCurrentClassId(
163
- contractAddress: AztecAddress,
164
- instance: ContractInstance,
165
- aztecNode: AztecNode,
166
- blockNumber: BlockNumber,
167
- timestamp: UInt64,
168
- ) {
169
- const { delayedPublicMutableSlot } = await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
170
- const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, slot =>
171
- aztecNode.getPublicStorageAt(blockNumber, ProtocolContractAddress.ContractInstanceRegistry, slot),
172
- );
173
- let currentClassId = delayedPublicMutableValues.svc.getCurrentAt(timestamp)[0];
174
- if (currentClassId.isZero()) {
175
- currentClassId = instance.originalContractClassId;
176
- }
177
- return currentClassId;
178
- }
179
-
180
- /**
181
- * Verify that the current class id of a contract obtained from AztecNode is the same as the one in contract data
182
- * provider (i.e. PXE's own storage).
183
- * @param header - The header of the block at which to verify the current class id. If not provided, the anchor block
184
- * header of the execution data provider is used.
185
- */
186
- export async function verifyCurrentClassId(
187
- contractAddress: AztecAddress,
188
- aztecNode: AztecNode,
189
- contractStore: ContractStore,
190
- header: BlockHeader,
191
- ) {
192
- const instance = await contractStore.getContractInstance(contractAddress);
193
- if (!instance) {
194
- throw new Error(`No contract instance found for address ${contractAddress.toString()}`);
195
- }
196
-
197
- const currentClassId = await readCurrentClassId(
198
- contractAddress,
199
- instance,
200
- aztecNode,
201
- header.globalVariables.blockNumber,
202
- header.globalVariables.timestamp,
203
- );
204
- if (!instance.currentContractClassId.equals(currentClassId)) {
205
- throw new Error(
206
- `Contract ${contractAddress} is outdated, current class id is ${currentClassId}, local class id is ${instance.currentContractClassId}`,
207
- );
208
- }
209
- }
@@ -14,7 +14,7 @@ import {
14
14
  } from '@aztec/stdlib/abi';
15
15
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
16
16
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
17
- import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
17
+ import { siloNullifier } from '@aztec/stdlib/hash';
18
18
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
19
19
  import { PrivateContextInputs } from '@aztec/stdlib/kernel';
20
20
  import { type ContractClassLog, DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
@@ -30,9 +30,9 @@ import {
30
30
  type TxContext,
31
31
  } from '@aztec/stdlib/tx';
32
32
 
33
+ import { ensureContractSynced } from '../../contract_sync/index.js';
33
34
  import { NoteService } from '../../notes/note_service.js';
34
35
  import type { AddressStore } from '../../storage/address_store/address_store.js';
35
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
36
36
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
37
37
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
38
38
  import type { NoteStore } from '../../storage/note_store/note_store.js';
@@ -46,7 +46,7 @@ import { ExecutionTaggingIndexCache } from '../execution_tagging_index_cache.js'
46
46
  import type { HashedValuesCache } from '../hashed_values_cache.js';
47
47
  import { pickNotes } from '../pick_notes.js';
48
48
  import type { IPrivateExecutionOracle, NoteData } from './interfaces.js';
49
- import { executePrivateFunction, verifyCurrentClassId } from './private_execution.js';
49
+ import { executePrivateFunction } from './private_execution.js';
50
50
  import { UtilityExecutionOracle } from './utility_execution_oracle.js';
51
51
 
52
52
  /**
@@ -64,16 +64,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
64
64
  * Users can also use this to get a clearer idea of what's happened during a simulation.
65
65
  */
66
66
  private newNotes: NoteAndSlot[] = [];
67
- /**
68
- * Notes from previous transactions that are returned to the oracle call `getNotes` during this execution.
69
- * The mapping maps from the unique siloed note hash to the index for notes created in private executions.
70
- * It maps from siloed note hash to the index for notes created by public functions.
71
- *
72
- * They are not part of the ExecutionNoteCache and being forwarded to nested contexts via `extend()`
73
- * because these notes are meant to be maintained on a per-call basis
74
- * They should act as references for the read requests output by an app circuit via public inputs.
75
- */
76
- private noteHashLeafIndexMap: Map<bigint, bigint> = new Map();
77
67
  private noteHashNullifierCounterMap: Map<number, number> = new Map();
78
68
  private contractClassLogs: CountedContractClassLog[] = [];
79
69
  private offchainEffects: { data: Fr[] }[] = [];
@@ -98,12 +88,12 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
98
88
  keyStore: KeyStore,
99
89
  addressStore: AddressStore,
100
90
  aztecNode: AztecNode,
101
- anchorBlockStore: AnchorBlockStore,
102
91
  private readonly senderTaggingStore: SenderTaggingStore,
103
92
  recipientTaggingStore: RecipientTaggingStore,
104
93
  senderAddressBookStore: SenderAddressBookStore,
105
94
  capsuleStore: CapsuleStore,
106
95
  privateEventStore: PrivateEventStore,
96
+ jobId: string,
107
97
  private totalPublicCalldataCount: number = 0,
108
98
  protected sideEffectCounter: number = 0,
109
99
  log = createLogger('simulator:client_execution_context'),
@@ -121,11 +111,11 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
121
111
  keyStore,
122
112
  addressStore,
123
113
  aztecNode,
124
- anchorBlockStore,
125
114
  recipientTaggingStore,
126
115
  senderAddressBookStore,
127
116
  capsuleStore,
128
117
  privateEventStore,
118
+ jobId,
129
119
  log,
130
120
  scopes,
131
121
  );
@@ -160,14 +150,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
160
150
  return toACVMWitness(0, fields);
161
151
  }
162
152
 
163
- /**
164
- * The KernelProver will use this to fully populate witnesses and provide hints to the kernel circuit
165
- * regarding which note hash each settled read request corresponds to.
166
- */
167
- public getNoteHashLeafIndexMap() {
168
- return this.noteHashLeafIndexMap;
169
- }
170
-
171
153
  /**
172
154
  * Get the data for the newly created notes.
173
155
  */
@@ -281,9 +263,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
281
263
  // This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices
282
264
  // are up to date. We do this here because this store is not synced as part of the global sync because
283
265
  // that'd be wasteful as most tagging secrets are not used in each tx.
284
- await syncSenderTaggingIndexes(secret, this.contractAddress, this.aztecNode, this.senderTaggingStore);
285
-
286
- const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret);
266
+ await syncSenderTaggingIndexes(
267
+ secret,
268
+ this.contractAddress,
269
+ this.aztecNode,
270
+ this.senderTaggingStore,
271
+ await this.anchorBlockHeader.hash(),
272
+ this.jobId,
273
+ );
274
+
275
+ const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret, this.jobId);
287
276
  // If lastUsedIndex is undefined, we've never used this secret, so start from 0
288
277
  // Otherwise, the next index to use is one past the last used index
289
278
  return lastUsedIndex === undefined ? 0 : lastUsedIndex + 1;
@@ -372,7 +361,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
372
361
 
373
362
  const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
374
363
 
375
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
364
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
376
365
  const dbNotes = await noteService.getNotes(
377
366
  this.callContext.contractAddress,
378
367
  owner,
@@ -402,23 +391,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
402
391
  .join(', ')}`,
403
392
  );
404
393
 
405
- const noteHashesAndIndexes = await Promise.all(
406
- notes.map(async n => {
407
- if (n.index !== undefined) {
408
- const siloedNoteHash = await siloNoteHash(n.contractAddress, n.noteHash);
409
- const uniqueNoteHash = await computeUniqueNoteHash(n.noteNonce, siloedNoteHash);
410
-
411
- return { hash: uniqueNoteHash, index: n.index };
412
- }
413
- }),
414
- );
415
-
416
- noteHashesAndIndexes
417
- .filter(n => n !== undefined)
418
- .forEach(n => {
419
- this.noteHashLeafIndexMap.set(n!.hash.toBigInt(), n!.index);
420
- });
421
-
422
394
  return notes;
423
395
  }
424
396
 
@@ -461,6 +433,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
461
433
  note,
462
434
  siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
463
435
  noteHash,
436
+ isPending: true, // This note has just been created and hence is not settled yet.
464
437
  },
465
438
  counter,
466
439
  );
@@ -495,6 +468,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
495
468
  return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
496
469
  }
497
470
 
471
+ /**
472
+ * Check if a nullifier has been emitted in the same transaction, i.e. if privateNotifyCreatedNullifier has been
473
+ * called for this inner nullifier from the contract with the specified address.
474
+ * @param innerNullifier - The inner nullifier to check.
475
+ * @param contractAddress - Address of the contract that emitted the nullifier.
476
+ * @returns A boolean indicating whether the nullifier is pending or not.
477
+ */
478
+ public async privateIsNullifierPending(innerNullifier: Fr, contractAddress: AztecAddress): Promise<boolean> {
479
+ const siloedNullifier = await siloNullifier(contractAddress, innerNullifier);
480
+ const isNullifierPending = this.noteCache.getNullifiers(contractAddress).has(siloedNullifier.toBigInt());
481
+ return Promise.resolve(isNullifierPending);
482
+ }
483
+
498
484
  /**
499
485
  * Emit a contract class log.
500
486
  * This fn exists because we only carry a poseidon hash through the kernels, and need to
@@ -551,9 +537,14 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
551
537
 
552
538
  isStaticCall = isStaticCall || this.callContext.isStaticCall;
553
539
 
554
- await verifyCurrentClassId(targetContractAddress, this.aztecNode, this.contractStore, this.anchorBlockHeader);
555
-
556
- await this.contractStore.syncPrivateState(targetContractAddress, functionSelector, this.utilityExecutor);
540
+ await ensureContractSynced(
541
+ targetContractAddress,
542
+ functionSelector,
543
+ this.utilityExecutor,
544
+ this.aztecNode,
545
+ this.contractStore,
546
+ this.anchorBlockHeader,
547
+ );
557
548
 
558
549
  const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
559
550
  targetContractAddress,
@@ -580,12 +571,12 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
580
571
  this.keyStore,
581
572
  this.addressStore,
582
573
  this.aztecNode,
583
- this.anchorBlockStore,
584
574
  this.senderTaggingStore,
585
575
  this.recipientTaggingStore,
586
576
  this.senderAddressBookStore,
587
577
  this.capsuleStore,
588
578
  this.privateEventStore,
579
+ this.jobId,
589
580
  this.totalPublicCalldataCount,
590
581
  sideEffectCounter,
591
582
  this.log,