@aztec/end-to-end 0.0.1-commit.d3ec352c → 0.0.1-commit.d6f2b3f94

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 (218) 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 +14 -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 +123 -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 +27 -18
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  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 +96 -112
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -13
  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 +92 -71
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
  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 +9 -2
  24. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  25. package/dest/e2e_epochs/epochs_test.js +51 -21
  26. package/dest/e2e_fees/bridging_race.notest.js +4 -6
  27. package/dest/e2e_fees/fees_test.d.ts +18 -15
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +126 -141
  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_multi_validator/utils.js +1 -1
  34. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  35. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  36. package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
  37. package/dest/e2e_p2p/inactivity_slash_test.d.ts +4 -4
  38. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  39. package/dest/e2e_p2p/inactivity_slash_test.js +6 -9
  40. package/dest/e2e_p2p/p2p_network.d.ts +13 -11
  41. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  42. package/dest/e2e_p2p/p2p_network.js +120 -111
  43. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  44. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  45. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  46. package/dest/e2e_p2p/shared.d.ts +7 -7
  47. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  48. package/dest/e2e_p2p/shared.js +16 -20
  49. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  50. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  51. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  54. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  55. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  56. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  57. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  58. package/dest/fixtures/e2e_prover_test.d.ts +10 -18
  59. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  60. package/dest/fixtures/e2e_prover_test.js +91 -103
  61. package/dest/fixtures/fixtures.d.ts +2 -3
  62. package/dest/fixtures/fixtures.d.ts.map +1 -1
  63. package/dest/fixtures/fixtures.js +1 -2
  64. package/dest/fixtures/get_acvm_config.js +1 -1
  65. package/dest/fixtures/ha_setup.d.ts +71 -0
  66. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  67. package/dest/fixtures/ha_setup.js +114 -0
  68. package/dest/fixtures/index.d.ts +2 -1
  69. package/dest/fixtures/index.d.ts.map +1 -1
  70. package/dest/fixtures/index.js +1 -0
  71. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  72. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  73. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  74. package/dest/fixtures/setup.d.ts +218 -0
  75. package/dest/fixtures/setup.d.ts.map +1 -0
  76. package/dest/fixtures/setup.js +630 -0
  77. package/dest/fixtures/setup_p2p_test.d.ts +12 -8
  78. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  79. package/dest/fixtures/setup_p2p_test.js +32 -24
  80. package/dest/fixtures/token_utils.d.ts +1 -1
  81. package/dest/fixtures/token_utils.d.ts.map +1 -1
  82. package/dest/fixtures/token_utils.js +7 -4
  83. package/dest/fixtures/utils.d.ts +5 -638
  84. package/dest/fixtures/utils.d.ts.map +1 -1
  85. package/dest/fixtures/utils.js +4 -647
  86. package/dest/fixtures/web3signer.js +1 -1
  87. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  88. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  89. package/dest/fixtures/with_telemetry_utils.js +2 -2
  90. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  91. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  92. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  93. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  94. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  95. package/dest/quality_of_service/prometheus_client.js +67 -0
  96. package/dest/shared/cross_chain_test_harness.d.ts +18 -7
  97. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  98. package/dest/shared/cross_chain_test_harness.js +14 -14
  99. package/dest/shared/gas_portal_test_harness.d.ts +12 -2
  100. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  101. package/dest/shared/gas_portal_test_harness.js +1 -1
  102. package/dest/shared/index.d.ts +2 -2
  103. package/dest/shared/index.d.ts.map +1 -1
  104. package/dest/shared/submit-transactions.d.ts +3 -3
  105. package/dest/shared/submit-transactions.d.ts.map +1 -1
  106. package/dest/shared/submit-transactions.js +9 -11
  107. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  108. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  109. package/dest/shared/uniswap_l1_l2.js +57 -35
  110. package/dest/simulators/lending_simulator.d.ts +6 -2
  111. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  112. package/dest/simulators/lending_simulator.js +2 -2
  113. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  114. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  115. package/dest/spartan/setup_test_wallets.js +63 -35
  116. package/dest/spartan/tx_metrics.d.ts +88 -0
  117. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  118. package/dest/spartan/tx_metrics.js +422 -0
  119. package/dest/spartan/utils/bot.d.ts +27 -0
  120. package/dest/spartan/utils/bot.d.ts.map +1 -0
  121. package/dest/spartan/utils/bot.js +141 -0
  122. package/dest/spartan/utils/chaos.d.ts +79 -0
  123. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  124. package/dest/spartan/utils/chaos.js +142 -0
  125. package/dest/spartan/utils/clients.d.ts +39 -0
  126. package/dest/spartan/utils/clients.d.ts.map +1 -0
  127. package/dest/spartan/utils/clients.js +90 -0
  128. package/dest/spartan/utils/config.d.ts +39 -0
  129. package/dest/spartan/utils/config.d.ts.map +1 -0
  130. package/dest/spartan/utils/config.js +21 -0
  131. package/dest/spartan/utils/health.d.ts +63 -0
  132. package/dest/spartan/utils/health.d.ts.map +1 -0
  133. package/dest/spartan/utils/health.js +202 -0
  134. package/dest/spartan/utils/helm.d.ts +15 -0
  135. package/dest/spartan/utils/helm.d.ts.map +1 -0
  136. package/dest/spartan/utils/helm.js +47 -0
  137. package/dest/spartan/utils/index.d.ts +9 -0
  138. package/dest/spartan/utils/index.d.ts.map +1 -0
  139. package/dest/spartan/utils/index.js +18 -0
  140. package/dest/spartan/utils/k8s.d.ts +126 -0
  141. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  142. package/dest/spartan/utils/k8s.js +375 -0
  143. package/dest/spartan/utils/nodes.d.ts +41 -0
  144. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  145. package/dest/spartan/utils/nodes.js +461 -0
  146. package/dest/spartan/utils/scripts.d.ts +30 -0
  147. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  148. package/dest/spartan/utils/scripts.js +81 -0
  149. package/dest/spartan/utils.d.ts +2 -221
  150. package/dest/spartan/utils.d.ts.map +1 -1
  151. package/dest/spartan/utils.js +1 -782
  152. package/package.json +43 -39
  153. package/src/bench/client_flows/benchmark.ts +24 -2
  154. package/src/bench/client_flows/client_flows_benchmark.ts +145 -208
  155. package/src/bench/client_flows/config.ts +9 -1
  156. package/src/bench/client_flows/data_extractor.ts +1 -1
  157. package/src/bench/utils.ts +31 -21
  158. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  159. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +139 -125
  160. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  161. package/src/e2e_epochs/epochs_test.ts +96 -47
  162. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  163. package/src/e2e_fees/fees_test.ts +176 -219
  164. package/src/e2e_l1_publisher/write_json.ts +16 -16
  165. package/src/e2e_multi_validator/utils.ts +1 -1
  166. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  167. package/src/e2e_p2p/inactivity_slash_test.ts +7 -10
  168. package/src/e2e_p2p/p2p_network.ts +180 -183
  169. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  170. package/src/e2e_p2p/shared.ts +32 -28
  171. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  172. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  173. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  174. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  175. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  176. package/src/fixtures/e2e_prover_test.ts +103 -140
  177. package/src/fixtures/fixtures.ts +1 -3
  178. package/src/fixtures/get_acvm_config.ts +1 -1
  179. package/src/fixtures/ha_setup.ts +184 -0
  180. package/src/fixtures/index.ts +1 -0
  181. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  182. package/src/fixtures/setup.ts +932 -0
  183. package/src/fixtures/setup_p2p_test.ts +34 -30
  184. package/src/fixtures/token_utils.ts +6 -5
  185. package/src/fixtures/utils.ts +27 -966
  186. package/src/fixtures/web3signer.ts +1 -1
  187. package/src/fixtures/with_telemetry_utils.ts +2 -2
  188. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  189. package/src/quality_of_service/prometheus_client.ts +113 -0
  190. package/src/shared/cross_chain_test_harness.ts +19 -37
  191. package/src/shared/gas_portal_test_harness.ts +2 -2
  192. package/src/shared/index.ts +1 -1
  193. package/src/shared/submit-transactions.ts +9 -15
  194. package/src/shared/uniswap_l1_l2.ts +65 -88
  195. package/src/simulators/lending_simulator.ts +3 -3
  196. package/src/spartan/setup_test_wallets.ts +81 -26
  197. package/src/spartan/tx_metrics.ts +376 -0
  198. package/src/spartan/utils/bot.ts +185 -0
  199. package/src/spartan/utils/chaos.ts +253 -0
  200. package/src/spartan/utils/clients.ts +100 -0
  201. package/src/spartan/utils/config.ts +27 -0
  202. package/src/spartan/utils/health.ts +255 -0
  203. package/src/spartan/utils/helm.ts +84 -0
  204. package/src/spartan/utils/index.ts +64 -0
  205. package/src/spartan/utils/k8s.ts +527 -0
  206. package/src/spartan/utils/nodes.ts +538 -0
  207. package/src/spartan/utils/scripts.ts +99 -0
  208. package/src/spartan/utils.ts +1 -983
  209. package/dest/fixtures/setup_l1_contracts.d.ts +0 -477
  210. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  211. package/dest/fixtures/setup_l1_contracts.js +0 -17
  212. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  213. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  214. package/dest/fixtures/snapshot_manager.js +0 -505
  215. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  216. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  217. package/src/fixtures/setup_l1_contracts.ts +0 -26
  218. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -1,43 +1,46 @@
