@aztec/end-to-end 0.0.1-commit.b655e406 → 0.0.1-commit.c2595eba

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 (209) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +21 -15
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +129 -119
  7. package/dest/bench/client_flows/config.d.ts +1 -1
  8. package/dest/bench/client_flows/data_extractor.d.ts +1 -1
  9. package/dest/bench/client_flows/data_extractor.js +7 -27
  10. package/dest/bench/utils.d.ts +8 -7
  11. package/dest/bench/utils.d.ts.map +1 -1
  12. package/dest/bench/utils.js +27 -18
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +96 -112
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -13
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +91 -70
  19. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  21. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  22. package/dest/e2e_epochs/epochs_test.d.ts +17 -9
  23. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  24. package/dest/e2e_epochs/epochs_test.js +48 -23
  25. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  26. package/dest/e2e_fees/bridging_race.notest.js +5 -7
  27. package/dest/e2e_fees/fees_test.d.ts +20 -16
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +127 -139
  30. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  31. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  32. package/dest/e2e_l1_publisher/write_json.js +18 -19
  33. package/dest/e2e_multi_validator/utils.d.ts +1 -1
  34. package/dest/e2e_multi_validator/utils.js +1 -1
  35. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  36. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  37. package/dest/e2e_nested_contract/nested_contract_test.js +31 -38
  38. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  39. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  40. package/dest/e2e_p2p/inactivity_slash_test.js +7 -6
  41. package/dest/e2e_p2p/p2p_network.d.ts +225 -18
  42. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  43. package/dest/e2e_p2p/p2p_network.js +121 -110
  44. package/dest/e2e_p2p/shared.d.ts +11 -11
  45. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  46. package/dest/e2e_p2p/shared.js +15 -21
  47. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  48. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  49. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  50. package/dest/fixtures/e2e_prover_test.d.ts +12 -18
  51. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  52. package/dest/fixtures/e2e_prover_test.js +101 -109
  53. package/dest/fixtures/fixtures.d.ts +2 -3
  54. package/dest/fixtures/fixtures.d.ts.map +1 -1
  55. package/dest/fixtures/fixtures.js +2 -3
  56. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  57. package/dest/fixtures/get_acvm_config.js +1 -1
  58. package/dest/fixtures/get_bb_config.d.ts +1 -1
  59. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  60. package/dest/fixtures/index.d.ts +1 -1
  61. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  62. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  63. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  64. package/dest/fixtures/logging.d.ts +1 -1
  65. package/dest/fixtures/setup.d.ts +218 -0
  66. package/dest/fixtures/setup.d.ts.map +1 -0
  67. package/dest/fixtures/setup.js +695 -0
  68. package/dest/fixtures/setup_p2p_test.d.ts +6 -7
  69. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  70. package/dest/fixtures/setup_p2p_test.js +41 -28
  71. package/dest/fixtures/token_utils.d.ts +5 -2
  72. package/dest/fixtures/token_utils.d.ts.map +1 -1
  73. package/dest/fixtures/token_utils.js +13 -7
  74. package/dest/fixtures/utils.d.ts +5 -192
  75. package/dest/fixtures/utils.d.ts.map +1 -1
  76. package/dest/fixtures/utils.js +4 -648
  77. package/dest/fixtures/web3signer.d.ts +1 -1
  78. package/dest/fixtures/web3signer.js +1 -1
  79. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  80. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  81. package/dest/fixtures/with_telemetry_utils.js +2 -2
  82. package/dest/index.d.ts +1 -1
  83. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  84. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  85. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  86. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  87. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  88. package/dest/quality_of_service/prometheus_client.js +67 -0
  89. package/dest/shared/cross_chain_test_harness.d.ts +7 -6
  90. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  91. package/dest/shared/cross_chain_test_harness.js +14 -14
  92. package/dest/shared/gas_portal_test_harness.d.ts +2 -2
  93. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  94. package/dest/shared/gas_portal_test_harness.js +2 -2
  95. package/dest/shared/index.d.ts +2 -2
  96. package/dest/shared/index.d.ts.map +1 -1
  97. package/dest/shared/jest_setup.d.ts +1 -1
  98. package/dest/shared/submit-transactions.d.ts +3 -3
  99. package/dest/shared/submit-transactions.d.ts.map +1 -1
  100. package/dest/shared/submit-transactions.js +9 -11
  101. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  102. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  103. package/dest/shared/uniswap_l1_l2.js +55 -35
  104. package/dest/simulators/index.d.ts +1 -1
  105. package/dest/simulators/lending_simulator.d.ts +2 -2
  106. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  107. package/dest/simulators/lending_simulator.js +6 -4
  108. package/dest/simulators/token_simulator.d.ts +1 -1
  109. package/dest/simulators/token_simulator.d.ts.map +1 -1
  110. package/dest/spartan/setup_test_wallets.d.ts +8 -5
  111. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  112. package/dest/spartan/setup_test_wallets.js +85 -23
  113. package/dest/spartan/tx_metrics.d.ts +88 -0
  114. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  115. package/dest/spartan/tx_metrics.js +422 -0
  116. package/dest/spartan/utils/bot.d.ts +27 -0
  117. package/dest/spartan/utils/bot.d.ts.map +1 -0
  118. package/dest/spartan/utils/bot.js +141 -0
  119. package/dest/spartan/utils/chaos.d.ts +79 -0
  120. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  121. package/dest/spartan/utils/chaos.js +142 -0
  122. package/dest/spartan/utils/clients.d.ts +39 -0
  123. package/dest/spartan/utils/clients.d.ts.map +1 -0
  124. package/dest/spartan/utils/clients.js +90 -0
  125. package/dest/spartan/utils/config.d.ts +36 -0
  126. package/dest/spartan/utils/config.d.ts.map +1 -0
  127. package/dest/spartan/utils/config.js +20 -0
  128. package/dest/spartan/utils/health.d.ts +63 -0
  129. package/dest/spartan/utils/health.d.ts.map +1 -0
  130. package/dest/spartan/utils/health.js +202 -0
  131. package/dest/spartan/utils/helm.d.ts +15 -0
  132. package/dest/spartan/utils/helm.d.ts.map +1 -0
  133. package/dest/spartan/utils/helm.js +47 -0
  134. package/dest/spartan/utils/index.d.ts +9 -0
  135. package/dest/spartan/utils/index.d.ts.map +1 -0
  136. package/dest/spartan/utils/index.js +18 -0
  137. package/dest/spartan/utils/k8s.d.ts +126 -0
  138. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  139. package/dest/spartan/utils/k8s.js +375 -0
  140. package/dest/spartan/utils/nodes.d.ts +41 -0
  141. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  142. package/dest/spartan/utils/nodes.js +455 -0
  143. package/dest/spartan/utils/scripts.d.ts +16 -0
  144. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  145. package/dest/spartan/utils/scripts.js +66 -0
  146. package/dest/spartan/utils.d.ts +2 -218
  147. package/dest/spartan/utils.d.ts.map +1 -1
  148. package/dest/spartan/utils.js +1 -749
  149. package/package.json +43 -40
  150. package/src/bench/client_flows/benchmark.ts +24 -2
  151. package/src/bench/client_flows/client_flows_benchmark.ts +152 -170
  152. package/src/bench/client_flows/data_extractor.ts +6 -28
  153. package/src/bench/utils.ts +30 -20
  154. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  155. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -124
  156. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  157. package/src/e2e_epochs/epochs_test.ts +96 -56
  158. package/src/e2e_fees/bridging_race.notest.ts +5 -11
  159. package/src/e2e_fees/fees_test.ts +180 -219
  160. package/src/e2e_l1_publisher/write_json.ts +20 -19
  161. package/src/e2e_multi_validator/utils.ts +1 -1
  162. package/src/e2e_nested_contract/nested_contract_test.ts +33 -55
  163. package/src/e2e_p2p/inactivity_slash_test.ts +10 -9
  164. package/src/e2e_p2p/p2p_network.ts +181 -180
  165. package/src/e2e_p2p/shared.ts +35 -29
  166. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  167. package/src/fixtures/e2e_prover_test.ts +112 -150
  168. package/src/fixtures/fixtures.ts +2 -5
  169. package/src/fixtures/get_acvm_config.ts +1 -1
  170. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  171. package/src/fixtures/setup.ts +1017 -0
  172. package/src/fixtures/setup_p2p_test.ts +38 -29
  173. package/src/fixtures/token_utils.ts +8 -7
  174. package/src/fixtures/utils.ts +27 -947
  175. package/src/fixtures/web3signer.ts +1 -1
  176. package/src/fixtures/with_telemetry_utils.ts +2 -2
  177. package/src/guides/up_quick_start.sh +1 -1
  178. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  179. package/src/quality_of_service/prometheus_client.ts +113 -0
  180. package/src/shared/cross_chain_test_harness.ts +19 -36
  181. package/src/shared/gas_portal_test_harness.ts +3 -3
  182. package/src/shared/index.ts +1 -1
  183. package/src/shared/submit-transactions.ts +9 -15
  184. package/src/shared/uniswap_l1_l2.ts +65 -86
  185. package/src/simulators/lending_simulator.ts +7 -5
  186. package/src/spartan/DEVELOP.md +7 -0
  187. package/src/spartan/setup_test_wallets.ts +119 -28
  188. package/src/spartan/tx_metrics.ts +376 -0
  189. package/src/spartan/utils/bot.ts +185 -0
  190. package/src/spartan/utils/chaos.ts +253 -0
  191. package/src/spartan/utils/clients.ts +100 -0
  192. package/src/spartan/utils/config.ts +26 -0
  193. package/src/spartan/utils/health.ts +255 -0
  194. package/src/spartan/utils/helm.ts +84 -0
  195. package/src/spartan/utils/index.ts +64 -0
  196. package/src/spartan/utils/k8s.ts +527 -0
  197. package/src/spartan/utils/nodes.ts +535 -0
  198. package/src/spartan/utils/scripts.ts +63 -0
  199. package/src/spartan/utils.ts +1 -942
  200. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  201. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  202. package/dest/fixtures/setup_l1_contracts.js +0 -17
  203. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  204. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  205. package/dest/fixtures/snapshot_manager.js +0 -505
  206. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  207. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  208. package/src/fixtures/setup_l1_contracts.ts +0 -26
  209. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -2,20 +2,20 @@ import type { InitialAccountData } from '@aztec/accounts/testing';
