@aztec/end-to-end 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e

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