@aztec/end-to-end 0.0.1-commit.24de95ac → 0.0.1-commit.3469e52

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 (167) 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 +116 -121
  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 +5 -5
  11. package/dest/bench/utils.d.ts.map +1 -1
  12. package/dest/bench/utils.js +18 -11
  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 +98 -113
  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 +11 -9
  23. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  24. package/dest/e2e_epochs/epochs_test.js +19 -16
  25. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  26. package/dest/e2e_fees/bridging_race.notest.js +4 -6
  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 +3 -3
  31. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  32. package/dest/e2e_l1_publisher/write_json.js +23 -18
  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 +32 -39
  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 +117 -110
  44. package/dest/e2e_p2p/shared.d.ts +6 -6
  45. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  46. package/dest/e2e_p2p/shared.js +6 -5
  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 +90 -92
  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 +98 -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 +216 -0
  66. package/dest/fixtures/setup.d.ts.map +1 -0
  67. package/dest/fixtures/setup.js +684 -0
  68. package/dest/fixtures/setup_p2p_test.d.ts +4 -4
  69. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  70. package/dest/fixtures/setup_p2p_test.js +18 -10
  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 +7 -4
  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 +5 -3
  90. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  91. package/dest/shared/cross_chain_test_harness.js +3 -3
  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 +1 -1
  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 +1 -1
  99. package/dest/shared/submit-transactions.d.ts.map +1 -1
  100. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  101. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  102. package/dest/shared/uniswap_l1_l2.js +43 -23
  103. package/dest/simulators/index.d.ts +1 -1
  104. package/dest/simulators/lending_simulator.d.ts +2 -2
  105. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  106. package/dest/simulators/lending_simulator.js +5 -3
  107. package/dest/simulators/token_simulator.d.ts +1 -1
  108. package/dest/simulators/token_simulator.d.ts.map +1 -1
  109. package/dest/spartan/setup_test_wallets.d.ts +8 -5
  110. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  111. package/dest/spartan/setup_test_wallets.js +45 -10
  112. package/dest/spartan/tx_metrics.d.ts +52 -0
  113. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  114. package/dest/spartan/tx_metrics.js +248 -0
  115. package/dest/spartan/utils.d.ts +66 -24
  116. package/dest/spartan/utils.d.ts.map +1 -1
  117. package/dest/spartan/utils.js +326 -133
  118. package/package.json +43 -40
  119. package/src/bench/client_flows/benchmark.ts +24 -2
  120. package/src/bench/client_flows/client_flows_benchmark.ts +157 -162
  121. package/src/bench/client_flows/data_extractor.ts +6 -28
  122. package/src/bench/utils.ts +22 -14
  123. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +107 -142
  124. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -124
  125. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  126. package/src/e2e_epochs/epochs_test.ts +39 -25
  127. package/src/e2e_fees/bridging_race.notest.ts +4 -7
  128. package/src/e2e_fees/fees_test.ts +180 -215
  129. package/src/e2e_l1_publisher/write_json.ts +26 -20
  130. package/src/e2e_multi_validator/utils.ts +1 -1
  131. package/src/e2e_nested_contract/nested_contract_test.ts +35 -55
  132. package/src/e2e_p2p/inactivity_slash_test.ts +10 -9
  133. package/src/e2e_p2p/p2p_network.ts +175 -180
  134. package/src/e2e_p2p/shared.ts +15 -7
  135. package/src/e2e_token_contract/token_contract_test.ts +105 -118
  136. package/src/fixtures/e2e_prover_test.ts +120 -153
  137. package/src/fixtures/fixtures.ts +2 -5
  138. package/src/fixtures/get_acvm_config.ts +1 -1
  139. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  140. package/src/fixtures/setup.ts +1010 -0
  141. package/src/fixtures/setup_p2p_test.ts +23 -9
  142. package/src/fixtures/token_utils.ts +4 -4
  143. package/src/fixtures/utils.ts +27 -947
  144. package/src/fixtures/web3signer.ts +1 -1
  145. package/src/fixtures/with_telemetry_utils.ts +2 -2
  146. package/src/guides/up_quick_start.sh +1 -1
  147. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  148. package/src/quality_of_service/prometheus_client.ts +113 -0
  149. package/src/shared/cross_chain_test_harness.ts +6 -9
  150. package/src/shared/gas_portal_test_harness.ts +2 -2
  151. package/src/shared/index.ts +1 -1
  152. package/src/shared/uniswap_l1_l2.ts +53 -67
  153. package/src/simulators/lending_simulator.ts +6 -4
  154. package/src/spartan/DEVELOP.md +7 -0
  155. package/src/spartan/setup_test_wallets.ts +56 -13
  156. package/src/spartan/tx_metrics.ts +231 -0
  157. package/src/spartan/utils.ts +379 -75
  158. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  159. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  160. package/dest/fixtures/setup_l1_contracts.js +0 -17
  161. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  162. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  163. package/dest/fixtures/snapshot_manager.js +0 -505
  164. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  165. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  166. package/src/fixtures/setup_l1_contracts.ts +0 -26
  167. 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,41 @@ 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
