@aztec/pxe 0.0.1-commit.f295ac2 → 0.0.1-commit.f504929

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 (234) hide show
  1. package/dest/access_scopes.d.ts +9 -0
  2. package/dest/access_scopes.d.ts.map +1 -0
  3. package/dest/access_scopes.js +6 -0
  4. package/dest/bin/check_oracle_version.js +1 -1
  5. package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
  6. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  7. package/dest/block_synchronizer/block_synchronizer.js +62 -16
  8. package/dest/config/index.d.ts +3 -1
  9. package/dest/config/index.d.ts.map +1 -1
  10. package/dest/config/index.js +17 -0
  11. package/dest/config/package_info.js +1 -1
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +54 -30
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +178 -77
  15. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
  16. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -3
  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 +1 -1
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -2
  23. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +3 -3
  24. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  25. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
  26. package/dest/contract_function_simulator/oracle/interfaces.d.ts +48 -45
  27. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +4 -4
  29. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  30. package/dest/contract_function_simulator/oracle/note_packing_utils.js +4 -4
  31. package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -42
  32. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/oracle.js +174 -109
  34. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -22
  35. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/oracle/private_execution.js +1 -38
  37. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +61 -53
  38. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  39. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +111 -55
  40. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +80 -50
  41. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  42. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +126 -113
  43. package/dest/contract_logging.d.ts +22 -0
  44. package/dest/contract_logging.d.ts.map +1 -0
  45. package/dest/contract_logging.js +23 -0
  46. package/dest/contract_sync/contract_sync_service.d.ts +43 -0
  47. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  48. package/dest/contract_sync/contract_sync_service.js +97 -0
  49. package/dest/contract_sync/helpers.d.ts +29 -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 +24 -10
  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/index.d.ts +4 -1
  56. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  57. package/dest/entrypoints/client/bundle/index.js +3 -0
  58. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  59. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  60. package/dest/entrypoints/client/bundle/utils.js +21 -7
  61. package/dest/entrypoints/client/lazy/index.d.ts +4 -1
  62. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  63. package/dest/entrypoints/client/lazy/index.js +3 -0
  64. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  65. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  66. package/dest/entrypoints/client/lazy/utils.js +22 -8
  67. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  68. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  69. package/dest/entrypoints/server/index.d.ts +4 -1
  70. package/dest/entrypoints/server/index.d.ts.map +1 -1
  71. package/dest/entrypoints/server/index.js +3 -0
  72. package/dest/entrypoints/server/utils.d.ts +1 -1
  73. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  74. package/dest/entrypoints/server/utils.js +28 -9
  75. package/dest/events/event_service.d.ts +5 -6
  76. package/dest/events/event_service.d.ts.map +1 -1
  77. package/dest/events/event_service.js +6 -7
  78. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  79. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  80. package/dest/job_coordinator/job_coordinator.js +3 -2
  81. package/dest/logs/log_service.d.ts +7 -5
  82. package/dest/logs/log_service.d.ts.map +1 -1
  83. package/dest/logs/log_service.js +28 -32
  84. package/dest/notes/note_service.d.ts +9 -8
  85. package/dest/notes/note_service.d.ts.map +1 -1
  86. package/dest/notes/note_service.js +17 -16
  87. package/dest/notes_filter.d.ts +25 -0
  88. package/dest/notes_filter.d.ts.map +1 -0
  89. package/dest/notes_filter.js +4 -0
  90. package/dest/oracle_version.d.ts +3 -3
  91. package/dest/oracle_version.d.ts.map +1 -1
  92. package/dest/oracle_version.js +5 -4
  93. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  94. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  95. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  96. package/dest/private_kernel/hints/index.d.ts +1 -1
  97. package/dest/private_kernel/hints/index.js +1 -1
  98. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  99. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  100. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  101. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  102. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  103. package/dest/private_kernel/hints/test_utils.js +203 -0
  104. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  105. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  106. package/dest/private_kernel/private_kernel_execution_prover.js +21 -13
  107. package/dest/private_kernel/private_kernel_oracle.d.ts +8 -4
  108. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  109. package/dest/private_kernel/private_kernel_oracle.js +7 -3
  110. package/dest/pxe.d.ts +71 -24
  111. package/dest/pxe.d.ts.map +1 -1
  112. package/dest/pxe.js +110 -70
  113. package/dest/storage/address_store/address_store.d.ts +1 -1
  114. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  115. package/dest/storage/address_store/address_store.js +12 -11
  116. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  117. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  118. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  119. package/dest/storage/capsule_store/capsule_store.js +6 -8
  120. package/dest/storage/contract_store/contract_store.d.ts +42 -16
  121. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  122. package/dest/storage/contract_store/contract_store.js +157 -84
  123. package/dest/storage/metadata.d.ts +1 -1
  124. package/dest/storage/metadata.js +1 -1
  125. package/dest/storage/note_store/note_store.d.ts +47 -49
  126. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  127. package/dest/storage/note_store/note_store.js +278 -252
  128. package/dest/storage/note_store/stored_note.d.ts +16 -0
  129. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  130. package/dest/storage/note_store/stored_note.js +43 -0
  131. package/dest/storage/private_event_store/private_event_store.d.ts +17 -4
  132. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  133. package/dest/storage/private_event_store/private_event_store.js +198 -147
  134. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  135. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  136. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  137. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  138. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  139. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  140. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  141. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  142. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  143. package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
  144. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  145. package/dest/storage/tagging_store/sender_tagging_store.js +184 -114
  146. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  147. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  148. package/dest/tagging/get_all_logs_by_tags.js +60 -0
  149. package/dest/tagging/index.d.ts +3 -2
  150. package/dest/tagging/index.d.ts.map +1 -1
  151. package/dest/tagging/index.js +2 -1
  152. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +5 -5
  153. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  154. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
  155. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  156. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +7 -7
  157. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  158. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +16 -12
  159. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +5 -8
  160. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  161. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +3 -6
  162. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  163. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  164. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  165. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  166. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  167. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +20 -18
  168. package/package.json +25 -16
  169. package/src/access_scopes.ts +9 -0
  170. package/src/bin/check_oracle_version.ts +1 -0
  171. package/src/block_synchronizer/block_synchronizer.ts +76 -33
  172. package/src/config/index.ts +14 -0
  173. package/src/config/package_info.ts +1 -1
  174. package/src/contract_function_simulator/contract_function_simulator.ts +327 -140
  175. package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -5
  176. package/src/contract_function_simulator/index.ts +1 -1
  177. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +2 -2
  178. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
  179. package/src/contract_function_simulator/oracle/interfaces.ts +56 -47
  180. package/src/contract_function_simulator/oracle/note_packing_utils.ts +4 -4
  181. package/src/contract_function_simulator/oracle/oracle.ts +182 -124
  182. package/src/contract_function_simulator/oracle/private_execution.ts +2 -61
  183. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +151 -135
  184. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +191 -127
  185. package/src/contract_logging.ts +39 -0
  186. package/src/contract_sync/contract_sync_service.ts +152 -0
  187. package/src/contract_sync/helpers.ts +98 -0
  188. package/src/debug/pxe_debug_utils.ts +63 -18
  189. package/src/entrypoints/client/bundle/index.ts +3 -0
  190. package/src/entrypoints/client/bundle/utils.ts +16 -15
  191. package/src/entrypoints/client/lazy/index.ts +3 -0
  192. package/src/entrypoints/client/lazy/utils.ts +17 -15
  193. package/src/entrypoints/pxe_creation_options.ts +2 -1
  194. package/src/entrypoints/server/index.ts +3 -0
  195. package/src/entrypoints/server/utils.ts +22 -26
  196. package/src/events/event_service.ts +5 -7
  197. package/src/job_coordinator/job_coordinator.ts +4 -3
  198. package/src/logs/log_service.ts +48 -39
  199. package/src/notes/note_service.ts +24 -22
  200. package/src/notes_filter.ts +26 -0
  201. package/src/oracle_version.ts +5 -4
  202. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  203. package/src/private_kernel/hints/index.ts +1 -1
  204. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  205. package/src/private_kernel/hints/test_utils.ts +325 -0
  206. package/src/private_kernel/private_kernel_execution_prover.ts +25 -15
  207. package/src/private_kernel/private_kernel_oracle.ts +9 -9
  208. package/src/pxe.ts +217 -115
  209. package/src/storage/address_store/address_store.ts +15 -15
  210. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  211. package/src/storage/capsule_store/capsule_store.ts +8 -8
  212. package/src/storage/contract_store/contract_store.ts +186 -96
  213. package/src/storage/metadata.ts +1 -1
  214. package/src/storage/note_store/note_store.ts +321 -318
  215. package/src/storage/note_store/stored_note.ts +48 -0
  216. package/src/storage/private_event_store/private_event_store.ts +250 -190
  217. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  218. package/src/storage/tagging_store/recipient_tagging_store.ts +38 -24
  219. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  220. package/src/storage/tagging_store/sender_tagging_store.ts +214 -130
  221. package/src/tagging/get_all_logs_by_tags.ts +92 -0
  222. package/src/tagging/index.ts +2 -1
  223. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +17 -10
  224. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  225. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +17 -16
  226. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +6 -9
  227. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
  228. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +23 -23
  229. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  230. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
  231. package/dest/tree_membership/tree_membership_service.d.ts +0 -50
  232. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  233. package/dest/tree_membership/tree_membership_service.js +0 -75
  234. package/src/tree_membership/tree_membership_service.ts +0 -97