2
2
  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
+ import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
5
6
  import {
6
7
  type EmpireSlashingProposerContract,
7
- type ExtendedViemWalletClient,
8
8
  GSEContract,
9
- MultiAdderArtifact,
10
- type Operator,
11
9
  RollupContract,
12
10
  type TallySlashingProposerContract,
13
- type ViemClient,
14
- createL1TxUtilsFromViemWallet,
15
- deployL1Contract,
16
- getL1ContractsConfigEnvVars,
17
- } from '@aztec/ethereum';
11
+ } from '@aztec/ethereum/contracts';
12
+ import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
13
+ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
14
+ import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
15
+ import { createL1TxUtilsFromViemWallet } from '@aztec/ethereum/l1-tx-utils';
18
16
  import { ChainMonitor } from '@aztec/ethereum/test';
17
+ import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
18
+ import { EpochNumber } from '@aztec/foundation/branded-types';
19
19
  import { SecretValue } from '@aztec/foundation/config';
20
20
  import { type Logger, createLogger } from '@aztec/foundation/log';
21
21
  import { retryUntil } from '@aztec/foundation/retry';
@@ -34,18 +34,20 @@ import getPort from 'get-port';
34
34
  import { type GetContractReturnType, getAddress, getContract } from 'viem';
35
35
  import { privateKeyToAccount } from 'viem/accounts';
