@aztec/end-to-end 0.0.1-commit.dbf9cec → 0.0.1-commit.ddcf04837

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 (122) 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 +10 -5
  89. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  90. package/package.json +43 -44
  91. package/src/bench/client_flows/client_flows_benchmark.ts +27 -10
  92. package/src/bench/utils.ts +7 -2
  93. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -20
  94. package/src/e2e_epochs/epochs_test.ts +17 -5
  95. package/src/e2e_fees/fees_test.ts +13 -6
  96. package/src/e2e_nested_contract/nested_contract_test.ts +6 -4
  97. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  98. package/src/e2e_p2p/p2p_network.ts +47 -48
  99. package/src/e2e_p2p/reqresp/utils.ts +24 -3
  100. package/src/e2e_p2p/shared.ts +71 -59
  101. package/src/e2e_token_contract/token_contract_test.ts +16 -8
  102. package/src/fixtures/authwit_proxy.ts +4 -0
  103. package/src/fixtures/e2e_prover_test.ts +19 -18
  104. package/src/fixtures/get_bb_config.ts +7 -6
  105. package/src/fixtures/setup.ts +43 -28
  106. package/src/fixtures/setup_p2p_test.ts +9 -9
  107. package/src/fixtures/token_utils.ts +1 -2
  108. package/src/legacy-jest-resolver.cjs +135 -0
  109. package/src/shared/cross_chain_test_harness.ts +13 -9
  110. package/src/shared/gas_portal_test_harness.ts +1 -1
  111. package/src/shared/jest_setup.ts +36 -1
  112. package/src/shared/submit-transactions.ts +1 -4
  113. package/src/shared/uniswap_l1_l2.ts +35 -28
  114. package/src/simulators/lending_simulator.ts +8 -4
  115. package/src/simulators/token_simulator.ts +6 -2
  116. package/src/spartan/setup_test_wallets.ts +90 -35
  117. package/src/spartan/tx_metrics.ts +1 -1
  118. package/src/spartan/utils/config.ts +1 -0
  119. package/src/spartan/utils/index.ts +3 -0
  120. package/src/spartan/utils/pod_logs.ts +99 -0
  121. package/src/test-wallet/test_wallet.ts +144 -99
  122. package/src/test-wallet/worker_wallet.ts +3 -2
@@ -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;
@@ -6,12 +6,9 @@ import { Fr } from '@aztec/aztec.js/fields';
6
6
  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
- import type {
10
- EmpireSlashingProposerContract,
11
- RollupContract,
12
- TallySlashingProposerContract,
13
- } from '@aztec/ethereum/contracts';
14
- import { EpochNumber } from '@aztec/foundation/branded-types';
9
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
10
+ import type { RollupContract, SlashingProposerContract } from '@aztec/ethereum/contracts';
11
+ import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
15
12
  import { timesAsync, unique } from '@aztec/foundation/collection';
16
13
  import { EthAddress } from '@aztec/foundation/eth-address';
17
14
  import { retryUntil } from '@aztec/foundation/retry';
@@ -21,7 +18,6 @@ import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.j
21
18
  import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
22
19
  import { getRoundForOffense } from '@aztec/slasher';
23
20
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
24
- import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
25
21
 
26
22
  import { submitTxsTo } from '../shared/submit-transactions.js';
27
23
  import { TestWallet } from '../test-wallet/test_wallet.js';
