@aztec/end-to-end 0.0.1-commit.6230efd → 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 (174) 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 +12 -13
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +118 -133
  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 +17 -12
  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 +15 -10
  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 +89 -70
  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 +7 -1
  21. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  22. package/dest/e2e_epochs/epochs_test.js +31 -9
  23. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  24. package/dest/e2e_fees/fees_test.d.ts +13 -13
  25. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  26. package/dest/e2e_fees/fees_test.js +123 -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_nested_contract/nested_contract_test.d.ts +6 -9
  31. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  32. package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
  33. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  34. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  35. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  36. package/dest/e2e_p2p/p2p_network.d.ts +7 -6
  37. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  38. package/dest/e2e_p2p/p2p_network.js +111 -104
  39. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  40. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  41. package/dest/e2e_p2p/reqresp/utils.js +153 -0
  42. package/dest/e2e_p2p/shared.d.ts +6 -6
  43. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  44. package/dest/e2e_p2p/shared.js +13 -20
  45. package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
  46. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  47. package/dest/e2e_token_contract/token_contract_test.js +89 -91
  48. package/dest/fixtures/e2e_prover_test.d.ts +8 -14
  49. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  50. package/dest/fixtures/e2e_prover_test.js +86 -95
  51. package/dest/fixtures/setup.d.ts +218 -0
  52. package/dest/fixtures/setup.d.ts.map +1 -0
  53. package/dest/fixtures/setup.js +695 -0
  54. package/dest/fixtures/setup_p2p_test.d.ts +4 -5
  55. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  56. package/dest/fixtures/setup_p2p_test.js +24 -19
  57. package/dest/fixtures/token_utils.d.ts +1 -1
  58. package/dest/fixtures/token_utils.d.ts.map +1 -1
  59. package/dest/fixtures/token_utils.js +7 -4
  60. package/dest/fixtures/utils.d.ts +5 -194
  61. package/dest/fixtures/utils.d.ts.map +1 -1
  62. package/dest/fixtures/utils.js +4 -619
  63. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  64. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  65. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  66. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  67. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  68. package/dest/quality_of_service/prometheus_client.js +67 -0
  69. package/dest/shared/cross_chain_test_harness.d.ts +16 -6
  70. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  71. package/dest/shared/cross_chain_test_harness.js +13 -13
  72. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  73. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  74. package/dest/shared/gas_portal_test_harness.js +1 -1
  75. package/dest/shared/index.d.ts +2 -2
  76. package/dest/shared/index.d.ts.map +1 -1
  77. package/dest/shared/submit-transactions.d.ts +3 -3
  78. package/dest/shared/submit-transactions.d.ts.map +1 -1
  79. package/dest/shared/submit-transactions.js +9 -11
  80. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  81. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  82. package/dest/shared/uniswap_l1_l2.js +51 -33
  83. package/dest/simulators/lending_simulator.d.ts +5 -1
  84. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  85. package/dest/simulators/lending_simulator.js +2 -2
  86. package/dest/spartan/setup_test_wallets.d.ts +4 -3
  87. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  88. package/dest/spartan/setup_test_wallets.js +61 -34
  89. package/dest/spartan/tx_metrics.d.ts +51 -2
  90. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  91. package/dest/spartan/tx_metrics.js +333 -6
  92. package/dest/spartan/utils/bot.d.ts +27 -0
  93. package/dest/spartan/utils/bot.d.ts.map +1 -0
  94. package/dest/spartan/utils/bot.js +141 -0
  95. package/dest/spartan/utils/chaos.d.ts +79 -0
  96. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  97. package/dest/spartan/utils/chaos.js +142 -0
  98. package/dest/spartan/utils/clients.d.ts +39 -0
  99. package/dest/spartan/utils/clients.d.ts.map +1 -0
  100. package/dest/spartan/utils/clients.js +90 -0
  101. package/dest/spartan/utils/config.d.ts +36 -0
  102. package/dest/spartan/utils/config.d.ts.map +1 -0
  103. package/dest/spartan/utils/config.js +20 -0
  104. package/dest/spartan/utils/health.d.ts +63 -0
  105. package/dest/spartan/utils/health.d.ts.map +1 -0
  106. package/dest/spartan/utils/health.js +202 -0
  107. package/dest/spartan/utils/helm.d.ts +15 -0
  108. package/dest/spartan/utils/helm.d.ts.map +1 -0
  109. package/dest/spartan/utils/helm.js +47 -0
  110. package/dest/spartan/utils/index.d.ts +9 -0
  111. package/dest/spartan/utils/index.d.ts.map +1 -0
  112. package/dest/spartan/utils/index.js +18 -0
  113. package/dest/spartan/utils/k8s.d.ts +126 -0
  114. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  115. package/dest/spartan/utils/k8s.js +375 -0
  116. package/dest/spartan/utils/nodes.d.ts +41 -0
  117. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  118. package/dest/spartan/utils/nodes.js +461 -0
  119. package/dest/spartan/utils/scripts.d.ts +16 -0
  120. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  121. package/dest/spartan/utils/scripts.js +66 -0
  122. package/dest/spartan/utils.d.ts +2 -253
  123. package/dest/spartan/utils.d.ts.map +1 -1
  124. package/dest/spartan/utils.js +1 -892
  125. package/package.json +40 -39
  126. package/src/bench/client_flows/benchmark.ts +24 -2
  127. package/src/bench/client_flows/client_flows_benchmark.ts +138 -204
  128. package/src/bench/client_flows/data_extractor.ts +1 -1
  129. package/src/bench/utils.ts +20 -14
  130. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
  131. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -116
  132. package/src/e2e_deploy_contract/deploy_test.ts +21 -14
  133. package/src/e2e_epochs/epochs_test.ts +60 -34
  134. package/src/e2e_fees/bridging_race.notest.ts +3 -9
  135. package/src/e2e_fees/fees_test.ts +172 -220
  136. package/src/e2e_l1_publisher/write_json.ts +16 -16
  137. package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
  138. package/src/e2e_p2p/inactivity_slash_test.ts +5 -5
  139. package/src/e2e_p2p/p2p_network.ts +172 -168
  140. package/src/e2e_p2p/reqresp/utils.ts +207 -0
  141. package/src/e2e_p2p/shared.ts +26 -27
  142. package/src/e2e_token_contract/token_contract_test.ts +103 -118
  143. package/src/fixtures/e2e_prover_test.ts +99 -134
  144. package/src/fixtures/setup.ts +1017 -0
  145. package/src/fixtures/setup_p2p_test.ts +15 -20
  146. package/src/fixtures/token_utils.ts +6 -5
  147. package/src/fixtures/utils.ts +27 -907
  148. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  149. package/src/quality_of_service/prometheus_client.ts +113 -0
  150. package/src/shared/cross_chain_test_harness.ts +16 -36
  151. package/src/shared/gas_portal_test_harness.ts +1 -1
  152. package/src/shared/index.ts +1 -1
  153. package/src/shared/submit-transactions.ts +9 -15
  154. package/src/shared/uniswap_l1_l2.ts +58 -77
  155. package/src/simulators/lending_simulator.ts +2 -2
  156. package/src/spartan/setup_test_wallets.ts +79 -25
  157. package/src/spartan/tx_metrics.ts +255 -9
  158. package/src/spartan/utils/bot.ts +185 -0
  159. package/src/spartan/utils/chaos.ts +253 -0
  160. package/src/spartan/utils/clients.ts +100 -0
  161. package/src/spartan/utils/config.ts +26 -0
  162. package/src/spartan/utils/health.ts +255 -0
  163. package/src/spartan/utils/helm.ts +84 -0
  164. package/src/spartan/utils/index.ts +64 -0
  165. package/src/spartan/utils/k8s.ts +527 -0
  166. package/src/spartan/utils/nodes.ts +538 -0
  167. package/src/spartan/utils/scripts.ts +63 -0
  168. package/src/spartan/utils.ts +1 -1158
  169. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  170. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  171. package/dest/fixtures/snapshot_manager.js +0 -493
  172. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  173. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  174. package/src/fixtures/snapshot_manager.ts +0 -651
