@aztec/pxe 0.0.1-commit.7d4e6cd → 0.0.1-commit.858058eac

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 (230) 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 +72 -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 +53 -33
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/contract_function_simulator.js +95 -51
  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 +17 -13
  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 +12 -10
  35. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/oracle/oracle.js +67 -44
  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 +43 -35
  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 +82 -25
  43. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +65 -33
  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 +126 -109
  46. package/dest/contract_sync/contract_sync_service.d.ts +41 -0
  47. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  48. package/dest/contract_sync/contract_sync_service.js +82 -0
  49. package/dest/contract_sync/helpers.d.ts +28 -0
  50. package/dest/contract_sync/helpers.d.ts.map +1 -0
  51. package/dest/contract_sync/helpers.js +55 -0
  52. package/dest/debug/pxe_debug_utils.d.ts +22 -9
  53. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  54. package/dest/debug/pxe_debug_utils.js +28 -17
  55. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  56. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  57. package/dest/entrypoints/client/bundle/utils.js +21 -7
  58. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  59. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  60. package/dest/entrypoints/client/lazy/utils.js +22 -8
  61. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  62. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  63. package/dest/entrypoints/server/index.d.ts +3 -1
  64. package/dest/entrypoints/server/index.d.ts.map +1 -1
  65. package/dest/entrypoints/server/index.js +2 -0
  66. package/dest/entrypoints/server/utils.d.ts +1 -1
  67. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  68. package/dest/entrypoints/server/utils.js +28 -9
  69. package/dest/events/event_service.d.ts +6 -6
  70. package/dest/events/event_service.d.ts.map +1 -1
  71. package/dest/events/event_service.js +19 -22
  72. package/dest/events/private_event_filter_validator.d.ts +5 -5
  73. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  74. package/dest/events/private_event_filter_validator.js +5 -6
  75. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  76. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  77. package/dest/job_coordinator/job_coordinator.js +3 -2
  78. package/dest/logs/log_service.d.ts +7 -5
  79. package/dest/logs/log_service.d.ts.map +1 -1
  80. package/dest/logs/log_service.js +23 -20
  81. package/dest/notes/note_service.d.ts +7 -7
  82. package/dest/notes/note_service.d.ts.map +1 -1
  83. package/dest/notes/note_service.js +31 -36
  84. package/dest/oracle_version.d.ts +3 -3
  85. package/dest/oracle_version.d.ts.map +1 -1
  86. package/dest/oracle_version.js +4 -3
  87. package/dest/private_kernel/hints/index.d.ts +2 -2
  88. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  89. package/dest/private_kernel/hints/index.js +1 -1
  90. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  91. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  92. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +12 -6
  93. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  94. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  95. package/dest/private_kernel/private_kernel_execution_prover.js +3 -3
  96. package/dest/private_kernel/private_kernel_oracle.d.ts +23 -28
  97. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  98. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  99. package/dest/pxe.d.ts +70 -57
  100. package/dest/pxe.d.ts.map +1 -1
  101. package/dest/pxe.js +96 -111
  102. package/dest/storage/address_store/address_store.d.ts +1 -1
  103. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  104. package/dest/storage/address_store/address_store.js +12 -11
  105. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  106. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  107. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  108. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  109. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  110. package/dest/storage/capsule_store/capsule_store.js +130 -23
  111. package/dest/storage/contract_store/contract_store.d.ts +1 -2
  112. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  113. package/dest/storage/contract_store/contract_store.js +27 -30
  114. package/dest/storage/metadata.d.ts +1 -1
  115. package/dest/storage/metadata.js +1 -1
  116. package/dest/storage/note_store/note_store.d.ts +51 -52
  117. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  118. package/dest/storage/note_store/note_store.js +285 -263
  119. package/dest/storage/note_store/stored_note.d.ts +16 -0
  120. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  121. package/dest/storage/note_store/stored_note.js +43 -0
  122. package/dest/storage/private_event_store/private_event_store.d.ts +43 -8
  123. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  124. package/dest/storage/private_event_store/private_event_store.js +226 -111
  125. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  126. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  127. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  128. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  129. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  130. package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
  131. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  132. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  133. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  134. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  135. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  136. package/dest/storage/tagging_store/sender_tagging_store.js +252 -100
  137. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  138. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  139. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  140. package/dest/tagging/index.d.ts +2 -1
  141. package/dest/tagging/index.d.ts.map +1 -1
  142. package/dest/tagging/index.js +1 -0
  143. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  144. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  145. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +6 -6
  146. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  147. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  148. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  149. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  150. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  151. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +7 -7
  152. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  153. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  154. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  155. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  156. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  157. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  158. package/package.json +27 -18
  159. package/src/bin/check_oracle_version.ts +1 -0
  160. package/src/block_synchronizer/block_synchronizer.ts +91 -33
  161. package/src/config/index.ts +14 -0
  162. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  163. package/src/contract_function_simulator/contract_function_simulator.ts +143 -99
  164. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  165. package/src/contract_function_simulator/index.ts +1 -1
  166. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
  167. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  168. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  169. package/src/contract_function_simulator/oracle/interfaces.ts +22 -12
  170. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  171. package/src/contract_function_simulator/oracle/oracle.ts +79 -47
  172. package/src/contract_function_simulator/oracle/private_execution.ts +1 -67
  173. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +116 -104
  174. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +190 -116
  175. package/src/contract_sync/contract_sync_service.ts +129 -0
  176. package/src/contract_sync/helpers.ts +93 -0
  177. package/src/debug/pxe_debug_utils.ts +60 -17
  178. package/src/entrypoints/client/bundle/utils.ts +16 -15
  179. package/src/entrypoints/client/lazy/utils.ts +17 -15
  180. package/src/entrypoints/pxe_creation_options.ts +2 -1
  181. package/src/entrypoints/server/index.ts +2 -0
  182. package/src/entrypoints/server/utils.ts +22 -26
  183. package/src/events/event_service.ts +17 -25
  184. package/src/events/private_event_filter_validator.ts +3 -5
  185. package/src/job_coordinator/job_coordinator.ts +4 -3
  186. package/src/logs/log_service.ts +34 -16
  187. package/src/notes/note_service.ts +38 -43
  188. package/src/oracle_version.ts +4 -3
  189. package/src/private_kernel/hints/index.ts +1 -1
  190. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +32 -20
  191. package/src/private_kernel/private_kernel_execution_prover.ts +7 -4
  192. package/src/private_kernel/private_kernel_oracle.ts +116 -37
  193. package/src/pxe.ts +191 -173
  194. package/src/storage/address_store/address_store.ts +15 -15
  195. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  196. package/src/storage/capsule_store/capsule_store.ts +159 -23
  197. package/src/storage/contract_store/contract_store.ts +26 -35
  198. package/src/storage/metadata.ts +1 -1
  199. package/src/storage/note_store/note_store.ts +321 -318
  200. package/src/storage/note_store/stored_note.ts +48 -0
  201. package/src/storage/private_event_store/private_event_store.ts +292 -124
  202. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  203. package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
  204. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  205. package/src/storage/tagging_store/sender_tagging_store.ts +293 -108
  206. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  207. package/src/tagging/index.ts +1 -0
  208. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +16 -5
  209. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  210. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +9 -6
  211. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  212. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  213. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  214. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  215. package/dest/contract_function_simulator/proxied_node.js +0 -27
  216. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  217. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  218. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  219. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  220. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
  221. package/dest/public_storage/public_storage_service.d.ts +0 -24
  222. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  223. package/dest/public_storage/public_storage_service.js +0 -26
  224. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  225. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  226. package/dest/tree_membership/tree_membership_service.js +0 -84
  227. package/src/contract_function_simulator/proxied_node.ts +0 -33
  228. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
  229. package/src/public_storage/public_storage_service.ts +0 -33
  230. package/src/tree_membership/tree_membership_service.ts +0 -112