@@ -41,7 +37,7 @@ export const submitComplexTxsTo = async (
41
37
  const spamCount = 15;
42
38
  for (let i = 0; i < numTxs; i++) {
43
39
  const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
44
- const txHash = await method.send({ from, wait: NO_WAIT });
40
+ const { txHash } = await method.send({ from, wait: NO_WAIT });
45
41
  logger.info(`Tx sent with hash ${txHash.toString()}`);
46
42
  txs.push(txHash);
47
43
  }
@@ -98,7 +94,7 @@ export async function prepareTransactions(
98
94
  }
99
95
 
100
96
  export function awaitProposalExecution(
101
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract,
97
+ slashingProposer: SlashingProposerContract,
102
98
  timeoutSeconds: number,
103
99
  logger: Logger,
104
100
  ): Promise<bigint> {
@@ -108,24 +104,12 @@ export function awaitProposalExecution(
108
104
  reject(new Error(`Timeout waiting for proposal execution after ${timeoutSeconds}s`));
109
105
  }, timeoutSeconds * 1000);
110
106
 
111
- if (slashingProposer.type === 'empire') {
112
- const unwatch = slashingProposer.listenToPayloadSubmitted(args => {
113
- logger.warn(`Proposal ${args.payload} from round ${args.round} executed`);
114
- clearTimeout(timeout);
115
- unwatch();
116
- resolve(args.round);
117
- });
118
- } else if (slashingProposer.type === 'tally') {
119
- const unwatch = slashingProposer.listenToRoundExecuted(args => {
120
- logger.warn(`Slash from round ${args.round} executed`);
121
- clearTimeout(timeout);
122
- unwatch();
123
- resolve(args.round);
124
- });
125
- } else {
107
+ const unwatch = slashingProposer.listenToRoundExecuted(args => {
108
+ logger.warn(`Slash from round ${args.round} executed`);
126
109
  clearTimeout(timeout);
127
- reject(new Error(`Unknown slashing proposer type: ${(slashingProposer as any).type}`));
128
- }
110
+ unwatch();
111
+ resolve(args.round);
112
+ });
129
113
  });
130
114
  }
131
115
 