@@ -1,35 +1,38 @@
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, createLogger } from '@aztec/foundation/log';
7
+ import type { MembershipWitness } from '@aztec/foundation/trees';
6
8
  import type { KeyStore } from '@aztec/key-store';
7
9
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
8
10
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
- import { L2BlockHash } from '@aztec/stdlib/block';
11
+ import { BlockHash } from '@aztec/stdlib/block';
10
12
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
11
13
  import { siloNullifier } from '@aztec/stdlib/hash';
12
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
13
15
  import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
14
16
  import { computeAddressSecret } from '@aztec/stdlib/keys';
15
17
  import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
18
+ import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
16
19
  import type { NoteStatus } from '@aztec/stdlib/note';
17
20
  import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
18
21
  import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
19
22
 
23
+ import type { AccessScopes } from '../../access_scopes.js';
24
+ import { createContractLogger, logContractMessage } from '../../contract_logging.js';
20
25
  import { EventService } from '../../events/event_service.js';
21
26
  import { LogService } from '../../logs/log_service.js';
22
27
  import { NoteService } from '../../notes/note_service.js';
23
28
  import { ORACLE_VERSION } from '../../oracle_version.js';
24
29
  import type { AddressStore } from '../../storage/address_store/address_store.js';
25
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
26
30
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
27
31
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
28
32
  import type { NoteStore } from '../../storage/note_store/note_store.js';