+ };
132
+
133
+ this.deployL1ContractsArgs = {
134
+ ...initialValidatorConfig,
135
+ aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
136
+ slashingRoundSizeInEpochs:
137
+ initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
138
+ slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
139
+
140
+ ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
141
+ aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
142
+ aztecProofSubmissionEpochs:
143
+ initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
144
+ aztecTargetCommitteeSize: numberOfValidators,
145
+ initialValidators: [],
146
+ zkPassportArgs: {
147
+ zkPassportDomain: zkPassportParams.domain,
148
+ zkPassportScope: zkPassportParams.scope,
148
149
  },
149
- );
150
+ };
150
151
  }
151
152
 
152
153
  static async create({
@@ -157,7 +158,6 @@ export class P2PNetworkTest {
157
158
  metricsPort,
158
159
  initialConfig,
159
160
  startProverNode,
160
- mockZkPassportVerifier,
161
161
  }: {
162
162
  testName: string;
163
163
  numberOfNodes: number;
@@ -166,7 +166,6 @@ export class P2PNetworkTest {
166
166
  metricsPort?: number;
167
167
  initialConfig?: SetupOptions;
168
168
  startProverNode?: boolean;
169
- mockZkPassportVerifier?: boolean;
170
169
  }) {
171
170
  const port = basePort || (await getPort());
172
171
 
@@ -187,29 +186,27 @@ export class P2PNetworkTest {
187
186
  numberOfNodes,
188
187
  metricsPort,
189
188
  startProverNode,
190
- mockZkPassportVerifier,
191
189
  );
192
190
  }
193
191
 
194
192
  get fundedAccount() {
195
193
  if (!this.deployedAccounts[0]) {
196
- throw new Error('Call snapshot t.setupAccount to create a funded account.');
194
+ throw new Error('Call setupAccount to create a funded account.');
197
195
  }
198
196
  return this.deployedAccounts[0];
199
197
  }
200
198
 
201
199
  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
- });
200
+ this.logger.info('Adding bootstrap node');
201
+ const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
202
+ this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
203
+ BOOTSTRAP_NODE_PRIVATE_KEY,
204
+ this.bootNodePort,
205
+ telemetry,
206
+ this.context.config,
207
+ );
208
+ // Overwrite enr with updated info
209
+ this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
213
210
  }
214
211
 
215
212
  getValidators() {
@@ -230,125 +227,114 @@ export class P2PNetworkTest {
230
227
  return { validators };
231
228
  }
232
229
 
233
- async applyBaseSnapshots() {
230
+ async applyBaseSetup() {
234
231
  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
232
 
242
- this.logger.info(`Adding ${this.numberOfValidators} validators`);
233
+ this.logger.info('Adding validators');
234
+ const rollup = getContract({
235
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
236
+ abi: RollupAbi,
237
+ client: this.context.deployL1ContractsValues.l1Client,
238
+ });
243
239
 
244
- const stakingAsset = getContract({
245
- address: deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
246
- abi: TestERC20Abi,
247
- client: deployL1ContractsValues.l1Client,
248
- });
240
+ this.logger.info(`Adding ${this.numberOfValidators} validators`);
249
241
 
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
- });
242
+ const stakingAsset = getContract({
243
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
244
+ abi: TestERC20Abi,
245
+ client: this.context.deployL1ContractsValues.l1Client,
246
+ });
262
247
 
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));
248
+ const { address: multiAdderAddress } = await deployL1Contract(
249
+ this.context.deployL1ContractsValues.l1Client,
250
+ MultiAdderArtifact.contractAbi,
251
+ MultiAdderArtifact.contractBytecode,
252
+ [rollup.address, this.context.deployL1ContractsValues.l1Client.account.address],
253
+ );
289
254
 