@@ -150,6 +134,58 @@ export async function awaitCommitteeExists({
150
134
  return committee!.map(c => c.toString() as `0x${string}`);
151
135
  }
152
136
 
137
+ /**
138
+ * Advance epochs until we find one where the target proposer is selected for at least one slot,
139
+ * then stop one epoch before it. This leaves time for the caller to start sequencers before
140
+ * warping to the target epoch, avoiding the race where the target epoch passes before sequencers
141
+ * are ready.
142
+ *
143
+ * Returns the target epoch number so the caller can warp to it after starting sequencers.
144
+ */
145
+ export async function advanceToEpochBeforeProposer({
146
+ epochCache,
147
+ cheatCodes,
148
+ targetProposer,
149
+ logger,
150
+ maxAttempts = 20,
151
+ }: {
152
+ epochCache: EpochCacheInterface;
153
+ cheatCodes: RollupCheatCodes;
154
+ targetProposer: EthAddress;
155
+ logger: Logger;
156
+ maxAttempts?: number;
157
+ }): Promise<{ targetEpoch: EpochNumber }> {
158
+ const { epochDuration } = await cheatCodes.getConfig();
159
+
160
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
161
+ const currentEpoch = await cheatCodes.getEpoch();
162
+ // Check the NEXT epoch's slots so we stay one epoch before the target,
163
+ // giving the caller time to start sequencers before the target epoch arrives.
164
+ const nextEpoch = Number(currentEpoch) + 1;
165
+ const startSlot = nextEpoch * Number(epochDuration);
166
+ const endSlot = startSlot + Number(epochDuration);
167
+
168
+ logger.info(
169
+ `Checking next epoch ${nextEpoch} (slots ${startSlot}-${endSlot - 1}) for proposer ${targetProposer} (current epoch: ${currentEpoch})`,
170
+ );
171
+
172
+ for (let s = startSlot; s < endSlot; s++) {
173
+ const proposer = await epochCache.getProposerAttesterAddressInSlot(SlotNumber(s));
174
+ if (proposer && proposer.equals(targetProposer)) {
175
+ logger.warn(
176
+ `Found target proposer ${targetProposer} in slot ${s} of epoch ${nextEpoch}. Staying at epoch ${currentEpoch} to allow sequencer startup.`,
177
+ );
178
+ return { targetEpoch: EpochNumber(nextEpoch) };
179
+ }
180
+ }
181
+
182
+ logger.info(`Target proposer not found in epoch ${nextEpoch}, advancing to next epoch`);
183
+ await cheatCodes.advanceToNextEpoch();
184
+ }
185
+
186
+ throw new Error(`Target proposer ${targetProposer} not found in any slot after ${maxAttempts} epoch attempts`);
187
+ }
188
+
153
189
  export async function awaitOffenseDetected({
154
190
  logger,
155
191
  nodeAdmin,
@@ -192,7 +228,6 @@ export async function awaitCommitteeKicked({
192
228
  rollup,
193
229
  cheatCodes,
194
230
  committee,
195
- slashFactory,
196
231
  slashingProposer,
197
232
  slashingRoundSize,
198
233
  aztecSlotDuration,
@@ -203,8 +238,7 @@ export async function awaitCommitteeKicked({
203
238
  rollup: RollupContract;
204
239
  cheatCodes: RollupCheatCodes;
205
240
  committee: readonly `0x${string}`[];
206
- slashFactory: SlashFactoryContract;
207
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
241
+ slashingProposer: SlashingProposerContract | undefined;
208
242
  slashingRoundSize: number;
209
243
  aztecSlotDuration: number;
210
244
  aztecEpochDuration: number;
@@ -217,36 +251,14 @@ export async function awaitCommitteeKicked({
217
251
 
218
252
  await cheatCodes.debugRollup();
219
253
 
220
- if (slashingProposer.type === 'empire') {
221
- // Await for the slash payload to be created if empire (no payload is created on tally until execution time)
222
- const targetEpoch = EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1);
223
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
224
- await cheatCodes.advanceToEpoch(targetEpoch);
225
-
226
- const slashPayloadEvents = await retryUntil(
227
- async () => {
228
- const events = await slashFactory.getSlashPayloadCreatedEvents();
229
- return events.length > 0 ? events : undefined;
230
- },
231
- 'slash payload created',
232
- 120,
233
- 1,
234
- );
235
- expect(slashPayloadEvents.length).toBe(1);
236
- // 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)
237
- expect(unique(slashPayloadEvents[0].slashes.map(slash => slash.validator.toString()))).toHaveLength(
238
- committee.length,
239
- );
240
- } else {
241
- // Use the slash offset to ensure we are in the right epoch for tally
242
- const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
243
- const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
244
- const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
245
- const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
246
- const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
247
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
248
- await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
249
- }
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 });
250
262
 
251
263
  const attestersPre = await rollup.getAttesters();
252
264
  expect(attestersPre.length).toBe(committee.length);
@@ -81,24 +81,28 @@ export class TokenContractTest {
81
81
  await publicDeployAccounts(this.wallet, [this.adminAddress, this.account1Address]);
82
82
 
83
83
  this.logger.verbose(`Deploying TokenContract...`);
84
- this.asset = await TokenContract.deploy(
84
+ ({ contract: this.asset } = await TokenContract.deploy(
85
85
  this.wallet,
86
86
  this.adminAddress,
87
87
  TokenContractTest.TOKEN_NAME,
88
88
  TokenContractTest.TOKEN_SYMBOL,
89
89
  TokenContractTest.TOKEN_DECIMALS,
90
- ).send({ from: this.adminAddress });
90
+ ).send({ from: this.adminAddress }));
91
91
  this.logger.verbose(`Token deployed to ${this.asset.address}`);
92
92
 
93
93
  this.logger.verbose(`Deploying bad account...`);
94
- this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({ from: this.adminAddress });
94
+ ({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
95
+ from: this.adminAddress,
96
+ }));
95
97
  this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
96
98
 
97
99
  // Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
98
100
  // (so their notes are in scope), but msg_sender in the target must differ from the note owner
99
101
  // to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
100
102
  this.logger.verbose(`Deploying generic proxy...`);
101
- this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({ from: this.adminAddress });
103
+ ({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
104
+ from: this.adminAddress,
105
+ }));
102
106
  this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
103
107
 
104
108
  this.tokenSim = new TokenSimulator(this.asset, this.wallet, this.adminAddress, this.logger, [
@@ -106,7 +110,7 @@ export class TokenContractTest {
106
110
  this.account1Address,
107
111
  ]);
108
112
 
109
- expect(await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).toBe(
113
+ expect((await this.asset.methods.get_admin().simulate({ from: this.adminAddress })).result).toBe(
110
114
  this.adminAddress.toBigInt(),
111
115
  );
112
116
  }
@@ -140,7 +144,9 @@ export class TokenContractTest {
140
144
  await asset.methods.mint_to_public(adminAddress, amount).send({ from: adminAddress });
141
145
  tokenSim.mintPublic(adminAddress, amount);
142
146
 
143
- const publicBalance = await asset.methods.balance_of_public(adminAddress).simulate({ from: adminAddress });
147
+ const { result: publicBalance } = await asset.methods
148
+ .balance_of_public(adminAddress)
149
+ .simulate({ from: adminAddress });
144
150
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
145
151
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(adminAddress));
146
152
 
@@ -148,11 +154,13 @@ export class TokenContractTest {
148
154
  await mintTokensToPrivate(asset, adminAddress, adminAddress, amount);
149
155
  tokenSim.mintPrivate(adminAddress, amount);
150
156
 
151
- const privateBalance = await asset.methods.balance_of_private(adminAddress).simulate({ from: adminAddress });
157
+ const { result: privateBalance } = await asset.methods
158
+ .balance_of_private(adminAddress)
159
+ .simulate({ from: adminAddress });
152
160
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
153
161
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(adminAddress));
154
162
 
155
- const totalSupply = await asset.methods.total_supply().simulate({ from: adminAddress });
163
+ const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: adminAddress });
156
164
  this.logger.verbose(`Total supply: ${totalSupply}`);
157
165
  expect(totalSupply).toEqual(tokenSim.totalSupply);
158
166
 
@@ -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;
@@ -112,7 +110,7 @@ export class FullProverTest {
112
110
  FullProverTest.TOKEN_NAME,
113
111
  FullProverTest.TOKEN_SYMBOL,
114
112
  FullProverTest.TOKEN_DECIMALS,
115
- ).send({ from: this.accounts[0], wait: { returnReceipt: true } });
113
+ ).send({ from: this.accounts[0] });
116
114
  this.logger.verbose(`Token deployed to ${asset.address}`);
117
115
 
118
116
  this.fakeProofsAsset = asset;
@@ -121,7 +119,7 @@ export class FullProverTest {
121
119
 
122
120
  this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.wallet, this.accounts[0], this.logger, this.accounts);
123
121
 
124
- expect(await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).toBe(
122
+ expect((await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).result).toBe(
125
123
  this.accounts[0].toBigInt(),
126
124
  );
127
125
  }
@@ -168,9 +166,6 @@ export class FullProverTest {
168
166
 
169
167
  await Barretenberg.initSingleton({ backend: BackendType.NativeUnixSocket });
170
168
 
171
- const verifier = await BBCircuitVerifier.new(bbConfig);
172
- this.circuitProofVerifier = new QueuedIVCVerifier(bbConfig, verifier);
173
-
174
169
  this.logger.debug(`Configuring the node for real proofs...`);
175
170
  await this.aztecNodeAdmin.setConfig({
176
171
  realProofs: true,
@@ -178,7 +173,6 @@ export class FullProverTest {
178
173
  });
179
174
  } else {
180
175
  this.logger.debug(`Configuring the node min txs per block ${this.minNumberOfTxsPerBlock}...`);
181
- this.circuitProofVerifier = new TestCircuitVerifier();
182
176
  await this.aztecNodeAdmin.setConfig({
183
177
  minTxsPerBlock: this.minNumberOfTxsPerBlock,
184
178
  });
@@ -229,8 +223,11 @@ export class FullProverTest {
229
223
 
230
224
  this.logger.verbose('Starting prover node');
231
225
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
232
- const { prefilledPublicData } = await getGenesisValues(
226
+ const { genesis } = await getGenesisValues(
233
227
  this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
228
+ undefined,
229
+ undefined,
230
+ this.context.genesis!.genesisTimestamp,
234
231
  );
235
232
 
236
233
  const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
@@ -258,7 +255,7 @@ export class FullProverTest {
258
255
  this.proverAztecNode = await AztecNodeService.createAndSync(
259
256
  proverNodeConfig,
260
257
  { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
261
- { prefilledPublicData },
258
+ { genesis },
262
259
  );
263
260
  this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
264
261
  return this;
@@ -310,16 +307,20 @@ export class FullProverTest {
310
307
  } = this;
311
308
  tokenSim.mintPublic(address, publicAmount);
312
309
 
313
- const publicBalance = await fakeProofsAsset.methods.balance_of_public(address).simulate({ from: address });
310
+ const { result: publicBalance } = await fakeProofsAsset.methods
311
+ .balance_of_public(address)
312
+ .simulate({ from: address });
314
313
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
315
314
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
316
315
 
317
316
  tokenSim.mintPrivate(address, publicAmount);
318
- const privateBalance = await fakeProofsAsset.methods.balance_of_private(address).simulate({ from: address });
317
+ const { result: privateBalance } = await fakeProofsAsset.methods
318
+ .balance_of_private(address)
319
+ .simulate({ from: address });
319
320
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
320
321
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
321
322
 
322
- const totalSupply = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
323
+ const { result: totalSupply } = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
323
324
  this.logger.verbose(`Total supply: ${totalSupply}`);
324
325
  expect(totalSupply).toEqual(tokenSim.totalSupply);
325
326
  }
@@ -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}`);