@aztec/end-to-end 0.0.1-commit.ec5f612 → 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 (121) 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 +19 -26
  5. package/dest/bench/utils.d.ts +1 -1
  6. package/dest/bench/utils.d.ts.map +1 -1
  7. package/dest/bench/utils.js +6 -3
  8. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -2
  9. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +15 -15
  11. package/dest/e2e_epochs/epochs_test.d.ts +3 -1
  12. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  13. package/dest/e2e_epochs/epochs_test.js +8 -5
  14. package/dest/e2e_fees/fees_test.d.ts +1 -1
  15. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  16. package/dest/e2e_fees/fees_test.js +13 -6
  17. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  18. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  19. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  20. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  21. package/dest/e2e_p2p/p2p_network.d.ts +8 -9
  22. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  23. package/dest/e2e_p2p/p2p_network.js +33 -29
  24. package/dest/e2e_p2p/reqresp/utils.d.ts +1 -1
  25. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  26. package/dest/e2e_p2p/reqresp/utils.js +16 -3
  27. package/dest/e2e_p2p/shared.d.ts +25 -7
  28. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  29. package/dest/e2e_p2p/shared.js +49 -44
  30. package/dest/e2e_token_contract/token_contract_test.d.ts +1 -1
  31. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  32. package/dest/e2e_token_contract/token_contract_test.js +11 -11
  33. package/dest/fixtures/authwit_proxy.d.ts +3 -3
  34. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  35. package/dest/fixtures/authwit_proxy.js +4 -0
  36. package/dest/fixtures/e2e_prover_test.d.ts +4 -3
  37. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  38. package/dest/fixtures/e2e_prover_test.js +11 -16
  39. package/dest/fixtures/get_bb_config.d.ts +1 -1
  40. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  41. package/dest/fixtures/get_bb_config.js +5 -5
  42. package/dest/fixtures/setup.d.ts +17 -9
  43. package/dest/fixtures/setup.d.ts.map +1 -1
  44. package/dest/fixtures/setup.js +27 -21
  45. package/dest/fixtures/setup_p2p_test.d.ts +6 -6
  46. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  47. package/dest/fixtures/setup_p2p_test.js +8 -8
  48. package/dest/fixtures/token_utils.d.ts +1 -1
  49. package/dest/fixtures/token_utils.d.ts.map +1 -1
  50. package/dest/fixtures/token_utils.js +2 -5
  51. package/dest/legacy-jest-resolver.d.cts +3 -0
  52. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  53. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  54. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  55. package/dest/shared/cross_chain_test_harness.js +13 -13
  56. package/dest/shared/gas_portal_test_harness.js +2 -2
  57. package/dest/shared/jest_setup.js +32 -1
  58. package/dest/shared/submit-transactions.d.ts +1 -1
  59. package/dest/shared/submit-transactions.d.ts.map +1 -1
  60. package/dest/shared/submit-transactions.js +1 -1
  61. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  62. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  63. package/dest/shared/uniswap_l1_l2.js +14 -17
  64. package/dest/simulators/lending_simulator.d.ts +1 -1
  65. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  66. package/dest/simulators/lending_simulator.js +4 -4
  67. package/dest/simulators/token_simulator.d.ts +1 -1
  68. package/dest/simulators/token_simulator.d.ts.map +1 -1
  69. package/dest/simulators/token_simulator.js +2 -2
  70. package/dest/spartan/setup_test_wallets.d.ts +4 -2
  71. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  72. package/dest/spartan/setup_test_wallets.js +69 -38
  73. package/dest/spartan/tx_metrics.js +1 -1
  74. package/dest/spartan/utils/config.d.ts +4 -1
  75. package/dest/spartan/utils/config.d.ts.map +1 -1
  76. package/dest/spartan/utils/config.js +1 -0
  77. package/dest/spartan/utils/index.d.ts +2 -1
  78. package/dest/spartan/utils/index.d.ts.map +1 -1
  79. package/dest/spartan/utils/index.js +2 -0
  80. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  81. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  82. package/dest/spartan/utils/pod_logs.js +74 -0
  83. package/dest/test-wallet/test_wallet.d.ts +24 -23
  84. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  85. package/dest/test-wallet/test_wallet.js +115 -80
  86. package/dest/test-wallet/worker_wallet.d.ts +4 -4
  87. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  88. package/dest/test-wallet/worker_wallet_schema.d.ts +4 -4
  89. package/package.json +43 -44
  90. package/src/bench/client_flows/client_flows_benchmark.ts +27 -10
  91. package/src/bench/utils.ts +7 -2
  92. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -20
  93. package/src/e2e_epochs/epochs_test.ts +17 -5
  94. package/src/e2e_fees/fees_test.ts +13 -6
  95. package/src/e2e_nested_contract/nested_contract_test.ts +6 -4
  96. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  97. package/src/e2e_p2p/p2p_network.ts +47 -48
  98. package/src/e2e_p2p/reqresp/utils.ts +24 -3
  99. package/src/e2e_p2p/shared.ts +71 -59
  100. package/src/e2e_token_contract/token_contract_test.ts +16 -8
  101. package/src/fixtures/authwit_proxy.ts +4 -0
  102. package/src/fixtures/e2e_prover_test.ts +19 -18
  103. package/src/fixtures/get_bb_config.ts +7 -6
  104. package/src/fixtures/setup.ts +43 -28
  105. package/src/fixtures/setup_p2p_test.ts +9 -9
  106. package/src/fixtures/token_utils.ts +1 -2
  107. package/src/legacy-jest-resolver.cjs +135 -0
  108. package/src/shared/cross_chain_test_harness.ts +13 -9
  109. package/src/shared/gas_portal_test_harness.ts +1 -1
  110. package/src/shared/jest_setup.ts +36 -1
  111. package/src/shared/submit-transactions.ts +1 -4
  112. package/src/shared/uniswap_l1_l2.ts +35 -28
  113. package/src/simulators/lending_simulator.ts +8 -4
  114. package/src/simulators/token_simulator.ts +6 -2
  115. package/src/spartan/setup_test_wallets.ts +90 -35
  116. package/src/spartan/tx_metrics.ts +1 -1
  117. package/src/spartan/utils/config.ts +1 -0
  118. package/src/spartan/utils/index.ts +3 -0
  119. package/src/spartan/utils/pod_logs.ts +99 -0
  120. package/src/test-wallet/test_wallet.ts +144 -99
  121. package/src/test-wallet/worker_wallet.ts +3 -2
