@aztec/end-to-end 0.0.1-commit.5daedc8 → 0.0.1-commit.6a729f7

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 (197) 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/data_extractor.js +3 -1
  8. package/dest/bench/utils.d.ts +9 -8
  9. package/dest/bench/utils.d.ts.map +1 -1
  10. package/dest/bench/utils.js +27 -18
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +96 -112
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -13
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +91 -71
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
  18. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  19. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  20. package/dest/e2e_epochs/epochs_test.d.ts +17 -9
  21. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  22. package/dest/e2e_epochs/epochs_test.js +44 -20
  23. package/dest/e2e_fees/bridging_race.notest.js +4 -6
  24. package/dest/e2e_fees/fees_test.d.ts +20 -16
  25. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  26. package/dest/e2e_fees/fees_test.js +126 -141
  27. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  28. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  29. package/dest/e2e_l1_publisher/write_json.js +14 -16
  30. package/dest/e2e_multi_validator/utils.js +1 -1
  31. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  32. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  33. package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
  34. package/dest/e2e_p2p/inactivity_slash_test.d.ts +4 -4
  35. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  36. package/dest/e2e_p2p/inactivity_slash_test.js +6 -9
  37. package/dest/e2e_p2p/p2p_network.d.ts +13 -11
  38. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  39. package/dest/e2e_p2p/p2p_network.js +120 -111
  40. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  41. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  42. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  43. package/dest/e2e_p2p/shared.d.ts +7 -7
  44. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  45. package/dest/e2e_p2p/shared.js +13 -20
  46. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  47. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  48. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  49. package/dest/fixtures/e2e_prover_test.d.ts +10 -18
  50. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  51. package/dest/fixtures/e2e_prover_test.js +91 -103
  52. package/dest/fixtures/fixtures.d.ts +2 -3
  53. package/dest/fixtures/fixtures.d.ts.map +1 -1
  54. package/dest/fixtures/fixtures.js +2 -3
  55. package/dest/fixtures/get_acvm_config.js +1 -1
  56. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  57. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  58. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  59. package/dest/fixtures/setup.d.ts +218 -0
  60. package/dest/fixtures/setup.d.ts.map +1 -0
  61. package/dest/fixtures/setup.js +695 -0
  62. package/dest/fixtures/setup_p2p_test.d.ts +4 -5
  63. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  64. package/dest/fixtures/setup_p2p_test.js +27 -22
  65. package/dest/fixtures/token_utils.d.ts +1 -1
  66. package/dest/fixtures/token_utils.d.ts.map +1 -1
  67. package/dest/fixtures/token_utils.js +7 -4
  68. package/dest/fixtures/utils.d.ts +5 -637
  69. package/dest/fixtures/utils.d.ts.map +1 -1
  70. package/dest/fixtures/utils.js +4 -647
  71. package/dest/fixtures/web3signer.js +1 -1
  72. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  73. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  74. package/dest/fixtures/with_telemetry_utils.js +2 -2
  75. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  76. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  77. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  78. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  79. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  80. package/dest/quality_of_service/prometheus_client.js +67 -0
  81. package/dest/shared/cross_chain_test_harness.d.ts +18 -6
  82. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  83. package/dest/shared/cross_chain_test_harness.js +14 -14
  84. package/dest/shared/gas_portal_test_harness.d.ts +12 -2
  85. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  86. package/dest/shared/gas_portal_test_harness.js +1 -1
  87. package/dest/shared/index.d.ts +2 -2
  88. package/dest/shared/index.d.ts.map +1 -1
  89. package/dest/shared/submit-transactions.d.ts +3 -3
  90. package/dest/shared/submit-transactions.d.ts.map +1 -1
  91. package/dest/shared/submit-transactions.js +9 -11
  92. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  93. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  94. package/dest/shared/uniswap_l1_l2.js +55 -35
  95. package/dest/simulators/lending_simulator.d.ts +6 -2
  96. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  97. package/dest/simulators/lending_simulator.js +2 -2
  98. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  99. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  100. package/dest/spartan/setup_test_wallets.js +63 -35
  101. package/dest/spartan/tx_metrics.d.ts +88 -0
  102. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  103. package/dest/spartan/tx_metrics.js +422 -0
  104. package/dest/spartan/utils/bot.d.ts +27 -0
  105. package/dest/spartan/utils/bot.d.ts.map +1 -0
  106. package/dest/spartan/utils/bot.js +141 -0
  107. package/dest/spartan/utils/chaos.d.ts +79 -0
  108. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  109. package/dest/spartan/utils/chaos.js +142 -0
  110. package/dest/spartan/utils/clients.d.ts +39 -0
  111. package/dest/spartan/utils/clients.d.ts.map +1 -0
  112. package/dest/spartan/utils/clients.js +90 -0
  113. package/dest/spartan/utils/config.d.ts +36 -0
  114. package/dest/spartan/utils/config.d.ts.map +1 -0
  115. package/dest/spartan/utils/config.js +20 -0
  116. package/dest/spartan/utils/health.d.ts +63 -0
  117. package/dest/spartan/utils/health.d.ts.map +1 -0
  118. package/dest/spartan/utils/health.js +202 -0
  119. package/dest/spartan/utils/helm.d.ts +15 -0
  120. package/dest/spartan/utils/helm.d.ts.map +1 -0
  121. package/dest/spartan/utils/helm.js +47 -0
  122. package/dest/spartan/utils/index.d.ts +9 -0
  123. package/dest/spartan/utils/index.d.ts.map +1 -0
  124. package/dest/spartan/utils/index.js +18 -0
  125. package/dest/spartan/utils/k8s.d.ts +126 -0
  126. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  127. package/dest/spartan/utils/k8s.js +375 -0
  128. package/dest/spartan/utils/nodes.d.ts +41 -0
  129. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  130. package/dest/spartan/utils/nodes.js +461 -0
  131. package/dest/spartan/utils/scripts.d.ts +16 -0
  132. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  133. package/dest/spartan/utils/scripts.js +66 -0
  134. package/dest/spartan/utils.d.ts +2 -220
  135. package/dest/spartan/utils.d.ts.map +1 -1
  136. package/dest/spartan/utils.js +1 -782
  137. package/package.json +42 -41
  138. package/src/bench/client_flows/benchmark.ts +24 -2
  139. package/src/bench/client_flows/client_flows_benchmark.ts +145 -208
  140. package/src/bench/client_flows/data_extractor.ts +1 -1
  141. package/src/bench/utils.ts +30 -20
  142. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  143. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -125
  144. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  145. package/src/e2e_epochs/epochs_test.ts +92 -53
  146. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  147. package/src/e2e_fees/fees_test.ts +179 -221
  148. package/src/e2e_l1_publisher/write_json.ts +16 -16
  149. package/src/e2e_multi_validator/utils.ts +1 -1
  150. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  151. package/src/e2e_p2p/inactivity_slash_test.ts +9 -12
  152. package/src/e2e_p2p/p2p_network.ts +180 -183
  153. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  154. package/src/e2e_p2p/shared.ts +31 -28
  155. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  156. package/src/fixtures/e2e_prover_test.ts +104 -141
  157. package/src/fixtures/fixtures.ts +2 -5
  158. package/src/fixtures/get_acvm_config.ts +1 -1
  159. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  160. package/src/fixtures/setup.ts +1017 -0
  161. package/src/fixtures/setup_p2p_test.ts +18 -23
  162. package/src/fixtures/token_utils.ts +6 -5
  163. package/src/fixtures/utils.ts +27 -966
  164. package/src/fixtures/web3signer.ts +1 -1
  165. package/src/fixtures/with_telemetry_utils.ts +2 -2
  166. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  167. package/src/quality_of_service/prometheus_client.ts +113 -0
  168. package/src/shared/cross_chain_test_harness.ts +19 -36
  169. package/src/shared/gas_portal_test_harness.ts +2 -2
  170. package/src/shared/index.ts +1 -1
  171. package/src/shared/submit-transactions.ts +9 -15
  172. package/src/shared/uniswap_l1_l2.ts +65 -86
  173. package/src/simulators/lending_simulator.ts +3 -3
  174. package/src/spartan/DEVELOP.md +7 -0
  175. package/src/spartan/setup_test_wallets.ts +81 -26
  176. package/src/spartan/tx_metrics.ts +376 -0
  177. package/src/spartan/utils/bot.ts +185 -0
  178. package/src/spartan/utils/chaos.ts +253 -0
  179. package/src/spartan/utils/clients.ts +100 -0
  180. package/src/spartan/utils/config.ts +26 -0
  181. package/src/spartan/utils/health.ts +255 -0
  182. package/src/spartan/utils/helm.ts +84 -0
  183. package/src/spartan/utils/index.ts +64 -0
  184. package/src/spartan/utils/k8s.ts +527 -0
  185. package/src/spartan/utils/nodes.ts +538 -0
  186. package/src/spartan/utils/scripts.ts +63 -0
  187. package/src/spartan/utils.ts +1 -982
  188. package/dest/fixtures/setup_l1_contracts.d.ts +0 -477
  189. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  190. package/dest/fixtures/setup_l1_contracts.js +0 -17
  191. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  192. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  193. package/dest/fixtures/snapshot_manager.js +0 -505
  194. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  195. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  196. package/src/fixtures/setup_l1_contracts.ts +0 -26
  197. 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 { CheckpointNumber, 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,142 @@ 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 epoch = await this.rollup.getEpochNumberForCheckpoint(
90
+ CheckpointNumber.fromBlockNumber(l2TxReceipt.blockNumber!),
91
+ );
92
+ // Warp to the next epoch.
93
+ await this.cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
94
+ // Wait for the tx to be proven.
95
+ await waitForProven(this.aztecNode, l2TxReceipt, { provenTimeout: 300 });
96
+ // Return the epoch the tx is in.
97
+ return epoch;
79
98
  }
