@aztec/pxe 0.0.1-commit.d431d1c → 0.0.1-commit.e3c1de76

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 (175) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +7 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +56 -16
  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/contract_function_simulator/contract_function_simulator.d.ts +2 -4
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  10. package/dest/contract_function_simulator/contract_function_simulator.js +8 -13
  11. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
  12. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  13. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  14. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  15. package/dest/contract_function_simulator/oracle/interfaces.d.ts +13 -10
  16. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/oracle/oracle.d.ts +5 -3
  18. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/oracle/oracle.js +27 -17
  20. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
  21. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  22. package/dest/contract_function_simulator/oracle/private_execution.js +0 -37
  23. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +10 -3
  24. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +19 -8
  26. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +21 -15
  27. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +39 -43
  29. package/dest/contract_sync/index.d.ts +23 -0
  30. package/dest/contract_sync/index.d.ts.map +1 -0
  31. package/dest/contract_sync/index.js +54 -0
  32. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  33. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  34. package/dest/debug/pxe_debug_utils.js +20 -10
  35. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  36. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  37. package/dest/entrypoints/client/bundle/utils.js +12 -6
  38. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  39. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  40. package/dest/entrypoints/client/lazy/utils.js +13 -7
  41. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  42. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  43. package/dest/entrypoints/server/index.d.ts +2 -1
  44. package/dest/entrypoints/server/index.d.ts.map +1 -1
  45. package/dest/entrypoints/server/index.js +1 -0
  46. package/dest/entrypoints/server/utils.d.ts +1 -1
  47. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  48. package/dest/entrypoints/server/utils.js +19 -8
  49. package/dest/events/event_service.d.ts +5 -6
  50. package/dest/events/event_service.d.ts.map +1 -1
  51. package/dest/events/event_service.js +6 -7
  52. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  53. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  54. package/dest/job_coordinator/job_coordinator.js +3 -2
  55. package/dest/logs/log_service.d.ts +5 -4
  56. package/dest/logs/log_service.d.ts.map +1 -1
  57. package/dest/logs/log_service.js +18 -15
  58. package/dest/notes/note_service.d.ts +6 -6
  59. package/dest/notes/note_service.d.ts.map +1 -1
  60. package/dest/notes/note_service.js +14 -14
  61. package/dest/oracle_version.d.ts +3 -3
  62. package/dest/oracle_version.d.ts.map +1 -1
  63. package/dest/oracle_version.js +4 -3
  64. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  65. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  66. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  67. package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
  68. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  69. package/dest/pxe.d.ts +1 -1
  70. package/dest/pxe.d.ts.map +1 -1
  71. package/dest/pxe.js +19 -15
  72. package/dest/storage/address_store/address_store.d.ts +1 -1
  73. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  74. package/dest/storage/address_store/address_store.js +12 -11
  75. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  76. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  77. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  78. package/dest/storage/capsule_store/capsule_store.js +6 -8
  79. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  80. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  81. package/dest/storage/contract_store/contract_store.js +22 -25
  82. package/dest/storage/metadata.d.ts +1 -1
  83. package/dest/storage/metadata.js +1 -1
  84. package/dest/storage/note_store/note_store.d.ts +48 -50
  85. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  86. package/dest/storage/note_store/note_store.js +276 -252
  87. package/dest/storage/note_store/stored_note.d.ts +16 -0
  88. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  89. package/dest/storage/note_store/stored_note.js +43 -0
  90. package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
  91. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  92. package/dest/storage/private_event_store/private_event_store.js +198 -147
  93. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  94. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  95. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  96. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  97. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  98. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  99. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  100. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  101. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  102. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  103. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  104. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  105. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  106. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  107. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  108. package/dest/tagging/index.d.ts +2 -1
  109. package/dest/tagging/index.d.ts.map +1 -1
  110. package/dest/tagging/index.js +1 -0
  111. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  112. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  113. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +2 -2
  114. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  115. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  116. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  117. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  118. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  119. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +2 -2
  120. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  121. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  122. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  123. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -2
  124. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  125. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +7 -4
  126. package/package.json +16 -16
  127. package/src/bin/check_oracle_version.ts +1 -0
  128. package/src/block_synchronizer/block_synchronizer.ts +70 -33
  129. package/src/config/index.ts +14 -0
  130. package/src/contract_function_simulator/contract_function_simulator.ts +7 -15
  131. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  132. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  133. package/src/contract_function_simulator/oracle/interfaces.ts +18 -9
  134. package/src/contract_function_simulator/oracle/oracle.ts +34 -21
  135. package/src/contract_function_simulator/oracle/private_execution.ts +1 -60
  136. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +32 -10
  137. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +59 -51
  138. package/src/contract_sync/index.ts +98 -0
  139. package/src/debug/pxe_debug_utils.ts +26 -11
  140. package/src/entrypoints/client/bundle/utils.ts +7 -14
  141. package/src/entrypoints/client/lazy/utils.ts +8 -14
  142. package/src/entrypoints/pxe_creation_options.ts +2 -1
  143. package/src/entrypoints/server/index.ts +1 -0
  144. package/src/entrypoints/server/utils.ts +15 -19
  145. package/src/events/event_service.ts +5 -7
  146. package/src/job_coordinator/job_coordinator.ts +4 -3
  147. package/src/logs/log_service.ts +29 -13
  148. package/src/notes/note_service.ts +21 -20
  149. package/src/oracle_version.ts +4 -3
  150. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  151. package/src/private_kernel/private_kernel_oracle.ts +2 -2
  152. package/src/pxe.ts +48 -17
  153. package/src/storage/address_store/address_store.ts +15 -15
  154. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  155. package/src/storage/capsule_store/capsule_store.ts +8 -8
  156. package/src/storage/contract_store/contract_store.ts +22 -31
  157. package/src/storage/metadata.ts +1 -1
  158. package/src/storage/note_store/note_store.ts +314 -318
  159. package/src/storage/note_store/stored_note.ts +48 -0
  160. package/src/storage/private_event_store/private_event_store.ts +250 -190
  161. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  162. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  163. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  164. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
  165. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  166. package/src/tagging/index.ts +1 -0
  167. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +11 -1
  168. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  169. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +3 -1
  170. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  171. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +12 -3
  172. package/dest/tree_membership/tree_membership_service.d.ts +0 -50
  173. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  174. package/dest/tree_membership/tree_membership_service.js +0 -75
  175. package/src/tree_membership/tree_membership_service.ts +0 -97