@@ -25,7 +25,7 @@ export async function benchmarkSetup(
25
25
  ) {
26
26
  const context = await setup(1, { ...opts, telemetryConfig: { benchmark: true } });
27
27
  const defaultAccountAddress = context.accounts[0];
28
- const contract = await BenchmarkingContract.deploy(context.wallet).send({ from: defaultAccountAddress });
28
+ const { contract } = await BenchmarkingContract.deploy(context.wallet).send({ from: defaultAccountAddress });
29
29
  context.logger.info(`Deployed benchmarking contract at ${contract.address}`);
30
30
  const sequencer = (context.aztecNode as AztecNodeService).getSequencer()!;
31
31
  const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
@@ -149,7 +149,12 @@ export async function sendTxs(
149
149
  context.logger.info(`Creating ${txCount} txs`);
150
150
  const [from] = context.accounts;
151
151
  context.logger.info(`Sending ${txCount} txs`);
152
- return Promise.all(calls.map(call => call.send({ from, wait: NO_WAIT })));
152
+ return Promise.all(
153
+ calls.map(async call => {
154
+ const { txHash } = await call.send({ from, wait: NO_WAIT });
155
+ return txHash;
156
+ }),
157
+ );
153
158
  }
154
159
 
155
160
  export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
@@ -10,6 +10,7 @@ import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist'
10
10
  import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
11
11
  import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
12
12
  import type { SequencerClient } from '@aztec/sequencer-client';
13
+ import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
13
14
 
14
15
  import { jest } from '@jest/globals';
15
16
 
@@ -57,7 +58,7 @@ export class BlacklistTokenContractTest {
57
58
  authwitProxy!: GenericProxyContract;
58
59
  cheatCodes!: CheatCodes;
59
60
  sequencer!: SequencerClient;
60
- aztecNode!: AztecNode;
61
+ aztecNode!: AztecNode & AztecNodeDebug;
61
62
 
62
63
  adminAddress!: AztecAddress;
63
64
  otherAddress!: AztecAddress;
@@ -68,11 +69,7 @@ export class BlacklistTokenContractTest {
68
69
  }
69
70
 
70
71
  async crossTimestampOfChange() {
71
- await this.cheatCodes.warpL2TimeAtLeastBy(
72
- this.sequencer,
73
- this.aztecNode,
74
- BlacklistTokenContractTest.CHANGE_ROLES_DELAY,
75
- );
72
+ await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
76
73
  }
77
74
 
78
75
  /**
@@ -107,20 +104,24 @@ export class BlacklistTokenContractTest {
107
104
  await publicDeployAccounts(this.wallet, [this.adminAddress, this.otherAddress, this.blacklistedAddress]);
108
105
 
109
106
  this.logger.verbose(`Deploying TokenContract...`);
110
- this.asset = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
107
+ ({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
111
108
  from: this.adminAddress,
112
- });
109
+ }));
113
110
  this.logger.verbose(`Token deployed to ${this.asset.address}`);
114
111
 
115
112
  this.logger.verbose(`Deploying bad account...`);
116
- this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
113
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
114
+ from: this.adminAddress,
115
+ }));
117
116
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
118
117
 
119
118
  // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
120
119
  // (so their notes are in scope), but msg_sender in the target must differ from the note owner
121
120
  // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
122
121
  this.logger.verbose(`Deploying generic proxy...`);
123
- this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({ from: this.adminAddress });
122
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
123
+ from: this.adminAddress,
124
+ }));
124
125
  this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
125
126
 
126
127
  await this.crossTimestampOfChange();
@@ -133,9 +134,9 @@ export class BlacklistTokenContractTest {
133
134
  [this.adminAddress, this.otherAddress, this.blacklistedAddress],
134
135
  );
135
136
 
136
- expect(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).toEqual(
137
- new Role().withAdmin().toNoirStruct(),
138
- );
137
+ expect(
138
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
139
+ ).toEqual(new Role().withAdmin().toNoirStruct());
139
140
  }
140
141
 
141
142
  async setup() {
@@ -189,9 +190,9 @@ export class BlacklistTokenContractTest {
189
190
 
190
191
  await this.crossTimestampOfChange();
191
192
 
192
- expect(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).toEqual(
193
- adminMinterRole.toNoirStruct(),
194
- );
193
+ expect(
194
+ (await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
195
+ ).toEqual(adminMinterRole.toNoirStruct());
195
196
 
196
197
  this.logger.verbose(`Minting ${amount} publicly...`);
197
198
  await asset.methods.mint_public(this.adminAddress, amount).send({ from: this.adminAddress });
@@ -199,7 +200,7 @@ export class BlacklistTokenContractTest {
199
200
  this.logger.verbose(`Minting ${amount} privately...`);
200
201
  const secret = Fr.random();
201
202
  const secretHash = await computeSecretHash(secret);
202
- const receipt = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
203
+ const { receipt } = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
203
204
 
204
205
  await this.addPendingShieldNoteToPXE(asset, this.adminAddress, amount, secretHash, receipt.txHash);
205
206
  await asset.methods.redeem_shield(this.adminAddress, amount, secret).send({ from: this.adminAddress });
@@ -207,20 +208,20 @@ export class BlacklistTokenContractTest {
207
208
 
208
209
  tokenSim.mintPublic(this.adminAddress, amount);
209
210
 
210
- const publicBalance = await asset.methods
211
+ const { result: publicBalance } = await asset.methods
211
212
  .balance_of_public(this.adminAddress)
212
213
  .simulate({ from: this.adminAddress });
213
214
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
214
215
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(this.adminAddress));
215
216
 
216
217
  tokenSim.mintPrivate(this.adminAddress, amount);
217
- const privateBalance = await asset.methods
218
+ const { result: privateBalance } = await asset.methods
218
219
  .balance_of_private(this.adminAddress)
219
220
  .simulate({ from: this.adminAddress });
220
221
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
221
222
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(this.adminAddress));
222
223
 
223
- const totalSupply = await asset.methods.total_supply().simulate({ from: this.adminAddress });
224
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: this.adminAddress });
224
225
  this.logger.verbose(`Total supply: ${totalSupply}`);
225
226
  expect(totalSupply).toEqual(tokenSim.totalSupply);
226
227
  }
@@ -28,6 +28,7 @@ import { type SequencerClient, type SequencerEvents, SequencerState } from '@azt
28
28
  import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
29
29
  import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
30
30
  import { tryStop } from '@aztec/stdlib/interfaces/server';
31
+ import type { SlashingProtectionDatabase } from '@aztec/validator-ha-signer/types';
31
32
 
32
33
  import { join } from 'path';
33
34
  import type { Hex } from 'viem';
@@ -144,7 +145,7 @@ export class EpochsTestContext {
144
145
  proverId: EthAddress.fromNumber(1),
145
146
  worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
146
147
  exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
147
- slasherFlavor: 'none',
148
+ slasherEnabled: false,
148
149
  l1PublishingTime,
149
150
  ...opts,
150
151
  },
@@ -181,6 +182,7 @@ export class EpochsTestContext {
181
182
  ethereumSlotDuration,
182
183
  proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
183
184
  targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
185
+ rollupManaLimit: Number(await this.rollup.getManaLimit()),
184
186
  };
185
187
 
186
188
  this.logger.info(
@@ -221,7 +223,7 @@ export class EpochsTestContext {
221
223
  },
222
224
  },
223
225
  {
224
- prefilledPublicData: this.context.prefilledPublicData ?? [],
226
+ genesis: this.context.genesis,
225
227
  dontStart: opts.dontStart,
226
228
  },
227
229
  ),
@@ -237,13 +239,21 @@ export class EpochsTestContext {
237
239
 
238
240
  public createValidatorNode(
239
241
  privateKeys: `0x${string}`[],
240
- opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {},
242
+ opts: Partial<AztecNodeConfig> & {
243
+ dontStartSequencer?: boolean;
244
+ slashingProtectionDb?: SlashingProtectionDatabase;
245
+ } = {},
241
246
  ) {
242
247
  this.logger.warn('Creating and syncing a validator node...');
243
248
  return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
244
249
  }
245
250
 
246
- private async createNode(opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {}) {
251
+ private async createNode(
252
+ opts: Partial<AztecNodeConfig> & {
253
+ dontStartSequencer?: boolean;
254
+ slashingProtectionDb?: SlashingProtectionDatabase;
255
+ } = {},
256
+ ) {
247
257
  const nodeIndex = this.nodes.length + 1;
248
258
  const actorPrefix = opts.disableValidator ? 'node' : 'validator';
249
259
  const { mockGossipSubNetwork } = this.context;
@@ -256,6 +266,7 @@ export class EpochsTestContext {
256
266
  ...resolvedConfig,
257
267
  dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
258
268
  validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
269
+ nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
259
270
  p2pEnabled,
260
271
  p2pIp,
261
272
  },
@@ -264,9 +275,10 @@ export class EpochsTestContext {
264
275
  p2pClientDeps: {
265
276
  p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
266
277
  },
278
+ slashingProtectionDb: opts.slashingProtectionDb,
267
279
  },
268
280
  {
269
- prefilledPublicData: this.context.prefilledPublicData,
281
+ genesis: this.context.genesis,
270
282
  ...opts,
271
283
  },
272
284
  ),
@@ -1,7 +1,7 @@
1
1
  import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
3
3
  import type { AztecNode } from '@aztec/aztec.js/node';
4
- import { CheatCodes } from '@aztec/aztec/testing';
4
+ import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
5
5
  import { createExtendedL1Client } from '@aztec/ethereum/client';
6
6
  import { RollupContract } from '@aztec/ethereum/contracts';
7
7
  import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
@@ -104,12 +104,15 @@ export class FeesTest {
104
104
 
105
105
  async setup() {
106
106
  this.logger.verbose('Setting up fresh context...');
107
+ // Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
108
+ const tokenAllowList = await getTokenAllowedSetupFunctions();
107
109
  this.context = await setup(0, {
108
110
  startProverNode: true,
109
111
  ...this.setupOptions,
110
112
  fundSponsoredFPC: true,
111
113
  skipAccountDeployment: true,
112
114
  l1ContractsArgs: { ...this.setupOptions },
115
+ txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
113
116
  });
114
117
 
115
118
  this.rollupContract = RollupContract.getFromConfig(this.context.config);
@@ -157,11 +160,15 @@ export class FeesTest {
157
160
 
158
161
  /** Alice mints bananaCoin tokens privately to the target address and redeems them. */
159
162
  async mintPrivateBananas(amount: bigint, address: AztecAddress) {
160
- const balanceBefore = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
163
+ const { result: balanceBefore } = await this.bananaCoin.methods
164
+ .balance_of_private(address)
165
+ .simulate({ from: address });
161
166
 
162
167
  await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
163
168
 
164
- const balanceAfter = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
169
+ const { result: balanceAfter } = await this.bananaCoin.methods
170
+ .balance_of_private(address)
171
+ .simulate({ from: address });
165
172
  expect(balanceAfter).toEqual(balanceBefore + amount);
166
173
  }
167
174
 
@@ -186,7 +193,7 @@ export class FeesTest {
186
193
  this.wallet = this.context.wallet;
187
194
  this.aztecNode = this.context.aztecNodeService;
188
195
  this.aztecNodeAdmin = this.context.aztecNodeService;
189
- this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
196
+ this.gasSettings = GasSettings.fallback({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
190
197
  this.cheatCodes = this.context.cheatCodes;
191
198
  this.accounts = deployedAccounts.map(a => a.address);
192
199
  this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
@@ -223,7 +230,7 @@ export class FeesTest {
223
230
  async applyDeployBananaToken() {
224
231
  this.logger.info('Applying deploy banana token setup');
225
232
 
226
- const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
233
+ const { contract: bananaCoin } = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
227
234
  from: this.aliceAddress,
228
235
  });
229
236
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
@@ -244,7 +251,7 @@ export class FeesTest {
244
251
  expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
245
252
 
246
253
  const bananaCoin = this.bananaCoin;
247
- const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
254
+ const { contract: bananaFPC } = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
248
255
  from: this.aliceAddress,
249
256
  });
250
257
 
@@ -65,9 +65,11 @@ export class NestedContractTest {
65
65
 
66
66
  async applyManual() {
67
67
  this.logger.info('Deploying parent and child contracts');
68
- const parentContract = await ParentContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
69
- const childContract = await ChildContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
70
- this.parentContract = parentContract;
71
- this.childContract = childContract;
68
+ ({ contract: this.parentContract } = await ParentContract.deploy(this.wallet).send({
69
+ from: this.defaultAccountAddress,
70
+ }));
71
+ ({ contract: this.childContract } = await ChildContract.deploy(this.wallet).send({
72
+ from: this.defaultAccountAddress,
73
+ }));
72
74
  }
73
75
  }
@@ -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
 
@@ -59,7 +54,7 @@ export const WAIT_FOR_TX_TIMEOUT = l1ContractsConfig.aztecSlotDuration * 3;
59
54
  export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
60
55
  aztecSlotDuration: 12,
61
56
  ethereumSlotDuration: 4,
62
- aztecProofSubmissionWindow: 640,
57
+ aztecProofSubmissionEpochs: 640,
63
58
  };
64
59
 
65
60
  export class P2PNetworkTest {
@@ -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
  });
@@ -323,8 +319,9 @@ export class P2PNetworkTest {
323
319
  throw new Error('Call setupAccount before deploying spam contract');
324
320
  }
325
321
 
326
- const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
327
- this.spamContract = spamContract;
322
+ ({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
323
+ from: this.defaultAccountAddress!,
324
+ }));
328
325
  }