80
99
 
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);
100
+ async catchUpProvenChain() {
101
+ const bn = await this.aztecNode.getBlockNumber();
102
+ while ((await this.aztecNode.getProvenBlockNumber()) < bn) {
103
+ await sleep(1000);
104
+ }
105
+ }
86
106
 
87
107
  async teardown() {
88
- await this.snapshotManager.teardown();
108
+ await teardown(this.context);
89
109
  }
90
110
 
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
- },
111
+ async applyBaseSetup() {
112
+ // Set up base context fields
113
+ this.aztecNode = this.context.aztecNodeService!;
114
+ this.wallet = this.context.wallet;
115
+ this.aztecNodeConfig = this.context.config;
116
+ this.cheatCodes = this.context.cheatCodes;
117
+ this.deployL1ContractsValues = this.context.deployL1ContractsValues;
118
+ this.aztecNodeAdmin = this.context.aztecNodeService!;
119
+
120
+ if (this.requireEpochProven) {
121
+ // Turn off the watcher to prevent it from keep marking blocks as proven.
122
+ this.context.watcher!.setIsMarkingAsProven(false);
123
+ }
124
+
125
+ // Deploy 3 accounts
126
+ this.logger.info('Applying 3_accounts setup');
127
+ const { deployedAccounts } = await deployAccounts(
128
+ 3,
129
+ this.logger,
130
+ )({
131
+ wallet: this.context.wallet,
132
+ initialFundedAccounts: this.context.initialFundedAccounts,
133
+ });
134
+ [this.ownerAddress, this.user1Address, this.user2Address] = deployedAccounts.map(a => a.address);
135
+
136
+ // Set up cross chain messaging
137
+ this.logger.info('Applying e2e_cross_chain_messaging setup');
138
+
139
+ // Create the token contract state.
140
+ this.logger.verbose(`Public deploy accounts...`);
141
+ await publicDeployAccounts(this.wallet, [this.ownerAddress, this.user1Address, this.user2Address]);
142
+
143
+ this.l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
144
+
145
+ const underlyingERC20Address = await deployL1Contract(this.l1Client, TestERC20Abi, TestERC20Bytecode, [
146
+ 'Underlying',
147
+ 'UND',
148
+ this.l1Client.account.address,
149
+ ]).then(({ address }) => address);
150
+
151
+ this.logger.verbose(`Setting up cross chain harness...`);
152
+ this.crossChainTestHarness = await CrossChainTestHarness.new(
153
+ this.aztecNode,
154
+ this.l1Client,
155
+ this.wallet,
156
+ this.ownerAddress,
157
+ this.logger,
158
+ underlyingERC20Address,
105
159
  );
106
160
 
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
- },
161
+ this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
162
+
163
+ const crossChainContext = this.crossChainTestHarness.toCrossChainContext();
164
+
165
+ this.l2Token = TokenContract.at(crossChainContext.l2Token, this.wallet);
166
+ this.l2Bridge = TokenBridgeContract.at(crossChainContext.l2Bridge, this.wallet);
167
+
168
+ // There is an issue with the reviver so we are getting strings sometimes. Working around it here.
169
+ this.ethAccount = EthAddress.fromString(crossChainContext.ethAccount.toString());
170
+ const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
171
+
172
+ const l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
173
+ this.l1Client = l1Client;
174
+
175
+ const l1Contracts = this.aztecNodeConfig.l1Contracts;
176
+ this.rollup = new RollupContract(l1Client, l1Contracts.rollupAddress.toString());
177
+ this.inbox = new InboxContract(l1Client, l1Contracts.inboxAddress.toString());
178
+ this.outbox = new OutboxContract(l1Client, l1Contracts.outboxAddress.toString());
179
+
180
+ this.crossChainTestHarness = new CrossChainTestHarness(
181
+ this.aztecNode,
182
+ this.logger,
183
+ this.l2Token,
184
+ this.l2Bridge,
185
+ this.ethAccount,
186
+ tokenPortalAddress,
187
+ crossChainContext.underlying,
188
+ l1Client,
189
+ this.aztecNodeConfig.l1Contracts,
190
+ this.wallet,
191
+ this.ownerAddress,
177
192
  );
