@aztec/end-to-end 0.0.1-commit.7035c9bd6 → 0.0.1-commit.71324e566

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 (78) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.js +13 -28
  5. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -2
  6. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  7. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +1 -1
  8. package/dest/e2e_epochs/epochs_test.js +3 -3
  9. package/dest/e2e_fees/fees_test.js +1 -1
  10. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  11. package/dest/e2e_p2p/p2p_network.d.ts +5 -7
  12. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  13. package/dest/e2e_p2p/p2p_network.js +14 -13
  14. package/dest/e2e_p2p/reqresp/utils.js +1 -1
  15. package/dest/e2e_p2p/shared.d.ts +5 -7
  16. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  17. package/dest/e2e_p2p/shared.js +16 -42
  18. package/dest/fixtures/authwit_proxy.d.ts +1 -1
  19. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  20. package/dest/fixtures/authwit_proxy.js +4 -0
  21. package/dest/fixtures/e2e_prover_test.d.ts +4 -3
  22. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  23. package/dest/fixtures/e2e_prover_test.js +7 -12
  24. package/dest/fixtures/get_bb_config.d.ts +1 -1
  25. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  26. package/dest/fixtures/get_bb_config.js +5 -5
  27. package/dest/fixtures/setup.d.ts +11 -8
  28. package/dest/fixtures/setup.d.ts.map +1 -1
  29. package/dest/fixtures/setup.js +23 -18
  30. package/dest/fixtures/setup_p2p_test.d.ts +6 -6
  31. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  32. package/dest/fixtures/setup_p2p_test.js +8 -8
  33. package/dest/fixtures/token_utils.d.ts +1 -1
  34. package/dest/fixtures/token_utils.d.ts.map +1 -1
  35. package/dest/fixtures/token_utils.js +2 -5
  36. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  37. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  38. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  39. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  40. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  41. package/dest/forward-compatibility/wallet_service.js +109 -0
  42. package/dest/legacy-jest-resolver.d.cts +3 -0
  43. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  44. package/dest/simulators/lending_simulator.d.ts +1 -1
  45. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  46. package/dest/simulators/lending_simulator.js +2 -2
  47. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  48. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  49. package/dest/spartan/setup_test_wallets.js +63 -45
  50. package/dest/test-wallet/test_wallet.d.ts +16 -8
  51. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  52. package/dest/test-wallet/test_wallet.js +102 -67
  53. package/dest/test-wallet/worker_wallet.d.ts +4 -4
  54. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  55. package/dest/test-wallet/worker_wallet_schema.d.ts +9 -4
  56. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  57. package/package.json +40 -39
  58. package/src/bench/client_flows/client_flows_benchmark.ts +31 -22
  59. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +3 -6
  60. package/src/e2e_epochs/epochs_test.ts +3 -3
  61. package/src/e2e_fees/fees_test.ts +1 -1
  62. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  63. package/src/e2e_p2p/p2p_network.ts +22 -27
  64. package/src/e2e_p2p/reqresp/utils.ts +1 -1
  65. package/src/e2e_p2p/shared.ts +16 -57
  66. package/src/fixtures/authwit_proxy.ts +4 -0
  67. package/src/fixtures/e2e_prover_test.ts +12 -17
  68. package/src/fixtures/get_bb_config.ts +7 -6
  69. package/src/fixtures/setup.ts +32 -25
  70. package/src/fixtures/setup_p2p_test.ts +9 -9
  71. package/src/fixtures/token_utils.ts +1 -4
  72. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  73. package/src/forward-compatibility/wallet_service.ts +104 -0
  74. package/src/legacy-jest-resolver.cjs +135 -0
  75. package/src/simulators/lending_simulator.ts +4 -2
  76. package/src/spartan/setup_test_wallets.ts +63 -39
  77. package/src/test-wallet/test_wallet.ts +129 -72
  78. package/src/test-wallet/worker_wallet.ts +3 -2
@@ -145,7 +145,7 @@ export class EpochsTestContext {
145
145
  proverId: EthAddress.fromNumber(1),
146
146
  worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
147
147
  exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
148
- slasherFlavor: 'none',
148
+ slasherEnabled: false,
149
149
  l1PublishingTime,
150
150
  ...opts,
151
151
  },
@@ -223,7 +223,7 @@ export class EpochsTestContext {
223
223
  },
