@aztec/end-to-end 0.0.1-commit.24de95ac → 0.0.1-commit.29c6b1a3

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 (209) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +21 -15
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +129 -119
  7. package/dest/bench/client_flows/config.d.ts +1 -1
  8. package/dest/bench/client_flows/data_extractor.d.ts +1 -1
  9. package/dest/bench/client_flows/data_extractor.js +7 -27
  10. package/dest/bench/utils.d.ts +8 -7
  11. package/dest/bench/utils.d.ts.map +1 -1
  12. package/dest/bench/utils.js +27 -18
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +96 -112
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -13
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +91 -70
  19. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  21. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  22. package/dest/e2e_epochs/epochs_test.d.ts +17 -9
  23. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  24. package/dest/e2e_epochs/epochs_test.js +37 -17
  25. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  26. package/dest/e2e_fees/bridging_race.notest.js +5 -7
  27. package/dest/e2e_fees/fees_test.d.ts +20 -16
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +127 -139
  30. package/dest/e2e_l1_publisher/write_json.d.ts +2 -2
  31. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  32. package/dest/e2e_l1_publisher/write_json.js +23 -18
  33. package/dest/e2e_multi_validator/utils.d.ts +1 -1
  34. package/dest/e2e_multi_validator/utils.js +1 -1
  35. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  36. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  37. package/dest/e2e_nested_contract/nested_contract_test.js +31 -38
  38. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  39. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  40. package/dest/e2e_p2p/inactivity_slash_test.js +7 -6
  41. package/dest/e2e_p2p/p2p_network.d.ts +225 -18
  42. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  43. package/dest/e2e_p2p/p2p_network.js +121 -110
  44. package/dest/e2e_p2p/shared.d.ts +11 -11
  45. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  46. package/dest/e2e_p2p/shared.js +13 -19
  47. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  48. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  49. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  50. package/dest/fixtures/e2e_prover_test.d.ts +12 -18
  51. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  52. package/dest/fixtures/e2e_prover_test.js +100 -108
  53. package/dest/fixtures/fixtures.d.ts +2 -3
  54. package/dest/fixtures/fixtures.d.ts.map +1 -1
  55. package/dest/fixtures/fixtures.js +2 -3
  56. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  57. package/dest/fixtures/get_acvm_config.js +1 -1
  58. package/dest/fixtures/get_bb_config.d.ts +1 -1
  59. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  60. package/dest/fixtures/index.d.ts +1 -1
  61. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  62. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  63. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  64. package/dest/fixtures/logging.d.ts +1 -1
  65. package/dest/fixtures/setup.d.ts +218 -0
  66. package/dest/fixtures/setup.d.ts.map +1 -0
  67. package/dest/fixtures/setup.js +690 -0
  68. package/dest/fixtures/setup_p2p_test.d.ts +4 -4
  69. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  70. package/dest/fixtures/setup_p2p_test.js +18 -10
  71. package/dest/fixtures/token_utils.d.ts +5 -2
  72. package/dest/fixtures/token_utils.d.ts.map +1 -1
  73. package/dest/fixtures/token_utils.js +13 -7
  74. package/dest/fixtures/utils.d.ts +5 -192
  75. package/dest/fixtures/utils.d.ts.map +1 -1
  76. package/dest/fixtures/utils.js +4 -648
  77. package/dest/fixtures/web3signer.d.ts +1 -1
  78. package/dest/fixtures/web3signer.js +1 -1
  79. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  80. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  81. package/dest/fixtures/with_telemetry_utils.js +2 -2
  82. package/dest/index.d.ts +1 -1
  83. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  84. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  85. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  86. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  87. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  88. package/dest/quality_of_service/prometheus_client.js +67 -0
  89. package/dest/shared/cross_chain_test_harness.d.ts +7 -6
  90. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  91. package/dest/shared/cross_chain_test_harness.js +14 -14
  92. package/dest/shared/gas_portal_test_harness.d.ts +2 -2
  93. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  94. package/dest/shared/gas_portal_test_harness.js +2 -2
  95. package/dest/shared/index.d.ts +2 -2
  96. package/dest/shared/index.d.ts.map +1 -1
  97. package/dest/shared/jest_setup.d.ts +1 -1
  98. package/dest/shared/submit-transactions.d.ts +3 -3
  99. package/dest/shared/submit-transactions.d.ts.map +1 -1
  100. package/dest/shared/submit-transactions.js +9 -11
  101. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  102. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  103. package/dest/shared/uniswap_l1_l2.js +55 -35
  104. package/dest/simulators/index.d.ts +1 -1
  105. package/dest/simulators/lending_simulator.d.ts +2 -2
  106. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  107. package/dest/simulators/lending_simulator.js +6 -4
  108. package/dest/simulators/token_simulator.d.ts +1 -1
  109. package/dest/simulators/token_simulator.d.ts.map +1 -1
  110. package/dest/spartan/setup_test_wallets.d.ts +8 -5
  111. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  112. package/dest/spartan/setup_test_wallets.js +85 -23
  113. package/dest/spartan/tx_metrics.d.ts +88 -0
  114. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  115. package/dest/spartan/tx_metrics.js +422 -0
  116. package/dest/spartan/utils/bot.d.ts +27 -0
  117. package/dest/spartan/utils/bot.d.ts.map +1 -0
  118. package/dest/spartan/utils/bot.js +141 -0
  119. package/dest/spartan/utils/chaos.d.ts +79 -0
  120. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  121. package/dest/spartan/utils/chaos.js +142 -0
  122. package/dest/spartan/utils/clients.d.ts +39 -0
  123. package/dest/spartan/utils/clients.d.ts.map +1 -0
  124. package/dest/spartan/utils/clients.js +90 -0
  125. package/dest/spartan/utils/config.d.ts +36 -0
  126. package/dest/spartan/utils/config.d.ts.map +1 -0
  127. package/dest/spartan/utils/config.js +20 -0
  128. package/dest/spartan/utils/health.d.ts +63 -0
  129. package/dest/spartan/utils/health.d.ts.map +1 -0
  130. package/dest/spartan/utils/health.js +202 -0
  131. package/dest/spartan/utils/helm.d.ts +15 -0
  132. package/dest/spartan/utils/helm.d.ts.map +1 -0
  133. package/dest/spartan/utils/helm.js +47 -0
  134. package/dest/spartan/utils/index.d.ts +9 -0
  135. package/dest/spartan/utils/index.d.ts.map +1 -0
  136. package/dest/spartan/utils/index.js +18 -0
  137. package/dest/spartan/utils/k8s.d.ts +98 -0
  138. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  139. package/dest/spartan/utils/k8s.js +257 -0
  140. package/dest/spartan/utils/nodes.d.ts +31 -0
  141. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  142. package/dest/spartan/utils/nodes.js +290 -0
  143. package/dest/spartan/utils/scripts.d.ts +16 -0
  144. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  145. package/dest/spartan/utils/scripts.js +66 -0
  146. package/dest/spartan/utils.d.ts +2 -218
  147. package/dest/spartan/utils.d.ts.map +1 -1
  148. package/dest/spartan/utils.js +1 -749
  149. package/package.json +43 -40
  150. package/src/bench/client_flows/benchmark.ts +24 -2
  151. package/src/bench/client_flows/client_flows_benchmark.ts +152 -170
  152. package/src/bench/client_flows/data_extractor.ts +6 -28
  153. package/src/bench/utils.ts +30 -20
  154. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  155. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -124
  156. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  157. package/src/e2e_epochs/epochs_test.ts +89 -50
  158. package/src/e2e_fees/bridging_race.notest.ts +5 -11
  159. package/src/e2e_fees/fees_test.ts +180 -219
  160. package/src/e2e_l1_publisher/write_json.ts +25 -19
  161. package/src/e2e_multi_validator/utils.ts +1 -1
  162. package/src/e2e_nested_contract/nested_contract_test.ts +33 -55
  163. package/src/e2e_p2p/inactivity_slash_test.ts +10 -9
  164. package/src/e2e_p2p/p2p_network.ts +181 -180
  165. package/src/e2e_p2p/shared.ts +25 -27
  166. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  167. package/src/fixtures/e2e_prover_test.ts +111 -149
  168. package/src/fixtures/fixtures.ts +2 -5
  169. package/src/fixtures/get_acvm_config.ts +1 -1
  170. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  171. package/src/fixtures/setup.ts +1017 -0
  172. package/src/fixtures/setup_p2p_test.ts +23 -9
  173. package/src/fixtures/token_utils.ts +8 -7
  174. package/src/fixtures/utils.ts +27 -947
  175. package/src/fixtures/web3signer.ts +1 -1
  176. package/src/fixtures/with_telemetry_utils.ts +2 -2
  177. package/src/guides/up_quick_start.sh +1 -1
  178. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  179. package/src/quality_of_service/prometheus_client.ts +113 -0
  180. package/src/shared/cross_chain_test_harness.ts +19 -36
  181. package/src/shared/gas_portal_test_harness.ts +3 -3
  182. package/src/shared/index.ts +1 -1
  183. package/src/shared/submit-transactions.ts +9 -15
  184. package/src/shared/uniswap_l1_l2.ts +65 -86
  185. package/src/simulators/lending_simulator.ts +7 -5
  186. package/src/spartan/DEVELOP.md +7 -0
  187. package/src/spartan/setup_test_wallets.ts +119 -28
  188. package/src/spartan/tx_metrics.ts +376 -0
  189. package/src/spartan/utils/bot.ts +185 -0
  190. package/src/spartan/utils/chaos.ts +253 -0
  191. package/src/spartan/utils/clients.ts +100 -0
  192. package/src/spartan/utils/config.ts +26 -0
  193. package/src/spartan/utils/health.ts +255 -0
  194. package/src/spartan/utils/helm.ts +84 -0
  195. package/src/spartan/utils/index.ts +62 -0
  196. package/src/spartan/utils/k8s.ts +375 -0
  197. package/src/spartan/utils/nodes.ts +323 -0
  198. package/src/spartan/utils/scripts.ts +63 -0
  199. package/src/spartan/utils.ts +1 -942
  200. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  201. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  202. package/dest/fixtures/setup_l1_contracts.js +0 -17
  203. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  204. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  205. package/dest/fixtures/snapshot_manager.js +0 -505
  206. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  207. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  208. package/src/fixtures/setup_l1_contracts.ts +0 -26
  209. 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,129 +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
