@aztec/pxe 0.0.1-commit.c7c42ec → 0.0.1-commit.c80b6263

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 (214) 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 +8 -9
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +33 -19
  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 +43 -32
  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 +16 -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 +24 -38
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +27 -17
  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 +72 -72
  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 +20 -6
  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 +21 -7
  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 +4 -3
  69. package/dest/events/event_service.d.ts.map +1 -1
  70. package/dest/events/event_service.js +17 -19
  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 +4 -2
  78. package/dest/logs/log_service.d.ts.map +1 -1
  79. package/dest/logs/log_service.js +22 -14
  80. package/dest/notes/note_service.d.ts +5 -4
  81. package/dest/notes/note_service.d.ts.map +1 -1
  82. package/dest/notes/note_service.js +30 -34
  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 -93
  101. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  102. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  103. package/dest/storage/capsule_store/capsule_store.js +132 -23
  104. package/dest/storage/note_store/note_store.d.ts +45 -56
  105. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  106. package/dest/storage/note_store/note_store.js +244 -263
  107. package/dest/storage/note_store/stored_note.d.ts +16 -0
  108. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  109. package/dest/storage/note_store/stored_note.js +43 -0
  110. package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
  111. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  112. package/dest/storage/private_event_store/private_event_store.js +203 -68
  113. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  114. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  115. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  116. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  117. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  118. package/dest/storage/tagging_store/recipient_tagging_store.js +69 -12
  119. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  120. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  121. package/dest/storage/tagging_store/sender_tagging_store.js +110 -28
  122. package/dest/tagging/constants.d.ts +2 -0
  123. package/dest/tagging/constants.d.ts.map +1 -0
  124. package/dest/tagging/constants.js +10 -0
  125. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  126. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  127. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  128. package/dest/tagging/index.d.ts +3 -2
  129. package/dest/tagging/index.d.ts.map +1 -1
  130. package/dest/tagging/index.js +2 -10
  131. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  132. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  133. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
  134. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  135. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  136. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  137. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  138. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  139. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  140. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  141. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  142. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  143. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  144. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  145. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  146. package/package.json +18 -18
  147. package/src/bin/check_oracle_version.ts +1 -0
  148. package/src/block_synchronizer/block_synchronizer.ts +87 -32
  149. package/src/config/index.ts +14 -0
  150. package/src/config/package_info.ts +1 -1
  151. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  152. package/src/contract_function_simulator/contract_function_simulator.ts +39 -21
  153. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  154. package/src/contract_function_simulator/index.ts +1 -1
  155. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
  156. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  157. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  158. package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
  159. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  160. package/src/contract_function_simulator/oracle/oracle.ts +56 -41
  161. package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
  162. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +43 -42
  163. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +92 -76
  164. package/src/contract_sync/index.ts +98 -0
  165. package/src/debug/pxe_debug_utils.ts +26 -11
  166. package/src/entrypoints/client/bundle/utils.ts +12 -15
  167. package/src/entrypoints/client/lazy/utils.ts +13 -16
  168. package/src/entrypoints/pxe_creation_options.ts +4 -2
  169. package/src/entrypoints/server/index.ts +2 -0
  170. package/src/entrypoints/server/utils.ts +26 -34
  171. package/src/events/event_service.ts +17 -21
  172. package/src/events/private_event_filter_validator.ts +3 -5
  173. package/src/job_coordinator/job_coordinator.ts +150 -0
  174. package/src/logs/log_service.ts +33 -12
  175. package/src/notes/note_service.ts +37 -40
  176. package/src/oracle_version.ts +4 -3
  177. package/src/private_kernel/hints/index.ts +1 -1
  178. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  179. package/src/private_kernel/private_kernel_execution_prover.ts +9 -8
  180. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  181. package/src/pxe.ts +136 -122
  182. package/src/storage/capsule_store/capsule_store.ts +159 -23
  183. package/src/storage/note_store/note_store.ts +286 -317
  184. package/src/storage/note_store/stored_note.ts +48 -0
  185. package/src/storage/private_event_store/private_event_store.ts +277 -76
  186. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  187. package/src/storage/tagging_store/recipient_tagging_store.ts +89 -13
  188. package/src/storage/tagging_store/sender_tagging_store.ts +129 -28
  189. package/src/tagging/constants.ts +10 -0
  190. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  191. package/src/tagging/index.ts +2 -11
  192. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
  193. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  194. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
  195. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
  196. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  197. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  198. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  199. package/dest/contract_function_simulator/proxied_node.js +0 -27
  200. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  201. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  202. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  203. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  204. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  205. package/dest/public_storage/public_storage_service.d.ts +0 -24
  206. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  207. package/dest/public_storage/public_storage_service.js +0 -26
  208. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  209. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  210. package/dest/tree_membership/tree_membership_service.js +0 -84
  211. package/src/contract_function_simulator/proxied_node.ts +0 -33
  212. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  213. package/src/public_storage/public_storage_service.ts +0 -33
  214. package/src/tree_membership/tree_membership_service.ts +0 -112