290
- await deployL1ContractsValues.l1Client.waitForTransactionReceipt({
291
- hash: await multiAdder.write.addValidators([validatorTuples]),
292
- });
255
+ const multiAdder = getContract({
256
+ address: multiAdderAddress.toString(),
257
+ abi: MultiAdderArtifact.contractAbi,
258
+ client: this.context.deployL1ContractsValues.l1Client,
259
+ });
260
+
261
+ const stakeNeeded = (await rollup.read.getActivationThreshold()) * BigInt(this.numberOfValidators);
262
+ await Promise.all(
263
+ [await stakingAsset.write.mint([multiAdder.address, stakeNeeded], {} as any)].map(txHash =>
264
+ this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
265
+ ),
266
+ );
293
267
 
294
- await cheatCodes.rollup.advanceToEpoch(
295
- (await cheatCodes.rollup.getEpoch()) + (await rollup.read.getLagInEpochs()) + 1n,
296
- );
268
+ const { validators } = this.getValidators();
269
+ this.validators = validators;
297
270
 
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);
271
+ const gseAddress = this.context.deployL1ContractsValues.l1ContractAddresses.gseAddress!;
272
+ if (!gseAddress) {
273
+ throw new Error('GSE contract not deployed');
274
+ }
275
+
276
+ const gseContract = new GSEContract(this.context.deployL1ContractsValues.l1Client, gseAddress.toString());
277
+
278
+ const makeValidatorTuples = async (validator: Operator) => {
279
+ const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
280
+ return {
281
+ attester: validator.attester.toString() as `0x${string}`,
282
+ withdrawer: validator.withdrawer.toString() as `0x${string}`,
283
+ ...registrationTuple,
284
+ };
285
+ };
286
+ const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
287
+
288
+ await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({
289
+ hash: await multiAdder.write.addValidators([validatorTuples]),
300
290
  });
291
+
292
+ await this.context.cheatCodes.rollup.advanceToEpoch(
293
+ EpochNumber.fromBigInt(
294
+ BigInt(await this.context.cheatCodes.rollup.getEpoch()) +
295
+ (await rollup.read.getLagInEpochsForValidatorSet()) +
296
+ 1n,
297
+ ),
298
+ );
299
+
300
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
301
+ await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
301
302
  }
302
303
 
303
304
  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
- );
305
+ this.logger.info('Setting up account');
306
+ const { deployedAccounts } = await deployAccounts(
307
+ 1,
308
+ this.logger,
309
+ )({
310
+ wallet: this.context.wallet,
311
+ initialFundedAccounts: this.context.initialFundedAccounts,
312
+ });
313
+ this.deployedAccounts = deployedAccounts;
314
+ [{ address: this.defaultAccountAddress }] = deployedAccounts;
315
+ this.wallet = this.context.wallet;
314
316
  }
315
317
 
316
318
  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
- );
319
+ this.logger.info('Deploying spam contract');
320
+ if (!this.wallet) {
321
+ throw new Error('Call setupAccount before deploying spam contract');
322
+ }
323
+
324
+ const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! }).deployed();
325
+ this.spamContract = spamContract;
336
326
  }
337
327
 
338
328
  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
- );
329
+ this.logger.info('Removing initial node');
330
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
331
+ const { receipt } = await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
332
+ const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
333
+ blockNumber: receipt.blockNumber,
334
+ });
335
+ this.context.dateProvider!.setTime(Number(block.timestamp) * 1000);
336
+
337
+ await this.context.aztecNodeService!.stop();
352
338
  }
353
339
 
354
340
  async sendDummyTx() {
@@ -364,17 +350,26 @@ export class P2PNetworkTest {
364
350
  }
365
351
 
366
352
  async setup() {
367
- this.ctx = await this.snapshotManager.setup();
353
+ this.logger.info('Setting up subsystems from fresh');
354
+ this.context = await setup(0, {
355
+ ...this.setupOptions,
356
+ fundSponsoredFPC: true,
357
+ skipAccountDeployment: true,
358
+ slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
359
+ aztecTargetCommitteeSize: 0,
360
+ l1ContractsArgs: this.deployL1ContractsArgs,
361
+ });
362
+ this.ctx = this.context;
368
363
 
369
364
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
370
- const initialFundedAccounts = [...this.ctx.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
365
+ const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
371
366
 
372
367
  const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
373
368
  this.prefilledPublicData = prefilledPublicData;
374
369
 
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));
370
+ const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
371
+ this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider!).start();
372
+ this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider!.setTime(Number(timestamp) * 1000));
378
373
  }
