@aztec/pxe 0.0.1-commit.87a0206 → 0.0.1-commit.88c5703d4
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/config/index.d.ts +2 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -1
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +60 -30
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +183 -72
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
- package/dest/contract_function_simulator/index.d.ts +2 -1
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +2 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +5 -4
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +1 -3
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts +16 -0
- package/dest/contract_function_simulator/noir-structs/message_tx_context.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/message_tx_context.js +57 -0
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +2 -4
- 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 +3 -5
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +49 -45
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +52 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +44 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +143 -94
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +56 -79
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +99 -84
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -43
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +137 -75
- 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 +4 -2
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +34 -19
- package/dest/contract_sync/helpers.d.ts +3 -2
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +3 -3
- package/dest/debug/pxe_debug_utils.d.ts +5 -4
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +4 -4
- 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 +9 -1
- 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 +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +9 -1
- package/dest/entrypoints/server/index.d.ts +3 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -0
- package/dest/entrypoints/server/utils.js +9 -1
- package/dest/logs/log_service.d.ts +3 -2
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +9 -14
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +36 -0
- package/dest/notes/note_service.d.ts +4 -3
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +3 -2
- 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 +2 -2
- package/dest/oracle_version.js +3 -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 +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +203 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +19 -11
- package/dest/private_kernel/private_kernel_oracle.d.ts +6 -2
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +7 -3
- package/dest/pxe.d.ts +61 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +91 -65
- package/dest/storage/contract_store/contract_store.d.ts +42 -15
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +140 -64
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +3 -3
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +3 -4
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
- package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +17 -3
- package/dest/tagging/index.d.ts +3 -3
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
- 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 +7 -7
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
- 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 +12 -11
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
- 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 +20 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
- 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 +36 -24
- package/package.json +16 -16
- package/src/access_scopes.ts +9 -0
- package/src/config/index.ts +1 -1
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +335 -133
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
- package/src/contract_function_simulator/index.ts +1 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +8 -5
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +1 -4
- package/src/contract_function_simulator/noir-structs/message_tx_context.ts +55 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +3 -6
- package/src/contract_function_simulator/oracle/interfaces.ts +53 -54
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +77 -0
- package/src/contract_function_simulator/oracle/oracle.ts +156 -138
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +125 -176
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +210 -82
- package/src/contract_logging.ts +39 -0
- package/src/contract_sync/contract_sync_service.ts +49 -26
- package/src/contract_sync/helpers.ts +7 -2
- package/src/debug/pxe_debug_utils.ts +11 -9
- package/src/entrypoints/client/bundle/index.ts +3 -0
- package/src/entrypoints/client/bundle/utils.ts +9 -1
- package/src/entrypoints/client/lazy/index.ts +3 -0
- package/src/entrypoints/client/lazy/utils.ts +9 -1
- package/src/entrypoints/server/index.ts +2 -0
- package/src/entrypoints/server/utils.ts +7 -7
- package/src/logs/log_service.ts +17 -24
- package/src/messages/message_context_service.ts +45 -0
- package/src/notes/note_service.ts +4 -3
- package/src/notes_filter.ts +26 -0
- package/src/oracle_version.ts +3 -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 +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
- package/src/private_kernel/hints/test_utils.ts +325 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +19 -12
- package/src/private_kernel/private_kernel_oracle.ts +7 -7
- package/src/pxe.ts +164 -109
- package/src/storage/contract_store/contract_store.ts +170 -71
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +8 -5
- package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/get_all_logs_by_tags.ts +28 -4
- package/src/tagging/index.ts +2 -2
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +7 -10
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +23 -10
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -26
- 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
|
@@ -3,25 +3,29 @@ import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
|
3
3
|
import { Aes128 } from '@aztec/foundation/crypto/aes128';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
6
|
-
import { LogLevels,
|
|
6
|
+
import { LogLevels, type Logger, createLogger } from '@aztec/foundation/log';
|
|
7
7
|
import type { MembershipWitness } from '@aztec/foundation/trees';
|
|
8
8
|
import type { KeyStore } from '@aztec/key-store';
|
|
9
|
+
import { isProtocolContract } from '@aztec/protocol-contracts';
|
|
9
10
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
10
11
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
11
12
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
12
|
-
import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
|
|
13
|
+
import type { CompleteAddress, ContractInstance, PartialAddress } from '@aztec/stdlib/contract';
|
|
13
14
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
14
15
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
15
16
|
import type { KeyValidationRequest } from '@aztec/stdlib/kernel';
|
|
16
|
-
import { computeAddressSecret } from '@aztec/stdlib/keys';
|
|
17
|
+
import { type PublicKeys, computeAddressSecret } from '@aztec/stdlib/keys';
|
|
17
18
|
import { deriveEcdhSharedSecret } from '@aztec/stdlib/logs';
|
|
18
19
|
import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
|
|
19
20
|
import type { NoteStatus } from '@aztec/stdlib/note';
|
|
20
21
|
import { MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
21
|
-
import type { BlockHeader, Capsule } from '@aztec/stdlib/tx';
|
|
22
|
+
import type { BlockHeader, Capsule, OffchainEffect } from '@aztec/stdlib/tx';
|
|
22
23
|
|
|
24
|
+
import type { AccessScopes } from '../../access_scopes.js';
|
|
25
|
+
import { createContractLogger, logContractMessage } from '../../contract_logging.js';
|
|
23
26
|
import { EventService } from '../../events/event_service.js';
|
|
24
27
|
import { LogService } from '../../logs/log_service.js';
|
|
28
|
+
import { MessageContextService } from '../../messages/message_context_service.js';
|
|
25
29
|
import { NoteService } from '../../notes/note_service.js';
|
|
26
30
|
import { ORACLE_VERSION } from '../../oracle_version.js';
|
|
27
31
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
@@ -34,12 +38,35 @@ import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_
|
|
|
34
38
|
import { EventValidationRequest } from '../noir-structs/event_validation_request.js';
|
|
35
39
|
import { LogRetrievalRequest } from '../noir-structs/log_retrieval_request.js';
|
|
36
40
|
import { LogRetrievalResponse } from '../noir-structs/log_retrieval_response.js';
|
|
41
|
+
import { MessageTxContext } from '../noir-structs/message_tx_context.js';
|
|
37
42
|
import { NoteValidationRequest } from '../noir-structs/note_validation_request.js';
|
|
38
43
|
import { UtilityContext } from '../noir-structs/utility_context.js';
|
|
39
44
|
import { pickNotes } from '../pick_notes.js';
|
|
40
45
|
import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
|
|
41
46
|
import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
|
|
42
47
|
|
|
48
|
+
/** Args for UtilityExecutionOracle constructor. */
|
|
49
|
+
export type UtilityExecutionOracleArgs = {
|
|
50
|
+
contractAddress: AztecAddress;
|
|
51
|
+
/** List of transient auth witnesses to be used during this simulation */
|
|
52
|
+
authWitnesses: AuthWitness[];
|
|
53
|
+
capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
|
|
54
|
+
anchorBlockHeader: BlockHeader;
|
|
55
|
+
contractStore: ContractStore;
|
|
56
|
+
noteStore: NoteStore;
|
|
57
|
+
keyStore: KeyStore;
|
|
58
|
+
addressStore: AddressStore;
|
|
59
|
+
aztecNode: AztecNode;
|
|
60
|
+
recipientTaggingStore: RecipientTaggingStore;
|
|
61
|
+
senderAddressBookStore: SenderAddressBookStore;
|
|
62
|
+
capsuleStore: CapsuleStore;
|
|
63
|
+
privateEventStore: PrivateEventStore;
|
|
64
|
+
messageContextService: MessageContextService;
|
|
65
|
+
jobId: string;
|
|
66
|
+
log?: ReturnType<typeof createLogger>;
|
|
67
|
+
scopes: AccessScopes;
|
|
68
|
+
};
|
|
69
|
+
|
|
43
70
|
/**
|
|
44
71
|
* The oracle for an execution of utility contract functions.
|
|
45
72
|
*/
|
|
@@ -47,39 +74,73 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
47
74
|
isMisc = true as const;
|
|
48
75
|
isUtility = true as const;
|
|
49
76
|
|
|
50
|
-
private
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
private contractLogger: Logger | undefined;
|
|
78
|
+
private offchainEffects: OffchainEffect[] = [];
|
|
79
|
+
|
|
80
|
+
protected readonly contractAddress: AztecAddress;
|
|
81
|
+
protected readonly authWitnesses: AuthWitness[];
|
|
82
|
+
protected readonly capsules: Capsule[];
|
|
83
|
+
protected readonly anchorBlockHeader: BlockHeader;
|
|
84
|
+
protected readonly contractStore: ContractStore;
|
|
85
|
+
protected readonly noteStore: NoteStore;
|
|
86
|
+
protected readonly keyStore: KeyStore;
|
|
87
|
+
protected readonly addressStore: AddressStore;
|
|
88
|
+
protected readonly aztecNode: AztecNode;
|
|
89
|
+
protected readonly recipientTaggingStore: RecipientTaggingStore;
|
|
90
|
+
protected readonly senderAddressBookStore: SenderAddressBookStore;
|
|
91
|
+
protected readonly capsuleStore: CapsuleStore;
|
|
92
|
+
protected readonly privateEventStore: PrivateEventStore;
|
|
93
|
+
protected readonly messageContextService: MessageContextService;
|
|
94
|
+
protected readonly jobId: string;
|
|
95
|
+
protected logger: ReturnType<typeof createLogger>;
|
|
96
|
+
protected readonly scopes: AccessScopes;
|
|
97
|
+
|
|
98
|
+
constructor(args: UtilityExecutionOracleArgs) {
|
|
99
|
+
this.contractAddress = args.contractAddress;
|
|
100
|
+
this.authWitnesses = args.authWitnesses;
|
|
101
|
+
this.capsules = args.capsules;
|
|
102
|
+
this.anchorBlockHeader = args.anchorBlockHeader;
|
|
103
|
+
this.contractStore = args.contractStore;
|
|
104
|
+
this.noteStore = args.noteStore;
|
|
105
|
+
this.keyStore = args.keyStore;
|
|
106
|
+
this.addressStore = args.addressStore;
|
|
107
|
+
this.aztecNode = args.aztecNode;
|
|
108
|
+
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
109
|
+
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
110
|
+
this.capsuleStore = args.capsuleStore;
|
|
111
|
+
this.privateEventStore = args.privateEventStore;
|
|
112
|
+
this.messageContextService = args.messageContextService;
|
|
113
|
+
this.jobId = args.jobId;
|
|
114
|
+
this.logger = args.log ?? createLogger('simulator:client_view_context');
|
|
115
|
+
this.scopes = args.scopes;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public assertCompatibleOracleVersion(version: number): void {
|
|
119
|
+
// TODO(F-416): Remove this hack on v5 when protocol contracts are redeployed.
|
|
120
|
+
// Protocol contracts/canonical contracts shipped with committed bytecode that cannot be changed. Assert they use
|
|
121
|
+
// the expected pinned version or the current one. We want to allow for both the pinned and the current versions
|
|
122
|
+
// because we want this code to work with both the pinned and unpinned version since some branches do not have the
|
|
123
|
+
// pinned contracts (like e.g. next)
|
|
124
|
+
const LEGACY_ORACLE_VERSION = 12;
|
|
125
|
+
if (isProtocolContract(this.contractAddress)) {
|
|
126
|
+
if (version !== LEGACY_ORACLE_VERSION && version !== ORACLE_VERSION) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
`Expected legacy oracle version ${LEGACY_ORACLE_VERSION} or current oracle version ${ORACLE_VERSION} for alpha payload contract at ${this.contractAddress}, got ${version}.`,
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
73
134
|
if (version !== ORACLE_VERSION) {
|
|
74
135
|
throw new Error(`Incompatible oracle version. Expected version ${ORACLE_VERSION}, got ${version}.`);
|
|
75
136
|
}
|
|
76
137
|
}
|
|
77
138
|
|
|
78
|
-
public
|
|
139
|
+
public getRandomField(): Fr {
|
|
79
140
|
return Fr.random();
|
|
80
141
|
}
|
|
81
142
|
|
|
82
|
-
public
|
|
143
|
+
public getUtilityContext(): UtilityContext {
|
|
83
144
|
return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
|
|
84
145
|
}
|
|
85
146
|
|
|
@@ -90,12 +151,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
90
151
|
* @throws If the keys are not registered in the key store.
|
|
91
152
|
* @throws If scopes are defined and the account is not in the scopes.
|
|
92
153
|
*/
|
|
93
|
-
public async
|
|
94
|
-
// If scopes are defined, check that the key belongs to an account in the scopes
|
|
95
|
-
if (this.scopes && this.scopes.length > 0) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
154
|
+
public async getKeyValidationRequest(pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
155
|
+
// If scopes are defined, check that the key belongs to an account in the scopes.
|
|
156
|
+
if (this.scopes !== 'ALL_SCOPES' && this.scopes.length > 0) {
|
|
157
|
+
let hasAccess = false;
|
|
158
|
+
for (let i = 0; i < this.scopes.length && !hasAccess; i++) {
|
|
159
|
+
if (await this.keyStore.accountHasKey(this.scopes[i], pkMHash)) {
|
|
160
|
+
hasAccess = true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (!hasAccess) {
|
|
164
|
+
throw new Error(`Key validation request denied: no scoped account has a key with hash ${pkMHash.toString()}.`);
|
|
99
165
|
}
|
|
100
166
|
}
|
|
101
167
|
return this.keyStore.getKeyValidationRequest(pkMHash, this.contractAddress);
|
|
@@ -108,7 +174,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
108
174
|
* @param noteHash - The note hash to find in the note hash tree.
|
|
109
175
|
* @returns The membership witness containing the leaf index and sibling path
|
|
110
176
|
*/
|
|
111
|
-
public
|
|
177
|
+
public getNoteHashMembershipWitness(
|
|
112
178
|
anchorBlockHash: BlockHash,
|
|
113
179
|
noteHash: Fr,
|
|
114
180
|
): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
|
|
@@ -126,7 +192,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
126
192
|
* @param blockHash - The block hash to find in the archive tree.
|
|
127
193
|
* @returns The membership witness containing the leaf index and sibling path
|
|
128
194
|
*/
|
|
129
|
-
public
|
|
195
|
+
public getBlockHashMembershipWitness(
|
|
130
196
|
anchorBlockHash: BlockHash,
|
|
131
197
|
blockHash: BlockHash,
|
|
132
198
|
): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
|
|
@@ -139,7 +205,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
139
205
|
* @param nullifier - Nullifier we try to find witness for.
|
|
140
206
|
* @returns The nullifier membership witness (if found).
|
|
141
207
|
*/
|
|
142
|
-
public
|
|
208
|
+
public getNullifierMembershipWitness(
|
|
143
209
|
blockHash: BlockHash,
|
|
144
210
|
nullifier: Fr,
|
|
145
211
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
@@ -155,7 +221,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
155
221
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
156
222
|
* we are trying to prove non-inclusion for.
|
|
157
223
|
*/
|
|
158
|
-
public
|
|
224
|
+
public getLowNullifierMembershipWitness(
|
|
159
225
|
blockHash: BlockHash,
|
|
160
226
|
nullifier: Fr,
|
|
161
227
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
@@ -168,7 +234,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
168
234
|
* @param leafSlot - The slot of the public data tree to get the witness for.
|
|
169
235
|
* @returns - The witness
|
|
170
236
|
*/
|
|
171
|
-
public
|
|
237
|
+
public getPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
172
238
|
return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
|
|
173
239
|
}
|
|
174
240
|
|
|
@@ -177,7 +243,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
177
243
|
* @param blockNumber - The number of a block of which to get the block header.
|
|
178
244
|
* @returns Block extracted from a block with block number `blockNumber`.
|
|
179
245
|
*/
|
|
180
|
-
public async
|
|
246
|
+
public async getBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
|
|
181
247
|
const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
|
|
182
248
|
if (blockNumber > anchorBlockNumber) {
|
|
183
249
|
throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
|
|
@@ -188,12 +254,18 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
188
254
|
}
|
|
189
255
|
|
|
190
256
|
/**
|
|
191
|
-
* Retrieve the
|
|
257
|
+
* Retrieve the public keys and partial address associated to a given address.
|
|
192
258
|
* @param account - The account address.
|
|
193
|
-
* @returns
|
|
259
|
+
* @returns The public keys and partial address, or `undefined` if the account is not registered.
|
|
194
260
|
*/
|
|
195
|
-
public
|
|
196
|
-
|
|
261
|
+
public async tryGetPublicKeysAndPartialAddress(
|
|
262
|
+
account: AztecAddress,
|
|
263
|
+
): Promise<{ publicKeys: PublicKeys; partialAddress: PartialAddress } | undefined> {
|
|
264
|
+
const completeAddress = await this.addressStore.getCompleteAddress(account);
|
|
265
|
+
if (!completeAddress) {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
return { publicKeys: completeAddress.publicKeys, partialAddress: completeAddress.partialAddress };
|
|
197
269
|
}
|
|
198
270
|
|
|
199
271
|
protected async getCompleteAddressOrFail(account: AztecAddress): Promise<CompleteAddress> {
|
|
@@ -212,11 +284,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
212
284
|
* @param address - Address.
|
|
213
285
|
* @returns A contract instance.
|
|
214
286
|
*/
|
|
215
|
-
public
|
|
216
|
-
return this.getContractInstance(address);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
protected async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
287
|
+
public async getContractInstance(address: AztecAddress): Promise<ContractInstance> {
|
|
220
288
|
const instance = await this.contractStore.getContractInstance(address);
|
|
221
289
|
if (!instance) {
|
|
222
290
|
throw new Error(`No contract instance found for address ${address.toString()}`);
|
|
@@ -230,7 +298,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
230
298
|
* @param messageHash - Hash of the message to authenticate.
|
|
231
299
|
* @returns Authentication witness for the requested message hash.
|
|
232
300
|
*/
|
|
233
|
-
public
|
|
301
|
+
public getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined> {
|
|
234
302
|
return Promise.resolve(this.authWitnesses.find(w => w.requestHash.equals(messageHash))?.witness);
|
|
235
303
|
}
|
|
236
304
|
|
|
@@ -256,7 +324,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
256
324
|
* @param status - The status of notes to fetch.
|
|
257
325
|
* @returns Array of note data.
|
|
258
326
|
*/
|
|
259
|
-
public async
|
|
327
|
+
public async getNotes(
|
|
260
328
|
owner: AztecAddress | undefined,
|
|
261
329
|
storageSlot: Fr,
|
|
262
330
|
numSelects: number,
|
|
@@ -296,7 +364,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
296
364
|
* @param innerNullifier - The inner nullifier.
|
|
297
365
|
* @returns A boolean indicating whether the nullifier exists in the tree or not.
|
|
298
366
|
*/
|
|
299
|
-
public async
|
|
367
|
+
public async checkNullifierExists(innerNullifier: Fr) {
|
|
300
368
|
const [nullifier, anchorBlockHash] = await Promise.all([
|
|
301
369
|
siloNullifier(this.contractAddress, innerNullifier!),
|
|
302
370
|
this.anchorBlockHeader.hash(),
|
|
@@ -315,7 +383,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
315
383
|
* @dev Contract address and secret are only used to compute the nullifier to get non-nullified messages
|
|
316
384
|
* @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
|
|
317
385
|
*/
|
|
318
|
-
public async
|
|
386
|
+
public async getL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
|
|
319
387
|
const [messageIndex, siblingPath] = await getNonNullifiedL1ToL2MessageWitness(
|
|
320
388
|
this.aztecNode,
|
|
321
389
|
contractAddress,
|
|
@@ -333,7 +401,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
333
401
|
* @param startStorageSlot - The starting storage slot.
|
|
334
402
|
* @param numberOfElements - Number of elements to read from the starting storage slot.
|
|
335
403
|
*/
|
|
336
|
-
public async
|
|
404
|
+
public async storageRead(
|
|
337
405
|
blockHash: BlockHash,
|
|
338
406
|
contractAddress: AztecAddress,
|
|
339
407
|
startStorageSlot: Fr,
|
|
@@ -347,22 +415,38 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
347
415
|
slots.map(storageSlot => this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot)),
|
|
348
416
|
);
|
|
349
417
|
|
|
350
|
-
this.
|
|
418
|
+
this.logger.debug(
|
|
351
419
|
`Oracle storage read: slots=[${slots.map(slot => slot.toString()).join(', ')}] address=${contractAddress.toString()} values=[${values.join(', ')}]`,
|
|
352
420
|
);
|
|
353
421
|
|
|
354
422
|
return values;
|
|
355
423
|
}
|
|
356
424
|
|
|
357
|
-
|
|
425
|
+
/**
|
|
426
|
+
* Returns a per-contract logger whose output is prefixed with `contract_log::<name>(<addrAbbrev>)`.
|
|
427
|
+
*/
|
|
428
|
+
async #getContractLogger(): Promise<Logger> {
|
|
429
|
+
if (!this.contractLogger) {
|
|
430
|
+
// Purpose of instanceId is to distinguish logs from different instances of the same component. It makes sense
|
|
431
|
+
// to re-use jobId as instanceId here as executions of different PXE jobs are isolated.
|
|
432
|
+
this.contractLogger = await createContractLogger(
|
|
433
|
+
this.contractAddress,
|
|
434
|
+
addr => this.contractStore.getDebugContractName(addr),
|
|
435
|
+
{ instanceId: this.jobId },
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
return this.contractLogger;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
public async log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
358
442
|
if (!LogLevels[level]) {
|
|
359
|
-
throw new Error(`Invalid
|
|
443
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
360
444
|
}
|
|
361
|
-
const
|
|
362
|
-
|
|
445
|
+
const logger = await this.#getContractLogger();
|
|
446
|
+
logContractMessage(logger, LogLevels[level], message, fields);
|
|
363
447
|
}
|
|
364
448
|
|
|
365
|
-
public async
|
|
449
|
+
public async fetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
|
|
366
450
|
const logService = new LogService(
|
|
367
451
|
this.aztecNode,
|
|
368
452
|
this.anchorBlockHeader,
|
|
@@ -372,7 +456,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
372
456
|
this.senderAddressBookStore,
|
|
373
457
|
this.addressStore,
|
|
374
458
|
this.jobId,
|
|
375
|
-
this.
|
|
459
|
+
this.logger.getBindings(),
|
|
376
460
|
);
|
|
377
461
|
|
|
378
462
|
await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
|
|
@@ -388,10 +472,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
388
472
|
* @param noteValidationRequestsArrayBaseSlot - The base slot of capsule array containing note validation requests.
|
|
389
473
|
* @param eventValidationRequestsArrayBaseSlot - The base slot of capsule array containing event validation requests.
|
|
390
474
|
*/
|
|
391
|
-
public async
|
|
475
|
+
public async validateAndStoreEnqueuedNotesAndEvents(
|
|
392
476
|
contractAddress: AztecAddress,
|
|
393
477
|
noteValidationRequestsArrayBaseSlot: Fr,
|
|
394
478
|
eventValidationRequestsArrayBaseSlot: Fr,
|
|
479
|
+
maxNotePackedLen: number,
|
|
480
|
+
maxEventSerializedLen: number,
|
|
395
481
|
) {
|
|
396
482
|
// TODO(#10727): allow other contracts to store notes
|
|
397
483
|
if (!this.contractAddress.equals(contractAddress)) {
|
|
@@ -402,11 +488,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
402
488
|
// faster as we don't need to wait for the network round-trip.
|
|
403
489
|
const noteValidationRequests = (
|
|
404
490
|
await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, this.jobId)
|
|
405
|
-
).map(NoteValidationRequest.fromFields);
|
|
491
|
+
).map(fields => NoteValidationRequest.fromFields(fields, maxNotePackedLen));
|
|
406
492
|
|
|
407
493
|
const eventValidationRequests = (
|
|
408
494
|
await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
|
|
409
|
-
).map(EventValidationRequest.fromFields);
|
|
495
|
+
).map(fields => EventValidationRequest.fromFields(fields, maxEventSerializedLen));
|
|
410
496
|
|
|
411
497
|
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
412
498
|
const noteStorePromises = noteValidationRequests.map(request =>
|
|
@@ -444,7 +530,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
444
530
|
await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
|
|
445
531
|
}
|
|
446
532
|
|
|
447
|
-
public async
|
|
533
|
+
public async bulkRetrieveLogs(
|
|
448
534
|
contractAddress: AztecAddress,
|
|
449
535
|
logRetrievalRequestsArrayBaseSlot: Fr,
|
|
450
536
|
logRetrievalResponsesArrayBaseSlot: Fr,
|
|
@@ -469,7 +555,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
469
555
|
this.senderAddressBookStore,
|
|
470
556
|
this.addressStore,
|
|
471
557
|
this.jobId,
|
|
472
|
-
this.
|
|
558
|
+
this.logger.getBindings(),
|
|
473
559
|
);
|
|
474
560
|
|
|
475
561
|
const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
|
|
@@ -486,7 +572,48 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
486
572
|
);
|
|
487
573
|
}
|
|
488
574
|
|
|
489
|
-
public
|
|
575
|
+
public async utilityResolveMessageContexts(
|
|
576
|
+
contractAddress: AztecAddress,
|
|
577
|
+
messageContextRequestsArrayBaseSlot: Fr,
|
|
578
|
+
messageContextResponsesArrayBaseSlot: Fr,
|
|
579
|
+
) {
|
|
580
|
+
try {
|
|
581
|
+
if (!this.contractAddress.equals(contractAddress)) {
|
|
582
|
+
throw new Error(`Got a message context request from ${contractAddress}, expected ${this.contractAddress}`);
|
|
583
|
+
}
|
|
584
|
+
const requestCapsules = await this.capsuleStore.readCapsuleArray(
|
|
585
|
+
contractAddress,
|
|
586
|
+
messageContextRequestsArrayBaseSlot,
|
|
587
|
+
this.jobId,
|
|
588
|
+
);
|
|
589
|
+
|
|
590
|
+
const txHashes = requestCapsules.map((fields, i) => {
|
|
591
|
+
if (fields.length !== 1) {
|
|
592
|
+
throw new Error(
|
|
593
|
+
`Malformed message context request at index ${i}: expected 1 field (tx hash), got ${fields.length}`,
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
return fields[0];
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
const maybeMessageContexts = await this.messageContextService.resolveMessageContexts(
|
|
600
|
+
txHashes,
|
|
601
|
+
this.anchorBlockHeader.getBlockNumber(),
|
|
602
|
+
);
|
|
603
|
+
|
|
604
|
+
// Leave response in response capsule array.
|
|
605
|
+
await this.capsuleStore.setCapsuleArray(
|
|
606
|
+
contractAddress,
|
|
607
|
+
messageContextResponsesArrayBaseSlot,
|
|
608
|
+
maybeMessageContexts.map(MessageTxContext.toSerializedOption),
|
|
609
|
+
this.jobId,
|
|
610
|
+
);
|
|
611
|
+
} finally {
|
|
612
|
+
await this.capsuleStore.setCapsuleArray(contractAddress, messageContextRequestsArrayBaseSlot, [], this.jobId);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
public storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void> {
|
|
490
617
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
491
618
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
492
619
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -495,7 +622,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
495
622
|
return Promise.resolve();
|
|
496
623
|
}
|
|
497
624
|
|
|
498
|
-
public async
|
|
625
|
+
public async loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
|
|
499
626
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
500
627
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
501
628
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -507,7 +634,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
507
634
|
);
|
|
508
635
|
}
|
|
509
636
|
|
|
510
|
-
public
|
|
637
|
+
public deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void> {
|
|
511
638
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
512
639
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
513
640
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -516,12 +643,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
516
643
|
return Promise.resolve();
|
|
517
644
|
}
|
|
518
645
|
|
|
519
|
-
public
|
|
520
|
-
contractAddress: AztecAddress,
|
|
521
|
-
srcSlot: Fr,
|
|
522
|
-
dstSlot: Fr,
|
|
523
|
-
numEntries: number,
|
|
524
|
-
): Promise<void> {
|
|
646
|
+
public copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void> {
|
|
525
647
|
if (!contractAddress.equals(this.contractAddress)) {
|
|
526
648
|
// TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
|
|
527
649
|
throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
|
|
@@ -530,7 +652,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
530
652
|
}
|
|
531
653
|
|
|
532
654
|
// TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
|
|
533
|
-
public
|
|
655
|
+
public aes128Decrypt(ciphertext: Buffer, iv: Buffer, symKey: Buffer): Promise<Buffer> {
|
|
534
656
|
const aes128 = new Aes128();
|
|
535
657
|
return aes128.decryptBufferCBC(ciphertext, iv, symKey);
|
|
536
658
|
}
|
|
@@ -541,11 +663,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
541
663
|
* @param ephPk - The ephemeral public key to get the secret for.
|
|
542
664
|
* @returns The secret for the given address.
|
|
543
665
|
*/
|
|
544
|
-
public
|
|
545
|
-
return this.getSharedSecret(address, ephPk);
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
protected async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
666
|
+
public async getSharedSecret(address: AztecAddress, ephPk: Point): Promise<Point> {
|
|
549
667
|
// TODO(#12656): return an app-siloed secret
|
|
550
668
|
const recipientCompleteAddress = await this.getCompleteAddressOrFail(address);
|
|
551
669
|
const ivskM = await this.keyStore.getMasterSecretKey(
|
|
@@ -554,4 +672,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
|
|
|
554
672
|
const addressSecret = await computeAddressSecret(await recipientCompleteAddress.getPreaddress(), ivskM);
|
|
555
673
|
return deriveEcdhSharedSecret(addressSecret, ephPk);
|
|
556
674
|
}
|
|
675
|
+
|
|
676
|
+
public emitOffchainEffect(data: Fr[]): Promise<void> {
|
|
677
|
+
this.offchainEffects.push({ data, contractAddress: this.contractAddress });
|
|
678
|
+
return Promise.resolve();
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/** Returns offchain effects collected during execution. */
|
|
682
|
+
public getOffchainEffects(): OffchainEffect[] {
|
|
683
|
+
return this.offchainEffects;
|
|
684
|
+
}
|
|
557
685
|
}
|
|
@@ -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
|
+
}
|