@@ -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,84 @@ export class Oracle {
137
137
  ].map(toACVMField);
138
138
  }
139
139
 
140
- async utilityGetMembershipWitness(
141
- [blockNumber]: ACVMField[],
142
- [treeId]: ACVMField[],
140
+ async utilityGetNoteHashMembershipWitness(
141
+ [blockHash]: ACVMField[],
143
142
  [leafValue]: ACVMField[],
144
143
  ): Promise<(ACVMField | ACVMField[])[]> {
145
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
146
- const parsedTreeId = Fr.fromString(treeId).toNumber();
144
+ const parsedBlockHash = BlockHash.fromString(blockHash);
147
145
  const parsedLeafValue = Fr.fromString(leafValue);
148
146
 
149
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(
150
- BlockNumber(parsedBlockNumber),
151
- parsedTreeId,
152
- parsedLeafValue,
153
- );
147
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(parsedBlockHash, parsedLeafValue);
154
148
  if (!witness) {
155
- throw new Error(
156
- `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
157
- );
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()}.`);
158
164
  }
159
- return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
165
+ return witness.toNoirRepresentation();
160
166
  }
161
167
 
162
168
  async utilityGetNullifierMembershipWitness(
163
- [blockNumber]: ACVMField[],
169
+ [blockHash]: ACVMField[],
164
170
  [nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
165
171
  ): Promise<(ACVMField | ACVMField[])[]> {
166
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
172
+ const parsedBlockHash = BlockHash.fromString(blockHash);
167
173
  const parsedNullifier = Fr.fromString(nullifier);
168
174
 
169
175
  const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(
170
- BlockNumber(parsedBlockNumber),
176
+ parsedBlockHash,
171
177
  parsedNullifier,
172
178
  );
173
179
  if (!witness) {
174
- throw new Error(`Nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`);
180
+ throw new Error(
181
+ `Nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
182
+ );
175
183
  }
176
184
  return witness.toNoirRepresentation();
177
185
  }
178
186
 
179
187
  async utilityGetLowNullifierMembershipWitness(
180
- [blockNumber]: ACVMField[],
188
+ [blockHash]: ACVMField[],
181
189
  [nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
182
190
  ): Promise<(ACVMField | ACVMField[])[]> {
183
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
191
+ const parsedBlockHash = BlockHash.fromString(blockHash);
184
192
  const parsedNullifier = Fr.fromString(nullifier);
185
193
 
186
194
  const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
187
- BlockNumber(parsedBlockNumber),
195
+ parsedBlockHash,
188
196
  parsedNullifier,
189
197
  );
190
198
  if (!witness) {
191
199
  throw new Error(
192
- `Low nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`,
200
+ `Low nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
193
201
  );
194
202
  }
195
203
  return witness.toNoirRepresentation();
196
204
  }
197
205
 
198
206
  async utilityGetPublicDataWitness(
199
- [blockNumber]: ACVMField[],
207
+ [blockHash]: ACVMField[],
200
208
  [leafSlot]: ACVMField[],
201
209
  ): Promise<(ACVMField | ACVMField[])[]> {
202
- const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
210
+ const parsedBlockHash = BlockHash.fromString(blockHash);
203
211
  const parsedLeafSlot = Fr.fromString(leafSlot);
204
212
 
205
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(
206
- BlockNumber(parsedBlockNumber),
207
- parsedLeafSlot,
208
- );
213
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(parsedBlockHash, parsedLeafSlot);
209
214
  if (!witness) {
210
- throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
215
+ throw new Error(
216
+ `Public data witness not found for slot ${parsedLeafSlot} at block hash ${parsedBlockHash.toString()}.`,
217
+ );
211
218
  }
212
219
  return witness.toNoirRepresentation();
213
220
  }
@@ -257,7 +264,7 @@ export class Oracle {
257
264
  [offset]: ACVMField[],
258
265
  [status]: ACVMField[],
259
266
  [maxNotes]: ACVMField[],
260
- [packedRetrievedNoteLength]: ACVMField[],
267
+ [packedHintedNoteLength]: ACVMField[],
261
268
  ): Promise<(ACVMField | ACVMField[])[]> {
262
269
  // Parse Option<AztecAddress>: ownerSome is 0 for None, 1 for Some
263
270
  const owner = Fr.fromString(ownerSome).toNumber() === 1 ? AztecAddress.fromString(ownerValue) : undefined;
@@ -279,25 +286,25 @@ export class Oracle {
279
286
  +status,
280
287
  );
281
288
 
282
- const returnDataAsArrayOfPackedRetrievedNotes = noteDatas.map(noteData =>
283
- packAsRetrievedNote({
289
+ const returnDataAsArrayOfPackedHintedNotes = noteDatas.map(noteData =>
290
+ packAsHintedNote({
284
291
  contractAddress: noteData.contractAddress,
285
292
  owner: noteData.owner,
286
293
  randomness: noteData.randomness,
287
294
  storageSlot: noteData.storageSlot,
288
295
  noteNonce: noteData.noteNonce,
289
- index: noteData.index,
296
+ isPending: noteData.isPending,
290
297
  note: noteData.note,
291
298
  }),
292
299
  );
293
300
 
294
301
  // Now we convert each sub-array to an array of ACVMField
295
- const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedRetrievedNotes.map(subArray =>
302
+ const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedHintedNotes.map(subArray =>
296
303
  subArray.map(toACVMField),
297
304
  );
298
305
 
299
306
  // At last we convert the array of arrays to a bounded vec of arrays
300
- return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedRetrievedNoteLength);
307
+ return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedHintedNoteLength);
301
308
  }
302
309
 
303
310
  privateNotifyCreatedNote(
@@ -339,6 +346,14 @@ export class Oracle {
339
346
  return [];
340
347
  }
341
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
+
342
357
  async utilityCheckNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
343
358
  const exists = await this.handlerAsUtility().utilityCheckNullifierExists(Fr.fromString(innerNullifier));
344
359
  return [toACVMField(exists)];
@@ -358,15 +373,15 @@ export class Oracle {
358
373
  }
359
374
 
360
375
  async utilityStorageRead(
376
+ [blockHash]: ACVMField[],
361
377
  [contractAddress]: ACVMField[],
362
378
  [startStorageSlot]: ACVMField[],
363
- [blockNumber]: ACVMField[],
364
379
  [numberOfElements]: ACVMField[],
365
380
  ): Promise<ACVMField[][]> {
366
381
  const values = await this.handlerAsUtility().utilityStorageRead(
382
+ BlockHash.fromString(blockHash),
367
383
  new AztecAddress(Fr.fromString(contractAddress)),
368
384
  Fr.fromString(startStorageSlot),
369
- BlockNumber(+blockNumber),
370
385
  +numberOfElements,
371
386
  );
372
387
  return [values.map(toACVMField)];
@@ -476,12 +491,12 @@ export class Oracle {
476
491
  return [];
477
492
  }
478
493
 
479
- async utilityValidateEnqueuedNotesAndEvents(
494
+ async utilityValidateAndStoreEnqueuedNotesAndEvents(
480
495
  [contractAddress]: ACVMField[],
481
496
  [noteValidationRequestsArrayBaseSlot]: ACVMField[],
482
497
  [eventValidationRequestsArrayBaseSlot]: ACVMField[],
483
498
  ): Promise<ACVMField[]> {
484
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
499
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
485
500
  AztecAddress.fromString(contractAddress),
486
501
  Fr.fromString(noteValidationRequestsArrayBaseSlot),
487
502
  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
- }
@@ -7,13 +7,14 @@ import { type CircuitSimulator, toACVMWitness } from '@aztec/simulator/client';
7
7
  import {
8
8
  type FunctionAbi,
9
9
  type FunctionArtifact,
10
+ type FunctionCall,
10
11
  FunctionSelector,
11
12
  type NoteSelector,
12
13
  countArgumentsSize,
13
14
  } from '@aztec/stdlib/abi';
14
15
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
15
16
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
16
- import { computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
17
+ import { siloNullifier } from '@aztec/stdlib/hash';
17
18
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
18
19
  import { PrivateContextInputs } from '@aztec/stdlib/kernel';
19
20
  import { type ContractClassLog, DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
@@ -29,6 +30,7 @@ import {
29
30
  type TxContext,
30
31
  } from '@aztec/stdlib/tx';
31
32
 
33
+ import { ensureContractSynced } from '../../contract_sync/index.js';
32
34
  import { NoteService } from '../../notes/note_service.js';
33
35
  import type { AddressStore } from '../../storage/address_store/address_store.js';
34
36
  import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
@@ -45,7 +47,7 @@ import { ExecutionTaggingIndexCache } from '../execution_tagging_index_cache.js'
45
47
  import type { HashedValuesCache } from '../hashed_values_cache.js';
46
48
  import { pickNotes } from '../pick_notes.js';
47
49
  import type { IPrivateExecutionOracle, NoteData } from './interfaces.js';
48
- import { executePrivateFunction, verifyCurrentClassId } from './private_execution.js';
50
+ import { executePrivateFunction } from './private_execution.js';
49
51
  import { UtilityExecutionOracle } from './utility_execution_oracle.js';
50
52
 
51
53
  /**
@@ -63,16 +65,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
63
65
  * Users can also use this to get a clearer idea of what's happened during a simulation.
64
66
  */
65
67
  private newNotes: NoteAndSlot[] = [];
66
- /**
67
- * Notes from previous transactions that are returned to the oracle call `getNotes` during this execution.
68
- * The mapping maps from the unique siloed note hash to the index for notes created in private executions.
69
- * It maps from siloed note hash to the index for notes created by public functions.
70
- *
71
- * They are not part of the ExecutionNoteCache and being forwarded to nested contexts via `extend()`
72
- * because these notes are meant to be maintained on a per-call basis
73
- * They should act as references for the read requests output by an app circuit via public inputs.
74
- */
75
- private noteHashLeafIndexMap: Map<bigint, bigint> = new Map();
76
68
  private noteHashNullifierCounterMap: Map<number, number> = new Map();
77
69
  private contractClassLogs: CountedContractClassLog[] = [];
78
70
  private offchainEffects: { data: Fr[] }[] = [];
@@ -84,6 +76,8 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
84
76
  private readonly callContext: CallContext,
85
77
  /** Header of a block whose state is used during private execution (not the block the transaction is included in). */
86
78
  protected override readonly anchorBlockHeader: BlockHeader,
79
+ /** Needed to trigger contract synchronization before nested calls */
80
+ private readonly utilityExecutor: (call: FunctionCall) => Promise<void>,
87
81
  /** List of transient auth witnesses to be used during this simulation */
88
82
  authWitnesses: AuthWitness[],
89
83
  capsules: Capsule[],
@@ -101,6 +95,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
101
95
  senderAddressBookStore: SenderAddressBookStore,
102
96
  capsuleStore: CapsuleStore,
103
97
  privateEventStore: PrivateEventStore,
98
+ jobId: string,
104
99
  private totalPublicCalldataCount: number = 0,
105
100
  protected sideEffectCounter: number = 0,
106
101
  log = createLogger('simulator:client_execution_context'),
@@ -123,6 +118,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
123
118
  senderAddressBookStore,
124
119
  capsuleStore,
125
120
  privateEventStore,
121
+ jobId,
126
122
  log,
127
123
  scopes,
128
124
  );
@@ -157,14 +153,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
157
153
  return toACVMWitness(0, fields);
158
154
  }
159
155
 
160
- /**
161
- * The KernelProver will use this to fully populate witnesses and provide hints to the kernel circuit
162
- * regarding which note hash each settled read request corresponds to.
163
- */
164
- public getNoteHashLeafIndexMap() {
165
- return this.noteHashLeafIndexMap;
166
- }
167
-
168
156
  /**
169
157
  * Get the data for the newly created notes.
170
158
  */
@@ -278,9 +266,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
278
266
  // This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices
279
267
  // are up to date. We do this here because this store is not synced as part of the global sync because
280
268
  // that'd be wasteful as most tagging secrets are not used in each tx.
281
- await syncSenderTaggingIndexes(secret, this.contractAddress, this.aztecNode, this.senderTaggingStore);
282
-
283
- const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret);
269
+ await syncSenderTaggingIndexes(
270
+ secret,
271
+ this.contractAddress,
272
+ this.aztecNode,
273
+ this.senderTaggingStore,
274
+ await this.anchorBlockHeader.hash(),
275
+ this.jobId,
276
+ );
277
+
278
+ const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret, this.jobId);
284
279
  // If lastUsedIndex is undefined, we've never used this secret, so start from 0
285
280
  // Otherwise, the next index to use is one past the last used index
286
281
  return lastUsedIndex === undefined ? 0 : lastUsedIndex + 1;
@@ -369,7 +364,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
369
364
 
370
365
  const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
371
366
 
372
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
367
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
373
368
  const dbNotes = await noteService.getNotes(
374
369
  this.callContext.contractAddress,
375
370
  owner,
@@ -399,23 +394,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
399
394
  .join(', ')}`,
400
395
  );
401
396
 
402
- const noteHashesAndIndexes = await Promise.all(
403
- notes.map(async n => {
404
- if (n.index !== undefined) {
405
- const siloedNoteHash = await siloNoteHash(n.contractAddress, n.noteHash);
406
- const uniqueNoteHash = await computeUniqueNoteHash(n.noteNonce, siloedNoteHash);
407
-
408
- return { hash: uniqueNoteHash, index: n.index };
409
- }
410
- }),
411
- );
412
-
413
- noteHashesAndIndexes
414
- .filter(n => n !== undefined)
415
- .forEach(n => {
416
- this.noteHashLeafIndexMap.set(n!.hash.toBigInt(), n!.index);
417
- });
418
-
419
397
  return notes;
420
398
  }
421
399
 
@@ -458,6 +436,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
458
436
  note,
459
437
  siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
460
438
  noteHash,
439
+ isPending: true, // This note has just been created and hence is not settled yet.
461
440
  },
462
441
  counter,
463
442
  );
@@ -492,6 +471,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
492
471
  return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
493
472
  }
494
473
 
474
+ /**
475
+ * Check if a nullifier has been emitted in the same transaction, i.e. if privateNotifyCreatedNullifier has been
476
+ * called for this inner nullifier from the contract with the specified address.
477
+ * @param innerNullifier - The inner nullifier to check.
478
+ * @param contractAddress - Address of the contract that emitted the nullifier.
479
+ * @returns A boolean indicating whether the nullifier is pending or not.
480
+ */
481
+ public async privateIsNullifierPending(innerNullifier: Fr, contractAddress: AztecAddress): Promise<boolean> {
482
+ const siloedNullifier = await siloNullifier(contractAddress, innerNullifier);
483
+ const isNullifierPending = this.noteCache.getNullifiers(contractAddress).has(siloedNullifier.toBigInt());
484
+ return Promise.resolve(isNullifierPending);
485
+ }
486
+
495
487
  /**
496
488
  * Emit a contract class log.
497
489
  * This fn exists because we only carry a poseidon hash through the kernels, and need to
@@ -548,7 +540,14 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
548
540
 
549
541
  isStaticCall = isStaticCall || this.callContext.isStaticCall;
550
542
 
551
- await verifyCurrentClassId(targetContractAddress, this.aztecNode, this.contractStore, this.anchorBlockHeader);
543
+ await ensureContractSynced(
544
+ targetContractAddress,
545
+ functionSelector,
546
+ this.utilityExecutor,
547
+ this.aztecNode,
548
+ this.contractStore,
549
+ this.anchorBlockHeader,
550
+ );
552
551
 
553
552
  const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
554
553
  targetContractAddress,
@@ -564,6 +563,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
564
563
  derivedTxContext,
565
564
  derivedCallContext,
566
565
  this.anchorBlockHeader,
566
+ this.utilityExecutor,
567
567
  this.authWitnesses,
568
568
  this.capsules,
569
569
  this.executionCache,
@@ -580,6 +580,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
580
580
  this.senderAddressBookStore,
581
581
  this.capsuleStore,
582
582
  this.privateEventStore,
583
+ this.jobId,
583
584
  this.totalPublicCalldataCount,
584
585
  sideEffectCounter,
585
586
  this.log,