@aztec/pxe 0.0.1-commit.1bb068fb5 → 0.0.1-commit.1dcfe2301
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/bin/check_oracle_version.js +4 -4
- package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +19 -1
- package/dest/config/index.d.ts +2 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +8 -15
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +13 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +44 -17
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
- 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 +4 -6
- 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 +8 -10
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
- 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 +2 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
- 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 +6 -11
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +61 -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 +47 -0
- package/dest/contract_function_simulator/oracle/oracle.d.ts +75 -44
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +281 -96
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +24 -50
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +55 -85
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +94 -60
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +277 -114
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +20 -3
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
- package/dest/contract_logging.d.ts +27 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +38 -0
- package/dest/contract_sync/contract_sync_service.d.ts +6 -5
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +62 -43
- package/dest/contract_sync/helpers.d.ts +2 -3
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +7 -2
- package/dest/debug/pxe_debug_utils.d.ts +3 -3
- 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 +2 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts +2 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +1 -1
- 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 +2 -2
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +2 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +1 -2
- package/dest/entrypoints/server/utils.d.ts +2 -2
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +2 -2
- package/dest/events/event_service.d.ts +3 -2
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +16 -4
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/logs/log_service.d.ts +7 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +29 -39
- 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 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +14 -5
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- 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 +18 -13
- package/dest/private_kernel/private_kernel_oracle.d.ts +10 -6
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +19 -18
- package/dest/pxe.d.ts +17 -13
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +80 -50
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- 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 +143 -65
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +3 -0
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- 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 +8 -22
- 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/bin/check_oracle_version.ts +4 -4
- package/src/block_synchronizer/block_synchronizer.ts +22 -2
- package/src/config/index.ts +3 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +66 -31
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- 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 +9 -9
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -10
- package/src/contract_function_simulator/oracle/interfaces.ts +82 -54
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
- package/src/contract_function_simulator/oracle/oracle.ts +363 -139
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +67 -106
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +457 -152
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
- package/src/contract_logging.ts +52 -0
- package/src/contract_sync/contract_sync_service.ts +99 -75
- package/src/contract_sync/helpers.ts +4 -4
- package/src/debug/pxe_debug_utils.ts +7 -7
- package/src/entrypoints/client/bundle/index.ts +1 -1
- package/src/entrypoints/client/bundle/utils.ts +2 -3
- package/src/entrypoints/client/lazy/index.ts +1 -1
- package/src/entrypoints/client/lazy/utils.ts +2 -3
- package/src/entrypoints/pxe_creation_options.ts +7 -0
- package/src/entrypoints/server/index.ts +1 -2
- package/src/entrypoints/server/utils.ts +2 -3
- package/src/events/event_service.ts +17 -4
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/logs/log_service.ts +59 -75
- package/src/messages/message_context_service.ts +44 -0
- package/src/notes/note_service.ts +18 -8
- package/src/notes_filter.ts +1 -3
- package/src/oracle_version.ts +20 -10
- 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 +18 -16
- package/src/private_kernel/private_kernel_oracle.ts +21 -21
- package/src/pxe.ts +113 -62
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +177 -76
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -5
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- 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 +12 -25
- 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/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- 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/src/access_scopes.ts +0 -9
package/src/pxe.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from '@aztec/stdlib/abi';
|
|
19
19
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
20
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
21
|
+
import type { L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
22
|
import {
|
|
22
23
|
CompleteAddress,
|
|
23
24
|
type ContractInstanceWithAddress,
|
|
@@ -47,12 +48,11 @@ import {
|
|
|
47
48
|
TxProfileResult,
|
|
48
49
|
TxProvingResult,
|
|
49
50
|
TxSimulationResult,
|
|
50
|
-
|
|
51
|
+
UtilityExecutionResult,
|
|
51
52
|
} from '@aztec/stdlib/tx';
|
|
52
53
|
|
|
53
54
|
import { inspect } from 'util';
|
|
54
55
|
|
|
55
|
-
import type { AccessScopes } from './access_scopes.js';
|
|
56
56
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
57
57
|
import type { PXEConfig } from './config/index.js';
|
|
58
58
|
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
@@ -61,12 +61,14 @@ import {
|
|
|
61
61
|
generateSimulatedProvingResult,
|
|
62
62
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
63
63
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
64
|
+
import { displayDebugLogs } from './contract_logging.js';
|
|
64
65
|
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
65
66
|
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
66
67
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
67
68
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
68
69
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
70
72
|
import {
|
|
71
73
|
PrivateKernelExecutionProver,
|
|
72
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -94,7 +96,7 @@ export type ProfileTxOpts = {
|
|
|
94
96
|
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
95
97
|
skipProofGeneration?: boolean;
|
|
96
98
|
/** Addresses whose private state and keys are accessible during private execution. */
|
|
97
|
-
scopes:
|
|
99
|
+
scopes: AztecAddress[];
|
|
98
100
|
};
|
|
99
101
|
|
|
100
102
|
/** Options for PXE.simulateTx. */
|
|
@@ -105,18 +107,20 @@ export type SimulateTxOpts = {
|
|
|
105
107
|
skipTxValidation?: boolean;
|
|
106
108
|
/** If false, fees are enforced. */
|
|
107
109
|
skipFeeEnforcement?: boolean;
|
|
108
|
-
/**
|
|
110
|
+
/** If true, kernel logic is emulated in TS for simulation */
|
|
111
|
+
skipKernels?: boolean;
|
|
112
|
+
/** State overrides for the simulation, such as contract instances and artifacts. Requires skipKernels: true */
|
|
109
113
|
overrides?: SimulationOverrides;
|
|
110
114
|
/** Addresses whose private state and keys are accessible during private execution */
|
|
111
|
-
scopes:
|
|
115
|
+
scopes: AztecAddress[];
|
|
112
116
|
};
|
|
113
117
|
|
|
114
|
-
/** Options for PXE.
|
|
115
|
-
export type
|
|
118
|
+
/** Options for PXE.executeUtility. */
|
|
119
|
+
export type ExecuteUtilityOpts = {
|
|
116
120
|
/** The authentication witnesses required for the function call. */
|
|
117
121
|
authwits?: AuthWitness[];
|
|
118
122
|
/** The accounts whose notes we can access in this call */
|
|
119
|
-
scopes:
|
|
123
|
+
scopes: AztecAddress[];
|
|
120
124
|
};
|
|
121
125
|
|
|
122
126
|
/** Args for PXE.create. */
|
|
@@ -144,6 +148,7 @@ export type PXECreateArgs = {
|
|
|
144
148
|
export class PXE {
|
|
145
149
|
private constructor(
|
|
146
150
|
private node: AztecNode,
|
|
151
|
+
private db: AztecAsyncKVStore,
|
|
147
152
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
148
153
|
private keyStore: KeyStore,
|
|
149
154
|
private contractStore: ContractStore,
|
|
@@ -156,6 +161,8 @@ export class PXE {
|
|
|
156
161
|
private addressStore: AddressStore,
|
|
157
162
|
private privateEventStore: PrivateEventStore,
|
|
158
163
|
private contractSyncService: ContractSyncService,
|
|
164
|
+
private messageContextService: MessageContextService,
|
|
165
|
+
private l2TipsStore: L2TipsProvider,
|
|
159
166
|
private simulator: CircuitSimulator,
|
|
160
167
|
private proverEnabled: boolean,
|
|
161
168
|
private proofCreator: PrivateKernelProver,
|
|
@@ -211,6 +218,8 @@ export class PXE {
|
|
|
211
218
|
noteStore,
|
|
212
219
|
createLogger('pxe:contract_sync', bindings),
|
|
213
220
|
);
|
|
221
|
+
const messageContextService = new MessageContextService(node);
|
|
222
|
+
|
|
214
223
|
const synchronizer = new BlockSynchronizer(
|
|
215
224
|
node,
|
|
216
225
|
store,
|
|
@@ -239,6 +248,7 @@ export class PXE {
|
|
|
239
248
|
|
|
240
249
|
const pxe = new PXE(
|
|
241
250
|
node,
|
|
251
|
+
store,
|
|
242
252
|
synchronizer,
|
|
243
253
|
keyStore,
|
|
244
254
|
contractStore,
|
|
@@ -251,6 +261,8 @@ export class PXE {
|
|
|
251
261
|
addressStore,
|
|
252
262
|
privateEventStore,
|
|
253
263
|
contractSyncService,
|
|
264
|
+
messageContextService,
|
|
265
|
+
tipsStore,
|
|
254
266
|
simulator,
|
|
255
267
|
proverEnabled,
|
|
256
268
|
proofCreator,
|
|
@@ -264,7 +276,7 @@ export class PXE {
|
|
|
264
276
|
debugUtils.setPXEHelpers(
|
|
265
277
|
pxe.#putInJobQueue.bind(pxe),
|
|
266
278
|
pxe.#getSimulatorForTx.bind(pxe),
|
|
267
|
-
pxe.#
|
|
279
|
+
pxe.#executeUtility.bind(pxe),
|
|
268
280
|
);
|
|
269
281
|
|
|
270
282
|
pxe.jobQueue.start();
|
|
@@ -285,6 +297,7 @@ export class PXE {
|
|
|
285
297
|
keyStore: this.keyStore,
|
|
286
298
|
addressStore: this.addressStore,
|
|
287
299
|
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
300
|
+
l2TipsStore: this.l2TipsStore,
|
|
288
301
|
senderTaggingStore: this.senderTaggingStore,
|
|
289
302
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
290
303
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
@@ -292,6 +305,7 @@ export class PXE {
|
|
|
292
305
|
privateEventStore: this.privateEventStore,
|
|
293
306
|
simulator: this.simulator,
|
|
294
307
|
contractSyncService: this.contractSyncService,
|
|
308
|
+
messageContextService: this.messageContextService,
|
|
295
309
|
});
|
|
296
310
|
}
|
|
297
311
|
|
|
@@ -344,9 +358,8 @@ export class PXE {
|
|
|
344
358
|
async #registerProtocolContracts() {
|
|
345
359
|
const registered: Record<string, string> = {};
|
|
346
360
|
for (const name of protocolContractNames) {
|
|
347
|
-
const { address,
|
|
348
|
-
|
|
349
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
361
|
+
const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
362
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
350
363
|
await this.contractStore.addContractInstance(instance);
|
|
351
364
|
registered[name] = address.toString();
|
|
352
365
|
}
|
|
@@ -358,7 +371,7 @@ export class PXE {
|
|
|
358
371
|
async #executePrivate(
|
|
359
372
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
360
373
|
txRequest: TxExecutionRequest,
|
|
361
|
-
scopes:
|
|
374
|
+
scopes: AztecAddress[],
|
|
362
375
|
jobId: string,
|
|
363
376
|
): Promise<PrivateExecutionResult> {
|
|
364
377
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
@@ -370,7 +383,7 @@ export class PXE {
|
|
|
370
383
|
contractAddress,
|
|
371
384
|
functionSelector,
|
|
372
385
|
(privateSyncCall, execScopes) =>
|
|
373
|
-
this.#
|
|
386
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
374
387
|
anchorBlockHeader,
|
|
375
388
|
jobId,
|
|
376
389
|
scopes,
|
|
@@ -394,25 +407,32 @@ export class PXE {
|
|
|
394
407
|
}
|
|
395
408
|
|
|
396
409
|
/**
|
|
397
|
-
*
|
|
410
|
+
* Execute a utility function call on the given contract.
|
|
398
411
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
399
412
|
* @param call - The function call to execute.
|
|
400
413
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
401
414
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
402
415
|
* accounts if not specified.
|
|
403
416
|
* @param jobId - The job ID for staged writes.
|
|
404
|
-
* @returns The
|
|
417
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
405
418
|
*/
|
|
406
|
-
async #
|
|
419
|
+
async #executeUtility(
|
|
407
420
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
408
421
|
call: FunctionCall,
|
|
409
422
|
authWitnesses: AuthWitness[] | undefined,
|
|
410
|
-
scopes:
|
|
423
|
+
scopes: AztecAddress[],
|
|
411
424
|
jobId: string,
|
|
412
425
|
) {
|
|
413
426
|
try {
|
|
414
427
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
415
|
-
|
|
428
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
429
|
+
call,
|
|
430
|
+
authWitnesses ?? [],
|
|
431
|
+
anchorBlockHeader,
|
|
432
|
+
scopes,
|
|
433
|
+
jobId,
|
|
434
|
+
);
|
|
435
|
+
return { result, offchainEffects };
|
|
416
436
|
} catch (err) {
|
|
417
437
|
if (err instanceof SimulationError) {
|
|
418
438
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -466,8 +486,7 @@ export class PXE {
|
|
|
466
486
|
config: PrivateKernelExecutionProverConfig,
|
|
467
487
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
468
488
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
469
|
-
const
|
|
470
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
489
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
471
490
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
472
491
|
kernelOracle,
|
|
473
492
|
proofCreator,
|
|
@@ -485,7 +504,9 @@ export class PXE {
|
|
|
485
504
|
* @returns The synced block header
|
|
486
505
|
*/
|
|
487
506
|
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
488
|
-
return this
|
|
507
|
+
return this.#putInJobQueue(() => {
|
|
508
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
509
|
+
});
|
|
489
510
|
}
|
|
490
511
|
|
|
491
512
|
/**
|
|
@@ -542,6 +563,12 @@ export class PXE {
|
|
|
542
563
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
543
564
|
*/
|
|
544
565
|
public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
|
|
566
|
+
if (!(await sender.isValid())) {
|
|
567
|
+
throw new Error(
|
|
568
|
+
`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
|
|
545
572
|
const accounts = await this.keyStore.getAccounts();
|
|
546
573
|
if (accounts.includes(sender)) {
|
|
547
574
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
@@ -552,6 +579,9 @@ export class PXE {
|
|
|
552
579
|
|
|
553
580
|
if (wasAdded) {
|
|
554
581
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
582
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
583
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
584
|
+
await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
|
|
555
585
|
} else {
|
|
556
586
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
557
587
|
}
|
|
@@ -601,8 +631,7 @@ export class PXE {
|
|
|
601
631
|
* @param artifact - The build artifact for the contract class.
|
|
602
632
|
*/
|
|
603
633
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
604
|
-
const
|
|
605
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
634
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
606
635
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
607
636
|
}
|
|
608
637
|
|
|
@@ -621,17 +650,17 @@ export class PXE {
|
|
|
621
650
|
if (artifact) {
|
|
622
651
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
623
652
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
624
|
-
|
|
625
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
653
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
626
654
|
throw new Error(
|
|
627
|
-
`Artifact does not match expected class id (computed ${
|
|
655
|
+
`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
|
|
628
656
|
);
|
|
629
657
|
}
|
|
630
658
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
631
659
|
if (!computedAddress.equals(instance.address)) {
|
|
632
660
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
633
661
|
}
|
|
634
|
-
|
|
662
|
+
|
|
663
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
635
664
|
|
|
636
665
|
const publicFunctionSignatures = artifact.functions
|
|
637
666
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
@@ -680,15 +709,16 @@ export class PXE {
|
|
|
680
709
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
681
710
|
}
|
|
682
711
|
|
|
683
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
684
|
-
|
|
685
712
|
const publicFunctionSignatures = artifact.functions
|
|
686
713
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
687
714
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
688
715
|
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
689
716
|
|
|
690
717
|
currentInstance.currentContractClassId = contractClass.id;
|
|
691
|
-
await
|
|
718
|
+
await Promise.all([
|
|
719
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
720
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
721
|
+
]);
|
|
692
722
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
693
723
|
});
|
|
694
724
|
}
|
|
@@ -764,17 +794,17 @@ export class PXE {
|
|
|
764
794
|
// transaction before this one is included in a block from this PXE, and that transaction contains a log with
|
|
765
795
|
// a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
|
|
766
796
|
// storing the tags here prevents linkage of txs sent from the same PXE.
|
|
767
|
-
const
|
|
768
|
-
if (
|
|
797
|
+
const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
|
|
798
|
+
if (taggingIndexRangesUsedInTheTx.length > 0) {
|
|
769
799
|
// TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
|
|
770
800
|
const txHash = (await txProvingResult.toTx()).txHash;
|
|
771
801
|
|
|
772
|
-
await this.senderTaggingStore.storePendingIndexes(
|
|
773
|
-
this.log.debug(`Stored used
|
|
774
|
-
|
|
802
|
+
await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
|
|
803
|
+
this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
|
|
804
|
+
taggingIndexRangesUsedInTheTx,
|
|
775
805
|
});
|
|
776
806
|
} else {
|
|
777
|
-
this.log.debug(`No
|
|
807
|
+
this.log.debug(`No tagging index ranges used in the tx`);
|
|
778
808
|
}
|
|
779
809
|
|
|
780
810
|
return txProvingResult;
|
|
@@ -881,7 +911,14 @@ export class PXE {
|
|
|
881
911
|
*/
|
|
882
912
|
public simulateTx(
|
|
883
913
|
txRequest: TxExecutionRequest,
|
|
884
|
-
{
|
|
914
|
+
{
|
|
915
|
+
simulatePublic,
|
|
916
|
+
skipTxValidation = false,
|
|
917
|
+
skipFeeEnforcement = false,
|
|
918
|
+
skipKernels = true,
|
|
919
|
+
overrides,
|
|
920
|
+
scopes,
|
|
921
|
+
}: SimulateTxOpts,
|
|
885
922
|
): Promise<TxSimulationResult> {
|
|
886
923
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
887
924
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -905,17 +942,20 @@ export class PXE {
|
|
|
905
942
|
await this.blockStateSynchronizer.sync();
|
|
906
943
|
const syncTime = syncTimer.ms();
|
|
907
944
|
|
|
908
|
-
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
909
|
-
// Temporary: in case there are overrides, we have to skip the kernels or validations
|
|
910
|
-
// will fail. Consider handing control to the user/wallet on whether they want to run them
|
|
911
|
-
// or not.
|
|
912
945
|
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
913
946
|
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
914
|
-
const skipKernels = hasOverriddenContracts;
|
|
915
947
|
|
|
916
|
-
|
|
948
|
+
if (hasOverriddenContracts && !skipKernels) {
|
|
949
|
+
throw new Error(
|
|
950
|
+
'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
|
|
951
|
+
);
|
|
952
|
+
}
|
|
953
|
+
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
954
|
+
|
|
917
955
|
if (hasOverriddenContracts) {
|
|
918
|
-
|
|
956
|
+
// Overridden contracts don't have a sync function, so calling sync on them would fail.
|
|
957
|
+
// We exclude them so the sync service skips them entirely.
|
|
958
|
+
this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
|
|
919
959
|
}
|
|
920
960
|
|
|
921
961
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
@@ -947,6 +987,9 @@ export class PXE {
|
|
|
947
987
|
const publicSimulationTimer = new Timer();
|
|
948
988
|
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
949
989
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
990
|
+
if (publicOutput?.debugLogs?.length) {
|
|
991
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
992
|
+
}
|
|
950
993
|
}
|
|
951
994
|
|
|
952
995
|
let validationTime: number | undefined;
|
|
@@ -955,7 +998,8 @@ export class PXE {
|
|
|
955
998
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
956
999
|
validationTime = validationTimer.ms();
|
|
957
1000
|
if (validationResult.result === 'invalid') {
|
|
958
|
-
|
|
1001
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
1002
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
959
1003
|
}
|
|
960
1004
|
}
|
|
961
1005
|
|
|
@@ -1006,23 +1050,23 @@ export class PXE {
|
|
|
1006
1050
|
inspect(txRequest),
|
|
1007
1051
|
`simulatePublic=${simulatePublic}`,
|
|
1008
1052
|
`skipTxValidation=${skipTxValidation}`,
|
|
1009
|
-
`scopes=${scopes
|
|
1053
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1010
1054
|
);
|
|
1011
1055
|
}
|
|
1012
1056
|
});
|
|
1013
1057
|
}
|
|
1014
1058
|
|
|
1015
1059
|
/**
|
|
1016
|
-
*
|
|
1060
|
+
* Executes a contract utility function.
|
|
1017
1061
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
1018
1062
|
*/
|
|
1019
|
-
public
|
|
1063
|
+
public executeUtility(
|
|
1020
1064
|
call: FunctionCall,
|
|
1021
|
-
{ authwits, scopes }:
|
|
1022
|
-
): Promise<
|
|
1023
|
-
// We disable concurrent
|
|
1065
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1066
|
+
): Promise<UtilityExecutionResult> {
|
|
1067
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1024
1068
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
1025
|
-
// delete the same read value, or reading values that another
|
|
1069
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
1026
1070
|
return this.#putInJobQueue(async jobId => {
|
|
1027
1071
|
try {
|
|
1028
1072
|
const totalTimer = new Timer();
|
|
@@ -1037,13 +1081,13 @@ export class PXE {
|
|
|
1037
1081
|
call.to,
|
|
1038
1082
|
call.selector,
|
|
1039
1083
|
(privateSyncCall, execScopes) =>
|
|
1040
|
-
this.#
|
|
1084
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1041
1085
|
anchorBlockHeader,
|
|
1042
1086
|
jobId,
|
|
1043
1087
|
scopes,
|
|
1044
1088
|
);
|
|
1045
1089
|
|
|
1046
|
-
const executionResult = await this.#
|
|
1090
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
1047
1091
|
contractFunctionSimulator,
|
|
1048
1092
|
call,
|
|
1049
1093
|
authwits ?? [],
|
|
@@ -1064,14 +1108,19 @@ export class PXE {
|
|
|
1064
1108
|
};
|
|
1065
1109
|
|
|
1066
1110
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1067
|
-
return {
|
|
1111
|
+
return {
|
|
1112
|
+
result: executionResult,
|
|
1113
|
+
offchainEffects,
|
|
1114
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1115
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1116
|
+
};
|
|
1068
1117
|
} catch (err: any) {
|
|
1069
1118
|
const { to, name, args } = call;
|
|
1070
1119
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1071
1120
|
throw this.#contextualizeError(
|
|
1072
1121
|
err,
|
|
1073
|
-
`
|
|
1074
|
-
`scopes=${scopes
|
|
1122
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1123
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1075
1124
|
);
|
|
1076
1125
|
}
|
|
1077
1126
|
});
|
|
@@ -1108,7 +1157,7 @@ export class PXE {
|
|
|
1108
1157
|
filter.contractAddress,
|
|
1109
1158
|
null,
|
|
1110
1159
|
async (privateSyncCall, execScopes) =>
|
|
1111
|
-
await this.#
|
|
1160
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1112
1161
|
anchorBlockHeader,
|
|
1113
1162
|
jobId,
|
|
1114
1163
|
filter.scopes,
|
|
@@ -1126,9 +1175,11 @@ export class PXE {
|
|
|
1126
1175
|
}
|
|
1127
1176
|
|
|
1128
1177
|
/**
|
|
1129
|
-
* Stops the PXE's job queue.
|
|
1178
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1130
1179
|
*/
|
|
1131
|
-
public stop(): Promise<void> {
|
|
1132
|
-
|
|
1180
|
+
public async stop(): Promise<void> {
|
|
1181
|
+
await this.jobQueue.end();
|
|
1182
|
+
await this.blockStateSynchronizer.stop();
|
|
1183
|
+
await this.db.close();
|
|
1133
1184
|
}
|
|
1134
1185
|
}
|
|
@@ -23,7 +23,7 @@ export class AnchorBlockStore {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
async getBlockHeader(): Promise<BlockHeader> {
|
|
26
|
-
const headerBuffer = await this.#synchronizedHeader.getAsync();
|
|
26
|
+
const headerBuffer = await this.#store.transactionAsync(() => this.#synchronizedHeader.getAsync());
|
|
27
27
|
if (!headerBuffer) {
|
|
28
28
|
throw new Error(`Trying to get block header with a not-yet-synchronized PXE - this should never happen`);
|
|
29
29
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
+
import type { Capsule } from '@aztec/stdlib/tx';
|
|
4
|
+
|
|
5
|
+
import type { CapsuleStore } from './capsule_store.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Wraps a CapsuleStore with scope-based access control. Each operation asserts that the requested scope is in the
|
|
9
|
+
* allowed scopes list before delegating to the underlying store.
|
|
10
|
+
*/
|
|
11
|
+
export class CapsuleService {
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly capsuleStore: CapsuleStore,
|
|
14
|
+
private readonly allowedScopes: AztecAddress[],
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], jobId: string, scope: AztecAddress) {
|
|
18
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
19
|
+
this.capsuleStore.setCapsule(contractAddress, slot, capsule, jobId, scope);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async getCapsule(
|
|
23
|
+
contractAddress: AztecAddress,
|
|
24
|
+
slot: Fr,
|
|
25
|
+
jobId: string,
|
|
26
|
+
scope: AztecAddress,
|
|
27
|
+
transientCapsules?: Capsule[],
|
|
28
|
+
): Promise<Fr[] | null> {
|
|
29
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
30
|
+
|
|
31
|
+
// TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
|
|
32
|
+
const maybeTransientCapsule = transientCapsules?.find(
|
|
33
|
+
c =>
|
|
34
|
+
c.contractAddress.equals(contractAddress) &&
|
|
35
|
+
c.storageSlot.equals(slot) &&
|
|
36
|
+
(c.scope ?? AztecAddress.ZERO).equals(scope),
|
|
37
|
+
)?.data;
|
|
38
|
+
|
|
39
|
+
return maybeTransientCapsule ?? (await this.capsuleStore.getCapsule(contractAddress, slot, jobId, scope));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
deleteCapsule(contractAddress: AztecAddress, slot: Fr, jobId: string, scope: AztecAddress) {
|
|
43
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
44
|
+
this.capsuleStore.deleteCapsule(contractAddress, slot, jobId, scope);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
copyCapsule(
|
|
48
|
+
contractAddress: AztecAddress,
|
|
49
|
+
srcSlot: Fr,
|
|
50
|
+
dstSlot: Fr,
|
|
51
|
+
numEntries: number,
|
|
52
|
+
jobId: string,
|
|
53
|
+
scope: AztecAddress,
|
|
54
|
+
): Promise<void> {
|
|
55
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
56
|
+
return this.capsuleStore.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, jobId, scope);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
appendToCapsuleArray(
|
|
60
|
+
contractAddress: AztecAddress,
|
|
61
|
+
baseSlot: Fr,
|
|
62
|
+
content: Fr[][],
|
|
63
|
+
jobId: string,
|
|
64
|
+
scope: AztecAddress,
|
|
65
|
+
): Promise<void> {
|
|
66
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
67
|
+
return this.capsuleStore.appendToCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
readCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, jobId: string, scope: AztecAddress): Promise<Fr[][]> {
|
|
71
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
72
|
+
return this.capsuleStore.readCapsuleArray(contractAddress, baseSlot, jobId, scope);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
setCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, content: Fr[][], jobId: string, scope: AztecAddress) {
|
|
76
|
+
assertAllowedScope(scope, this.allowedScopes);
|
|
77
|
+
return this.capsuleStore.setCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function assertAllowedScope(scope: AztecAddress, allowedScopes: AztecAddress[]) {
|
|
82
|
+
if (scope.equals(AztecAddress.ZERO)) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!allowedScopes.some((allowed: AztecAddress) => allowed.equals(scope))) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`Scope ${scope.toString()} is not in the allowed scopes list: [${allowedScopes.map((s: AztecAddress) => s.toString()).join(', ')}]. See https://docs.aztec.network/errors/10`,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|