@aztec/pxe 0.0.1-commit.96bb3f7 → 0.0.1-commit.9d2bcf6d

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 (226) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +66 -21
  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/benchmarked_node.d.ts +9 -0
  9. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  10. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  11. package/dest/contract_function_simulator/contract_function_simulator.d.ts +6 -10
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/contract_function_simulator.js +33 -25
  14. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  16. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  17. package/dest/contract_function_simulator/index.d.ts +2 -2
  18. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/index.js +1 -1
  20. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
  22. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  23. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  24. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  25. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  27. package/dest/contract_function_simulator/oracle/interfaces.d.ts +16 -12
  28. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  29. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  30. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  32. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  34. package/dest/contract_function_simulator/oracle/oracle.d.ts +11 -9
  35. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/oracle/oracle.js +64 -41
  37. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  38. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  39. package/dest/contract_function_simulator/oracle/private_execution.js +0 -35
  40. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -3
  41. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +23 -11
  43. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +36 -24
  44. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +75 -82
  46. package/dest/contract_sync/index.d.ts +24 -0
  47. package/dest/contract_sync/index.d.ts.map +1 -0
  48. package/dest/contract_sync/index.js +61 -0
  49. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  50. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  51. package/dest/debug/pxe_debug_utils.js +20 -10
  52. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  53. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  54. package/dest/entrypoints/client/bundle/utils.js +12 -6
  55. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  56. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  57. package/dest/entrypoints/client/lazy/utils.js +13 -7
  58. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  59. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  60. package/dest/entrypoints/server/index.d.ts +3 -1
  61. package/dest/entrypoints/server/index.d.ts.map +1 -1
  62. package/dest/entrypoints/server/index.js +2 -0
  63. package/dest/entrypoints/server/utils.d.ts +1 -1
  64. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  65. package/dest/entrypoints/server/utils.js +19 -8
  66. package/dest/events/event_service.d.ts +6 -6
  67. package/dest/events/event_service.d.ts.map +1 -1
  68. package/dest/events/event_service.js +19 -22
  69. package/dest/events/private_event_filter_validator.d.ts +5 -5
  70. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  71. package/dest/events/private_event_filter_validator.js +5 -6
  72. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  73. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  74. package/dest/job_coordinator/job_coordinator.js +3 -2
  75. package/dest/logs/log_service.d.ts +7 -5
  76. package/dest/logs/log_service.d.ts.map +1 -1
  77. package/dest/logs/log_service.js +23 -20
  78. package/dest/notes/note_service.d.ts +7 -7
  79. package/dest/notes/note_service.d.ts.map +1 -1
  80. package/dest/notes/note_service.js +31 -36
  81. package/dest/oracle_version.d.ts +3 -3
  82. package/dest/oracle_version.d.ts.map +1 -1
  83. package/dest/oracle_version.js +4 -3
  84. package/dest/private_kernel/hints/index.d.ts +2 -2
  85. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  86. package/dest/private_kernel/hints/index.js +1 -1
  87. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  88. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  89. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +12 -6
  90. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  91. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  92. package/dest/private_kernel/private_kernel_execution_prover.js +3 -3
  93. package/dest/private_kernel/private_kernel_oracle.d.ts +23 -28
  94. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  95. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  96. package/dest/pxe.d.ts +7 -36
  97. package/dest/pxe.d.ts.map +1 -1
  98. package/dest/pxe.js +43 -83
  99. package/dest/storage/address_store/address_store.d.ts +1 -1
  100. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  101. package/dest/storage/address_store/address_store.js +12 -11
  102. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  103. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  104. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  105. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  106. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  107. package/dest/storage/capsule_store/capsule_store.js +130 -23
  108. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  109. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  110. package/dest/storage/contract_store/contract_store.js +22 -25
  111. package/dest/storage/metadata.d.ts +1 -1
  112. package/dest/storage/metadata.js +1 -1
  113. package/dest/storage/note_store/note_store.d.ts +51 -52
  114. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  115. package/dest/storage/note_store/note_store.js +282 -263
  116. package/dest/storage/note_store/stored_note.d.ts +16 -0
  117. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  118. package/dest/storage/note_store/stored_note.js +43 -0
  119. package/dest/storage/private_event_store/private_event_store.d.ts +43 -8
  120. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  121. package/dest/storage/private_event_store/private_event_store.js +226 -111
  122. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  123. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  124. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  125. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  126. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  127. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  128. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  129. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  130. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  131. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  132. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  133. package/dest/storage/tagging_store/sender_tagging_store.js +252 -100
  134. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  135. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  136. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  137. package/dest/tagging/index.d.ts +2 -1
  138. package/dest/tagging/index.d.ts.map +1 -1
  139. package/dest/tagging/index.js +1 -0
  140. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  141. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  142. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +6 -6
  143. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  144. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  145. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  146. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  147. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  148. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +7 -7
  149. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  150. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  151. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  152. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  153. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  154. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  155. package/package.json +18 -18
  156. package/src/bin/check_oracle_version.ts +1 -0
  157. package/src/block_synchronizer/block_synchronizer.ts +85 -33
  158. package/src/config/index.ts +14 -0
  159. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  160. package/src/contract_function_simulator/contract_function_simulator.ts +34 -28
  161. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  162. package/src/contract_function_simulator/index.ts +1 -1
  163. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  164. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  165. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  166. package/src/contract_function_simulator/oracle/interfaces.ts +21 -11
  167. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  168. package/src/contract_function_simulator/oracle/oracle.ts +76 -44
  169. package/src/contract_function_simulator/oracle/private_execution.ts +1 -67
  170. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +38 -13
  171. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +97 -89
  172. package/src/contract_sync/index.ts +119 -0
  173. package/src/debug/pxe_debug_utils.ts +26 -11
  174. package/src/entrypoints/client/bundle/utils.ts +7 -14
  175. package/src/entrypoints/client/lazy/utils.ts +8 -14
  176. package/src/entrypoints/pxe_creation_options.ts +2 -1
  177. package/src/entrypoints/server/index.ts +2 -0
  178. package/src/entrypoints/server/utils.ts +15 -19
  179. package/src/events/event_service.ts +17 -25
  180. package/src/events/private_event_filter_validator.ts +3 -5
  181. package/src/job_coordinator/job_coordinator.ts +4 -3
  182. package/src/logs/log_service.ts +34 -16
  183. package/src/notes/note_service.ts +38 -43
  184. package/src/oracle_version.ts +4 -3
  185. package/src/private_kernel/hints/index.ts +1 -1
  186. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +32 -20
  187. package/src/private_kernel/private_kernel_execution_prover.ts +7 -4
  188. package/src/private_kernel/private_kernel_oracle.ts +116 -37
  189. package/src/pxe.ts +83 -118
  190. package/src/storage/address_store/address_store.ts +15 -15
  191. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  192. package/src/storage/capsule_store/capsule_store.ts +159 -23
  193. package/src/storage/contract_store/contract_store.ts +22 -31
  194. package/src/storage/metadata.ts +1 -1
  195. package/src/storage/note_store/note_store.ts +317 -318
  196. package/src/storage/note_store/stored_note.ts +48 -0
  197. package/src/storage/private_event_store/private_event_store.ts +292 -124
  198. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  199. package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
  200. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  201. package/src/storage/tagging_store/sender_tagging_store.ts +293 -108
  202. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  203. package/src/tagging/index.ts +1 -0
  204. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +16 -5
  205. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  206. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +9 -6
  207. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  208. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  209. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  210. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  211. package/dest/contract_function_simulator/proxied_node.js +0 -27
  212. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  213. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  214. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  215. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  216. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
  217. package/dest/public_storage/public_storage_service.d.ts +0 -24
  218. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  219. package/dest/public_storage/public_storage_service.js +0 -26
  220. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  221. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  222. package/dest/tree_membership/tree_membership_service.js +0 -84
  223. package/src/contract_function_simulator/proxied_node.ts +0 -33
  224. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
  225. package/src/public_storage/public_storage_service.ts +0 -33
  226. 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,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);
