@aztec/end-to-end 0.0.1-commit.c7c42ec → 0.0.1-commit.c80b6263
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/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 +89 -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 +31 -9
- 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 +2 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +19 -15
- 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/shared.d.ts +6 -6
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +13 -20
- 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/setup.d.ts +218 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +695 -0
- package/dest/fixtures/setup_p2p_test.d.ts +4 -5
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +24 -19
- 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 +51 -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 +36 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +20 -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 +98 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +257 -0
- package/dest/spartan/utils/nodes.d.ts +31 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +290 -0
- package/dest/spartan/utils/scripts.d.ts +16 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +66 -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 +40 -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/data_extractor.ts +1 -1
- package/src/bench/utils.ts +20 -14
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -116
- package/src/e2e_deploy_contract/deploy_test.ts +21 -14
- package/src/e2e_epochs/epochs_test.ts +60 -34
- package/src/e2e_fees/bridging_race.notest.ts +3 -9
- package/src/e2e_fees/fees_test.ts +172 -220
- package/src/e2e_l1_publisher/write_json.ts +21 -16
- package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
- package/src/e2e_p2p/inactivity_slash_test.ts +5 -5
- package/src/e2e_p2p/p2p_network.ts +172 -168
- package/src/e2e_p2p/shared.ts +26 -27
- package/src/e2e_token_contract/token_contract_test.ts +103 -118
- package/src/fixtures/e2e_prover_test.ts +99 -134
- package/src/fixtures/setup.ts +1017 -0
- package/src/fixtures/setup_p2p_test.ts +15 -20
- 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 -77
- 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 +26 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +62 -0
- package/src/spartan/utils/k8s.ts +375 -0
- package/src/spartan/utils/nodes.ts +323 -0
- package/src/spartan/utils/scripts.ts +63 -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 { 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
|
|
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,129 @@ 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
|
-
|
|
80
|
-
this.cheatCodes
|
|
81
|
-
|
|
82
|
-
this.
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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.
|
|
108
|
+
await teardown(this.context);
|
|
93
109
|
}
|
|
94
110
|
|
|
95
|
-
async
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
|
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] : [];
|
|
@@ -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
|
|
203
|
-
const proverNode = await
|
|
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(
|
|
221
|
+
proverId: EthAddress.fromNumber(proverIndex),
|
|
210
222
|
dontStart: opts.dontStart,
|
|
211
223
|
...opts,
|
|
212
224
|
},
|
|
213
225
|
this.context.aztecNode,
|
|
214
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
});
|