@@ -1,15 +1,16 @@
1
- import type { L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/constants';
1
+ import type { ARCHIVE_HEIGHT, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
2
2
  import type { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
4
  import { Point } from '@aztec/foundation/curves/grumpkin';
5
+ import { MembershipWitness } from '@aztec/foundation/trees';
5
6
  import type { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
6
7
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
7
- import { L2BlockHash } from '@aztec/stdlib/block';
8
+ import { BlockHash } from '@aztec/stdlib/block';
8
9
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
9
10
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
10
11
  import type { ContractClassLog, Tag } from '@aztec/stdlib/logs';
11
12
  import type { Note, NoteStatus } from '@aztec/stdlib/note';
12
- import { type MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
13
+ import { type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
13
14
  import type { BlockHeader } from '@aztec/stdlib/tx';
14
15
 
15
16
  import type { UtilityContext } from '../noir-structs/utility_context.js';
@@ -66,14 +67,21 @@ export interface IUtilityExecutionOracle {
66
67
  utilityGetUtilityContext(): UtilityContext;
67
68
  utilityGetKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest>;
68
69
  utilityGetContractInstance(address: AztecAddress): Promise<ContractInstance>;
69
- utilityGetMembershipWitness(blockHash: L2BlockHash, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[] | undefined>;
70
+ utilityGetNoteHashMembershipWitness(
71
+ blockHash: BlockHash,
72
+ leafValue: Fr,
73
+ ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined>;
74
+ utilityGetArchiveMembershipWitness(
75
+ blockHash: BlockHash,
76
+ leafValue: Fr,
77
+ ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined>;
70
78
  utilityGetNullifierMembershipWitness(
71
- blockHash: L2BlockHash,
79
+ blockHash: BlockHash,
72
80
  nullifier: Fr,
73
81
  ): Promise<NullifierMembershipWitness | undefined>;
74
- utilityGetPublicDataWitness(blockHash: L2BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
82
+ utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
75
83
  utilityGetLowNullifierMembershipWitness(
76
- blockHash: L2BlockHash,
84
+ blockHash: BlockHash,
77
85
  nullifier: Fr,
78
86
  ): Promise<NullifierMembershipWitness | undefined>;
79
87
  utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined>;
@@ -103,13 +111,13 @@ export interface IUtilityExecutionOracle {
103
111
  secret: Fr,
104
112
  ): Promise<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>>;
105
113
  utilityStorageRead(
106
- blockHash: L2BlockHash,
114
+ blockHash: BlockHash,
107
115
  contractAddress: AztecAddress,
108
116
  startStorageSlot: Fr,
109
117
  numberOfElements: number,
110
118
  ): Promise<Fr[]>;
111
119
  utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr): Promise<void>;
112
- utilityValidateEnqueuedNotesAndEvents(
120
+ utilityValidateAndStoreEnqueuedNotesAndEvents(
113
121
  contractAddress: AztecAddress,
114
122
  noteValidationRequestsArrayBaseSlot: Fr,
115
123
  eventValidationRequestsArrayBaseSlot: Fr,
@@ -147,6 +155,7 @@ export interface IPrivateExecutionOracle {
147
155
  ): void;
148
156
  privateNotifyNullifiedNote(innerNullifier: Fr, noteHash: Fr, counter: number): Promise<void>;
149
157
  privateNotifyCreatedNullifier(innerNullifier: Fr): Promise<void>;
158
+ privateIsNullifierPending(innerNullifier: Fr, contractAddress: AztecAddress): Promise<boolean>;
150
159
  privateNotifyCreatedContractClassLog(log: ContractClassLog, counter: number): void;
151
160
  privateCallPrivateFunction(
152
161
  targetContractAddress: AztecAddress,
@@ -12,9 +12,8 @@ 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 { L2BlockHash } from '@aztec/stdlib/block';
15
+ import { BlockHash } from '@aztec/stdlib/block';
16
16
  import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
17
- import { MerkleTreeId } from '@aztec/stdlib/trees';
18
17
 
19
18
  import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
20
19
  import { packAsHintedNote } from './note_packing_utils.js';
@@ -138,33 +137,39 @@ export class Oracle {
138
137
  ].map(toACVMField);
139
138
  }
140
139
 
141
- async utilityGetMembershipWitness(
140
+ async utilityGetNoteHashMembershipWitness(
142
141
  [blockHash]: ACVMField[],
143
- [treeId]: ACVMField[],
144
142
  [leafValue]: ACVMField[],
145
143
  ): Promise<(ACVMField | ACVMField[])[]> {
146
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
147
- const parsedTreeId = Fr.fromString(treeId).toNumber();
144
+ const parsedBlockHash = BlockHash.fromString(blockHash);
148
145
  const parsedLeafValue = Fr.fromString(leafValue);
149
146
 
150
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(
151
- parsedBlockHash,
152
- parsedTreeId,
153
- parsedLeafValue,
154
- );
147
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(parsedBlockHash, parsedLeafValue);
155
148
  if (!witness) {
156
- throw new Error(
157
- `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block hash ${parsedBlockHash.toString()}.`,
158
- );
149
+ throw new Error(`Leaf ${leafValue} not found in the note hash tree at block hash ${parsedBlockHash.toString()}.`);
150
+ }
151
+ return witness.toNoirRepresentation();
152
+ }
153
+
154
+ async utilityGetArchiveMembershipWitness(
155
+ [blockHash]: ACVMField[],
156
+ [leafValue]: ACVMField[],
157
+ ): Promise<(ACVMField | ACVMField[])[]> {
158
+ const parsedBlockHash = BlockHash.fromString(blockHash);
159
+ const parsedLeafValue = Fr.fromString(leafValue);
160
+
161
+ const witness = await this.handlerAsUtility().utilityGetArchiveMembershipWitness(parsedBlockHash, parsedLeafValue);
162
+ if (!witness) {
163
+ throw new Error(`Leaf ${leafValue} not found in the archive tree at block hash ${parsedBlockHash.toString()}.`);
159
164
  }
160
- return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
165
+ return witness.toNoirRepresentation();
161
166
  }
162
167
 
163
168
  async utilityGetNullifierMembershipWitness(
164
169
  [blockHash]: ACVMField[],
165
170
  [nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
166
171
  ): Promise<(ACVMField | ACVMField[])[]> {
167
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
172
+ const parsedBlockHash = BlockHash.fromString(blockHash);
168
173
  const parsedNullifier = Fr.fromString(nullifier);
169
174
 
170
175
  const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(
@@ -183,7 +188,7 @@ export class Oracle {
183
188
  [blockHash]: ACVMField[],
184
189
  [nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
185
190
  ): Promise<(ACVMField | ACVMField[])[]> {
186
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
191
+ const parsedBlockHash = BlockHash.fromString(blockHash);
187
192
  const parsedNullifier = Fr.fromString(nullifier);
188
193
 
189
194
  const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
@@ -202,7 +207,7 @@ export class Oracle {
202
207
  [blockHash]: ACVMField[],
203
208
  [leafSlot]: ACVMField[],
204
209
  ): Promise<(ACVMField | ACVMField[])[]> {
205
- const parsedBlockHash = L2BlockHash.fromString(blockHash);
210
+ const parsedBlockHash = BlockHash.fromString(blockHash);
206
211
  const parsedLeafSlot = Fr.fromString(leafSlot);
207
212
 
208
213
  const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(parsedBlockHash, parsedLeafSlot);
@@ -341,6 +346,14 @@ export class Oracle {
341
346
  return [];
342
347
  }
343
348
 
349
+ async privateIsNullifierPending([innerNullifier]: ACVMField[], [contractAddress]: ACVMField[]): Promise<ACVMField[]> {
350
+ const isPending = await this.handlerAsPrivate().privateIsNullifierPending(
351
+ Fr.fromString(innerNullifier),
352
+ AztecAddress.fromString(contractAddress),
353
+ );
354
+ return [toACVMField(isPending)];
355
+ }
356
+
344
357
  async utilityCheckNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
345
358
  const exists = await this.handlerAsUtility().utilityCheckNullifierExists(Fr.fromString(innerNullifier));
346
359
  return [toACVMField(exists)];
@@ -366,7 +379,7 @@ export class Oracle {
366
379
  [numberOfElements]: ACVMField[],
367
380
  ): Promise<ACVMField[][]> {
368
381
  const values = await this.handlerAsUtility().utilityStorageRead(
369
- L2BlockHash.fromString(blockHash),
382
+ BlockHash.fromString(blockHash),
370
383
  new AztecAddress(Fr.fromString(contractAddress)),
371
384
  Fr.fromString(startStorageSlot),
372
385
  +numberOfElements,
@@ -478,12 +491,12 @@ export class Oracle {
478
491
  return [];
479
492
  }
480
493
 
481
- async utilityValidateEnqueuedNotesAndEvents(
494
+ async utilityValidateAndStoreEnqueuedNotesAndEvents(
482
495
  [contractAddress]: ACVMField[],
483
496
  [noteValidationRequestsArrayBaseSlot]: ACVMField[],
484
497
  [eventValidationRequestsArrayBaseSlot]: ACVMField[],
485
498
  ): Promise<ACVMField[]> {
486
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
499
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
487
500
  AztecAddress.fromString(contractAddress),
488
501
  Fr.fromString(noteValidationRequestsArrayBaseSlot),
489
502
  Fr.fromString(eventValidationRequestsArrayBaseSlot),
@@ -2,7 +2,6 @@ import { PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, PRIVATE_CONTEXT_INPUTS_LENGTH } f
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { Timer } from '@aztec/foundation/timer';
5
- import { ProtocolContractAddress } from '@aztec/protocol-contracts';
6
5
  import {
7
6
  type ACVMWitness,
8
7
  type CircuitSimulator,
@@ -18,15 +17,10 @@ import {
18
17
  countArgumentsSize,
19
18
  } from '@aztec/stdlib/abi';
20
19
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
21
- import { L2BlockHash } from '@aztec/stdlib/block';
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';
22
+ import { PrivateCallExecutionResult } from '@aztec/stdlib/tx';
28
23
 
29
- import { ContractStore } from '../../storage/contract_store/index.js';
30
24
  import { Oracle } from './oracle.js';
31
25
  import type { PrivateExecutionOracle } from './private_execution_oracle.js';
32
26
 
@@ -145,56 +139,3 @@ export function extractPrivateCircuitPublicInputs(
145
139
  }
146
140
  return PrivateCircuitPublicInputs.fromFields(returnData);
147
141
  }
148
-
149
- /**
150
- * Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
151
- * from the instance is used.
152
- * @param contractAddress - The address of the contract to read the class id for.
153
- * @param instance - The instance of the contract.
154
- * @param aztecNode - The Aztec node to query for storage.
155
- * @param header - The header of the block at which to load the DelayedPublicMutable storing the class id.
156
- * @returns The current class id.
157
- */
158
- export async function readCurrentClassId(
159
- contractAddress: AztecAddress,
160
- instance: ContractInstance,
161
- aztecNode: AztecNode,
162
- header: BlockHeader,
163
- ) {
164
- const blockHashFr = await header.hash();
165
- const blockHash = L2BlockHash.fromField(blockHashFr);
166
- const timestamp = header.globalVariables.timestamp;
167
- const { delayedPublicMutableSlot } = await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
168
- const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, slot =>
169
- aztecNode.getPublicStorageAt(blockHash, ProtocolContractAddress.ContractInstanceRegistry, slot),
170
- );
171
- let currentClassId = delayedPublicMutableValues.svc.getCurrentAt(timestamp)[0];
172
- if (currentClassId.isZero()) {
173
- currentClassId = instance.originalContractClassId;
174
- }
175
- return currentClassId;
176
- }
177
-
178
- /**
179
- * Verify that the current class id of a contract obtained from AztecNode is the same as the one in contract data
180
- * provider (i.e. PXE's own storage).
181
- * @param header - The header of the block at which to verify the current class id.
182
- */
183
- export async function verifyCurrentClassId(
184
- contractAddress: AztecAddress,
185
- aztecNode: AztecNode,
186
- contractStore: ContractStore,
187
- header: BlockHeader,
188
- ) {
189
- const instance = await contractStore.getContractInstance(contractAddress);
190
- if (!instance) {
191
- throw new Error(`No contract instance found for address ${contractAddress.toString()}`);
192
- }
193
-
194
- const currentClassId = await readCurrentClassId(contractAddress, instance, aztecNode, header);
195
- if (!instance.currentContractClassId.equals(currentClassId)) {
196
- throw new Error(
197
- `Contract ${contractAddress} is outdated, current class id is ${currentClassId}, local class id is ${instance.currentContractClassId}`,
198
- );
199
- }
200
- }
@@ -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
  /**
@@ -88,7 +88,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
88
88
  keyStore: KeyStore,
89
89
  addressStore: AddressStore,
90
90
  aztecNode: AztecNode,
91
- anchorBlockStore: AnchorBlockStore,
92
91
  private readonly senderTaggingStore: SenderTaggingStore,
93
92
  recipientTaggingStore: RecipientTaggingStore,
94
93
  senderAddressBookStore: SenderAddressBookStore,
@@ -112,7 +111,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
112
111
  keyStore,
113
112
  addressStore,
114
113
  aztecNode,
115
- anchorBlockStore,
116
114
  recipientTaggingStore,
117
115
  senderAddressBookStore,
118
116
  capsuleStore,
@@ -265,7 +263,14 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
265
263
  // This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices
266
264
  // are up to date. We do this here because this store is not synced as part of the global sync because
267
265
  // that'd be wasteful as most tagging secrets are not used in each tx.
268
- await syncSenderTaggingIndexes(secret, this.contractAddress, this.aztecNode, this.senderTaggingStore, this.jobId);
266
+ await syncSenderTaggingIndexes(
267
+ secret,
268
+ this.contractAddress,
269
+ this.aztecNode,
270
+ this.senderTaggingStore,
271
+ await this.anchorBlockHeader.hash(),
272
+ this.jobId,
273
+ );
269
274
 
270
275
  const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret, this.jobId);
271
276
  // If lastUsedIndex is undefined, we've never used this secret, so start from 0
@@ -356,7 +361,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
356
361
 
357
362
  const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
358
363
 
359
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
364
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
360
365
  const dbNotes = await noteService.getNotes(
361
366
  this.callContext.contractAddress,
362
367
  owner,
@@ -463,6 +468,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
463
468
  return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
464
469
  }
465
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
+
466
484
  /**
467
485
  * Emit a contract class log.
468
486
  * This fn exists because we only carry a poseidon hash through the kernels, and need to
@@ -519,9 +537,14 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
519
537
 
520
538
  isStaticCall = isStaticCall || this.callContext.isStaticCall;
521
539
 
522
- await verifyCurrentClassId(targetContractAddress, this.aztecNode, this.contractStore, this.anchorBlockHeader);
523
-
524
- 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
+ );
525
548
 
526
549
  const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
527
550
  targetContractAddress,
@@ -548,7 +571,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
548
571
  this.keyStore,
549
572
  this.addressStore,
550
573
  this.aztecNode,
551
- this.anchorBlockStore,
552
574
  this.senderTaggingStore,
553
575
  this.recipientTaggingStore,
554
576
  this.senderAddressBookStore,
@@ -1,18 +1,21 @@
1
+ import type { ARCHIVE_HEIGHT, NOTE_HASH_TREE_HEIGHT } from '@aztec/constants';
1
2
  import type { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Aes128 } from '@aztec/foundation/crypto/aes128';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
4
5
  import { Point } from '@aztec/foundation/curves/grumpkin';
5
6
  import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
7
+ import type { MembershipWitness } from '@aztec/foundation/trees';
6
8
  import type { KeyStore } from '@aztec/key-store';
7
9
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
8
10
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
- import { L2BlockHash } from '@aztec/stdlib/block';
11
+ import { BlockHash } from '@aztec/stdlib/block';
10
12
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
11
13
  import { siloNullifier } from '@aztec/stdlib/hash';
12
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
13
15
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
14
16
  import { computeAddressSecret } from '@aztec/stdlib/keys';
15
17
  import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
18
+ import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
16
19
  import type { NoteStatus } from '@aztec/stdlib/note';
17
20
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
18
21
  import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
@@ -22,14 +25,12 @@ import { LogService } from '../../logs/log_service.js';
22
25
  import { NoteService } from '../../notes/note_service.js';
23
26
  import { ORACLE_VERSION } from '../../oracle_version.js';
24
27
  import type { AddressStore } from '../../storage/address_store/address_store.js';
25
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
26
28
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
27
29
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
28
30
  import type { NoteStore } from '../../storage/note_store/note_store.js';
29
31
  import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
30
32
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
31
33
  import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
32
- import { TreeMembershipService } from '../../tree_membership/tree_membership_service.js';
33
34
  import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
34
35
  import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
35
36
  import { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
@@ -59,7 +60,6 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
59
60
  protected readonly keyStore: KeyStore,
60
61
  protected readonly addressStore: AddressStore,
61
62
  protected readonly aztecNode: AztecNode,
62
- protected readonly anchorBlockStore: AnchorBlockStore,
63
63
  protected readonly recipientTaggingStore: RecipientTaggingStore,
64
64
  protected readonly senderAddressBookStore: SenderAddressBookStore,
65
65
  protected readonly capsuleStore: CapsuleStore,
@@ -94,15 +94,29 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
94
94
  }
95
95
 
96
96
  /**
97
- * Fetches the index and sibling path of a leaf at a given block from a given tree.
97
+ * Fetches the index and sibling path of a leaf at a given block from the note hash tree.
98
98
  * @param blockHash - The block hash at which to get the membership witness.
99
- * @param treeId - Id of the tree to get the sibling path from.
100
99
  * @param leafValue - The leaf value
101
- * @returns The index and sibling path concatenated [index, sibling_path]
100
+ * @returns The membership witness containing the leaf index and sibling path
102
101
  */
103
- public utilityGetMembershipWitness(blockHash: L2BlockHash, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[]> {
104
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
105
- return treeMembershipService.getMembershipWitness(blockHash, treeId, leafValue);
102
+ public utilityGetNoteHashMembershipWitness(
103
+ blockHash: BlockHash,
104
+ leafValue: Fr,
105
+ ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
106
+ return this.aztecNode.getNoteHashMembershipWitness(blockHash, leafValue);
107
+ }
108
+
109
+ /**
110
+ * Fetches the index and sibling path of a leaf at a given block from the archive tree.
111
+ * @param blockHash - The block hash at which to get the membership witness.
112
+ * @param leafValue - The leaf value
113
+ * @returns The membership witness containing the leaf index and sibling path
114
+ */
115
+ public utilityGetArchiveMembershipWitness(
116
+ blockHash: BlockHash,
117
+ leafValue: Fr,
118
+ ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
119
+ return this.aztecNode.getArchiveMembershipWitness(blockHash, leafValue);
106
120
  }
107
121
 
108
122
  /**
@@ -111,11 +125,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
111
125
  * @param nullifier - Nullifier we try to find witness for.
112
126
  * @returns The nullifier membership witness (if found).
113
127
  */
114
- public async utilityGetNullifierMembershipWitness(
115
- blockHash: L2BlockHash,
128
+ public utilityGetNullifierMembershipWitness(
129
+ blockHash: BlockHash,
116
130
  nullifier: Fr,
117
131
  ): Promise<NullifierMembershipWitness | undefined> {
118
- return await this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
132
+ return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
119
133
  }
120
134
 
121
135
  /**
@@ -127,12 +141,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
127
141
  * list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
128
142
  * we are trying to prove non-inclusion for.
129
143
  */
130
- public async utilityGetLowNullifierMembershipWitness(
131
- blockHash: L2BlockHash,
144
+ public utilityGetLowNullifierMembershipWitness(
145
+ blockHash: BlockHash,
132
146
  nullifier: Fr,
133
147
  ): Promise<NullifierMembershipWitness | undefined> {
134
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
135
- return await treeMembershipService.getLowNullifierMembershipWitness(blockHash, nullifier);
148
+ return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
136
149
  }
137
150
 
138
151
  /**
@@ -141,12 +154,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
141
154
  * @param leafSlot - The slot of the public data tree to get the witness for.
142
155
  * @returns - The witness
143
156
  */
144
- public async utilityGetPublicDataWitness(
145
- blockHash: L2BlockHash,
146
- leafSlot: Fr,
147
- ): Promise<PublicDataWitness | undefined> {
148
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
149
- return await treeMembershipService.getPublicDataWitness(blockHash, leafSlot);
157
+ public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
158
+ return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
150
159
  }
151
160
 
152
161
  /**
@@ -155,7 +164,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
155
164
  * @returns Block extracted from a block with block number `blockNumber`.
156
165
  */
157
166
  public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
158
- const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
167
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
159
168
  if (blockNumber > anchorBlockNumber) {
160
169
  throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
161
170
  }
@@ -251,7 +260,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
251
260
  offset: number,
252
261
  status: NoteStatus,
253
262
  ): Promise<NoteData[]> {
254
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
263
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
255
264
 
256
265
  const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
257
266
  return pickNotes<NoteData>(dbNotes, {
@@ -276,9 +285,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
276
285
  */
277
286
  public async utilityCheckNullifierExists(innerNullifier: Fr) {
278
287
  const nullifier = await siloNullifier(this.contractAddress, innerNullifier!);
279
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
280
- const index = await treeMembershipService.getNullifierIndex(nullifier);
281
- return index !== undefined;
288
+ const [leafIndex] = await this.aztecNode.findLeavesIndexes('latest', MerkleTreeId.NULLIFIER_TREE, [nullifier]);
289
+ return leafIndex?.data !== undefined;
282
290
  }
283
291
 
284
292
  /**
@@ -290,14 +298,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
290
298
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
291
299
  */
292
300
  public async utilityGetL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
293
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
294
- const [messageIndex, siblingPath] = await treeMembershipService.getL1ToL2MembershipWitness(
301
+ const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
302
+ this.aztecNode,
295
303
  contractAddress,
296
304
  messageHash,
297
305
  secret,
298
306
  );
299
307
 
300
- // Assuming messageIndex is what you intended to use for the index in MessageLoadOracleInputs
301
308
  return new MessageLoadOracleInputs(messageIndex, siblingPath);
302
309
  }
303
310
 
@@ -309,24 +316,23 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
309
316
  * @param numberOfElements - Number of elements to read from the starting storage slot.
310
317
  */
311
318
  public async utilityStorageRead(
312
- blockHash: L2BlockHash,
319
+ blockHash: BlockHash,
313
320
  contractAddress: AztecAddress,
314
321
  startStorageSlot: Fr,
315
322
  numberOfElements: number,
316
323
  ) {
317
- const values = [];
324
+ const slots = Array(numberOfElements)
325
+ .fill(0)
326
+ .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
318
327
 
319
- // TODO: why do we serialize these requests? This should probably a single call
320
- // Privacy considerations?
321
- for (let i = 0n; i < numberOfElements; i++) {
322
- const storageSlot = new Fr(startStorageSlot.value + i);
323
- const value = await this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot);
328
+ const values = await Promise.all(
329
+ slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
330
+ );
331
+
332
+ this.log.debug(
333
+ `Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
334
+ );
324
335
 
325
- this.log.debug(
326
- `Oracle storage read: slot=${storageSlot.toString()} address-${contractAddress.toString()} value=${value}`,
327
- );
328
- values.push(value);
329
- }
330
336
  return values;
331
337
  }
332
338
 
@@ -341,16 +347,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
341
347
  public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
342
348
  const logService = new LogService(
343
349
  this.aztecNode,
344
- this.anchorBlockStore,
350
+ this.anchorBlockHeader,
345
351
  this.keyStore,
346
352
  this.capsuleStore,
347
353
  this.recipientTaggingStore,
348
354
  this.senderAddressBookStore,
349
355
  this.addressStore,
350
356
  this.jobId,
357
+ this.log.getBindings(),
351
358
  );
352
359
 
353
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
360
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
354
361
 
355
362
  // It is acceptable to run the following operations in parallel for several reasons:
356
363
  // 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
@@ -372,7 +379,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
372
379
  * @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
373
380
  * @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
374
381
  */
375
- public async utilityValidateEnqueuedNotesAndEvents(
382
+ public async utilityValidateAndStoreEnqueuedNotesAndEvents(
376
383
  contractAddress: AztecAddress,
377
384
  noteValidationRequestsArrayBaseSlot: Fr,
378
385
  eventValidationRequestsArrayBaseSlot: Fr,
@@ -392,9 +399,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
392
399
  await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
393
400
  ).map(EventValidationRequest.fromFields);
394
401
 
395
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
402
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
396
403
  const noteStorePromises = noteValidationRequests.map(request =>
397
- noteService.storeNote(
404
+ noteService.validateAndStoreNote(
398
405
  request.contractAddress,
399
406
  request.owner,
400
407
  request.storageSlot,
@@ -408,9 +415,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
408
415
  ),
409
416
  );
410
417
 
411
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore, this.jobId);
418
+ const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
412
419
  const eventStorePromises = eventValidationRequests.map(request =>
413
- eventService.storeEvent(
420
+ eventService.validateAndStoreEvent(
414
421
  request.contractAddress,
415
422
  request.eventTypeId,
416
423
  request.randomness,
@@ -446,13 +453,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
446
453
 
447
454
  const logService = new LogService(
448
455
  this.aztecNode,
449
- this.anchorBlockStore,
456
+ this.anchorBlockHeader,
450
457
  this.keyStore,
451
458
  this.capsuleStore,
452
459
  this.recipientTaggingStore,
453
460
  this.senderAddressBookStore,
454
461
  this.addressStore,
455
462
  this.jobId,
463
+ this.log.getBindings(),
456
464
  );
457
465
 
458
466
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);