@@ -1,17 +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
- import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
6
+ import { LogLevels, type Logger, 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';
11
+ import { BlockHash } from '@aztec/stdlib/block';
9
12
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
10
13
  import { siloNullifier } from '@aztec/stdlib/hash';
11
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
12
15
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
13
16
  import { computeAddressSecret } from '@aztec/stdlib/keys';
14
17
  import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
18
+ import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
15
19
  import type { NoteStatus } from '@aztec/stdlib/note';
16
20
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
17
21
  import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
@@ -20,16 +24,13 @@ import { EventService } from '../../events/event_service.js';
20
24
  import { LogService } from '../../logs/log_service.js';
21
25
  import { NoteService } from '../../notes/note_service.js';
22
26
  import { ORACLE_VERSION } from '../../oracle_version.js';
23
- import { PublicStorageService } from '../../public_storage/public_storage_service.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';
@@ -39,6 +40,27 @@ import { pickNotes } from '../pick_notes.js';
39
40
  import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
40
41
  import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
41
42
 
43
+ /** Args for UtilityExecutionOracle constructor. */
44
+ export type UtilityExecutionOracleArgs = {
45
+ contractAddress: AztecAddress;
46
+ /** List of transient auth witnesses to be used during this simulation */
47
+ authWitnesses: AuthWitness[];
48
+ capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
49
+ anchorBlockHeader: BlockHeader;
50
+ contractStore: ContractStore;
51
+ noteStore: NoteStore;
52
+ keyStore: KeyStore;
53
+ addressStore: AddressStore;
54
+ aztecNode: AztecNode;
55
+ recipientTaggingStore: RecipientTaggingStore;
56
+ senderAddressBookStore: SenderAddressBookStore;
57
+ capsuleStore: CapsuleStore;
58
+ privateEventStore: PrivateEventStore;
59
+ jobId: string;
60
+ log?: ReturnType<typeof createLogger>;
61
+ scopes?: AztecAddress[];
62
+ };
63
+
42
64
  /**
43
65
  * The oracle for an execution of utility contract functions.
44
66
  */
@@ -46,28 +68,43 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
46
68
  isMisc = true as const;
47
69
  isUtility = true as const;
48
70
 
49
- private aztecNrDebugLog = createLogger('aztec-nr:debug_log');
50
-
51
- constructor(
52
- protected readonly contractAddress: AztecAddress,
53
- /** List of transient auth witnesses to be used during this simulation */
54
- protected readonly authWitnesses: AuthWitness[],
55
- protected readonly capsules: Capsule[], // TODO(#12425): Rename to transientCapsules
56
- protected readonly anchorBlockHeader: BlockHeader,
57
- protected readonly contractStore: ContractStore,
58
- protected readonly noteStore: NoteStore,
59
- protected readonly keyStore: KeyStore,
60
- protected readonly addressStore: AddressStore,
61
- protected readonly aztecNode: AztecNode,
62
- protected readonly anchorBlockStore: AnchorBlockStore,
63
- protected readonly recipientTaggingStore: RecipientTaggingStore,
64
- protected readonly senderAddressBookStore: SenderAddressBookStore,
65
- protected readonly capsuleStore: CapsuleStore,
66
- protected readonly privateEventStore: PrivateEventStore,
67
- protected readonly jobId: string,
68
- protected log = createLogger('simulator:client_view_context'),
69
- protected readonly scopes?: AztecAddress[],
70
- ) {}
71
+ private contractLogger: Logger | undefined;
72
+
73
+ protected readonly contractAddress: AztecAddress;
74
+ protected readonly authWitnesses: AuthWitness[];
75
+ protected readonly capsules: Capsule[];
76
+ protected readonly anchorBlockHeader: BlockHeader;
77
+ protected readonly contractStore: ContractStore;
78
+ protected readonly noteStore: NoteStore;
79
+ protected readonly keyStore: KeyStore;
80
+ protected readonly addressStore: AddressStore;
81
+ protected readonly aztecNode: AztecNode;
82
+ protected readonly recipientTaggingStore: RecipientTaggingStore;
83
+ protected readonly senderAddressBookStore: SenderAddressBookStore;
84
+ protected readonly capsuleStore: CapsuleStore;
85
+ protected readonly privateEventStore: PrivateEventStore;
86
+ protected readonly jobId: string;
87
+ protected log: ReturnType<typeof createLogger>;
88
+ protected readonly scopes?: AztecAddress[];
89
+
90
+ constructor(args: UtilityExecutionOracleArgs) {
91
+ this.contractAddress = args.contractAddress;
92
+ this.authWitnesses = args.authWitnesses;
93
+ this.capsules = args.capsules;
94
+ this.anchorBlockHeader = args.anchorBlockHeader;
95
+ this.contractStore = args.contractStore;
96
+ this.noteStore = args.noteStore;
97
+ this.keyStore = args.keyStore;
98
+ this.addressStore = args.addressStore;
99
+ this.aztecNode = args.aztecNode;
100
+ this.recipientTaggingStore = args.recipientTaggingStore;
101
+ this.senderAddressBookStore = args.senderAddressBookStore;
102
+ this.capsuleStore = args.capsuleStore;
103
+ this.privateEventStore = args.privateEventStore;
104
+ this.jobId = args.jobId;
105
+ this.log = args.log ?? createLogger('simulator:client_view_context');
106
+ this.scopes = args.scopes;
107
+ }
71
108
 
72
109
  public utilityAssertCompatibleOracleVersion(version: number): void {
73
110
  if (version !== ORACLE_VERSION) {
@@ -80,13 +117,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
80
117
  }
81
118
 
82
119
  public utilityGetUtilityContext(): UtilityContext {
83
- return UtilityContext.from({
84
- blockNumber: this.anchorBlockHeader.globalVariables.blockNumber,
85
- timestamp: this.anchorBlockHeader.globalVariables.timestamp,
86
- contractAddress: this.contractAddress,
87
- version: this.anchorBlockHeader.globalVariables.version,
88
- chainId: this.anchorBlockHeader.globalVariables.chainId,
89
- });
120
+ return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
90
121
  }
91
122
 
92
123
  /**
@@ -94,65 +125,88 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
94
125
  * @param pkMHash - The master public key hash.
95
126
  * @returns A Promise that resolves to nullifier keys.
96
127
  * @throws If the keys are not registered in the key store.
128
+ * @throws If scopes are defined and the account is not in the scopes.
97
129
  */
98
- public utilityGetKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
130
+ public async utilityGetKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
131
+ // If scopes are defined, check that the key belongs to an account in the scopes
132
+ if (this.scopes && this.scopes.length > 0) {
133
+ const [, account] = await this.keyStore.getKeyPrefixAndAccount(pkMHash);
134
+ if (!this.scopes.some(scope => scope.equals(account))) {
135
+ throw new Error(`Key validation request denied: account ${account.toString()} is not in the allowed scopes.`);
136
+ }
137
+ }
99
138
  return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
100
139
  }
101
140
 
102
141
  /**
103
- * Fetches the index and sibling path of a leaf at a given block from a given tree.
104
- * @param blockNumber - The block number at which to get the membership witness.
105
- * @param treeId - Id of the tree to get the sibling path from.
106
- * @param leafValue - The leaf value
107
- * @returns The index and sibling path concatenated [index, sibling_path]
142
+ * Fetches the index and sibling path of a leaf at a given block from the note hash tree.
143
+ * @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
144
+ * witness.
145
+ * @param noteHash - The note hash to find in the note hash tree.
146
+ * @returns The membership witness containing the leaf index and sibling path
108
147
  */
109
- public utilityGetMembershipWitness(blockNumber: BlockNumber, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[]> {
110
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
111
- return treeMembershipService.getMembershipWitness(blockNumber, treeId, leafValue);
148
+ public utilityGetNoteHashMembershipWitness(
149
+ anchorBlockHash: BlockHash,
150
+ noteHash: Fr,
151
+ ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
152
+ return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
153
+ }
154
+
155
+ /**
156
+ * Fetches the index and sibling path of a block hash in the archive tree.
157
+ *
158
+ * Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
159
+ * its block hash is appended as a new leaf to the archive tree.
160
+ *
161
+ * @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
162
+ * witness.
163
+ * @param blockHash - The block hash to find in the archive tree.
164
+ * @returns The membership witness containing the leaf index and sibling path
165
+ */
166
+ public utilityGetBlockHashMembershipWitness(
167
+ anchorBlockHash: BlockHash,
168
+ blockHash: BlockHash,
169
+ ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
170
+ return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
112
171
  }
113
172
 
114
173
  /**
115
174
  * Returns a nullifier membership witness for a given nullifier at a given block.
116
- * @param blockNumber - The block number at which to get the index.
175
+ * @param blockHash - The block hash at which to get the index.
117
176
  * @param nullifier - Nullifier we try to find witness for.
118
177
  * @returns The nullifier membership witness (if found).
119
178
  */
120
- public async utilityGetNullifierMembershipWitness(
121
- blockNumber: BlockNumber,
179
+ public utilityGetNullifierMembershipWitness(
180
+ blockHash: BlockHash,
122
181
  nullifier: Fr,
123
182
  ): Promise<NullifierMembershipWitness | undefined> {
124
- return await this.aztecNode.getNullifierMembershipWitness(blockNumber, nullifier);
183
+ return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
125
184
  }
126
185
 
127
186
  /**
128
187
  * Returns a low nullifier membership witness for a given nullifier at a given block.
129
- * @param blockNumber - The block number at which to get the index.
188
+ * @param blockHash - The block hash at which to get the index.
130
189
  * @param nullifier - Nullifier we try to find the low nullifier witness for.
131
190
  * @returns The low nullifier membership witness (if found).
132
191
  * @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
133
192
  * list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
134
193
  * we are trying to prove non-inclusion for.
135
194
  */
136
- public async utilityGetLowNullifierMembershipWitness(
137
- blockNumber: BlockNumber,
195
+ public utilityGetLowNullifierMembershipWitness(
196
+ blockHash: BlockHash,
138
197
  nullifier: Fr,
139
198
  ): Promise<NullifierMembershipWitness | undefined> {
140
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
141
- return await treeMembershipService.getLowNullifierMembershipWitness(blockNumber, nullifier);
199
+ return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
142
200
  }
143
201
 
144
202
  /**
145
203
  * Returns a public data tree witness for a given leaf slot at a given block.
146
- * @param blockNumber - The block number at which to get the index.
204
+ * @param blockHash - The block hash at which to get the index.
147
205
  * @param leafSlot - The slot of the public data tree to get the witness for.
148
206
  * @returns - The witness
149
207
  */
150
- public async utilityGetPublicDataWitness(
151
- blockNumber: BlockNumber,
152
- leafSlot: Fr,
153
- ): Promise<PublicDataWitness | undefined> {
154
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
155
- return await treeMembershipService.getPublicDataWitness(blockNumber, leafSlot);
208
+ public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
209
+ return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
156
210
  }
157
211
 
158
212
  /**
@@ -161,26 +215,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
161
215
  * @returns Block extracted from a block with block number `blockNumber`.
162
216
  */
163
217
  public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
164
- const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
218
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
165
219
  if (blockNumber > anchorBlockNumber) {
166
220
  throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
167
221
  }
168
222
 
169
223
  const block = await this.aztecNode.getBlock(blockNumber);
170
- return block?.getBlockHeader() || undefined;
224
+ return block?.header;
171
225
  }
172
226
 
173
227
  /**
174
228
  * Retrieve the complete address associated to a given address.
175
229
  * @param account - The account address.
176
- * @returns A complete address associated with the input address.
177
- * @throws An error if the account is not registered in the database.
230
+ * @returns A complete address associated with the input address, or `undefined` if not registered.
178
231
  */
179
- public utilityGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress> {
180
- return this.getCompleteAddress(account);
232
+ public utilityTryGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
233
+ return this.addressStore.getCompleteAddress(account);
181
234
  }
182
235
 
183
- protected async getCompleteAddress(account: AztecAddress): Promise<CompleteAddress> {
236
+ protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
184
237
  const completeAddress = await this.addressStore.getCompleteAddress(account);
185
238
  if (!completeAddress) {
186
239
  throw new Error(
@@ -257,7 +310,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
257
310
  offset: number,
258
311
  status: NoteStatus,
259
312
  ): Promise<NoteData[]> {
260
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
313
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
261
314
 
262
315
  const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
263
316
  return pickNotes<NoteData>(dbNotes, {
@@ -281,10 +334,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
281
334
  * @returns A boolean indicating whether the nullifier exists in the tree or not.
282
335
  */
283
336
  public async utilityCheckNullifierExists(innerNullifier: Fr) {
284
- const nullifier = await siloNullifier(this.contractAddress, innerNullifier!);
285
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
286
- const index = await treeMembershipService.getNullifierIndex(nullifier);
287
- return index !== undefined;
337
+ const [nullifier, anchorBlockHash] = await Promise.all([
338
+ siloNullifier(this.contractAddress, innerNullifier!),
339
+ this.anchorBlockHeader.hash(),
340
+ ]);
341
+ const [leafIndex] = await this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, [
342
+ nullifier,
343
+ ]);
344
+ return leafIndex?.data !== undefined;
288
345
  }
289
346
 
290
347
  /**
@@ -296,70 +353,82 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
296
353
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
297
354
  */
298
355
  public async utilityGetL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
299
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
300
- const [messageIndex, siblingPath] = await treeMembershipService.getL1ToL2MembershipWitness(
356
+ const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
357
+ this.aztecNode,
301
358
  contractAddress,
302
359
  messageHash,
303
360
  secret,
304
361
  );
305
362
 
306
- // Assuming messageIndex is what you intended to use for the index in MessageLoadOracleInputs
307
363
  return new MessageLoadOracleInputs(messageIndex, siblingPath);
308
364
  }
309
365
 
310
366
  /**
311
367
  * Read the public storage data.
368
+ * @param blockHash - The block hash to read storage at.
312
369
  * @param contractAddress - The address to read storage from.
313
370
  * @param startStorageSlot - The starting storage slot.
314
- * @param blockNumber - The block number to read storage at.
315
371
  * @param numberOfElements - Number of elements to read from the starting storage slot.
316
372
  */
317
373
  public async utilityStorageRead(
374
+ blockHash: BlockHash,
318
375
  contractAddress: AztecAddress,
319
376
  startStorageSlot: Fr,
320
- blockNumber: BlockNumber,
321
377
  numberOfElements: number,
322
378
  ) {
323
- const values = [];
324
- const publicStorageService = new PublicStorageService(this.anchorBlockStore, this.aztecNode);
379
+ const slots = Array(numberOfElements)
380
+ .fill(0)
381
+ .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
325
382
 
326
- // TODO: why do we serialize these requests? This should probably a single call
327
- // Privacy considerations?
328
- for (let i = 0n; i < numberOfElements; i++) {
329
- const storageSlot = new Fr(startStorageSlot.value + i);
330
- const value = await publicStorageService.getPublicStorageAt(blockNumber, contractAddress, storageSlot);
383
+ const values = await Promise.all(
384
+ slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
385
+ );
386
+
387
+ this.log.debug(
388
+ `Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
389
+ );
331
390
 
332
- this.log.debug(
333
- `Oracle storage read: slot=${storageSlot.toString()} address-${contractAddress.toString()} value=${value}`,
334
- );
335
- values.push(value);
336
- }
337
391
  return values;
338
392
  }
339
393
 
340
- public utilityDebugLog(level: number, message: string, fields: Fr[]): void {
394
+ /**
395
+ * Returns a per-contract logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
396
+ */
397
+ async #getContractLogger(): Promise<Logger> {
398
+ if (!this.contractLogger) {
399
+ const addrAbbrev = this.contractAddress.toString().slice(0, 10);
400
+ const name = await this.contractStore.getDebugContractName(this.contractAddress);
401
+ const module = name ? `contract_log::${name}(${addrAbbrev})` : `contract_log::${addrAbbrev}`;
402
+ // Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense
403
+ // to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
404
+ this.contractLogger = createLogger(module, { instanceId: this.jobId });
405
+ }
406
+ return this.contractLogger;
407
+ }
408
+
409
+ public async utilityLog(level: number, message: string, fields: Fr[]): Promise<void> {
341
410
  if (!LogLevels[level]) {
342
- throw new Error(`Invalid debug log level: ${level}`);
411
+ throw new Error(`Invalid log level: ${level}`);
343
412
  }
344
413
  const levelName = LogLevels[level];
345
- this.aztecNrDebugLog[levelName](`${applyStringFormatting(message, fields)}`);
414
+ const logger = await this.#getContractLogger();
415
+ logger[levelName](`${applyStringFormatting(message, fields)}`);
346
416
  }
347
417
 
348
418
  public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
349
419
  const logService = new LogService(
350
420
  this.aztecNode,
351
- this.anchorBlockStore,
421
+ this.anchorBlockHeader,
352
422
  this.keyStore,
353
423
  this.capsuleStore,
354
424
  this.recipientTaggingStore,
355
425
  this.senderAddressBookStore,
356
426
  this.addressStore,
427
+ this.jobId,
428
+ this.log.getBindings(),
357
429
  );
358
430
 
359
- await logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
360
-
361
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
362
- await noteService.syncNoteNullifiers(this.contractAddress);
431
+ await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
363
432
  }
364
433
 
365
434
  /**
@@ -372,12 +441,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
372
441
  * @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
373
442
  * @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
374
443
  */
375
- public async utilityValidateEnqueuedNotesAndEvents(
444
+ public async utilityValidateAndStoreEnqueuedNotesAndEvents(
376
445
  contractAddress: AztecAddress,
377
446
  noteValidationRequestsArrayBaseSlot: Fr,
378
447
  eventValidationRequestsArrayBaseSlot: Fr,
379
448
  ) {
380
- // TODO(#10727): allow other contracts to deliver notes
449
+ // TODO(#10727): allow other contracts to store notes
381
450
  if (!this.contractAddress.equals(contractAddress)) {
382
451
  throw new Error(`Got a note validation request from ${contractAddress}, expected ${this.contractAddress}`);
383
452
  }
@@ -385,16 +454,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
385
454
  // We read all note and event validation requests and process them all concurrently. This makes the process much
386
455
  // faster as we don't need to wait for the network round-trip.
387
456
  const noteValidationRequests = (
388
- await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot)
457
+ await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, this.jobId)
389
458
  ).map(NoteValidationRequest.fromFields);
390
459
 
391
460
  const eventValidationRequests = (
392
- await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot)
461
+ await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
393
462
  ).map(EventValidationRequest.fromFields);
394
463
 
395
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
396
- const noteDeliveries = noteValidationRequests.map(request =>
397
- noteService.deliverNote(
464
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
465
+ const noteStorePromises = noteValidationRequests.map(request =>
466
+ noteService.validateAndStoreNote(
398
467
  request.contractAddress,
399
468
  request.owner,
400
469
  request.storageSlot,
@@ -408,9 +477,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
408
477
  ),
409
478
  );
410
479
 
411
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore);
412
- const eventDeliveries = eventValidationRequests.map(request =>
413
- eventService.deliverEvent(
480
+ const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
481
+ const eventStorePromises = eventValidationRequests.map(request =>
482
+ eventService.validateAndStoreEvent(
414
483
  request.contractAddress,
415
484
  request.eventTypeId,
416
485
  request.randomness,
@@ -421,11 +490,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
421
490
  ),
422
491
  );
423
492
 
424
- await Promise.all([...noteDeliveries, ...eventDeliveries]);
493
+ await Promise.all([...noteStorePromises, ...eventStorePromises]);
425
494
 
426
495
  // Requests are cleared once we're done.
427
- await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, []);
428
- await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, []);
496
+ await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, [], this.jobId);
497
+ await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
429
498
  }
430
499
 
431
500
  public async utilityBulkRetrieveLogs(
@@ -441,29 +510,32 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
441
510
  // We read all log retrieval requests and process them all concurrently. This makes the process much faster as we
442
511
  // don't need to wait for the network round-trip.
443
512
  const logRetrievalRequests = (
444
- await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot)
513
+ await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, this.jobId)
445
514
  ).map(LogRetrievalRequest.fromFields);
446
515
 
447
516
  const logService = new LogService(
448
517
  this.aztecNode,
449
- this.anchorBlockStore,
518
+ this.anchorBlockHeader,
450
519
  this.keyStore,
451
520
  this.capsuleStore,
452
521
  this.recipientTaggingStore,
453
522
  this.senderAddressBookStore,
454
523
  this.addressStore,
524
+ this.jobId,
525
+ this.log.getBindings(),
455
526
  );
456
527
 
457
528
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
458
529
 
459
530
  // Requests are cleared once we're done.
460
- await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, []);
531
+ await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, [], this.jobId);
461
532
 
462
533
  // The responses are stored as Option<LogRetrievalResponse> in a second CapsuleArray.
463
534
  await this.capsuleStore.setCapsuleArray(
464
535
  contractAddress,
465
536
  logRetrievalResponsesArrayBaseSlot,
466
537
  maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption),
538
+ this.jobId,
467
539
  );
468
540
  }
469
541
 
@@ -472,7 +544,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
472
544
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
473
545
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
474
546
  }
475
- return this.capsuleStore.storeCapsule(this.contractAddress, slot, capsule);
547
+ this.capsuleStore.storeCapsule(this.contractAddress, slot, capsule, this.jobId);
548
+ return Promise.resolve();
476
549
  }
477
550
 
478
551
  public async utilityLoadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
@@ -483,7 +556,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
483
556
  return (
484
557
  // TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
485
558
  this.capsules.find(c => c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot))?.data ??
486
- (await this.capsuleStore.loadCapsule(this.contractAddress, slot))
559
+ (await this.capsuleStore.loadCapsule(this.contractAddress, slot, this.jobId))
487
560
  );
488
561
  }
489
562
 
@@ -492,7 +565,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
492
565
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
493
566
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
494
567
  }
495
- return this.capsuleStore.deleteCapsule(this.contractAddress, slot);
568
+ this.capsuleStore.deleteCapsule(this.contractAddress, slot, this.jobId);
569
+ return Promise.resolve();
496
570
  }
497
571
 
498
572
  public utilityCopyCapsule(
@@ -505,7 +579,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
505
579
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
506
580
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
507
581
  }
508
- return this.capsuleStore.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries);
582
+ return this.capsuleStore.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries, this.jobId);
509
583
  }
510
584
 
511
585
  // TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
@@ -526,7 +600,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
526
600
 
527
601
  protected async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
528
602
  // TODO(#12656): return an app-siloed secret
529
- const recipientCompleteAddress = await this.getCompleteAddress(address);
603
+ const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
530
604
  const ivskM = await this.keyStore.getMasterSecretKey(
531
605
  recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey,
532
606
  );