1
1
  import type { AztecNodeConfig } from '@aztec/aztec-node';
2
2
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
3
+ import { waitForProven } from '@aztec/aztec.js/contracts';
3
4
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
4
5
  import type { AztecNode } from '@aztec/aztec.js/node';
6
+ import type { TxReceipt } from '@aztec/aztec.js/tx';
5
7
  import { CheatCodes } from '@aztec/aztec/testing';
6
- import {
7
- type DeployL1ContractsArgs,
8
- type DeployL1ContractsReturnType,
9
- type ExtendedViemWalletClient,
10
- createExtendedL1Client,
11
- deployL1Contract,
12
- } from '@aztec/ethereum';
13
- import { InboxAbi, OutboxAbi, TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
8
+ import { createExtendedL1Client } from '@aztec/ethereum/client';
9
+ import { InboxContract, OutboxContract, RollupContract } from '@aztec/ethereum/contracts';
10
+ import type {
11
+ DeployAztecL1ContractsArgs,
12
+ DeployAztecL1ContractsReturnType,
13
+ } from '@aztec/ethereum/deploy-aztec-l1-contracts';
14
+ import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
15
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
16
+ import { EpochNumber } from '@aztec/foundation/branded-types';
17
+ import { sleep } from '@aztec/foundation/sleep';
18
+ import { TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
14
19
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
15
20
  import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
16
21
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
17
22
  import type { TestWallet } from '@aztec/test-wallet/server';
18
23
 
19
- import { getContract } from 'viem';
20
-
21
24
  import { MNEMONIC } from '../fixtures/fixtures.js';
22
25
  import {
23
- type ISnapshotManager,
24
- type SubsystemsContext,
25
- createSnapshotManager,
26
+ type EndToEndContext,
27
+ type SetupOptions,
26
28
  deployAccounts,
27
29
  publicDeployAccounts,
28
- } from '../fixtures/snapshot_manager.js';
29
- import type { SetupOptions } from '../fixtures/utils.js';
30
+ setup,
31
+ teardown,
32
+ } from '../fixtures/setup.js';
30
33
  import { CrossChainTestHarness } from '../shared/cross_chain_test_harness.js';
31
34
 
32
- const { E2E_DATA_PATH: dataPath } = process.env;
33
-
34
35
  export class CrossChainMessagingTest {
35
- private snapshotManager: ISnapshotManager;
36
+ private requireEpochProven: boolean;
37
+ private setupOptions: SetupOptions;
38
+ private deployL1ContractsArgs: Partial<DeployAztecL1ContractsArgs>;
36
39
  logger: Logger;
40
+ context!: EndToEndContext;
37
41
  aztecNode!: AztecNode;
38
42
  aztecNodeConfig!: AztecNodeConfig;
39
43
  aztecNodeAdmin!: AztecNodeAdmin;
40
- ctx!: SubsystemsContext;
41
44
 
42
45
  l1Client!: ExtendedViemWalletClient | undefined;
43
46
 
@@ -50,130 +53,141 @@ export class CrossChainMessagingTest {
50
53
  l2Token!: TokenContract;
51
54
  l2Bridge!: TokenBridgeContract;
52
55
 
53
- inbox!: any; // GetContractReturnType<typeof InboxAbi> | undefined;
54
- outbox!: any; // GetContractReturnType<typeof OutboxAbi> | undefined;
56
+ rollup!: RollupContract;
57
+ inbox!: InboxContract;
58
+ outbox!: OutboxContract;
55
59
  cheatCodes!: CheatCodes;
56
60
 
57
- deployL1ContractsValues!: DeployL1ContractsReturnType;
61
+ deployL1ContractsValues!: DeployAztecL1ContractsReturnType;
58
62
 
59
- constructor(testName: string, opts: SetupOptions = {}, deployL1ContractsArgs: Partial<DeployL1ContractsArgs> = {}) {
63
+ constructor(
64
+ testName: string,
65
+ opts: SetupOptions = {},
66
+ deployL1ContractsArgs: Partial<DeployAztecL1ContractsArgs> = {},
67
+ ) {
60
68
  this.logger = createLogger(`e2e:e2e_cross_chain_messaging:${testName}`);
61
- this.snapshotManager = createSnapshotManager(`e2e_cross_chain_messaging/${testName}`, dataPath, opts, {
69
+ this.setupOptions = opts;
70
+ this.deployL1ContractsArgs = {
62
71
  initialValidators: [],
63
72
  ...deployL1ContractsArgs,
64
- });
73
+ };
74
+ this.requireEpochProven = opts.startProverNode ?? false;
65
75
  }
66
76
 
67
- async assumeProven() {
68
- await this.cheatCodes.rollup.markAsProven();
77
+ async setup() {
78
+ this.logger.info('Setting up cross chain messaging test');
79
+ this.context = await setup(0, {
80
+ ...this.setupOptions,
81
+ fundSponsoredFPC: true,
82
+ skipAccountDeployment: true,
83
+ l1ContractsArgs: this.deployL1ContractsArgs,
84
+ });
85
+ await this.applyBaseSetup();
69
86
  }
70
87
 
71
- async setup() {
72
- this.ctx = await this.snapshotManager.setup();
73
- this.aztecNode = this.ctx.aztecNode;
74
- this.wallet = this.ctx.wallet;
75
- this.aztecNodeConfig = this.ctx.aztecNodeConfig;
76
- this.cheatCodes = this.ctx.cheatCodes;
77
- this.deployL1ContractsValues = this.ctx.deployL1ContractsValues;
78
- this.aztecNodeAdmin = this.ctx.aztecNode;
88
+ async advanceToEpochProven(l2TxReceipt: TxReceipt): Promise<EpochNumber> {
89
+ const block = await this.aztecNode.getBlock(l2TxReceipt.blockNumber!);
90
+ const epoch = await this.rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
91
+ // Warp to the next epoch.
92
+ await this.cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
93
+ // Wait for the tx to be proven.
94
+ await waitForProven(this.aztecNode, l2TxReceipt, { provenTimeout: 300 });
95
+ // Return the epoch the tx is in.
96
+ return epoch;
79
97
  }
80
98
 
81
- snapshot = <T>(
82
- name: string,
83
- apply: (context: SubsystemsContext) => Promise<T>,
84
- restore: (snapshotData: T, context: SubsystemsContext) => Promise<void> = () => Promise.resolve(),
85
- ): Promise<void> => this.snapshotManager.snapshot(name, apply, restore);
99
+ async catchUpProvenChain() {
100
+ const bn = await this.aztecNode.getBlockNumber();
101
+ while ((await this.aztecNode.getProvenBlockNumber()) < bn) {
102
+ await sleep(1000);
103
+ }
104
+ }
86
105
 
87
106
  async teardown() {
88
- await this.snapshotManager.teardown();
107
+ await teardown(this.context);
89
108
  }
90
109
 
91
- async applyBaseSnapshots() {
92
- // Note that we are using the same `wallet`, `aztecNodeConfig` and `aztecNode` across all snapshots.
93
- // This is to not have issues with different networks.
94
-
95
- await this.snapshotManager.snapshot(
96
- '3_accounts',
97
- deployAccounts(3, this.logger),
98
- ({ deployedAccounts }, { wallet, aztecNodeConfig, aztecNode }) => {
99
- [this.ownerAddress, this.user1Address, this.user2Address] = deployedAccounts.map(a => a.address);
100
- this.wallet = wallet;
101
- this.aztecNode = aztecNode;
102
- this.aztecNodeConfig = aztecNodeConfig;
103
- return Promise.resolve();
104
- },
110
+ async applyBaseSetup() {
111
+ // Set up base context fields
112
+ this.aztecNode = this.context.aztecNodeService;
113
+ this.wallet = this.context.wallet;
114
+ this.aztecNodeConfig = this.context.config;
115
+ this.cheatCodes = this.context.cheatCodes;
116
+ this.deployL1ContractsValues = this.context.deployL1ContractsValues;
117
+ this.aztecNodeAdmin = this.context.aztecNodeService;
118
+
119
+ if (this.requireEpochProven) {
120
+ // Turn off the watcher to prevent it from keep marking blocks as proven.
121
+ this.context.watcher.setIsMarkingAsProven(false);
122
+ }
123
+
124
+ // Deploy 3 accounts
125
+ this.logger.info('Applying 3_accounts setup');
126
+ const { deployedAccounts } = await deployAccounts(
127
+ 3,
128
+ this.logger,
129
+ )({
130
+ wallet: this.context.wallet,
131
+ initialFundedAccounts: this.context.initialFundedAccounts,
132
+ });
133
+ [this.ownerAddress, this.user1Address, this.user2Address] = deployedAccounts.map(a => a.address);
134
+
135
+ // Set up cross chain messaging
136
+ this.logger.info('Applying e2e_cross_chain_messaging setup');
137
+
138
+ // Create the token contract state.
139
+ this.logger.verbose(`Public deploy accounts...`);
140
+ await publicDeployAccounts(this.wallet, [this.ownerAddress, this.user1Address, this.user2Address]);
141
+
142
+ this.l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
143
+
144
+ const underlyingERC20Address = await deployL1Contract(this.l1Client, TestERC20Abi, TestERC20Bytecode, [
145
+ 'Underlying',
146
+ 'UND',
147
+ this.l1Client.account.address,
148
+ ]).then(({ address }) => address);
149
+
150
+ this.logger.verbose(`Setting up cross chain harness...`);
151
+ this.crossChainTestHarness = await CrossChainTestHarness.new(
152
+ this.aztecNode,
153
+ this.l1Client,
154
+ this.wallet,
155
+ this.ownerAddress,
156
+ this.logger,
157
+ underlyingERC20Address,
105
158
  );
106
159
 
107
- await this.snapshotManager.snapshot(
108
- 'e2e_cross_chain_messaging',
109
- async () => {
110
- // Create the token contract state.
111
- // Move this account thing to addAccounts above?
112
- this.logger.verbose(`Public deploy accounts...`);
113
- await publicDeployAccounts(this.wallet, [this.ownerAddress, this.user1Address, this.user2Address]);
114
-
115
- this.l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
116
-
117
- const underlyingERC20Address = await deployL1Contract(this.l1Client, TestERC20Abi, TestERC20Bytecode, [
118
- 'Underlying',
119
- 'UND',
120
- this.l1Client.account.address,
121
- ]).then(({ address }) => address);
122
-
123
- this.logger.verbose(`Setting up cross chain harness...`);
124
- this.crossChainTestHarness = await CrossChainTestHarness.new(
125
- this.aztecNode,
126
- this.l1Client,
127
- this.wallet,
128
- this.ownerAddress,
129
- this.logger,
130
- underlyingERC20Address,
131
- );
132
-
133
- this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
134
-
135
- return this.crossChainTestHarness.toCrossChainContext();
136
- },
137
- crossChainContext => {
138
- this.l2Token = TokenContract.at(crossChainContext.l2Token, this.wallet);
139
- this.l2Bridge = TokenBridgeContract.at(crossChainContext.l2Bridge, this.wallet);
140
-
141
- // There is an issue with the reviver so we are getting strings sometimes. Working around it here.
142
- this.ethAccount = EthAddress.fromString(crossChainContext.ethAccount.toString());
143
- const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
144
-
145
- const l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
146
-
147
- const inbox = getContract({
148
- address: this.aztecNodeConfig.l1Contracts.inboxAddress.toString(),
149
- abi: InboxAbi,
150
- client: l1Client,
151
- });
152
- const outbox = getContract({
153
- address: this.aztecNodeConfig.l1Contracts.outboxAddress.toString(),
154
- abi: OutboxAbi,
155
- client: l1Client,
156
- });
157
-
158
- this.crossChainTestHarness = new CrossChainTestHarness(
159
- this.aztecNode,
160
- this.logger,
161
- this.l2Token,
162
- this.l2Bridge,
163
- this.ethAccount,
164
- tokenPortalAddress,
165
- crossChainContext.underlying,
166
- l1Client,
167
- this.aztecNodeConfig.l1Contracts,
168
- this.wallet,
169
- this.ownerAddress,
170
- );
171
-
172
- this.l1Client = l1Client;
173
- this.inbox = inbox;
174
- this.outbox = outbox;
175
- return Promise.resolve();
176
- },
160
+ this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
161
+
162
+ const crossChainContext = this.crossChainTestHarness.toCrossChainContext();
163
+
164
+ this.l2Token = TokenContract.at(crossChainContext.l2Token, this.wallet);
165
+ this.l2Bridge = TokenBridgeContract.at(crossChainContext.l2Bridge, this.wallet);
166
+
167
+ // There is an issue with the reviver so we are getting strings sometimes. Working around it here.
168
+ this.ethAccount = EthAddress.fromString(crossChainContext.ethAccount.toString());
169
+ const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
170
+
171
+ const l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
172
+ this.l1Client = l1Client;
173
+
174
+ const l1Contracts = this.aztecNodeConfig.l1Contracts;
175
+ this.rollup = new RollupContract(l1Client, l1Contracts.rollupAddress.toString());
176
+ this.inbox = new InboxContract(l1Client, l1Contracts.inboxAddress.toString());
177
+ this.outbox = new OutboxContract(l1Client, l1Contracts.outboxAddress.toString());
178
+
179
+ this.crossChainTestHarness = new CrossChainTestHarness(
180
+ this.aztecNode,
181
+ this.logger,
182
+ this.l2Token,
183
+ this.l2Bridge,
184
+ this.ethAccount,
185
+ tokenPortalAddress,
186
+ crossChainContext.underlying,
187
+ l1Client,
188
+ this.aztecNodeConfig.l1Contracts,
189
+ this.wallet,
190
+ this.ownerAddress,
177
191
  );
178
192
  }
179
193
  }
@@ -10,12 +10,10 @@ import type { StatefulTestContract } from '@aztec/noir-test-contracts.js/Statefu
10
10
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
11
11
  import type { TestWallet } from '@aztec/test-wallet/server';
12
12
 
13
- import { type ISnapshotManager, createSnapshotManager, deployAccounts } from '../fixtures/snapshot_manager.js';
14
-
15
- const { E2E_DATA_PATH: dataPath } = process.env;
13
+ import { type EndToEndContext, deployAccounts, setup, teardown } from '../fixtures/setup.js';
16
14
 
17
15
  export class DeployTest {
18
- private snapshotManager: ISnapshotManager;
16
+ public context!: EndToEndContext;
19
17
  public logger: Logger;
20
18
  public wallet!: TestWallet;
21
19
  public defaultAccountAddress!: AztecAddress;
@@ -24,26 +22,35 @@ export class DeployTest {
24
22
 
25
23
  constructor(testName: string) {
26
24
  this.logger = createLogger(`e2e:e2e_deploy_contract:${testName}`);
27
- this.snapshotManager = createSnapshotManager(`e2e_deploy_contract/${testName}`, dataPath);
28
25
  }
29
26
 
30
27
  async setup() {
31
- await this.applyInitialAccountSnapshot();
32
- const context = await this.snapshotManager.setup();
33
- ({ aztecNode: this.aztecNode, wallet: this.wallet } = context);
34
- this.aztecNodeAdmin = context.aztecNode;
28
+ this.logger.info('Setting up test environment');
29
+ this.context = await setup(0, {
30
+ fundSponsoredFPC: true,
31
+ skipAccountDeployment: true,
32
+ });
33
+ this.aztecNode = this.context.aztecNodeService;
34
+ this.wallet = this.context.wallet;
35
+ this.aztecNodeAdmin = this.context.aztecNodeService;
36
+ await this.applyInitialAccount();
35
37
  return this;
36
38
  }
37
39
 
38
40
  async teardown() {
39
- await this.snapshotManager.teardown();
41
+ await teardown(this.context);
40
42
  }
41
43
 
42
- private async applyInitialAccountSnapshot() {
43
- await this.snapshotManager.snapshot('initial_account', deployAccounts(1, this.logger), ({ deployedAccounts }) => {
44
- this.defaultAccountAddress = deployedAccounts[0].address;
45
- return Promise.resolve();
44
+ private async applyInitialAccount() {
45
+ this.logger.info('Applying initial account setup');
46
+ const { deployedAccounts } = await deployAccounts(
47
+ 1,
48
+ this.logger,
49
+ )({
50
+ wallet: this.context.wallet,
51
+ initialFundedAccounts: this.context.initialFundedAccounts,
46
52
  });
53
+ this.defaultAccountAddress = deployedAccounts[0].address;
47
54
  }
48
55
 
49
56
  async registerContract<T extends ContractBase>(
@@ -6,19 +6,23 @@ import type { Logger } from '@aztec/aztec.js/log';
6
6
  import { MerkleTreeId } from '@aztec/aztec.js/trees';
7
7
  import type { Wallet } from '@aztec/aztec.js/wallet';
8
8
  import { EpochCache } from '@aztec/epoch-cache';
9
- import { DefaultL1ContractsConfig, type ExtendedViemWalletClient, createExtendedL1Client } from '@aztec/ethereum';
9
+ import { createExtendedL1Client } from '@aztec/ethereum/client';
10
+ import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
10
11
  import { RollupContract } from '@aztec/ethereum/contracts';
11
12
  import { ChainMonitor, DelayedTxUtils, type Delayer, waitUntilL1Timestamp, withDelayer } from '@aztec/ethereum/test';
13
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
12
14
  import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
13
15
  import { SecretValue } from '@aztec/foundation/config';
14
- import { randomBytes } from '@aztec/foundation/crypto';
15
- import { withLogNameSuffix } from '@aztec/foundation/log';
16
+ import { randomBytes } from '@aztec/foundation/crypto/random';
17
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
16
18
  import { retryUntil } from '@aztec/foundation/retry';
17
19
  import { sleep } from '@aztec/foundation/sleep';
18
20
  import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
21
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
19
22
  import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
20
23
  import { ProverNode, type ProverNodeConfig, ProverNodePublisher } from '@aztec/prover-node';
21
24
  import type { TestProverNode } from '@aztec/prover-node/test';
25
+ import type { PXEConfig } from '@aztec/pxe/config';
22
26
  import {
23
27
  type SequencerClient,
24
28
  type SequencerEvents,
@@ -47,7 +51,11 @@ export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
47
51
  export const ARCHIVER_POLL_INTERVAL = 50;
48
52
  export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
49
53
 
50
- export type EpochsTestOpts = Partial<SetupOptions> & { numberOfAccounts?: number };
54
+ export type EpochsTestOpts = Partial<SetupOptions> & {
55
+ numberOfAccounts?: number;
56
+ pxeOpts?: Partial<PXEConfig>;
57
+ aztecSlotDurationInL1Slots?: number;
58
+ };
51
59
 
52
60
  export type TrackedSequencerEvent = {
53
61
  [K in keyof SequencerEvents]: Parameters<SequencerEvents[K]>[0] & {
@@ -92,46 +100,63 @@ export class EpochsTestContext {
92
100
  ? parseInt(process.env.L1_BLOCK_TIME)
93
101
  : DEFAULT_L1_BLOCK_TIME;
94
102
  const ethereumSlotDuration = opts.ethereumSlotDuration ?? envEthereumSlotDuration;
95
- const aztecSlotDuration = opts.aztecSlotDuration ?? ethereumSlotDuration * 2;
103
+ const aztecSlotDuration = opts.aztecSlotDuration ?? (opts.aztecSlotDurationInL1Slots ?? 2) * ethereumSlotDuration;
96
104
  const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
97
105
  const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
98
- return { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs };
106
+ const l1PublishingTime = opts.l1PublishingTime ?? 1;
107
+ return {
108
+ l1PublishingTime,
109
+ ethereumSlotDuration,
110
+ aztecSlotDuration,
111
+ aztecEpochDuration,
112
+ aztecProofSubmissionEpochs,
113
+ };
99
114
  }
100
115
 
101
116
  public async setup(opts: EpochsTestOpts = {}) {
102
- const { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs } =
103
- EpochsTestContext.getSlotDurations(opts);
117
+ const {
118
+ ethereumSlotDuration,
119
+ aztecSlotDuration,
120
+ aztecEpochDuration,
121
+ aztecProofSubmissionEpochs,
122
+ l1PublishingTime,
123
+ } = EpochsTestContext.getSlotDurations(opts);
104
124
 
105
125
  this.L1_BLOCK_TIME_IN_S = ethereumSlotDuration;
106
126
  this.L2_SLOT_DURATION_IN_S = aztecSlotDuration;
107
127
 
108
128
  // Set up system without any account nor protocol contracts
109
129
  // and with faster block times and shorter epochs.
110
- const context = await setup(opts.numberOfAccounts ?? 0, {
111
- automineL1Setup: true,
112
- checkIntervalMs: 50,
113
- archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
114
- worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
115
- skipProtocolContracts: true,
116
- salt: 1,
117
- aztecEpochDuration,
118
- aztecSlotDuration,
119
- ethereumSlotDuration,
120
- aztecProofSubmissionEpochs,
121
- aztecTargetCommitteeSize: opts.initialValidators?.length ?? 0,
122
- minTxsPerBlock: 0,
123
- realProofs: false,
124
- startProverNode: true,
125
- proverTestDelayMs: opts.proverTestDelayMs ?? 0,
126
- // We use numeric incremental prover ids for simplicity, but we can switch to
127
- // using the prover's eth address if the proverId is used for something in the rollup contract
128
- // Use numeric EthAddress for deterministic prover id
129
- proverId: EthAddress.fromNumber(1),
130
- worldStateBlockHistory: WORLD_STATE_BLOCK_HISTORY,
131
- exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
132
- slasherFlavor: 'none',
133
- ...opts,
134
- });
130
+ const context = await setup(
131
+ opts.numberOfAccounts ?? 0,
132
+ {
133
+ automineL1Setup: true,
134
+ checkIntervalMs: 50,
135
+ archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
136
+ worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
137
+ aztecEpochDuration,
138
+ aztecSlotDuration,
139
+ ethereumSlotDuration,
140
+ aztecProofSubmissionEpochs,
141
+ aztecTargetCommitteeSize: opts.initialValidators?.length ?? 0,
142
+ minTxsPerBlock: 0,
143
+ realProofs: false,
144
+ startProverNode: true,
145
+ proverTestDelayMs: opts.proverTestDelayMs ?? 0,
146
+ // We use numeric incremental prover ids for simplicity, but we can switch to
147
+ // using the prover's eth address if the proverId is used for something in the rollup contract
148
+ // Use numeric EthAddress for deterministic prover id
149
+ proverId: EthAddress.fromNumber(1),
150
+ worldStateBlockHistory: WORLD_STATE_BLOCK_HISTORY,
151
+ exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
152
+ slasherFlavor: 'none',
153
+ l1PublishingTime,
154
+ ...opts,
155
+ },
156
+ // Use checkpointed chain tip for PXE by default to avoid issues with blocks being dropped due to pruned anchor blocks.
157
+ // Can be overridden via opts.pxeOpts.
158
+ { syncChainTip: 'checkpointed', ...opts.pxeOpts },
159
+ );
135
160
 
136
161
  this.context = context;
137
162
  this.proverNodes = context.proverNode ? [context.proverNode] : [];
@@ -169,6 +194,7 @@ export class EpochsTestContext {
169
194
  l1GenesisTime: await this.rollup.getL1GenesisTime(),
170
195
  ethereumSlotDuration,
171
196
  proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
197
+ targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
172
198
  };
173
199
 
174
200
  this.logger.info(
@@ -186,20 +212,29 @@ export class EpochsTestContext {
186
212
  public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
187
213
  this.logger.warn('Creating and syncing a simulated prover node...');
188
214
  const proverNodePrivateKey = this.getNextPrivateKey();
189
- const suffix = (this.proverNodes.length + 1).toString();
190
- const proverNode = await withLogNameSuffix(suffix, () =>
215
+ const proverIndex = this.proverNodes.length + 1;
216
+ const { mockGossipSubNetwork } = this.context;
217
+ const proverNode = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
191
218
  createAndSyncProverNode(
192
219
  proverNodePrivateKey,
193
- { ...this.context.config },
220
+ {
221
+ ...this.context.config,
222
+ p2pEnabled: this.context.config.p2pEnabled || mockGossipSubNetwork !== undefined,
223
+ },
194
224
  {
195
225
  dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
196
- proverId: EthAddress.fromNumber(parseInt(suffix, 10)),
226
+ proverId: EthAddress.fromNumber(proverIndex),
197
227
  dontStart: opts.dontStart,
198
228
  ...opts,
199
229
  },
200
230
  this.context.aztecNode,
201
- undefined,
202
- { dateProvider: this.context.dateProvider },
231
+ this.context.prefilledPublicData ?? [],
232
+ {
233
+ dateProvider: this.context.dateProvider,
234
+ p2pClientDeps: mockGossipSubNetwork
235
+ ? { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) }
236
+ : undefined,
237
+ },
203
238
  ),
204
239
  );
205
240
  this.proverNodes.push(proverNode);
@@ -222,12 +257,13 @@ export class EpochsTestContext {
222
257
  private async createNode(
223
258
  opts: Partial<AztecNodeConfig> & { txDelayerMaxInclusionTimeIntoSlot?: number; dontStartSequencer?: boolean } = {},
224
259
  ) {
225
- const suffix = (this.nodes.length + 1).toString();
260
+ const nodeIndex = this.nodes.length + 1;
261
+ const actorPrefix = opts.disableValidator ? 'node' : 'validator';
226
262
  const { mockGossipSubNetwork } = this.context;
227
263
  const resolvedConfig = { ...this.context.config, ...opts };
228
264
  const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
229
265
  const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
230
- const node = await withLogNameSuffix(suffix, () =>
266
+ const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
231
267
  AztecNodeService.createAndSync(
232
268
  {
233
269
  ...resolvedConfig,
@@ -292,7 +328,7 @@ export class EpochsTestContext {
292
328
  }
293
329
 
294
330
  /** Waits until the given checkpoint number is mined. */
295
- public async waitUntilCheckpointNumber(target: CheckpointNumber, timeout = 60) {
331
+ public async waitUntilCheckpointNumber(target: CheckpointNumber, timeout = 120) {
296
332
  await retryUntil(
297
333
  () => Promise.resolve(target <= this.monitor.checkpointNumber),
298
334
  `Wait until checkpoint ${target}`,
@@ -302,7 +338,7 @@ export class EpochsTestContext {
302
338
  }
303
339
 
304
340
  /** Waits until the given checkpoint number is marked as proven. */
305
- public async waitUntilProvenCheckpointNumber(target: CheckpointNumber, timeout = 60) {
341
+ public async waitUntilProvenCheckpointNumber(target: CheckpointNumber, timeout = 120) {
306
342
  await retryUntil(
307
343
  () => Promise.resolve(target <= this.monitor.provenCheckpointNumber),
308
344
  `Wait proven checkpoint ${target}`,
@@ -335,7 +371,7 @@ export class EpochsTestContext {
335
371
  ]);
336
372
  this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
337
373
  if (type === 'proven') {
338
- synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
374
+ synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
339
375
  } else if (type === 'finalized') {
340
376
  synched = syncState.finalizedBlockNumber >= blockNumber;
341
377
  } else {
@@ -357,6 +393,19 @@ export class EpochsTestContext {
357
393
  return SpamContract.at(instance.address, wallet);
358
394
  }
359
395
 
396
+ /** Registers the TestContract on the given wallet. */
397
+ public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
398
+ const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
399
+ constructorArgs: [],
400
+ constructorArtifact: undefined,
401
+ salt,
402
+ publicKeys: undefined,
403
+ deployer: undefined,
404
+ });
405
+ await wallet.registerContract(instance, TestContract.artifact);
406
+ return TestContract.at(instance.address, wallet);
407
+ }
408
+
360
409
  /** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
361
410
  public async createL1Client() {
362
411
  const { client, delayer } = withDelayer(
@@ -365,7 +414,7 @@ export class EpochsTestContext {
365
414
  privateKeyToAccount(this.getNextPrivateKey()),
366
415
  this.l1Client.chain,
367
416
  ),
368
- this.context.dateProvider!,
417
+ this.context.dateProvider,
369
418
  { ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S },
370
419
  );
371
420
  expect(await client.getBalance({ address: client.account.address })).toBeGreaterThan(0n);
@@ -391,11 +440,11 @@ export class EpochsTestContext {
391
440
  const stateChanges: TrackedSequencerEvent[] = [];
392
441
  const failEvents: TrackedSequencerEvent[] = [];
393
442
 
394
- // Note we do not include the 'tx-count-check-failed' event here, since it is fine if we dont build
443
+ // Note we do not include the 'block-tx-count-check-failed' event here, since it is fine if we dont build
395
444
  // due to lack of txs available.
396
445
  const failEventsKeys: (keyof SequencerEvents)[] = [
397
446
  'block-build-failed',
398
- 'block-publish-failed',
447
+ 'checkpoint-publish-failed',
399
448
  'proposer-rollup-check-failed',
400
449
  ];
401
450