224
224
  },
225
225
  {
226
- prefilledPublicData: this.context.prefilledPublicData ?? [],
226
+ genesis: this.context.genesis,
227
227
  dontStart: opts.dontStart,
228
228
  },
229
229
  ),
@@ -278,7 +278,7 @@ export class EpochsTestContext {
278
278
  slashingProtectionDb: opts.slashingProtectionDb,
279
279
  },
280
280
  {
281
- prefilledPublicData: this.context.prefilledPublicData,
281
+ genesis: this.context.genesis,
282
282
  ...opts,
283
283
  },
284
284
  ),
@@ -193,7 +193,7 @@ export class FeesTest {
193
193
  this.wallet = this.context.wallet;
194
194
  this.aztecNode = this.context.aztecNodeService;
195
195
  this.aztecNodeAdmin = this.context.aztecNodeService;
196
- this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
196
+ this.gasSettings = GasSettings.fallback({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
197
197
  this.cheatCodes = this.context.cheatCodes;
198
198
  this.accounts = deployedAccounts.map(a => a.address);
199
199
  this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
@@ -58,6 +58,7 @@ export class P2PInactivityTest {
58
58
  basePort: BOOT_NODE_UDP_PORT,
59
59
  startProverNode: true,
60
60
  initialConfig: {
61
+ anvilSlotsInAnEpoch: 4,
61
62
  proverNodeConfig: { proverNodeEpochProvingDelayMs: AZTEC_SLOT_DURATION * 1000 },
62
63
  aztecTargetCommitteeSize: COMMITTEE_SIZE,
63
64
  aztecSlotDuration: AZTEC_SLOT_DURATION,
@@ -66,7 +67,6 @@ export class P2PInactivityTest {
66
67
  listenAddress: '127.0.0.1',
67
68
  minTxsPerBlock: 0,
68
69
  aztecEpochDuration: EPOCH_DURATION,
69
- validatorReexecute: false,
70
70
  sentinelEnabled: true,
71
71
  slashingQuorum: SLASHING_QUORUM,
72
72
  slashingRoundSizeInEpochs: SLASHING_ROUND_SIZE_IN_EPOCHS,
@@ -108,7 +108,7 @@ export class P2PInactivityTest {
108
108
  this.test.bootstrapNodeEnr,
109
109
  NUM_NODES - this.inactiveNodeCount - Number(this.keepInitialNode),
110
110
  BOOT_NODE_UDP_PORT,
111
- this.test.prefilledPublicData,
111
+ this.test.genesis,
112
112
  this.dataDir,
113
113
  undefined,
114
114
  Number(this.keepInitialNode),
@@ -122,7 +122,7 @@ export class P2PInactivityTest {
122
122
  this.test.bootstrapNodeEnr,
123
123
  this.inactiveNodeCount,
124
124
  BOOT_NODE_UDP_PORT,
125
- this.test.prefilledPublicData,
125
+ this.test.genesis,
126
126
  this.dataDir,
127
127
  undefined,
128
128
  NUM_NODES - this.inactiveNodeCount,
@@ -3,12 +3,7 @@ import type { AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { Fr } from '@aztec/aztec.js/fields';
5
5
  import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
6
- import {
7
- type EmpireSlashingProposerContract,
8
- GSEContract,
9
- RollupContract,
10
- type TallySlashingProposerContract,
11
- } from '@aztec/ethereum/contracts';
6
+ import { GSEContract, RollupContract, type SlashingProposerContract } from '@aztec/ethereum/contracts';
12
7
  import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
13
8
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
14
9
  import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
@@ -24,9 +19,9 @@ import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
24
19
  import type { BootstrapNode } from '@aztec/p2p/bootstrap';
25
20
  import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
26
21
  import { tryStop } from '@aztec/stdlib/interfaces/server';
27
- import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
28
22
  import { TopicType } from '@aztec/stdlib/p2p';
29
- import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
23
+ import { TxStatus } from '@aztec/stdlib/tx';
24
+ import type { GenesisData } from '@aztec/stdlib/world-state';
30
25
  import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
31
26
  import { getGenesisValues } from '@aztec/world-state/testing';
32
27
 
@@ -77,7 +72,7 @@ export class P2PNetworkTest {
77
72
  public validators: Operator[] = [];
78
73
 
79
74
  public deployedAccounts: InitialAccountData[] = [];
80
- public prefilledPublicData: PublicDataTreeLeaf[] = [];
75
+ public genesis: GenesisData | undefined;
81
76
 
82
77
  // The re-execution test needs a wallet and a spam contract
83
78
  public wallet?: TestWallet;
@@ -124,7 +119,7 @@ export class P2PNetworkTest {
124
119
  initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
125
120
  slashingRoundSizeInEpochs:
126
121
  initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
127
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
122
+ slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
128
123
  aztecTargetCommitteeSize: numberOfValidators,
129
124
  metricsPort: metricsPort,
130
125
  numberOfInitialFundedAccounts: 2,
@@ -137,7 +132,7 @@ export class P2PNetworkTest {
137
132
  aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
138
133
  slashingRoundSizeInEpochs:
139
134
  initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
140
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
135
+ slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
141
136
 
142
137
  ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
143
138
  aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
@@ -305,10 +300,11 @@ export class P2PNetworkTest {
305
300
 
306
301
  async setupAccount() {
307
302
  this.logger.info('Setting up account');
308
- const { deployedAccounts } = await deployAccounts(
309
- 1,
310
- this.logger,
311
- )({
303
+ const { deployedAccounts } = await deployAccounts(1, this.logger, {
304
+ wait: {
305
+ waitForStatus: TxStatus.CHECKPOINTED,
306
+ },
307
+ })({
312
308
  wallet: this.context.wallet,
313
309
  initialFundedAccounts: this.context.initialFundedAccounts,
314
310
  });
@@ -360,7 +356,7 @@ export class P2PNetworkTest {
360
356
  ...this.setupOptions,
361
357
  fundSponsoredFPC: true,
362
358
  skipAccountDeployment: true,
363
- slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
359
+ slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
364
360
  aztecTargetCommitteeSize: 0,
365
361
  l1ContractsArgs: this.deployL1ContractsArgs,
366
362
  },
@@ -372,8 +368,13 @@ export class P2PNetworkTest {
372
368
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
373
369
  const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
374
370
 
375
- const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
376
- this.prefilledPublicData = prefilledPublicData;
371
+ const { genesis } = await getGenesisValues(
372
+ initialFundedAccounts,
373
+ undefined,
374
+ undefined,
375
+ this.context.genesis!.genesisTimestamp,
376
+ );
377
+ this.genesis = genesis;
377
378
 
378
379
  const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
379
380
  this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
@@ -468,8 +469,7 @@ export class P2PNetworkTest {
468
469
  async getContracts(): Promise<{
469
470
  rollup: RollupContract;
470
471
  slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
471
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
472
- slashFactory: SlashFactoryContract;
472
+ slashingProposer: SlashingProposerContract | undefined;
473
473
  }> {
474
474
  if (!this.ctx.deployL1ContractsValues) {
475
475
  throw new Error('DeployAztecL1ContractsValues not set');
@@ -486,14 +486,9 @@ export class P2PNetworkTest {
486
486
  client: this.ctx.deployL1ContractsValues.l1Client,
487
487
  });
488
488
 
489
- // Get the actual slashing proposer from rollup (which handles both empire and tally)
489
+ // Get the actual slashing proposer from rollup
490
490
  const slashingProposer = await rollup.getSlashingProposer();
491
491
 
492
- const slashFactory = new SlashFactoryContract(
493
- this.ctx.deployL1ContractsValues.l1Client,
494
- getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
495
- );
496
-
497
- return { rollup, slasherContract, slashingProposer, slashFactory };
492
+ return { rollup, slasherContract, slashingProposer };
498
493
  }
499
494
  }
@@ -91,7 +91,7 @@ export async function runReqrespTxTest(params: {
91
91
  t.bootstrapNodeEnr,
92
92
  NUM_VALIDATORS,
93
93
  BOOT_NODE_UDP_PORT,
94
- t.prefilledPublicData,
94
+ t.genesis,
95
95
  dataDir,
96
96
  shouldCollectMetrics(),
97
97
  );
@@ -7,11 +7,7 @@ import type { Logger } from '@aztec/aztec.js/log';
7
7
  import { TxHash } from '@aztec/aztec.js/tx';
8
8
  import type { RollupCheatCodes } from '@aztec/aztec/testing';
9
9
  import type { EpochCacheInterface } from '@aztec/epoch-cache';
10
- import type {
11
- EmpireSlashingProposerContract,
12
- RollupContract,
13
- TallySlashingProposerContract,
14
- } from '@aztec/ethereum/contracts';
10
+ import type { RollupContract, SlashingProposerContract } from '@aztec/ethereum/contracts';
15
11
  import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
16
12
  import { timesAsync, unique } from '@aztec/foundation/collection';
17
13
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -22,7 +18,6 @@ import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.j
22
18
  import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
23
19
  import { getRoundForOffense } from '@aztec/slasher';
24
20
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
25
- import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
26
21
 
27
22
  import { submitTxsTo } from '../shared/submit-transactions.js';
28
23
  import { TestWallet } from '../test-wallet/test_wallet.js';
@@ -99,7 +94,7 @@ export async function prepareTransactions(
99
94
  }
100
95
 
101
96
  export function awaitProposalExecution(
102
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract,
97
+ slashingProposer: SlashingProposerContract,
103
98
  timeoutSeconds: number,
104
99
  logger: Logger,
105
100
  ): Promise<bigint> {
@@ -109,24 +104,12 @@ export function awaitProposalExecution(
109
104
  reject(new Error(`Timeout waiting for proposal execution after ${timeoutSeconds}s`));
110
105
  }, timeoutSeconds * 1000);
111
106
 
112
- if (slashingProposer.type === 'empire') {
113
- const unwatch = slashingProposer.listenToPayloadSubmitted(args => {
114
- logger.warn(`Proposal ${args.payload} from round ${args.round} executed`);
115
- clearTimeout(timeout);
116
- unwatch();
117
- resolve(args.round);
118
- });
119
- } else if (slashingProposer.type === 'tally') {
120
- const unwatch = slashingProposer.listenToRoundExecuted(args => {
121
- logger.warn(`Slash from round ${args.round} executed`);
122
- clearTimeout(timeout);
123
- unwatch();
124
- resolve(args.round);
125
- });
126
- } else {
107
+ const unwatch = slashingProposer.listenToRoundExecuted(args => {
108
+ logger.warn(`Slash from round ${args.round} executed`);
127
109
  clearTimeout(timeout);
128
- reject(new Error(`Unknown slashing proposer type: ${(slashingProposer as any).type}`));
129
- }
110
+ unwatch();
111
+ resolve(args.round);
112
+ });
130
113
  });
131
114
  }
132
115
 
@@ -245,7 +228,6 @@ export async function awaitCommitteeKicked({
245
228
  rollup,
246
229
  cheatCodes,
247
230
  committee,
248
- slashFactory,
249
231
  slashingProposer,
250
232
  slashingRoundSize,
251
233
  aztecSlotDuration,
@@ -256,8 +238,7 @@ export async function awaitCommitteeKicked({
256
238
  rollup: RollupContract;
257
239
  cheatCodes: RollupCheatCodes;
258
240
  committee: readonly `0x${string}`[];
259
- slashFactory: SlashFactoryContract;
260
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
241
+ slashingProposer: SlashingProposerContract | undefined;
261
242
  slashingRoundSize: number;
262
243
  aztecSlotDuration: number;
263
244
  aztecEpochDuration: number;
@@ -270,36 +251,14 @@ export async function awaitCommitteeKicked({
270
251
 
271
252
  await cheatCodes.debugRollup();
272
253
 
273
- if (slashingProposer.type === 'empire') {
274
- // Await for the slash payload to be created if empire (no payload is created on tally until execution time)
275
- const targetEpoch = EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1);
276
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
277
- await cheatCodes.advanceToEpoch(targetEpoch);
278
-
279
- const slashPayloadEvents = await retryUntil(
280
- async () => {
281
- const events = await slashFactory.getSlashPayloadCreatedEvents();
282
- return events.length > 0 ? events : undefined;
283
- },
284
- 'slash payload created',
285
- 120,
286
- 1,
287
- );
288
- expect(slashPayloadEvents.length).toBe(1);
289
- // The uniqueness check is needed since a validator may be slashed more than once on the same round (eg because they let two epochs be pruned)
290
- expect(unique(slashPayloadEvents[0].slashes.map(slash => slash.validator.toString()))).toHaveLength(
291
- committee.length,
292
- );
293
- } else {
294
- // Use the slash offset to ensure we are in the right epoch for tally
295
- const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
296
- const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
297
- const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
298
- const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
299
- const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
300
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
301
- await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
302
- }
254
+ // Use the slash offset to ensure we are in the right epoch for tally
255
+ const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
256
+ const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
257
+ const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
258
+ const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
259
+ const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
260
+ logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
261
+ await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
303
262
 
304
263
  const attestersPre = await rollup.getAttesters();
305
264
  expect(attestersPre.length).toBe(committee.length);
@@ -17,6 +17,10 @@ async function buildProxyCall(proxy: GenericProxyContract, action: ContractFunct
17
17
  return proxy.methods.forward_private_3(call.to, call.selector, call.args);
18
18
  } else if (argCount === 4) {
19
19
  return proxy.methods.forward_private_4(call.to, call.selector, call.args);
20
+ } else if (argCount === 5) {
21
+ return proxy.methods.forward_private_5(call.to, call.selector, call.args);
22
+ } else if (argCount === 6) {
23
+ return proxy.methods.forward_private_6(call.to, call.selector, call.args);
20
24
  }
21
25
  throw new Error(`No forward_private_${argCount} method on proxy`);
22
26
  }
@@ -4,12 +4,7 @@ import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
5
  import type { AztecNode } from '@aztec/aztec.js/node';
6
6
  import { CheatCodes } from '@aztec/aztec/testing';
7
- import {
8
- BBCircuitVerifier,
9
- type ClientProtocolCircuitVerifier,
10
- QueuedIVCVerifier,
11
- TestCircuitVerifier,
12
- } from '@aztec/bb-prover';
7
+ import type { ClientProtocolCircuitVerifier } from '@aztec/bb-prover';
13
8
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
9
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
15
10
  import { Buffer32 } from '@aztec/foundation/buffer';
@@ -68,7 +63,10 @@ export class FullProverTest {
68
63
  private provenComponents: ProvenSetup[] = [];
69
64
  private bbConfigCleanup?: () => Promise<void>;
70
65
  private acvmConfigCleanup?: () => Promise<void>;
71
- circuitProofVerifier?: ClientProtocolCircuitVerifier;
66
+ /** Returns the proof verifier from the prover node (for test assertions). */
67
+ get circuitProofVerifier(): ClientProtocolCircuitVerifier | undefined {
68
+ return this.proverAztecNode?.getProofVerifier();
69
+ }
72
70
  provenAsset!: TokenContract;
73
71
  context!: EndToEndContext;
74
72
  private proverAztecNode!: AztecNodeService;
@@ -106,15 +104,13 @@ export class FullProverTest {
106
104
  await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
107
105
 
108
106
  this.logger.info('Applying base setup: deploying token contract');
109
- const {
110
- receipt: { contract: asset, instance },
111
- } = await TokenContract.deploy(
107
+ const { contract: asset, instance } = await TokenContract.deploy(
112
108
  this.wallet,
113
109
  this.accounts[0],
114
110
  FullProverTest.TOKEN_NAME,
115
111
  FullProverTest.TOKEN_SYMBOL,
116
112
  FullProverTest.TOKEN_DECIMALS,
117
- ).send({ from: this.accounts[0], wait: { returnReceipt: true } });
113
+ ).send({ from: this.accounts[0] });
118
114
  this.logger.verbose(`Token deployed to ${asset.address}`);
119
115
 
120
116
  this.fakeProofsAsset = asset;
@@ -170,9 +166,6 @@ export class FullProverTest {
170
166
 
171
167
  await Barretenberg.initSingleton({ backend: BackendType.NativeUnixSocket });
172
168
 
173
- const verifier = await BBCircuitVerifier.new(bbConfig);
174
- this.circuitProofVerifier = new QueuedIVCVerifier(bbConfig, verifier);
175
-
176
169
  this.logger.debug(`Configuring the node for real proofs...`);
177
170
  await this.aztecNodeAdmin.setConfig({
178
171
  realProofs: true,
@@ -180,7 +173,6 @@ export class FullProverTest {
180
173
  });
181
174
  } else {
182
175
  this.logger.debug(`Configuring the node min txs per block ${this.minNumberOfTxsPerBlock}...`);
183
- this.circuitProofVerifier = new TestCircuitVerifier();
184
176
  await this.aztecNodeAdmin.setConfig({
185
177
  minTxsPerBlock: this.minNumberOfTxsPerBlock,
186
178
  });
@@ -231,8 +223,11 @@ export class FullProverTest {
231
223
 
232
224
  this.logger.verbose('Starting prover node');
233
225
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
234
- const { prefilledPublicData } = await getGenesisValues(
226
+ const { genesis } = await getGenesisValues(
235
227
  this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
228
+ undefined,
229
+ undefined,
230
+ this.context.genesis!.genesisTimestamp,
236
231
  );
237
232
 
238
233
  const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
@@ -260,7 +255,7 @@ export class FullProverTest {
260
255
  this.proverAztecNode = await AztecNodeService.createAndSync(
261
256
  proverNodeConfig,
262
257
  { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
263
- { prefilledPublicData },
258
+ { genesis },
264
259
  );
265
260
  this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
266
261
  return this;
@@ -13,8 +13,10 @@ const {
13
13
  BB_SKIP_CLEANUP = '',
14
14
  TEMP_DIR = tmpdir(),
15
15
  BB_WORKING_DIRECTORY = '',
16
- BB_NUM_IVC_VERIFIERS = '1',
16
+ BB_NUM_IVC_VERIFIERS = '8',
17
17
  BB_IVC_CONCURRENCY = '1',
18
+ BB_CHONK_VERIFY_MAX_BATCH = '16',
19
+ BB_CHONK_VERIFY_BATCH_CONCURRENCY = '6',
18
20
  } = process.env;
19
21
 
20
22
  export const getBBConfig = async (
@@ -41,16 +43,15 @@ export const getBBConfig = async (
41
43
  const bbSkipCleanup = ['1', 'true'].includes(BB_SKIP_CLEANUP);
42
44
  const cleanup = bbSkipCleanup ? () => Promise.resolve() : () => tryRmDir(directoryToCleanup);
43
45
 
44
- const numIvcVerifiers = Number(BB_NUM_IVC_VERIFIERS);
45
- const ivcConcurrency = Number(BB_IVC_CONCURRENCY);
46
-
47
46
  return {
48
47
  bbSkipCleanup,
49
48
  bbBinaryPath,
50
49
  bbWorkingDirectory,
51
50
  cleanup,
52
- numConcurrentIVCVerifiers: numIvcVerifiers,
53
- bbIVCConcurrency: ivcConcurrency,
51
+ numConcurrentIVCVerifiers: Number(BB_NUM_IVC_VERIFIERS),
52
+ bbIVCConcurrency: Number(BB_IVC_CONCURRENCY),
53
+ bbChonkVerifyMaxBatch: Number(BB_CHONK_VERIFY_MAX_BATCH),
54
+ bbChonkVerifyConcurrency: Number(BB_CHONK_VERIFY_BATCH_CONCURRENCY),
54
55
  };
55
56
  } catch (err) {
56
57
  logger.error(`Native BB not available, error: ${err}`);
@@ -1,11 +1,14 @@
1
1
  import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
2
  import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
3
3
  import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
4
+ import { NO_FROM } from '@aztec/aztec.js/account';
4
5
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
5
6
  import {
6
7
  BatchCall,
7
8
  type ContractFunctionInteraction,
8
9
  type ContractMethod,
10
+ type DeployInteractionWaitOptions,
11
+ type DeployOptions,
9
12
  getContractClassFromArtifact,
10
13
  waitForProven,
11
14
  } from '@aztec/aztec.js/contracts';
@@ -48,9 +51,10 @@ import type { ProverNodeConfig } from '@aztec/prover-node';
48
51
  import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
49
52
  import type { SequencerClient } from '@aztec/sequencer-client';
50
53
  import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
51
- import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
54
+ import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
52
55
  import { tryStop } from '@aztec/stdlib/interfaces/server';
53
56
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
57
+ import type { GenesisData } from '@aztec/stdlib/world-state';
54
58
  import {
55
59
  type TelemetryClient,
56
60
  type TelemetryClientConfig,
@@ -177,6 +181,8 @@ export type SetupOptions = {
177
181
  proverNodeConfig?: Partial<ProverNodeConfig>;
178
182
  /** Whether to use a mock gossip sub network for p2p clients. */
179
183
  mockGossipSubNetwork?: boolean;
184
+ /** Whether to add simulated latency to the mock gossipsub network (in ms) */
185
+ mockGossipSubNetworkLatency?: number;
180
186
  /** Whether to disable the anvil test watcher (can still be manually started) */
181
187
  disableAnvilTestWatcher?: boolean;
182
188
  /** Whether to enable anvil automine during deployment of L1 contracts (consider defaulting this to true). */
@@ -209,7 +215,7 @@ export type EndToEndContext = {
209
215
  /** The Anvil instance (only set if anvil was started locally). */
210
216
  anvil: Anvil | undefined;
211
217
  /** The Aztec Node service or client a connected to it. */
212
- aztecNode: AztecNode;
218
+ aztecNode: AztecNode & AztecNodeDebug;
213
219
  /** The Aztec Node as a service. */
214
220
  aztecNodeService: AztecNodeService;
215
221
  /** Client to the Aztec Node admin interface. */
@@ -248,8 +254,8 @@ export type EndToEndContext = {
248
254
  sequencerDelayer: Delayer | undefined;
249
255
  /** Delayer for prover node L1 txs (only when enableDelayer and startProverNode are true). */
250
256
  proverDelayer: Delayer | undefined;
251
- /** Prefilled public data used for setting up nodes. */
252
- prefilledPublicData: PublicDataTreeLeaf[] | undefined;
257
+ /** Genesis data used for setting up nodes. */
258
+ genesis: GenesisData | undefined;
253
259
  /** ACVM config (only set if running locally). */
254
260
  acvmConfig: Awaited<ReturnType<typeof getACVMConfig>>;
255
261
  /** BB config (only set if running locally). */
@@ -275,7 +281,7 @@ export async function setup(
275
281
  let anvil: Anvil | undefined;
276
282
  try {
277
283
  opts.aztecTargetCommitteeSize ??= 0;
278
- opts.slasherFlavor ??= 'none';
284
+ opts.slasherEnabled ??= false;
279
285
 
280
286
  const config: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts };
281
287
  // use initialValidators for the node config
@@ -302,6 +308,8 @@ export async function setup(
302
308
  config.dataDirectory = directoryToCleanup;
303
309
  }
304
310
 
311
+ const dateProvider = new TestDateProvider();
312
+
305
313
  if (!config.l1RpcUrls?.length) {
306
314
  if (!isAnvilTestChain(chain.id)) {
307
315
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
@@ -311,6 +319,7 @@ export async function setup(
311
319
  accounts: opts.anvilAccounts,
312
320
  port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
313
321
  slotsInAnEpoch: opts.anvilSlotsInAnEpoch,
322
+ dateProvider,
314
323
  });
315
324
  anvil = res.anvil;
316
325
  config.l1RpcUrls = [res.rpcUrl];
@@ -322,8 +331,6 @@ export async function setup(
322
331
  logger.info(`Logging metrics to ${filename}`);
323
332
  setupMetricsLogger(filename);
324
333
  }
325
-
326
- const dateProvider = new TestDateProvider();
327
334
  const ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrls, dateProvider);
328
335
 
329
336
  if (opts.stateLoad) {
@@ -373,10 +380,12 @@ export async function setup(
373
380
  addressesToFund.push(sponsoredFPCAddress);
374
381
  }
375
382
 
376
- const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(
383
+ const genesisTimestamp = BigInt(Math.floor(Date.now() / 1000));
384
+ const { genesisArchiveRoot, genesis, fundingNeeded } = await getGenesisValues(
377
385
  addressesToFund,
378
386
  opts.initialAccountFeeJuice,
379
387
  opts.genesisPublicData,
388
+ genesisTimestamp,
380
389
  );
381
390
 
382
391
  const wasAutomining = await ethCheatCodes.isAutoMining();
@@ -419,11 +428,12 @@ export async function setup(
419
428
  await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
420
429
  }
421
430
 
422
- // Always sync dateProvider to L1 time after deploying L1 contracts, regardless of mining mode.
423
- // In compose mode, L1 time may have drifted ahead of system time due to the local-network watcher
424
- // warping time forward on each filled slot. Without this sync, the sequencer computes the wrong
425
- // slot from its dateProvider and cannot propose blocks.
426
- dateProvider.setTime((await ethCheatCodes.timestamp()) * 1000);
431
+ // In compose mode (no local anvil), sync dateProvider to L1 time since it may have drifted
432
+ // ahead of system time due to the local-network watcher warping time forward on each filled slot.
433
+ // When running with a local anvil, the dateProvider is kept in sync via the stdout listener.
434
+ if (!anvil) {
435
+ dateProvider.setTime((await ethCheatCodes.lastBlockTimestamp()) * 1000);
436
+ }
427
437
 
428
438
  if (opts.l2StartTime) {
429
439
  await ethCheatCodes.warp(opts.l2StartTime, { resetBlockInterval: true });
@@ -464,7 +474,7 @@ export async function setup(
464
474
  let p2pClientDeps: P2PClientDeps | undefined = undefined;
465
475
 
466
476
  if (opts.mockGossipSubNetwork) {
467
- mockGossipSubNetwork = new MockGossipSubNetwork();
477
+ mockGossipSubNetwork = new MockGossipSubNetwork(opts.mockGossipSubNetworkLatency);
468
478
  p2pClientDeps = { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) };
469
479
  }
470
480
 
@@ -493,11 +503,7 @@ export async function setup(
493
503
  }
494
504
 
495
505
  const aztecNodeService = await withLoggerBindings({ actor: 'node-0' }, () =>
496
- AztecNodeService.createAndSync(
497
- config,
498
- { dateProvider, telemetry: telemetryClient, p2pClientDeps },
499
- { prefilledPublicData },
500
- ),
506
+ AztecNodeService.createAndSync(config, { dateProvider, telemetry: telemetryClient, p2pClientDeps }, { genesis }),
501
507
  );
502
508
  const sequencerClient = aztecNodeService.getSequencer();
503
509
 
@@ -521,7 +527,7 @@ export async function setup(
521
527
  dataDirectory: proverNodeDataDirectory,
522
528
  },
523
529
  { dateProvider, p2pClientDeps, telemetry: telemetryClient },
524
- { prefilledPublicData },
530
+ { genesis },
525
531
  ));
526
532
  }
527
533
 
@@ -626,7 +632,7 @@ export async function setup(
626
632
  initialFundedAccounts,
627
633
  logger,
628
634
  mockGossipSubNetwork,
629
- prefilledPublicData,
635
+ genesis,
630
636
  proverNode,
631
637
  sequencerDelayer,
632
638
  proverDelayer,
@@ -726,7 +732,7 @@ export function createAndSyncProverNode(
726
732
  dateProvider: DateProvider;
727
733
  p2pClientDeps?: P2PClientDeps;
728
734
  },
729
- options: { prefilledPublicData: PublicDataTreeLeaf[]; dontStart?: boolean },
735
+ options: { genesis?: GenesisData; dontStart?: boolean },
730
736
  ): Promise<{ proverNode: AztecNodeService }> {
731
737
  return withLoggerBindings({ actor: 'prover-0' }, async () => {
732
738
  const proverNode = await AztecNodeService.createAndSync(
@@ -739,7 +745,7 @@ export function createAndSyncProverNode(
739
745
  proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
740
746
  },
741
747
  deps,
742
- { ...options, dontStartProverNode: options.dontStart },
748
+ { genesis: options.genesis, dontStartProverNode: options.dontStart },
743
749
  );
744
750
 
745
751
  if (!proverNode.getProverNode()) {
@@ -830,7 +836,7 @@ export async function ensureAccountContractsPublished(wallet: Wallet, accountsTo
830
836
  * Returns deployed account data that can be used by tests.
831
837
  */
832
838
  export const deployAccounts =
833
- (numberOfAccounts: number, logger: Logger) =>
839
+ (numberOfAccounts: number, logger: Logger, deployOptions?: Partial<DeployOptions<DeployInteractionWaitOptions>>) =>
834
840
  async ({ wallet, initialFundedAccounts }: { wallet: TestWallet; initialFundedAccounts: InitialAccountData[] }) => {
835
841
  if (initialFundedAccounts.length < numberOfAccounts) {
836
842
  throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
@@ -847,8 +853,9 @@ export const deployAccounts =
847
853
  );
848
854
  const deployMethod = await accountManager.getDeployMethod();
849
855
  await deployMethod.send({
850
- from: AztecAddress.ZERO,
856
+ from: NO_FROM,
851
857
  skipClassPublication: i !== 0, // Publish the contract class at most once.
858
+ ...deployOptions,
852
859
  });
853
860
  }
854
861