- async crossChainContext => {
138
- this.l2Token = await TokenContract.at(crossChainContext.l2Token, this.wallet);
139
- this.l2Bridge = await 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
- },
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,
176
192
  );
177
193
  }
178
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>(
@@ -73,6 +80,6 @@ export class DeployTest {
73
80
  export type StatefulContractCtorArgs = Parameters<StatefulTestContract['methods']['constructor']>;
74
81
 
75
82
  export type ContractArtifactClass<T extends ContractBase> = {
76
- at(address: AztecAddress, wallet: Wallet): Promise<T>;
83
+ at(address: AztecAddress, wallet: Wallet): T;
77
84
  artifact: ContractArtifact;
78
85
  };
@@ -6,18 +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';
14
+ import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
12
15
  import { SecretValue } from '@aztec/foundation/config';
13
- import { randomBytes } from '@aztec/foundation/crypto';
16
+ import { randomBytes } from '@aztec/foundation/crypto/random';
14
17
  import { withLogNameSuffix } from '@aztec/foundation/log';
15
18
  import { retryUntil } from '@aztec/foundation/retry';
16
19
  import { sleep } from '@aztec/foundation/sleep';
17
20
  import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
21
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
18
22
  import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
19
23
  import { ProverNode, type ProverNodeConfig, ProverNodePublisher } from '@aztec/prover-node';
20
24
  import type { TestProverNode } from '@aztec/prover-node/test';
25
+ import type { PXEConfig } from '@aztec/pxe/config';
21
26
  import {
22
27
  type SequencerClient,
23
28
  type SequencerEvents,
@@ -25,7 +30,7 @@ import {
25
30
  SequencerState,
26
31
  } from '@aztec/sequencer-client';
27
32
  import type { TestSequencerClient } from '@aztec/sequencer-client/test';
28
- import { EthAddress, type L2BlockNumber } from '@aztec/stdlib/block';
33
+ import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
29
34
  import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
30
35
  import { tryStop } from '@aztec/stdlib/interfaces/server';
31
36
 
@@ -46,7 +51,11 @@ export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
46
51
  export const ARCHIVER_POLL_INTERVAL = 50;
47
52
  export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
48
53
 
49
- export type EpochsTestOpts = Partial<SetupOptions> & { numberOfAccounts?: number };
54
+ export type EpochsTestOpts = Partial<SetupOptions> & {
55
+ numberOfAccounts?: number;
56
+ pxeOpts?: Partial<PXEConfig>;
57
+ aztecSlotDurationInL1Slots?: number;
58
+ };
50
59
 
51
60
  export type TrackedSequencerEvent = {
52
61
  [K in keyof SequencerEvents]: Parameters<SequencerEvents[K]>[0] & {
@@ -91,46 +100,63 @@ export class EpochsTestContext {
91
100
  ? parseInt(process.env.L1_BLOCK_TIME)
92
101
  : DEFAULT_L1_BLOCK_TIME;
93
102
  const ethereumSlotDuration = opts.ethereumSlotDuration ?? envEthereumSlotDuration;
94
- const aztecSlotDuration = opts.aztecSlotDuration ?? ethereumSlotDuration * 2;
103
+ const aztecSlotDuration = opts.aztecSlotDuration ?? (opts.aztecSlotDurationInL1Slots ?? 2) * ethereumSlotDuration;
95
104
  const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
96
105
  const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
97
- return { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs };
106
+ const l1PublishingTime = opts.l1PublishingTime ?? 1;
107
+ return {
108
+ l1PublishingTime,
109
+ ethereumSlotDuration,
110
+ aztecSlotDuration,
111
+ aztecEpochDuration,
112
+ aztecProofSubmissionEpochs,
113
+ };
98
114
  }
99
115
 
100
116
  public async setup(opts: EpochsTestOpts = {}) {
101
- const { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs } =
102
- EpochsTestContext.getSlotDurations(opts);
117
+ const {
118
+ ethereumSlotDuration,
119
+ aztecSlotDuration,
120
+ aztecEpochDuration,
121
+ aztecProofSubmissionEpochs,
122
+ l1PublishingTime,
123
+ } = EpochsTestContext.getSlotDurations(opts);
103
124
 
104
125
  this.L1_BLOCK_TIME_IN_S = ethereumSlotDuration;
105
126
  this.L2_SLOT_DURATION_IN_S = aztecSlotDuration;
106
127
 
107
128
  // Set up system without any account nor protocol contracts
108
129
  // and with faster block times and shorter epochs.
109
- const context = await setup(opts.numberOfAccounts ?? 0, {
110
- automineL1Setup: true,
111
- checkIntervalMs: 50,
112
- archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
113
- worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
114
- skipProtocolContracts: true,
115
- salt: 1,
116
- aztecEpochDuration,
117
- aztecSlotDuration,
118
- ethereumSlotDuration,
119
- aztecProofSubmissionEpochs,
120
- aztecTargetCommitteeSize: opts.initialValidators?.length ?? 0,
121
- minTxsPerBlock: 0,
122
- realProofs: false,
123
- startProverNode: true,
124
- proverTestDelayMs: opts.proverTestDelayMs ?? 0,
125
- // We use numeric incremental prover ids for simplicity, but we can switch to
126
- // using the prover's eth address if the proverId is used for something in the rollup contract
127
- // Use numeric EthAddress for deterministic prover id
128
- proverId: EthAddress.fromNumber(1),
129
- worldStateBlockHistory: WORLD_STATE_BLOCK_HISTORY,
130
- exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
131
- slasherFlavor: 'none',
132
- ...opts,
133
- });
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
+ );
134
160
 
135
161
  this.context = context;
136
162
  this.proverNodes = context.proverNode ? [context.proverNode] : [];
@@ -197,7 +223,7 @@ export class EpochsTestContext {
197
223
  ...opts,
198
224
  },
199
225
  this.context.aztecNode,
200
- undefined,
226
+ this.context.prefilledPublicData ?? [],
201
227
  { dateProvider: this.context.dateProvider },
202
228
  ),
203
229
  );
@@ -279,7 +305,7 @@ export class EpochsTestContext {
279
305
 
280
306
  /** Waits until the epoch begins (ie until the immediately previous L1 block is mined). */
281
307
  public async waitUntilEpochStarts(epoch: number) {
282
- const [start] = getTimestampRangeForEpoch(BigInt(epoch), this.constants);
308
+ const [start] = getTimestampRangeForEpoch(EpochNumber(epoch), this.constants);
283
309
  this.logger.info(`Waiting until L1 timestamp ${start} is reached as the start of epoch ${epoch}`);
284
310
  await waitUntilL1Timestamp(
285
311
  this.l1Client,
@@ -290,30 +316,30 @@ export class EpochsTestContext {
290
316
  return start;
291
317
  }
292
318
 
293
- /** Waits until the given L2 block number is mined. */
294
- public async waitUntilL2BlockNumber(target: number, timeout = 60) {
319
+ /** Waits until the given checkpoint number is mined. */
320
+ public async waitUntilCheckpointNumber(target: CheckpointNumber, timeout = 120) {
295
321
  await retryUntil(
296
- () => Promise.resolve(target <= this.monitor.l2BlockNumber),
297
- `Wait until L2 block ${target}`,
322
+ () => Promise.resolve(target <= this.monitor.checkpointNumber),
323
+ `Wait until checkpoint ${target}`,
298
324
  timeout,
299
325
  0.1,
300
326
  );
301
327
  }
302
328
 
303
- /** Waits until the given L2 block number is marked as proven. */
304
- public async waitUntilProvenL2BlockNumber(t: number, timeout = 60) {
329
+ /** Waits until the given checkpoint number is marked as proven. */
330
+ public async waitUntilProvenCheckpointNumber(target: CheckpointNumber, timeout = 120) {
305
331
  await retryUntil(
306
- () => Promise.resolve(t <= this.monitor.l2ProvenBlockNumber),
307
- `Wait proven L2 block ${t}`,
332
+ () => Promise.resolve(target <= this.monitor.provenCheckpointNumber),
333
+ `Wait proven checkpoint ${target}`,
308
334
  timeout,
309
335
  0.1,
310
336
  );
311
- return this.monitor.l2ProvenBlockNumber;
337
+ return this.monitor.provenCheckpointNumber;
312
338
  }
313
339
 
314
340
  /** Waits until the last slot of the proof submission window for a given epoch. */
315
341
  public async waitUntilLastSlotOfProofSubmissionWindow(epochNumber: number | bigint) {
316
- const deadline = getProofSubmissionDeadlineTimestamp(BigInt(epochNumber), this.constants);
342
+ const deadline = getProofSubmissionDeadlineTimestamp(EpochNumber.fromBigInt(BigInt(epochNumber)), this.constants);
317
343
  const oneSlotBefore = deadline - BigInt(this.constants.slotDuration);
318
344
  const date = new Date(Number(oneSlotBefore) * 1000);
319
345
  this.logger.info(`Waiting until last slot of submission window for epoch ${epochNumber} at ${date}`, {
@@ -323,7 +349,7 @@ export class EpochsTestContext {
323
349
  }
324
350
 
325
351
  /** Waits for the aztec node to sync to the target block number. */
326
- public async waitForNodeToSync(blockNumber: number, type: 'proven' | 'finalized' | 'historic') {
352
+ public async waitForNodeToSync(blockNumber: BlockNumber, type: 'proven' | 'finalized' | 'historic') {
327
353
  const waitTime = ARCHIVER_POLL_INTERVAL + WORLD_STATE_BLOCK_CHECK_INTERVAL;
328
354
  let synched = false;
329
355
  while (!synched) {
@@ -334,7 +360,7 @@ export class EpochsTestContext {
334
360
  ]);
335
361
  this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
336
362
  if (type === 'proven') {
337
- synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
363
+ synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
338
364
  } else if (type === 'finalized') {
339
365
  synched = syncState.finalizedBlockNumber >= blockNumber;
340
366
  } else {
@@ -356,6 +382,19 @@ export class EpochsTestContext {
356
382
  return SpamContract.at(instance.address, wallet);
357
383
  }
358
384
 
385
+ /** Registers the TestContract on the given wallet. */
386
+ public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
387
+ const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
388
+ constructorArgs: [],
389
+ constructorArtifact: undefined,
390
+ salt,
391
+ publicKeys: undefined,
392
+ deployer: undefined,
393
+ });
394
+ await wallet.registerContract(instance, TestContract.artifact);
395
+ return TestContract.at(instance.address, wallet);
396
+ }
397
+
359
398
  /** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
360
399
  public async createL1Client() {
361
400
  const { client, delayer } = withDelayer(
@@ -372,7 +411,7 @@ export class EpochsTestContext {
372
411
  }
373
412
 
374
413
  /** Verifies whether the given block number is found on the aztec node. */
375
- public async verifyHistoricBlock(blockNumber: L2BlockNumber, expectedSuccess: boolean) {
414
+ public async verifyHistoricBlock(blockNumber: BlockParameter, expectedSuccess: boolean) {
376
415
  // We use `findLeavesIndexes` here, but could use any function that queries the world-state
377
416
  // at a particular block, so we know whether that historic block is available or has been
378
417
  // pruned. Note that `getBlock` would not work here, since it only hits the archiver.
@@ -390,11 +429,11 @@ export class EpochsTestContext {
390
429
  const stateChanges: TrackedSequencerEvent[] = [];
391
430
  const failEvents: TrackedSequencerEvent[] = [];
392
431
 
393
- // Note we do not include the 'tx-count-check-failed' event here, since it is fine if we dont build
432
+ // Note we do not include the 'block-tx-count-check-failed' event here, since it is fine if we dont build
394
433
  // due to lack of txs available.
395
434
  const failEventsKeys: (keyof SequencerEvents)[] = [
396
435
  'block-build-failed',
397
- 'block-publish-failed',
436
+ 'checkpoint-publish-failed',
398
437
  'proposer-rollup-check-failed',
399
438
  ];
400
439