379
374
 
380
375
  async stopNodes(nodes: AztecNodeService[]) {
@@ -435,7 +430,7 @@ export class P2PNetworkTest {
435
430
  async teardown() {
436
431
  await this.monitor.stop();
437
432
  await tryStop(this.bootstrapNode, this.logger);
438
- await this.snapshotManager.teardown();
433
+ await teardown(this.context);
439
434
  }
440
435
 
441
436
  async getContracts(): Promise<{
@@ -445,7 +440,7 @@ export class P2PNetworkTest {
445
440
  slashFactory: SlashFactoryContract;
446
441
  }> {
447
442
  if (!this.ctx.deployL1ContractsValues) {
448
- throw new Error('DeployL1ContractsValues not set');
443
+ throw new Error('DeployAztecL1ContractsValues not set');
449
444
  }
450
445
 
451
446
  const rollup = new RollupContract(
@@ -454,7 +449,7 @@ export class P2PNetworkTest {
454
449
  );
455
450
 
456
451
  const slasherContract = getContract({
457
- address: getAddress(await rollup.getSlasherAddress()),
452
+ address: getAddress((await rollup.getSlasherAddress()).toString()),
458
453
  abi: SlasherAbi,
459
454
  client: this.ctx.deployL1ContractsValues.l1Client,
460
455
  });
@@ -6,8 +6,14 @@ import { Fr } from '@aztec/aztec.js/fields';
6
6
  import type { Logger } from '@aztec/aztec.js/log';
7
7
  import { Tx, TxStatus } 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';
@@ -80,7 +86,7 @@ export async function prepareTransactions(
80
86
  salt: Fr.random(),
81
87
  });
82
88
  await wallet.registerContract(testContractInstance, TestContractArtifact);
83
- const contract = await TestContract.at(testContractInstance.address, wallet);
89
+ const contract = TestContract.at(testContractInstance.address, wallet);
84
90
 
85
91
  return timesAsync(numTxs, async () => {
86
92
  const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
@@ -132,7 +138,7 @@ export async function awaitCommitteeExists({
132
138
  logger: Logger;
133
139
  }): Promise<readonly `0x${string}`[]> {
134
140
  logger.info(`Waiting for committee to be set`);
135
- let committee: readonly `0x${string}`[] | undefined;
141
+ let committee: EthAddress[] | undefined;
136
142
  await retryUntil(
137
143
  async () => {
138
144
  committee = await rollup.getCurrentEpochCommittee();
@@ -141,7 +147,7 @@ export async function awaitCommitteeExists({
141
147
  'non-empty committee',
142
148
  60,
143
149
  );
144
- return committee!;
150
+ return committee!.map(c => c.toString() as `0x${string}`);
145
151
  }
146
152
 
147
153
  export async function awaitOffenseDetected({
@@ -213,7 +219,7 @@ export async function awaitCommitteeKicked({
213
219
 
214
220
  if (slashingProposer.type === 'empire') {
215
221
  // 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;
222
+ const targetEpoch = EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1);
217
223
  logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
218
224
  await cheatCodes.advanceToEpoch(targetEpoch);
219
225
 
@@ -239,7 +245,7 @@ export async function awaitCommitteeKicked({
239
245
  const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
240
246
  const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
241
247
  logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
242
- await cheatCodes.advanceToEpoch(targetEpoch, { offset: -aztecSlotDuration / 2 });
248
+ await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
243
249
  }
244
250
 
245
251
  const attestersPre = await rollup.getAttesters();
@@ -269,7 +275,9 @@ export async function awaitCommitteeKicked({
269
275
 
270
276
  logger.info(`Advancing to check current committee`);
271
277
  await cheatCodes.debugRollup();
272
- await cheatCodes.advanceToEpoch((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochs()) + 1n);
278
+ await cheatCodes.advanceToEpoch(
279
+ EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1),
280
+ );
273
281
  await cheatCodes.debugRollup();
274
282
 
275
283
  const committeeNextEpoch = await rollup.getCurrentEpochCommittee();