@aztec/pxe 4.0.0-devnet.1-patch.0 → 4.0.0-devnet.1-patch.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dest/contract_function_simulator/contract_function_simulator.d.ts +51 -28
  2. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  3. package/dest/contract_function_simulator/contract_function_simulator.js +165 -57
  4. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +34 -36
  5. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +62 -17
  7. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +28 -11
  8. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +20 -22
  10. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  11. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  12. package/dest/entrypoints/client/bundle/utils.js +9 -1
  13. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  14. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  15. package/dest/entrypoints/client/lazy/utils.js +9 -1
  16. package/dest/entrypoints/server/utils.js +9 -1
  17. package/dest/pxe.d.ts +52 -21
  18. package/dest/pxe.d.ts.map +1 -1
  19. package/dest/pxe.js +31 -27
  20. package/package.json +16 -16
  21. package/src/contract_function_simulator/contract_function_simulator.ts +314 -117
  22. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +81 -93
  23. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +56 -19
  24. package/src/entrypoints/client/bundle/utils.ts +9 -1
  25. package/src/entrypoints/client/lazy/utils.ts +9 -1
  26. package/src/entrypoints/server/utils.ts +7 -7
  27. package/src/pxe.ts +84 -58
@@ -2,7 +2,6 @@ import { MAX_FR_CALLDATA_TO_ALL_ENQUEUED_CALLS, PRIVATE_CONTEXT_INPUTS_LENGTH }
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { Timer } from '@aztec/foundation/timer';
5
- import type { KeyStore } from '@aztec/key-store';
6
5
  import { type CircuitSimulator, toACVMWitness } from '@aztec/simulator/client';
