@aztec/pxe 0.0.1-commit.d117d021b → 0.0.1-commit.d1da697d6

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 (161) hide show
  1. package/dest/block_synchronizer/block_synchronizer.d.ts +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_synchronizer.js +6 -0
  4. package/dest/contract_function_simulator/contract_function_simulator.d.ts +10 -5
  5. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.js +29 -6
  7. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
  8. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/execution_tagging_index_cache.js +17 -9
  10. package/dest/contract_function_simulator/index.d.ts +2 -1
  11. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  12. package/dest/contract_function_simulator/index.js +1 -0
  13. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +2 -3
  14. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  15. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +2 -5
  16. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +2 -3
  17. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  18. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -5
  19. package/dest/contract_function_simulator/oracle/interfaces.d.ts +20 -18
  20. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  21. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  22. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  23. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +38 -0
  24. package/dest/contract_function_simulator/oracle/oracle.d.ts +38 -17
  25. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/oracle/oracle.js +89 -37
  27. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  28. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +10 -22
  29. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  30. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +20 -24
  31. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +45 -28
  32. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +164 -71
  34. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  35. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  36. package/dest/contract_function_simulator/pick_notes.js +9 -2
  37. package/dest/contract_logging.d.ts +9 -4
  38. package/dest/contract_logging.d.ts.map +1 -1
  39. package/dest/contract_logging.js +21 -6
  40. package/dest/contract_sync/contract_sync_service.d.ts +6 -5
  41. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  42. package/dest/contract_sync/contract_sync_service.js +44 -37
  43. package/dest/contract_sync/helpers.d.ts +2 -3
  44. package/dest/contract_sync/helpers.d.ts.map +1 -1
  45. package/dest/contract_sync/helpers.js +7 -2
  46. package/dest/debug/pxe_debug_utils.d.ts +3 -3
  47. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  48. package/dest/entrypoints/client/bundle/index.d.ts +1 -2
  49. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  50. package/dest/entrypoints/client/bundle/index.js +0 -1
  51. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  52. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  53. package/dest/entrypoints/client/bundle/utils.js +2 -2
  54. package/dest/entrypoints/client/lazy/index.d.ts +1 -2
  55. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  56. package/dest/entrypoints/client/lazy/index.js +0 -1
  57. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  58. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  59. package/dest/entrypoints/client/lazy/utils.js +2 -2
  60. package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
  61. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  62. package/dest/entrypoints/pxe_creation_options.js +3 -1
  63. package/dest/entrypoints/server/index.d.ts +1 -2
  64. package/dest/entrypoints/server/index.d.ts.map +1 -1
  65. package/dest/entrypoints/server/index.js +0 -1
  66. package/dest/entrypoints/server/utils.d.ts +2 -2
  67. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  68. package/dest/entrypoints/server/utils.js +2 -2
  69. package/dest/events/event_service.d.ts +3 -2
  70. package/dest/events/event_service.d.ts.map +1 -1
  71. package/dest/events/event_service.js +16 -4
  72. package/dest/logs/log_service.d.ts +6 -7
  73. package/dest/logs/log_service.d.ts.map +1 -1
  74. package/dest/logs/log_service.js +32 -30
  75. package/dest/messages/message_context_service.d.ts +17 -0
  76. package/dest/messages/message_context_service.d.ts.map +1 -0
  77. package/dest/messages/message_context_service.js +36 -0
  78. package/dest/notes/note_service.d.ts +4 -5
  79. package/dest/notes/note_service.d.ts.map +1 -1
  80. package/dest/notes/note_service.js +14 -5
  81. package/dest/notes_filter.d.ts +2 -3
  82. package/dest/notes_filter.d.ts.map +1 -1
  83. package/dest/oracle_version.d.ts +2 -2
  84. package/dest/oracle_version.js +2 -2
  85. package/dest/pxe.d.ts +9 -7
  86. package/dest/pxe.d.ts.map +1 -1
  87. package/dest/pxe.js +39 -23
  88. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  89. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  90. package/dest/storage/capsule_store/capsule_service.js +50 -0
  91. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  92. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  93. package/dest/storage/capsule_store/capsule_store.js +33 -28
  94. package/dest/storage/capsule_store/index.d.ts +2 -1
  95. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  96. package/dest/storage/capsule_store/index.js +1 -0
  97. package/dest/storage/metadata.d.ts +1 -1
  98. package/dest/storage/metadata.js +1 -1
  99. package/dest/storage/note_store/note_store.d.ts +1 -1
  100. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  101. package/dest/storage/note_store/note_store.js +2 -2
  102. package/dest/storage/tagging_store/sender_tagging_store.d.ts +26 -25
  103. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  104. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  105. package/dest/tagging/index.d.ts +2 -2
  106. package/dest/tagging/index.d.ts.map +1 -1
  107. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +1 -1
  108. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  109. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +10 -1
  110. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  111. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  112. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
  113. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +2 -1
  114. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  115. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +24 -11
  116. package/package.json +16 -16
  117. package/src/block_synchronizer/block_synchronizer.ts +6 -0
  118. package/src/contract_function_simulator/contract_function_simulator.ts +42 -10
  119. package/src/contract_function_simulator/execution_tagging_index_cache.ts +16 -11
  120. package/src/contract_function_simulator/index.ts +1 -0
  121. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +0 -3
  122. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +0 -3
  123. package/src/contract_function_simulator/oracle/interfaces.ts +31 -16
  124. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +98 -0
  125. package/src/contract_function_simulator/oracle/oracle.ts +116 -32
  126. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  127. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +24 -31
  128. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +284 -83
  129. package/src/contract_function_simulator/pick_notes.ts +9 -2
  130. package/src/contract_logging.ts +18 -5
  131. package/src/contract_sync/contract_sync_service.ts +77 -59
  132. package/src/contract_sync/helpers.ts +4 -4
  133. package/src/debug/pxe_debug_utils.ts +3 -3
  134. package/src/entrypoints/client/bundle/index.ts +0 -1
  135. package/src/entrypoints/client/bundle/utils.ts +2 -3
  136. package/src/entrypoints/client/lazy/index.ts +0 -1
  137. package/src/entrypoints/client/lazy/utils.ts +2 -3
  138. package/src/entrypoints/pxe_creation_options.ts +7 -0
  139. package/src/entrypoints/server/index.ts +0 -1
  140. package/src/entrypoints/server/utils.ts +2 -3
  141. package/src/events/event_service.ts +17 -4
  142. package/src/logs/log_service.ts +63 -48
  143. package/src/messages/message_context_service.ts +44 -0
  144. package/src/notes/note_service.ts +18 -8
  145. package/src/notes_filter.ts +1 -3
  146. package/src/oracle_version.ts +2 -2
  147. package/src/pxe.ts +62 -28
  148. package/src/storage/capsule_store/capsule_service.ts +90 -0
  149. package/src/storage/capsule_store/capsule_store.ts +34 -26
  150. package/src/storage/capsule_store/index.ts +1 -0
  151. package/src/storage/metadata.ts +1 -1
  152. package/src/storage/note_store/note_store.ts +2 -5
  153. package/src/storage/tagging_store/sender_tagging_store.ts +182 -135
  154. package/src/tagging/index.ts +1 -1
  155. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +19 -1
  156. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
  157. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +19 -9
  158. package/dest/access_scopes.d.ts +0 -9
  159. package/dest/access_scopes.d.ts.map +0 -1
  160. package/dest/access_scopes.js +0 -6
  161. package/src/access_scopes.ts +0 -9
