@aztec/end-to-end 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f
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/README.md +27 -0
- package/dest/bench/client_flows/benchmark.d.ts +17 -2
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +38 -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 +132 -150
- 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 +33 -19
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +12 -10
- 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 +120 -117
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +30 -14
- 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 +122 -70
- package/dest/e2e_deploy_contract/deploy_test.d.ts +6 -5
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +20 -14
- package/dest/e2e_epochs/epochs_test.d.ts +39 -8
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +172 -51
- package/dest/e2e_fees/bridging_race.notest.js +3 -5
- package/dest/e2e_fees/fees_test.d.ts +18 -15
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +158 -143
- 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 +7 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +32 -41
- 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 +8 -6
- package/dest/e2e_p2p/p2p_network.d.ts +20 -17
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +167 -124
- 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 +206 -0
- package/dest/e2e_p2p/shared.d.ts +30 -12
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +88 -68
- 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 +20 -11
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +103 -93
- package/dest/fixtures/authwit_proxy.d.ts +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +34 -0
- package/dest/fixtures/e2e_prover_test.d.ts +15 -20
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +115 -135
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +78 -2
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +75 -1
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +5 -5
- 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 +116 -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/schnorr_hardcoded_account_contract.d.ts +25 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
- package/dest/fixtures/setup.d.ts +266 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +714 -0
- package/dest/fixtures/setup_p2p_test.d.ts +22 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +43 -32
- package/dest/fixtures/token_utils.d.ts +2 -2
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +7 -6
- 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/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- 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 +33 -29
- package/dest/shared/gas_portal_test_harness.d.ts +18 -5
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +20 -11
- package/dest/shared/index.d.ts +3 -2
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +4 -4
- 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 +88 -47
- package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
- package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
- package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
- package/dest/simulators/lending_simulator.d.ts +14 -3
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +28 -16
- package/dest/simulators/token_simulator.d.ts +1 -1
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +3 -24
- package/dest/spartan/setup_test_wallets.d.ts +15 -5
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +133 -43
- package/dest/spartan/tx_metrics.d.ts +68 -5
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +399 -19
- package/dest/spartan/utils/bot.d.ts +28 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +142 -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 +19 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +23 -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 +11 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +22 -0
- package/dest/spartan/utils/k8s.d.ts +128 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +381 -0
- package/dest/spartan/utils/nodes.d.ts +40 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- package/dest/spartan/utils/pod_logs.d.ts +25 -0
- package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
- package/dest/spartan/utils/pod_logs.js +74 -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 -231
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -853
- package/dest/test-wallet/test_wallet.d.ts +85 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +273 -0
- package/dest/test-wallet/utils.d.ts +41 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +66 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +48 -0
- package/dest/test-wallet/worker_wallet.d.ts +53 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +155 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +160 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +22 -0
- package/package.json +53 -45
- package/src/bench/client_flows/benchmark.ts +43 -2
- package/src/bench/client_flows/client_flows_benchmark.ts +189 -240
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +1 -1
- package/src/bench/utils.ts +38 -22
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +141 -152
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +166 -118
- package/src/e2e_deploy_contract/deploy_test.ts +24 -16
- package/src/e2e_epochs/epochs_test.ts +218 -94
- package/src/e2e_fees/bridging_race.notest.ts +4 -10
- package/src/e2e_fees/fees_test.ts +207 -230
- package/src/e2e_l1_publisher/write_json.ts +16 -16
- package/src/e2e_nested_contract/nested_contract_test.ts +38 -57
- package/src/e2e_p2p/inactivity_slash_test.ts +8 -6
- package/src/e2e_p2p/p2p_network.ts +239 -191
- package/src/e2e_p2p/reqresp/utils.ts +274 -0
- package/src/e2e_p2p/shared.ts +115 -86
- 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 +129 -117
- package/src/fixtures/authwit_proxy.ts +54 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +143 -185
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +97 -1
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +188 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +1037 -0
- package/src/fixtures/setup_p2p_test.ts +52 -52
- package/src/fixtures/token_utils.ts +7 -6
- package/src/fixtures/utils.ts +29 -907
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/guides/up_quick_start.sh +3 -5
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +112 -0
- 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 +34 -40
- package/src/shared/gas_portal_test_harness.ts +22 -12
- package/src/shared/index.ts +2 -1
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +11 -16
- package/src/shared/uniswap_l1_l2.ts +114 -108
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +34 -16
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +191 -29
- package/src/spartan/tx_metrics.ts +329 -25
- package/src/spartan/utils/bot.ts +188 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +29 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +71 -0
- package/src/spartan/utils/k8s.ts +535 -0
- package/src/spartan/utils/nodes.ts +543 -0
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -1077
- package/src/test-wallet/test_wallet.ts +376 -0
- package/src/test-wallet/utils.ts +108 -0
- package/src/test-wallet/wallet_worker_script.ts +60 -0
- package/src/test-wallet/worker_wallet.ts +218 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
- 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,4 +1,7 @@
|
|
|
1
|
+
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
+
import type { Archiver } from '@aztec/archiver';
|
|
1
3
|
import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
4
|
+
import { getAccountContractAddress } from '@aztec/aztec.js/account';
|
|
2
5
|
import { getTimestampRangeForEpoch } from '@aztec/aztec.js/block';
|
|
3
6
|
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
4
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
@@ -9,33 +12,34 @@ import { EpochCache } from '@aztec/epoch-cache';
|
|
|
9
12
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
10
13
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
11
14
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
12
|
-
import {
|
|
15
|
+
import { Delayer, createDelayer, waitUntilL1Timestamp, wrapClientWithDelayer } from '@aztec/ethereum/l1-tx-utils';
|
|
16
|
+
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
13
17
|
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
14
18
|
import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
15
19
|
import { SecretValue } from '@aztec/foundation/config';
|
|
16
20
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
17
|
-
import {
|
|
21
|
+
import { withLoggerBindings } from '@aztec/foundation/log/server';
|
|
18
22
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
19
23
|
import { sleep } from '@aztec/foundation/sleep';
|
|
20
24
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
25
|
+
import { TestContract } from '@aztec/noir-test-contracts.js/Test';
|
|
21
26
|
import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
|
|
22
|
-
import {
|
|
23
|
-
import type {
|
|
24
|
-
import {
|
|
25
|
-
type SequencerClient,
|
|
26
|
-
type SequencerEvents,
|
|
27
|
-
type SequencerPublisher,
|
|
28
|
-
SequencerState,
|
|
29
|
-
} from '@aztec/sequencer-client';
|
|
30
|
-
import type { TestSequencerClient } from '@aztec/sequencer-client/test';
|
|
27
|
+
import type { ProverNodeConfig } from '@aztec/prover-node';
|
|
28
|
+
import type { PXEConfig } from '@aztec/pxe/config';
|
|
29
|
+
import { type SequencerClient, type SequencerEvents, SequencerState } from '@aztec/sequencer-client';
|
|
31
30
|
import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
|
|
32
31
|
import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
33
32
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
33
|
+
import type { SlashingProtectionDatabase } from '@aztec/validator-ha-signer/types';
|
|
34
34
|
|
|
35
35
|
import { join } from 'path';
|
|
36
36
|
import type { Hex } from 'viem';
|
|
37
37
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
38
38
|
|
|
39
|
+
import {
|
|
40
|
+
SCHNORR_HARDCODED_PRIVATE_KEY,
|
|
41
|
+
SchnorrHardcodedKeyAccountContract,
|
|
42
|
+
} from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
39
43
|
import {
|
|
40
44
|
type EndToEndContext,
|
|
41
45
|
type SetupOptions,
|
|
@@ -43,13 +47,25 @@ import {
|
|
|
43
47
|
getPrivateKeyFromIndex,
|
|
44
48
|
setup,
|
|
45
49
|
} from '../fixtures/utils.js';
|
|
50
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
46
51
|
|
|
47
|
-
export const
|
|
52
|
+
export const WORLD_STATE_CHECKPOINT_HISTORY = 2;
|
|
48
53
|
export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
|
|
49
54
|
export const ARCHIVER_POLL_INTERVAL = 50;
|
|
50
55
|
export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
51
56
|
|
|
52
|
-
export type EpochsTestOpts = Partial<SetupOptions> & {
|
|
57
|
+
export type EpochsTestOpts = Partial<SetupOptions> & {
|
|
58
|
+
numberOfAccounts?: number;
|
|
59
|
+
pxeOpts?: Partial<PXEConfig>;
|
|
60
|
+
aztecSlotDurationInL1Slots?: number;
|
|
61
|
+
/** Skip creating/registering the hardcoded account during setup (for tests that handle accounts themselves). */
|
|
62
|
+
skipHardcodedAccount?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Force the hardcoded-account fast-path even when an initial sequencer is running. Useful for
|
|
65
|
+
* tests with tight per-block gas budgets that can't fit a full account-deploy tx.
|
|
66
|
+
*/
|
|
67
|
+
useHardcodedAccount?: boolean;
|
|
68
|
+
};
|
|
53
69
|
|
|
54
70
|
export type TrackedSequencerEvent = {
|
|
55
71
|
[K in keyof SequencerEvents]: Parameters<SequencerEvents[K]>[0] & {
|
|
@@ -75,7 +91,7 @@ export class EpochsTestContext {
|
|
|
75
91
|
public proverDelayer!: Delayer;
|
|
76
92
|
public sequencerDelayer!: Delayer;
|
|
77
93
|
|
|
78
|
-
public proverNodes:
|
|
94
|
+
public proverNodes: AztecNodeService[] = [];
|
|
79
95
|
public nodes: AztecNodeService[] = [];
|
|
80
96
|
|
|
81
97
|
public epochDuration!: number;
|
|
@@ -94,7 +110,7 @@ export class EpochsTestContext {
|
|
|
94
110
|
? parseInt(process.env.L1_BLOCK_TIME)
|
|
95
111
|
: DEFAULT_L1_BLOCK_TIME;
|
|
96
112
|
const ethereumSlotDuration = opts.ethereumSlotDuration ?? envEthereumSlotDuration;
|
|
97
|
-
const aztecSlotDuration = opts.aztecSlotDuration ??
|
|
113
|
+
const aztecSlotDuration = opts.aztecSlotDuration ?? (opts.aztecSlotDurationInL1Slots ?? 2) * ethereumSlotDuration;
|
|
98
114
|
const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
|
|
99
115
|
const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
|
|
100
116
|
const l1PublishingTime = opts.l1PublishingTime ?? 1;
|
|
@@ -119,34 +135,53 @@ export class EpochsTestContext {
|
|
|
119
135
|
this.L1_BLOCK_TIME_IN_S = ethereumSlotDuration;
|
|
120
136
|
this.L2_SLOT_DURATION_IN_S = aztecSlotDuration;
|
|
121
137
|
|
|
138
|
+
// Auto-create a hardcoded account funded via genesis when:
|
|
139
|
+
// - skipInitialSequencer is set (no sequencer to deploy on-chain), or
|
|
140
|
+
// - useHardcodedAccount is explicitly requested (e.g. tight per-block gas budgets that
|
|
141
|
+
// can't fit a full account-deploy tx).
|
|
142
|
+
const useHardcodedAccount = (opts.skipInitialSequencer || opts.useHardcodedAccount) && !opts.skipHardcodedAccount;
|
|
143
|
+
let hardcodedAccountData: InitialAccountData | undefined;
|
|
144
|
+
if (useHardcodedAccount) {
|
|
145
|
+
hardcodedAccountData = await EpochsTestContext.getHardcodedAccountData(Fr.random(), Fr.random());
|
|
146
|
+
}
|
|
147
|
+
|
|
122
148
|
// Set up system without any account nor protocol contracts
|
|
123
149
|
// 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
|
-
|
|
150
|
+
const context = await setup(
|
|
151
|
+
useHardcodedAccount ? 0 : (opts.numberOfAccounts ?? 0),
|
|
152
|
+
{
|
|
153
|
+
automineL1Setup: true,
|
|
154
|
+
checkIntervalMs: 50,
|
|
155
|
+
archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
|
|
156
|
+
worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
|
|
157
|
+
aztecEpochDuration,
|
|
158
|
+
aztecSlotDuration,
|
|
159
|
+
ethereumSlotDuration,
|
|
160
|
+
aztecProofSubmissionEpochs,
|
|
161
|
+
aztecTargetCommitteeSize: opts.initialValidators?.length ?? 0,
|
|
162
|
+
minTxsPerBlock: 0,
|
|
163
|
+
realProofs: false,
|
|
164
|
+
startProverNode: true,
|
|
165
|
+
proverTestDelayMs: opts.proverTestDelayMs ?? 0,
|
|
166
|
+
proverId: EthAddress.fromNumber(1),
|
|
167
|
+
worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
|
|
168
|
+
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
169
|
+
slasherEnabled: false,
|
|
170
|
+
l1PublishingTime,
|
|
171
|
+
...opts,
|
|
172
|
+
...(hardcodedAccountData ? { initialFundedAccounts: [hardcodedAccountData], numberOfAccounts: 0 } : {}),
|
|
173
|
+
},
|
|
174
|
+
// Use checkpointed chain tip for PXE by default to avoid issues with blocks being dropped due to pruned anchor blocks.
|
|
175
|
+
// Can be overridden via opts.pxeOpts.
|
|
176
|
+
{ syncChainTip: 'checkpointed', ...opts.pxeOpts },
|
|
177
|
+
);
|
|
148
178
|
|
|
149
179
|
this.context = context;
|
|
180
|
+
|
|
181
|
+
// Register the hardcoded account in PXE (local only, no on-chain deployment needed).
|
|
182
|
+
if (hardcodedAccountData) {
|
|
183
|
+
await this.registerHardcodedAccount(hardcodedAccountData);
|
|
184
|
+
}
|
|
150
185
|
this.proverNodes = context.proverNode ? [context.proverNode] : [];
|
|
151
186
|
this.nodes = context.aztecNode ? [context.aztecNode as AztecNodeService] : [];
|
|
152
187
|
this.logger = context.logger;
|
|
@@ -157,17 +192,8 @@ export class EpochsTestContext {
|
|
|
157
192
|
// Loop that tracks L1 and L2 block numbers and logs whenever there's a new one.
|
|
158
193
|
this.monitor = new ChainMonitor(this.rollup, context.dateProvider, this.logger).start();
|
|
159
194
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.proverDelayer = context.proverNode
|
|
163
|
-
? (((context.proverNode as TestProverNode).publisher as ProverNodePublisher).l1TxUtils as DelayedTxUtils).delayer!
|
|
164
|
-
: undefined!;
|
|
165
|
-
this.sequencerDelayer = context.sequencer
|
|
166
|
-
? (
|
|
167
|
-
((context.sequencer as TestSequencerClient).sequencer.publisher as SequencerPublisher)
|
|
168
|
-
.l1TxUtils as DelayedTxUtils
|
|
169
|
-
).delayer!
|
|
170
|
-
: undefined!;
|
|
195
|
+
this.proverDelayer = context.proverDelayer!;
|
|
196
|
+
this.sequencerDelayer = context.sequencerDelayer!;
|
|
171
197
|
|
|
172
198
|
if ((context.proverNode && !this.proverDelayer) || (context.sequencer && !this.sequencerDelayer)) {
|
|
173
199
|
throw new Error(`Could not find prover or sequencer delayer`);
|
|
@@ -182,6 +208,8 @@ export class EpochsTestContext {
|
|
|
182
208
|
l1GenesisTime: await this.rollup.getL1GenesisTime(),
|
|
183
209
|
ethereumSlotDuration,
|
|
184
210
|
proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
|
|
211
|
+
targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
|
|
212
|
+
rollupManaLimit: Number(await this.rollup.getManaLimit()),
|
|
185
213
|
};
|
|
186
214
|
|
|
187
215
|
this.logger.info(
|
|
@@ -196,23 +224,64 @@ export class EpochsTestContext {
|
|
|
196
224
|
await this.context.teardown();
|
|
197
225
|
}
|
|
198
226
|
|
|
227
|
+
/**
|
|
228
|
+
* Computes InitialAccountData for a SchnorrHardcodedKeyAccountContract.
|
|
229
|
+
* This contract has a hardcoded signing key and no initializer, so it can be used without
|
|
230
|
+
* on-chain deployment. Pass the returned data in `initialFundedAccounts` so the address
|
|
231
|
+
* gets funded with fee juice in genesis.
|
|
232
|
+
*/
|
|
233
|
+
public static async getHardcodedAccountData(secret: Fr, salt: Fr): Promise<InitialAccountData> {
|
|
234
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
235
|
+
const address = await getAccountContractAddress(contract, secret, salt);
|
|
236
|
+
const signingKey = SCHNORR_HARDCODED_PRIVATE_KEY;
|
|
237
|
+
return { secret, salt, signingKey, address };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Registers a SchnorrHardcodedKeyAccountContract in PXE. The account must have been funded
|
|
242
|
+
* at genesis (via getHardcodedAccountData). No on-chain deployment or block mining needed.
|
|
243
|
+
*/
|
|
244
|
+
public async registerHardcodedAccount(accountData: InitialAccountData) {
|
|
245
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
246
|
+
const wallet = this.context.wallet;
|
|
247
|
+
const accountManager = await (wallet as TestWallet).createAccount({
|
|
248
|
+
secret: accountData.secret,
|
|
249
|
+
salt: accountData.salt,
|
|
250
|
+
contract,
|
|
251
|
+
});
|
|
252
|
+
this.context.accounts = [accountManager.address];
|
|
253
|
+
return accountManager.address;
|
|
254
|
+
}
|
|
255
|
+
|
|
199
256
|
public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
|
|
200
257
|
this.logger.warn('Creating and syncing a simulated prover node...');
|
|
201
258
|
const proverNodePrivateKey = this.getNextPrivateKey();
|
|
202
|
-
const
|
|
203
|
-
const
|
|
259
|
+
const proverIndex = this.proverNodes.length + 1;
|
|
260
|
+
const { mockGossipSubNetwork } = this.context;
|
|
261
|
+
const { proverNode } = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
|
|
204
262
|
createAndSyncProverNode(
|
|
205
263
|
proverNodePrivateKey,
|
|
206
|
-
{ ...this.context.config },
|
|
207
264
|
{
|
|
208
|
-
|
|
209
|
-
|
|
265
|
+
...this.context.config,
|
|
266
|
+
p2pEnabled: this.context.config.p2pEnabled || mockGossipSubNetwork !== undefined,
|
|
267
|
+
proverId: EthAddress.fromNumber(proverIndex),
|
|
210
268
|
dontStart: opts.dontStart,
|
|
211
269
|
...opts,
|
|
212
270
|
},
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
271
|
+
{
|
|
272
|
+
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
dateProvider: this.context.dateProvider,
|
|
276
|
+
p2pClientDeps: {
|
|
277
|
+
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
278
|
+
rpcTxProviders: [this.context.aztecNode],
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
genesis: this.context.genesis,
|
|
283
|
+
dontStart: opts.dontStart,
|
|
284
|
+
},
|
|
216
285
|
),
|
|
217
286
|
);
|
|
218
287
|
this.proverNodes.push(proverNode);
|
|
@@ -226,26 +295,34 @@ export class EpochsTestContext {
|
|
|
226
295
|
|
|
227
296
|
public createValidatorNode(
|
|
228
297
|
privateKeys: `0x${string}`[],
|
|
229
|
-
opts: Partial<AztecNodeConfig> & {
|
|
298
|
+
opts: Partial<AztecNodeConfig> & {
|
|
299
|
+
dontStartSequencer?: boolean;
|
|
300
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
301
|
+
} = {},
|
|
230
302
|
) {
|
|
231
303
|
this.logger.warn('Creating and syncing a validator node...');
|
|
232
304
|
return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
|
|
233
305
|
}
|
|
234
306
|
|
|
235
307
|
private async createNode(
|
|
236
|
-
opts: Partial<AztecNodeConfig> & {
|
|
308
|
+
opts: Partial<AztecNodeConfig> & {
|
|
309
|
+
dontStartSequencer?: boolean;
|
|
310
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
311
|
+
} = {},
|
|
237
312
|
) {
|
|
238
|
-
const
|
|
313
|
+
const nodeIndex = this.nodes.length + 1;
|
|
314
|
+
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
239
315
|
const { mockGossipSubNetwork } = this.context;
|
|
240
316
|
const resolvedConfig = { ...this.context.config, ...opts };
|
|
241
317
|
const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
|
|
242
318
|
const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
|
|
243
|
-
const node = await
|
|
319
|
+
const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
|
|
244
320
|
AztecNodeService.createAndSync(
|
|
245
321
|
{
|
|
246
322
|
...resolvedConfig,
|
|
247
323
|
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
248
324
|
validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
|
|
325
|
+
nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
|
|
249
326
|
p2pEnabled,
|
|
250
327
|
p2pIp,
|
|
251
328
|
},
|
|
@@ -254,34 +331,15 @@ export class EpochsTestContext {
|
|
|
254
331
|
p2pClientDeps: {
|
|
255
332
|
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
256
333
|
},
|
|
334
|
+
slashingProtectionDb: opts.slashingProtectionDb,
|
|
257
335
|
},
|
|
258
336
|
{
|
|
259
|
-
|
|
337
|
+
genesis: this.context.genesis,
|
|
260
338
|
...opts,
|
|
261
339
|
},
|
|
262
340
|
),
|
|
263
341
|
);
|
|
264
342
|
|
|
265
|
-
// REFACTOR: We're getting too much into the internals of the sequencer here.
|
|
266
|
-
// We should have a single method for constructing an aztec node that returns a TestAztecNodeService
|
|
267
|
-
// which directly exposes the delayer and sets any test config.
|
|
268
|
-
if (opts.txDelayerMaxInclusionTimeIntoSlot !== undefined) {
|
|
269
|
-
this.logger.info(
|
|
270
|
-
`Setting tx delayer max inclusion time into slot to ${opts.txDelayerMaxInclusionTimeIntoSlot} seconds`,
|
|
271
|
-
);
|
|
272
|
-
// Here we reach into the sequencer and hook in a tx delayer. The problem is that the sequencer's l1 utils only uses a public client, not a wallet.
|
|
273
|
-
// The delayer needs a wallet (a client that can sign), so we have to create one here.
|
|
274
|
-
const l1Client = createExtendedL1Client(
|
|
275
|
-
resolvedConfig.l1RpcUrls!,
|
|
276
|
-
resolvedConfig.publisherPrivateKeys![0]!.getValue(),
|
|
277
|
-
);
|
|
278
|
-
const sequencer = node.getSequencer() as TestSequencerClient;
|
|
279
|
-
const publisher = sequencer.sequencer.publisher;
|
|
280
|
-
const delayed = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, this.L1_BLOCK_TIME_IN_S, l1Client);
|
|
281
|
-
delayed.delayer!.setMaxInclusionTimeIntoSlot(opts.txDelayerMaxInclusionTimeIntoSlot);
|
|
282
|
-
publisher.l1TxUtils = delayed;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
343
|
this.nodes.push(node);
|
|
286
344
|
return node;
|
|
287
345
|
}
|
|
@@ -333,7 +391,10 @@ export class EpochsTestContext {
|
|
|
333
391
|
this.logger.info(`Waiting until last slot of submission window for epoch ${epochNumber} at ${date}`, {
|
|
334
392
|
oneSlotBefore,
|
|
335
393
|
});
|
|
336
|
-
|
|
394
|
+
// Use a timeout that accounts for the full proof submission window
|
|
395
|
+
const proofSubmissionWindowDuration =
|
|
396
|
+
this.constants.proofSubmissionEpochs * this.epochDuration * this.L2_SLOT_DURATION_IN_S;
|
|
397
|
+
await waitUntilL1Timestamp(this.l1Client, oneSlotBefore, undefined, proofSubmissionWindowDuration * 2);
|
|
337
398
|
}
|
|
338
399
|
|
|
339
400
|
/** Waits for the aztec node to sync to the target block number. */
|
|
@@ -344,11 +405,11 @@ export class EpochsTestContext {
|
|
|
344
405
|
await sleep(waitTime);
|
|
345
406
|
const [syncState, tips] = await Promise.all([
|
|
346
407
|
this.context.aztecNode.getWorldStateSyncStatus(),
|
|
347
|
-
await this.context.aztecNode.
|
|
408
|
+
await this.context.aztecNode.getChainTips(),
|
|
348
409
|
]);
|
|
349
410
|
this.logger.info(`Wait for node synch ${blockNumber} ${type}`, { blockNumber, type, syncState, tips });
|
|
350
411
|
if (type === 'proven') {
|
|
351
|
-
synched = tips.proven.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
|
|
412
|
+
synched = tips.proven.block.number >= blockNumber && syncState.latestBlockNumber >= blockNumber;
|
|
352
413
|
} else if (type === 'finalized') {
|
|
353
414
|
synched = syncState.finalizedBlockNumber >= blockNumber;
|
|
354
415
|
} else {
|
|
@@ -370,17 +431,28 @@ export class EpochsTestContext {
|
|
|
370
431
|
return SpamContract.at(instance.address, wallet);
|
|
371
432
|
}
|
|
372
433
|
|
|
434
|
+
/** Registers the TestContract on the given wallet. */
|
|
435
|
+
public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
|
|
436
|
+
const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
|
|
437
|
+
constructorArgs: [],
|
|
438
|
+
constructorArtifact: undefined,
|
|
439
|
+
salt,
|
|
440
|
+
publicKeys: undefined,
|
|
441
|
+
deployer: undefined,
|
|
442
|
+
});
|
|
443
|
+
await wallet.registerContract(instance, TestContract.artifact);
|
|
444
|
+
return TestContract.at(instance.address, wallet);
|
|
445
|
+
}
|
|
446
|
+
|
|
373
447
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
|
|
374
448
|
public async createL1Client() {
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
this.l1Client.chain,
|
|
380
|
-
),
|
|
381
|
-
this.context.dateProvider!,
|
|
382
|
-
{ ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S },
|
|
449
|
+
const rawClient = createExtendedL1Client(
|
|
450
|
+
[...this.l1Client.chain.rpcUrls.default.http],
|
|
451
|
+
privateKeyToAccount(this.getNextPrivateKey()),
|
|
452
|
+
this.l1Client.chain,
|
|
383
453
|
);
|
|
454
|
+
const delayer = createDelayer(this.context.dateProvider, { ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S }, {});
|
|
455
|
+
const client = wrapClientWithDelayer(rawClient, delayer);
|
|
384
456
|
expect(await client.getBalance({ address: client.account.address })).toBeGreaterThan(0n);
|
|
385
457
|
return { client, delayer };
|
|
386
458
|
}
|
|
@@ -397,9 +469,42 @@ export class EpochsTestContext {
|
|
|
397
469
|
expect(result).toBe(expectedSuccess);
|
|
398
470
|
}
|
|
399
471
|
|
|
472
|
+
/** Verifies at least one checkpoint has the target number of blocks (for MBPS validation). */
|
|
473
|
+
public async assertMultipleBlocksPerSlot(targetBlockCount: number) {
|
|
474
|
+
const archiver = (this.context.aztecNode as AztecNodeService).getBlockSource() as Archiver;
|
|
475
|
+
const checkpoints = await archiver.getCheckpoints({ from: CheckpointNumber(1), limit: 50 });
|
|
476
|
+
|
|
477
|
+
this.logger.warn(`Retrieved ${checkpoints.length} checkpoints from archiver`, {
|
|
478
|
+
checkpoints: checkpoints.map(pc => pc.checkpoint.getStats()),
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
|
|
482
|
+
let targetFound = false;
|
|
483
|
+
|
|
484
|
+
for (const checkpoint of checkpoints) {
|
|
485
|
+
const blockCount = checkpoint.checkpoint.blocks.length;
|
|
486
|
+
targetFound = targetFound || blockCount >= targetBlockCount;
|
|
487
|
+
|
|
488
|
+
this.logger.verbose(`Checkpoint ${checkpoint.checkpoint.number} has ${blockCount} blocks`, {
|
|
489
|
+
checkpoint: checkpoint.checkpoint.getStats(),
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
for (let i = 0; i < blockCount; i++) {
|
|
493
|
+
const block = checkpoint.checkpoint.blocks[i];
|
|
494
|
+
expect(block.indexWithinCheckpoint).toBe(i);
|
|
495
|
+
expect(block.checkpointNumber).toBe(checkpoint.checkpoint.number);
|
|
496
|
+
expect(block.number).toBe(expectedBlockNumber);
|
|
497
|
+
expectedBlockNumber++;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
expect(targetFound).toBe(true);
|
|
502
|
+
}
|
|
503
|
+
|
|
400
504
|
public watchSequencerEvents(
|
|
401
505
|
sequencers: SequencerClient[],
|
|
402
506
|
getMetadata: (i: number) => Record<string, any> = () => ({}),
|
|
507
|
+
additionalFailEventKeys: (keyof SequencerEvents)[] = [],
|
|
403
508
|
) {
|
|
404
509
|
const stateChanges: TrackedSequencerEvent[] = [];
|
|
405
510
|
const failEvents: TrackedSequencerEvent[] = [];
|
|
@@ -410,6 +515,11 @@ export class EpochsTestContext {
|
|
|
410
515
|
'block-build-failed',
|
|
411
516
|
'checkpoint-publish-failed',
|
|
412
517
|
'proposer-rollup-check-failed',
|
|
518
|
+
'checkpoint-error',
|
|
519
|
+
'checkpoint-publish-failed',
|
|
520
|
+
'header-validation-failed',
|
|
521
|
+
'pipelined-checkpoint-discarded',
|
|
522
|
+
...additionalFailEventKeys,
|
|
413
523
|
];
|
|
414
524
|
|
|
415
525
|
const makeEvent = (
|
|
@@ -439,6 +549,13 @@ export class EpochsTestContext {
|
|
|
439
549
|
});
|
|
440
550
|
failEventsKeys.forEach(eventName => {
|
|
441
551
|
sequencer.getSequencer().on(eventName, (args: Parameters<SequencerEvents[typeof eventName]>[0]) => {
|
|
552
|
+
// Skip benign block-build-failed events where the builder rejected the block because it
|
|
553
|
+
// could not collect enough valid txs. This is the same "not enough txs" case as
|
|
554
|
+
// block-tx-count-check-failed (which is already excluded above), just detected after we
|
|
555
|
+
// started processing txs rather than before.
|
|
556
|
+
if (eventName === 'block-build-failed' && (args as { reason?: string }).reason === 'Insufficient valid txs') {
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
442
559
|
const evt = makeEvent(i, eventName, args);
|
|
443
560
|
failEvents.push(evt);
|
|
444
561
|
this.logger.error(`Failed event ${eventName} from sequencer ${sequencerIndex}`, undefined, evt);
|
|
@@ -448,4 +565,11 @@ export class EpochsTestContext {
|
|
|
448
565
|
|
|
449
566
|
return { failEvents, stateChanges };
|
|
450
567
|
}
|
|
568
|
+
|
|
569
|
+
public assertNoFailuresFromSequencers(failEvents: TrackedSequencerEvent[]) {
|
|
570
|
+
if (failEvents.length > 0) {
|
|
571
|
+
this.logger.error(`Failed events from sequencers`, failEvents);
|
|
572
|
+
}
|
|
573
|
+
expect(failEvents).toEqual([]);
|
|
574
|
+
}
|
|
451
575
|
}
|
|
@@ -4,11 +4,11 @@ import type { Logger } from '@aztec/aztec.js/log';
|
|
|
4
4
|
import { Fq } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
6
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
8
7
|
|
|
9
8
|
import { jest } from '@jest/globals';
|
|
10
9
|
import type { Hex } from 'viem';
|
|
11
10
|
|
|
11
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
12
12
|
import { FeesTest } from './fees_test.js';
|
|
13
13
|
|
|
14
14
|
jest.setTimeout(300_000);
|
|
@@ -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
|
});
|