@@ -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
8
  import { createExtendedL1Client } from '@aztec/ethereum/client';
9
+ import { InboxContract, OutboxContract, RollupContract } from '@aztec/ethereum/contracts';
7
10
  import type {
8
11
  DeployAztecL1ContractsArgs,
9
12
  DeployAztecL1ContractsReturnType,
10
13
  } from '@aztec/ethereum/deploy-aztec-l1-contracts';
11
14
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
12
15
  import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
13
- import { InboxAbi, OutboxAbi, TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
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,8 +53,9 @@ 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
61
  deployL1ContractsValues!: DeployAztecL1ContractsReturnType;
@@ -62,122 +66,129 @@ export class CrossChainMessagingTest {
62
66
  deployL1ContractsArgs: Partial<DeployAztecL1ContractsArgs> = {},
63
67
  ) {
64
68
  this.logger = createLogger(`e2e:e2e_cross_chain_messaging:${testName}`);
65
- this.snapshotManager = createSnapshotManager(`e2e_cross_chain_messaging/${testName}`, dataPath, opts, {
69
+ this.setupOptions = opts;
70
+ this.deployL1ContractsArgs = {
66
71
  initialValidators: [],
67
72
  ...deployL1ContractsArgs,
68
- });
73
+ };
74
+ this.requireEpochProven = opts.startProverNode ?? false;
69
75
  }
70
76
 
71
- async assumeProven() {
72
- 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();
73
86
  }
74
87
 
75
- async setup() {
76
- this.ctx = await this.snapshotManager.setup();
77
- this.aztecNode = this.ctx.aztecNode;
78
- this.wallet = this.ctx.wallet;
79
- this.aztecNodeConfig = this.ctx.aztecNodeConfig;
80
- this.cheatCodes = this.ctx.cheatCodes;
81
- this.deployL1ContractsValues = this.ctx.deployL1ContractsValues;
82
- 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;
83
98
  }
84
99
 
85
- snapshot = <T>(
86
- name: string,
87
- apply: (context: SubsystemsContext) => Promise<T>,
88
- restore: (snapshotData: T, context: SubsystemsContext) => Promise<void> = () => Promise.resolve(),
89
- ): 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
+ }
90
106
 