178
193
  }
179
194
  }
@@ -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';
12
- import { EpochNumber } from '@aztec/foundation/branded-types';
13
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
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,
@@ -26,7 +30,7 @@ import {
26
30
  SequencerState,
27
31
  } from '@aztec/sequencer-client';
28
32
  import type { TestSequencerClient } from '@aztec/sequencer-client/test';
29
- import { EthAddress, type L2BlockNumber } from '@aztec/stdlib/block';
33
+ import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
30
34
  import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
31
35
  import { tryStop } from '@aztec/stdlib/interfaces/server';
32
36
 
@@ -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] : [];
@@ -186,19 +211,19 @@ export class EpochsTestContext {
186
211
  public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
187
212
  this.logger.warn('Creating and syncing a simulated prover node...');
188
213
  const proverNodePrivateKey = this.getNextPrivateKey();
189
- const suffix = (this.proverNodes.length + 1).toString();
190
- const proverNode = await withLogNameSuffix(suffix, () =>
214
+ const proverIndex = this.proverNodes.length + 1;
215
+ const proverNode = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
191
216
  createAndSyncProverNode(
192
217
  proverNodePrivateKey,
193
218
  { ...this.context.config },
194
219
  {
195
220
  dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
196
- proverId: EthAddress.fromNumber(parseInt(suffix, 10)),
221
+ proverId: EthAddress.fromNumber(proverIndex),
197
222
  dontStart: opts.dontStart,
198
223
  ...opts,
199
224
  },
200
225
  this.context.aztecNode,
201
- undefined,
226
+ this.context.prefilledPublicData ?? [],
202
227
  { dateProvider: this.context.dateProvider },
203
228
  ),
204
229
  );
@@ -222,12 +247,13 @@ export class EpochsTestContext {
222
247
  private async createNode(
223
248
  opts: Partial<AztecNodeConfig> & { txDelayerMaxInclusionTimeIntoSlot?: number; dontStartSequencer?: boolean } = {},
224
249
  ) {
225
- const suffix = (this.nodes.length + 1).toString();
250
+ const nodeIndex = this.nodes.length + 1;
251
+ const actorPrefix = opts.disableValidator ? 'node' : 'validator';
226
252
  const { mockGossipSubNetwork } = this.context;
227
253
  const resolvedConfig = { ...this.context.config, ...opts };
228
254
  const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
229
255
  const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
230
- const node = await withLogNameSuffix(suffix, () =>
256
+ const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
231
257
  AztecNodeService.createAndSync(
232
258
  {
233
259
  ...resolvedConfig,
@@ -291,21 +317,21 @@ export class EpochsTestContext {
291
317
  return start;
292
318
  }
293
319
 
294
- /** Waits until the given L2 block number is mined. */
295
- public async waitUntilL2BlockNumber(target: number, timeout = 60) {
320
+ /** Waits until the given checkpoint number is mined. */
321
+ public async waitUntilCheckpointNumber(target: CheckpointNumber, timeout = 120) {
296
322
  await retryUntil(
297
323
  () => Promise.resolve(target <= this.monitor.checkpointNumber),
298
- `Wait until L2 block ${target}`,
324
+ `Wait until checkpoint ${target}`,
299
325
  timeout,
300
326
  0.1,
301
327
  );
302
328
  }
303
329
 
304
- /** Waits until the given L2 block number is marked as proven. */
305
- public async waitUntilProvenL2BlockNumber(t: number, timeout = 60) {
330
+ /** Waits until the given checkpoint number is marked as proven. */
331
+ public async waitUntilProvenCheckpointNumber(target: CheckpointNumber, timeout = 120) {
306
332
  await retryUntil(
307
- () => Promise.resolve(t <= this.monitor.provenCheckpointNumber),
308
- `Wait proven L2 block ${t}`,
333
+ () => Promise.resolve(target <= this.monitor.provenCheckpointNumber),
334
+ `Wait proven checkpoint ${target}`,
309
335
  timeout,
310
336
  0.1,
311
337
  );
@@ -324,7 +350,7 @@ export class EpochsTestContext {
324
350
  }
325
351
 
326
352
  /** Waits for the aztec node to sync to the target block number. */
327
- public async waitForNodeToSync(blockNumber: number, type: 'proven' | 'finalized' | 'historic') {
353
+ public async waitForNodeToSync(blockNumber: BlockNumber, type: 'proven' | 'finalized' | 'historic') {
328
354
  const waitTime = ARCHIVER_POLL_INTERVAL + WORLD_STATE_BLOCK_CHECK_INTERVAL;
329
355
  let synched = false;
330
356
  while (!synched) {
@@ -335,7 +361,7 @@ export class EpochsTestContext {
335
361
  ]);
336
362
  this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
337
363
  if (type === 'proven') {
338
- synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
364
+ synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
339
365
  } else if (type === 'finalized') {
340
366
  synched = syncState.finalizedBlockNumber >= blockNumber;
341
367
  } else {
@@ -357,6 +383,19 @@ export class EpochsTestContext {
357
383
  return SpamContract.at(instance.address, wallet);
358
384
  }
359
385
 
386
+ /** Registers the TestContract on the given wallet. */
387
+ public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
388
+ const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
389
+ constructorArgs: [],
390
+ constructorArtifact: undefined,
391
+ salt,
392
+ publicKeys: undefined,
393
+ deployer: undefined,
394
+ });
395
+ await wallet.registerContract(instance, TestContract.artifact);
396
+ return TestContract.at(instance.address, wallet);
397
+ }
398
+
360
399
  /** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
361
400
  public async createL1Client() {
362
401
  const { client, delayer } = withDelayer(
@@ -373,7 +412,7 @@ export class EpochsTestContext {
373
412
  }
374
413
 
375
414
  /** Verifies whether the given block number is found on the aztec node. */
376
- public async verifyHistoricBlock(blockNumber: L2BlockNumber, expectedSuccess: boolean) {
415
+ public async verifyHistoricBlock(blockNumber: BlockParameter, expectedSuccess: boolean) {
377
416
  // We use `findLeavesIndexes` here, but could use any function that queries the world-state
378
417
  // at a particular block, so we know whether that historic block is available or has been
379
418
  // pruned. Note that `getBlock` would not work here, since it only hits the archiver.
@@ -391,11 +430,11 @@ export class EpochsTestContext {
391
430
  const stateChanges: TrackedSequencerEvent[] = [];
392
431
  const failEvents: TrackedSequencerEvent[] = [];
393
432
 
394
- // Note we do not include the 'tx-count-check-failed' event here, since it is fine if we dont build
433
+ // Note we do not include the 'block-tx-count-check-failed' event here, since it is fine if we dont build
395
434
  // due to lack of txs available.
396
435
  const failEventsKeys: (keyof SequencerEvents)[] = [
397
436
  'block-build-failed',
398
- 'block-publish-failed',
437
+ 'checkpoint-publish-failed',
399
438
  'proposer-rollup-check-failed',
400
439
  ];
401
440