29
33
  import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
30
34
  import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
31
35
  import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
32
- import { TreeMembershipService } from '../../tree_membership/tree_membership_service.js';
33
36
  import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
34
37
  import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
35
38
  import { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
@@ -39,6 +42,27 @@ import { pickNotes } from '../pick_notes.js';
39
42
  import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
40
43
  import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
41
44
 
45
+ /** Args for UtilityExecutionOracle constructor. */
46
+ export type UtilityExecutionOracleArgs = {
47
+ contractAddress: AztecAddress;
48
+ /** List of transient auth witnesses to be used during this simulation */
49
+ authWitnesses: AuthWitness[];
50
+ capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
51
+ anchorBlockHeader: BlockHeader;
52
+ contractStore: ContractStore;
53
+ noteStore: NoteStore;
54
+ keyStore: KeyStore;
55
+ addressStore: AddressStore;
56
+ aztecNode: AztecNode;
57
+ recipientTaggingStore: RecipientTaggingStore;
58
+ senderAddressBookStore: SenderAddressBookStore;
59
+ capsuleStore: CapsuleStore;
60
+ privateEventStore: PrivateEventStore;
61
+ jobId: string;
62
+ log?: ReturnType<typeof createLogger>;
63
+ scopes: AccessScopes;
64
+ };
65
+
42
66
  /**
43
67
  * The oracle for an execution of utility contract functions.
44
68
  */
@@ -46,40 +70,55 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
46
70
  isMisc = true as const;
47
71
  isUtility = true as const;
48
72
 
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
-
72
- public utilityAssertCompatibleOracleVersion(version: number): void {
73
+ private contractLogger: Logger | undefined;
74
+
75
+ protected readonly contractAddress: AztecAddress;
76
+ protected readonly authWitnesses: AuthWitness[];
77
+ protected readonly capsules: Capsule[];
78
+ protected readonly anchorBlockHeader: BlockHeader;
79
+ protected readonly contractStore: ContractStore;
80
+ protected readonly noteStore: NoteStore;
81
+ protected readonly keyStore: KeyStore;
82
+ protected readonly addressStore: AddressStore;
83
+ protected readonly aztecNode: AztecNode;
84
+ protected readonly recipientTaggingStore: RecipientTaggingStore;
85
+ protected readonly senderAddressBookStore: SenderAddressBookStore;
86
+ protected readonly capsuleStore: CapsuleStore;
87
+ protected readonly privateEventStore: PrivateEventStore;
88
+ protected readonly jobId: string;
89
+ protected logger: ReturnType<typeof createLogger>;
90
+ protected readonly scopes: AccessScopes;
91
+
92
+ constructor(args: UtilityExecutionOracleArgs) {
93
+ this.contractAddress = args.contractAddress;
94
+ this.authWitnesses = args.authWitnesses;
95
+ this.capsules = args.capsules;
96
+ this.anchorBlockHeader = args.anchorBlockHeader;
97
+ this.contractStore = args.contractStore;
98
+ this.noteStore = args.noteStore;
99
+ this.keyStore = args.keyStore;
100
+ this.addressStore = args.addressStore;
101
+ this.aztecNode = args.aztecNode;
102
+ this.recipientTaggingStore = args.recipientTaggingStore;
103
+ this.senderAddressBookStore = args.senderAddressBookStore;
104
+ this.capsuleStore = args.capsuleStore;
105
+ this.privateEventStore = args.privateEventStore;
106
+ this.jobId = args.jobId;
107
+ this.logger = args.log ?? createLogger('simulator:client_view_context');
108
+ this.scopes = args.scopes;
109
+ }
110
+
111
+ public assertCompatibleOracleVersion(version: number): void {
73
112
  if (version !== ORACLE_VERSION) {
74
113
  throw new Error(`Incompatible oracle version. Expected version ${ORACLE_VERSION}, got ${version}.`);
75
114
  }
76
115
  }
77
116
 
78
- public utilityGetRandomField(): Fr {
117
+ public getRandomField(): Fr {
79
118
  return Fr.random();
80
119
  }
81
120
 
82
- public utilityGetUtilityContext(): UtilityContext {
121
+ public getUtilityContext(): UtilityContext {
83
122
  return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
84
123
  }
85
124
 
@@ -88,21 +127,54 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
88
127
  * @param pkMHash - The master public key hash.
89
128
  * @returns A Promise that resolves to nullifier keys.
90
129
  * @throws If the keys are not registered in the key store.
130
+ * @throws If scopes are defined and the account is not in the scopes.
91
131
  */
92
- public utilityGetKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
132
+ public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
133
+ // If scopes are defined, check that the key belongs to an account in the scopes.
134
+ if (this.scopes !== 'ALL_SCOPES' && this.scopes.length > 0) {
135
+ let hasAccess = false;
136
+ for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
137
+ if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
138
+ hasAccess = true;
139
+ }
140
+ }
141
+ if (!hasAccess) {
142
+ throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
143
+ }
144
+ }
93
145
  return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
94
146
  }
95
147
 
96
148
  /**
97
- * Fetches the index and sibling path of a leaf at a given block from a given tree.
98
- * @param blockHash - The block hash at which to get the membership witness.
99
- * @param treeId - Id of the tree to get the sibling path from.
100
- * @param leafValue - The leaf value
101
- * @returns The index and sibling path concatenated [index, sibling_path]
149
+ * Fetches the index and sibling path of a leaf at a given block from the note hash tree.
150
+ * @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
151
+ * witness.
152
+ * @param noteHash - The note hash to find in the note hash tree.
153
+ * @returns The membership witness containing the leaf index and sibling path
102
154
  */
103
- public utilityGetMembershipWitness(blockHash: L2BlockHash, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[]> {
104
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
105
- return treeMembershipService.getMembershipWitness(blockHash, treeId, leafValue);
155
+ public getNoteHashMembershipWitness(
156
+ anchorBlockHash: BlockHash,
157
+ noteHash: Fr,
158
+ ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
159
+ return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
160
+ }
161
+
162
+ /**
163
+ * Fetches the index and sibling path of a block hash in the archive tree.
164
+ *
165
+ * Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
166
+ * its block hash is appended as a new leaf to the archive tree.
167
+ *
168
+ * @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
169
+ * witness.
170
+ * @param blockHash - The block hash to find in the archive tree.
171
+ * @returns The membership witness containing the leaf index and sibling path
172
+ */
173
+ public getBlockHashMembershipWitness(
174
+ anchorBlockHash: BlockHash,
175
+ blockHash: BlockHash,
176
+ ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
177
+ return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
106
178
  }
107
179
 
108
180
  /**
@@ -111,11 +183,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
111
183
  * @param nullifier - Nullifier we try to find witness for.
112
184
  * @returns The nullifier membership witness (if found).
113
185
  */
114
- public async utilityGetNullifierMembershipWitness(
115
- blockHash: L2BlockHash,
186
+ public getNullifierMembershipWitness(
187
+ blockHash: BlockHash,
116
188
  nullifier: Fr,
117
189
  ): Promise<NullifierMembershipWitness | undefined> {
118
- return await this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
190
+ return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
119
191
  }
120
192
 
121
193
  /**
@@ -127,12 +199,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
127
199
  * list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
128
200
  * we are trying to prove non-inclusion for.
129
201
  */
130
- public async utilityGetLowNullifierMembershipWitness(
131
- blockHash: L2BlockHash,
202
+ public getLowNullifierMembershipWitness(
203
+ blockHash: BlockHash,
132
204
  nullifier: Fr,
133
205
  ): Promise<NullifierMembershipWitness | undefined> {
134
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
135
- return await treeMembershipService.getLowNullifierMembershipWitness(blockHash, nullifier);
206
+ return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
136
207
  }
137
208
 
138
209
  /**
@@ -141,12 +212,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
141
212
  * @param leafSlot - The slot of the public data tree to get the witness for.
142
213
  * @returns - The witness
143
214
  */
144
- public async utilityGetPublicDataWitness(
145
- blockHash: L2BlockHash,
146
- leafSlot: Fr,
147
- ): Promise<PublicDataWitness | undefined> {
148
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
149
- return await treeMembershipService.getPublicDataWitness(blockHash, leafSlot);
215
+ public getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
216
+ return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
150
217
  }
151
218
 
152
219
  /**
@@ -154,8 +221,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
154
221
  * @param blockNumber - The number of a block of which to get the block header.
155
222
  * @returns Block extracted from a block with block number `blockNumber`.
156
223
  */
157
- public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
158
- const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
224
+ public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
225
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
159
226
  if (blockNumber > anchorBlockNumber) {
160
227
  throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
161
228
  }
@@ -167,14 +234,13 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
167
234
  /**
168
235
  * Retrieve the complete address associated to a given address.
169
236
  * @param account - The account address.
170
- * @returns A complete address associated with the input address.
171
- * @throws An error if the account is not registered in the database.
237
+ * @returns A complete address associated with the input address, or `undefined` if not registered.
172
238
  */
173
- public utilityGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress> {
174
- return this.getCompleteAddress(account);
239
+ public tryGetPublicKeysAndPartialAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
240
+ return this.addressStore.getCompleteAddress(account);
175
241
  }
176
242
 
177
- protected async getCompleteAddress(account: AztecAddress): Promise<CompleteAddress> {
243
+ protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
178
244
  const completeAddress = await this.addressStore.getCompleteAddress(account);
179
245
  if (!completeAddress) {
180
246
  throw new Error(
@@ -190,11 +256,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
190
256
  * @param address - Address.
191
257
  * @returns A contract instance.
192
258
  */
193
- public utilityGetContractInstance(address: AztecAddress): Promise<ContractInstance> {
194
- return this.getContractInstance(address);
195
- }
196
-
197
- protected async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
259
+ public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
198
260
  const instance = await this.contractStore.getContractInstance(address);
199
261
  if (!instance) {
200
262
  throw new Error(`No contract instance found for address ${address.toString()}`);
@@ -208,7 +270,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
208
270
  * @param messageHash - Hash of the message to authenticate.
209
271
  * @returns Authentication witness for the requested message hash.
210
272
  */
211
- public utilityGetAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
273
+ public getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
212
274
  return Promise.resolve(this.authWitnesses.find(w => w.requestHash.equals(messageHash))?.witness);
213
275
  }
214
276
 
@@ -234,7 +296,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
234
296
  * @param status - The status of notes to fetch.
235
297
  * @returns Array of note data.
236
298
  */
237
- public async utilityGetNotes(
299
+ public async getNotes(
238
300
  owner: AztecAddress | undefined,
239
301
  storageSlot: Fr,
240
302
  numSelects: number,
@@ -251,7 +313,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
251
313
  offset: number,
252
314
  status: NoteStatus,
253
315
  ): Promise<NoteData[]> {
254
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
316
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
255
317
 
256
318
  const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
257
319
  return pickNotes<NoteData>(dbNotes, {
@@ -274,11 +336,15 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
274
336
  * @param innerNullifier - The inner nullifier.
275
337
  * @returns A boolean indicating whether the nullifier exists in the tree or not.
276
338
  */
277
- public async utilityCheckNullifierExists(innerNullifier: Fr) {
278
- const nullifier = await siloNullifier(this.contractAddress, innerNullifier!);
279
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
280
- const index = await treeMembershipService.getNullifierIndex(nullifier);
281
- return index !== undefined;
339
+ public async checkNullifierExists(innerNullifier: Fr) {
340
+ const [nullifier, anchorBlockHash] = await Promise.all([
341
+ siloNullifier(this.contractAddress, innerNullifier!),
342
+ this.anchorBlockHeader.hash(),
343
+ ]);
344
+ const [leafIndex] = await this.aztecNode.findLeavesIndexes(anchorBlockHash, MerkleTreeId.NULLIFIER_TREE, [
345
+ nullifier,
346
+ ]);
347
+ return leafIndex?.data !== undefined;
282
348
  }
283
349
 
284
350
  /**
@@ -289,15 +355,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
289
355
  * @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
290
356
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
291
357
  */
292
- public async utilityGetL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
293
- const treeMembershipService = new TreeMembershipService(this.aztecNode);
294
- const [messageIndex, siblingPath] = await treeMembershipService.getL1ToL2MembershipWitness(
358
+ public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
359
+ const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
360
+ this.aztecNode,
295
361
  contractAddress,
296
362
  messageHash,
297
363
  secret,
298
364
  );
299
365
 
300
- // Assuming messageIndex is what you intended to use for the index in MessageLoadOracleInputs
301
366
  return new MessageLoadOracleInputs(messageIndex, siblingPath);
302
367
  }
303
368
 
@@ -308,58 +373,65 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
308
373
  * @param startStorageSlot - The starting storage slot.
309
374
  * @param numberOfElements - Number of elements to read from the starting storage slot.
310
375
  */
311
- public async utilityStorageRead(
312
- blockHash: L2BlockHash,
376
+ public async storageRead(
377
+ blockHash: BlockHash,
313
378
  contractAddress: AztecAddress,
314
379
  startStorageSlot: Fr,
315
380
  numberOfElements: number,
316
381
  ) {
317
- const values = [];
382
+ const slots = Array(numberOfElements)
383
+ .fill(0)
384
+ .map((_, i) => new Fr(startStorageSlot.value + BigInt(i)));
318
385
 
319
- // TODO: why do we serialize these requests? This should probably a single call
320
- // Privacy considerations?
321
- for (let i = 0n; i < numberOfElements; i++) {
322
- const storageSlot = new Fr(startStorageSlot.value + i);
323
- const value = await this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot);
386
+ const values = await Promise.all(
387
+ slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
388
+ );
389
+
390
+ this.logger.debug(
391
+ `Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
392
+ );
324
393
 
325
- this.log.debug(
326
- `Oracle storage read: slot=${storageSlot.toString()} address-${contractAddress.toString()} value=${value}`,
394
+ return values;
395
+ }
396
+
397
+ /**
398
+ * Returns a per-contract logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
399
+ */
400
+ async #getContractLogger(): Promise<Logger> {
401
+ if (!this.contractLogger) {
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 = await createContractLogger(
405
+ this.contractAddress,
406
+ addr => this.contractStore.getDebugContractName(addr),
407
+ { instanceId: this.jobId },
327
408
  );
328
- values.push(value);
329
409
  }
330
- return values;
410
+ return this.contractLogger;
331
411
  }
332
412
 
333
- public utilityDebugLog(level: number, message: string, fields: Fr[]): void {
413
+ public async log(level: number, message: string, fields: Fr[]): Promise<void> {
334
414
  if (!LogLevels[level]) {
335
- throw new Error(`Invalid debug log level: ${level}`);
415
+ throw new Error(`Invalid log level: ${level}`);
336
416
  }
337
- const levelName = LogLevels[level];
338
- this.aztecNrDebugLog[levelName](`${applyStringFormatting(message, fields)}`);
417
+ const logger = await this.#getContractLogger();
418
+ logContractMessage(logger, LogLevels[level], message, fields);
339
419
  }
340
420
 
341
- public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
421
+ public async fetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
342
422
  const logService = new LogService(
343
423
  this.aztecNode,
344
- this.anchorBlockStore,
424
+ this.anchorBlockHeader,
345
425
  this.keyStore,
346
426
  this.capsuleStore,
347
427
  this.recipientTaggingStore,
348
428
  this.senderAddressBookStore,
349
429
  this.addressStore,
350
430
  this.jobId,
431
+ this.logger.getBindings(),
351
432
  );
352
433
 
353
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
354
-
355
- // It is acceptable to run the following operations in parallel for several reasons:
356
- // 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
357
- // which is then processed in Noir after this handler returns.
358
- // 2. Even if syncTaggedLogs did write to the note store, it would not cause inconsistent state.
359
- await Promise.all([
360
- logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes),
361
- noteService.syncNoteNullifiers(this.contractAddress),
362
- ]);
434
+ await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
363
435
  }
364
436
 
365
437
  /**
@@ -372,7 +444,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
372
444
  * @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
373
445
  * @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
374
446
  */
375
- public async utilityValidateEnqueuedNotesAndEvents(
447
+ public async validateAndStoreEnqueuedNotesAndEvents(
376
448
  contractAddress: AztecAddress,
377
449
  noteValidationRequestsArrayBaseSlot: Fr,
378
450
  eventValidationRequestsArrayBaseSlot: Fr,
@@ -392,9 +464,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
392
464
  await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
393
465
  ).map(EventValidationRequest.fromFields);
394
466
 
395
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
467
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
396
468
  const noteStorePromises = noteValidationRequests.map(request =>
397
- noteService.storeNote(
469
+ noteService.validateAndStoreNote(
398
470
  request.contractAddress,
399
471
  request.owner,
400
472
  request.storageSlot,
@@ -408,9 +480,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
408
480
  ),
409
481
  );
410
482
 
411
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore, this.jobId);
483
+ const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
412
484
  const eventStorePromises = eventValidationRequests.map(request =>
413
- eventService.storeEvent(
485
+ eventService.validateAndStoreEvent(
414
486
  request.contractAddress,
415
487
  request.eventTypeId,
416
488
  request.randomness,
@@ -428,7 +500,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
428
500
  await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
429
501
  }
430
502
 
431
- public async utilityBulkRetrieveLogs(
503
+ public async bulkRetrieveLogs(
432
504
  contractAddress: AztecAddress,
433
505
  logRetrievalRequestsArrayBaseSlot: Fr,
434
506
  logRetrievalResponsesArrayBaseSlot: Fr,
@@ -446,13 +518,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
446
518
 
447
519
  const logService = new LogService(
448
520
  this.aztecNode,
449
- this.anchorBlockStore,
521
+ this.anchorBlockHeader,
450
522
  this.keyStore,
451
523
  this.capsuleStore,
452
524
  this.recipientTaggingStore,
453
525
  this.senderAddressBookStore,
454
526
  this.addressStore,
455
527
  this.jobId,
528
+ this.logger.getBindings(),
456
529
  );
457
530
 
458
531
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
@@ -469,7 +542,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
469
542
  );
470
543
  }
471
544
 
472
- public utilityStoreCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void> {
545
+ public storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void> {
473
546
  if (!contractAddress.equals(this.contractAddress)) {
474
547
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
475
548
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
@@ -478,7 +551,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
478
551
  return Promise.resolve();
479
552
  }
480
553
 
481
- public async utilityLoadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
554
+ public async loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
482
555
  if (!contractAddress.equals(this.contractAddress)) {
483
556
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
484
557
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
@@ -490,7 +563,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
490
563
  );
491
564
  }
492
565
 
493
- public utilityDeleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void> {
566
+ public deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void> {
494
567
  if (!contractAddress.equals(this.contractAddress)) {
495
568
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
496
569
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
@@ -499,12 +572,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
499
572
  return Promise.resolve();
500
573
  }
501
574
 
502
- public utilityCopyCapsule(
503
- contractAddress: AztecAddress,
504
- srcSlot: Fr,
505
- dstSlot: Fr,
506
- numEntries: number,
507
- ): Promise<void> {
575
+ public copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void> {
508
576
  if (!contractAddress.equals(this.contractAddress)) {
509
577
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
510
578
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
@@ -513,7 +581,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
513
581
  }
514
582
 
515
583
  // TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
516
- public utilityAes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
584
+ public aes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
517
585
  const aes128 = new Aes128();
518
586
  return aes128.decryptBufferCBC(ciphertext, iv, symKey);
519
587
  }
@@ -524,13 +592,9 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
524
592
  * @param ephPk - The ephemeral public key to get the secret for.
525
593
  * @returns The secret for the given address.
526
594
  */
527
- public utilityGetSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
528
- return this.getSharedSecret(address, ephPk);
529
- }
530
-
531
- protected async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
595
+ public async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
532
596
  // TODO(#12656): return an app-siloed secret
533
- const recipientCompleteAddress = await this.getCompleteAddress(address);
597
+ const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
534
598
  const ivskM = await this.keyStore.getMasterSecretKey(
535
599
  recipientCompleteAddress.publicKeys.masterIncomingViewingPublicKey,
536
600
  );
@@ -0,0 +1,39 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { type LogLevel, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log';
3
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
+ import type { DebugLog } from '@aztec/stdlib/logs';
5
+
6
+ /** Resolves a contract address to a human-readable name, if available. */
7
+ export type ContractNameResolver = (address: AztecAddress) => Promise<string | undefined>;
8
+
9
+ /**
10
+ * Creates a logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
11
+ */
12
+ export async function createContractLogger(
13
+ contractAddress: AztecAddress,
14
+ getContractName: ContractNameResolver,
15
+ options?: { instanceId?: string },
16
+ ): Promise<Logger> {
17
+ const addrAbbrev = contractAddress.toString().slice(0, 10);
18
+ const name = await getContractName(contractAddress);
19
+ const module = name ? `contract_log::${name}(${addrAbbrev})` : `contract_log::Unknown(${addrAbbrev})`;
20
+ return createLogger(module, options);
21
+ }
22
+
23
+ /**
24
+ * Formats and emits a single contract log message through the given logger.
25
+ */
26
+ export function logContractMessage(logger: Logger, level: LogLevel, message: string, fields: Fr[]): void {
27
+ logger[level](applyStringFormatting(message, fields));
28
+ }
29
+
30
+ /**
31
+ * Displays debug logs collected during public function simulation,
32
+ * using the `contract_log::` prefixed logger format.
33
+ */
34
+ export async function displayDebugLogs(debugLogs: DebugLog[], getContractName: ContractNameResolver): Promise<void> {
35
+ for (const log of debugLogs) {
36
+ const logger = await createContractLogger(log.contractAddress, getContractName);
37
+ logContractMessage(logger, log.level, log.message, log.fields);
38
+ }
39
+ }