@aztec/txe 0.0.1-commit.e6bd8901 → 0.0.1-commit.ec7ac5448

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 (62) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/index.js +88 -54
  4. package/dest/oracle/interfaces.d.ts +29 -28
  5. package/dest/oracle/interfaces.d.ts.map +1 -1
  6. package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
  7. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  8. package/dest/oracle/txe_oracle_public_context.js +14 -15
  9. package/dest/oracle/txe_oracle_top_level_context.d.ts +28 -23
  10. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  11. package/dest/oracle/txe_oracle_top_level_context.js +149 -63
  12. package/dest/rpc_translator.d.ts +121 -83
  13. package/dest/rpc_translator.d.ts.map +1 -1
  14. package/dest/rpc_translator.js +406 -172
  15. package/dest/state_machine/archiver.d.ts +3 -3
  16. package/dest/state_machine/archiver.d.ts.map +1 -1
  17. package/dest/state_machine/archiver.js +9 -8
  18. package/dest/state_machine/dummy_p2p_client.d.ts +18 -13
  19. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  20. package/dest/state_machine/dummy_p2p_client.js +33 -18
  21. package/dest/state_machine/global_variable_builder.d.ts +3 -2
  22. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  23. package/dest/state_machine/global_variable_builder.js +1 -1
  24. package/dest/state_machine/index.d.ts +7 -5
  25. package/dest/state_machine/index.d.ts.map +1 -1
  26. package/dest/state_machine/index.js +19 -10
  27. package/dest/state_machine/mock_epoch_cache.d.ts +20 -3
  28. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  29. package/dest/state_machine/mock_epoch_cache.js +39 -2
  30. package/dest/state_machine/synchronizer.d.ts +5 -5
  31. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  32. package/dest/state_machine/synchronizer.js +3 -3
  33. package/dest/txe_session.d.ts +10 -6
  34. package/dest/txe_session.d.ts.map +1 -1
  35. package/dest/txe_session.js +94 -26
  36. package/dest/util/encoding.d.ts +69 -1
  37. package/dest/util/encoding.d.ts.map +1 -1
  38. package/dest/util/txe_public_contract_data_source.d.ts +2 -3
  39. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  40. package/dest/util/txe_public_contract_data_source.js +6 -25
  41. package/dest/utils/block_creation.d.ts +1 -1
  42. package/dest/utils/block_creation.d.ts.map +1 -1
  43. package/dest/utils/block_creation.js +3 -1
  44. package/package.json +15 -15
  45. package/src/index.ts +89 -52
  46. package/src/oracle/interfaces.ts +32 -31
  47. package/src/oracle/txe_oracle_public_context.ts +14 -16
  48. package/src/oracle/txe_oracle_top_level_context.ts +188 -115
  49. package/src/rpc_translator.ts +470 -189
  50. package/src/state_machine/archiver.ts +8 -5
  51. package/src/state_machine/dummy_p2p_client.ts +46 -24
  52. package/src/state_machine/global_variable_builder.ts +2 -0
  53. package/src/state_machine/index.ts +30 -9
  54. package/src/state_machine/mock_epoch_cache.ts +51 -3
  55. package/src/state_machine/synchronizer.ts +4 -4
  56. package/src/txe_session.ts +106 -85
  57. package/src/util/txe_public_contract_data_source.ts +10 -38
  58. package/src/utils/block_creation.ts +3 -1
  59. package/dest/util/txe_contract_store.d.ts +0 -12
  60. package/dest/util/txe_contract_store.d.ts.map +0 -1
  61. package/dest/util/txe_contract_store.js +0 -22
  62. package/src/util/txe_contract_store.ts +0 -36
@@ -1,9 +1,7 @@
1
1
  import {
2
2
  CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
3
- DEFAULT_DA_GAS_LIMIT,
4
- DEFAULT_L2_GAS_LIMIT,
5
- DEFAULT_TEARDOWN_DA_GAS_LIMIT,
6
- DEFAULT_TEARDOWN_L2_GAS_LIMIT,
3
+ MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
4
+ MAX_PROCESSABLE_L2_GAS,
7
5
  NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
8
6
  } from '@aztec/constants';