7
6
  import {
8
7
  type FunctionAbi,
@@ -12,18 +11,14 @@ import {
12
11
  type NoteSelector,
13
12
  countArgumentsSize,
14
13
  } from '@aztec/stdlib/abi';
15
- import type { AuthWitness } from '@aztec/stdlib/auth-witness';
16
14
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
17
15
  import { siloNullifier } from '@aztec/stdlib/hash';
18
- import type { AztecNode } from '@aztec/stdlib/interfaces/client';
19
16
  import { PrivateContextInputs } from '@aztec/stdlib/kernel';
20
17
  import { type ContractClassLog, DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
21
18
  import { Tag } from '@aztec/stdlib/logs';
22
19
  import { Note, type NoteStatus } from '@aztec/stdlib/note';
23
20
  import {
24
- type BlockHeader,
25
21
  CallContext,
26
- Capsule,
27
22
  CountedContractClassLog,
28
23
  NoteAndSlot,
29
24
  PrivateCallExecutionResult,
@@ -32,13 +27,6 @@ import {
32
27
 
33
28
  import type { ContractSyncService } from '../../contract_sync/contract_sync_service.js';
34
29
  import { NoteService } from '../../notes/note_service.js';
35
- import type { AddressStore } from '../../storage/address_store/address_store.js';
36
- import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
37
- import type { ContractStore } from '../../storage/contract_store/contract_store.js';
38
- import type { NoteStore } from '../../storage/note_store/note_store.js';
39
- import type { PrivateEventStore } from '../../storage/private_event_store/private_event_store.js';
40
- import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
41
- import type { SenderAddressBookStore } from '../../storage/tagging_store/sender_address_book_store.js';
42
30
  import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js';
43
31
  import { syncSenderTaggingIndexes } from '../../tagging/index.js';
44
32
  import type { ExecutionNoteCache } from '../execution_note_cache.js';
@@ -47,7 +35,25 @@ import type { HashedValuesCache } from '../hashed_values_cache.js';
47
35
  import { pickNotes } from '../pick_notes.js';
48
36
  import type { IPrivateExecutionOracle, NoteData } from './interfaces.js';
49
37
  import { executePrivateFunction } from './private_execution.js';
50
- import { UtilityExecutionOracle } from './utility_execution_oracle.js';
38
+ import { UtilityExecutionOracle, type UtilityExecutionOracleArgs } from './utility_execution_oracle.js';
39
+
40
+ /** Args for PrivateExecutionOracle constructor. */
41
+ export type PrivateExecutionOracleArgs = Omit<UtilityExecutionOracleArgs, 'contractAddress'> & {
42
+ argsHash: Fr;
43
+ txContext: TxContext;
44
+ callContext: CallContext;
45
+ /** Needed to trigger contract synchronization before nested calls */
46
+ utilityExecutor: (call: FunctionCall) => Promise<void>;
47
+ executionCache: HashedValuesCache;
48
+ noteCache: ExecutionNoteCache;
49
+ taggingIndexCache: ExecutionTaggingIndexCache;
50
+ senderTaggingStore: SenderTaggingStore;
51
+ contractSyncService: ContractSyncService;
52
+ totalPublicCalldataCount?: number;
53
+ sideEffectCounter?: number;
54
+ senderForTags?: AztecAddress;
55
+ simulator?: CircuitSimulator;
56
+ };
51
57
 
52
58
  /**
53
59
  * The execution oracle for the private part of a transaction.
@@ -69,57 +75,39 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
69
75
  private offchainEffects: { data: Fr[] }[] = [];
70
76
  private nestedExecutionResults: PrivateCallExecutionResult[] = [];
71
77
 
72
- constructor(
73
- private readonly argsHash: Fr,
74
- private readonly txContext: TxContext,
75
- private readonly callContext: CallContext,
76
- /** Header of a block whose state is used during private execution (not the block the transaction is included in). */
77
- protected override readonly anchorBlockHeader: BlockHeader,
78
- /** Needed to trigger contract synchronization before nested calls */
79
- private readonly utilityExecutor: (call: FunctionCall) => Promise<void>,
80
- /** List of transient auth witnesses to be used during this simulation */
81
- authWitnesses: AuthWitness[],
82
- capsules: Capsule[],
83
- private readonly executionCache: HashedValuesCache,
84
- private readonly noteCache: ExecutionNoteCache,
85
- private readonly taggingIndexCache: ExecutionTaggingIndexCache,
86
- contractStore: ContractStore,
87
- noteStore: NoteStore,
88
- keyStore: KeyStore,
89
- addressStore: AddressStore,
90
- aztecNode: AztecNode,
91
- private readonly senderTaggingStore: SenderTaggingStore,
92
- recipientTaggingStore: RecipientTaggingStore,
93
- senderAddressBookStore: SenderAddressBookStore,
94
- capsuleStore: CapsuleStore,
95
- privateEventStore: PrivateEventStore,
96
- private readonly contractSyncService: ContractSyncService,
97
- jobId: string,
98
- private totalPublicCalldataCount: number = 0,
99
- protected sideEffectCounter: number = 0,
100
- log = createLogger('simulator:client_execution_context'),
101
- scopes?: AztecAddress[],
102
- private senderForTags?: AztecAddress,
103
- private simulator?: CircuitSimulator,
104
- ) {
105
- super(
106
- callContext.contractAddress,
107
- authWitnesses,
108
- capsules,
109
- anchorBlockHeader,
110
- contractStore,
111
- noteStore,
112
- keyStore,
113
- addressStore,
114
- aztecNode,
115
- recipientTaggingStore,
116
- senderAddressBookStore,
117
- capsuleStore,
118
- privateEventStore,
119
- jobId,
120
- log,
121
- scopes,
122
- );
78
+ private readonly argsHash: Fr;
79
+ private readonly txContext: TxContext;
80
+ private readonly callContext: CallContext;
81
+ private readonly utilityExecutor: (call: FunctionCall) => Promise<void>;
82
+ private readonly executionCache: HashedValuesCache;
83
+ private readonly noteCache: ExecutionNoteCache;
84
+ private readonly taggingIndexCache: ExecutionTaggingIndexCache;
85
+ private readonly senderTaggingStore: SenderTaggingStore;
86
+ private readonly contractSyncService: ContractSyncService;
87
+ private totalPublicCalldataCount: number;
88
+ protected sideEffectCounter: number;
89
+ private senderForTags?: AztecAddress;
90
+ private readonly simulator?: CircuitSimulator;
91
+
92
+ constructor(args: PrivateExecutionOracleArgs) {
93
+ super({
94
+ ...args,
95
+ contractAddress: args.callContext.contractAddress,
96
+ log: args.log ?? createLogger('simulator:client_execution_context'),
97
+ });
98
+ this.argsHash = args.argsHash;
99
+ this.txContext = args.txContext;
100
+ this.callContext = args.callContext;
101
+ this.utilityExecutor = args.utilityExecutor;
102
+ this.executionCache = args.executionCache;
103
+ this.noteCache = args.noteCache;
104
+ this.taggingIndexCache = args.taggingIndexCache;
105
+ this.senderTaggingStore = args.senderTaggingStore;
106
+ this.contractSyncService = args.contractSyncService;
107
+ this.totalPublicCalldataCount = args.totalPublicCalldataCount ?? 0;
108
+ this.sideEffectCounter = args.sideEffectCounter ?? 0;
109
+ this.senderForTags = args.senderForTags;
110
+ this.simulator = args.simulator;
123
111
  }
124
112
 
125
113
  public getPrivateContextInputs(): PrivateContextInputs {
@@ -555,41 +543,41 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
555
543
 
556
544
  const derivedCallContext = await this.deriveCallContext(targetContractAddress, targetArtifact, isStaticCall);
557
545
 
558
- const privateExecutionOracle = new PrivateExecutionOracle(
546
+ const privateExecutionOracle = new PrivateExecutionOracle({
559
547
  argsHash,
560
- derivedTxContext,
561
- derivedCallContext,
562
- this.anchorBlockHeader,
563
- this.utilityExecutor,
564
- this.authWitnesses,
565
- this.capsules,
566
- this.executionCache,
567
- this.noteCache,
568
- this.taggingIndexCache,
569
- this.contractStore,
570
- this.noteStore,
571
- this.keyStore,
572
- this.addressStore,
573
- this.aztecNode,
574
- this.senderTaggingStore,
575
- this.recipientTaggingStore,
576
- this.senderAddressBookStore,
577
- this.capsuleStore,
578
- this.privateEventStore,
579
- this.contractSyncService,
580
- this.jobId,
581
- this.totalPublicCalldataCount,
548
+ txContext: derivedTxContext,
549
+ callContext: derivedCallContext,
550
+ anchorBlockHeader: this.anchorBlockHeader,
551
+ utilityExecutor: this.utilityExecutor,
552
+ authWitnesses: this.authWitnesses,
553
+ capsules: this.capsules,
554
+ executionCache: this.executionCache,
555
+ noteCache: this.noteCache,
556
+ taggingIndexCache: this.taggingIndexCache,
557
+ contractStore: this.contractStore,
558
+ noteStore: this.noteStore,
559
+ keyStore: this.keyStore,
560
+ addressStore: this.addressStore,
561
+ aztecNode: this.aztecNode,
562
+ senderTaggingStore: this.senderTaggingStore,
563
+ recipientTaggingStore: this.recipientTaggingStore,
564
+ senderAddressBookStore: this.senderAddressBookStore,
565
+ capsuleStore: this.capsuleStore,
566
+ privateEventStore: this.privateEventStore,
567
+ contractSyncService: this.contractSyncService,
568
+ jobId: this.jobId,
569
+ totalPublicCalldataCount: this.totalPublicCalldataCount,
582
570
  sideEffectCounter,
583
- this.log,
584
- this.scopes,
585
- this.senderForTags,
586
- this.simulator,
587
- );
571
+ log: this.log,
572
+ scopes: this.scopes,
573
+ senderForTags: this.senderForTags,
574
+ simulator: this.simulator!,
575
+ });
588
576
 
589
577
  const setupTime = simulatorSetupTimer.ms();
590
578
 
591
579
  const childExecutionResult = await executePrivateFunction(
592
- this.simulator,
580
+ this.simulator!,
593
581
  privateExecutionOracle,
594
582
  targetArtifact,
595
583
  targetContractAddress,
@@ -40,6 +40,27 @@ import { pickNotes } from '../pick_notes.js';
40
40
  import type { IMiscOracle, IUtilityExecutionOracle, NoteData } from './interfaces.js';
41
41
  import { MessageLoadOracleInputs } from './message_load_oracle_inputs.js';
42
42
 
43
+ /** Args for UtilityExecutionOracle constructor. */
44
+ export type UtilityExecutionOracleArgs = {
45
+ contractAddress: AztecAddress;
46
+ /** List of transient auth witnesses to be used during this simulation */
47
+ authWitnesses: AuthWitness[];
48
+ capsules: Capsule[]; // TODO(#12425): Rename to transientCapsules
49
+ anchorBlockHeader: BlockHeader;
50
+ contractStore: ContractStore;
51
+ noteStore: NoteStore;
52
+ keyStore: KeyStore;
53
+ addressStore: AddressStore;
54
+ aztecNode: AztecNode;
55
+ recipientTaggingStore: RecipientTaggingStore;
56
+ senderAddressBookStore: SenderAddressBookStore;
57
+ capsuleStore: CapsuleStore;
58
+ privateEventStore: PrivateEventStore;
59
+ jobId: string;
60
+ log?: ReturnType<typeof createLogger>;
61
+ scopes?: AztecAddress[];
62
+ };
63
+
43
64
  /**
44
65
  * The oracle for an execution of utility contract functions.
45
66
  */
@@ -49,25 +70,41 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
49
70
 
50
71
  private contractLogger: Logger | undefined;
51
72
 
52
- constructor(
53
- protected readonly contractAddress: AztecAddress,
54
- /** List of transient auth witnesses to be used during this simulation */
55
- protected readonly authWitnesses: AuthWitness[],
56
- protected readonly capsules: Capsule[], // TODO(#12425): Rename to transientCapsules
57
- protected readonly anchorBlockHeader: BlockHeader,
58
- protected readonly contractStore: ContractStore,
59
- protected readonly noteStore: NoteStore,
60
- protected readonly keyStore: KeyStore,
61
- protected readonly addressStore: AddressStore,
62
- protected readonly aztecNode: AztecNode,
63
- protected readonly recipientTaggingStore: RecipientTaggingStore,
64
- protected readonly senderAddressBookStore: SenderAddressBookStore,
65
- protected readonly capsuleStore: CapsuleStore,
66
- protected readonly privateEventStore: PrivateEventStore,
67
- protected readonly jobId: string,
68
- protected log = createLogger('simulator:client_view_context'),
69
- protected readonly scopes?: AztecAddress[],
70
- ) {}
73
+ protected readonly contractAddress: AztecAddress;
74
+ protected readonly authWitnesses: AuthWitness[];
75
+ protected readonly capsules: Capsule[];
76
+ protected readonly anchorBlockHeader: BlockHeader;
77
+ protected readonly contractStore: ContractStore;
78
+ protected readonly noteStore: NoteStore;
79
+ protected readonly keyStore: KeyStore;
80
+ protected readonly addressStore: AddressStore;
81
+ protected readonly aztecNode: AztecNode;
82
+ protected readonly recipientTaggingStore: RecipientTaggingStore;
83
+ protected readonly senderAddressBookStore: SenderAddressBookStore;
84
+ protected readonly capsuleStore: CapsuleStore;
85
+ protected readonly privateEventStore: PrivateEventStore;
86
+ protected readonly jobId: string;
87
+ protected log: ReturnType<typeof createLogger>;
88
+ protected readonly scopes?: AztecAddress[];
89
+
90
+ constructor(args: UtilityExecutionOracleArgs) {
91
+ this.contractAddress = args.contractAddress;
92
+ this.authWitnesses = args.authWitnesses;
93
+ this.capsules = args.capsules;
94
+ this.anchorBlockHeader = args.anchorBlockHeader;
95
+ this.contractStore = args.contractStore;
96
+ this.noteStore = args.noteStore;
97
+ this.keyStore = args.keyStore;
98
+ this.addressStore = args.addressStore;
99
+ this.aztecNode = args.aztecNode;
100
+ this.recipientTaggingStore = args.recipientTaggingStore;
101
+ this.senderAddressBookStore = args.senderAddressBookStore;
102
+ this.capsuleStore = args.capsuleStore;
103
+ this.privateEventStore = args.privateEventStore;
104
+ this.jobId = args.jobId;
105
+ this.log = args.log ?? createLogger('simulator:client_view_context');
106
+ this.scopes = args.scopes;
107
+ }
71
108
 
72
109
  public utilityAssertCompatibleOracleVersion(version: number): void {
73
110
  if (version !== ORACLE_VERSION) {
@@ -52,6 +52,14 @@ export async function createPXE(
52
52
  const protocolContractsProvider = new BundledProtocolContractsProvider();
53
53
 
54
54
  const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
55
- const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
55
+ const pxe = await PXE.create({
56
+ node: aztecNode,
57
+ store,
58
+ proofCreator: prover,
59
+ simulator,
60
+ protocolContractsProvider,
61
+ config,
62
+ loggerOrSuffix: pxeLogger,
63
+ });
56
64
  return pxe;
57
65
  }
@@ -52,6 +52,14 @@ export async function createPXE(
52
52
  const protocolContractsProvider = new LazyProtocolContractsProvider();
53
53
 
54
54
  const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
55
- const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
55
+ const pxe = await PXE.create({
56
+ node: aztecNode,
57
+ store,
58
+ proofCreator: prover,
59
+ simulator,
60
+ protocolContractsProvider,
61
+ config,
62
+ loggerOrSuffix: pxeLogger,
63
+ });
56
64
  return pxe;
57
65
  }
@@ -58,14 +58,14 @@ export async function createPXE(
58
58
  const protocolContractsProvider = new BundledProtocolContractsProvider();
59
59
 
60
60
  const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
61
- const pxe = await PXE.create(
62
- aztecNode,
63
- options.store,
64
- prover,
61
+ const pxe = await PXE.create({
62
+ node: aztecNode,
63
+ store: options.store,
64
+ proofCreator: prover,
65
65
  simulator,
66
66
  protocolContractsProvider,
67
- configWithContracts,
68
- pxeLogger,
69
- );
67
+ config: configWithContracts,
68
+ loggerOrSuffix: pxeLogger,
69
+ });
70
70
  return pxe;
71
71
  }
package/src/pxe.ts CHANGED
@@ -86,6 +86,54 @@ export type PackedPrivateEvent = InTx & {
86
86
  eventSelector: EventSelector;
87
87
  };
88
88
 
89
+ /** Options for PXE.profileTx. */
90
+ export type ProfileTxOpts = {
91
+ /** The profiling mode to use. */
92
+ profileMode: 'full' | 'execution-steps' | 'gates';
93
+ /** If true, proof generation is skipped during profiling. Defaults to true. */
94
+ skipProofGeneration?: boolean;
95
+ };
96
+
97
+ /** Options for PXE.simulateTx. */
98
+ export type SimulateTxOpts = {
99
+ /** Whether to simulate the public part of the transaction. */
100
+ simulatePublic: boolean;
101
+ /** If false, this function throws if the transaction is unable to be included in a block at the current state. */
102
+ skipTxValidation?: boolean;
103
+ /** If false, fees are enforced. */
104
+ skipFeeEnforcement?: boolean;
105
+ /** State overrides for the simulation, such as contract instances and artifacts. */
106
+ overrides?: SimulationOverrides;
107
+ /** The accounts whose notes we can access in this call. Defaults to all. */
108
+ scopes?: AztecAddress[];
109
+ };
110
+
111
+ /** Options for PXE.simulateUtility. */
112
+ export type SimulateUtilityOpts = {
113
+ /** The authentication witnesses required for the function call. */
114
+ authwits?: AuthWitness[];
115
+ /** The accounts whose notes we can access in this call. Defaults to all. */
116
+ scopes?: AztecAddress[];
117
+ };
118
+
119
+ /** Args for PXE.create. */
120
+ export type PXECreateArgs = {
121
+ /** The Aztec node to connect to. */
122
+ node: AztecNode;
123
+ /** The key-value store for persisting PXE state. */
124
+ store: AztecAsyncKVStore;
125
+ /** The prover for generating private kernel proofs. */
126
+ proofCreator: PrivateKernelProver;
127
+ /** The circuit simulator for executing ACIR circuits. */
128
+ simulator: CircuitSimulator;
129
+ /** Provider for protocol contract artifacts and instances. */
130
+ protocolContractsProvider: ProtocolContractsProvider;
131
+ /** PXE configuration options. */
132
+ config: PXEConfig;
133
+ /** Optional logger instance or string suffix for the logger name. */
134
+ loggerOrSuffix?: string | Logger;
135
+ };
136
+
89
137
  /**
90
138
  * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
91
139
  * manage private state of users.
@@ -122,15 +170,15 @@ export class PXE {
122
170
  *
123
171
  * @returns A promise that resolves PXE is ready to be used.
124
172
  */
125
- public static async create(
126
- node: AztecNode,
127
- store: AztecAsyncKVStore,
128
- proofCreator: PrivateKernelProver,
129
- simulator: CircuitSimulator,
130
- protocolContractsProvider: ProtocolContractsProvider,
131
- config: PXEConfig,
132
- loggerOrSuffix?: string | Logger,
133
- ) {
173
+ public static async create({
174
+ node,
175
+ store,
176
+ proofCreator,
177
+ simulator,
178
+ protocolContractsProvider,
179
+ config,
180
+ loggerOrSuffix,
181
+ }: PXECreateArgs) {
134
182
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
135
183
  const bindings: LoggerBindings | undefined =
136
184
  loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
@@ -140,7 +188,9 @@ export class PXE {
140
188
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
141
189
  : loggerOrSuffix;
142
190
 
143
- const proverEnabled = !!config.proverEnabled;
191
+ const info = await node.getNodeInfo();
192
+
193
+ const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
144
194
  const addressStore = new AddressStore(store);
145
195
  const privateEventStore = new PrivateEventStore(store);
146
196
  const contractStore = new ContractStore(store);
@@ -217,7 +267,6 @@ export class PXE {
217
267
  pxe.jobQueue.start();
218
268
 
219
269
  await pxe.#registerProtocolContracts();
220
- const info = await node.getNodeInfo();
221
270
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
222
271
  return pxe;
223
272
  }
@@ -227,20 +276,20 @@ export class PXE {
227
276
  #getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
228
277
  const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
229
278
 
230
- return new ContractFunctionSimulator(
231
- proxyContractStore,
232
- this.noteStore,
233
- this.keyStore,
234
- this.addressStore,
235
- BenchmarkedNodeFactory.create(this.node),
236
- this.senderTaggingStore,
237
- this.recipientTaggingStore,
238
- this.senderAddressBookStore,
239
- this.capsuleStore,
240
- this.privateEventStore,
241
- this.simulator,
242
- this.contractSyncService,
243
- );
279
+ return new ContractFunctionSimulator({
280
+ contractStore: proxyContractStore,
281
+ noteStore: this.noteStore,
282
+ keyStore: this.keyStore,
283
+ addressStore: this.addressStore,
284
+ aztecNode: BenchmarkedNodeFactory.create(this.node),
285
+ senderTaggingStore: this.senderTaggingStore,
286
+ recipientTaggingStore: this.recipientTaggingStore,
287
+ senderAddressBookStore: this.senderAddressBookStore,
288
+ capsuleStore: this.capsuleStore,
289
+ privateEventStore: this.privateEventStore,
290
+ simulator: this.simulator,
291
+ contractSyncService: this.contractSyncService,
292
+ });
244
293
  }
245
294
 
246
295
  #contextualizeError(err: Error, ...context: string[]): Error {
@@ -322,18 +371,13 @@ export class PXE {
322
371
  jobId,
323
372
  );
324
373
 
325
- const result = await contractFunctionSimulator.run(
326
- txRequest,
374
+ const result = await contractFunctionSimulator.run(txRequest, {
327
375
  contractAddress,
328
- functionSelector,
329
- undefined,
376
+ selector: functionSelector,
330
377
  anchorBlockHeader,
331
- // The sender for tags is set by contracts, typically by an account
332
- // contract entrypoint
333
- undefined, // senderForTags
334
378
  scopes,
335
379
  jobId,
336
- );
380
+ });
337
381
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
338
382
  return result;
339
383
  } catch (err) {
@@ -736,17 +780,13 @@ export class PXE {
736
780
 
737
781
  /**
738
782
  * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
739
- *
740
- * @param txRequest - An authenticated tx request ready for simulation
741
- * @param msgSender - (Optional) The message sender to use for the simulation.
742
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
783
+ * @param txRequest - An authenticated tx request ready for simulation.
743
784
  * @returns A trace of the program execution with gate counts.
744
785
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
745
786
  */
746
787
  public profileTx(
747
788
  txRequest: TxExecutionRequest,
748
- profileMode: 'full' | 'execution-steps' | 'gates',
749
- skipProofGeneration: boolean = true,
789
+ { profileMode, skipProofGeneration = true }: ProfileTxOpts,
750
790
  ): Promise<TxProfileResult> {
751
791
  // We disable concurrent profiles for consistency with simulateTx.
752
792
  return this.#putInJobQueue(async jobId => {
@@ -831,12 +871,7 @@ export class PXE {
831
871
  * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
832
872
  *
833
873
  *
834
- * @param txRequest - An authenticated tx request ready for simulation
835
- * @param simulatePublic - Whether to simulate the public part of the transaction.
836
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
837
- * @param skipFeeEnforcement - (Optional) If false, fees are enforced.
838
- * @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
839
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
874
+ * @param txRequest - An authenticated tx request ready for simulation.
840
875
  * @returns A simulated transaction result object that includes public and private return values.
841
876
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
842
877
  * Also throws if simulatePublic is true and public simulation reverts.
@@ -845,11 +880,7 @@ export class PXE {
845
880
  */
846
881
  public simulateTx(
847
882
  txRequest: TxExecutionRequest,
848
- simulatePublic: boolean,
849
- skipTxValidation: boolean = false,
850
- skipFeeEnforcement: boolean = false,
851
- overrides?: SimulationOverrides,
852
- scopes?: AztecAddress[],
883
+ { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes }: SimulateTxOpts,
853
884
  ): Promise<TxSimulationResult> {
854
885
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
855
886
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
@@ -896,6 +927,7 @@ export class PXE {
896
927
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
897
928
  privateExecutionResult,
898
929
  (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
930
+ this.node,
899
931
  ));
900
932
  } else {
901
933
  // Kernel logic, plus proving of all private functions and kernels.
@@ -980,18 +1012,12 @@ export class PXE {
980
1012
  }
981
1013
 
982
1014
  /**
983
- * Simulate the execution of a contract utility function.
984
- *
1015
+ * Simulates the execution of a contract utility function.
985
1016
  * @param call - The function call containing the function details, arguments, and target contract address.
986
- * @param authwits - (Optional) The authentication witnesses required for the function call.
987
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
988
- * default to all.
989
- * @returns The result of the utility function call, structured based on the function ABI.
990
1017
  */
991
1018
  public simulateUtility(
992
1019
  call: FunctionCall,
993
- authwits?: AuthWitness[],
994
- scopes?: AztecAddress[],
1020
+ { authwits, scopes }: SimulateUtilityOpts = {},
995
1021
  ): Promise<UtilitySimulationResult> {
996
1022
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
997
1023
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to