@aztec/end-to-end 0.0.1-commit.fce3e4f → 0.0.1-commit.fffb133c
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 +14 -15
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +123 -136
- 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 +27 -18
- 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 +19 -13
- 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 +91 -71
- 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 +11 -9
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +18 -13
- package/dest/e2e_fees/bridging_race.notest.js +4 -6
- package/dest/e2e_fees/fees_test.d.ts +20 -16
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +126 -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_multi_validator/utils.js +1 -1
- 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 +4 -4
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +6 -9
- package/dest/e2e_p2p/p2p_network.d.ts +13 -11
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +120 -111
- package/dest/e2e_p2p/shared.d.ts +7 -7
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +11 -18
- 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 +10 -18
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +90 -102
- package/dest/fixtures/fixtures.d.ts +2 -3
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +2 -3
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/setup.d.ts +218 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +690 -0
- package/dest/fixtures/setup_p2p_test.js +3 -3
- 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 -637
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +4 -647
- package/dest/fixtures/web3signer.js +1 -1
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- 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 +18 -6
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -14
- package/dest/shared/gas_portal_test_harness.d.ts +12 -2
- 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 -27
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +55 -35
- package/dest/simulators/lending_simulator.d.ts +6 -2
- 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 +63 -35
- package/dest/spartan/tx_metrics.d.ts +54 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +272 -0
- 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 -218
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -749
- package/package.json +42 -41
- package/src/bench/client_flows/benchmark.ts +24 -2
- package/src/bench/client_flows/client_flows_benchmark.ts +145 -208
- package/src/bench/client_flows/data_extractor.ts +1 -1
- package/src/bench/utils.ts +30 -20
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +104 -142
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -125
- package/src/e2e_deploy_contract/deploy_test.ts +21 -14
- package/src/e2e_epochs/epochs_test.ts +63 -45
- package/src/e2e_fees/bridging_race.notest.ts +4 -10
- package/src/e2e_fees/fees_test.ts +179 -221
- package/src/e2e_l1_publisher/write_json.ts +21 -16
- package/src/e2e_multi_validator/utils.ts +1 -1
- package/src/e2e_nested_contract/nested_contract_test.ts +33 -56
- package/src/e2e_p2p/inactivity_slash_test.ts +9 -12
- package/src/e2e_p2p/p2p_network.ts +180 -183
- package/src/e2e_p2p/shared.ts +21 -26
- package/src/e2e_token_contract/token_contract_test.ts +103 -118
- package/src/fixtures/e2e_prover_test.ts +103 -140
- package/src/fixtures/fixtures.ts +2 -5
- package/src/fixtures/get_acvm_config.ts +1 -1
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup.ts +1017 -0
- package/src/fixtures/setup_p2p_test.ts +3 -3
- package/src/fixtures/token_utils.ts +6 -5
- package/src/fixtures/utils.ts +27 -966
- package/src/fixtures/web3signer.ts +1 -1
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- 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 +19 -36
- package/src/shared/gas_portal_test_harness.ts +2 -2
- package/src/shared/index.ts +1 -1
- package/src/shared/submit-transactions.ts +9 -15
- package/src/shared/uniswap_l1_l2.ts +65 -86
- package/src/simulators/lending_simulator.ts +3 -3
- package/src/spartan/DEVELOP.md +7 -0
- package/src/spartan/setup_test_wallets.ts +81 -26
- package/src/spartan/tx_metrics.ts +250 -0
- 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 -942
- package/dest/fixtures/setup_l1_contracts.d.ts +0 -477
- package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
- package/dest/fixtures/setup_l1_contracts.js +0 -17
- package/dest/fixtures/snapshot_manager.d.ts +0 -95
- package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
- package/dest/fixtures/snapshot_manager.js +0 -505
- 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/setup_l1_contracts.ts +0 -26
- package/src/fixtures/snapshot_manager.ts +0 -665
|
@@ -2,20 +2,19 @@ import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
|
2
2
|
import type { AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
3
3
|
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
4
4
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
5
|
+
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
5
6
|
import {
|
|
6
7
|
type EmpireSlashingProposerContract,
|
|
7
|
-
type ExtendedViemWalletClient,
|
|
8
8
|
GSEContract,
|
|
9
|
-
MultiAdderArtifact,
|
|
10
|
-
type Operator,
|
|
11
9
|
RollupContract,
|
|
12
10
|
type TallySlashingProposerContract,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
} from '@aztec/ethereum';
|
|
11
|
+
} from '@aztec/ethereum/contracts';
|
|
12
|
+
import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
|
+
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
14
|
+
import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
|
|
15
|
+
import { createL1TxUtilsFromViemWallet } from '@aztec/ethereum/l1-tx-utils';
|
|
18
16
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
17
|
+
import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
|
|
19
18
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
20
19
|
import { SecretValue } from '@aztec/foundation/config';
|
|
21
20
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
@@ -35,18 +34,20 @@ import getPort from 'get-port';
|
|
|
35
34
|
import { type GetContractReturnType, getAddress, getContract } from 'viem';
|
|
36
35
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
37
36
|
|
|
37
|
+
import {
|
|
38
|
+
type EndToEndContext,
|
|
39
|
+
type SetupOptions,
|
|
40
|
+
deployAccounts,
|
|
41
|
+
getPrivateKeyFromIndex,
|
|
42
|
+
getSponsoredFPCAddress,
|
|
43
|
+
setup,
|
|
44
|
+
teardown,
|
|
45
|
+
} from '../fixtures/setup.js';
|
|
38
46
|
import {
|
|
39
47
|
ATTESTER_PRIVATE_KEYS_START_INDEX,
|
|
40
48
|
createValidatorConfig,
|
|
41
49
|
generatePrivateKeys,
|
|
42
50
|
} from '../fixtures/setup_p2p_test.js';
|
|
43
|
-
import {
|
|
44
|
-
type ISnapshotManager,
|
|
45
|
-
type SubsystemsContext,
|
|
46
|
-
createSnapshotManager,
|
|
47
|
-
deployAccounts,
|
|
48
|
-
} from '../fixtures/snapshot_manager.js';
|
|
49
|
-
import { type SetupOptions, getPrivateKeyFromIndex, getSponsoredFPCAddress } from '../fixtures/utils.js';
|
|
50
51
|
import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
|
|
51
52
|
|
|
52
53
|
// Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
|
|
@@ -61,14 +62,14 @@ export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
|
|
|
61
62
|
};
|
|
62
63
|
|
|
63
64
|
export class P2PNetworkTest {
|
|
64
|
-
|
|
65
|
+
public context!: EndToEndContext;
|
|
65
66
|
public baseAccountPrivateKey: `0x${string}`;
|
|
66
67
|
public baseAccount;
|
|
67
68
|
|
|
68
69
|
public logger: Logger;
|
|
69
70
|
public monitor!: ChainMonitor;
|
|
70
71
|
|
|
71
|
-
public ctx!:
|
|
72
|
+
public ctx!: EndToEndContext;
|
|
72
73
|
public attesterPrivateKeys: `0x${string}`[] = [];
|
|
73
74
|
public attesterPublicKeys: string[] = [];
|
|
74
75
|
public peerIdPrivateKeys: string[] = [];
|
|
@@ -84,6 +85,10 @@ export class P2PNetworkTest {
|
|
|
84
85
|
|
|
85
86
|
public bootstrapNode?: BootstrapNode;
|
|
86
87
|
|
|
88
|
+
// Store setup options for use in setup()
|
|
89
|
+
private setupOptions: SetupOptions;
|
|
90
|
+
private deployL1ContractsArgs: any;
|
|
91
|
+
|
|
87
92
|
constructor(
|
|
88
93
|
public readonly testName: string,
|
|
89
94
|
public bootstrapNodeEnr: string,
|
|
@@ -94,7 +99,6 @@ export class P2PNetworkTest {
|
|
|
94
99
|
// If set enable metrics collection
|
|
95
100
|
private metricsPort?: number,
|
|
96
101
|
startProverNode?: boolean,
|
|
97
|
-
mockZkPassportVerifier?: boolean,
|
|
98
102
|
) {
|
|
99
103
|
this.logger = createLogger(`e2e:e2e_p2p:${testName}`);
|
|
100
104
|
|
|
@@ -109,45 +113,42 @@ export class P2PNetworkTest {
|
|
|
109
113
|
|
|
110
114
|
const zkPassportParams = ZkPassportProofParams.random();
|
|
111
115
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
slashingRoundSizeInEpochs
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
aztecProofSubmissionEpochs
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
zkPassportDomain: zkPassportParams.domain,
|
|
147
|
-
zkPassportScope: zkPassportParams.scope,
|
|
148
|
-
},
|
|
116
|
+
// Store setup options for later use
|
|
117
|
+
this.setupOptions = {
|
|
118
|
+
...initialValidatorConfig,
|
|
119
|
+
ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
|
|
120
|
+
aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
|
|
121
|
+
aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
|
|
122
|
+
aztecProofSubmissionEpochs:
|
|
123
|
+
initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
|
|
124
|
+
slashingRoundSizeInEpochs:
|
|
125
|
+
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
126
|
+
slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
|
|
127
|
+
aztecTargetCommitteeSize: numberOfValidators,
|
|
128
|
+
metricsPort: metricsPort,
|
|
129
|
+
numberOfInitialFundedAccounts: 2,
|
|
130
|
+
startProverNode,
|
|
131
|
+
walletMinFeePadding: 2.0,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
this.deployL1ContractsArgs = {
|
|
135
|
+
...initialValidatorConfig,
|
|
136
|
+
aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
|
|
137
|
+
slashingRoundSizeInEpochs:
|
|
138
|
+
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
139
|
+
slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
|
|
140
|
+
|
|
141
|
+
ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
|
|
142
|
+
aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
|
|
143
|
+
aztecProofSubmissionEpochs:
|
|
144
|
+
initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
|
|
145
|
+
aztecTargetCommitteeSize: numberOfValidators,
|
|
146
|
+
initialValidators: [],
|
|
147
|
+
zkPassportArgs: {
|
|
148
|
+
zkPassportDomain: zkPassportParams.domain,
|
|
149
|
+
zkPassportScope: zkPassportParams.scope,
|
|
149
150
|
},
|
|
150
|
-
|
|
151
|
+
};
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
static async create({
|
|
@@ -158,7 +159,6 @@ export class P2PNetworkTest {
|
|
|
158
159
|
metricsPort,
|
|
159
160
|
initialConfig,
|
|
160
161
|
startProverNode,
|
|
161
|
-
mockZkPassportVerifier,
|
|
162
162
|
}: {
|
|
163
163
|
testName: string;
|
|
164
164
|
numberOfNodes: number;
|
|
@@ -167,7 +167,6 @@ export class P2PNetworkTest {
|
|
|
167
167
|
metricsPort?: number;
|
|
168
168
|
initialConfig?: SetupOptions;
|
|
169
169
|
startProverNode?: boolean;
|
|
170
|
-
mockZkPassportVerifier?: boolean;
|
|
171
170
|
}) {
|
|
172
171
|
const port = basePort || (await getPort());
|
|
173
172
|
|
|
@@ -188,29 +187,27 @@ export class P2PNetworkTest {
|
|
|
188
187
|
numberOfNodes,
|
|
189
188
|
metricsPort,
|
|
190
189
|
startProverNode,
|
|
191
|
-
mockZkPassportVerifier,
|
|
192
190
|
);
|
|
193
191
|
}
|
|
194
192
|
|
|
195
193
|
get fundedAccount() {
|
|
196
194
|
if (!this.deployedAccounts[0]) {
|
|
197
|
-
throw new Error('Call
|
|
195
|
+
throw new Error('Call setupAccount to create a funded account.');
|
|
198
196
|
}
|
|
199
197
|
return this.deployedAccounts[0];
|
|
200
198
|
}
|
|
201
199
|
|
|
202
200
|
async addBootstrapNode() {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
});
|
|
201
|
+
this.logger.info('Adding bootstrap node');
|
|
202
|
+
const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
|
|
203
|
+
this.bootstrapNode = await createBootstrapNodeFromPrivateKey(
|
|
204
|
+
BOOTSTRAP_NODE_PRIVATE_KEY,
|
|
205
|
+
this.bootNodePort,
|
|
206
|
+
telemetry,
|
|
207
|
+
this.context.config,
|
|
208
|
+
);
|
|
209
|
+
// Overwrite enr with updated info
|
|
210
|
+
this.bootstrapNodeEnr = this.bootstrapNode.getENR().encodeTxt();
|
|
214
211
|
}
|
|
215
212
|
|
|
216
213
|
getValidators() {
|
|
@@ -231,128 +228,114 @@ export class P2PNetworkTest {
|
|
|
231
228
|
return { validators };
|
|
232
229
|
}
|
|
233
230
|
|
|
234
|
-
async
|
|
231
|
+
async applyBaseSetup() {
|
|
235
232
|
await this.addBootstrapNode();
|
|
236
|
-
await this.snapshotManager.snapshot('add-validators', async ({ deployL1ContractsValues, cheatCodes }) => {
|
|
237
|
-
const rollup = getContract({
|
|
238
|
-
address: deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
|
|
239
|
-
abi: RollupAbi,
|
|
240
|
-
client: deployL1ContractsValues.l1Client,
|
|
241
|
-
});
|
|
242
233
|
|
|
243
|
-
|
|
234
|
+
this.logger.info('Adding validators');
|
|
235
|
+
const rollup = getContract({
|
|
236
|
+
address: this.context.deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(),
|
|
237
|
+
abi: RollupAbi,
|
|
238
|
+
client: this.context.deployL1ContractsValues.l1Client,
|
|
239
|
+
});
|
|
244
240
|
|
|
245
|
-
|
|
246
|
-
address: deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
|
|
247
|
-
abi: TestERC20Abi,
|
|
248
|
-
client: deployL1ContractsValues.l1Client,
|
|
249
|
-
});
|
|
241
|
+
this.logger.info(`Adding ${this.numberOfValidators} validators`);
|
|
250
242
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
const multiAdder = getContract({
|
|
259
|
-
address: multiAdderAddress.toString(),
|
|
260
|
-
abi: MultiAdderArtifact.contractAbi,
|
|
261
|
-
client: deployL1ContractsValues.l1Client,
|
|
262
|
-
});
|
|
243
|
+
const stakingAsset = getContract({
|
|
244
|
+
address: this.context.deployL1ContractsValues.l1ContractAddresses.stakingAssetAddress.toString(),
|
|
245
|
+
abi: TestERC20Abi,
|
|
246
|
+
client: this.context.deployL1ContractsValues.l1Client,
|
|
247
|
+
});
|
|
263
248
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
const { validators } = this.getValidators();
|
|
272
|
-
this.validators = validators;
|
|
273
|
-
|
|
274
|
-
const gseAddress = deployL1ContractsValues.l1ContractAddresses.gseAddress!;
|
|
275
|
-
if (!gseAddress) {
|
|
276
|
-
throw new Error('GSE contract not deployed');
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
const gseContract = new GSEContract(deployL1ContractsValues.l1Client, gseAddress.toString());
|
|
280
|
-
|
|
281
|
-
const makeValidatorTuples = async (validator: Operator) => {
|
|
282
|
-
const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
|
|
283
|
-
return {
|
|
284
|
-
attester: validator.attester.toString() as `0x${string}`,
|
|
285
|
-
withdrawer: validator.withdrawer.toString() as `0x${string}`,
|
|
286
|
-
...registrationTuple,
|
|
287
|
-
};
|
|
288
|
-
};
|
|
289
|
-
const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
|
|
249
|
+
const { address: multiAdderAddress } = await deployL1Contract(
|
|
250
|
+
this.context.deployL1ContractsValues.l1Client,
|
|
251
|
+
MultiAdderArtifact.contractAbi,
|
|
252
|
+
MultiAdderArtifact.contractBytecode,
|
|
253
|
+
[rollup.address, this.context.deployL1ContractsValues.l1Client.account.address],
|
|
254
|
+
);
|
|
290
255
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
256
|
+
const multiAdder = getContract({
|
|
257
|
+
address: multiAdderAddress.toString(),
|
|
258
|
+
abi: MultiAdderArtifact.contractAbi,
|
|
259
|
+
client: this.context.deployL1ContractsValues.l1Client,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const stakeNeeded = (await rollup.read.getActivationThreshold()) * BigInt(this.numberOfValidators);
|
|
263
|
+
await Promise.all(
|
|
264
|
+
[await stakingAsset.write.mint([multiAdder.address, stakeNeeded], {} as any)].map(txHash =>
|
|
265
|
+
this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash: txHash }),
|
|
266
|
+
),
|
|
267
|
+
);
|
|
294
268
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
BigInt(await cheatCodes.rollup.getEpoch()) + (await rollup.read.getLagInEpochsForValidatorSet()) + 1n,
|
|
298
|
-
),
|
|
299
|
-
);
|
|
269
|
+
const { validators } = this.getValidators();
|
|
270
|
+
this.validators = validators;
|
|
300
271
|
|
|
301
|
-
|
|
302
|
-
|
|
272
|
+
const gseAddress = this.context.deployL1ContractsValues.l1ContractAddresses.gseAddress!;
|
|
273
|
+
if (!gseAddress) {
|
|
274
|
+
throw new Error('GSE contract not deployed');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const gseContract = new GSEContract(this.context.deployL1ContractsValues.l1Client, gseAddress.toString());
|
|
278
|
+
|
|
279
|
+
const makeValidatorTuples = async (validator: Operator) => {
|
|
280
|
+
const registrationTuple = await gseContract.makeRegistrationTuple(validator.bn254SecretKey.getValue());
|
|
281
|
+
return {
|
|
282
|
+
attester: validator.attester.toString() as `0x${string}`,
|
|
283
|
+
withdrawer: validator.withdrawer.toString() as `0x${string}`,
|
|
284
|
+
...registrationTuple,
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
const validatorTuples = await Promise.all(validators.map(makeValidatorTuples));
|
|
288
|
+
|
|
289
|
+
await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({
|
|
290
|
+
hash: await multiAdder.write.addValidators([validatorTuples]),
|
|
303
291
|
});
|
|
292
|
+
|
|
293
|
+
await this.context.cheatCodes.rollup.advanceToEpoch(
|
|
294
|
+
EpochNumber.fromBigInt(
|
|
295
|
+
BigInt(await this.context.cheatCodes.rollup.getEpoch()) +
|
|
296
|
+
(await rollup.read.getLagInEpochsForValidatorSet()) +
|
|
297
|
+
1n,
|
|
298
|
+
),
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
// Send and await a tx to make sure we mine a block for the warp to correctly progress.
|
|
302
|
+
await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
|
|
304
303
|
}
|
|
305
304
|
|
|
306
305
|
async setupAccount() {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
306
|
+
this.logger.info('Setting up account');
|
|
307
|
+
const { deployedAccounts } = await deployAccounts(
|
|
308
|
+
1,
|
|
309
|
+
this.logger,
|
|
310
|
+
)({
|
|
311
|
+
wallet: this.context.wallet,
|
|
312
|
+
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
313
|
+
});
|
|
314
|
+
this.deployedAccounts = deployedAccounts;
|
|
315
|
+
[{ address: this.defaultAccountAddress }] = deployedAccounts;
|
|
316
|
+
this.wallet = this.context.wallet;
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
async deploySpamContract() {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const spamContract = await SpamContract.deploy(this.wallet)
|
|
328
|
-
.send({ from: this.defaultAccountAddress! })
|
|
329
|
-
.deployed();
|
|
330
|
-
return { contractAddress: spamContract.address };
|
|
331
|
-
},
|
|
332
|
-
({ contractAddress }) => {
|
|
333
|
-
if (!this.wallet) {
|
|
334
|
-
throw new Error('Call snapshot t.setupAccount before deploying account contract');
|
|
335
|
-
}
|
|
336
|
-
this.spamContract = SpamContract.at(contractAddress, this.wallet);
|
|
337
|
-
return Promise.resolve();
|
|
338
|
-
},
|
|
339
|
-
);
|
|
320
|
+
this.logger.info('Deploying spam contract');
|
|
321
|
+
if (!this.wallet) {
|
|
322
|
+
throw new Error('Call setupAccount before deploying spam contract');
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
|
|
326
|
+
this.spamContract = spamContract;
|
|
340
327
|
}
|
|
341
328
|
|
|
342
329
|
async removeInitialNode() {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
await aztecNode.stop();
|
|
354
|
-
},
|
|
355
|
-
);
|
|
330
|
+
this.logger.info('Removing initial node');
|
|
331
|
+
// Send and await a tx to make sure we mine a block for the warp to correctly progress.
|
|
332
|
+
const { receipt } = await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
|
|
333
|
+
const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
|
|
334
|
+
blockNumber: receipt.blockNumber,
|
|
335
|
+
});
|
|
336
|
+
this.context.dateProvider!.setTime(Number(block.timestamp) * 1000);
|
|
337
|
+
|
|
338
|
+
await this.context.aztecNodeService!.stop();
|
|
356
339
|
}
|
|
357
340
|
|
|
358
341
|
async sendDummyTx() {
|
|
@@ -368,17 +351,31 @@ export class P2PNetworkTest {
|
|
|
368
351
|
}
|
|
369
352
|
|
|
370
353
|
async setup() {
|
|
371
|
-
this.
|
|
354
|
+
this.logger.info('Setting up subsystems from fresh');
|
|
355
|
+
this.context = await setup(
|
|
356
|
+
0,
|
|
357
|
+
{
|
|
358
|
+
...this.setupOptions,
|
|
359
|
+
fundSponsoredFPC: true,
|
|
360
|
+
skipAccountDeployment: true,
|
|
361
|
+
slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
|
|
362
|
+
aztecTargetCommitteeSize: 0,
|
|
363
|
+
l1ContractsArgs: this.deployL1ContractsArgs,
|
|
364
|
+
},
|
|
365
|
+
// Use checkpointed chain tip for PXE to avoid issues with blocks being dropped due to pruned anchor blocks.
|
|
366
|
+
{ syncChainTip: 'checkpointed' },
|
|
367
|
+
);
|
|
368
|
+
this.ctx = this.context;
|
|
372
369
|
|
|
373
370
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
374
|
-
const initialFundedAccounts = [...this.
|
|
371
|
+
const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
|
|
375
372
|
|
|
376
373
|
const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
|
|
377
374
|
this.prefilledPublicData = prefilledPublicData;
|
|
378
375
|
|
|
379
|
-
const rollupContract = RollupContract.getFromL1ContractsValues(this.
|
|
380
|
-
this.monitor = new ChainMonitor(rollupContract, this.
|
|
381
|
-
this.monitor.on('l1-block', ({ timestamp }) => this.
|
|
376
|
+
const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
|
|
377
|
+
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider!).start();
|
|
378
|
+
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider!.setTime(Number(timestamp) * 1000));
|
|
382
379
|
}
|
|
383
380
|
|
|
384
381
|
async stopNodes(nodes: AztecNodeService[]) {
|
|
@@ -439,7 +436,7 @@ export class P2PNetworkTest {
|
|
|
439
436
|
async teardown() {
|
|
440
437
|
await this.monitor.stop();
|
|
441
438
|
await tryStop(this.bootstrapNode, this.logger);
|
|
442
|
-
await this.
|
|
439
|
+
await teardown(this.context);
|
|
443
440
|
}
|
|
444
441
|
|
|
445
442
|
async getContracts(): Promise<{
|
|
@@ -449,7 +446,7 @@ export class P2PNetworkTest {
|
|
|
449
446
|
slashFactory: SlashFactoryContract;
|
|
450
447
|
}> {
|
|
451
448
|
if (!this.ctx.deployL1ContractsValues) {
|
|
452
|
-
throw new Error('
|
|
449
|
+
throw new Error('DeployAztecL1ContractsValues not set');
|
|
453
450
|
}
|
|
454
451
|
|
|
455
452
|
const rollup = new RollupContract(
|
|
@@ -458,7 +455,7 @@ export class P2PNetworkTest {
|
|
|
458
455
|
);
|
|
459
456
|
|
|
460
457
|
const slasherContract = getContract({
|
|
461
|
-
address: getAddress(await rollup.getSlasherAddress()),
|
|
458
|
+
address: getAddress((await rollup.getSlasherAddress()).toString()),
|
|
462
459
|
abi: SlasherAbi,
|
|
463
460
|
client: this.ctx.deployL1ContractsValues.l1Client,
|
|
464
461
|
});
|
package/src/e2e_p2p/shared.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
2
|
import type { AztecNodeService } from '@aztec/aztec-node';
|
|
3
3
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
4
|
-
import {
|
|
4
|
+
import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
5
5
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
6
6
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
7
|
-
import {
|
|
7
|
+
import { TxHash } from '@aztec/aztec.js/tx';
|
|
8
8
|
import type { RollupCheatCodes } from '@aztec/aztec/testing';
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
EmpireSlashingProposerContract,
|
|
11
|
+
RollupContract,
|
|
12
|
+
TallySlashingProposerContract,
|
|
13
|
+
} from '@aztec/ethereum/contracts';
|
|
10
14
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
11
15
|
import { timesAsync, unique } from '@aztec/foundation/collection';
|
|
16
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
12
17
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
13
18
|
import { pluralize } from '@aztec/foundation/string';
|
|
14
19
|
import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
@@ -17,7 +22,7 @@ import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
|
17
22
|
import { getRoundForOffense } from '@aztec/slasher';
|
|
18
23
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
19
24
|
import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
20
|
-
import { TestWallet, proveInteraction } from '@aztec/test-wallet/server';
|
|
25
|
+
import { type ProvenTx, TestWallet, proveInteraction } from '@aztec/test-wallet/server';
|
|
21
26
|
|
|
22
27
|
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
23
28
|
|
|
@@ -29,24 +34,15 @@ export const submitComplexTxsTo = async (
|
|
|
29
34
|
numTxs: number,
|
|
30
35
|
opts: { callPublic?: boolean } = {},
|
|
31
36
|
) => {
|
|
32
|
-
const txs:
|
|
37
|
+
const txs: TxHash[] = [];
|
|
33
38
|
|
|
34
39
|
const seed = 1234n;
|
|
35
40
|
const spamCount = 15;
|
|
36
41
|
for (let i = 0; i < numTxs; i++) {
|
|
37
|
-
const
|
|
38
|
-
const txHash = await
|
|
39
|
-
|
|
42
|
+
const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
|
|
43
|
+
const txHash = await method.send({ from, wait: NO_WAIT });
|
|
40
44
|
logger.info(`Tx sent with hash ${txHash.toString()}`);
|
|
41
|
-
|
|
42
|
-
expect(receipt).toEqual(
|
|
43
|
-
expect.objectContaining({
|
|
44
|
-
status: TxStatus.PENDING,
|
|
45
|
-
error: '',
|
|
46
|
-
}),
|
|
47
|
-
);
|
|
48
|
-
logger.info(`Receipt received for ${txHash.toString()}`);
|
|
49
|
-
txs.push(tx);
|
|
45
|
+
txs.push(txHash);
|
|
50
46
|
}
|
|
51
47
|
return txs;
|
|
52
48
|
};
|
|
@@ -57,7 +53,7 @@ export const submitTransactions = async (
|
|
|
57
53
|
node: AztecNodeService,
|
|
58
54
|
numTxs: number,
|
|
59
55
|
fundedAccount: InitialAccountData,
|
|
60
|
-
): Promise<
|
|
56
|
+
): Promise<TxHash[]> => {
|
|
61
57
|
const rpcConfig = getRpcConfig();
|
|
62
58
|
rpcConfig.proverEnabled = false;
|
|
63
59
|
const wallet = await TestWallet.create(node, { ...getPXEConfig(), proverEnabled: false }, { useLogSuffix: true });
|
|
@@ -70,7 +66,7 @@ export async function prepareTransactions(
|
|
|
70
66
|
node: AztecNodeService,
|
|
71
67
|
numTxs: number,
|
|
72
68
|
fundedAccount: InitialAccountData,
|
|
73
|
-
): Promise<
|
|
69
|
+
): Promise<ProvenTx[]> {
|
|
74
70
|
const rpcConfig = getRpcConfig();
|
|
75
71
|
rpcConfig.proverEnabled = false;
|
|
76
72
|
|
|
@@ -87,8 +83,7 @@ export async function prepareTransactions(
|
|
|
87
83
|
const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
|
|
88
84
|
from: fundedAccountManager.address,
|
|
89
85
|
});
|
|
90
|
-
|
|
91
|
-
logger.info(`Tx prepared with hash ${txHash}`);
|
|
86
|
+
logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
|
|
92
87
|
return tx;
|
|
93
88
|
});
|
|
94
89
|
}
|
|
@@ -133,7 +128,7 @@ export async function awaitCommitteeExists({
|
|
|
133
128
|
logger: Logger;
|
|
134
129
|
}): Promise<readonly `0x${string}`[]> {
|
|
135
130
|
logger.info(`Waiting for committee to be set`);
|
|
136
|
-
let committee:
|
|
131
|
+
let committee: EthAddress[] | undefined;
|
|
137
132
|
await retryUntil(
|
|
138
133
|
async () => {
|
|
139
134
|
committee = await rollup.getCurrentEpochCommittee();
|
|
@@ -142,7 +137,7 @@ export async function awaitCommitteeExists({
|
|
|
142
137
|
'non-empty committee',
|
|
143
138
|
60,
|
|
144
139
|
);
|
|
145
|
-
return committee
|
|
140
|
+
return committee!.map(c => c.toString() as `0x${string}`);
|
|
146
141
|
}
|
|
147
142
|
|
|
148
143
|
export async function awaitOffenseDetected({
|
|
@@ -214,9 +209,9 @@ export async function awaitCommitteeKicked({
|
|
|
214
209
|
|
|
215
210
|
if (slashingProposer.type === 'empire') {
|
|
216
211
|
// Await for the slash payload to be created if empire (no payload is created on tally until execution time)
|
|
217
|
-
const targetEpoch =
|
|
212
|
+
const targetEpoch = EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1);
|
|
218
213
|
logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
|
|
219
|
-
await cheatCodes.advanceToEpoch(
|
|
214
|
+
await cheatCodes.advanceToEpoch(targetEpoch);
|
|
220
215
|
|
|
221
216
|
const slashPayloadEvents = await retryUntil(
|
|
222
217
|
async () => {
|
|
@@ -271,7 +266,7 @@ export async function awaitCommitteeKicked({
|
|
|
271
266
|
logger.info(`Advancing to check current committee`);
|
|
272
267
|
await cheatCodes.debugRollup();
|
|
273
268
|
await cheatCodes.advanceToEpoch(
|
|
274
|
-
EpochNumber
|
|
269
|
+
EpochNumber((await cheatCodes.getEpoch()) + (await rollup.getLagInEpochsForValidatorSet()) + 1),
|
|
275
270
|
);
|
|
276
271
|
await cheatCodes.debugRollup();
|
|
277
272
|
|