9
7
  import { BlockNumber } from '@aztec/foundation/branded-types';
@@ -14,15 +12,17 @@ import { TestDateProvider } from '@aztec/foundation/timer';
14
12
  import type { KeyStore } from '@aztec/key-store';
15
13
  import {
16
14
  AddressStore,
15
+ CapsuleService,
17
16
  CapsuleStore,
17
+ type ContractStore,
18
+ type ContractSyncService,
18
19
  NoteStore,
19
- ORACLE_VERSION,
20
+ ORACLE_VERSION_MAJOR,
20
21
  PrivateEventStore,
21
22
  RecipientTaggingStore,
22
23
  SenderAddressBookStore,
23
24
  SenderTaggingStore,
24
25
  enrichPublicSimulationError,
25
- syncState,
26
26
  } from '@aztec/pxe/server';
27
27
  import {
28
28
  ExecutionNoteCache,
@@ -55,7 +55,13 @@ import { AuthWitness } from '@aztec/stdlib/auth-witness';
55
55
  import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
56
56
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
57
57
  import { type ContractInstanceWithAddress, computePartialAddress } from '@aztec/stdlib/contract';
58
- import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas';
58
+ import {
59
+ FALLBACK_TEARDOWN_DA_GAS_LIMIT,
60
+ FALLBACK_TEARDOWN_L2_GAS_LIMIT,
61
+ Gas,
62
+ GasFees,
63
+ GasSettings,
64
+ } from '@aztec/stdlib/gas';
59
65
  import { computeCalldataHash, computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
60
66
  import {
61
67
  PartialPrivateTailPublicInputsForPublic,
@@ -84,7 +90,6 @@ import { ForkCheckpoint } from '@aztec/world-state';
84
90
  import { DEFAULT_ADDRESS } from '../constants.js';
85
91
  import type { TXEStateMachine } from '../state_machine/index.js';
86
92
  import type { TXEAccountStore } from '../util/txe_account_store.js';
87
- import type { TXEContractStore } from '../util/txe_contract_store.js';
88
93
  import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
89
94
  import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
90
95
  import type { ITxeExecutionOracle } from './interfaces.js';
@@ -97,7 +102,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
97
102
 
98
103
  constructor(
99
104
  private stateMachine: TXEStateMachine,
100
- private contractStore: TXEContractStore,
105
+ private contractStore: ContractStore,
101
106
  private noteStore: NoteStore,
102
107
  private keyStore: KeyStore,
103
108
  private addressStore: AddressStore,
@@ -107,57 +112,70 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
107
112
  private senderAddressBookStore: SenderAddressBookStore,
108
113
  private capsuleStore: CapsuleStore,
109
114
  private privateEventStore: PrivateEventStore,
110
- private jobId: string,
111
115
  private nextBlockTimestamp: bigint,
112
116
  private version: Fr,
113
117
  private chainId: Fr,
114
118
  private authwits: Map<string, AuthWitness>,
119
+ private readonly contractSyncService: ContractSyncService,
115
120
  ) {
116
121
  this.logger = createLogger('txe:top_level_context');
117
122
  this.logger.debug('Entering Top Level Context');
118
123
  }
119
124
 
120
- utilityAssertCompatibleOracleVersion(version: number): void {
121
- if (version !== ORACLE_VERSION) {
125
+ private contractOracleVersion: { major: number; minor: number } | undefined;
126
+
127
+ assertCompatibleOracleVersion(major: number, minor: number): void {
128
+ if (major !== ORACLE_VERSION_MAJOR) {
129
+ const hint =
130
+ major > ORACLE_VERSION_MAJOR
131
+ ? 'The contract was compiled with a newer version of Aztec.nr than this aztec cli version supports. Upgrade your aztec cli version to a compatible version.'
132
+ : 'The contract was compiled with an older version of Aztec.nr than this aztec cli version supports. Recompile the contract with a compatible version of Aztec.nr.';
122
133
  throw new Error(
123
- `Incompatible oracle version. TXE is using version '${ORACLE_VERSION}', but got a request for '${version}'.`,
134
+ `Incompatible aztec cli version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`,
124
135
  );
125
136
  }
137
+ this.contractOracleVersion = { major, minor };
138
+ }
139
+
140
+ // Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
141
+ nonOracleFunctionGetContractOracleVersion(): { major: number; minor: number } | undefined {
142
+ return this.contractOracleVersion;
126
143
  }
127
144
 
128
145
  // This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
129
146
  // setup.
130
- utilityGetRandomField(): Fr {
147
+ getRandomField(): Fr {
131
148
  return Fr.random();
132
149
  }
133
150
 
134
151
  // We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
135
- utilityDebugLog(level: number, message: string, fields: Fr[]): void {
152
+ log(level: number, message: string, fields: Fr[]): Promise<void> {
136
153
  if (!LogLevels[level]) {
137
- throw new Error(`Invalid debug log level: ${level}`);
154
+ throw new Error(`Invalid log level: ${level}`);
138
155
  }
139
156
  const levelName = LogLevels[level];
140
157
 
141
158
  this.logger[levelName](`${applyStringFormatting(message, fields)}`, { module: `${this.logger.module}:debug_log` });
159
+ return Promise.resolve();
142
160
  }
143
161
 
144
- txeGetDefaultAddress(): AztecAddress {
162
+ getDefaultAddress(): AztecAddress {
145
163
  return DEFAULT_ADDRESS;
146
164
  }
147
165
 
148
- async txeGetNextBlockNumber(): Promise<BlockNumber> {
166
+ async getNextBlockNumber(): Promise<BlockNumber> {
149
167
  return BlockNumber((await this.getLastBlockNumber()) + 1);
150
168
  }
151
169
 
152
- txeGetNextBlockTimestamp(): Promise<bigint> {
170
+ getNextBlockTimestamp(): Promise<bigint> {
153
171
  return Promise.resolve(this.nextBlockTimestamp);
154
172
  }
155
173
 
156
- async txeGetLastBlockTimestamp() {
174
+ async getLastBlockTimestamp() {
157
175
  return (await this.stateMachine.node.getBlockHeader('latest'))!.globalVariables.timestamp;
158
176
  }
159
177
 
160
- async txeGetLastTxEffects() {
178
+ async getLastTxEffects() {
161
179
  const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
162
180
  const block = await this.stateMachine.archiver.getBlock(latestBlockNumber);
163
181
 
@@ -171,7 +189,26 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
171
189
  return { txHash: txEffects.txHash, noteHashes: txEffects.noteHashes, nullifiers: txEffects.nullifiers };
172
190
  }
173
191
 
174
- async txeGetPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) {
192
+ async syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string) {
193
+ if (contractAddress.equals(DEFAULT_ADDRESS)) {
194
+ this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
195
+ return;
196
+ }
197
+
198
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
199
+ await this.stateMachine.contractSyncService.ensureContractSynced(
200
+ contractAddress,
201
+ null,
202
+ async (call, execScopes) => {
203
+ await this.executeUtilityCall(call, execScopes, jobId);
204
+ },
205
+ blockHeader,
206
+ jobId,
207
+ [scope],
208
+ );
209
+ }
210
+
211
+ async getPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) {
175
212
  return (
176
213
  await this.privateEventStore.getPrivateEvents(selector, {
177
214
  contractAddress,
@@ -182,7 +219,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
182
219
  ).map(e => e.packedEvent);
183
220
  }
184
221
 
185
- async txeAdvanceBlocksBy(blocks: number) {
222
+ async advanceBlocksBy(blocks: number) {
186
223
  this.logger.debug(`time traveling ${blocks} blocks`);
187
224
 
188
225
  for (let i = 0; i < blocks; i++) {
@@ -190,12 +227,12 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
190
227
  }
191
228
  }
192
229
 
193
- txeAdvanceTimestampBy(duration: UInt64) {
230
+ advanceTimestampBy(duration: UInt64) {
194
231
  this.logger.debug(`time traveling ${duration} seconds`);
195
232
  this.nextBlockTimestamp += duration;
196
233
  }
197
234
 
198
- async txeDeploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
235
+ async deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
199
236
  // Emit deployment nullifier
200
237
  await this.mineBlock({
201
238
  nullifiers: [
@@ -207,20 +244,20 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
207
244
  });
208
245
 
209
246
  if (!secret.equals(Fr.ZERO)) {
210
- await this.txeAddAccount(artifact, instance, secret);
247
+ await this.addAccount(artifact, instance, secret);
211
248
  } else {
212
249
  await this.contractStore.addContractInstance(instance);
213
- await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact);
250
+ await this.contractStore.addContractArtifact(artifact);
214
251
  this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
215
252
  }
216
253
  }
217
254
 
218
- async txeAddAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
255
+ async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
219
256
  const partialAddress = await computePartialAddress(instance);
220
257
 
221
258
  this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
222
259
  await this.contractStore.addContractInstance(instance);
223
- await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact);
260
+ await this.contractStore.addContractArtifact(artifact);
224
261
 
225
262
  const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
226
263
  await this.accountStore.setAccount(completeAddress.address, completeAddress);
@@ -230,7 +267,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
230
267
  return completeAddress;
231
268
  }
232
269
 
233
- async txeCreateAccount(secret: Fr) {
270
+ async createAccount(secret: Fr) {
234
271
  // This is a foot gun !
235
272
  const completeAddress = await this.keyStore.addAccount(secret, secret);
236
273
  await this.accountStore.setAccount(completeAddress.address, completeAddress);
@@ -240,7 +277,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
240
277
  return completeAddress;
241
278
  }
242
279
 
243
- async txeAddAuthWitness(address: AztecAddress, messageHash: Fr) {
280
+ async addAuthWitness(address: AztecAddress, messageHash: Fr) {
244
281
  const account = await this.accountStore.getAccount(address);
245
282
  const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey);
246
283
 
@@ -253,7 +290,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
253
290
  }
254
291
 
255
292
  async mineBlock(options: { nullifiers?: Fr[] } = {}) {
256
- const blockNumber = await this.txeGetNextBlockNumber();
293
+ const blockNumber = await this.getNextBlockNumber();
257
294
 
258
295
  const txEffect = TxEffect.empty();
259
296
  txEffect.nullifiers = [getSingleTxBlockRequestHash(blockNumber), ...(options.nullifiers ?? [])];
@@ -277,13 +314,14 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
277
314
  await this.stateMachine.handleL2Block(block);
278
315
  }
279
316
 
280
- async txePrivateCallNewFlow(
317
+ async privateCallNewFlow(
281
318
  from: AztecAddress,
282
319
  targetContractAddress: AztecAddress = AztecAddress.zero(),
283
320
  functionSelector: FunctionSelector = FunctionSelector.empty(),
284
321
  args: Fr[],
285
322
  argsHash: Fr = Fr.zero(),
286
323
  isStaticCall: boolean = false,
324
+ jobId: string,
287
325
  ) {
288
326
  this.logger.verbose(
289
327
  `Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`,
@@ -297,25 +335,35 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
297
335
  throw new Error(message);
298
336
  }
299
337
 
338
+ // When `from` is the zero address (e.g. when deploying a new account contract), we return an
339
+ // empty scope list which acts as deny-all: no notes are visible and no keys are accessible.
340
+ const effectiveScopes = from.isZero() ? [] : [from];
341
+
300
342
  // Sync notes before executing private function to discover notes from previous transactions
301
- const utilityExecutor = async (call: FunctionCall) => {
302
- await this.executeUtilityCall(call);
343
+ const utilityExecutor = async (call: FunctionCall, execScopes: AztecAddress[]) => {
344
+ await this.executeUtilityCall(call, execScopes, jobId);
303
345
  };
304
346
 
305
- await syncState(targetContractAddress, this.contractStore, functionSelector, utilityExecutor);
347
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
348
+ await this.stateMachine.contractSyncService.ensureContractSynced(
349
+ targetContractAddress,
350
+ functionSelector,
351
+ utilityExecutor,
352
+ blockHeader,
353
+ jobId,
354
+ effectiveScopes,
355
+ );
306
356
 
307
- const blockNumber = await this.txeGetNextBlockNumber();
357
+ const blockNumber = await this.getNextBlockNumber();
308
358
 
309
359
  const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
310
360
 
311
- const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
312
- const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
361
+ const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
362
+ const teardownGasLimits = new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT);
313
363
  const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
314
364
 
315
365
  const txContext = new TxContext(this.chainId, this.version, gasSettings);
316
366
 
317
- const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
318
-
319
367
  const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
320
368
  const noteCache = new ExecutionNoteCache(protocolNullifier);
321
369
  // In production, the account contract sets the min revertible counter before calling the app function.
@@ -327,43 +375,38 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
327
375
 
328
376
  const simulator = new WASMSimulator();
329
377
 
330
- const privateExecutionOracle = new PrivateExecutionOracle(
378
+ const privateExecutionOracle = new PrivateExecutionOracle({
331
379
  argsHash,
332
380
  txContext,
333
381
  callContext,
334
- /** Header of a block whose state is used during private execution (not the block the transaction is included in). */
335
- blockHeader,
382
+ anchorBlockHeader: blockHeader,
336
383
  utilityExecutor,
337
- /** List of transient auth witnesses to be used during this simulation */
338
- Array.from(this.authwits.values()),
339
- /** List of transient auth witnesses to be used during this simulation */
340
- [],
341
- HashedValuesCache.create([new HashedValues(args, argsHash)]),
384
+ authWitnesses: Array.from(this.authwits.values()),
385
+ capsules: [],
386
+ executionCache: HashedValuesCache.create([new HashedValues(args, argsHash)]),
342
387
  noteCache,
343
388
  taggingIndexCache,
344
- this.contractStore,
345
- this.noteStore,
346
- this.keyStore,
347
- this.addressStore,
348
- this.stateMachine.node,
349
- this.stateMachine.anchorBlockStore,
350
- this.senderTaggingStore,
351
- this.recipientTaggingStore,
352
- this.senderAddressBookStore,
353
- this.capsuleStore,
354
- this.privateEventStore,
355
- this.jobId,
356
- 0, // totalPublicArgsCount
357
- minRevertibleSideEffectCounter, // (start) sideEffectCounter
358
- undefined, // log
359
- undefined, // scopes
360
- /**
361
- * In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
362
- * contract would perform, including setting senderForTags.
363
- */
364
- from,
389
+ contractStore: this.contractStore,
390
+ noteStore: this.noteStore,
391
+ keyStore: this.keyStore,
392
+ addressStore: this.addressStore,
393
+ aztecNode: this.stateMachine.node,
394
+ senderTaggingStore: this.senderTaggingStore,
395
+ recipientTaggingStore: this.recipientTaggingStore,
396
+ senderAddressBookStore: this.senderAddressBookStore,
397
+ capsuleService: new CapsuleService(this.capsuleStore, effectiveScopes),
398
+ privateEventStore: this.privateEventStore,
399
+ contractSyncService: this.stateMachine.contractSyncService,
400
+ jobId,
401
+ totalPublicCalldataCount: 0,
402
+ sideEffectCounter: minRevertibleSideEffectCounter,
403
+ scopes: effectiveScopes,
404
+ // In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
405
+ // contract would perform, including setting senderForTags.
406
+ senderForTags: from,
365
407
  simulator,
366
- );
408
+ messageContextService: this.stateMachine.messageContextService,
409
+ });
367
410
 
368
411
  // Note: This is a slight modification of simulator.run without any of the checks. Maybe we should modify simulator.run with a boolean value to skip checks.
369
412
  let result: PrivateExecutionResult;
@@ -385,7 +428,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
385
428
  );
386
429
  const publicFunctionsCalldata = await Promise.all(
387
430
  publicCallRequests.map(async r => {
388
- const calldata = await privateExecutionOracle.privateLoadFromExecutionCache(r.calldataHash);
431
+ const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
389
432
  return new HashedValues(calldata, r.calldataHash);
390
433
  }),
391
434
  );
@@ -402,7 +445,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
402
445
  // We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
403
446
  const { publicInputs } = await generateSimulatedProvingResult(
404
447
  result,
405
- this.contractStore,
448
+ (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
449
+ this.stateMachine.node,
406
450
  minRevertibleSideEffectCounter,
407
451
  );
408
452
 
@@ -415,7 +459,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
415
459
 
416
460
  const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
417
461
 
418
- const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore));
462
+ const bindings = this.logger.getBindings();
463
+ const contractsDB = new PublicContractsDB(
464
+ new TXEPublicContractDataSource(blockNumber, this.contractStore),
465
+ bindings,
466
+ );
419
467
  const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
420
468
  const config = PublicSimulatorConfig.from({
421
469
  skipFeeEnforcement: true,
@@ -428,8 +476,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
428
476
  globals,
429
477
  guardedMerkleTrees,
430
478
  contractsDB,
431
- new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config),
479
+ new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings),
432
480
  new TestDateProvider(),
481
+ undefined,
482
+ createLogger('simulator:public-processor', bindings),
433
483
  );
434
484
 
435
485
  const tx = await Tx.create({
@@ -492,7 +542,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
492
542
  return executionResult.returnValues ?? [];
493
543
  }
494
544
 
495
- async txePublicCallNewFlow(
545
+ async publicCallNewFlow(
496
546
  from: AztecAddress,
497
547
  targetContractAddress: AztecAddress,
498
548
  calldata: Fr[],
@@ -502,11 +552,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
502
552
  `Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`,
503
553
  );
504
554
 
505
- const blockNumber = await this.txeGetNextBlockNumber();
555
+ const blockNumber = await this.getNextBlockNumber();
506
556
 
507
- const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
557
+ const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
508
558
 
509
- const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
559
+ const teardownGasLimits = new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT);
510
560
 
511
561
  const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
512
562
 
@@ -526,7 +576,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
526
576
 
527
577
  const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
528
578
 
529
- const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore));
579
+ const bindings2 = this.logger.getBindings();
580
+ const contractsDB = new PublicContractsDB(
581
+ new TXEPublicContractDataSource(blockNumber, this.contractStore),
582
+ bindings2,
583
+ );
530
584
  const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
531
585
  const config = PublicSimulatorConfig.from({
532
586
  skipFeeEnforcement: true,
@@ -535,8 +589,16 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
535
589
  collectStatistics: false,
536
590
  collectCallMetadata: true,
537
591
  });
538
- const simulator = new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config);
539
- const processor = new PublicProcessor(globals, guardedMerkleTrees, contractsDB, simulator, new TestDateProvider());
592
+ const simulator = new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings2);
593
+ const processor = new PublicProcessor(
594
+ globals,
595
+ guardedMerkleTrees,
596
+ contractsDB,
597
+ simulator,
598
+ new TestDateProvider(),
599
+ undefined,
600
+ createLogger('simulator:public-processor', bindings2),
601
+ );
540
602
 
541
603
  // We're simulating a scenario in which private execution immediately enqueues a public call and halts. The private
542
604
  // kernel init would in this case inject a nullifier with the transaction request hash as a non-revertible
@@ -567,7 +629,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
567
629
  constantData,
568
630
  /*gasUsed=*/ new Gas(0, 0),
569
631
  /*feePayer=*/ AztecAddress.zero(),
570
- /*includeByTimestamp=*/ 0n,
632
+ /*expirationTimestamp=*/ 0n,
571
633
  inputsForPublic,
572
634
  undefined,
573
635
  );
@@ -635,10 +697,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
635
697
  return returnValues ?? [];
636
698
  }
637
699
 
638
- async txeSimulateUtilityFunction(
700
+ async executeUtilityFunction(
639
701
  targetContractAddress: AztecAddress,
640
702
  functionSelector: FunctionSelector,
641
703
  args: Fr[],
704
+ jobId: string,
642
705
  ) {
643
706
  const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
644
707
  if (!artifact) {
@@ -646,25 +709,33 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
646
709
  }
647
710
 
648
711
  // Sync notes before executing utility function to discover notes from previous transactions
649
- await syncState(targetContractAddress, this.contractStore, functionSelector, async call => {
650
- await this.executeUtilityCall(call);
651
- });
652
-
653
- const call = new FunctionCall(
654
- artifact.name,
712
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
713
+ await this.stateMachine.contractSyncService.ensureContractSynced(
655
714
  targetContractAddress,
656
715
  functionSelector,
657
- FunctionType.UTILITY,
658
- false,
659
- false,
660
- args,
661
- [],
716
+ async (call, execScopes) => {
717
+ await this.executeUtilityCall(call, execScopes, jobId);
718
+ },
719
+ blockHeader,
720
+ jobId,
721
+ await this.keyStore.getAccounts(),
662
722
  );
663
723
 
664
- return this.executeUtilityCall(call);
724
+ const call = FunctionCall.from({
725
+ name: artifact.name,
726
+ to: targetContractAddress,
727
+ selector: functionSelector,
728
+ type: FunctionType.UTILITY,
729
+ hideMsgSender: false,
730
+ isStatic: false,
731
+ args,
732
+ returnTypes: [],
733
+ });
734
+
735
+ return this.executeUtilityCall(call, await this.keyStore.getAccounts(), jobId);
665
736
  }
666
737
 
667
- private async executeUtilityCall(call: FunctionCall): Promise<Fr[]> {
738
+ private async executeUtilityCall(call: FunctionCall, scopes: AztecAddress[], jobId: string): Promise<Fr[]> {
668
739
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
669
740
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
670
741
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
@@ -677,23 +748,25 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
677
748
 
678
749
  try {
679
750
  const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
680
- const oracle = new UtilityExecutionOracle(
681
- call.to,
682
- [],
683
- [],
751
+ const oracle = new UtilityExecutionOracle({
752
+ contractAddress: call.to,
753
+ authWitnesses: [],
754
+ capsules: [],
684
755
  anchorBlockHeader,
685
- this.contractStore,
686
- this.noteStore,
687
- this.keyStore,
688
- this.addressStore,
689
- this.stateMachine.node,
690
- this.stateMachine.anchorBlockStore,
691
- this.recipientTaggingStore,
692
- this.senderAddressBookStore,
693
- this.capsuleStore,
694
- this.privateEventStore,
695
- this.jobId,
696
- );
756
+ contractStore: this.contractStore,
757
+ noteStore: this.noteStore,
758
+ keyStore: this.keyStore,
759
+ addressStore: this.addressStore,
760
+ aztecNode: this.stateMachine.node,
761
+ recipientTaggingStore: this.recipientTaggingStore,
762
+ senderAddressBookStore: this.senderAddressBookStore,
763
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
764
+ privateEventStore: this.privateEventStore,
765
+ messageContextService: this.stateMachine.messageContextService,
766
+ contractSyncService: this.contractSyncService,
767
+ jobId,
768
+ scopes,
769
+ });
697
770
  const acirExecutionResult = await new WASMSimulator()
698
771
  .executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
699
772
  .catch((err: Error) => {
@@ -709,10 +782,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
709
782
  );
710
783
  });
711
784
 
712
- this.logger.verbose(`Utility simulation for ${call.to}.${call.selector} completed`);
785
+ this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
713
786
  return witnessMapToFields(acirExecutionResult.returnWitness);
714
787
  } catch (err) {
715
- throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility simulation'));
788
+ throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
716
789
  }
717
790
  }
718
791