@@ -16,6 +16,7 @@ import { BlockHash } from '@aztec/stdlib/block';
16
16
  import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
17
17
 
18
18
  import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
19
+ import { buildLegacyOracleCallbacks } from './legacy_oracle_mappings.js';
19
20
  import { packAsHintedNote } from './note_packing_utils.js';
20
21
 
21
22
  export class UnavailableOracleError extends Error {
@@ -26,6 +27,25 @@ export class UnavailableOracleError extends Error {
26
27
 
27
28
  /**
28
29
  * A data source that has all the apis required by Aztec.nr.
30
+ *
31
+ * ## Oracle naming conventions
32
+ *
33
+ * We try to keep oracle naming consistent, please see below the conventions we adhere to.
34
+ *
35
+ * Each oracle method name has the form `aztec_{scope}_{verb}{Object}`, where:
36
+ *
37
+ * - **Scope prefix** indicates the execution context required:
38
+ * - `aztec_prv_` — available only during private function execution.
39
+ * - `aztec_utl_` — available during both utility and private execution.
40
+ *
41
+ * - **Verb** signals the operation's semantics (verb-first, then object):
42
+ * - `get` — read / lookup / get data from oracle into contract.
43
+ * - `does`/`is`/`has` — predicate (returns boolean).
44
+ * - `emit`/`notify` — propagate data from contract to oracle.
45
+ * - `set` — contract driven oracle state mutation (capsules, execution cache, tagging, etc).
46
+ * - `call` — trigger nested execution (control flow).
47
+ * - `assert` — validate a condition, throw on failure.
48
+ * - Standalone verbs (`delete`, `copy`, `decrypt`, `log`, etc) are used when no generic verb fits.
29
49
  */
30
50
  export class Oracle {
31
51
  constructor(private handler: IMiscOracle | IUtilityExecutionOracle | IPrivateExecutionOracle) {}
@@ -85,11 +105,13 @@ export class Oracle {
85
105
  });
86
106
 
87
107
  // Build callback object and return it
88
- return oracleNames.reduce((acc, name) => {
108
+ const callback = oracleNames.reduce((acc, name) => {
89
109
  const method = this[name as keyof Omit<Oracle, (typeof excludedProps)[number]>];
90
110
  acc[name] = method.bind(this);
91
111
  return acc;
92
112
  }, {} as ACIRCallback);
113
+
114
+ return { ...callback, ...buildLegacyOracleCallbacks(this) };
93
115
  }
94
116
 
95
117
  // eslint-disable-next-line camelcase
@@ -105,14 +127,14 @@ export class Oracle {
105
127
  }
106
128
 
107
129
  // eslint-disable-next-line camelcase
108
- aztec_prv_storeInExecutionCache(values: ACVMField[], [hash]: ACVMField[]): Promise<ACVMField[]> {
109
- this.handlerAsPrivate().storeInExecutionCache(values.map(Fr.fromString), Fr.fromString(hash));
130
+ aztec_prv_setHashPreimage(values: ACVMField[], [hash]: ACVMField[]): Promise<ACVMField[]> {
131
+ this.handlerAsPrivate().setHashPreimage(values.map(Fr.fromString), Fr.fromString(hash));
110
132
  return Promise.resolve([]);
111
133
  }
112
134
 
113
135
  // eslint-disable-next-line camelcase
114
- async aztec_prv_loadFromExecutionCache([returnsHash]: ACVMField[]): Promise<ACVMField[][]> {
115
- const values = await this.handlerAsPrivate().loadFromExecutionCache(Fr.fromString(returnsHash));
136
+ async aztec_prv_getHashPreimage([returnsHash]: ACVMField[]): Promise<ACVMField[][]> {
137
+ const values = await this.handlerAsPrivate().getHashPreimage(Fr.fromString(returnsHash));
116
138
  return [values.map(toACVMField)];
117
139
  }
118
140
 
@@ -249,9 +271,9 @@ export class Oracle {
249
271
  }
250
272
 
251
273
  // eslint-disable-next-line camelcase
252
- async aztec_utl_tryGetPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
274
+ async aztec_utl_getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
253
275
  const parsedAddress = AztecAddress.fromField(Fr.fromString(address));
254
- const result = await this.handlerAsUtility().tryGetPublicKeysAndPartialAddress(parsedAddress);
276
+ const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(parsedAddress);
255
277
 
256
278
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
257
279
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
@@ -377,8 +399,8 @@ export class Oracle {
377
399
  }
378
400
 
379
401
  // eslint-disable-next-line camelcase
380
- async aztec_utl_checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
381
- const exists = await this.handlerAsUtility().checkNullifierExists(Fr.fromString(innerNullifier));
402
+ async aztec_utl_doesNullifierExist([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
403
+ const exists = await this.handlerAsUtility().doesNullifierExist(Fr.fromString(innerNullifier));
382
404
  return [toACVMField(exists)];
383
405
  }
384
406
 
@@ -397,13 +419,13 @@ export class Oracle {
397
419
  }
398
420
 
399
421
  // eslint-disable-next-line camelcase
400
- async aztec_utl_storageRead(
422
+ async aztec_utl_getFromPublicStorage(
401
423
  [blockHash]: ACVMField[],
402
424
  [contractAddress]: ACVMField[],
403
425
  [startStorageSlot]: ACVMField[],
404
426
  [numberOfElements]: ACVMField[],
405
427
  ): Promise<ACVMField[][]> {
406
- const values = await this.handlerAsUtility().storageRead(
428
+ const values = await this.handlerAsUtility().getFromPublicStorage(
407
429
  BlockHash.fromString(blockHash),
408
430
  new AztecAddress(Fr.fromString(contractAddress)),
409
431
  Fr.fromString(startStorageSlot),
@@ -461,8 +483,8 @@ export class Oracle {
461
483
  }
462
484
 
463
485
  // eslint-disable-next-line camelcase
464
- async aztec_prv_validatePublicCalldata([calldataHash]: ACVMField[]): Promise<ACVMField[]> {
465
- await this.handlerAsPrivate().validatePublicCalldata(Fr.fromString(calldataHash));
486
+ async aztec_prv_assertValidPublicCalldata([calldataHash]: ACVMField[]): Promise<ACVMField[]> {
487
+ await this.handlerAsPrivate().assertValidPublicCalldata(Fr.fromString(calldataHash));
466
488
  return [];
467
489
  }
468
490
 
@@ -473,8 +495,10 @@ export class Oracle {
473
495
  }
474
496
 
475
497
  // eslint-disable-next-line camelcase
476
- async aztec_prv_inRevertiblePhase([sideEffectCounter]: ACVMField[]): Promise<ACVMField[]> {
477
- const isRevertible = await this.handlerAsPrivate().inRevertiblePhase(Fr.fromString(sideEffectCounter).toNumber());
498
+ async aztec_prv_isExecutionInRevertiblePhase([sideEffectCounter]: ACVMField[]): Promise<ACVMField[]> {
499
+ const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(
500
+ Fr.fromString(sideEffectCounter).toNumber(),
501
+ );
478
502
  return Promise.resolve([toACVMField(isRevertible)]);
479
503
  }
480
504
 
@@ -488,8 +512,14 @@ export class Oracle {
488
512
  }
489
513
 
490
514
  // eslint-disable-next-line camelcase
491
- async aztec_utl_fetchTaggedLogs([pendingTaggedLogArrayBaseSlot]: ACVMField[]): Promise<ACVMField[]> {
492
- await this.handlerAsUtility().fetchTaggedLogs(Fr.fromString(pendingTaggedLogArrayBaseSlot));
515
+ async aztec_utl_getPendingTaggedLogs(
516
+ [pendingTaggedLogArrayBaseSlot]: ACVMField[],
517
+ [scope]: ACVMField[],
518
+ ): Promise<ACVMField[]> {
519
+ await this.handlerAsUtility().getPendingTaggedLogs(
520
+ Fr.fromString(pendingTaggedLogArrayBaseSlot),
521
+ AztecAddress.fromString(scope),
522
+ );
493
523
  return [];
494
524
  }
495
525
 
@@ -500,6 +530,7 @@ export class Oracle {
500
530
  [eventValidationRequestsArrayBaseSlot]: ACVMField[],
501
531
  [maxNotePackedLen]: ACVMField[],
502
532
  [maxEventSerializedLen]: ACVMField[],
533
+ [scope]: ACVMField[],
503
534
  ): Promise<ACVMField[]> {
504
535
  await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(
505
536
  AztecAddress.fromString(contractAddress),
@@ -507,48 +538,71 @@ export class Oracle {
507
538
  Fr.fromString(eventValidationRequestsArrayBaseSlot),
508
539
  Fr.fromString(maxNotePackedLen).toNumber(),
509
540
  Fr.fromString(maxEventSerializedLen).toNumber(),
541
+ AztecAddress.fromString(scope),
510
542
  );
511
543
 
512
544
  return [];
513
545
  }
514
546
 
515
547
  // eslint-disable-next-line camelcase
516
- async aztec_utl_bulkRetrieveLogs(
548
+ async aztec_utl_getLogsByTag(
517
549
  [contractAddress]: ACVMField[],
518
550
  [logRetrievalRequestsArrayBaseSlot]: ACVMField[],
519
551
  [logRetrievalResponsesArrayBaseSlot]: ACVMField[],
552
+ [scope]: ACVMField[],
520
553
  ): Promise<ACVMField[]> {
521
- await this.handlerAsUtility().bulkRetrieveLogs(
554
+ await this.handlerAsUtility().getLogsByTag(
522
555
  AztecAddress.fromString(contractAddress),
523
556
  Fr.fromString(logRetrievalRequestsArrayBaseSlot),
524
557
  Fr.fromString(logRetrievalResponsesArrayBaseSlot),
558
+ AztecAddress.fromString(scope),
559
+ );
560
+ return [];
561
+ }
562
+
563
+ // eslint-disable-next-line camelcase
564
+ async aztec_utl_getMessageContextsByTxHash(
565
+ [contractAddress]: ACVMField[],
566
+ [messageContextRequestsArrayBaseSlot]: ACVMField[],
567
+ [messageContextResponsesArrayBaseSlot]: ACVMField[],
568
+ [scope]: ACVMField[],
569
+ ): Promise<ACVMField[]> {
570
+ await this.handlerAsUtility().getMessageContextsByTxHash(
571
+ AztecAddress.fromString(contractAddress),
572
+ Fr.fromString(messageContextRequestsArrayBaseSlot),
573
+ Fr.fromString(messageContextResponsesArrayBaseSlot),
574
+ AztecAddress.fromString(scope),
525
575
  );
526
576
  return [];
527
577
  }
528
578
 
529
579
  // eslint-disable-next-line camelcase
530
- async aztec_utl_storeCapsule(
580
+ aztec_utl_setCapsule(
531
581
  [contractAddress]: ACVMField[],
532
582
  [slot]: ACVMField[],
533
583
  capsule: ACVMField[],
584
+ [scope]: ACVMField[],
534
585
  ): Promise<ACVMField[]> {
535
- await this.handlerAsUtility().storeCapsule(
586
+ this.handlerAsUtility().setCapsule(
536
587
  AztecAddress.fromField(Fr.fromString(contractAddress)),
537
588
  Fr.fromString(slot),
538
589
  capsule.map(Fr.fromString),
590
+ AztecAddress.fromField(Fr.fromString(scope)),
539
591
  );
540
- return [];
592
+ return Promise.resolve([]);
541
593
  }
542
594
 
543
595
  // eslint-disable-next-line camelcase
544
- async aztec_utl_loadCapsule(
596
+ async aztec_utl_getCapsule(
545
597
  [contractAddress]: ACVMField[],
546
598
  [slot]: ACVMField[],
547
599
  [tSize]: ACVMField[],
600
+ [scope]: ACVMField[],
548
601
  ): Promise<(ACVMField | ACVMField[])[]> {
549
- const values = await this.handlerAsUtility().loadCapsule(
602
+ const values = await this.handlerAsUtility().getCapsule(
550
603
  AztecAddress.fromField(Fr.fromString(contractAddress)),
551
604
  Fr.fromString(slot),
605
+ AztecAddress.fromField(Fr.fromString(scope)),
552
606
  );
553
607
 
554
608
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
@@ -563,12 +617,17 @@ export class Oracle {
563
617
  }
564
618
 
565
619
  // eslint-disable-next-line camelcase
566
- async aztec_utl_deleteCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[]): Promise<ACVMField[]> {
567
- await this.handlerAsUtility().deleteCapsule(
620
+ aztec_utl_deleteCapsule(
621
+ [contractAddress]: ACVMField[],
622
+ [slot]: ACVMField[],
623
+ [scope]: ACVMField[],
624
+ ): Promise<ACVMField[]> {
625
+ this.handlerAsUtility().deleteCapsule(
568
626
  AztecAddress.fromField(Fr.fromString(contractAddress)),
569
627
  Fr.fromString(slot),
628
+ AztecAddress.fromField(Fr.fromString(scope)),
570
629
  );
571
- return [];
630
+ return Promise.resolve([]);
572
631
  }
573
632
 
574
633
  // eslint-disable-next-line camelcase
@@ -577,18 +636,20 @@ export class Oracle {
577
636
  [srcSlot]: ACVMField[],
578
637
  [dstSlot]: ACVMField[],
579
638
  [numEntries]: ACVMField[],
639
+ [scope]: ACVMField[],
580
640
  ): Promise<ACVMField[]> {
581
641
  await this.handlerAsUtility().copyCapsule(
582
642
  AztecAddress.fromField(Fr.fromString(contractAddress)),
583
643
  Fr.fromString(srcSlot),
584
644
  Fr.fromString(dstSlot),
585
645
  Fr.fromString(numEntries).toNumber(),
646
+ AztecAddress.fromField(Fr.fromString(scope)),
586
647
  );
587
648
  return [];
588
649
  }
589
650
 
590
651
  // eslint-disable-next-line camelcase
591
- async aztec_utl_aes128Decrypt(
652
+ async aztec_utl_decryptAes128(
592
653
  ciphertextBVecStorage: ACVMField[],
593
654
  [ciphertextLength]: ACVMField[],
594
655
  iv: ACVMField[],
@@ -598,8 +659,15 @@ export class Oracle {
598
659
  const ivBuffer = fromUintArray(iv, 8);
599
660
  const symKeyBuffer = fromUintArray(symKey, 8);
600
661
 
601
- const plaintext = await this.handlerAsUtility().aes128Decrypt(ciphertext, ivBuffer, symKeyBuffer);
602
- return bufferToBoundedVec(plaintext, ciphertextBVecStorage.length);
662
+ // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
663
+ try {
664
+ const plaintext = await this.handlerAsUtility().decryptAes128(ciphertext, ivBuffer, symKeyBuffer);
665
+ const [storage, length] = bufferToBoundedVec(plaintext, ciphertextBVecStorage.length);
666
+ return [toACVMField(1), storage, length];
667
+ } catch {
668
+ const zeroStorage = Array(ciphertextBVecStorage.length).fill(toACVMField(0));
669
+ return [toACVMField(0), zeroStorage, toACVMField(0)];
670
+ }
603
671
  }
604
672
 
605
673
  // eslint-disable-next-line camelcase
@@ -608,17 +676,33 @@ export class Oracle {
608
676
  [ephPKField0]: ACVMField[],
609
677
  [ephPKField1]: ACVMField[],
610
678
  [ephPKField2]: ACVMField[],
679
+ [contractAddress]: ACVMField[],
611
680
  ): Promise<ACVMField[]> {
612
681
  const secret = await this.handlerAsUtility().getSharedSecret(
613
682
  AztecAddress.fromField(Fr.fromString(address)),
614
683
  Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(Fr.fromString)),
684
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
615
685
  );
616
- return secret.toFields().map(toACVMField);
686
+ return [toACVMField(secret)];
687
+ }
688
+
689
+ // eslint-disable-next-line camelcase
690
+ aztec_utl_setContractSyncCacheInvalid(
691
+ [contractAddress]: ACVMField[],
692
+ scopes: ACVMField[],
693
+ [scopeCount]: ACVMField[],
694
+ ): Promise<ACVMField[]> {
695
+ const scopeAddresses = scopes.slice(0, +scopeCount).map(s => AztecAddress.fromField(Fr.fromString(s)));
696
+ this.handlerAsUtility().setContractSyncCacheInvalid(
697
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
698
+ scopeAddresses,
699
+ );
700
+ return Promise.resolve([]);
617
701
  }
618
702
 
619
703
  // eslint-disable-next-line camelcase
620
704
  async aztec_utl_emitOffchainEffect(data: ACVMField[]) {
621
- await this.handlerAsPrivate().emitOffchainEffect(data.map(Fr.fromString));
705
+ await this.handlerAsUtility().emitOffchainEffect(data.map(Fr.fromString));
622
706
  return [];
623
707
  }
624
708
 
@@ -76,12 +76,12 @@ export async function executePrivateFunction(
76
76
 
77
77
  const contractClassLogs = privateExecutionOracle.getContractClassLogs();
78
78
 
79
- const rawReturnValues = await privateExecutionOracle.loadFromExecutionCache(publicInputs.returnsHash);
79
+ const rawReturnValues = await privateExecutionOracle.getHashPreimage(publicInputs.returnsHash);
80
80
 
81
81
  const newNotes = privateExecutionOracle.getNewNotes();
82
82
  const noteHashNullifierCounterMap = privateExecutionOracle.getNoteHashNullifierCounterMap();
83
83
  const offchainEffects = privateExecutionOracle.getOffchainEffects();
84
- const preTags = privateExecutionOracle.getUsedPreTags();
84
+ const taggingIndexRanges = privateExecutionOracle.getUsedTaggingIndexRanges();
85
85
  const nestedExecutionResults = privateExecutionOracle.getNestedExecutionResults();
86
86
 
87
87
  let timerSubtractionList = nestedExecutionResults;
@@ -103,8 +103,8 @@ export async function executePrivateFunction(
103
103
  newNotes,
104
104
  noteHashNullifierCounterMap,
105
105
  rawReturnValues,
106
- offchainEffects,
107
- preTags,
106
+ offchainEffects.map(e => ({ data: e.data })),
107
+ taggingIndexRanges,
108
108
  nestedExecutionResults,
109
109
  contractClassLogs,
110
110
  {
@@ -14,7 +14,7 @@ import {
14
14
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
15
15
  import { siloNullifier } from '@aztec/stdlib/hash';
16
16
  import { PrivateContextInputs } from '@aztec/stdlib/kernel';
17
- import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
17
+ import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
18
18
  import { Tag } from '@aztec/stdlib/logs';
19
19
  import { Note, type NoteStatus } from '@aztec/stdlib/note';
20
20
  import {
@@ -25,8 +25,6 @@ import {
25
25
  type TxContext,
26
26
  } from '@aztec/stdlib/tx';
27
27
 
28
- import type { AccessScopes } from '../../access_scopes.js';
29
- import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
30
28
  import { NoteService } from '../../notes/note_service.js';
31
29
  import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js';
32
30
  import { syncSenderTaggingIndexes } from '../../tagging/index.js';
@@ -44,12 +42,11 @@ export type PrivateExecutionOracleArgs = Omit<UtilityExecutionOracleArgs, 'contr
44
42
  txContext: TxContext;
45
43
  callContext: CallContext;
46
44
  /** Needed to trigger contract synchronization before nested calls */
47
- utilityExecutor: (call: FunctionCall, scopes: AccessScopes) => Promise<void>;
45
+ utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
48
46
  executionCache: HashedValuesCache;
49
47
  noteCache: ExecutionNoteCache;
50
48
  taggingIndexCache: ExecutionTaggingIndexCache;
51
49
  senderTaggingStore: SenderTaggingStore;
52
- contractSyncService: ContractSyncService;
53
50
  totalPublicCalldataCount?: number;
54
51
  sideEffectCounter?: number;
55
52
  senderForTags?: AztecAddress;
@@ -73,18 +70,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
73
70
  private newNotes: NoteAndSlot[] = [];
74
71
  private noteHashNullifierCounterMap: Map<number, number> = new Map();
75
72
  private contractClassLogs: CountedContractClassLog[] = [];
76
- private offchainEffects: { data: Fr[] }[] = [];
77
73
  private nestedExecutionResults: PrivateCallExecutionResult[] = [];
78
74
 
79
75
  private readonly argsHash: Fr;
80
76
  private readonly txContext: TxContext;
81
77
  private readonly callContext: CallContext;
82
- private readonly utilityExecutor: (call: FunctionCall, scopes: AccessScopes) => Promise<void>;
78
+ private readonly utilityExecutor: (call: FunctionCall, scopes: AztecAddress[]) => Promise<void>;
83
79
  private readonly executionCache: HashedValuesCache;
84
80
  private readonly noteCache: ExecutionNoteCache;
85
81
  private readonly taggingIndexCache: ExecutionTaggingIndexCache;
86
82
  private readonly senderTaggingStore: SenderTaggingStore;
87
- private readonly contractSyncService: ContractSyncService;
88
83
  private totalPublicCalldataCount: number;
89
84
  protected sideEffectCounter: number;
90
85
  private senderForTags?: AztecAddress;
@@ -104,7 +99,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
104
99
  this.noteCache = args.noteCache;
105
100
  this.taggingIndexCache = args.taggingIndexCache;
106
101
  this.senderTaggingStore = args.senderTaggingStore;
107
- this.contractSyncService = args.contractSyncService;
108
102
  this.totalPublicCalldataCount = args.totalPublicCalldataCount ?? 0;
109
103
  this.sideEffectCounter = args.sideEffectCounter ?? 0;
110
104
  this.senderForTags = args.senderForTags;
@@ -159,17 +153,10 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
159
153
  }
160
154
 
161
155
  /**
162
- * Return the offchain effects emitted during this execution.
156
+ * Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
163
157
  */
164
- public getOffchainEffects() {
165
- return this.offchainEffects;
166
- }
167
-
168
- /**
169
- * Returns the pre-tags that were used in this execution (and that need to be stored in the db).
170
- */
171
- public getUsedPreTags(): PreTag[] {
172
- return this.taggingIndexCache.getUsedPreTags();
158
+ public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
159
+ return this.taggingIndexCache.getUsedTaggingIndexRanges();
173
160
  }
174
161
 
175
162
  /**
@@ -222,6 +209,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
222
209
  recipient,
223
210
  );
224
211
 
212
+ if (!extendedSecret) {
213
+ // We'd only fail to compute an extended secret if the recipient is an invalid address. To prevent
214
+ // king-of-the-hill attacks, instead of failing we use a random tag. By including a correct-looking tag in the
215
+ // log, the transaction shape is preserved and no privacy is leaked, even if the tag is bogus.
216
+ this.logger.warn(`Computing a tag for invalid recipient ${recipient} - returning a random tag instead`, {
217
+ contractAddress: this.contractAddress,
218
+ });
219
+ return new Tag(Fr.random());
220
+ }
221
+
225
222
  const index = await this.#getIndexToUseForSecret(extendedSecret);
226
223
  this.logger.debug(
227
224
  `Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`,
@@ -277,7 +274,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
277
274
  * @param values - Values to store.
278
275
  * @returns The hash of the values.
279
276
  */
280
- public storeInExecutionCache(values: Fr[], hash: Fr) {
277
+ public setHashPreimage(values: Fr[], hash: Fr) {
281
278
  return this.executionCache.store(values, hash);
282
279
  }
283
280
 
@@ -286,7 +283,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
286
283
  * @param hash - Hash of the values.
287
284
  * @returns The values.
288
285
  */
289
- public loadFromExecutionCache(hash: Fr): Promise<Fr[]> {
286
+ public getHashPreimage(hash: Fr): Promise<Fr[]> {
290
287
  const preimage = this.executionCache.getPreimage(hash);
291
288
  if (!preimage) {
292
289
  throw new Error(`Preimage for hash ${hash.toString()} not found in cache`);
@@ -294,7 +291,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
294
291
  return Promise.resolve(preimage);
295
292
  }
296
293
 
297
- override async checkNullifierExists(innerNullifier: Fr): Promise<boolean> {
294
+ override async doesNullifierExist(innerNullifier: Fr): Promise<boolean> {
298
295
  // This oracle must be overridden because while utility execution can only meaningfully check if a nullifier exists
299
296
  // in the synched block, during private execution there's also the possibility of it being pending, i.e. created
300
297
  // in the current transaction.
@@ -307,7 +304,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
307
304
 
308
305
  return (
309
306
  this.noteCache.getNullifiers(this.contractAddress).has(nullifier) ||
310
- (await super.checkNullifierExists(innerNullifier))
307
+ (await super.doesNullifierExist(innerNullifier))
311
308
  );
312
309
  }
313
310
 
@@ -567,8 +564,9 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
567
564
  senderTaggingStore: this.senderTaggingStore,
568
565
  recipientTaggingStore: this.recipientTaggingStore,
569
566
  senderAddressBookStore: this.senderAddressBookStore,
570
- capsuleStore: this.capsuleStore,
567
+ capsuleService: this.capsuleService,
571
568
  privateEventStore: this.privateEventStore,
569
+ messageContextService: this.messageContextService,
572
570
  contractSyncService: this.contractSyncService,
573
571
  jobId: this.jobId,
574
572
  totalPublicCalldataCount: this.totalPublicCalldataCount,
@@ -609,7 +607,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
609
607
  }
610
608
 
611
609
  /** Validates the calldata preimage exists in the cache and checks cumulative calldata size is within limits. */
612
- public validatePublicCalldata(calldataHash: Fr) {
610
+ public assertValidPublicCalldata(calldataHash: Fr) {
613
611
  const calldata = this.executionCache.getPreimage(calldataHash);
614
612
  if (!calldata) {
615
613
  throw new Error('Calldata for public call not found in cache');
@@ -626,7 +624,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
626
624
  return this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
627
625
  }
628
626
 
629
- public inRevertiblePhase(sideEffectCounter: number): Promise<boolean> {
627
+ public isExecutionInRevertiblePhase(sideEffectCounter: number): Promise<boolean> {
630
628
  return Promise.resolve(this.noteCache.isSideEffectCounterRevertible(sideEffectCounter));
631
629
  }
632
630
 
@@ -653,9 +651,4 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
653
651
  public getDebugFunctionName() {
654
652
  return this.contractStore.getDebugFunctionName(this.contractAddress, this.callContext.functionSelector);
655
653
  }
656
-
657
- public emitOffchainEffect(data: Fr[]): Promise<void> {
658
- this.offchainEffects.push({ data });
659
- return Promise.resolve();
660
- }
661
654
  }