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