91
107
  async teardown() {
92
- await this.snapshotManager.teardown();
108
+ await teardown(this.context);
93
109
  }
94
110
 
95
- async applyBaseSnapshots() {
96
- // Note that we are using the same `wallet`, `aztecNodeConfig` and `aztecNode` across all snapshots.
97
- // This is to not have issues with different networks.
98
-
99
- await this.snapshotManager.snapshot(
100
- '3_accounts',
101
- deployAccounts(3, this.logger),
102
- ({ deployedAccounts }, { wallet, aztecNodeConfig, aztecNode }) => {
103
- [this.ownerAddress, this.user1Address, this.user2Address] = deployedAccounts.map(a => a.address);
104
- this.wallet = wallet;
105
- this.aztecNode = aztecNode;
106
- this.aztecNodeConfig = aztecNodeConfig;
107
- return Promise.resolve();
108
- },
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,
109
159
  );
110
160
 
111
- await this.snapshotManager.snapshot(
112
- 'e2e_cross_chain_messaging',
113
- async () => {
114
- // Create the token contract state.
115
- // Move this account thing to addAccounts above?
116
- this.logger.verbose(`Public deploy accounts...`);
117
- await publicDeployAccounts(this.wallet, [this.ownerAddress, this.user1Address, this.user2Address]);
118
-
119
- this.l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
120
-
121
- const underlyingERC20Address = await deployL1Contract(this.l1Client, TestERC20Abi, TestERC20Bytecode, [
122
- 'Underlying',
123
- 'UND',
124
- this.l1Client.account.address,
125
- ]).then(({ address }) => address);
126
-
127
- this.logger.verbose(`Setting up cross chain harness...`);
128
- this.crossChainTestHarness = await CrossChainTestHarness.new(
129
- this.aztecNode,
130
- this.l1Client,
131
- this.wallet,
132
- this.ownerAddress,
133
- this.logger,
134
- underlyingERC20Address,
135
- );
136
-
137
- this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
138
-
139
- return this.crossChainTestHarness.toCrossChainContext();
140
- },
141
- crossChainContext => {
142
- this.l2Token = TokenContract.at(crossChainContext.l2Token, this.wallet);
143
- this.l2Bridge = TokenBridgeContract.at(crossChainContext.l2Bridge, this.wallet);
144
-
145
- // There is an issue with the reviver so we are getting strings sometimes. Working around it here.
146
- this.ethAccount = EthAddress.fromString(crossChainContext.ethAccount.toString());
147
- const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
148
-
149
- const l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
150
-
151
- const inbox = getContract({
152
- address: this.aztecNodeConfig.l1Contracts.inboxAddress.toString(),
153
- abi: InboxAbi,
154
- client: l1Client,
155
- });
156
- const outbox = getContract({
157
- address: this.aztecNodeConfig.l1Contracts.outboxAddress.toString(),
158
- abi: OutboxAbi,
159
- client: l1Client,
160
- });
161
-
162
- this.crossChainTestHarness = new CrossChainTestHarness(
163
- this.aztecNode,
164
- this.logger,
165
- this.l2Token,
166
- this.l2Bridge,
167
- this.ethAccount,
168
- tokenPortalAddress,
169
- crossChainContext.underlying,
170
- l1Client,
171
- this.aztecNodeConfig.l1Contracts,
172
- this.wallet,
173
- this.ownerAddress,
174
- );
175
-
176
- this.l1Client = l1Client;
177
- this.inbox = inbox;
178
- this.outbox = outbox;
179
- return Promise.resolve();
180
- },
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,
181
192
  );
182
193
  }
