@aztec/txe 0.0.1-commit.f2ce05ee → 0.0.1-commit.f81dbcf

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 (40) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/index.js +82 -50
  4. package/dest/oracle/interfaces.d.ts +4 -3
  5. package/dest/oracle/interfaces.d.ts.map +1 -1
  6. package/dest/oracle/txe_oracle_top_level_context.d.ts +7 -8
  7. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  8. package/dest/oracle/txe_oracle_top_level_context.js +84 -32
  9. package/dest/rpc_translator.d.ts +4 -4
  10. package/dest/rpc_translator.d.ts.map +1 -1
  11. package/dest/rpc_translator.js +19 -7
  12. package/dest/state_machine/archiver.d.ts +3 -3
  13. package/dest/state_machine/archiver.d.ts.map +1 -1
  14. package/dest/state_machine/archiver.js +5 -7
  15. package/dest/state_machine/dummy_p2p_client.d.ts +14 -11
  16. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  17. package/dest/state_machine/dummy_p2p_client.js +23 -14
  18. package/dest/state_machine/index.d.ts +1 -1
  19. package/dest/state_machine/index.d.ts.map +1 -1
  20. package/dest/state_machine/index.js +1 -1
  21. package/dest/txe_session.d.ts +9 -6
  22. package/dest/txe_session.d.ts.map +1 -1
  23. package/dest/txe_session.js +74 -18
  24. package/dest/util/txe_public_contract_data_source.d.ts +2 -3
  25. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  26. package/dest/util/txe_public_contract_data_source.js +5 -22
  27. package/package.json +15 -15
  28. package/src/index.ts +83 -49
  29. package/src/oracle/interfaces.ts +6 -1
  30. package/src/oracle/txe_oracle_top_level_context.ts +86 -70
  31. package/src/rpc_translator.ts +21 -6
  32. package/src/state_machine/archiver.ts +5 -5
  33. package/src/state_machine/dummy_p2p_client.ts +33 -20
  34. package/src/state_machine/index.ts +1 -0
  35. package/src/txe_session.ts +77 -68
  36. package/src/util/txe_public_contract_data_source.ts +10 -36
  37. package/dest/util/txe_contract_store.d.ts +0 -12
  38. package/dest/util/txe_contract_store.d.ts.map +0 -1
  39. package/dest/util/txe_contract_store.js +0 -22
  40. package/src/util/txe_contract_store.ts +0 -36