36
36
 
37
+ import {
38
+ type EndToEndContext,
39
+ type SetupOptions,
40
+ deployAccounts,
41
+ getPrivateKeyFromIndex,
42
+ getSponsoredFPCAddress,
43
+ setup,
44
+ teardown,
45
+ } from '../fixtures/setup.js';
37
46
  import {
38
47
  ATTESTER_PRIVATE_KEYS_START_INDEX,
39
48
  createValidatorConfig,
40
49
  generatePrivateKeys,
41
50
  } from '../fixtures/setup_p2p_test.js';
42
- import {
43
- type ISnapshotManager,
44
- type SubsystemsContext,
45
- createSnapshotManager,
46
- deployAccounts,
47
- } from '../fixtures/snapshot_manager.js';
48
- import { type SetupOptions, getPrivateKeyFromIndex, getSponsoredFPCAddress } from '../fixtures/utils.js';
49
51
  import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
50
52
 
51
53
  // Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
@@ -60,14 +62,14 @@ export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
60
62
  };
61
63
 
62
64
  export class P2PNetworkTest {
63
- private snapshotManager: ISnapshotManager;
65
+ public context!: EndToEndContext;
64
66
  public baseAccountPrivateKey: `0x${string}`;
65
67
  public baseAccount;
66
68
 
67
69
  public logger: Logger;
68
70
  public monitor!: ChainMonitor;
69
71
 
70
- public ctx!: SubsystemsContext;
72
+ public ctx!: EndToEndContext;
71
73
  public attesterPrivateKeys: `0x${string}`[] = [];
72
74
  public attesterPublicKeys: string[] = [];
73
75
  public peerIdPrivateKeys: string[] = [];
@@ -83,6 +85,10 @@ export class P2PNetworkTest {
83
85
 
84
86
  public bootstrapNode?: BootstrapNode;
85
87
 
88
+ // Store setup options for use in setup()
89
+ private setupOptions: SetupOptions;
90
+ private deployL1ContractsArgs: any;
91
+
86
92
  constructor(
87
93
  public readonly testName: string,
88
94
  public bootstrapNodeEnr: string,
@@ -93,7 +99,6 @@ export class P2PNetworkTest {
93
99
  // If set enable metrics collection
94
100
  private metricsPort?: number,
95
101
  startProverNode?: boolean,
96
- mockZkPassportVerifier?: boolean,
97
102
  ) {
98
103
  this.logger = createLogger(`e2e:e2e_p2p:${testName}`);
99
104
 
@@ -108,45 +113,42 @@ export class P2PNetworkTest {
108
113
 
109
114
  const zkPassportParams = ZkPassportProofParams.random();
110
115
 
111
- this.snapshotManager = createSnapshotManager(
112
- `e2e_p2p_network/${testName}`,
113
- process.env.E2E_DATA_PATH,
114
- {
115
- ...initialValidatorConfig,
116
- ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
117
- aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
118
- aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
119
- aztecProofSubmissionEpochs:
120
- initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
121
- slashingRoundSizeInEpochs:
122
- initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
123
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
124
- aztecTargetCommitteeSize: numberOfValidators,
125
- salt: 420,
126
- metricsPort: metricsPort,
127
- numberOfInitialFundedAccounts: 2,
128
- startProverNode,
129
- },
130
- {
131
- ...initialValidatorConfig,
132
- aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
133
- slashingRoundSizeInEpochs:
134
- initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
135
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
136
-
137
- ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
138
- aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
139
- aztecProofSubmissionEpochs:
140
- initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
141
- aztecTargetCommitteeSize: numberOfValidators,
142
- initialValidators: [],
143
- zkPassportArgs: {
144
- mockZkPassportVerifier,
145
- zkPassportDomain: zkPassportParams.domain,
146
- zkPassportScope: zkPassportParams.scope,
147
- },
116
+ // Store setup options for later use
117
+ this.setupOptions = {
118
+ ...initialValidatorConfig,
119
+ ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
120
+ aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
121
+ aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
122
+ aztecProofSubmissionEpochs:
123
+ initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
124
+ slashingRoundSizeInEpochs:
125
+ initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
126
+ slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
127
+ aztecTargetCommitteeSize: numberOfValidators,
128
+ metricsPort: metricsPort,
129
+ numberOfInitialFundedAccounts: 2,
130
+ startProverNode,
131
+ walletMinFeePadding: 2.0,
132
+ };
133
+
134
+ this.deployL1ContractsArgs = {
135
+ ...initialValidatorConfig,
136
+ aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
137
+ slashingRoundSizeInEpochs:
138
+ initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
139
+ slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
140
+
141
+ ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
142
+ aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
143
+ aztecProofSubmissionEpochs:
144
+ initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
145
+ aztecTargetCommitteeSize: numberOfValidators,
146
+ initialValidators: [],
147
+ zkPassportArgs: {
148
+ zkPassportDomain: zkPassportParams.domain,
149
+ zkPassportScope: zkPassportParams.scope,
148
150
  },
149
- );
151
+ };
150
152
  }
151
153
 
152
154
  static async create({
@@ -157,7 +159,6 @@ export class P2PNetworkTest {
157
159
  metricsPort,
158
160
  initialConfig,
159
161
  startProverNode,
160
- mockZkPassportVerifier,
161
162
  }: {
162
163
  testName: string;
163
164
  numberOfNodes: number;
@@ -166,7 +167,6 @@ export class P2PNetworkTest {
166
167
  metricsPort?: number;
167
168
  initialConfig?: SetupOptions;
168
169
  startProverNode?: boolean;
169
- mockZkPassportVerifier?: boolean;
170
170
  }) {
171
171
  const port = basePort || (await getPort());
172
172
 
@@ -187,29 +187,27 @@ export class P2PNetworkTest {
187
187
  numberOfNodes,
188
188
  metricsPort,
189
189
  startProverNode,
190
- mockZkPassportVerifier,
191
190
  );
192
191
  }
193
192
 
194
193
  get fundedAccount() {
195
194
  if (!this.deployedAccounts[0]) {
196
- throw new Error('Call snapshot t.setupAccount to create a funded account.');
195
+ throw new Error('Call setupAccount to create a funded account.');
197
196
  }
198
197
  return this.deployedAccounts[0];
199
198
  }
200
199
 
201
200
  async addBootstrapNode() {
202
- await this.snapshotManager.snapshot('add-bootstrap-node', async ({ aztecNodeConfig }) => {
203
- const telemetry = getEndToEndTestTelemetryClient(this.metricsPort);
204
- this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
205
- BOOTSTRAP_NODE_PRIVATE_KEY,
206
- this.bootNodePort,
207
- telemetry,
208
- aztecNodeConfig,
209
- );
210
- // Overwrite enr with updated info
211
- this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
212
- });
201
+ this.logger.info('Adding bootstrap node');
202
+ const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
203
+ this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
204
+ BOOTSTRAP_NODE_PRIVATE_KEY,
205
+ this.bootNodePort,
206
+ telemetry,
207
+ this.context.config,
208
+ );
209
+ // Overwrite enr with updated info
210
+ this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
213
211
  }
214
212
 
215
213
  getValidators() {
@@ -230,125 +228,114 @@ export class P2PNetworkTest {
230
228
  return { validators };
231
229
  }
232
230
 
233
- async applyBaseSnapshots() {
231
+ async applyBaseSetup() {
234
232
  await this.addBootstrapNode();
235
- await this.snapshotManager.snapshot('add-validators', async ({ deployL1ContractsValues, cheatCodes }) => {
236
- const rollup = getContract({
237
- address: deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
238
- abi: RollupAbi,
239
- client: deployL1ContractsValues.l1Client,
240
- });
241
233
 
242
- this.logger.info(`Adding ${this.numberOfValidators} validators`);
234
+ this.logger.info('Adding validators');
235
+ const rollup = getContract({
236
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
237
+ abi: RollupAbi,
238
+ client: this.context.deployL1ContractsValues.l1Client,
239
+ });
243
240
 
244
- const stakingAsset = getContract({
245
- address: deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
246
- abi: TestERC20Abi,
247
- client: deployL1ContractsValues.l1Client,
248
- });
241
+ this.logger.info(`Adding ${this.numberOfValidators} validators`);
249
242
 
250
- const { address: multiAdderAddress } = await deployL1Contract(
251
- deployL1ContractsValues.l1Client,
252
- MultiAdderArtifact.contractAbi,
253
- MultiAdderArtifact.contractBytecode,
254
- [rollup.address, deployL1ContractsValues.l1Client.account.address],
255
- );
256
-
257
- const multiAdder = getContract({
258
- address: multiAdderAddress.toString(),
259
- abi: MultiAdderArtifact.contractAbi,
260
- client: deployL1ContractsValues.l1Client,
261
- });
243
+ const stakingAsset = getContract({
244
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
245
+ abi: TestERC20Abi,
246
+ client: this.context.deployL1ContractsValues.l1Client,
247
+ });
262
248
 
263
- const stakeNeeded = (await rollup.read.getActivationThreshold()) * BigInt(this.numberOfValidators);
264
- await Promise.all(
265
- [await stakingAsset.write.mint([multiAdder.address, stakeNeeded], {} as any)].map(txHash =>
266
- deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
267
- ),
268
- );
269
-
270
- const { validators } = this.getValidators();
271
- this.validators = validators;
272
-
273
- const gseAddress = deployL1ContractsValues.l1ContractAddresses.gseAddress!;
274
- if (!gseAddress) {
275
- throw new Error('GSE contract not deployed');
276
- }
277
-
278
- const gseContract = new GSEContract(deployL1ContractsValues.l1Client, gseAddress.toString());
279
-
280
- const makeValidatorTuples = async (validator: Operator) => {
281
- const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
282
- return {
283
- attester: validator.attester.toString() as `0x${string}`,
284
- withdrawer: validator.withdrawer.toString() as `0x${string}`,
285
- ...registrationTuple,
286
- };
287
- };
288
- const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
249
+ const { address: multiAdderAddress } = await deployL1Contract(
250
+ this.context.deployL1ContractsValues.l1Client,
251
+ MultiAdderArtifact.contractAbi,
252
+ MultiAdderArtifact.contractBytecode,
253
+ [rollup.address, this.context.deployL1ContractsValues.l1Client.account.address],
254
+ );
289
255
 
290
- await deployL1ContractsValues.l1Client.waitForTransactionReceipt({
291
- hash: await multiAdder.write.addValidators([validatorTuples]),
292
- });
256
+ const multiAdder = getContract({
257
+ address: multiAdderAddress.toString(),
258
+ abi: MultiAdderArtifact.contractAbi,
259
+ client: this.context.deployL1ContractsValues.l1Client,
260
+ });
261
+
262
+ const stakeNeeded = (await rollup.read.getActivationThreshold()) * BigInt(this.numberOfValidators);
263
+ await Promise.all(
264
+ [await stakingAsset.write.mint([multiAdder.address, stakeNeeded], {} as any)].map(txHash =>
265
+ this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
266
+ ),
267
+ );
293
268
 
294
- await cheatCodes.rollup.advanceToEpoch(
295
- (await cheatCodes.rollup.getEpoch()) + (await rollup.read.getLagInEpochs()) + 1n,
296
- );
269
+ const { validators } = this.getValidators();
270
+ this.validators = validators;
297
271
 
298
- // Send and await a tx to make sure we mine a block for the warp to correctly progress.
299
- await this._sendDummyTx(deployL1ContractsValues.l1Client);
272
+ const gseAddress = this.context.deployL1ContractsValues.l1ContractAddresses.gseAddress!;
273
+ if (!gseAddress) {
274
+ throw new Error('GSE contract not deployed');
275
+ }
276
+
277
+ const gseContract = new GSEContract(this.context.deployL1ContractsValues.l1Client, gseAddress.toString());
278
+
279
+ const makeValidatorTuples = async (validator: Operator) => {
280
+ const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
281
+ return {
282
+ attester: validator.attester.toString() as `0x${string}`,
283
+ withdrawer: validator.withdrawer.toString() as `0x${string}`,
284
+ ...registrationTuple,
285
+ };
286
+ };
287
+ const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
288
+
289
+ await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({
290
+ hash: await multiAdder.write.addValidators([validatorTuples]),
300
291
  });
292
+
293
+ await this.context.cheatCodes.rollup.advanceToEpoch(
294
+ EpochNumber.fromBigInt(
295
+ BigInt(await this.context.cheatCodes.rollup.getEpoch()) +
296
+ (await rollup.read.getLagInEpochsForValidatorSet()) +
297
+ 1n,
298
+ ),
299
+ );
300
+
301
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
302
+ await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
301
303
  }
302
304
 
303
305
  async setupAccount() {
304
- await this.snapshotManager.snapshot(
305
- 'setup-account',
306
- deployAccounts(1, this.logger),
307
- ({ deployedAccounts }, { wallet }) => {
308
- this.deployedAccounts = deployedAccounts;
309
- [{ address: this.defaultAccountAddress }] = deployedAccounts;
310
- this.wallet = wallet;
311
- return Promise.resolve();
312
- },
313
- );
306
+ this.logger.info('Setting up account');
307
+ const { deployedAccounts } = await deployAccounts(
308
+ 1,
309
+ this.logger,
310
+ )({
311
+ wallet: this.context.wallet,
312
+ initialFundedAccounts: this.context.initialFundedAccounts,
313
+ });
314
+ this.deployedAccounts = deployedAccounts;
315
+ [{ address: this.defaultAccountAddress }] = deployedAccounts;
316
+ this.wallet = this.context.wallet;
314
317
  }
315
318
 
316
319
  async deploySpamContract() {
317
- await this.snapshotManager.snapshot(
318
- 'add-spam-contract',
319
- async () => {
320
- if (!this.wallet) {
321
- throw new Error('Call snapshot t.setupAccount before deploying account contract');
322
- }
323
-
324
- const spamContract = await SpamContract.deploy(this.wallet)
325
- .send({ from: this.defaultAccountAddress! })
326
- .deployed();
327
- return { contractAddress: spamContract.address };
328
- },
329
- async ({ contractAddress }) => {
330
- if (!this.wallet) {
331
- throw new Error('Call snapshot t.setupAccount before deploying account contract');
332
- }
333
- this.spamContract = await SpamContract.at(contractAddress, this.wallet);
334
- },
335
- );
320
+ this.logger.info('Deploying spam contract');
321
+ if (!this.wallet) {
322
+ throw new Error('Call setupAccount before deploying spam contract');
323
+ }
324
+
325
+ const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
326
+ this.spamContract = spamContract;
336
327
  }
337
328
 
338
329
  async removeInitialNode() {
339
- await this.snapshotManager.snapshot(
340
- 'remove-initial-validator',
341
- async ({ deployL1ContractsValues, aztecNode, dateProvider }) => {
342
- // Send and await a tx to make sure we mine a block for the warp to correctly progress.
343
- const { receipt } = await this._sendDummyTx(deployL1ContractsValues.l1Client);
344
- const block = await deployL1ContractsValues.l1Client.getBlock({
345
- blockNumber: receipt.blockNumber,
346
- });
347
- dateProvider.setTime(Number(block.timestamp) * 1000);
348
-
349
- await aztecNode.stop();
350
- },
351
- );
330
+ this.logger.info('Removing initial node');
331
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
332
+ const { receipt } = await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
333
+ const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
334
+ blockNumber: receipt.blockNumber,
335
+ });
336
+ this.context.dateProvider!.setTime(Number(block.timestamp) * 1000);
337
+
338
+ await this.context.aztecNodeService!.stop();
352
339
  }
353
340
 
354
341
  async sendDummyTx() {
@@ -364,17 +351,31 @@ export class P2PNetworkTest {
364
351
  }
365
352
 
366
353
  async setup() {
367
- this.ctx = await this.snapshotManager.setup();
354
+ this.logger.info('Setting up subsystems from fresh');
355
+ this.context = await setup(
356
+ 0,
357
+ {
358
+ ...this.setupOptions,
359
+ fundSponsoredFPC: true,
360
+ skipAccountDeployment: true,
361
+ slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
362
+ aztecTargetCommitteeSize: 0,
363
+ l1ContractsArgs: this.deployL1ContractsArgs,
364
+ },
365
+ // Use checkpointed chain tip for PXE to avoid issues with blocks being dropped due to pruned anchor blocks.
366
+ { syncChainTip: 'checkpointed' },
367
+ );
368
+ this.ctx = this.context;
368
369
 
369
370
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
370
- const initialFundedAccounts = [...this.ctx.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
371
+ const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
371
372
 
372
373
  const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
373
374
  this.prefilledPublicData = prefilledPublicData;
374
375
 
375
- const rollupContract = RollupContract.getFromL1ContractsValues(this.ctx.deployL1ContractsValues);
376
- this.monitor = new ChainMonitor(rollupContract, this.ctx.dateProvider).start();
377
- this.monitor.on('l1-block', ({ timestamp }) => this.ctx.dateProvider.setTime(Number(timestamp) * 1000));
376
+ const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
377
+ this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider!).start();
378
+ this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider!.setTime(Number(timestamp) * 1000));
378
379
  }
379
380
 
380
381
  async stopNodes(nodes: AztecNodeService[]) {
@@ -435,7 +436,7 @@ export class P2PNetworkTest {
435
436
  async teardown() {
436
437
  await this.monitor.stop();
437
438
  await tryStop(this.bootstrapNode, this.logger);
438
- await this.snapshotManager.teardown();
439
+ await teardown(this.context);
439
440
  }
440
441
 
441
442
  async getContracts(): Promise<{
@@ -445,7 +446,7 @@ export class P2PNetworkTest {
445
446
  slashFactory: SlashFactoryContract;
446
447
  }> {
447
448
  if (!this.ctx.deployL1ContractsValues) {
448
- throw new Error('DeployL1ContractsValues not set');
449
+ throw new Error('DeployAztecL1ContractsValues not set');
449
450
  }
450
451
 
451
452
  const rollup = new RollupContract(
@@ -454,7 +455,7 @@ export class P2PNetworkTest {
454
455
  );
455
456
 
456
457
  const slasherContract = getContract({
457
- address: getAddress(await rollup.getSlasherAddress()),
458
+ address: getAddress((await rollup.getSlasherAddress()).toString()),
458
459
  abi: SlasherAbi,
459
460
  client: this.ctx.deployL1ContractsValues.l1Client,
460
461
  });
@@ -1,13 +1,19 @@
1
1
  import type { InitialAccountData } from '@aztec/accounts/testing';
2
2
  import type { AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
- import { type SentTx, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
4
+ import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
5
5
  import { Fr } from '@aztec/aztec.js/fields';
6
6
  import type { Logger } from '@aztec/aztec.js/log';
7
- import { Tx, TxStatus } from '@aztec/aztec.js/tx';
7
+ import { TxHash } from '@aztec/aztec.js/tx';
8
8
  import type { RollupCheatCodes } from '@aztec/aztec/testing';
9
- import type { EmpireSlashingProposerContract, RollupContract, TallySlashingProposerContract } from '@aztec/ethereum';
9
+ import type {
10
+ EmpireSlashingProposerContract,
11
+ RollupContract,
12
+ TallySlashingProposerContract,
13
+ } from '@aztec/ethereum/contracts';
14
+ import { EpochNumber } from '@aztec/foundation/branded-types';
10
15
  import { timesAsync, unique } from '@aztec/foundation/collection';
16
+ import { EthAddress } from '@aztec/foundation/eth-address';
11
17
  import { retryUntil } from '@aztec/foundation/retry';
12
18
  import { pluralize } from '@aztec/foundation/string';
13
19
  import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
@@ -16,7 +22,7 @@ import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
16
22
  import { getRoundForOffense } from '@aztec/slasher';
17
23
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
18
24
  import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
19
- import { TestWallet, proveInteraction } from '@aztec/test-wallet/server';
25
+ import { type ProvenTx, TestWallet, proveInteraction } from '@aztec/test-wallet/server';
20
26
 
21
27
  import { submitTxsTo } from '../shared/submit-transactions.js';
22
28
 
@@ -28,24 +34,15 @@ export const submitComplexTxsTo = async (
28
34
  numTxs: number,
29
35
  opts: { callPublic?: boolean } = {},
30
36
  ) => {
31
- const txs: SentTx[] = [];
37
+ const txs: TxHash[] = [];
32
38
 
33
39
  const seed = 1234n;
34
40
  const spamCount = 15;
35
41
  for (let i = 0; i < numTxs; i++) {
36
- const tx = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic).send({ from });
37
- const txHash = await tx.getTxHash();
38
-
42
+ const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
43
+ const txHash = await method.send({ from, wait: NO_WAIT });
39
44
  logger.info(`Tx sent with hash ${txHash.toString()}`);
40
- const receipt = await tx.getReceipt();
41
- expect(receipt).toEqual(
42
- expect.objectContaining({
43
- status: TxStatus.PENDING,
44
- error: '',
45
- }),
46
- );
47
- logger.info(`Receipt received for ${txHash.toString()}`);
48
- txs.push(tx);
45
+ txs.push(txHash);
49
46
  }
50
47
  return txs;
51
48
  };
@@ -56,10 +53,14 @@ export const submitTransactions = async (
56
53
  node: AztecNodeService,
57
54
  numTxs: number,
58
55
  fundedAccount: InitialAccountData,
59
- ): Promise<SentTx[]> => {
56
+ ): Promise<TxHash[]> => {
60
57
  const rpcConfig = getRpcConfig();
61
58
  rpcConfig.proverEnabled = false;
62
- const wallet = await TestWallet.create(node, { ...getPXEConfig(), proverEnabled: false }, { useLogSuffix: true });
59
+ const wallet = await TestWallet.create(
60
+ node,
61
+ { ...getPXEConfig(), proverEnabled: false },
62
+ { loggerActorLabel: 'pxe-tx' },
63
+ );
63
64
  const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
64
65
  return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
65
66
  };
@@ -69,25 +70,28 @@ export async function prepareTransactions(
69
70
  node: AztecNodeService,
70
71
  numTxs: number,
71
72
  fundedAccount: InitialAccountData,
72
- ): Promise<Tx[]> {
73
+ ): Promise<ProvenTx[]> {
73
74
  const rpcConfig = getRpcConfig();
74
75
  rpcConfig.proverEnabled = false;
75
76
 
76
- const wallet = await TestWallet.create(node, { ...getPXEConfig(), proverEnabled: false }, { useLogSuffix: true });
77
+ const wallet = await TestWallet.create(
78
+ node,
79
+ { ...getPXEConfig(), proverEnabled: false },
80
+ { loggerActorLabel: 'pxe-tx' },
81
+ );
77
82
  const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
78
83
 
79
84
  const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
80
85
  salt: Fr.random(),
81
86
  });
82
87
  await wallet.registerContract(testContractInstance, TestContractArtifact);
83
- const contract = await TestContract.at(testContractInstance.address, wallet);
88
+ const contract = TestContract.at(testContractInstance.address, wallet);
84
89
 
85
90
  return timesAsync(numTxs, async () => {
86
91
  const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
87
92
  from: fundedAccountManager.address,
88
93
  });
89
- const txHash = tx.getTxHash();
90
- logger.info(`Tx prepared with hash ${txHash}`);
94
+ logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
91
95
  return tx;
92
96
  });
93
97
  }
@@ -132,7 +136,7 @@ export async function awaitCommitteeExists({
132
136
  logger: Logger;
133
137
  }): Promise<readonly `0x${string}`[]> {
134
138
  logger.info(`Waiting for committee to be set`);
135
- let committee: readonly `0x${string}`[] | undefined;
139
+ let committee: EthAddress[] | undefined;
136
140
  await retryUntil(
137
141
  async () => {
138
142
  committee = await rollup.getCurrentEpochCommittee();
@@ -141,7 +145,7 @@ export async function awaitCommitteeExists({
141
145
  'non-empty committee',
142
146
  60,
143
147
  );
144
- return committee!;
148
+ return committee!.map(c => c.toString() as `0x${string}`);
145
149
  }
146
150
 
147
151
  export async function awaitOffenseDetected({
@@ -213,7 +217,7 @@ export async function awaitCommitteeKicked({
213
217
 
214
218
  if (slashingProposer.type === 'empire') {
215
219
  // Await for the slash payload to be created if empire (no payload is created on tally until execution time)
216
- const targetEpoch = (await cheatCodes.getEpoch()) + (await rollup.getLagInEpochs()) + 1n;
220
+ const targetEpoch = EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1);
217
221
  logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
218
222
  await cheatCodes.advanceToEpoch(targetEpoch);
219
223
 
@@ -239,7 +243,7 @@ export async function awaitCommitteeKicked({
239
243
  const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
240
244
  const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
241
245
  logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
242
- await cheatCodes.advanceToEpoch(targetEpoch, { offset: -aztecSlotDuration / 2 });
246
+ await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
243
247
  }
244
248
 
245
249
  const attestersPre = await rollup.getAttesters();
@@ -269,7 +273,9 @@ export async function awaitCommitteeKicked({
269
273
 
270
274
  logger.info(`Advancing to check current committee`);
271
275
  await cheatCodes.debugRollup();
272
- await cheatCodes.advanceToEpoch((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochs()) + 1n);
276
+ await cheatCodes.advanceToEpoch(
277
+ EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1),
278
+ );
273
279
  await cheatCodes.debugRollup();
274
280
 
275
281
  const committeeNextEpoch = await rollup.getCurrentEpochCommittee();