@aztec/end-to-end 0.0.1-commit.fcb71a6 → 0.0.1-commit.ff7989d6c

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 (234) 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 +13 -14
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +121 -136
  7. package/dest/bench/client_flows/config.d.ts +2 -2
  8. package/dest/bench/client_flows/config.d.ts.map +1 -1
  9. package/dest/bench/client_flows/config.js +18 -0
  10. package/dest/bench/client_flows/data_extractor.js +3 -1
  11. package/dest/bench/utils.d.ts +9 -8
  12. package/dest/bench/utils.d.ts.map +1 -1
  13. package/dest/bench/utils.js +17 -12
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +9 -8
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +106 -112
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +16 -11
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +90 -70
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  21. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  22. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  23. package/dest/e2e_epochs/epochs_test.d.ts +15 -7
  24. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  25. package/dest/e2e_epochs/epochs_test.js +87 -40
  26. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  27. package/dest/e2e_fees/fees_test.d.ts +14 -14
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +125 -143
  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 +14 -16
  33. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  34. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  35. package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
  36. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  37. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  38. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  39. package/dest/e2e_p2p/p2p_network.d.ts +8 -7
  40. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  41. package/dest/e2e_p2p/p2p_network.js +127 -106
  42. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  43. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  44. package/dest/e2e_p2p/reqresp/utils.js +177 -0
  45. package/dest/e2e_p2p/shared.d.ts +6 -6
  46. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  47. package/dest/e2e_p2p/shared.js +18 -21
  48. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  49. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  50. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  51. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  54. package/dest/e2e_token_contract/token_contract_test.d.ts +19 -10
  55. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  56. package/dest/e2e_token_contract/token_contract_test.js +99 -91
  57. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  58. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  59. package/dest/fixtures/authwit_proxy.js +30 -0
  60. package/dest/fixtures/e2e_prover_test.d.ts +11 -17
  61. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  62. package/dest/fixtures/e2e_prover_test.js +112 -128
  63. package/dest/fixtures/fixtures.d.ts +5 -1
  64. package/dest/fixtures/fixtures.d.ts.map +1 -1
  65. package/dest/fixtures/fixtures.js +6 -0
  66. package/dest/fixtures/ha_setup.d.ts +71 -0
  67. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  68. package/dest/fixtures/ha_setup.js +116 -0
  69. package/dest/fixtures/index.d.ts +2 -1
  70. package/dest/fixtures/index.d.ts.map +1 -1
  71. package/dest/fixtures/index.js +1 -0
  72. package/dest/fixtures/setup.d.ts +235 -0
  73. package/dest/fixtures/setup.d.ts.map +1 -0
  74. package/dest/fixtures/setup.js +605 -0
  75. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  76. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  77. package/dest/fixtures/setup_p2p_test.js +40 -29
  78. package/dest/fixtures/token_utils.d.ts +2 -2
  79. package/dest/fixtures/token_utils.d.ts.map +1 -1
  80. package/dest/fixtures/token_utils.js +10 -6
  81. package/dest/fixtures/utils.d.ts +5 -194
  82. package/dest/fixtures/utils.d.ts.map +1 -1
  83. package/dest/fixtures/utils.js +4 -619
  84. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  85. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  86. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  87. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  88. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  89. package/dest/quality_of_service/prometheus_client.js +67 -0
  90. package/dest/shared/cross_chain_test_harness.d.ts +16 -6
  91. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  92. package/dest/shared/cross_chain_test_harness.js +13 -13
  93. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  94. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  95. package/dest/shared/gas_portal_test_harness.js +1 -1
  96. package/dest/shared/index.d.ts +3 -2
  97. package/dest/shared/index.d.ts.map +1 -1
  98. package/dest/shared/index.js +1 -0
  99. package/dest/shared/mock_state_view.d.ts +86 -0
  100. package/dest/shared/mock_state_view.d.ts.map +1 -0
  101. package/dest/shared/mock_state_view.js +186 -0
  102. package/dest/shared/submit-transactions.d.ts +4 -4
  103. package/dest/shared/submit-transactions.d.ts.map +1 -1
  104. package/dest/shared/submit-transactions.js +9 -11
  105. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  106. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  107. package/dest/shared/uniswap_l1_l2.js +53 -33
  108. package/dest/simulators/lending_simulator.d.ts +5 -1
  109. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  110. package/dest/simulators/lending_simulator.js +2 -2
  111. package/dest/simulators/token_simulator.d.ts +1 -1
  112. package/dest/simulators/token_simulator.d.ts.map +1 -1
  113. package/dest/simulators/token_simulator.js +2 -23
  114. package/dest/spartan/setup_test_wallets.d.ts +12 -4
  115. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  116. package/dest/spartan/setup_test_wallets.js +92 -35
  117. package/dest/spartan/tx_metrics.d.ts +51 -2
  118. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  119. package/dest/spartan/tx_metrics.js +333 -6
  120. package/dest/spartan/utils/bot.d.ts +28 -0
  121. package/dest/spartan/utils/bot.d.ts.map +1 -0
  122. package/dest/spartan/utils/bot.js +142 -0
  123. package/dest/spartan/utils/chaos.d.ts +79 -0
  124. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  125. package/dest/spartan/utils/chaos.js +142 -0
  126. package/dest/spartan/utils/clients.d.ts +39 -0
  127. package/dest/spartan/utils/clients.d.ts.map +1 -0
  128. package/dest/spartan/utils/clients.js +90 -0
  129. package/dest/spartan/utils/config.d.ts +39 -0
  130. package/dest/spartan/utils/config.d.ts.map +1 -0
  131. package/dest/spartan/utils/config.js +21 -0
  132. package/dest/spartan/utils/health.d.ts +63 -0
  133. package/dest/spartan/utils/health.d.ts.map +1 -0
  134. package/dest/spartan/utils/health.js +202 -0
  135. package/dest/spartan/utils/helm.d.ts +15 -0
  136. package/dest/spartan/utils/helm.d.ts.map +1 -0
  137. package/dest/spartan/utils/helm.js +47 -0
  138. package/dest/spartan/utils/index.d.ts +9 -0
  139. package/dest/spartan/utils/index.d.ts.map +1 -0
  140. package/dest/spartan/utils/index.js +18 -0
  141. package/dest/spartan/utils/k8s.d.ts +128 -0
  142. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  143. package/dest/spartan/utils/k8s.js +381 -0
  144. package/dest/spartan/utils/nodes.d.ts +40 -0
  145. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  146. package/dest/spartan/utils/nodes.js +460 -0
  147. package/dest/spartan/utils/scripts.d.ts +30 -0
  148. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  149. package/dest/spartan/utils/scripts.js +81 -0
  150. package/dest/spartan/utils.d.ts +2 -253
  151. package/dest/spartan/utils.d.ts.map +1 -1
  152. package/dest/spartan/utils.js +1 -892
  153. package/dest/test-wallet/test_wallet.d.ts +83 -0
  154. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  155. package/dest/test-wallet/test_wallet.js +214 -0
  156. package/dest/test-wallet/utils.d.ts +41 -0
  157. package/dest/test-wallet/utils.d.ts.map +1 -0
  158. package/dest/test-wallet/utils.js +71 -0
  159. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  160. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  161. package/dest/test-wallet/wallet_worker_script.js +40 -0
  162. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  163. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  164. package/dest/test-wallet/worker_wallet.js +103 -0
  165. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  166. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  167. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  168. package/package.json +44 -39
  169. package/src/bench/client_flows/benchmark.ts +24 -2
  170. package/src/bench/client_flows/client_flows_benchmark.ts +141 -211
  171. package/src/bench/client_flows/config.ts +9 -1
  172. package/src/bench/client_flows/data_extractor.ts +1 -1
  173. package/src/bench/utils.ts +21 -15
  174. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +114 -143
  175. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -117
  176. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  177. package/src/e2e_epochs/epochs_test.ts +130 -94
  178. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  179. package/src/e2e_fees/fees_test.ts +164 -227
  180. package/src/e2e_l1_publisher/write_json.ts +16 -16
  181. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  182. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  183. package/src/e2e_p2p/p2p_network.ts +197 -171
  184. package/src/e2e_p2p/reqresp/utils.ts +235 -0
  185. package/src/e2e_p2p/shared.ts +28 -27
  186. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  187. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  188. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  189. package/src/e2e_token_contract/token_contract_test.ts +113 -119
  190. package/src/fixtures/authwit_proxy.ts +50 -0
  191. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  192. package/src/fixtures/e2e_prover_test.ts +127 -172
  193. package/src/fixtures/fixtures.ts +10 -0
  194. package/src/fixtures/ha_setup.ts +186 -0
  195. package/src/fixtures/index.ts +1 -0
  196. package/src/fixtures/setup.ts +896 -0
  197. package/src/fixtures/setup_p2p_test.ts +40 -44
  198. package/src/fixtures/token_utils.ts +7 -5
  199. package/src/fixtures/utils.ts +27 -907
  200. package/src/guides/up_quick_start.sh +3 -3
  201. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  202. package/src/quality_of_service/prometheus_client.ts +113 -0
  203. package/src/shared/cross_chain_test_harness.ts +16 -36
  204. package/src/shared/gas_portal_test_harness.ts +1 -1
  205. package/src/shared/index.ts +2 -1
  206. package/src/shared/mock_state_view.ts +188 -0
  207. package/src/shared/submit-transactions.ts +14 -16
  208. package/src/shared/uniswap_l1_l2.ts +59 -80
  209. package/src/simulators/lending_simulator.ts +2 -2
  210. package/src/simulators/token_simulator.ts +1 -29
  211. package/src/spartan/setup_test_wallets.ts +134 -26
  212. package/src/spartan/tx_metrics.ts +255 -9
  213. package/src/spartan/utils/bot.ts +188 -0
  214. package/src/spartan/utils/chaos.ts +253 -0
  215. package/src/spartan/utils/clients.ts +100 -0
  216. package/src/spartan/utils/config.ts +27 -0
  217. package/src/spartan/utils/health.ts +255 -0
  218. package/src/spartan/utils/helm.ts +84 -0
  219. package/src/spartan/utils/index.ts +65 -0
  220. package/src/spartan/utils/k8s.ts +535 -0
  221. package/src/spartan/utils/nodes.ts +535 -0
  222. package/src/spartan/utils/scripts.ts +99 -0
  223. package/src/spartan/utils.ts +1 -1158
  224. package/src/test-wallet/test_wallet.ts +306 -0
  225. package/src/test-wallet/utils.ts +112 -0
  226. package/src/test-wallet/wallet_worker_script.ts +43 -0
  227. package/src/test-wallet/worker_wallet.ts +165 -0
  228. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  229. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  230. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  231. package/dest/fixtures/snapshot_manager.js +0 -493
  232. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  233. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  234. package/src/fixtures/snapshot_manager.ts +0 -651