@@ -12,9 +12,11 @@ import { Fr } from '@aztec/foundation/curves/bn254';
12
12
  import { LogLevels, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log';
13
13
  import { TestDateProvider } from '@aztec/foundation/timer';
14
14
  import type { KeyStore } from '@aztec/key-store';
15
+ import type { AccessScopes } from '@aztec/pxe/client/lazy';
15
16
  import {
16
17
  AddressStore,
17
18
  CapsuleStore,
19
+ type ContractStore,
18
20
  NoteStore,
19
21
  ORACLE_VERSION,
20
22
  PrivateEventStore,
@@ -83,7 +85,6 @@ import { ForkCheckpoint } from '@aztec/world-state';
83
85
  import { DEFAULT_ADDRESS } from '../constants.js';
84
86
  import type { TXEStateMachine } from '../state_machine/index.js';
85
87
  import type { TXEAccountStore } from '../util/txe_account_store.js';
86
- import type { TXEContractStore } from '../util/txe_contract_store.js';
87
88
  import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
88
89
  import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
89
90
  import type { ITxeExecutionOracle } from './interfaces.js';
@@ -96,7 +97,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
96
97
 
97
98
  constructor(
98
99
  private stateMachine: TXEStateMachine,
99
- private contractStore: TXEContractStore,
100
+ private contractStore: ContractStore,
100
101
  private noteStore: NoteStore,
101
102
  private keyStore: KeyStore,
102
103
  private addressStore: AddressStore,
@@ -106,7 +107,6 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
106
107
  private senderAddressBookStore: SenderAddressBookStore,
107
108
  private capsuleStore: CapsuleStore,
108
109
  private privateEventStore: PrivateEventStore,
109
- private jobId: string,
110
110
  private nextBlockTimestamp: bigint,
111
111
  private version: Fr,
112
112
  private chainId: Fr,
@@ -131,9 +131,9 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
131
131
  }
132
132
 
133
133
  // We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
134
- utilityDebugLog(level: number, message: string, fields: Fr[]): Promise<void> {
134
+ utilityLog(level: number, message: string, fields: Fr[]): Promise<void> {
135
135
  if (!LogLevels[level]) {
136
- throw new Error(`Invalid debug log level: ${level}`);
136
+ throw new Error(`Invalid log level: ${level}`);
137
137
  }
138
138
  const levelName = LogLevels[level];
139
139
 
@@ -171,6 +171,25 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
171
171
  return { txHash: txEffects.txHash, noteHashes: txEffects.noteHashes, nullifiers: txEffects.nullifiers };
172
172
  }
173
173
 
174
+ async syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string) {
175
+ if (contractAddress.equals(DEFAULT_ADDRESS)) {
176
+ this.logger.debug(`Skipping sync in txeGetPrivateEvents because the events correspond to the default address.`);
177
+ return;
178
+ }
179
+
180
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
181
+ await this.stateMachine.contractSyncService.ensureContractSynced(
182
+ contractAddress,
183
+ null,
184
+ async (call, execScopes) => {
185
+ await this.executeUtilityCall(call, execScopes, jobId);
186
+ },
187
+ blockHeader,
188
+ jobId,
189
+ [scope],
190
+ );
191
+ }
192
+
174
193
  async txeGetPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) {
175
194
  return (
176
195
  await this.privateEventStore.getPrivateEvents(selector, {
@@ -210,7 +229,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
210
229
  await this.txeAddAccount(artifact, instance, secret);
211
230
  } else {
212
231
  await this.contractStore.addContractInstance(instance);
213
- await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact);
232
+ await this.contractStore.addContractArtifact(artifact);
214
233
  this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
215
234
  }
216
235
  }
@@ -220,7 +239,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
220
239
 
221
240
  this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
222
241
  await this.contractStore.addContractInstance(instance);
223
- await this.contractStore.addContractArtifact(instance.currentContractClassId, artifact);
242
+ await this.contractStore.addContractArtifact(artifact);
224
243
 
225
244
  const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
226
245
  await this.accountStore.setAccount(completeAddress.address, completeAddress);
@@ -284,6 +303,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
284
303
  args: Fr[],
285
304
  argsHash: Fr = Fr.zero(),
286
305
  isStaticCall: boolean = false,
306
+ jobId: string,
287
307
  ) {
288
308
  this.logger.verbose(
289
309
  `Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`,
@@ -297,14 +317,13 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
297
317
  throw new Error(message);
298
318
  }
299
319
 
300
- // When `from` is the zero address (used when creating a new contract account for example),
301
- // we disable scope filtering by setting effectiveScopes to undefined. This allows these operations
302
- // to proceed without requiring keys registered for the zero address.
303
- const effectiveScopes = from.isZero() ? undefined : [from];
320
+ // When `from` is the zero address (e.g. when deploying a new account contract), we return an
321
+ // empty scope list which acts as deny-all: no notes are visible and no keys are accessible.
322
+ const effectiveScopes = from.isZero() ? [] : [from];
304
323
 
305
324
  // Sync notes before executing private function to discover notes from previous transactions
306
- const utilityExecutor = async (call: FunctionCall) => {
307
- await this.executeUtilityCall(call, effectiveScopes);
325
+ const utilityExecutor = async (call: FunctionCall, execScopes: AccessScopes) => {
326
+ await this.executeUtilityCall(call, execScopes, jobId);
308
327
  };
309
328
 
310
329
  const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
@@ -313,7 +332,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
313
332
  functionSelector,
314
333
  utilityExecutor,
315
334
  blockHeader,
316
- this.jobId,
335
+ jobId,
336
+ effectiveScopes,
317
337
  );
318
338
 
319
339
  const blockNumber = await this.txeGetNextBlockNumber();
@@ -337,43 +357,37 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
337
357
 
338
358
  const simulator = new WASMSimulator();
339
359
 
340
- const privateExecutionOracle = new PrivateExecutionOracle(
360
+ const privateExecutionOracle = new PrivateExecutionOracle({
341
361
  argsHash,
342
362
  txContext,
343
363
  callContext,
344
- /** Header of a block whose state is used during private execution (not the block the transaction is included in). */
345
- blockHeader,
364
+ anchorBlockHeader: blockHeader,
346
365
  utilityExecutor,
347
- /** List of transient auth witnesses to be used during this simulation */
348
- Array.from(this.authwits.values()),
349
- /** List of transient auth witnesses to be used during this simulation */
350
- [],
351
- HashedValuesCache.create([new HashedValues(args, argsHash)]),
366
+ authWitnesses: Array.from(this.authwits.values()),
367
+ capsules: [],
368
+ executionCache: HashedValuesCache.create([new HashedValues(args, argsHash)]),
352
369
  noteCache,
353
370
  taggingIndexCache,
354
- this.contractStore,
355
- this.noteStore,
356
- this.keyStore,
357
- this.addressStore,
358
- this.stateMachine.node,
359
- this.senderTaggingStore,
360
- this.recipientTaggingStore,
361
- this.senderAddressBookStore,
362
- this.capsuleStore,
363
- this.privateEventStore,
364
- this.stateMachine.contractSyncService,
365
- this.jobId,
366
- 0, // totalPublicArgsCount
367
- minRevertibleSideEffectCounter, // (start) sideEffectCounter
368
- undefined, // log
369
- effectiveScopes, // scopes
370
- /**
371
- * In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
372
- * contract would perform, including setting senderForTags.
373
- */
374
- from,
371
+ contractStore: this.contractStore,
372
+ noteStore: this.noteStore,
373
+ keyStore: this.keyStore,
374
+ addressStore: this.addressStore,
375
+ aztecNode: this.stateMachine.node,
376
+ senderTaggingStore: this.senderTaggingStore,
377
+ recipientTaggingStore: this.recipientTaggingStore,
378
+ senderAddressBookStore: this.senderAddressBookStore,
379
+ capsuleStore: this.capsuleStore,
380
+ privateEventStore: this.privateEventStore,
381
+ contractSyncService: this.stateMachine.contractSyncService,
382
+ jobId,
383
+ totalPublicCalldataCount: 0,
384
+ sideEffectCounter: minRevertibleSideEffectCounter,
385
+ scopes: effectiveScopes,
386
+ // In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
387
+ // contract would perform, including setting senderForTags.
388
+ senderForTags: from,
375
389
  simulator,
376
- );
390
+ });
377
391
 
378
392
  // 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.
379
393
  let result: PrivateExecutionResult;
@@ -413,6 +427,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
413
427
  const { publicInputs } = await generateSimulatedProvingResult(
414
428
  result,
415
429
  (addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
430
+ this.stateMachine.node,
416
431
  minRevertibleSideEffectCounter,
417
432
  );
418
433
 
@@ -595,7 +610,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
595
610
  constantData,
596
611
  /*gasUsed=*/ new Gas(0, 0),
597
612
  /*feePayer=*/ AztecAddress.zero(),
598
- /*includeByTimestamp=*/ 0n,
613
+ /*expirationTimestamp=*/ 0n,
599
614
  inputsForPublic,
600
615
  undefined,
601
616
  );
@@ -663,10 +678,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
663
678
  return returnValues ?? [];
664
679
  }
665
680
 
666
- async txeSimulateUtilityFunction(
681
+ async txeExecuteUtilityFunction(
667
682
  targetContractAddress: AztecAddress,
668
683
  functionSelector: FunctionSelector,
669
684
  args: Fr[],
685
+ jobId: string,
670
686
  ) {
671
687
  const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
672
688
  if (!artifact) {
@@ -678,11 +694,12 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
678
694
  await this.stateMachine.contractSyncService.ensureContractSynced(
679
695
  targetContractAddress,
680
696
  functionSelector,
681
- async call => {
682
- await this.executeUtilityCall(call);
697
+ async (call, execScopes) => {
698
+ await this.executeUtilityCall(call, execScopes, jobId);
683
699
  },
684
700
  blockHeader,
685
- this.jobId,
701
+ jobId,
702
+ 'ALL_SCOPES',
686
703
  );
687
704
 
688
705
  const call = FunctionCall.from({
@@ -696,10 +713,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
696
713
  returnTypes: [],
697
714
  });
698
715
 
699
- return this.executeUtilityCall(call);
716
+ return this.executeUtilityCall(call, 'ALL_SCOPES', jobId);
700
717
  }
701
718
 
702
- private async executeUtilityCall(call: FunctionCall, scopes?: AztecAddress[]): Promise<Fr[]> {
719
+ private async executeUtilityCall(call: FunctionCall, scopes: AccessScopes, jobId: string): Promise<Fr[]> {
703
720
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
704
721
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
705
722
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
@@ -712,24 +729,23 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
712
729
 
713
730
  try {
714
731
  const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
715
- const oracle = new UtilityExecutionOracle(
716
- call.to,
717
- [],
718
- [],
732
+ const oracle = new UtilityExecutionOracle({
733
+ contractAddress: call.to,
734
+ authWitnesses: [],
735
+ capsules: [],
719
736
  anchorBlockHeader,
720
- this.contractStore,
721
- this.noteStore,
722
- this.keyStore,
723
- this.addressStore,
724
- this.stateMachine.node,
725
- this.recipientTaggingStore,
726
- this.senderAddressBookStore,
727
- this.capsuleStore,
728
- this.privateEventStore,
729
- this.jobId,
730
- undefined, // log
731
- scopes, // scopes - used to filter notes by account
732
- );
737
+ contractStore: this.contractStore,
738
+ noteStore: this.noteStore,
739
+ keyStore: this.keyStore,
740
+ addressStore: this.addressStore,
741
+ aztecNode: this.stateMachine.node,
742
+ recipientTaggingStore: this.recipientTaggingStore,
743
+ senderAddressBookStore: this.senderAddressBookStore,
744
+ capsuleStore: this.capsuleStore,
745
+ privateEventStore: this.privateEventStore,
746
+ jobId,
747
+ scopes,
748
+ });
733
749
  const acirExecutionResult = await new WASMSimulator()
734
750
  .executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
735
751
  .catch((err: Error) => {
@@ -745,10 +761,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
745
761
  );
746
762
  });
747
763
 
748
- this.logger.verbose(`Utility simulation for ${call.to}.${call.selector} completed`);
764
+ this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
749
765
  return witnessMapToFields(acirExecutionResult.returnWitness);
750
766
  } catch (err) {
751
- throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility simulation'));
767
+ throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
752
768
  }
753
769
  }
754
770
 
@@ -30,7 +30,7 @@ import {
30
30
  toSingle,
31
31
  } from './util/encoding.js';
32
32
 
33
- const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
33
+ const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
34
34
  const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
35
35
 
36
36
  export class UnavailableOracleError extends Error {
@@ -285,6 +285,13 @@ export class RPCTranslator {
285
285
  const contractAddress = addressFromSingle(foreignContractAddress);
286
286
  const scope = addressFromSingle(foreignScope);
287
287
 
288
+ // TODO(F-335): Avoid doing the following 2 calls here.
289
+ {
290
+ await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
291
+ // We cycle job to commit the stores after the contract sync.
292
+ await this.stateHandler.cycleJob();
293
+ }
294
+
288
295
  const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
289
296
 
290
297
  if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
@@ -328,7 +335,7 @@ export class RPCTranslator {
328
335
 
329
336
  // When the argument is a slice, noir automatically adds a length field to oracle call.
330
337
  // When the argument is an array, we add the field length manually to the signature.
331
- async utilityDebugLog(
338
+ async utilityLog(
332
339
  foreignLevel: ForeignCallSingle,
333
340
  foreignMessage: ForeignCallArray,
334
341
  _foreignLength: ForeignCallSingle,
@@ -340,7 +347,7 @@ export class RPCTranslator {
340
347
  .join('');
341
348
  const fields = fromArray(foreignFields);
342
349
 
343
- await this.handlerAsMisc().utilityDebugLog(level, message, fields);
350
+ await this.handlerAsMisc().utilityLog(level, message, fields);
344
351
 
345
352
  return toForeignCallResult([]);
346
353
  }
@@ -849,7 +856,7 @@ export class RPCTranslator {
849
856
 
850
857
  // AVM opcodes
851
858
 
852
- avmOpcodeEmitUnencryptedLog(_foreignMessage: ForeignCallArray) {
859
+ avmOpcodeEmitPublicLog(_foreignMessage: ForeignCallArray) {
853
860
  // TODO(#8811): Implement
854
861
  return toForeignCallResult([]);
855
862
  }
@@ -1038,12 +1045,15 @@ export class RPCTranslator {
1038
1045
  args,
1039
1046
  argsHash,
1040
1047
  isStaticCall,
1048
+ this.stateHandler.getCurrentJob(),
1041
1049
  );
1042
1050
 
1051
+ // TODO(F-335): Avoid doing the following call here.
1052
+ await this.stateHandler.cycleJob();
1043
1053
  return toForeignCallResult([toArray(returnValues)]);
1044
1054
  }
1045
1055
 
1046
- async txeSimulateUtilityFunction(
1056
+ async txeExecuteUtilityFunction(
1047
1057
  foreignTargetContractAddress: ForeignCallSingle,
1048
1058
  foreignFunctionSelector: ForeignCallSingle,
1049
1059
  foreignArgs: ForeignCallArray,
@@ -1052,12 +1062,15 @@ export class RPCTranslator {
1052
1062
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
1053
1063
  const args = fromArray(foreignArgs);
1054
1064
 
1055
- const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(
1065
+ const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction(
1056
1066
  targetContractAddress,
1057
1067
  functionSelector,
1058
1068
  args,
1069
+ this.stateHandler.getCurrentJob(),
1059
1070
  );
1060
1071
 
1072
+ // TODO(F-335): Avoid doing the following call here.
1073
+ await this.stateHandler.cycleJob();
1061
1074
  return toForeignCallResult([toArray(returnValues)]);
1062
1075
  }
1063
1076
 
@@ -1074,6 +1087,8 @@ export class RPCTranslator {
1074
1087
 
1075
1088
  const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
1076
1089
 
1090
+ // TODO(F-335): Avoid doing the following call here.
1091
+ await this.stateHandler.cycleJob();
1077
1092
  return toForeignCallResult([toArray(returnValues)]);
1078
1093
  }
1079
1094
 
@@ -17,7 +17,7 @@ export class TXEArchiver extends ArchiverDataSourceBase {
17
17
  private readonly updater = new ArchiverDataStoreUpdater(this.store);
18
18
 
19
19
  constructor(db: AztecAsyncKVStore) {
20
- const store = new KVArchiverDataStore(db, 9999, { epochDuration: 32 });
20
+ const store = new KVArchiverDataStore(db, 9999);
21
21
  super(store);
22
22
  }
23
23
 
@@ -79,12 +79,12 @@ export class TXEArchiver extends ArchiverDataSourceBase {
79
79
  };
80
80
  }
81
81
 
82
- public getL2SlotNumber(): Promise<SlotNumber | undefined> {
83
- throw new Error('TXE Archiver does not implement "getL2SlotNumber"');
82
+ public getSyncedL2SlotNumber(): Promise<SlotNumber | undefined> {
83
+ throw new Error('TXE Archiver does not implement "getSyncedL2SlotNumber"');
84
84
  }
85
85
 
86
- public getL2EpochNumber(): Promise<EpochNumber | undefined> {
87
- throw new Error('TXE Archiver does not implement "getL2EpochNumber"');
86
+ public getSyncedL2EpochNumber(): Promise<EpochNumber | undefined> {
87
+ throw new Error('TXE Archiver does not implement "getSyncedL2EpochNumber"');
88
88
  }
89
89
 
90
90
  public isEpochComplete(_epochNumber: EpochNumber): Promise<boolean> {
@@ -6,6 +6,7 @@ import type {
6
6
  P2PBlockReceivedCallback,
7
7
  P2PCheckpointReceivedCallback,
8
8
  P2PConfig,
9
+ P2PDuplicateAttestationCallback,
9
10
  P2PDuplicateProposalCallback,
10
11
  P2PSyncState,
11
12
  PeerId,
@@ -15,12 +16,12 @@ import type {
15
16
  StatusMessage,
16
17
  } from '@aztec/p2p';
17
18
  import type { EthAddress, L2BlockStreamEvent, L2Tips } from '@aztec/stdlib/block';
18
- import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
19
- import type { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
20
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
19
+ import type { ITxProvider, PeerInfo } from '@aztec/stdlib/interfaces/server';
20
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p';
21
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
21
22
 
22
23
  export class DummyP2P implements P2P {
23
- public validate(_txs: Tx[]): Promise<void> {
24
+ public validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise<void> {
24
25
  return Promise.resolve();
25
26
  }
26
27
 
@@ -40,6 +41,10 @@ export class DummyP2P implements P2P {
40
41
  throw new Error('DummyP2P does not implement "getPeers"');
41
42
  }
42
43
 
44
+ public getGossipMeshPeerCount(_topicType: TopicType): Promise<number> {
45
+ return Promise.resolve(0);
46
+ }
47
+
43
48
  public broadcastProposal(_proposal: BlockProposal): Promise<void> {
44
49
  throw new Error('DummyP2P does not implement "broadcastProposal"');
45
50
  }
@@ -72,8 +77,8 @@ export class DummyP2P implements P2P {
72
77
  throw new Error('DummyP2P does not implement "sendTx"');
73
78
  }
74
79
 
75
- public deleteTxs(_txHashes: TxHash[]): Promise<void> {
76
- throw new Error('DummyP2P does not implement "deleteTxs"');
80
+ public handleFailedExecution(_txHashes: TxHash[]): Promise<void> {
81
+ throw new Error('DummyP2P does not implement "handleFailedExecution"');
77
82
  }
78
83
 
79
84
  public getTxByHashFromPool(_txHash: TxHash): Promise<Tx | undefined> {
@@ -98,6 +103,10 @@ export class DummyP2P implements P2P {
98
103
  throw new Error('DummyP2P does not implement "iteratePendingTxs"');
99
104
  }
100
105
 
106
+ public iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
107
+ throw new Error('DummyP2P does not implement "iterateEligiblePendingTxs"');
108
+ }
109
+
101
110
  public getPendingTxCount(): Promise<number> {
102
111
  throw new Error('DummyP2P does not implement "getPendingTxCount"');
103
112
  }
@@ -126,6 +135,10 @@ export class DummyP2P implements P2P {
126
135
  throw new Error('DummyP2P does not implement "isP2PClient"');
127
136
  }
128
137
 
138
+ public getTxProvider(): ITxProvider {
139
+ throw new Error('DummyP2P does not implement "getTxProvider"');
140
+ }
141
+
129
142
  public getTxsByHash(_txHashes: TxHash[]): Promise<Tx[]> {
130
143
  throw new Error('DummyP2P does not implement "getTxsByHash"');
131
144
  }
@@ -158,14 +171,6 @@ export class DummyP2P implements P2P {
158
171
  throw new Error('DummyP2P does not implement "sync"');
159
172
  }
160
173
 
161
- public requestTxsByHash(_txHashes: TxHash[]): Promise<Tx[]> {
162
- throw new Error('DummyP2P does not implement "requestTxsByHash"');
163
- }
164
-
165
- public getTxs(_filter: 'all' | 'pending' | 'mined'): Promise<Tx[]> {
166
- throw new Error('DummyP2P does not implement "getTxs"');
167
- }
168
-
169
174
  public getTxsByHashFromPool(_txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
170
175
  throw new Error('DummyP2P does not implement "getTxsByHashFromPool"');
171
176
  }
@@ -174,10 +179,6 @@ export class DummyP2P implements P2P {
174
179
  throw new Error('DummyP2P does not implement "hasTxsInPool"');
175
180
  }
176
181
 
177
- public addTxsToPool(_txs: Tx[]): Promise<number> {
178
- throw new Error('DummyP2P does not implement "addTxs"');
179
- }
180
-
181
182
  public getSyncedLatestBlockNum(): Promise<number> {
182
183
  throw new Error('DummyP2P does not implement "getSyncedLatestBlockNum"');
183
184
  }
@@ -190,8 +191,12 @@ export class DummyP2P implements P2P {
190
191
  throw new Error('DummyP2P does not implement "getSyncedLatestSlot"');
191
192
  }
192
193
 
193
- markTxsAsNonEvictable(_: TxHash[]): Promise<void> {
194
- throw new Error('DummyP2P does not implement "markTxsAsNonEvictable".');
194
+ protectTxs(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<TxHash[]> {
195
+ throw new Error('DummyP2P does not implement "protectTxs".');
196
+ }
197
+
198
+ prepareForSlot(_slotNumber: SlotNumber): Promise<void> {
199
+ return Promise.resolve();
195
200
  }
196
201
 
197
202
  addReqRespSubProtocol(
@@ -211,4 +216,12 @@ export class DummyP2P implements P2P {
211
216
  public registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void {
212
217
  throw new Error('DummyP2P does not implement "registerDuplicateProposalCallback"');
213
218
  }
219
+
220
+ public registerDuplicateAttestationCallback(_callback: P2PDuplicateAttestationCallback): void {
221
+ throw new Error('DummyP2P does not implement "registerDuplicateAttestationCallback"');
222
+ }
223
+
224
+ public hasBlockProposalsForSlot(_slot: SlotNumber): Promise<boolean> {
225
+ throw new Error('DummyP2P does not implement "hasBlockProposalsForSlot"');
226
+ }
214
227
  }
@@ -50,6 +50,7 @@ export class TXEStateMachine {
50
50
  undefined,
51
51
  undefined,
52
52
  undefined,
53
+ undefined,
53
54
  VERSION,
54
55
  CHAIN_ID,
55
56
  new TXEGlobalVariablesBuilder(),