@aztec/end-to-end 0.0.1-commit.6230efd → 0.0.1-commit.64b6bbb
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.
- package/dest/bench/client_flows/benchmark.d.ts +3 -2
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +21 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +12 -13
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +118 -133
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- package/dest/bench/client_flows/data_extractor.js +3 -1
- package/dest/bench/utils.d.ts +9 -8
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +17 -12
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -7
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +96 -112
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -10
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +90 -70
- package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -3
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +18 -13
- package/dest/e2e_epochs/epochs_test.d.ts +7 -1
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +40 -12
- package/dest/e2e_fees/bridging_race.notest.js +3 -5
- package/dest/e2e_fees/fees_test.d.ts +13 -13
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +123 -141
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +14 -16
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +31 -39
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
- package/dest/e2e_p2p/p2p_network.d.ts +7 -6
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +111 -104
- package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/e2e_p2p/reqresp/utils.js +153 -0
- package/dest/e2e_p2p/shared.d.ts +6 -6
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +16 -20
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts +16 -9
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +89 -91
- package/dest/fixtures/e2e_prover_test.d.ts +8 -14
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +86 -95
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +114 -0
- package/dest/fixtures/index.d.ts +2 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +1 -0
- package/dest/fixtures/setup.d.ts +218 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +630 -0
- package/dest/fixtures/setup_p2p_test.d.ts +12 -8
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +29 -21
- package/dest/fixtures/token_utils.d.ts +1 -1
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +7 -4
- package/dest/fixtures/utils.d.ts +5 -194
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +4 -619
- package/dest/quality_of_service/grafana_client.d.ts +41 -0
- package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
- package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
- package/dest/quality_of_service/prometheus_client.d.ts +38 -0
- package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
- package/dest/quality_of_service/prometheus_client.js +67 -0
- package/dest/shared/cross_chain_test_harness.d.ts +16 -6
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +13 -13
- package/dest/shared/gas_portal_test_harness.d.ts +11 -1
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +1 -1
- package/dest/shared/index.d.ts +2 -2
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/submit-transactions.d.ts +3 -3
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +9 -11
- package/dest/shared/uniswap_l1_l2.d.ts +3 -28
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +53 -33
- package/dest/simulators/lending_simulator.d.ts +5 -1
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +4 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +61 -34
- package/dest/spartan/tx_metrics.d.ts +51 -2
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +333 -6
- package/dest/spartan/utils/bot.d.ts +27 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +141 -0
- package/dest/spartan/utils/chaos.d.ts +79 -0
- package/dest/spartan/utils/chaos.d.ts.map +1 -0
- package/dest/spartan/utils/chaos.js +142 -0
- package/dest/spartan/utils/clients.d.ts +39 -0
- package/dest/spartan/utils/clients.d.ts.map +1 -0
- package/dest/spartan/utils/clients.js +90 -0
- package/dest/spartan/utils/config.d.ts +39 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +21 -0
- package/dest/spartan/utils/health.d.ts +63 -0
- package/dest/spartan/utils/health.d.ts.map +1 -0
- package/dest/spartan/utils/health.js +202 -0
- package/dest/spartan/utils/helm.d.ts +15 -0
- package/dest/spartan/utils/helm.d.ts.map +1 -0
- package/dest/spartan/utils/helm.js +47 -0
- package/dest/spartan/utils/index.d.ts +9 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +18 -0
- package/dest/spartan/utils/k8s.d.ts +126 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +375 -0
- package/dest/spartan/utils/nodes.d.ts +41 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- package/dest/spartan/utils/scripts.d.ts +30 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +81 -0
- package/dest/spartan/utils.d.ts +2 -253
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -892
- package/package.json +43 -39
- package/src/bench/client_flows/benchmark.ts +24 -2
- package/src/bench/client_flows/client_flows_benchmark.ts +138 -204
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +1 -1
- package/src/bench/utils.ts +21 -15
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +126 -116
- package/src/e2e_deploy_contract/deploy_test.ts +21 -14
- package/src/e2e_epochs/epochs_test.ts +73 -37
- package/src/e2e_fees/bridging_race.notest.ts +3 -9
- package/src/e2e_fees/fees_test.ts +171 -219
- package/src/e2e_l1_publisher/write_json.ts +16 -16
- package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
- package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
- package/src/e2e_p2p/p2p_network.ts +172 -168
- package/src/e2e_p2p/reqresp/utils.ts +207 -0
- package/src/e2e_p2p/shared.ts +27 -27
- package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
- package/src/e2e_token_contract/token_contract_test.ts +103 -118
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +97 -132
- package/src/fixtures/ha_setup.ts +184 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +932 -0
- package/src/fixtures/setup_p2p_test.ts +31 -27
- package/src/fixtures/token_utils.ts +6 -5
- package/src/fixtures/utils.ts +27 -907
- package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
- package/src/quality_of_service/prometheus_client.ts +113 -0
- package/src/shared/cross_chain_test_harness.ts +16 -36
- package/src/shared/gas_portal_test_harness.ts +1 -1
- package/src/shared/index.ts +1 -1
- package/src/shared/submit-transactions.ts +9 -15
- package/src/shared/uniswap_l1_l2.ts +58 -79
- package/src/simulators/lending_simulator.ts +2 -2
- package/src/spartan/setup_test_wallets.ts +79 -25
- package/src/spartan/tx_metrics.ts +255 -9
- package/src/spartan/utils/bot.ts +185 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +27 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +64 -0
- package/src/spartan/utils/k8s.ts +527 -0
- package/src/spartan/utils/nodes.ts +538 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -1158
- package/dest/fixtures/snapshot_manager.d.ts +0 -93
- package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
- package/dest/fixtures/snapshot_manager.js +0 -493
- package/dest/quality_of_service/alert_checker.d.ts +0 -41
- package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
- 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 {
|
|
16
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
17
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
18
|
+
import { TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
|
|
14
19
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
15
20
|
import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
16
21
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
17
22
|
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
18
23
|
|
|
19
|
-
import { getContract } from 'viem';
|
|
20
|
-
|
|
21
24
|
import { MNEMONIC } from '../fixtures/fixtures.js';
|
|
22
25
|
import {
|
|
23
|
-
type
|
|
24
|
-
type
|
|
25
|
-
createSnapshotManager,
|
|
26
|
+
type EndToEndContext,
|
|
27
|
+
type SetupOptions,
|
|
26
28
|
deployAccounts,
|
|
27
29
|
publicDeployAccounts,
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
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
|
-
|
|
54
|
-
|
|
56
|
+
rollup!: RollupContract;
|
|
57
|
+
inbox!: InboxContract;
|
|
58
|
+
outbox!: OutboxContract;
|
|
55
59
|
cheatCodes!: CheatCodes;
|
|
56
60
|
|
|
57
61
|
deployL1ContractsValues!: DeployAztecL1ContractsReturnType;
|
|
@@ -62,122 +66,128 @@ export class CrossChainMessagingTest {
|
|
|
62
66
|
deployL1ContractsArgs: Partial<DeployAztecL1ContractsArgs> = {},
|
|
63
67
|
) {
|
|
64
68
|
this.logger = createLogger(`e2e:e2e_cross_chain_messaging:${testName}`);
|
|
65
|
-
this.
|
|
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
|
|
72
|
-
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
this.
|
|
80
|
-
|
|
81
|
-
this.
|
|
82
|
-
|
|
88
|
+
async advanceToEpochProven(l2TxReceipt: TxReceipt): Promise<EpochNumber> {
|
|
89
|
+
const block = await this.aztecNode.getBlock(l2TxReceipt.blockNumber!);
|
|
90
|
+
const epoch = await this.rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
|
|
91
|
+
// Warp to the next epoch.
|
|
92
|
+
await this.cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
|
|
93
|
+
// Wait for the tx to be proven.
|
|
94
|
+
await waitForProven(this.aztecNode, l2TxReceipt, { provenTimeout: 300 });
|
|
95
|
+
// Return the epoch the tx is in.
|
|
96
|
+
return epoch;
|
|
83
97
|
}
|
|
84
98
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
99
|
+
async catchUpProvenChain() {
|
|
100
|
+
const bn = await this.aztecNode.getBlockNumber();
|
|
101
|
+
while ((await this.aztecNode.getProvenBlockNumber()) < bn) {
|
|
102
|
+
await sleep(1000);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
90
105
|
|
|
91
106
|
async teardown() {
|
|
92
|
-
await this.
|
|
107
|
+
await teardown(this.context);
|
|
93
108
|
}
|
|
94
109
|
|
|
95
|
-
async
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
110
|
+
async applyBaseSetup() {
|
|
111
|
+
// Set up base context fields
|
|
112
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
113
|
+
this.wallet = this.context.wallet;
|
|
114
|
+
this.aztecNodeConfig = this.context.config;
|
|
115
|
+
this.cheatCodes = this.context.cheatCodes;
|
|
116
|
+
this.deployL1ContractsValues = this.context.deployL1ContractsValues;
|
|
117
|
+
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
118
|
+
|
|
119
|
+
if (this.requireEpochProven) {
|
|
120
|
+
// Turn off the watcher to prevent it from keep marking blocks as proven.
|
|
121
|
+
this.context.watcher.setIsMarkingAsProven(false);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Deploy 3 accounts
|
|
125
|
+
this.logger.info('Applying 3_accounts setup');
|
|
126
|
+
const { deployedAccounts } = await deployAccounts(
|
|
127
|
+
3,
|
|
128
|
+
this.logger,
|
|
129
|
+
)({
|
|
130
|
+
wallet: this.context.wallet,
|
|
131
|
+
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
132
|
+
});
|
|
133
|
+
[this.ownerAddress, this.user1Address, this.user2Address] = deployedAccounts.map(a => a.address);
|
|
134
|
+
|
|
135
|
+
// Set up cross chain messaging
|
|
136
|
+
this.logger.info('Applying e2e_cross_chain_messaging setup');
|
|
137
|
+
|
|
138
|
+
// Create the token contract state.
|
|
139
|
+
this.logger.verbose(`Public deploy accounts...`);
|
|
140
|
+
await publicDeployAccounts(this.wallet, [this.ownerAddress, this.user1Address, this.user2Address]);
|
|
141
|
+
|
|
142
|
+
this.l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
|
|
143
|
+
|
|
144
|
+
const underlyingERC20Address = await deployL1Contract(this.l1Client, TestERC20Abi, TestERC20Bytecode, [
|
|
145
|
+
'Underlying',
|
|
146
|
+
'UND',
|
|
147
|
+
this.l1Client.account.address,
|
|
148
|
+
]).then(({ address }) => address);
|
|
149
|
+
|
|
150
|
+
this.logger.verbose(`Setting up cross chain harness...`);
|
|
151
|
+
this.crossChainTestHarness = await CrossChainTestHarness.new(
|
|
152
|
+
this.aztecNode,
|
|
153
|
+
this.l1Client,
|
|
154
|
+
this.wallet,
|
|
155
|
+
this.ownerAddress,
|
|
156
|
+
this.logger,
|
|
157
|
+
underlyingERC20Address,
|
|
109
158
|
);
|
|
110
159
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
},
|
|
160
|
+
this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
|
|
161
|
+
|
|
162
|
+
const crossChainContext = this.crossChainTestHarness.toCrossChainContext();
|
|
163
|
+
|
|
164
|
+
this.l2Token = TokenContract.at(crossChainContext.l2Token, this.wallet);
|
|
165
|
+
this.l2Bridge = TokenBridgeContract.at(crossChainContext.l2Bridge, this.wallet);
|
|
166
|
+
|
|
167
|
+
// There is an issue with the reviver so we are getting strings sometimes. Working around it here.
|
|
168
|
+
this.ethAccount = EthAddress.fromString(crossChainContext.ethAccount.toString());
|
|
169
|
+
const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
|
|
170
|
+
|
|
171
|
+
const l1Client = createExtendedL1Client(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
|
|
172
|
+
this.l1Client = l1Client;
|
|
173
|
+
|
|
174
|
+
const l1Contracts = this.aztecNodeConfig.l1Contracts;
|
|
175
|
+
this.rollup = new RollupContract(l1Client, l1Contracts.rollupAddress.toString());
|
|
176
|
+
this.inbox = new InboxContract(l1Client, l1Contracts.inboxAddress.toString());
|
|
177
|
+
this.outbox = new OutboxContract(l1Client, l1Contracts.outboxAddress.toString());
|
|
178
|
+
|
|
179
|
+
this.crossChainTestHarness = new CrossChainTestHarness(
|
|
180
|
+
this.aztecNode,
|
|
181
|
+
this.logger,
|
|
182
|
+
this.l2Token,
|
|
183
|
+
this.l2Bridge,
|
|
184
|
+
this.ethAccount,
|
|
185
|
+
tokenPortalAddress,
|
|
186
|
+
crossChainContext.underlying,
|
|
187
|
+
l1Client,
|
|
188
|
+
this.aztecNodeConfig.l1Contracts,
|
|
189
|
+
this.wallet,
|
|
190
|
+
this.ownerAddress,
|
|
181
191
|
);
|
|
182
192
|
}
|
|
183
193
|
}
|
|
@@ -10,12 +10,10 @@ import type { StatefulTestContract } from '@aztec/noir-test-contracts.js/Statefu
|
|
|
10
10
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
11
11
|
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
12
12
|
|
|
13
|
-
import { type
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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.
|
|
41
|
+
await teardown(this.context);
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
private async
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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 {
|
|
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> & {
|
|
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 ??
|
|
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(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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] : [];
|
|
@@ -182,6 +194,7 @@ export class EpochsTestContext {
|
|
|
182
194
|
l1GenesisTime: await this.rollup.getL1GenesisTime(),
|
|
183
195
|
ethereumSlotDuration,
|
|
184
196
|
proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
|
|
197
|
+
targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
|
|
185
198
|
};
|
|
186
199
|
|
|
187
200
|
this.logger.info(
|
|
@@ -199,20 +212,29 @@ export class EpochsTestContext {
|
|
|
199
212
|
public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
|
|
200
213
|
this.logger.warn('Creating and syncing a simulated prover node...');
|
|
201
214
|
const proverNodePrivateKey = this.getNextPrivateKey();
|
|
202
|
-
const
|
|
203
|
-
const
|
|
215
|
+
const proverIndex = this.proverNodes.length + 1;
|
|
216
|
+
const { mockGossipSubNetwork } = this.context;
|
|
217
|
+
const proverNode = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
|
|
204
218
|
createAndSyncProverNode(
|
|
205
219
|
proverNodePrivateKey,
|
|
206
|
-
{
|
|
220
|
+
{
|
|
221
|
+
...this.context.config,
|
|
222
|
+
p2pEnabled: this.context.config.p2pEnabled || mockGossipSubNetwork !== undefined,
|
|
223
|
+
},
|
|
207
224
|
{
|
|
208
225
|
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
209
|
-
proverId: EthAddress.fromNumber(
|
|
226
|
+
proverId: EthAddress.fromNumber(proverIndex),
|
|
210
227
|
dontStart: opts.dontStart,
|
|
211
228
|
...opts,
|
|
212
229
|
},
|
|
213
230
|
this.context.aztecNode,
|
|
214
|
-
|
|
215
|
-
{
|
|
231
|
+
this.context.prefilledPublicData ?? [],
|
|
232
|
+
{
|
|
233
|
+
dateProvider: this.context.dateProvider,
|
|
234
|
+
p2pClientDeps: mockGossipSubNetwork
|
|
235
|
+
? { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) }
|
|
236
|
+
: undefined,
|
|
237
|
+
},
|
|
216
238
|
),
|
|
217
239
|
);
|
|
218
240
|
this.proverNodes.push(proverNode);
|
|
@@ -235,12 +257,13 @@ export class EpochsTestContext {
|
|
|
235
257
|
private async createNode(
|
|
236
258
|
opts: Partial<AztecNodeConfig> & { txDelayerMaxInclusionTimeIntoSlot?: number; dontStartSequencer?: boolean } = {},
|
|
237
259
|
) {
|
|
238
|
-
const
|
|
260
|
+
const nodeIndex = this.nodes.length + 1;
|
|
261
|
+
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
239
262
|
const { mockGossipSubNetwork } = this.context;
|
|
240
263
|
const resolvedConfig = { ...this.context.config, ...opts };
|
|
241
264
|
const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
|
|
242
265
|
const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
|
|
243
|
-
const node = await
|
|
266
|
+
const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
|
|
244
267
|
AztecNodeService.createAndSync(
|
|
245
268
|
{
|
|
246
269
|
...resolvedConfig,
|
|
@@ -348,7 +371,7 @@ export class EpochsTestContext {
|
|
|
348
371
|
]);
|
|
349
372
|
this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
|
|
350
373
|
if (type === 'proven') {
|
|
351
|
-
synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
|
|
374
|
+
synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
|
|
352
375
|
} else if (type === 'finalized') {
|
|
353
376
|
synched = syncState.finalizedBlockNumber >= blockNumber;
|
|
354
377
|
} else {
|
|
@@ -370,6 +393,19 @@ export class EpochsTestContext {
|
|
|
370
393
|
return SpamContract.at(instance.address, wallet);
|
|
371
394
|
}
|
|
372
395
|
|
|
396
|
+
/** Registers the TestContract on the given wallet. */
|
|
397
|
+
public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
|
|
398
|
+
const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
|
|
399
|
+
constructorArgs: [],
|
|
400
|
+
constructorArtifact: undefined,
|
|
401
|
+
salt,
|
|
402
|
+
publicKeys: undefined,
|
|
403
|
+
deployer: undefined,
|
|
404
|
+
});
|
|
405
|
+
await wallet.registerContract(instance, TestContract.artifact);
|
|
406
|
+
return TestContract.at(instance.address, wallet);
|
|
407
|
+
}
|
|
408
|
+
|
|
373
409
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
|
|
374
410
|
public async createL1Client() {
|
|
375
411
|
const { client, delayer } = withDelayer(
|
|
@@ -378,7 +414,7 @@ export class EpochsTestContext {
|
|
|
378
414
|
privateKeyToAccount(this.getNextPrivateKey()),
|
|
379
415
|
this.l1Client.chain,
|
|
380
416
|
),
|
|
381
|
-
this.context.dateProvider
|
|
417
|
+
this.context.dateProvider,
|
|
382
418
|
{ ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S },
|
|
383
419
|
);
|
|
384
420
|
expect(await client.getBalance({ address: client.account.address })).toBeGreaterThan(0n);
|
|
@@ -26,11 +26,8 @@ describe('e2e_fees bridging_race', () => {
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
beforeAll(async () => {
|
|
29
|
-
await t.
|
|
30
|
-
|
|
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
|
});
|