183
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>(
@@ -14,13 +14,15 @@ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
14
14
  import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
15
15
  import { SecretValue } from '@aztec/foundation/config';
16
16
  import { randomBytes } from '@aztec/foundation/crypto/random';
17
- import { withLogNameSuffix } from '@aztec/foundation/log';
17
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
18
18
  import { retryUntil } from '@aztec/foundation/retry';
19
19
  import { sleep } from '@aztec/foundation/sleep';
20
20
  import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
21
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
21
22
  import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
22
23
  import { ProverNode, type ProverNodeConfig, ProverNodePublisher } from '@aztec/prover-node';
23
24
  import type { TestProverNode } from '@aztec/prover-node/test';
25
+ import type { PXEConfig } from '@aztec/pxe/config';
24
26
  import {
25
27
  type SequencerClient,
26
28
  type SequencerEvents,
@@ -49,7 +51,11 @@ export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
49
51
  export const ARCHIVER_POLL_INTERVAL = 50;
50
52
  export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
51
53
 
52
- export type EpochsTestOpts = Partial<SetupOptions> & { numberOfAccounts?: number };
54
+ export type EpochsTestOpts = Partial<SetupOptions> & {
55
+ numberOfAccounts?: number;
56
+ pxeOpts?: Partial<PXEConfig>;
57
+ aztecSlotDurationInL1Slots?: number;
58
+ };
53
59
 
54
60
  export type TrackedSequencerEvent = {
55
61
  [K in keyof SequencerEvents]: Parameters<SequencerEvents[K]>[0] & {
@@ -94,7 +100,7 @@ export class EpochsTestContext {
94
100
  ? parseInt(process.env.L1_BLOCK_TIME)
95
101
  : DEFAULT_L1_BLOCK_TIME;
96
102
  const ethereumSlotDuration = opts.ethereumSlotDuration ?? envEthereumSlotDuration;
97
- const aztecSlotDuration = opts.aztecSlotDuration ?? ethereumSlotDuration * 2;
103
+ const aztecSlotDuration = opts.aztecSlotDuration ?? (opts.aztecSlotDurationInL1Slots ?? 2) * ethereumSlotDuration;
98
104
  const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
99
105
  const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
100
106
  const l1PublishingTime = opts.l1PublishingTime ?? 1;
@@ -121,30 +127,36 @@ export class EpochsTestContext {
121
127
 
122
128
  // Set up system without any account nor protocol contracts
123
129
  // and with faster block times and shorter epochs.
124
- const context = await setup(opts.numberOfAccounts ?? 0, {
125
- automineL1Setup: true,
126
- checkIntervalMs: 50,
127
- archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
128
- worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
129
- aztecEpochDuration,
130
- aztecSlotDuration,
131
- ethereumSlotDuration,
132
- aztecProofSubmissionEpochs,
133
- aztecTargetCommitteeSize: opts.initialValidators?.length ?? 0,
134
- minTxsPerBlock: 0,
135
- realProofs: false,
136
- startProverNode: true,
137
- proverTestDelayMs: opts.proverTestDelayMs ?? 0,
138
- // We use numeric incremental prover ids for simplicity, but we can switch to
139
- // using the prover's eth address if the proverId is used for something in the rollup contract
140
- // Use numeric EthAddress for deterministic prover id
141
- proverId: EthAddress.fromNumber(1),
142
- worldStateBlockHistory: WORLD_STATE_BLOCK_HISTORY,
143
- exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
144
- slasherFlavor: 'none',
145
- l1PublishingTime,
146
- ...opts,
147
- });
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
+ );
148
160
 
149
161
  this.context = context;
150
162
  this.proverNodes = context.proverNode ? [context.proverNode] : [];
@@ -199,19 +211,19 @@ export class EpochsTestContext {
199
211
  public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
200
212
  this.logger.warn('Creating and syncing a simulated prover node...');
201
213
  const proverNodePrivateKey = this.getNextPrivateKey();
202
- const suffix = (this.proverNodes.length + 1).toString();
203
- const proverNode = await withLogNameSuffix(suffix, () =>
214
+ const proverIndex = this.proverNodes.length + 1;
215
+ const proverNode = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
204
216
  createAndSyncProverNode(
205
217
  proverNodePrivateKey,
206
218
  { ...this.context.config },
207
219
  {
208
220
  dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
209
- proverId: EthAddress.fromNumber(parseInt(suffix, 10)),
221
+ proverId: EthAddress.fromNumber(proverIndex),
210
222
  dontStart: opts.dontStart,
211
223
  ...opts,
212
224
  },
213
225
  this.context.aztecNode,
214
- undefined,
226
+ this.context.prefilledPublicData ?? [],
215
227
  { dateProvider: this.context.dateProvider },
216
228
  ),
217
229
  );
@@ -235,12 +247,13 @@ export class EpochsTestContext {
235
247
  private async createNode(
236
248
  opts: Partial<AztecNodeConfig> & { txDelayerMaxInclusionTimeIntoSlot?: number; dontStartSequencer?: boolean } = {},
237
249
  ) {
238
- const suffix = (this.nodes.length + 1).toString();
250
+ const nodeIndex = this.nodes.length + 1;
251
+ const actorPrefix = opts.disableValidator ? 'node' : 'validator';
239
252
  const { mockGossipSubNetwork } = this.context;
240
253
  const resolvedConfig = { ...this.context.config, ...opts };
241
254
  const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
242
255
  const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
243
- const node = await withLogNameSuffix(suffix, () =>
256
+ const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
244
257
  AztecNodeService.createAndSync(
245
258
  {
246
259
  ...resolvedConfig,
@@ -348,7 +361,7 @@ export class EpochsTestContext {
348
361
  ]);
349
362
  this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
350
363
  if (type === 'proven') {
351
- synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
364
+ synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
352
365
  } else if (type === 'finalized') {
353
366
  synched = syncState.finalizedBlockNumber >= blockNumber;
354
367
  } else {
@@ -370,6 +383,19 @@ export class EpochsTestContext {
370
383
  return SpamContract.at(instance.address, wallet);
371
384
  }
372
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
+
373
399
  /** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
374
400
  public async createL1Client() {
375
401
  const { client, delayer } = withDelayer(
@@ -26,11 +26,8 @@ describe('e2e_fees bridging_race', () => {
26
26
  });
27
27
 
28
28
  beforeAll(async () => {
29
- await t.applyInitialAccountsSnapshot();
30
- await t.applyPublicDeployAccountsSnapshot();
31
- await t.applySetupFeeJuiceSnapshot();
32
-
33
- ({ wallet, logger } = await t.setup());
29
+ await t.setup();
30
+ ({ wallet, logger } = t);
34
31
  });
35
32
 
36
33
  afterAll(async () => {
@@ -70,10 +67,7 @@ describe('e2e_fees bridging_race', () => {
70
67
  // Yes, we need to REFACTOR it at some point
71
68
  const claim = await t.feeJuiceBridgeTestHarness.prepareTokensOnL1(bobsAddress);
72
69
  const { claimSecret: secret, messageLeafIndex: index } = claim;
73
- await t.feeJuiceContract.methods
74
- .claim(bobsAddress, claim.claimAmount, secret, index)
75
- .send({ from: bobsAddress })
76
- .wait();
70
+ await t.feeJuiceContract.methods.claim(bobsAddress, claim.claimAmount, secret, index).send({ from: bobsAddress });
77
71
  const [balance] = await t.getGasBalanceFn(bobsAddress);
78
72
  expect(balance).toEqual(claim.claimAmount);
79
73
  });