@@ -6,17 +6,15 @@ import { ChildContract } from '@aztec/noir-test-contracts.js/Child';
6
6
  import { ParentContract } from '@aztec/noir-test-contracts.js/Parent';
7
7
 
8
8
  import {
9
- type ISnapshotManager,
10
- type SubsystemsContext,
11
- createSnapshotManager,
9
+ type EndToEndContext,
12
10
  deployAccounts,
13
11
  publicDeployAccounts,
14
- } from '../fixtures/snapshot_manager.js';
15
-
16
- const { E2E_DATA_PATH: dataPath } = process.env;
12
+ setup,
13
+ teardown as teardownSubsystems,
14
+ } from '../fixtures/setup.js';
17
15
 
18
16
  export class NestedContractTest {
19
- private snapshotManager: ISnapshotManager;
17
+ context!: EndToEndContext;
20
18
  logger: Logger;
21
19
  wallet!: Wallet;
22
20
  defaultAccountAddress!: AztecAddress;
@@ -30,67 +28,46 @@ export class NestedContractTest {
30
28
  private numberOfAccounts = 1,
31
29
  ) {
32
30
  this.logger = createLogger(`e2e:e2e_nested_contract:${testName}`);
33
- this.snapshotManager = createSnapshotManager(`e2e_nested_contract/${testName}-${numberOfAccounts}`, dataPath);
34
31
  }
35
32
 
36
33
  /**
37
- * Adds two state shifts to snapshot manager.
38
- * 1. Add 3 accounts.
39
- * 2. Publicly deploy accounts
34
+ * Applies base setup by deploying accounts and publicly deploying them.
40
35
  */
41
- async applyBaseSnapshots() {
42
- await this.snapshotManager.snapshot(
43
- 'accounts',
44
- deployAccounts(this.numberOfAccounts, this.logger),
45
- ({ deployedAccounts }, { wallet, aztecNode }) => {
46
- this.wallet = wallet;
47
- [{ address: this.defaultAccountAddress }] = deployedAccounts;
48
- this.aztecNode = aztecNode;
49
- return Promise.resolve();
50
- },
51
- );
36
+ async applyBaseSetup() {
37
+ this.logger.info('Deploying accounts');
38
+ const { deployedAccounts } = await deployAccounts(
39
+ this.numberOfAccounts,
40
+ this.logger,
41
+ )({
42
+ wallet: this.context.wallet,
43
+ initialFundedAccounts: this.context.initialFundedAccounts,
44
+ });
45
+ this.wallet = this.context.wallet;
46
+ [{ address: this.defaultAccountAddress }] = deployedAccounts;
47
+ this.aztecNode = this.context.aztecNodeService;
52
48
 
53
- await this.snapshotManager.snapshot(
54
- 'public_deploy',
55
- async () => {},
56
- async () => {
57
- this.logger.verbose(`Public deploy accounts...`);
58
- await publicDeployAccounts(this.wallet, [this.defaultAccountAddress]);
59
- },
60
- );
49
+ this.logger.info('Public deploy accounts');
50
+ await publicDeployAccounts(this.wallet, [this.defaultAccountAddress]);
61
51
  }
62
52
 
63
53
  async setup() {
64
- await this.snapshotManager.setup();
54
+ this.logger.info('Setting up fresh subsystems');
55
+ this.context = await setup(0, {
56
+ fundSponsoredFPC: true,
57
+ skipAccountDeployment: true,
58
+ });
59
+ await this.applyBaseSetup();
65
60
  }
66
61
 
67
62
  async teardown() {
68
- await this.snapshotManager.teardown();
63
+ await teardownSubsystems(this.context);
69
64
  }
70
65
 
71
- snapshot = <T>(
72
- name: string,
73
- apply: (context: SubsystemsContext) => Promise<T>,
74
- restore: (snapshotData: T, context: SubsystemsContext) => Promise<void> = () => Promise.resolve(),
75
- ): Promise<void> => this.snapshotManager.snapshot(name, apply, restore);
76
-
77
- async applyManualSnapshots() {
78
- await this.snapshotManager.snapshot(
79
- 'manual',
80
- async () => {
81
- const parentContract = await ParentContract.deploy(this.wallet)
82
- .send({ from: this.defaultAccountAddress })
83
- .deployed();
84
- const childContract = await ChildContract.deploy(this.wallet)
85
- .send({ from: this.defaultAccountAddress })
86
- .deployed();
87
- return { parentContractAddress: parentContract.address, childContractAddress: childContract.address };
88
- },
89
- ({ parentContractAddress, childContractAddress }) => {
90
- this.parentContract = ParentContract.at(parentContractAddress, this.wallet);
91
- this.childContract = ChildContract.at(childContractAddress, this.wallet);
92
- return Promise.resolve();
93
- },
94
- );
66
+ async applyManual() {
67
+ this.logger.info('Deploying parent and child contracts');
68
+ const parentContract = await ParentContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
69
+ const childContract = await ChildContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
70
+ this.parentContract = parentContract;
71
+ this.childContract = childContract;
95
72
  }
96
73
  }
@@ -82,8 +82,8 @@ export class P2PInactivityTest {
82
82
  }
83
83
 
84
84
  public async setup() {
85
- await this.test.applyBaseSnapshots();
86
85
  await this.test.setup();
86
+ await this.test.applyBaseSetup();
87
87
 
88
88
  // Set slashing penalties for inactivity
89
89
  const { rollup } = await this.test.getContracts();
@@ -98,7 +98,7 @@ export class P2PInactivityTest {
98
98
  this.rollup = rollup;
99
99
 
100
100
  if (!this.keepInitialNode) {
101
- await this.test.ctx.aztecNode.stop();
101
+ await this.test.ctx.aztecNodeService.stop();
102
102
  }
103
103
 
104
104
  // Create all active nodes
@@ -129,7 +129,7 @@ export class P2PInactivityTest {
129
129
  );
130
130
 
131
131
  this.nodes = [
132
- ...(this.keepInitialNode ? [this.test.ctx.aztecNode] : []),
132
+ ...(this.keepInitialNode ? [this.test.ctx.aztecNodeService] : []),
133
133
  ...this.activeNodes,
134
134
  ...this.inactiveNodes,
135
135
  ];
@@ -12,7 +12,7 @@ import {
12
12
  import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
13
13
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
14
14
  import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
15
- import { createL1TxUtilsFromViemWallet } from '@aztec/ethereum/l1-tx-utils';
15
+ import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
16
16
  import { ChainMonitor } from '@aztec/ethereum/test';
17
17
  import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
18
18
  import { EpochNumber } from '@aztec/foundation/branded-types';
@@ -25,28 +25,31 @@ import type { BootstrapNode } from '@aztec/p2p/bootstrap';
25
25
  import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
26
26
  import { tryStop } from '@aztec/stdlib/interfaces/server';
27
27
  import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
28
+ import { TopicType } from '@aztec/stdlib/p2p';
28
29
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
29
30
  import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
30
- import type { TestWallet } from '@aztec/test-wallet/server';
31
31
  import { getGenesisValues } from '@aztec/world-state/testing';
32
32
 
33
33
  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';
52
+ import type { TestWallet } from '../test-wallet/test_wallet.js';
50
53
 
51
54
  // Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
52
55
  const BOOTSTRAP_NODE_PRIVATE_KEY = '080212208f988fc0899e4a73a5aee4d271a5f20670603a756ad8d84f2c94263a6427c591';
@@ -60,14 +63,14 @@ export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
60
63
  };
61
64
 
62
65
  export class P2PNetworkTest {
63
- private snapshotManager: ISnapshotManager;
66
+ public context!: EndToEndContext;
64
67
  public baseAccountPrivateKey: `0x${string}`;
65
68
  public baseAccount;
66
69
 
67
70
  public logger: Logger;
68
71
  public monitor!: ChainMonitor;
69
72
 
70
- public ctx!: SubsystemsContext;
73
+ public ctx!: EndToEndContext;
71
74
  public attesterPrivateKeys: `0x${string}`[] = [];
72
75
  public attesterPublicKeys: string[] = [];
73
76
  public peerIdPrivateKeys: string[] = [];
@@ -83,6 +86,10 @@ export class P2PNetworkTest {
83
86
 
84
87
  public bootstrapNode?: BootstrapNode;
85
88
 
89
+ // Store setup options for use in setup()
90
+ private setupOptions: SetupOptions;
91
+ private deployL1ContractsArgs: any;
92
+
86
93
  constructor(
87
94
  public readonly testName: string,
88
95
  public bootstrapNodeEnr: string,
@@ -107,43 +114,42 @@ export class P2PNetworkTest {
107
114
 
108
115
  const zkPassportParams = ZkPassportProofParams.random();
109
116
 
110
- this.snapshotManager = createSnapshotManager(
111
- `e2e_p2p_network/${testName}`,
112
- process.env.E2E_DATA_PATH,
113
- {
114
- ...initialValidatorConfig,
115
- ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
116
- aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
117
- aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
118
- aztecProofSubmissionEpochs:
119
- initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
120
- slashingRoundSizeInEpochs:
121
- initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
122
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
123
- aztecTargetCommitteeSize: numberOfValidators,
124
- metricsPort: metricsPort,
125
- numberOfInitialFundedAccounts: 2,
126
- startProverNode,
127
- },
128
- {
129
- ...initialValidatorConfig,
130
- aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
131
- slashingRoundSizeInEpochs:
132
- initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
133
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
134
-
135
- ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
136
- aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
137
- aztecProofSubmissionEpochs:
138
- initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
139
- aztecTargetCommitteeSize: numberOfValidators,
140
- initialValidators: [],
141
- zkPassportArgs: {
142
- zkPassportDomain: zkPassportParams.domain,
143
- zkPassportScope: zkPassportParams.scope,
144
- },
117
+ // Store setup options for later use
118
+ this.setupOptions = {
119
+ ...initialValidatorConfig,
120
+ ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
121
+ aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
122
+ aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
123
+ aztecProofSubmissionEpochs:
124
+ initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
125
+ slashingRoundSizeInEpochs:
126
+ initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
127
+ slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
128
+ aztecTargetCommitteeSize: numberOfValidators,
129
+ metricsPort: metricsPort,
130
+ numberOfInitialFundedAccounts: 2,
131
+ startProverNode,
132
+ walletMinFeePadding: 2.0,
133
+ };
134
+
135
+ this.deployL1ContractsArgs = {
136
+ ...initialValidatorConfig,
137
+ aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
138
+ slashingRoundSizeInEpochs:
139
+ initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
140
+ slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
141
+
142
+ ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
143
+ aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
144
+ aztecProofSubmissionEpochs:
145
+ initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
146
+ aztecTargetCommitteeSize: numberOfValidators,
147
+ initialValidators: [],
148
+ zkPassportArgs: {
149
+ zkPassportDomain: zkPassportParams.domain,
150
+ zkPassportScope: zkPassportParams.scope,
145
151
  },
146
- );
152
+ };
147
153
  }
148
154
 
149
155
  static async create({
@@ -187,23 +193,22 @@ export class P2PNetworkTest {
187
193
 
188
194
  get fundedAccount() {
189
195
  if (!this.deployedAccounts[0]) {
190
- throw new Error('Call snapshot t.setupAccount to create a funded account.');
196
+ throw new Error('Call setupAccount to create a funded account.');
191
197
  }
192
198
  return this.deployedAccounts[0];
193
199
  }
194
200
 
195
201
  async addBootstrapNode() {
196
- await this.snapshotManager.snapshot('add-bootstrap-node', async ({ aztecNodeConfig }) => {
197
- const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
198
- this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
199
- BOOTSTRAP_NODE_PRIVATE_KEY,
200
- this.bootNodePort,
201
- telemetry,
202
- aztecNodeConfig,
203
- );
204
- // Overwrite enr with updated info
205
- this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
206
- });
202
+ this.logger.info('Adding bootstrap node');
203
+ const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
204
+ this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
205
+ BOOTSTRAP_NODE_PRIVATE_KEY,
206
+ this.bootNodePort,
207
+ telemetry,
208
+ this.context.config,
209
+ );
210
+ // Overwrite enr with updated info
211
+ this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
207
212
  }
208
213
 
209
214
  getValidators() {
@@ -224,128 +229,114 @@ export class P2PNetworkTest {
224
229
  return { validators };
225
230
  }
226
231
 
227
- async applyBaseSnapshots() {
232
+ async applyBaseSetup() {
228
233
  await this.addBootstrapNode();
229
- await this.snapshotManager.snapshot('add-validators', async ({ deployL1ContractsValues, cheatCodes }) => {
230
- const rollup = getContract({
231
- address: deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
232
- abi: RollupAbi,
233
- client: deployL1ContractsValues.l1Client,
234
- });
235
234
 
236
- this.logger.info(`Adding ${this.numberOfValidators} validators`);
235
+ this.logger.info('Adding validators');
236
+ const rollup = getContract({
237
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
238
+ abi: RollupAbi,
239
+ client: this.context.deployL1ContractsValues.l1Client,
240
+ });
237
241
 
238
- const stakingAsset = getContract({
239
- address: deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
240
- abi: TestERC20Abi,
241
- client: deployL1ContractsValues.l1Client,
242
- });
242
+ this.logger.info(`Adding ${this.numberOfValidators} validators`);
243
243
 
244
- const { address: multiAdderAddress } = await deployL1Contract(
245
- deployL1ContractsValues.l1Client,
246
- MultiAdderArtifact.contractAbi,
247
- MultiAdderArtifact.contractBytecode,
248
- [rollup.address, deployL1ContractsValues.l1Client.account.address],
249
- );
250
-
251
- const multiAdder = getContract({
252
- address: multiAdderAddress.toString(),
253
- abi: MultiAdderArtifact.contractAbi,
254
- client: deployL1ContractsValues.l1Client,
255
- });
244
+ const stakingAsset = getContract({
245
+ address: this.context.deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
246
+ abi: TestERC20Abi,
247
+ client: this.context.deployL1ContractsValues.l1Client,
248
+ });
256
249
 
257
- const stakeNeeded = (await rollup.read.getActivationThreshold()) * BigInt(this.numberOfValidators);
258
- await Promise.all(
259
- [await stakingAsset.write.mint([multiAdder.address, stakeNeeded], {} as any)].map(txHash =>
260
- deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
261
- ),
262
- );
263
-
264
- const { validators } = this.getValidators();
265
- this.validators = validators;
266
-
267
- const gseAddress = deployL1ContractsValues.l1ContractAddresses.gseAddress!;
268
- if (!gseAddress) {
269
- throw new Error('GSE contract not deployed');
270
- }
271
-
272
- const gseContract = new GSEContract(deployL1ContractsValues.l1Client, gseAddress.toString());
273
-
274
- const makeValidatorTuples = async (validator: Operator) => {
275
- const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
276
- return {
277
- attester: validator.attester.toString() as `0x${string}`,
278
- withdrawer: validator.withdrawer.toString() as `0x${string}`,
279
- ...registrationTuple,
280
- };
281
- };
282
- const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
250
+ const { address: multiAdderAddress } = await deployL1Contract(
251
+ this.context.deployL1ContractsValues.l1Client,
252
+ MultiAdderArtifact.contractAbi,
253
+ MultiAdderArtifact.contractBytecode,
254
+ [rollup.address, this.context.deployL1ContractsValues.l1Client.account.address],
255
+ );
283
256
 
284
- await deployL1ContractsValues.l1Client.waitForTransactionReceipt({
285
- hash: await multiAdder.write.addValidators([validatorTuples]),
286
- });
257
+ const multiAdder = getContract({
258
+ address: multiAdderAddress.toString(),
259
+ abi: MultiAdderArtifact.contractAbi,
260
+ client: this.context.deployL1ContractsValues.l1Client,
261
+ });
287
262
 
288
- await cheatCodes.rollup.advanceToEpoch(
289
- EpochNumber.fromBigInt(
290
- BigInt(await cheatCodes.rollup.getEpoch()) + (await rollup.read.getLagInEpochsForValidatorSet()) + 1n,
291
- ),
292
- );
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
+ this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
267
+ ),
268
+ );
293
269
 
294
- // Send and await a tx to make sure we mine a block for the warp to correctly progress.
295
- await this._sendDummyTx(deployL1ContractsValues.l1Client);
270
+ const { validators } = this.getValidators();
271
+ this.validators = validators;
272
+
273
+ const gseAddress = this.context.deployL1ContractsValues.l1ContractAddresses.gseAddress!;
274
+ if (!gseAddress) {
275
+ throw new Error('GSE contract not deployed');
276
+ }
277
+
278
+ const gseContract = new GSEContract(this.context.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));
289
+
290
+ await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({
291
+ hash: await multiAdder.write.addValidators([validatorTuples]),
296
292
  });
293
+
294
+ await this.context.cheatCodes.rollup.advanceToEpoch(
295
+ EpochNumber.fromBigInt(
296
+ BigInt(await this.context.cheatCodes.rollup.getEpoch()) +
297
+ (await rollup.read.getLagInEpochsForValidatorSet()) +
298
+ 1n,
299
+ ),
300
+ );
301
+
302
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
303
+ await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
297
304
  }
298
305
 
299
306
  async setupAccount() {
300
- await this.snapshotManager.snapshot(
301
- 'setup-account',
302
- deployAccounts(1, this.logger),
303
- ({ deployedAccounts }, { wallet }) => {
304
- this.deployedAccounts = deployedAccounts;
305
- [{ address: this.defaultAccountAddress }] = deployedAccounts;
306
- this.wallet = wallet;
307
- return Promise.resolve();
308
- },
309
- );
307
+ this.logger.info('Setting up account');
308
+ const { deployedAccounts } = await deployAccounts(
309
+ 1,
310
+ this.logger,
311
+ )({
312
+ wallet: this.context.wallet,
313
+ initialFundedAccounts: this.context.initialFundedAccounts,
314
+ });
315
+ this.deployedAccounts = deployedAccounts;
316
+ [{ address: this.defaultAccountAddress }] = deployedAccounts;
317
+ this.wallet = this.context.wallet;
310
318
  }
311
319
 
312
320
  async deploySpamContract() {
313
- await this.snapshotManager.snapshot(
314
- 'add-spam-contract',
315
- async () => {
316
- if (!this.wallet) {
317
- throw new Error('Call snapshot t.setupAccount before deploying account contract');
318
- }
319
-
320
- const spamContract = await SpamContract.deploy(this.wallet)
321
- .send({ from: this.defaultAccountAddress! })
322
- .deployed();
323
- return { contractAddress: spamContract.address };
324
- },
325
- ({ contractAddress }) => {
326
- if (!this.wallet) {
327
- throw new Error('Call snapshot t.setupAccount before deploying account contract');
328
- }
329
- this.spamContract = SpamContract.at(contractAddress, this.wallet);
330
- return Promise.resolve();
331
- },
332
- );
321
+ this.logger.info('Deploying spam contract');
322
+ if (!this.wallet) {
323
+ throw new Error('Call setupAccount before deploying spam contract');
324
+ }
325
+
326
+ const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
327
+ this.spamContract = spamContract;
333
328
  }
334
329
 
335
330
  async removeInitialNode() {
336
- await this.snapshotManager.snapshot(
337
- 'remove-initial-validator',
338
- async ({ deployL1ContractsValues, aztecNode, dateProvider }) => {
339
- // Send and await a tx to make sure we mine a block for the warp to correctly progress.
340
- const { receipt } = await this._sendDummyTx(deployL1ContractsValues.l1Client);
341
- const block = await deployL1ContractsValues.l1Client.getBlock({
342
- blockNumber: receipt.blockNumber,
343
- });
344
- dateProvider.setTime(Number(block.timestamp) * 1000);
345
-
346
- await aztecNode.stop();
347
- },
348
- );
331
+ this.logger.info('Removing initial node');
332
+ // Send and await a tx to make sure we mine a block for the warp to correctly progress.
333
+ const { receipt } = await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
334
+ const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
335
+ blockNumber: receipt.blockNumber,
336
+ });
337
+ this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
338
+
339
+ await this.context.aztecNodeService.stop();
349
340
  }
350
341
 
351
342
  async sendDummyTx() {
@@ -353,7 +344,7 @@ export class P2PNetworkTest {
353
344
  }
354
345
 
355
346
  private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
356
- const l1TxUtils = createL1TxUtilsFromViemWallet(l1Client);
347
+ const l1TxUtils = createL1TxUtils(l1Client);
357
348
  return await l1TxUtils.sendAndMonitorTransaction({
358
349
  to: l1Client.account!.address,
359
350
  value: 1n,
@@ -361,17 +352,31 @@ export class P2PNetworkTest {
361
352
  }
362
353
 
363
354
  async setup() {
364
- this.ctx = await this.snapshotManager.setup();
355
+ this.logger.info('Setting up subsystems from fresh');
356
+ this.context = await setup(
357
+ 0,
358
+ {
359
+ ...this.setupOptions,
360
+ fundSponsoredFPC: true,
361
+ skipAccountDeployment: true,
362
+ slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
363
+ aztecTargetCommitteeSize: 0,
364
+ l1ContractsArgs: this.deployL1ContractsArgs,
365
+ },
366
+ // Use checkpointed chain tip for PXE to avoid issues with blocks being dropped due to pruned anchor blocks.
367
+ { syncChainTip: 'checkpointed' },
368
+ );
369
+ this.ctx = this.context;
365
370
 
366
371
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
367
- const initialFundedAccounts = [...this.ctx.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
372
+ const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
368
373
 
369
374
  const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
370
375
  this.prefilledPublicData = prefilledPublicData;
371
376
 
372
- const rollupContract = RollupContract.getFromL1ContractsValues(this.ctx.deployL1ContractsValues);
373
- this.monitor = new ChainMonitor(rollupContract, this.ctx.dateProvider).start();
374
- this.monitor.on('l1-block', ({ timestamp }) => this.ctx.dateProvider.setTime(Number(timestamp) * 1000));
377
+ const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
378
+ this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
379
+ this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider.setTime(Number(timestamp) * 1000));
375
380
  }
376
381
 
377
382
  async stopNodes(nodes: AztecNodeService[]) {
@@ -427,12 +432,33 @@ export class P2PNetworkTest {
427
432
  );
428
433
 
429
434
  this.logger.warn('All nodes connected to P2P mesh');
435
+
436
+ // Wait for GossipSub mesh to form for the tx topic.
437
+ // We only require at least 1 mesh peer per node because GossipSub
438
+ // stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
439
+ this.logger.warn('Waiting for GossipSub mesh to form for tx topic...');
440
+ await Promise.all(
441
+ nodes.map(async (node, index) => {
442
+ const p2p = node.getP2P();
443
+ await retryUntil(
444
+ async () => {
445
+ const meshPeers = await p2p.getGossipMeshPeerCount(TopicType.tx);
446
+ this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for tx topic`);
447
+ return meshPeers >= 1 ? true : undefined;
448
+ },
449
+ `Node ${index} to have gossip mesh peers for tx topic`,
450
+ timeoutSeconds,
451
+ checkIntervalSeconds,
452
+ );
453
+ }),
454
+ );
455
+ this.logger.warn('All nodes have gossip mesh peers for tx topic');
430
456
  }
431
457
 
432
458
  async teardown() {
433
459
  await this.monitor.stop();
434
460
  await tryStop(this.bootstrapNode, this.logger);
435
- await this.snapshotManager.teardown();
461
+ await teardown(this.context);
436
462
  }
437
463
 
438
464
  async getContracts(): Promise<{
@@ -451,7 +477,7 @@ export class P2PNetworkTest {
451
477
  );
452
478
 
453
479
  const slasherContract = getContract({
454
- address: getAddress(await rollup.getSlasherAddress()),
480
+ address: getAddress((await rollup.getSlasherAddress()).toString()),
455
481
  abi: SlasherAbi,
456
482
  client: this.ctx.deployL1ContractsValues.l1Client,
457
483
  });