146
+
147
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(
148
+ parsedAnchorBlockHash,
149
+ parsedNoteHash,
150
+ );
151
+ if (!witness) {
152
+ throw new Error(
153
+ `Note hash ${noteHash} not found in the note hash tree at anchor block hash ${parsedAnchorBlockHash.toString()}.`,
154
+ );
155
+ }
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);
148
165
 
149
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(
150
- BlockNumber(parsedBlockNumber),
151
- parsedTreeId,
152
- parsedLeafValue,
166
+ const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(
167
+ parsedAnchorBlockHash,
168
+ parsedBlockHash,
153
169
  );
154
170
  if (!witness) {
155
171
  throw new Error(
156
- `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
172
+ `Block hash ${parsedBlockHash.toString()} not found in the archive tree at anchor block ${parsedAnchorBlockHash.toString()}.`,
157
173
  );
158
174
  }
159
- return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
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
  }
@@ -231,12 +248,19 @@ export class Oracle {
231
248
  return [witness.map(toACVMField)];
232
249
  }
233
250
 
234
- async utilityGetPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[][]> {
251
+ async utilityTryGetPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
235
252
  const parsedAddress = AztecAddress.fromField(Fr.fromString(address));
236
- const { publicKeys, partialAddress } =
237
- await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(parsedAddress);
253
+ const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(parsedAddress);
238
254
 
239
- return [[...publicKeys.toFields(), partialAddress].map(toACVMField)];
255
+ // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
256
+ // with two fields: `some` (a boolean) and `value` (a field array in this case).
257
+ if (result === undefined) {
258
+ // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
259
+ return [toACVMField(0), Array(13).fill(toACVMField(0))];
260
+ } else {
261
+ // Data was found so we set `some` to 1 and return it along with `value`.
262
+ return [toACVMField(1), [...result.publicKeys.toFields(), result.partialAddress].map(toACVMField)];
263
+ }
240
264
  }
241
265
 
242
266
  async utilityGetNotes(
@@ -257,7 +281,7 @@ export class Oracle {
257
281
  [offset]: ACVMField[],
258
282
  [status]: ACVMField[],
259
283
  [maxNotes]: ACVMField[],
260
- [packedRetrievedNoteLength]: ACVMField[],
284
+ [packedHintedNoteLength]: ACVMField[],
261
285
  ): Promise<(ACVMField | ACVMField[])[]> {
262
286
  // Parse Option<AztecAddress>: ownerSome is 0 for None, 1 for Some
263
287
  const owner = Fr.fromString(ownerSome).toNumber() === 1 ? AztecAddress.fromString(ownerValue) : undefined;
@@ -279,25 +303,25 @@ export class Oracle {
279
303
  +status,
280
304
  );
281
305
 
282
- const returnDataAsArrayOfPackedRetrievedNotes = noteDatas.map(noteData =>
283
- packAsRetrievedNote({
306
+ const returnDataAsArrayOfPackedHintedNotes = noteDatas.map(noteData =>
307
+ packAsHintedNote({
284
308
  contractAddress: noteData.contractAddress,
285
309
  owner: noteData.owner,
286
310
  randomness: noteData.randomness,
287
311
  storageSlot: noteData.storageSlot,
288
312
  noteNonce: noteData.noteNonce,
289
- index: noteData.index,
313
+ isPending: noteData.isPending,
290
314
  note: noteData.note,
291
315
  }),
292
316
  );
293
317
 
294
318
  // Now we convert each sub-array to an array of ACVMField
295
- const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedRetrievedNotes.map(subArray =>
319
+ const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedHintedNotes.map(subArray =>
296
320
  subArray.map(toACVMField),
297
321
  );
298
322
 
299
323
  // At last we convert the array of arrays to a bounded vec of arrays
300
- return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedRetrievedNoteLength);
324
+ return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedHintedNoteLength);
301
325
  }
302
326
 
303
327
  privateNotifyCreatedNote(
@@ -339,6 +363,14 @@ export class Oracle {
339
363
  return [];
340
364
  }
341
365
 
366
+ async privateIsNullifierPending([innerNullifier]: ACVMField[], [contractAddress]: ACVMField[]): Promise<ACVMField[]> {
367
+ const isPending = await this.handlerAsPrivate().privateIsNullifierPending(
368
+ Fr.fromString(innerNullifier),
369
+ AztecAddress.fromString(contractAddress),
370
+ );
371
+ return [toACVMField(isPending)];
372
+ }
373
+
342
374
  async utilityCheckNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
343
375
  const exists = await this.handlerAsUtility().utilityCheckNullifierExists(Fr.fromString(innerNullifier));
344
376
  return [toACVMField(exists)];
@@ -358,15 +390,15 @@ export class Oracle {
358
390
  }
359
391
 
360
392
  async utilityStorageRead(
393
+ [blockHash]: ACVMField[],
361
394
  [contractAddress]: ACVMField[],
362
395
  [startStorageSlot]: ACVMField[],
363
- [blockNumber]: ACVMField[],
364
396
  [numberOfElements]: ACVMField[],
365
397
  ): Promise<ACVMField[][]> {
366
398
  const values = await this.handlerAsUtility().utilityStorageRead(
399
+ BlockHash.fromString(blockHash),
367
400
  new AztecAddress(Fr.fromString(contractAddress)),
368
401
  Fr.fromString(startStorageSlot),
369
- BlockNumber(+blockNumber),
370
402
  +numberOfElements,
371
403
  );
372
404
  return [values.map(toACVMField)];
@@ -476,12 +508,12 @@ export class Oracle {
476
508
  return [];
477
509
  }
478
510
 
479
- async utilityValidateEnqueuedNotesAndEvents(
511
+ async utilityValidateAndStoreEnqueuedNotesAndEvents(
480
512
  [contractAddress]: ACVMField[],
481
513
  [noteValidationRequestsArrayBaseSlot]: ACVMField[],
482
514
  [eventValidationRequestsArrayBaseSlot]: ACVMField[],
483
515
  ): Promise<ACVMField[]> {
484
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
516
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
485
517
  AztecAddress.fromString(contractAddress),
486
518
  Fr.fromString(noteValidationRequestsArrayBaseSlot),
487
519
  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
 
@@ -146,62 +139,3 @@ export function extractPrivateCircuitPublicInputs(
146
139
  }
147
140
  return PrivateCircuitPublicInputs.fromFields(returnData);
148
141
  }
149
-
150
- /**
151
- * Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
152
- * from the instance is used.
153
- * @param contractAddress - The address of the contract to read the class id for.
154
- * @param instance - The instance of the contract.
155
- * @param executionStore - The execution data provider.
156
- * @param blockNumber - The block number at which to load the DelayedPublicMutable storing the class id.
157
- * @param timestamp - The timestamp at which to obtain the class id from the DelayedPublicMutable.
158
- * @returns The current class id.
159
- */
160
- export async function readCurrentClassId(
161
- contractAddress: AztecAddress,
162
- instance: ContractInstance,
163
- aztecNode: AztecNode,
164
- blockNumber: BlockNumber,
165
- timestamp: UInt64,
166
- ) {
167
- const { delayedPublicMutableSlot } = await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
168
- const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, slot =>
169
- aztecNode.getPublicStorageAt(blockNumber, 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. If not provided, the anchor block
182
- * header of the execution data provider is used.
183
- */
184
- export async function verifyCurrentClassId(
185
- contractAddress: AztecAddress,
186
- aztecNode: AztecNode,
187
- contractStore: ContractStore,
188
- header: BlockHeader,
189
- ) {
190
- const instance = await contractStore.getContractInstance(contractAddress);
191
- if (!instance) {
192
- throw new Error(`No contract instance found for address ${contractAddress.toString()}`);
193
- }
194
-
195
- const currentClassId = await readCurrentClassId(
196
- contractAddress,
197
- instance,
198
- aztecNode,
199
- header.globalVariables.blockNumber,
200
- header.globalVariables.timestamp,
201
- );
202
- if (!instance.currentContractClassId.equals(currentClassId)) {
203
- throw new Error(
204
- `Contract ${contractAddress} is outdated, current class id is ${currentClassId}, local class id is ${instance.currentContractClassId}`,
205
- );
206
- }
207
- }
@@ -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,
@@ -244,7 +242,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
244
242
  sender: AztecAddress,
245
243
  recipient: AztecAddress,
246
244
  ) {
247
- const senderCompleteAddress = await this.getCompleteAddress(sender);
245
+ const senderCompleteAddress = await this.getCompleteAddressOrFail(sender);
248
246
  const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
249
247
  return DirectionalAppTaggingSecret.compute(
250
248
  senderCompleteAddress,
@@ -265,9 +263,16 @@ 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);
269
-
270
- 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);
271
276
  // If lastUsedIndex is undefined, we've never used this secret, so start from 0
272
277
  // Otherwise, the next index to use is one past the last used index
273
278
  return lastUsedIndex === undefined ? 0 : lastUsedIndex + 1;
@@ -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,
@@ -428,6 +433,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
428
433
  note,
429
434
  siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
430
435
  noteHash,
436
+ isPending: true, // This note has just been created and hence is not settled yet.
431
437
  },
432
438
  counter,
433
439
  );
@@ -462,6 +468,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
462
468
  return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
463
469
  }
464
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
+
465
484
  /**
466
485
  * Emit a contract class log.
467
486
  * This fn exists because we only carry a poseidon hash through the kernels, and need to
@@ -518,9 +537,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
518
537
 
519
538
  isStaticCall = isStaticCall || this.callContext.isStaticCall;
520
539
 
521
- await verifyCurrentClassId(targetContractAddress, this.aztecNode, this.contractStore, this.anchorBlockHeader);
522
-
523
- 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.noteStore,
547
+ this.anchorBlockHeader,
548
+ this.jobId,
549
+ );
524
550
 
525
551
  const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
526
552
  targetContractAddress,
@@ -547,7 +573,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
547
573
  this.keyStore,
548
574
  this.addressStore,
549
575
  this.aztecNode,
550
- this.anchorBlockStore,
551
576
  this.senderTaggingStore,
552
577
  this.recipientTaggingStore,
553
578
  this.senderAddressBookStore,