329
326
 
330
327
  async removeInitialNode() {
@@ -359,7 +356,7 @@ export class P2PNetworkTest {
359
356
  ...this.setupOptions,
360
357
  fundSponsoredFPC: true,
361
358
  skipAccountDeployment: true,
362
- slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
359
+ slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
363
360
  aztecTargetCommitteeSize: 0,
364
361
  l1ContractsArgs: this.deployL1ContractsArgs,
365
362
  },
@@ -371,8 +368,13 @@ export class P2PNetworkTest {
371
368
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
372
369
  const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
373
370
 
374
- const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
375
- this.prefilledPublicData = prefilledPublicData;
371
+ const { genesis } = await getGenesisValues(
372
+ initialFundedAccounts,
373
+ undefined,
374
+ undefined,
375
+ this.context.genesis!.genesisTimestamp,
376
+ );
377
+ this.genesis = genesis;
376
378
 
377
379
  const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
378
380
  this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
@@ -407,6 +409,7 @@ export class P2PNetworkTest {
407
409
  expectedNodeCount?: number,
408
410
  timeoutSeconds = 30,
409
411
  checkIntervalSeconds = 0.1,
412
+ topics: TopicType[] = [TopicType.tx],
410
413
  ) {
411
414
  const nodeCount = expectedNodeCount ?? nodes.length;
412
415
  const minPeerCount = nodeCount - 1;
@@ -433,26 +436,28 @@ export class P2PNetworkTest {
433
436
 
434
437
  this.logger.warn('All nodes connected to P2P mesh');
435
438
 
436
- // Wait for GossipSub mesh to form for the tx topic.
439
+ // Wait for GossipSub mesh to form for all specified topics.
437
440
  // We only require at least 1 mesh peer per node because GossipSub
438
441
  // stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
439
- this.logger.warn('Waiting for GossipSub mesh to form for tx topic...');
440
- await Promise.all(
441
- nodes.map(async (node, index) => {
442
- const p2p = node.getP2P();
443
- await retryUntil(
444
- async () => {
445
- const meshPeers = await p2p.getGossipMeshPeerCount(TopicType.tx);
446
- this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for tx topic`);
447
- return meshPeers >= 1 ? true : undefined;
448
- },
449
- `Node ${index} to have gossip mesh peers for tx topic`,
450
- timeoutSeconds,
451
- checkIntervalSeconds,
452
- );
453
- }),
454
- );
455
- this.logger.warn('All nodes have gossip mesh peers for tx topic');
442
+ for (const topic of topics) {
443
+ this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
444
+ await Promise.all(
445
+ nodes.map(async (node, index) => {
446
+ const p2p = node.getP2P();
447
+ await retryUntil(
448
+ async () => {
449
+ const meshPeers = await p2p.getGossipMeshPeerCount(topic);
450
+ this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
451
+ return meshPeers >= 1 ? true : undefined;
452
+ },
453
+ `Node ${index} to have gossip mesh peers for ${topic} topic`,
454
+ timeoutSeconds,
455
+ checkIntervalSeconds,
456
+ );
457
+ }),
458
+ );
459
+ this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
460
+ }
456
461
  }
457
462
 
458
463
  async teardown() {
@@ -464,8 +469,7 @@ export class P2PNetworkTest {
464
469
  async getContracts(): Promise<{
465
470
  rollup: RollupContract;
466
471
  slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
467
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
468
- slashFactory: SlashFactoryContract;
472
+ slashingProposer: SlashingProposerContract | undefined;
469
473
  }> {
470
474
  if (!this.ctx.deployL1ContractsValues) {
471
475
  throw new Error('DeployAztecL1ContractsValues not set');
@@ -482,14 +486,9 @@ export class P2PNetworkTest {
482
486
  client: this.ctx.deployL1ContractsValues.l1Client,
483
487
  });
484
488
 
485
- // Get the actual slashing proposer from rollup (which handles both empire and tally)
489
+ // Get the actual slashing proposer from rollup
486
490
  const slashingProposer = await rollup.getSlashingProposer();
487
491
 
488
- const slashFactory = new SlashFactoryContract(
489
- this.ctx.deployL1ContractsValues.l1Client,
490
- getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
491
- );
492
-
493
- return { rollup, slasherContract, slashingProposer, slashFactory };
492
+ return { rollup, slasherContract, slashingProposer };
494
493
  }
495
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
  );
@@ -149,6 +149,13 @@ export async function runReqrespTxTest(params: {
149
149
  const submittedTxs = await Promise.all(
150
150
  txBatches.map(async (batch, batchIndex) => {
151
151
  const proposerNode = nodes[proposerIndexes[batchIndex]];
152
+ for (const tx of batch) {
153
+ t.logger.info(`Tx ${tx.getTxHash().toString()} base64: ${tx.toBuffer().toString('base64')}`);
154
+ }
155
+ const txHashes = batch.map(tx => tx.getTxHash().toString());
156
+ t.logger.info(
157
+ `Sending batch ${batchIndex} to proposer ${getNodePort(proposerIndexes[batchIndex])}: ${txHashes.join(', ')}`,
158
+ );
152
159
  await Promise.all(
153
160
  batch.map(async tx => {
154
161
  try {
@@ -163,6 +170,12 @@ export async function runReqrespTxTest(params: {
163
170
  }),
164
171
  );
165
172
 
173
+ // Log pool state per node after sending
174
+ for (let i = 0; i < NUM_VALIDATORS; i++) {
175
+ const count = await nodes[i].getPendingTxCount();
176
+ t.logger.info(`Node ${getNodePort(i)} pool has ${count} pending txs`);
177
+ }
178
+
166
179
  t.logger.info('Waiting for all transactions to be mined');
167
180
  await Promise.all(
168
181
  submittedTxs.flatMap((batch, batchIndex) =>
@@ -178,8 +191,16 @@ export async function runReqrespTxTest(params: {
178
191
 
179
192
  // Assert that multiple blocks were built for at least one slot
180
193
  t.logger.info('Verifying multiple blocks for at least one checkpoint');
181
- const checkpoints = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
182
- expect(checkpoints.length).toBeGreaterThan(0);
194
+ // Wait for L1 checkpoint sync, which may lag behind P2P block propagation.
195
+ const checkpoints = await retryUntil(
196
+ async () => {
197
+ const cps = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
198
+ return cps.length > 0 && cps.some(cp => cp.checkpoint.blocks.length >= 2) ? cps : undefined;
199
+ },
200
+ 'waiting for multi-block checkpoint to sync from L1',
201
+ 30,
202
+ 1,
203
+ );
183
204
 
184
205
  let mbpsFound = false;
185
206
  let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;