@aztec/end-to-end 0.0.1-commit.1bea0213 → 0.0.1-commit.217f559981
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/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +3 -3
- 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/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
- 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 +10 -0
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
- 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 +3 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +15 -7
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +85 -41
- package/dest/e2e_fees/fees_test.d.ts +2 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +5 -5
- package/dest/e2e_l1_publisher/write_json.d.ts +3 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +1 -7
- package/dest/e2e_p2p/p2p_network.d.ts +2 -2
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +16 -2
- 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 +177 -0
- package/dest/e2e_p2p/shared.d.ts +2 -2
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +7 -3
- 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 +4 -2
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +10 -0
- 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 +30 -0
- package/dest/fixtures/e2e_prover_test.d.ts +4 -4
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +28 -35
- package/dest/fixtures/fixtures.d.ts +5 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +6 -0
- 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/setup.d.ts +41 -24
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +79 -164
- package/dest/fixtures/setup_p2p_test.d.ts +16 -9
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +40 -29
- 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 +3 -2
- 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/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/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 +8 -6
- 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 +2 -23
- package/dest/spartan/setup_test_wallets.d.ts +9 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +31 -1
- package/dest/spartan/tx_metrics.d.ts +35 -1
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +150 -0
- 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 +4 -1
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +2 -1
- package/dest/spartan/utils/index.d.ts +4 -4
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +2 -2
- package/dest/spartan/utils/k8s.d.ts +31 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +124 -0
- package/dest/spartan/utils/nodes.d.ts +14 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +202 -32
- package/dest/spartan/utils/scripts.d.ts +18 -4
- package/dest/spartan/utils/scripts.d.ts.map +1 -1
- package/dest/spartan/utils/scripts.js +19 -4
- package/dest/test-wallet/test_wallet.d.ts +83 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +214 -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 +71 -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 +40 -0
- package/dest/test-wallet/worker_wallet.d.ts +52 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +103 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +10 -0
- package/package.json +43 -39
- package/src/bench/client_flows/client_flows_benchmark.ts +8 -12
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +1 -1
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +11 -2
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
- package/src/e2e_deploy_contract/deploy_test.ts +3 -3
- package/src/e2e_epochs/epochs_test.ts +103 -72
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +11 -26
- package/src/e2e_l1_publisher/write_json.ts +1 -6
- package/src/e2e_nested_contract/nested_contract_test.ts +1 -1
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
- package/src/e2e_p2p/p2p_network.ts +29 -7
- package/src/e2e_p2p/reqresp/utils.ts +235 -0
- package/src/e2e_p2p/shared.ts +13 -3
- 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 +11 -2
- package/src/fixtures/authwit_proxy.ts +50 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +29 -39
- package/src/fixtures/fixtures.ts +10 -0
- package/src/fixtures/ha_setup.ts +186 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +102 -223
- package/src/fixtures/setup_p2p_test.ts +40 -44
- package/src/fixtures/token_utils.ts +2 -1
- package/src/guides/up_quick_start.sh +3 -3
- package/src/shared/index.ts +1 -0
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +6 -2
- package/src/shared/uniswap_l1_l2.ts +9 -11
- package/src/simulators/token_simulator.ts +1 -29
- package/src/spartan/setup_test_wallets.ts +58 -4
- package/src/spartan/tx_metrics.ts +126 -0
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +1 -0
- package/src/spartan/utils/index.ts +4 -1
- package/src/spartan/utils/k8s.ts +160 -0
- package/src/spartan/utils/nodes.ts +242 -30
- package/src/spartan/utils/scripts.ts +43 -7
- package/src/test-wallet/test_wallet.ts +306 -0
- package/src/test-wallet/utils.ts +112 -0
- package/src/test-wallet/wallet_worker_script.ts +43 -0
- package/src/test-wallet/worker_wallet.ts +165 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Archiver } from '@aztec/archiver';
|
|
1
2
|
import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
2
3
|
import { getTimestampRangeForEpoch } from '@aztec/aztec.js/block';
|
|
3
4
|
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
@@ -9,25 +10,21 @@ import { EpochCache } from '@aztec/epoch-cache';
|
|
|
9
10
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
10
11
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
11
12
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
12
|
-
import {
|
|
13
|
+
import { Delayer, createDelayer, waitUntilL1Timestamp, wrapClientWithDelayer } from '@aztec/ethereum/l1-tx-utils';
|
|
14
|
+
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
13
15
|
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
14
16
|
import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
15
17
|
import { SecretValue } from '@aztec/foundation/config';
|
|
16
18
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
17
|
-
import {
|
|
19
|
+
import { withLoggerBindings } from '@aztec/foundation/log/server';
|
|
18
20
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
19
21
|
import { sleep } from '@aztec/foundation/sleep';
|
|
20
22
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
23
|
+
import { TestContract } from '@aztec/noir-test-contracts.js/Test';
|
|
21
24
|
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';
|
|
25
|
+
import type { ProverNodeConfig } from '@aztec/prover-node';
|
|
26
|
+
import type { PXEConfig } from '@aztec/pxe/config';
|
|
27
|
+
import { type SequencerClient, type SequencerEvents, SequencerState } from '@aztec/sequencer-client';
|
|
31
28
|
import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
|
|
32
29
|
import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
33
30
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
@@ -44,12 +41,16 @@ import {
|
|
|
44
41
|
setup,
|
|
45
42
|
} from '../fixtures/utils.js';
|
|
46
43
|
|
|
47
|
-
export const
|
|
44
|
+
export const WORLD_STATE_CHECKPOINT_HISTORY = 2;
|
|
48
45
|
export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
|
|
49
46
|
export const ARCHIVER_POLL_INTERVAL = 50;
|
|
50
47
|
export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
51
48
|
|
|
52
|
-
export type EpochsTestOpts = Partial<SetupOptions> & {
|
|
49
|
+
export type EpochsTestOpts = Partial<SetupOptions> & {
|
|
50
|
+
numberOfAccounts?: number;
|
|
51
|
+
pxeOpts?: Partial<PXEConfig>;
|
|
52
|
+
aztecSlotDurationInL1Slots?: number;
|
|
53
|
+
};
|
|
53
54
|
|
|
54
55
|
export type TrackedSequencerEvent = {
|
|
55
56
|
[K in keyof SequencerEvents]: Parameters<SequencerEvents[K]>[0] & {
|
|
@@ -75,7 +76,7 @@ export class EpochsTestContext {
|
|
|
75
76
|
public proverDelayer!: Delayer;
|
|
76
77
|
public sequencerDelayer!: Delayer;
|
|
77
78
|
|
|
78
|
-
public proverNodes:
|
|
79
|
+
public proverNodes: AztecNodeService[] = [];
|
|
79
80
|
public nodes: AztecNodeService[] = [];
|
|
80
81
|
|
|
81
82
|
public epochDuration!: number;
|
|
@@ -94,7 +95,7 @@ export class EpochsTestContext {
|
|
|
94
95
|
? parseInt(process.env.L1_BLOCK_TIME)
|
|
95
96
|
: DEFAULT_L1_BLOCK_TIME;
|
|
96
97
|
const ethereumSlotDuration = opts.ethereumSlotDuration ?? envEthereumSlotDuration;
|
|
97
|
-
const aztecSlotDuration = opts.aztecSlotDuration ??
|
|
98
|
+
const aztecSlotDuration = opts.aztecSlotDuration ?? (opts.aztecSlotDurationInL1Slots ?? 2) * ethereumSlotDuration;
|
|
98
99
|
const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
|
|
99
100
|
const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
|
|
100
101
|
const l1PublishingTime = opts.l1PublishingTime ?? 1;
|
|
@@ -141,14 +142,15 @@ export class EpochsTestContext {
|
|
|
141
142
|
// using the prover's eth address if the proverId is used for something in the rollup contract
|
|
142
143
|
// Use numeric EthAddress for deterministic prover id
|
|
143
144
|
proverId: EthAddress.fromNumber(1),
|
|
144
|
-
|
|
145
|
+
worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
|
|
145
146
|
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
146
147
|
slasherFlavor: 'none',
|
|
147
148
|
l1PublishingTime,
|
|
148
149
|
...opts,
|
|
149
150
|
},
|
|
150
|
-
// Use checkpointed chain tip for PXE to avoid issues with blocks being dropped due to pruned anchor blocks.
|
|
151
|
-
|
|
151
|
+
// Use checkpointed chain tip for PXE by default to avoid issues with blocks being dropped due to pruned anchor blocks.
|
|
152
|
+
// Can be overridden via opts.pxeOpts.
|
|
153
|
+
{ syncChainTip: 'checkpointed', ...opts.pxeOpts },
|
|
152
154
|
);
|
|
153
155
|
|
|
154
156
|
this.context = context;
|
|
@@ -162,17 +164,8 @@ export class EpochsTestContext {
|
|
|
162
164
|
// Loop that tracks L1 and L2 block numbers and logs whenever there's a new one.
|
|
163
165
|
this.monitor = new ChainMonitor(this.rollup, context.dateProvider, this.logger).start();
|
|
164
166
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
this.proverDelayer = context.proverNode
|
|
168
|
-
? (((context.proverNode as TestProverNode).publisher as ProverNodePublisher).l1TxUtils as DelayedTxUtils).delayer!
|
|
169
|
-
: undefined!;
|
|
170
|
-
this.sequencerDelayer = context.sequencer
|
|
171
|
-
? (
|
|
172
|
-
((context.sequencer as TestSequencerClient).sequencer.publisher as SequencerPublisher)
|
|
173
|
-
.l1TxUtils as DelayedTxUtils
|
|
174
|
-
).delayer!
|
|
175
|
-
: undefined!;
|
|
167
|
+
this.proverDelayer = context.proverDelayer!;
|
|
168
|
+
this.sequencerDelayer = context.sequencerDelayer!;
|
|
176
169
|
|
|
177
170
|
if ((context.proverNode && !this.proverDelayer) || (context.sequencer && !this.sequencerDelayer)) {
|
|
178
171
|
throw new Error(`Could not find prover or sequencer delayer`);
|
|
@@ -187,6 +180,7 @@ export class EpochsTestContext {
|
|
|
187
180
|
l1GenesisTime: await this.rollup.getL1GenesisTime(),
|
|
188
181
|
ethereumSlotDuration,
|
|
189
182
|
proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
|
|
183
|
+
targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
|
|
190
184
|
};
|
|
191
185
|
|
|
192
186
|
this.logger.info(
|
|
@@ -204,20 +198,32 @@ export class EpochsTestContext {
|
|
|
204
198
|
public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
|
|
205
199
|
this.logger.warn('Creating and syncing a simulated prover node...');
|
|
206
200
|
const proverNodePrivateKey = this.getNextPrivateKey();
|
|
207
|
-
const
|
|
208
|
-
const
|
|
201
|
+
const proverIndex = this.proverNodes.length + 1;
|
|
202
|
+
const { mockGossipSubNetwork } = this.context;
|
|
203
|
+
const { proverNode } = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
|
|
209
204
|
createAndSyncProverNode(
|
|
210
205
|
proverNodePrivateKey,
|
|
211
|
-
{ ...this.context.config },
|
|
212
206
|
{
|
|
213
|
-
|
|
214
|
-
|
|
207
|
+
...this.context.config,
|
|
208
|
+
p2pEnabled: this.context.config.p2pEnabled || mockGossipSubNetwork !== undefined,
|
|
209
|
+
proverId: EthAddress.fromNumber(proverIndex),
|
|
215
210
|
dontStart: opts.dontStart,
|
|
216
211
|
...opts,
|
|
217
212
|
},
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
213
|
+
{
|
|
214
|
+
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
dateProvider: this.context.dateProvider,
|
|
218
|
+
p2pClientDeps: {
|
|
219
|
+
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
220
|
+
rpcTxProviders: [this.context.aztecNode],
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
prefilledPublicData: this.context.prefilledPublicData ?? [],
|
|
225
|
+
dontStart: opts.dontStart,
|
|
226
|
+
},
|
|
221
227
|
),
|
|
222
228
|
);
|
|
223
229
|
this.proverNodes.push(proverNode);
|
|
@@ -231,21 +237,20 @@ export class EpochsTestContext {
|
|
|
231
237
|
|
|
232
238
|
public createValidatorNode(
|
|
233
239
|
privateKeys: `0x${string}`[],
|
|
234
|
-
opts: Partial<AztecNodeConfig> & {
|
|
240
|
+
opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {},
|
|
235
241
|
) {
|
|
236
242
|
this.logger.warn('Creating and syncing a validator node...');
|
|
237
243
|
return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
|
|
238
244
|
}
|
|
239
245
|
|
|
240
|
-
private async createNode(
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const suffix = (this.nodes.length + 1).toString();
|
|
246
|
+
private async createNode(opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {}) {
|
|
247
|
+
const nodeIndex = this.nodes.length + 1;
|
|
248
|
+
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
244
249
|
const { mockGossipSubNetwork } = this.context;
|
|
245
250
|
const resolvedConfig = { ...this.context.config, ...opts };
|
|
246
251
|
const p2pEnabled = resolvedConfig.p2pEnabled || mockGossipSubNetwork !== undefined;
|
|
247
252
|
const p2pIp = resolvedConfig.p2pIp ?? (p2pEnabled ? '127.0.0.1' : undefined);
|
|
248
|
-
const node = await
|
|
253
|
+
const node = await withLoggerBindings({ actor: `${actorPrefix}-${nodeIndex}` }, () =>
|
|
249
254
|
AztecNodeService.createAndSync(
|
|
250
255
|
{
|
|
251
256
|
...resolvedConfig,
|
|
@@ -267,26 +272,6 @@ export class EpochsTestContext {
|
|
|
267
272
|
),
|
|
268
273
|
);
|
|
269
274
|
|
|
270
|
-
// REFACTOR: We're getting too much into the internals of the sequencer here.
|
|
271
|
-
// We should have a single method for constructing an aztec node that returns a TestAztecNodeService
|
|
272
|
-
// which directly exposes the delayer and sets any test config.
|
|
273
|
-
if (opts.txDelayerMaxInclusionTimeIntoSlot !== undefined) {
|
|
274
|
-
this.logger.info(
|
|
275
|
-
`Setting tx delayer max inclusion time into slot to ${opts.txDelayerMaxInclusionTimeIntoSlot} seconds`,
|
|
276
|
-
);
|
|
277
|
-
// 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.
|
|
278
|
-
// The delayer needs a wallet (a client that can sign), so we have to create one here.
|
|
279
|
-
const l1Client = createExtendedL1Client(
|
|
280
|
-
resolvedConfig.l1RpcUrls!,
|
|
281
|
-
resolvedConfig.publisherPrivateKeys![0]!.getValue(),
|
|
282
|
-
);
|
|
283
|
-
const sequencer = node.getSequencer() as TestSequencerClient;
|
|
284
|
-
const publisher = sequencer.sequencer.publisher;
|
|
285
|
-
const delayed = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, this.L1_BLOCK_TIME_IN_S, l1Client);
|
|
286
|
-
delayed.delayer!.setMaxInclusionTimeIntoSlot(opts.txDelayerMaxInclusionTimeIntoSlot);
|
|
287
|
-
publisher.l1TxUtils = delayed;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
275
|
this.nodes.push(node);
|
|
291
276
|
return node;
|
|
292
277
|
}
|
|
@@ -338,7 +323,10 @@ export class EpochsTestContext {
|
|
|
338
323
|
this.logger.info(`Waiting until last slot of submission window for epoch ${epochNumber} at ${date}`, {
|
|
339
324
|
oneSlotBefore,
|
|
340
325
|
});
|
|
341
|
-
|
|
326
|
+
// Use a timeout that accounts for the full proof submission window
|
|
327
|
+
const proofSubmissionWindowDuration =
|
|
328
|
+
this.constants.proofSubmissionEpochs * this.epochDuration * this.L2_SLOT_DURATION_IN_S;
|
|
329
|
+
await waitUntilL1Timestamp(this.l1Client, oneSlotBefore, undefined, proofSubmissionWindowDuration * 2);
|
|
342
330
|
}
|
|
343
331
|
|
|
344
332
|
/** Waits for the aztec node to sync to the target block number. */
|
|
@@ -375,17 +363,28 @@ export class EpochsTestContext {
|
|
|
375
363
|
return SpamContract.at(instance.address, wallet);
|
|
376
364
|
}
|
|
377
365
|
|
|
366
|
+
/** Registers the TestContract on the given wallet. */
|
|
367
|
+
public async registerTestContract(wallet: Wallet, salt = Fr.ZERO) {
|
|
368
|
+
const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
|
|
369
|
+
constructorArgs: [],
|
|
370
|
+
constructorArtifact: undefined,
|
|
371
|
+
salt,
|
|
372
|
+
publicKeys: undefined,
|
|
373
|
+
deployer: undefined,
|
|
374
|
+
});
|
|
375
|
+
await wallet.registerContract(instance, TestContract.artifact);
|
|
376
|
+
return TestContract.at(instance.address, wallet);
|
|
377
|
+
}
|
|
378
|
+
|
|
378
379
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
|
|
379
380
|
public async createL1Client() {
|
|
380
|
-
const
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
this.l1Client.chain,
|
|
385
|
-
),
|
|
386
|
-
this.context.dateProvider!,
|
|
387
|
-
{ ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S },
|
|
381
|
+
const rawClient = createExtendedL1Client(
|
|
382
|
+
[...this.l1Client.chain.rpcUrls.default.http],
|
|
383
|
+
privateKeyToAccount(this.getNextPrivateKey()),
|
|
384
|
+
this.l1Client.chain,
|
|
388
385
|
);
|
|
386
|
+
const delayer = createDelayer(this.context.dateProvider, { ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S }, {});
|
|
387
|
+
const client = wrapClientWithDelayer(rawClient, delayer);
|
|
389
388
|
expect(await client.getBalance({ address: client.account.address })).toBeGreaterThan(0n);
|
|
390
389
|
return { client, delayer };
|
|
391
390
|
}
|
|
@@ -402,6 +401,38 @@ export class EpochsTestContext {
|
|
|
402
401
|
expect(result).toBe(expectedSuccess);
|
|
403
402
|
}
|
|
404
403
|
|
|
404
|
+
/** Verifies at least one checkpoint has the target number of blocks (for MBPS validation). */
|
|
405
|
+
public async assertMultipleBlocksPerSlot(targetBlockCount: number) {
|
|
406
|
+
const archiver = (this.context.aztecNode as AztecNodeService).getBlockSource() as Archiver;
|
|
407
|
+
const checkpoints = await archiver.getCheckpoints(CheckpointNumber(1), 50);
|
|
408
|
+
|
|
409
|
+
this.logger.warn(`Retrieved ${checkpoints.length} checkpoints from archiver`, {
|
|
410
|
+
checkpoints: checkpoints.map(pc => pc.checkpoint.getStats()),
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
|
|
414
|
+
let targetFound = false;
|
|
415
|
+
|
|
416
|
+
for (const checkpoint of checkpoints) {
|
|
417
|
+
const blockCount = checkpoint.checkpoint.blocks.length;
|
|
418
|
+
targetFound = targetFound || blockCount >= targetBlockCount;
|
|
419
|
+
|
|
420
|
+
this.logger.verbose(`Checkpoint ${checkpoint.checkpoint.number} has ${blockCount} blocks`, {
|
|
421
|
+
checkpoint: checkpoint.checkpoint.getStats(),
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
for (let i = 0; i < blockCount; i++) {
|
|
425
|
+
const block = checkpoint.checkpoint.blocks[i];
|
|
426
|
+
expect(block.indexWithinCheckpoint).toBe(i);
|
|
427
|
+
expect(block.checkpointNumber).toBe(checkpoint.checkpoint.number);
|
|
428
|
+
expect(block.number).toBe(expectedBlockNumber);
|
|
429
|
+
expectedBlockNumber++;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
expect(targetFound).toBe(true);
|
|
434
|
+
}
|
|
435
|
+
|
|
405
436
|
public watchSequencerEvents(
|
|
406
437
|
sequencers: SequencerClient[],
|
|
407
438
|
getMetadata: (i: number) => Record<string, any> = () => ({}),
|
|
@@ -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);
|
|
@@ -20,7 +20,6 @@ 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
|
|
|
@@ -36,6 +35,7 @@ import {
|
|
|
36
35
|
import { mintTokensToPrivate } from '../fixtures/token_utils.js';
|
|
37
36
|
import { type BalancesFn, getBalancesFn, setupSponsoredFPC } from '../fixtures/utils.js';
|
|
38
37
|
import { FeeJuicePortalTestingHarnessFactory, type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.js';
|
|
38
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Test fixture for testing fees. Provides the following setup steps:
|
|
@@ -113,7 +113,7 @@ export class FeesTest {
|
|
|
113
113
|
});
|
|
114
114
|
|
|
115
115
|
this.rollupContract = RollupContract.getFromConfig(this.context.config);
|
|
116
|
-
this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider
|
|
116
|
+
this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider, this.logger, 200).start();
|
|
117
117
|
|
|
118
118
|
await this.applyBaseSetup();
|
|
119
119
|
|
|
@@ -126,7 +126,7 @@ export class FeesTest {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
setIsMarkingAsProven(b: boolean) {
|
|
129
|
-
this.context.watcher
|
|
129
|
+
this.context.watcher.setIsMarkingAsProven(b);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
async catchUpProvenChain() {
|
|
@@ -157,15 +157,11 @@ export class FeesTest {
|
|
|
157
157
|
|
|
158
158
|
/** Alice mints bananaCoin tokens privately to the target address and redeems them. */
|
|
159
159
|
async mintPrivateBananas(amount: bigint, address: AztecAddress) {
|
|
160
|
-
const balanceBefore = await this.bananaCoin.methods
|
|
161
|
-
.balance_of_private(address)
|
|
162
|
-
.simulate({ from: this.aliceAddress });
|
|
160
|
+
const balanceBefore = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
|
|
163
161
|
|
|
164
162
|
await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
|
|
165
163
|
|
|
166
|
-
const balanceAfter = await this.bananaCoin.methods
|
|
167
|
-
.balance_of_private(address)
|
|
168
|
-
.simulate({ from: this.aliceAddress });
|
|
164
|
+
const balanceAfter = await this.bananaCoin.methods.balance_of_private(address).simulate({ from: address });
|
|
169
165
|
expect(balanceAfter).toEqual(balanceBefore + amount);
|
|
170
166
|
}
|
|
171
167
|
|
|
@@ -188,8 +184,8 @@ export class FeesTest {
|
|
|
188
184
|
});
|
|
189
185
|
|
|
190
186
|
this.wallet = this.context.wallet;
|
|
191
|
-
this.aztecNode = this.context.aztecNodeService
|
|
192
|
-
this.aztecNodeAdmin = this.context.aztecNodeService
|
|
187
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
188
|
+
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
193
189
|
this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
|
|
194
190
|
this.cheatCodes = this.context.cheatCodes;
|
|
195
191
|
this.accounts = deployedAccounts.map(a => a.address);
|
|
@@ -213,16 +209,11 @@ export class FeesTest {
|
|
|
213
209
|
|
|
214
210
|
this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
|
|
215
211
|
|
|
216
|
-
this.getGasBalanceFn = getBalancesFn(
|
|
217
|
-
'⛽',
|
|
218
|
-
this.feeJuiceContract.methods.balance_of_public,
|
|
219
|
-
this.aliceAddress,
|
|
220
|
-
this.logger,
|
|
221
|
-
);
|
|
212
|
+
this.getGasBalanceFn = getBalancesFn('⛽', this.feeJuiceContract.methods.balance_of_public, this.logger);
|
|
222
213
|
|
|
223
214
|
this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
|
|
224
|
-
aztecNode: this.context.aztecNodeService
|
|
225
|
-
aztecNodeAdmin: this.context.aztecNodeService
|
|
215
|
+
aztecNode: this.context.aztecNodeService,
|
|
216
|
+
aztecNodeAdmin: this.context.aztecNodeService,
|
|
226
217
|
l1Client: this.context.deployL1ContractsValues.l1Client,
|
|
227
218
|
wallet: this.wallet,
|
|
228
219
|
logger: this.logger,
|
|
@@ -238,16 +229,10 @@ export class FeesTest {
|
|
|
238
229
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
239
230
|
|
|
240
231
|
this.bananaCoin = bananaCoin;
|
|
241
|
-
this.getBananaPublicBalanceFn = getBalancesFn(
|
|
242
|
-
'🍌.public',
|
|
243
|
-
this.bananaCoin.methods.balance_of_public,
|
|
244
|
-
this.aliceAddress,
|
|
245
|
-
this.logger,
|
|
246
|
-
);
|
|
232
|
+
this.getBananaPublicBalanceFn = getBalancesFn('🍌.public', this.bananaCoin.methods.balance_of_public, this.logger);
|
|
247
233
|
this.getBananaPrivateBalanceFn = getBalancesFn(
|
|
248
234
|
'🍌.private',
|
|
249
235
|
this.bananaCoin.methods.balance_of_private,
|
|
250
|
-
this.aliceAddress,
|
|
251
236
|
this.logger,
|
|
252
237
|
);
|
|
253
238
|
}
|
|
@@ -15,6 +15,7 @@ const AZTEC_GENERATE_TEST_DATA = !!process.env.AZTEC_GENERATE_TEST_DATA;
|
|
|
15
15
|
*/
|
|
16
16
|
export async function writeJson(
|
|
17
17
|
fileName: string,
|
|
18
|
+
checkpointHeader: CheckpointHeader,
|
|
18
19
|
block: L2Block,
|
|
19
20
|
l1ToL2Content: Fr[],
|
|
20
21
|
blobs: Blob[],
|
|
@@ -33,12 +34,6 @@ export async function writeJson(
|
|
|
33
34
|
return `0x${buffer.toString('hex').padStart(size, '0')}`;
|
|
34
35
|
};
|
|
35
36
|
|
|
36
|
-
// Create a checkpoint header for this block
|
|
37
|
-
const checkpointHeader = CheckpointHeader.random({
|
|
38
|
-
slotNumber: block.slot,
|
|
39
|
-
timestamp: block.timestamp,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
37
|
const jsonObject = {
|
|
43
38
|
populate: {
|
|
44
39
|
l1ToL2Content: l1ToL2Content.map(value => asHex(value)),
|
|
@@ -44,7 +44,7 @@ export class NestedContractTest {
|
|
|
44
44
|
});
|
|
45
45
|
this.wallet = this.context.wallet;
|
|
46
46
|
[{ address: this.defaultAccountAddress }] = deployedAccounts;
|
|
47
|
-
this.aztecNode = this.context.aztecNodeService
|
|
47
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
48
48
|
|
|
49
49
|
this.logger.info('Public deploy accounts');
|
|
50
50
|
await publicDeployAccounts(this.wallet, [this.defaultAccountAddress]);
|
|
@@ -98,13 +98,13 @@ export class P2PInactivityTest {
|
|
|
98
98
|
this.rollup = rollup;
|
|
99
99
|
|
|
100
100
|
if (!this.keepInitialNode) {
|
|
101
|
-
await this.test.ctx.aztecNodeService
|
|
101
|
+
await this.test.ctx.aztecNodeService.stop();
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
// Create all active nodes
|
|
105
105
|
this.activeNodes = await createNodes(
|
|
106
106
|
this.test.ctx.aztecNodeConfig,
|
|
107
|
-
this.test.ctx.dateProvider
|
|
107
|
+
this.test.ctx.dateProvider,
|
|
108
108
|
this.test.bootstrapNodeEnr,
|
|
109
109
|
NUM_NODES - this.inactiveNodeCount - Number(this.keepInitialNode),
|
|
110
110
|
BOOT_NODE_UDP_PORT,
|
|
@@ -118,7 +118,7 @@ export class P2PInactivityTest {
|
|
|
118
118
|
const inactiveConfig = { ...this.test.ctx.aztecNodeConfig, dontStartSequencer: true };
|
|
119
119
|
this.inactiveNodes = await createNodes(
|
|
120
120
|
inactiveConfig,
|
|
121
|
-
this.test.ctx.dateProvider
|
|
121
|
+
this.test.ctx.dateProvider,
|
|
122
122
|
this.test.bootstrapNodeEnr,
|
|
123
123
|
this.inactiveNodeCount,
|
|
124
124
|
BOOT_NODE_UDP_PORT,
|
|
@@ -129,7 +129,7 @@ export class P2PInactivityTest {
|
|
|
129
129
|
);
|
|
130
130
|
|
|
131
131
|
this.nodes = [
|
|
132
|
-
...(this.keepInitialNode ? [this.test.ctx.aztecNodeService
|
|
132
|
+
...(this.keepInitialNode ? [this.test.ctx.aztecNodeService] : []),
|
|
133
133
|
...this.activeNodes,
|
|
134
134
|
...this.inactiveNodes,
|
|
135
135
|
];
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
13
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
14
14
|
import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
|
|
15
|
-
import {
|
|
15
|
+
import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
16
16
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
17
17
|
import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
|
|
18
18
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
@@ -25,9 +25,9 @@ import type { BootstrapNode } from '@aztec/p2p/bootstrap';
|
|
|
25
25
|
import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
|
|
26
26
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
27
27
|
import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
28
|
+
import { TopicType } from '@aztec/stdlib/p2p';
|
|
28
29
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
29
30
|
import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
|
|
30
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
31
31
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
32
32
|
|
|
33
33
|
import getPort from 'get-port';
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
generatePrivateKeys,
|
|
50
50
|
} from '../fixtures/setup_p2p_test.js';
|
|
51
51
|
import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
|
|
52
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
52
53
|
|
|
53
54
|
// Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
|
|
54
55
|
const BOOTSTRAP_NODE_PRIVATE_KEY = '080212208f988fc0899e4a73a5aee4d271a5f20670603a756ad8d84f2c94263a6427c591';
|
|
@@ -333,9 +334,9 @@ export class P2PNetworkTest {
|
|
|
333
334
|
const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
|
|
334
335
|
blockNumber: receipt.blockNumber,
|
|
335
336
|
});
|
|
336
|
-
this.context.dateProvider
|
|
337
|
+
this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
|
|
337
338
|
|
|
338
|
-
await this.context.aztecNodeService
|
|
339
|
+
await this.context.aztecNodeService.stop();
|
|
339
340
|
}
|
|
340
341
|
|
|
341
342
|
async sendDummyTx() {
|
|
@@ -343,7 +344,7 @@ export class P2PNetworkTest {
|
|
|
343
344
|
}
|
|
344
345
|
|
|
345
346
|
private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
|
|
346
|
-
const l1TxUtils =
|
|
347
|
+
const l1TxUtils = createL1TxUtils(l1Client);
|
|
347
348
|
return await l1TxUtils.sendAndMonitorTransaction({
|
|
348
349
|
to: l1Client.account!.address,
|
|
349
350
|
value: 1n,
|
|
@@ -374,8 +375,8 @@ export class P2PNetworkTest {
|
|
|
374
375
|
this.prefilledPublicData = prefilledPublicData;
|
|
375
376
|
|
|
376
377
|
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
|
|
378
|
+
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
|
|
379
|
+
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider.setTime(Number(timestamp) * 1000));
|
|
379
380
|
}
|
|
380
381
|
|
|
381
382
|
async stopNodes(nodes: AztecNodeService[]) {
|
|
@@ -431,6 +432,27 @@ export class P2PNetworkTest {
|
|
|
431
432
|
);
|
|
432
433
|
|
|
433
434
|
this.logger.warn('All nodes connected to P2P mesh');
|
|
435
|
+
|
|
436
|
+
// Wait for GossipSub mesh to form for the tx topic.
|
|
437
|
+
// We only require at least 1 mesh peer per node because GossipSub
|
|
438
|
+
// stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
|
|
439
|
+
this.logger.warn('Waiting for GossipSub mesh to form for tx topic...');
|
|
440
|
+
await Promise.all(
|
|
441
|
+
nodes.map(async (node, index) => {
|
|
442
|
+
const p2p = node.getP2P();
|
|
443
|
+
await retryUntil(
|
|
444
|
+
async () => {
|
|
445
|
+
const meshPeers = await p2p.getGossipMeshPeerCount(TopicType.tx);
|
|
446
|
+
this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for tx topic`);
|
|
447
|
+
return meshPeers >= 1 ? true : undefined;
|
|
448
|
+
},
|
|
449
|
+
`Node ${index} to have gossip mesh peers for tx topic`,
|
|
450
|
+
timeoutSeconds,
|
|
451
|
+
checkIntervalSeconds,
|
|
452
|
+
);
|
|
453
|
+
}),
|
|
454
|
+
);
|
|
455
|
+
this.logger.warn('All nodes have gossip mesh peers for tx topic');
|
|
434
456
|
}
|
|
435
457
|
|
|
436
458
|
async teardown() {
|