@aztec/end-to-end 0.0.1-commit.e558bd1c → 0.0.1-commit.e57c76e
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 +15 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +17 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +3 -3
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +36 -39
- 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/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +8 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +8 -5
- 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 +36 -17
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +16 -5
- 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 +39 -7
- package/dest/e2e_deploy_contract/deploy_test.d.ts +4 -4
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +2 -1
- package/dest/e2e_epochs/epochs_test.d.ts +33 -8
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +143 -44
- package/dest/e2e_fees/fees_test.d.ts +6 -3
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +50 -17
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +3 -3
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +6 -7
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +4 -3
- package/dest/e2e_p2p/p2p_network.d.ts +14 -12
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +70 -34
- package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
- package/dest/e2e_p2p/reqresp/utils.js +67 -14
- package/dest/e2e_p2p/shared.d.ts +37 -8
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +88 -51
- 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 +6 -4
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +23 -11
- 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 +9 -8
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +39 -50
- 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 +74 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +71 -0
- 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 +2 -2
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +4 -2
- 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 +86 -32
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +209 -169
- package/dest/fixtures/setup_p2p_test.d.ts +14 -7
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +18 -15
- 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 +5 -7
- package/dest/fixtures/utils.d.ts +2 -2
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +1 -1
- 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/shared/cross_chain_test_harness.d.ts +4 -2
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +22 -18
- package/dest/shared/gas_portal_test_harness.d.ts +8 -5
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +19 -10
- package/dest/shared/index.d.ts +2 -1
- 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 +2 -2
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +56 -41
- 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 +10 -3
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +26 -14
- 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 +12 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +108 -41
- package/dest/spartan/tx_metrics.d.ts +18 -4
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +74 -21
- package/dest/spartan/utils/bot.d.ts +3 -2
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +2 -1
- package/dest/spartan/utils/config.d.ts +10 -30
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +3 -1
- package/dest/spartan/utils/index.d.ts +4 -2
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +5 -1
- package/dest/spartan/utils/k8s.d.ts +3 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +6 -0
- package/dest/spartan/utils/nodes.d.ts +4 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +11 -11
- 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/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 +53 -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 +49 -45
- package/src/bench/client_flows/benchmark.ts +19 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +64 -49
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +10 -4
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +52 -25
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +53 -15
- package/src/e2e_deploy_contract/deploy_test.ts +6 -5
- package/src/e2e_epochs/epochs_test.ts +166 -68
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +57 -32
- package/src/e2e_nested_contract/nested_contract_test.ts +10 -6
- package/src/e2e_p2p/inactivity_slash_test.ts +8 -7
- package/src/e2e_p2p/p2p_network.ts +93 -49
- package/src/e2e_p2p/reqresp/utils.ts +84 -17
- package/src/e2e_p2p/shared.ts +108 -65
- 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 +38 -11
- 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 +49 -56
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +93 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +7 -3
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +272 -233
- package/src/fixtures/setup_p2p_test.ts +21 -25
- package/src/fixtures/token_utils.ts +3 -3
- package/src/fixtures/utils.ts +2 -0
- 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/shared/cross_chain_test_harness.ts +27 -13
- package/src/shared/gas_portal_test_harness.ts +21 -11
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +3 -2
- package/src/shared/uniswap_l1_l2.ts +104 -53
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +32 -14
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +146 -35
- package/src/spartan/tx_metrics.ts +82 -24
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +2 -0
- package/src/spartan/utils/index.ts +7 -0
- package/src/spartan/utils/k8s.ts +8 -0
- package/src/spartan/utils/nodes.ts +17 -12
- package/src/spartan/utils/pod_logs.ts +99 -0
- 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 +63 -0
- package/src/test-wallet/worker_wallet.ts +218 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
3
3
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
4
|
-
import { CheatCodes } from '@aztec/aztec/testing';
|
|
4
|
+
import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
|
|
5
5
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
6
6
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
7
7
|
import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
@@ -20,15 +20,15 @@ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
|
20
20
|
import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
|
|
21
21
|
import { GasSettings } from '@aztec/stdlib/gas';
|
|
22
22
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
23
|
-
import { TestWallet } from '@aztec/test-wallet/server';
|
|
24
23
|
|
|
25
24
|
import { getContract } from 'viem';
|
|
26
25
|
|
|
27
|
-
import { MNEMONIC } from '../fixtures/fixtures.js';
|
|
26
|
+
import { MNEMONIC, getPaddedMaxFeesPerGas } from '../fixtures/fixtures.js';
|
|
28
27
|
import {
|
|
29
28
|
type EndToEndContext,
|
|
30
29
|
type SetupOptions,
|
|
31
30
|
deployAccounts,
|
|
31
|
+
ensureAuthRegistryPublished,
|
|
32
32
|
publicDeployAccounts,
|
|
33
33
|
setup,
|
|
34
34
|
teardown,
|
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
import { mintTokensToPrivate } from '../fixtures/token_utils.js';
|
|
37
37
|
import { type BalancesFn, getBalancesFn, setupSponsoredFPC } from '../fixtures/utils.js';
|
|
38
38
|
import { FeeJuicePortalTestingHarnessFactory, type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.js';
|
|
39
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
39
40
|
|
|
40
41
|
/**
|
|
41
42
|
* Test fixture for testing fees. Provides the following setup steps:
|
|
@@ -84,6 +85,8 @@ export class FeesTest {
|
|
|
84
85
|
public getBananaPublicBalanceFn!: BalancesFn;
|
|
85
86
|
public getBananaPrivateBalanceFn!: BalancesFn;
|
|
86
87
|
public getProverFee!: (blockNumber: BlockNumber) => Promise<bigint>;
|
|
88
|
+
public getCommittedProverFee!: (blockNumber: BlockNumber) => Promise<bigint>;
|
|
89
|
+
public getCommittedBurn!: (blockNumber: BlockNumber) => Promise<bigint>;
|
|
87
90
|
|
|
88
91
|
public readonly ALICE_INITIAL_BANANAS = BigInt(1e22);
|
|
89
92
|
public readonly SUBSCRIPTION_AMOUNT = BigInt(1e19);
|
|
@@ -102,18 +105,22 @@ export class FeesTest {
|
|
|
102
105
|
this.logger = createLogger(`e2e:e2e_fees:${testName}`);
|
|
103
106
|
}
|
|
104
107
|
|
|
105
|
-
async setup() {
|
|
108
|
+
async setup(opts: Partial<SetupOptions> = {}) {
|
|
106
109
|
this.logger.verbose('Setting up fresh context...');
|
|
110
|
+
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
111
|
+
const tokenAllowList = await getTokenAllowedSetupFunctions();
|
|
107
112
|
this.context = await setup(0, {
|
|
108
113
|
startProverNode: true,
|
|
109
114
|
...this.setupOptions,
|
|
115
|
+
...opts,
|
|
110
116
|
fundSponsoredFPC: true,
|
|
111
117
|
skipAccountDeployment: true,
|
|
112
118
|
l1ContractsArgs: { ...this.setupOptions },
|
|
119
|
+
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
113
120
|
});
|
|
114
121
|
|
|
115
122
|
this.rollupContract = RollupContract.getFromConfig(this.context.config);
|
|
116
|
-
this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider
|
|
123
|
+
this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider, this.logger, 200).start();
|
|
117
124
|
|
|
118
125
|
await this.applyBaseSetup();
|
|
119
126
|
|
|
@@ -126,12 +133,12 @@ export class FeesTest {
|
|
|
126
133
|
}
|
|
127
134
|
|
|
128
135
|
setIsMarkingAsProven(b: boolean) {
|
|
129
|
-
this.context.watcher
|
|
136
|
+
this.context.watcher.setIsMarkingAsProven(b);
|
|
130
137
|
}
|
|
131
138
|
|
|
132
139
|
async catchUpProvenChain() {
|
|
133
140
|
const bn = await this.aztecNode.getBlockNumber();
|
|
134
|
-
while ((await this.aztecNode.
|
|
141
|
+
while ((await this.aztecNode.getBlockNumber('proven')) < bn) {
|
|
135
142
|
await sleep(1000);
|
|
136
143
|
}
|
|
137
144
|
}
|
|
@@ -157,25 +164,31 @@ export class FeesTest {
|
|
|
157
164
|
|
|
158
165
|
/** Alice mints bananaCoin tokens privately to the target address and redeems them. */
|
|
159
166
|
async mintPrivateBananas(amount: bigint, address: AztecAddress) {
|
|
160
|
-
const balanceBefore = await this.bananaCoin.methods
|
|
167
|
+
const { result: balanceBefore } = await this.bananaCoin.methods
|
|
161
168
|
.balance_of_private(address)
|
|
162
|
-
.simulate({ from:
|
|
169
|
+
.simulate({ from: address });
|
|
163
170
|
|
|
164
171
|
await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
|
|
165
172
|
|
|
166
|
-
const balanceAfter = await this.bananaCoin.methods
|
|
173
|
+
const { result: balanceAfter } = await this.bananaCoin.methods
|
|
167
174
|
.balance_of_private(address)
|
|
168
|
-
.simulate({ from:
|
|
175
|
+
.simulate({ from: address });
|
|
169
176
|
expect(balanceAfter).toEqual(balanceBefore + amount);
|
|
170
177
|
}
|
|
171
178
|
|
|
172
179
|
public async applyBaseSetup() {
|
|
173
180
|
await this.applyInitialAccounts();
|
|
181
|
+
await this.applyEnsureAuthRegistryPublished();
|
|
174
182
|
await this.applyPublicDeployAccounts();
|
|
175
183
|
await this.applySetupFeeJuice();
|
|
176
184
|
await this.applyDeployBananaToken();
|
|
177
185
|
}
|
|
178
186
|
|
|
187
|
+
async applyEnsureAuthRegistryPublished() {
|
|
188
|
+
this.logger.info('Ensuring AuthRegistry published');
|
|
189
|
+
await ensureAuthRegistryPublished(this.wallet, this.aliceAddress);
|
|
190
|
+
}
|
|
191
|
+
|
|
179
192
|
async applyInitialAccounts() {
|
|
180
193
|
this.logger.info('Applying initial accounts setup');
|
|
181
194
|
|
|
@@ -188,9 +201,11 @@ export class FeesTest {
|
|
|
188
201
|
});
|
|
189
202
|
|
|
190
203
|
this.wallet = this.context.wallet;
|
|
191
|
-
this.aztecNode = this.context.aztecNodeService
|
|
192
|
-
this.aztecNodeAdmin = this.context.aztecNodeService
|
|
193
|
-
this.gasSettings = GasSettings.
|
|
204
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
205
|
+
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
206
|
+
this.gasSettings = GasSettings.fallback({
|
|
207
|
+
maxFeesPerGas: await getPaddedMaxFeesPerGas(this.aztecNode),
|
|
208
|
+
});
|
|
194
209
|
this.cheatCodes = this.context.cheatCodes;
|
|
195
210
|
this.accounts = deployedAccounts.map(a => a.address);
|
|
196
211
|
this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
|
|
@@ -213,16 +228,11 @@ export class FeesTest {
|
|
|
213
228
|
|
|
214
229
|
this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
|
|
215
230
|
|
|
216
|
-
this.getGasBalanceFn = getBalancesFn(
|
|
217
|
-
'⛽',
|
|
218
|
-
this.feeJuiceContract.methods.balance_of_public,
|
|
219
|
-
this.aliceAddress,
|
|
220
|
-
this.logger,
|
|
221
|
-
);
|
|
231
|
+
this.getGasBalanceFn = getBalancesFn('⛽', this.feeJuiceContract.methods.balance_of_public, this.logger);
|
|
222
232
|
|
|
223
233
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
224
|
-
aztecNode: this.context.aztecNodeService
|
|
225
|
-
aztecNodeAdmin: this.context.aztecNodeService
|
|
234
|
+
aztecNode: this.context.aztecNodeService,
|
|
235
|
+
aztecNodeAdmin: this.context.aztecNodeService,
|
|
226
236
|
l1Client: this.context.deployL1ContractsValues.l1Client,
|
|
227
237
|
wallet: this.wallet,
|
|
228
238
|
logger: this.logger,
|
|
@@ -232,22 +242,16 @@ export class FeesTest {
|
|
|
232
242
|
async applyDeployBananaToken() {
|
|
233
243
|
this.logger.info('Applying deploy banana token setup');
|
|
234
244
|
|
|
235
|
-
const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
|
|
245
|
+
const { contract: bananaCoin } = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
|
|
236
246
|
from: this.aliceAddress,
|
|
237
247
|
});
|
|
238
248
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
239
249
|
|
|
240
250
|
this.bananaCoin = bananaCoin;
|
|
241
|
-
this.getBananaPublicBalanceFn = getBalancesFn(
|
|
242
|
-
'🍌.public',
|
|
243
|
-
this.bananaCoin.methods.balance_of_public,
|
|
244
|
-
this.aliceAddress,
|
|
245
|
-
this.logger,
|
|
246
|
-
);
|
|
251
|
+
this.getBananaPublicBalanceFn = getBalancesFn('🍌.public', this.bananaCoin.methods.balance_of_public, this.logger);
|
|
247
252
|
this.getBananaPrivateBalanceFn = getBalancesFn(
|
|
248
253
|
'🍌.private',
|
|
249
254
|
this.bananaCoin.methods.balance_of_private,
|
|
250
|
-
this.aliceAddress,
|
|
251
255
|
this.logger,
|
|
252
256
|
);
|
|
253
257
|
}
|
|
@@ -259,7 +263,7 @@ export class FeesTest {
|
|
|
259
263
|
expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
260
264
|
|
|
261
265
|
const bananaCoin = this.bananaCoin;
|
|
262
|
-
const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
|
|
266
|
+
const { contract: bananaFPC } = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
|
|
263
267
|
from: this.aliceAddress,
|
|
264
268
|
});
|
|
265
269
|
|
|
@@ -290,7 +294,7 @@ export class FeesTest {
|
|
|
290
294
|
|
|
291
295
|
// @todo @lherskind As we deal with #13601
|
|
292
296
|
// Right now the value is from `FeeLib.sol`
|
|
293
|
-
const L1_GAS_PER_EPOCH_VERIFIED =
|
|
297
|
+
const L1_GAS_PER_EPOCH_VERIFIED = 3600000n;
|
|
294
298
|
|
|
295
299
|
// We round up
|
|
296
300
|
const mulDiv = (a: bigint, b: bigint, c: bigint) => (a * b) / c + ((a * b) % c > 0n ? 1n : 0n);
|
|
@@ -308,6 +312,27 @@ export class FeesTest {
|
|
|
308
312
|
const mana = block!.header.totalManaUsed.toBigInt();
|
|
309
313
|
return mulDiv(mana * proverCost, 10n ** 12n, price);
|
|
310
314
|
};
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Reads the prover fee that the rollup actually committed for the block's checkpoint, which is what
|
|
318
|
+
* RewardLib uses to pay prover rewards. Unlike `getProverFee`, this does not re-derive the value
|
|
319
|
+
* from current L1 fees or current eth-per-fee-asset price, so it is robust to pipelined fee-asset-price
|
|
320
|
+
* drift between propose-time and reward-payout-time.
|
|
321
|
+
*/
|
|
322
|
+
this.getCommittedProverFee = async (blockNumber: BlockNumber) => {
|
|
323
|
+
const block = await this.aztecNode.getBlock(blockNumber);
|
|
324
|
+
const feeHeader = await this.rollupContract.getFeeHeader(BigInt(block!.checkpointNumber));
|
|
325
|
+
return feeHeader.manaUsed * feeHeader.proverCost;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// RewardLib computes sequencerFee = checkpointFee - burn - proverFee where burn = manaUsed * congestionCost.
|
|
329
|
+
// The fixture's typical case keeps congestionCost at zero, but reading it explicitly avoids latent bugs
|
|
330
|
+
// when test load changes excess mana.
|
|
331
|
+
this.getCommittedBurn = async (blockNumber: BlockNumber) => {
|
|
332
|
+
const block = await this.aztecNode.getBlock(blockNumber);
|
|
333
|
+
const feeHeader = await this.rollupContract.getFeeHeader(BigInt(block!.checkpointNumber));
|
|
334
|
+
return feeHeader.manaUsed * feeHeader.congestionCost;
|
|
335
|
+
};
|
|
311
336
|
}
|
|
312
337
|
|
|
313
338
|
public async applySponsoredFPCSetup() {
|
|
@@ -7,6 +7,7 @@ import { ParentContract } from '@aztec/noir-test-contracts.js/Parent';
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
type EndToEndContext,
|
|
10
|
+
type SetupOptions,
|
|
10
11
|
deployAccounts,
|
|
11
12
|
publicDeployAccounts,
|
|
12
13
|
setup,
|
|
@@ -44,15 +45,16 @@ export class NestedContractTest {
|
|
|
44
45
|
});
|
|
45
46
|
this.wallet = this.context.wallet;
|
|
46
47
|
[{ address: this.defaultAccountAddress }] = deployedAccounts;
|
|
47
|
-
this.aztecNode = this.context.aztecNodeService
|
|
48
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
48
49
|
|
|
49
50
|
this.logger.info('Public deploy accounts');
|
|
50
51
|
await publicDeployAccounts(this.wallet, [this.defaultAccountAddress]);
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
async setup() {
|
|
54
|
+
async setup(opts: Partial<SetupOptions> = {}) {
|
|
54
55
|
this.logger.info('Setting up fresh subsystems');
|
|
55
56
|
this.context = await setup(0, {
|
|
57
|
+
...opts,
|
|
56
58
|
fundSponsoredFPC: true,
|
|
57
59
|
skipAccountDeployment: true,
|
|
58
60
|
});
|
|
@@ -65,9 +67,11 @@ export class NestedContractTest {
|
|
|
65
67
|
|
|
66
68
|
async applyManual() {
|
|
67
69
|
this.logger.info('Deploying parent and child contracts');
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
this.childContract =
|
|
70
|
+
({ contract: this.parentContract } = await ParentContract.deploy(this.wallet).send({
|
|
71
|
+
from: this.defaultAccountAddress,
|
|
72
|
+
}));
|
|
73
|
+
({ contract: this.childContract } = await ChildContract.deploy(this.wallet).send({
|
|
74
|
+
from: this.defaultAccountAddress,
|
|
75
|
+
}));
|
|
72
76
|
}
|
|
73
77
|
}
|
|
@@ -58,6 +58,8 @@ export class P2PInactivityTest {
|
|
|
58
58
|
basePort: BOOT_NODE_UDP_PORT,
|
|
59
59
|
startProverNode: true,
|
|
60
60
|
initialConfig: {
|
|
61
|
+
inboxLag: 2,
|
|
62
|
+
anvilSlotsInAnEpoch: 4,
|
|
61
63
|
proverNodeConfig: { proverNodeEpochProvingDelayMs: AZTEC_SLOT_DURATION * 1000 },
|
|
62
64
|
aztecTargetCommitteeSize: COMMITTEE_SIZE,
|
|
63
65
|
aztecSlotDuration: AZTEC_SLOT_DURATION,
|
|
@@ -66,7 +68,6 @@ export class P2PInactivityTest {
|
|
|
66
68
|
listenAddress: '127.0.0.1',
|
|
67
69
|
minTxsPerBlock: 0,
|
|
68
70
|
aztecEpochDuration: EPOCH_DURATION,
|
|
69
|
-
validatorReexecute: false,
|
|
70
71
|
sentinelEnabled: true,
|
|
71
72
|
slashingQuorum: SLASHING_QUORUM,
|
|
72
73
|
slashingRoundSizeInEpochs: SLASHING_ROUND_SIZE_IN_EPOCHS,
|
|
@@ -98,17 +99,17 @@ export class P2PInactivityTest {
|
|
|
98
99
|
this.rollup = rollup;
|
|
99
100
|
|
|
100
101
|
if (!this.keepInitialNode) {
|
|
101
|
-
await this.test.ctx.aztecNodeService
|
|
102
|
+
await this.test.ctx.aztecNodeService.stop();
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
// Create all active nodes
|
|
105
106
|
this.activeNodes = await createNodes(
|
|
106
107
|
this.test.ctx.aztecNodeConfig,
|
|
107
|
-
this.test.ctx.dateProvider
|
|
108
|
+
this.test.ctx.dateProvider,
|
|
108
109
|
this.test.bootstrapNodeEnr,
|
|
109
110
|
NUM_NODES - this.inactiveNodeCount - Number(this.keepInitialNode),
|
|
110
111
|
BOOT_NODE_UDP_PORT,
|
|
111
|
-
this.test.
|
|
112
|
+
this.test.genesis,
|
|
112
113
|
this.dataDir,
|
|
113
114
|
undefined,
|
|
114
115
|
Number(this.keepInitialNode),
|
|
@@ -118,18 +119,18 @@ export class P2PInactivityTest {
|
|
|
118
119
|
const inactiveConfig = { ...this.test.ctx.aztecNodeConfig, dontStartSequencer: true };
|
|
119
120
|
this.inactiveNodes = await createNodes(
|
|
120
121
|
inactiveConfig,
|
|
121
|
-
this.test.ctx.dateProvider
|
|
122
|
+
this.test.ctx.dateProvider,
|
|
122
123
|
this.test.bootstrapNodeEnr,
|
|
123
124
|
this.inactiveNodeCount,
|
|
124
125
|
BOOT_NODE_UDP_PORT,
|
|
125
|
-
this.test.
|
|
126
|
+
this.test.genesis,
|
|
126
127
|
this.dataDir,
|
|
127
128
|
undefined,
|
|
128
129
|
NUM_NODES - this.inactiveNodeCount,
|
|
129
130
|
);
|
|
130
131
|
|
|
131
132
|
this.nodes = [
|
|
132
|
-
...(this.keepInitialNode ? [this.test.ctx.aztecNodeService
|
|
133
|
+
...(this.keepInitialNode ? [this.test.ctx.aztecNodeService] : []),
|
|
133
134
|
...this.activeNodes,
|
|
134
135
|
...this.inactiveNodes,
|
|
135
136
|
];
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
2
|
import type { AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
3
|
+
import { getAccountContractAddress } from '@aztec/aztec.js/account';
|
|
3
4
|
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
4
5
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
5
6
|
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
6
|
-
import {
|
|
7
|
-
type EmpireSlashingProposerContract,
|
|
8
|
-
GSEContract,
|
|
9
|
-
RollupContract,
|
|
10
|
-
type TallySlashingProposerContract,
|
|
11
|
-
} from '@aztec/ethereum/contracts';
|
|
7
|
+
import { GSEContract, RollupContract, type SlashingProposerContract } from '@aztec/ethereum/contracts';
|
|
12
8
|
import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
9
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
14
10
|
import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
|
|
15
|
-
import {
|
|
11
|
+
import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
16
12
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
17
13
|
import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
|
|
18
14
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
@@ -24,20 +20,22 @@ import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
|
24
20
|
import type { BootstrapNode } from '@aztec/p2p/bootstrap';
|
|
25
21
|
import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
|
|
26
22
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
27
|
-
import {
|
|
28
|
-
import type {
|
|
23
|
+
import { TopicType } from '@aztec/stdlib/p2p';
|
|
24
|
+
import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
29
25
|
import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
|
|
30
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
31
26
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
32
27
|
|
|
33
28
|
import getPort from 'get-port';
|
|
34
29
|
import { type GetContractReturnType, getAddress, getContract } from 'viem';
|
|
35
30
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
36
31
|
|
|
32
|
+
import {
|
|
33
|
+
SCHNORR_HARDCODED_PRIVATE_KEY,
|
|
34
|
+
SchnorrHardcodedKeyAccountContract,
|
|
35
|
+
} from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
37
36
|
import {
|
|
38
37
|
type EndToEndContext,
|
|
39
38
|
type SetupOptions,
|
|
40
|
-
deployAccounts,
|
|
41
39
|
getPrivateKeyFromIndex,
|
|
42
40
|
getSponsoredFPCAddress,
|
|
43
41
|
setup,
|
|
@@ -49,6 +47,7 @@ import {
|
|
|
49
47
|
generatePrivateKeys,
|
|
50
48
|
} from '../fixtures/setup_p2p_test.js';
|
|
51
49
|
import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
|
|
50
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
52
51
|
|
|
53
52
|
// Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
|
|
54
53
|
const BOOTSTRAP_NODE_PRIVATE_KEY = '080212208f988fc0899e4a73a5aee4d271a5f20670603a756ad8d84f2c94263a6427c591';
|
|
@@ -58,7 +57,7 @@ export const WAIT_FOR_TX_TIMEOUT = l1ContractsConfig.aztecSlotDuration * 3;
|
|
|
58
57
|
export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
|
|
59
58
|
aztecSlotDuration: 12,
|
|
60
59
|
ethereumSlotDuration: 4,
|
|
61
|
-
|
|
60
|
+
aztecProofSubmissionEpochs: 640,
|
|
62
61
|
};
|
|
63
62
|
|
|
64
63
|
export class P2PNetworkTest {
|
|
@@ -75,8 +74,8 @@ export class P2PNetworkTest {
|
|
|
75
74
|
public peerIdPrivateKeys: string[] = [];
|
|
76
75
|
public validators: Operator[] = [];
|
|
77
76
|
|
|
78
|
-
public
|
|
79
|
-
public
|
|
77
|
+
public hardcodedAccountData!: InitialAccountData;
|
|
78
|
+
public genesis: GenesisData | undefined;
|
|
80
79
|
|
|
81
80
|
// The re-execution test needs a wallet and a spam contract
|
|
82
81
|
public wallet?: TestWallet;
|
|
@@ -123,12 +122,11 @@ export class P2PNetworkTest {
|
|
|
123
122
|
initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
|
|
124
123
|
slashingRoundSizeInEpochs:
|
|
125
124
|
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
126
|
-
|
|
125
|
+
slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
|
|
127
126
|
aztecTargetCommitteeSize: numberOfValidators,
|
|
128
127
|
metricsPort: metricsPort,
|
|
129
128
|
numberOfInitialFundedAccounts: 2,
|
|
130
129
|
startProverNode,
|
|
131
|
-
walletMinFeePadding: 2.0,
|
|
132
130
|
};
|
|
133
131
|
|
|
134
132
|
this.deployL1ContractsArgs = {
|
|
@@ -136,7 +134,7 @@ export class P2PNetworkTest {
|
|
|
136
134
|
aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
|
|
137
135
|
slashingRoundSizeInEpochs:
|
|
138
136
|
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
139
|
-
|
|
137
|
+
slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
|
|
140
138
|
|
|
141
139
|
ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
|
|
142
140
|
aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
|
|
@@ -191,10 +189,10 @@ export class P2PNetworkTest {
|
|
|
191
189
|
}
|
|
192
190
|
|
|
193
191
|
get fundedAccount() {
|
|
194
|
-
if (!this.
|
|
195
|
-
throw new Error('Call
|
|
192
|
+
if (!this.hardcodedAccountData) {
|
|
193
|
+
throw new Error('Call setup to initialize the hardcoded account.');
|
|
196
194
|
}
|
|
197
|
-
return this.
|
|
195
|
+
return this.hardcodedAccountData;
|
|
198
196
|
}
|
|
199
197
|
|
|
200
198
|
async addBootstrapNode() {
|
|
@@ -302,17 +300,22 @@ export class P2PNetworkTest {
|
|
|
302
300
|
await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
|
|
303
301
|
}
|
|
304
302
|
|
|
303
|
+
/** Points the wallet to a P2P-enabled node so transactions can propagate through the network. */
|
|
304
|
+
setupWalletOnNode(node: AztecNodeService) {
|
|
305
|
+
this.logger.info('Pointing wallet to a P2P-enabled node');
|
|
306
|
+
this.context.wallet.updateNode(node);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** Registers the hardcoded account in PXE without on-chain deployment. No sequencer needed. */
|
|
305
310
|
async setupAccount() {
|
|
306
|
-
this.logger.info('
|
|
307
|
-
const
|
|
308
|
-
|
|
309
|
-
this.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
311
|
+
this.logger.info('Registering hardcoded account (no deployment)');
|
|
312
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
313
|
+
const accountManager = await (this.context.wallet as TestWallet).createAccount({
|
|
314
|
+
secret: this.hardcodedAccountData.secret,
|
|
315
|
+
salt: this.hardcodedAccountData.salt,
|
|
316
|
+
contract,
|
|
313
317
|
});
|
|
314
|
-
this.
|
|
315
|
-
[{ address: this.defaultAccountAddress }] = deployedAccounts;
|
|
318
|
+
this.defaultAccountAddress = accountManager.address;
|
|
316
319
|
this.wallet = this.context.wallet;
|
|
317
320
|
}
|
|
318
321
|
|
|
@@ -322,8 +325,9 @@ export class P2PNetworkTest {
|
|
|
322
325
|
throw new Error('Call setupAccount before deploying spam contract');
|
|
323
326
|
}
|
|
324
327
|
|
|
325
|
-
|
|
326
|
-
|
|
328
|
+
({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
|
|
329
|
+
from: this.defaultAccountAddress!,
|
|
330
|
+
}));
|
|
327
331
|
}
|
|
328
332
|
|
|
329
333
|
async removeInitialNode() {
|
|
@@ -333,9 +337,9 @@ export class P2PNetworkTest {
|
|
|
333
337
|
const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
|
|
334
338
|
blockNumber: receipt.blockNumber,
|
|
335
339
|
});
|
|
336
|
-
this.context.dateProvider
|
|
340
|
+
this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
|
|
337
341
|
|
|
338
|
-
await this.context.aztecNodeService
|
|
342
|
+
await this.context.aztecNodeService.stop();
|
|
339
343
|
}
|
|
340
344
|
|
|
341
345
|
async sendDummyTx() {
|
|
@@ -343,7 +347,7 @@ export class P2PNetworkTest {
|
|
|
343
347
|
}
|
|
344
348
|
|
|
345
349
|
private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
|
|
346
|
-
const l1TxUtils =
|
|
350
|
+
const l1TxUtils = createL1TxUtils(l1Client);
|
|
347
351
|
return await l1TxUtils.sendAndMonitorTransaction({
|
|
348
352
|
to: l1Client.account!.address,
|
|
349
353
|
value: 1n,
|
|
@@ -352,13 +356,30 @@ export class P2PNetworkTest {
|
|
|
352
356
|
|
|
353
357
|
async setup() {
|
|
354
358
|
this.logger.info('Setting up subsystems from fresh');
|
|
359
|
+
|
|
360
|
+
// Pre-compute hardcoded account data so it gets funded in genesis.
|
|
361
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
362
|
+
const secret = Fr.random();
|
|
363
|
+
const salt = Fr.random();
|
|
364
|
+
this.hardcodedAccountData = {
|
|
365
|
+
secret,
|
|
366
|
+
salt,
|
|
367
|
+
signingKey: SCHNORR_HARDCODED_PRIVATE_KEY,
|
|
368
|
+
address: await getAccountContractAddress(contract, secret, salt),
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// Generate regular Schnorr accounts for tests that need deployable accounts (e.g. add_rollup).
|
|
372
|
+
const regularAccounts = await generateSchnorrAccounts(this.setupOptions.numberOfInitialFundedAccounts ?? 2);
|
|
373
|
+
|
|
355
374
|
this.context = await setup(
|
|
356
375
|
0,
|
|
357
376
|
{
|
|
358
377
|
...this.setupOptions,
|
|
359
378
|
fundSponsoredFPC: true,
|
|
360
379
|
skipAccountDeployment: true,
|
|
361
|
-
|
|
380
|
+
skipInitialSequencer: true,
|
|
381
|
+
initialFundedAccounts: [...regularAccounts, this.hardcodedAccountData],
|
|
382
|
+
slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
|
|
362
383
|
aztecTargetCommitteeSize: 0,
|
|
363
384
|
l1ContractsArgs: this.deployL1ContractsArgs,
|
|
364
385
|
},
|
|
@@ -370,12 +391,17 @@ export class P2PNetworkTest {
|
|
|
370
391
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
371
392
|
const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
|
|
372
393
|
|
|
373
|
-
const {
|
|
374
|
-
|
|
394
|
+
const { genesis } = await getGenesisValues(
|
|
395
|
+
initialFundedAccounts,
|
|
396
|
+
undefined,
|
|
397
|
+
undefined,
|
|
398
|
+
this.context.genesis!.genesisTimestamp,
|
|
399
|
+
);
|
|
400
|
+
this.genesis = genesis;
|
|
375
401
|
|
|
376
402
|
const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
|
|
377
|
-
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider
|
|
378
|
-
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider
|
|
403
|
+
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
|
|
404
|
+
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider.setTime(Number(timestamp) * 1000));
|
|
379
405
|
}
|
|
380
406
|
|
|
381
407
|
async stopNodes(nodes: AztecNodeService[]) {
|
|
@@ -406,6 +432,7 @@ export class P2PNetworkTest {
|
|
|
406
432
|
expectedNodeCount?: number,
|
|
407
433
|
timeoutSeconds = 30,
|
|
408
434
|
checkIntervalSeconds = 0.1,
|
|
435
|
+
topics: TopicType[] = [TopicType.tx],
|
|
409
436
|
) {
|
|
410
437
|
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
411
438
|
const minPeerCount = nodeCount - 1;
|
|
@@ -431,6 +458,29 @@ export class P2PNetworkTest {
|
|
|
431
458
|
);
|
|
432
459
|
|
|
433
460
|
this.logger.warn('All nodes connected to P2P mesh');
|
|
461
|
+
|
|
462
|
+
// Wait for GossipSub mesh to form for all specified topics.
|
|
463
|
+
// We only require at least 1 mesh peer per node because GossipSub
|
|
464
|
+
// stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
|
|
465
|
+
for (const topic of topics) {
|
|
466
|
+
this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
|
|
467
|
+
await Promise.all(
|
|
468
|
+
nodes.map(async (node, index) => {
|
|
469
|
+
const p2p = node.getP2P();
|
|
470
|
+
await retryUntil(
|
|
471
|
+
async () => {
|
|
472
|
+
const meshPeers = await p2p.getGossipMeshPeerCount(topic);
|
|
473
|
+
this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
|
|
474
|
+
return meshPeers >= 1 ? true : undefined;
|
|
475
|
+
},
|
|
476
|
+
`Node ${index} to have gossip mesh peers for ${topic} topic`,
|
|
477
|
+
timeoutSeconds,
|
|
478
|
+
checkIntervalSeconds,
|
|
479
|
+
);
|
|
480
|
+
}),
|
|
481
|
+
);
|
|
482
|
+
this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
|
|
483
|
+
}
|
|
434
484
|
}
|
|
435
485
|
|
|
436
486
|
async teardown() {
|
|
@@ -442,8 +492,7 @@ export class P2PNetworkTest {
|
|
|
442
492
|
async getContracts(): Promise<{
|
|
443
493
|
rollup: RollupContract;
|
|
444
494
|
slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
|
|
445
|
-
slashingProposer:
|
|
446
|
-
slashFactory: SlashFactoryContract;
|
|
495
|
+
slashingProposer: SlashingProposerContract | undefined;
|
|
447
496
|
}> {
|
|
448
497
|
if (!this.ctx.deployL1ContractsValues) {
|
|
449
498
|
throw new Error('DeployAztecL1ContractsValues not set');
|
|
@@ -460,14 +509,9 @@ export class P2PNetworkTest {
|
|
|
460
509
|
client: this.ctx.deployL1ContractsValues.l1Client,
|
|
461
510
|
});
|
|
462
511
|
|
|
463
|
-
// Get the actual slashing proposer from rollup
|
|
512
|
+
// Get the actual slashing proposer from rollup
|
|
464
513
|
const slashingProposer = await rollup.getSlashingProposer();
|
|
465
514
|
|
|
466
|
-
|
|
467
|
-
this.ctx.deployL1ContractsValues.l1Client,
|
|
468
|
-
getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
|
|
469
|
-
);
|
|
470
|
-
|
|
471
|
-
return { rollup, slasherContract, slashingProposer, slashFactory };
|
|
515
|
+
return { rollup, slasherContract, slashingProposer };
|
|
472
516
|
}
|
|
473
517
|
}
|