@aztec/end-to-end 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316
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 +203 -27
- package/dest/automine/automine_test_context.d.ts +85 -0
- package/dest/automine/automine_test_context.d.ts.map +1 -0
- package/dest/automine/automine_test_context.js +98 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
- package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
- package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
- package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
- package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
- package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
- package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +18 -40
- package/dest/automine/token/token_contract_test.d.ts +40 -0
- package/dest/automine/token/token_contract_test.d.ts.map +1 -0
- package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +22 -39
- package/dest/automine/token/token_test_helpers.d.ts +73 -0
- package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
- package/dest/automine/token/token_test_helpers.js +97 -0
- package/dest/bench/client_flows/benchmark.d.ts +1 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +3 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +4 -4
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +31 -19
- package/dest/bench/client_flows/data_extractor.js +1 -0
- package/dest/bench/utils.d.ts +3 -3
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +95 -6
- package/dest/composed/ha/ha_full_setup.d.ts +77 -0
- package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
- package/dest/composed/ha/ha_full_setup.js +383 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
- package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
- package/dest/fixtures/e2e_prover_test.d.ts +12 -9
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +47 -28
- package/dest/fixtures/fixtures.d.ts +19 -10
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +26 -11
- package/dest/fixtures/ha_setup.d.ts +3 -3
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +4 -1
- 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 +38 -41
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +181 -228
- package/dest/fixtures/setup_p2p_test.d.ts +1 -1
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +3 -3
- package/dest/fixtures/timing.d.ts +42 -0
- package/dest/fixtures/timing.d.ts.map +1 -0
- package/dest/fixtures/timing.js +72 -0
- package/dest/fixtures/token_utils.d.ts +22 -4
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +21 -1
- 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/fixtures/wait_helpers.d.ts +135 -0
- package/dest/fixtures/wait_helpers.d.ts.map +1 -0
- package/dest/fixtures/wait_helpers.js +154 -0
- package/dest/forward-compatibility/wallet_service.js +3 -3
- package/dest/multi-node/block-production/setup.d.ts +97 -0
- package/dest/multi-node/block-production/setup.d.ts.map +1 -0
- package/dest/multi-node/block-production/setup.js +158 -0
- package/dest/multi-node/governance/setup.d.ts +67 -0
- package/dest/multi-node/governance/setup.d.ts.map +1 -0
- package/dest/multi-node/governance/setup.js +126 -0
- package/dest/multi-node/multi_node_test_context.d.ts +212 -0
- package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
- package/dest/multi-node/multi_node_test_context.js +347 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
- package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/inactivity_setup.js +111 -0
- package/dest/multi-node/slashing/setup.d.ts +167 -0
- package/dest/multi-node/slashing/setup.d.ts.map +1 -0
- package/dest/multi-node/slashing/setup.js +275 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +10 -2
- package/dest/p2p/p2p_network.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/p2p_network.js +39 -15
- package/dest/p2p/reqresp/utils.d.ts +19 -0
- package/dest/p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/{e2e_p2p → p2p}/reqresp/utils.js +4 -17
- package/dest/p2p/shared.d.ts +72 -0
- package/dest/p2p/shared.d.ts.map +1 -0
- package/dest/p2p/shared.js +212 -0
- package/dest/shared/cross_chain_test_harness.d.ts +3 -3
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +16 -15
- package/dest/shared/gas_portal_test_harness.d.ts +1 -1
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +8 -5
- package/dest/shared/submit-transactions.d.ts +1 -1
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +12 -5
- package/dest/shared/timing_env.d.js +5 -0
- package/dest/shared/timing_env.js +365 -0
- 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 +1 -6
- package/dest/shared/wait_for_l1_to_l2_message.js +1 -1
- package/dest/simulators/lending_simulator.js +1 -1
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
- package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
- package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
- package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
- package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
- package/dest/single-node/fees/fees_test.d.ts +93 -0
- package/dest/single-node/fees/fees_test.d.ts.map +1 -0
- package/dest/{e2e_fees → single-node/fees}/fees_test.js +48 -55
- package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
- package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
- package/dest/single-node/l1-reorgs/setup.js +57 -0
- package/dest/single-node/partial-proofs/setup.d.ts +5 -0
- package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
- package/dest/single-node/partial-proofs/setup.js +5 -0
- package/dest/single-node/proving/setup.d.ts +5 -0
- package/dest/single-node/proving/setup.d.ts.map +1 -0
- package/dest/single-node/proving/setup.js +5 -0
- package/dest/single-node/recovery/setup.d.ts +5 -0
- package/dest/single-node/recovery/setup.d.ts.map +1 -0
- package/dest/single-node/recovery/setup.js +5 -0
- package/dest/single-node/setup.d.ts +49 -0
- package/dest/single-node/setup.d.ts.map +1 -0
- package/dest/single-node/setup.js +56 -0
- package/dest/single-node/single_node_test_context.d.ts +360 -0
- package/dest/single-node/single_node_test_context.d.ts.map +1 -0
- package/dest/single-node/single_node_test_context.js +833 -0
- package/dest/spartan/setup_test_wallets.d.ts +1 -1
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +19 -9
- package/dest/spartan/tx_metrics.d.ts +10 -1
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +32 -0
- package/dest/test-wallet/test_wallet.d.ts +23 -3
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +56 -9
- package/dest/test-wallet/utils.d.ts +36 -1
- package/dest/test-wallet/utils.d.ts.map +1 -1
- package/dest/test-wallet/utils.js +64 -4
- package/dest/test-wallet/wallet_worker_script.js +5 -2
- package/dest/test-wallet/worker_wallet.d.ts +5 -5
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +5 -3
- package/dest/test-wallet/worker_wallet_schema.d.ts +3 -159
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +2 -1
- package/package.json +41 -41
- package/src/automine/README.md +60 -0
- package/src/automine/automine_test_context.ts +153 -0
- package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
- package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
- package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +20 -57
- package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +24 -57
- package/src/automine/token/token_test_helpers.ts +138 -0
- package/src/bench/client_flows/benchmark.ts +3 -1
- package/src/bench/client_flows/client_flows_benchmark.ts +45 -26
- package/src/bench/client_flows/data_extractor.ts +1 -0
- package/src/bench/utils.ts +109 -6
- package/src/composed/ha/ha_full_setup.ts +466 -0
- package/src/fixtures/e2e_prover_test.ts +58 -47
- package/src/fixtures/fixtures.ts +28 -11
- package/src/fixtures/ha_setup.ts +7 -3
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +220 -289
- package/src/fixtures/setup_p2p_test.ts +3 -3
- package/src/fixtures/timing.ts +97 -0
- package/src/fixtures/token_utils.ts +39 -4
- package/src/fixtures/utils.ts +0 -3
- package/src/fixtures/wait_helpers.ts +333 -0
- package/src/forward-compatibility/wallet_service.ts +6 -4
- package/src/guides/up_quick_start.sh +5 -0
- package/src/infra/README.md +12 -0
- package/src/multi-node/README.md +95 -0
- package/src/multi-node/block-production/setup.ts +272 -0
- package/src/multi-node/governance/setup.ts +172 -0
- package/src/multi-node/multi_node_test_context.ts +447 -0
- package/src/multi-node/slashing/inactivity_setup.ts +139 -0
- package/src/multi-node/slashing/setup.ts +433 -0
- package/src/p2p/README.md +78 -0
- package/src/{e2e_p2p → p2p}/p2p_network.ts +38 -13
- package/src/{e2e_p2p → p2p}/reqresp/utils.ts +5 -16
- package/src/p2p/shared.ts +329 -0
- package/src/shared/cross_chain_test_harness.ts +21 -10
- package/src/shared/gas_portal_test_harness.ts +13 -5
- package/src/shared/submit-transactions.ts +13 -5
- package/src/shared/timing_env.d.mts +39 -0
- package/src/shared/timing_env.mjs +363 -0
- package/src/shared/uniswap_l1_l2.ts +1 -8
- package/src/shared/wait_for_l1_to_l2_message.ts +1 -1
- package/src/simulators/lending_simulator.ts +1 -1
- package/src/single-node/README.md +60 -0
- package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
- package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
- package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
- package/src/{e2e_fees → single-node/fees}/fees_test.ts +69 -65
- package/src/single-node/l1-reorgs/setup.ts +93 -0
- package/src/single-node/partial-proofs/setup.ts +8 -0
- package/src/single-node/proving/setup.ts +15 -0
- package/src/single-node/recovery/setup.ts +8 -0
- package/src/single-node/setup.ts +63 -0
- package/src/single-node/single_node_test_context.ts +1041 -0
- package/src/spartan/setup_test_wallets.ts +24 -9
- package/src/spartan/tx_metrics.ts +26 -0
- package/src/test-wallet/test_wallet.ts +60 -10
- package/src/test-wallet/utils.ts +102 -5
- package/src/test-wallet/wallet_worker_script.ts +6 -3
- package/src/test-wallet/worker_wallet.ts +10 -12
- package/src/test-wallet/worker_wallet_schema.ts +3 -2
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -56
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -58
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -161
- package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
- package/dest/e2e_deploy_contract/deploy_test.js +0 -51
- package/dest/e2e_epochs/epochs_test.d.ts +0 -125
- package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
- package/dest/e2e_epochs/epochs_test.js +0 -460
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
- package/dest/e2e_fees/fees_test.d.ts +0 -91
- package/dest/e2e_fees/fees_test.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
- package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
- package/dest/e2e_l1_publisher/write_json.js +0 -56
- package/dest/e2e_multi_validator/utils.d.ts +0 -12
- package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +0 -55
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +0 -137
- package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
- package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.d.ts +0 -75
- package/dest/e2e_p2p/shared.d.ts.map +0 -1
- package/dest/e2e_p2p/shared.js +0 -217
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
- package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -231
- package/src/e2e_deploy_contract/deploy_test.ts +0 -86
- package/src/e2e_epochs/epochs_test.ts +0 -575
- package/src/e2e_l1_publisher/write_json.ts +0 -77
- package/src/e2e_nested_contract/nested_contract_test.ts +0 -77
- package/src/e2e_p2p/inactivity_slash_test.ts +0 -180
- package/src/e2e_p2p/shared.ts +0 -332
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
- /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
- /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
- /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
- /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
|
@@ -19,7 +19,10 @@ import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
|
19
19
|
import { TopicType } from '@aztec/stdlib/p2p';
|
|
20
20
|
import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
|
|
21
21
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
22
|
+
import fs from 'fs';
|
|
22
23
|
import getPort from 'get-port';
|
|
24
|
+
import os from 'os';
|
|
25
|
+
import path from 'path';
|
|
23
26
|
import { getAddress, getContract } from 'viem';
|
|
24
27
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
25
28
|
import { SCHNORR_HARDCODED_PRIVATE_KEY, SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
@@ -59,6 +62,8 @@ export class P2PNetworkTest {
|
|
|
59
62
|
defaultAccountAddress;
|
|
60
63
|
spamContract;
|
|
61
64
|
bootstrapNode;
|
|
65
|
+
// Root temp directory holding every node's data dir. Created in setup(), removed in teardown().
|
|
66
|
+
dataDir;
|
|
62
67
|
// Store setup options for use in setup()
|
|
63
68
|
setupOptions;
|
|
64
69
|
deployL1ContractsArgs;
|
|
@@ -92,7 +97,6 @@ export class P2PNetworkTest {
|
|
|
92
97
|
slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
|
|
93
98
|
aztecTargetCommitteeSize: numberOfValidators,
|
|
94
99
|
metricsPort: metricsPort,
|
|
95
|
-
numberOfInitialFundedAccounts: 2,
|
|
96
100
|
startProverNode
|
|
97
101
|
};
|
|
98
102
|
this.deployL1ContractsArgs = {
|
|
@@ -124,6 +128,17 @@ export class P2PNetworkTest {
|
|
|
124
128
|
}
|
|
125
129
|
return this.hardcodedAccountData;
|
|
126
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Returns a per-role data directory nested under this test's root data dir. The multi-node factories
|
|
133
|
+
* (`createNodes`) append `-<index>` to this base for each node they spawn; single-node factories
|
|
134
|
+
* (`createProverNode`, `createNonValidatorNode`, `createNode`) use it verbatim. Everything lives under
|
|
135
|
+
* `this.dataDir`, so a single recursive remove in teardown() cleans up all of it.
|
|
136
|
+
*/ dataDirFor(label) {
|
|
137
|
+
if (!this.dataDir) {
|
|
138
|
+
throw new Error('Call setup to initialize the data directory.');
|
|
139
|
+
}
|
|
140
|
+
return path.join(this.dataDir, label);
|
|
141
|
+
}
|
|
127
142
|
async addBootstrapNode() {
|
|
128
143
|
this.logger.info('Adding bootstrap node');
|
|
129
144
|
const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
|
|
@@ -250,6 +265,7 @@ export class P2PNetworkTest {
|
|
|
250
265
|
}
|
|
251
266
|
async setup() {
|
|
252
267
|
this.logger.info('Setting up subsystems from fresh');
|
|
268
|
+
this.dataDir = fs.mkdtempSync(path.join(os.tmpdir(), `${this.testName}-`));
|
|
253
269
|
// Pre-compute hardcoded account data so it gets funded in genesis.
|
|
254
270
|
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
255
271
|
const secret = Fr.random();
|
|
@@ -260,15 +276,14 @@ export class P2PNetworkTest {
|
|
|
260
276
|
signingKey: SCHNORR_HARDCODED_PRIVATE_KEY,
|
|
261
277
|
address: await getAccountContractAddress(contract, secret, salt)
|
|
262
278
|
};
|
|
263
|
-
// Generate
|
|
264
|
-
const
|
|
279
|
+
// Generate funded (initializerless) Schnorr accounts for tests that create accounts from them (e.g. add_rollup).
|
|
280
|
+
const fundedAccounts = await generateSchnorrAccounts(2);
|
|
265
281
|
this.context = await setup(0, {
|
|
266
282
|
...this.setupOptions,
|
|
267
283
|
fundSponsoredFPC: true,
|
|
268
|
-
skipAccountDeployment: true,
|
|
269
284
|
skipInitialSequencer: true,
|
|
270
|
-
|
|
271
|
-
...
|
|
285
|
+
additionallyFundedAccounts: [
|
|
286
|
+
...fundedAccounts,
|
|
272
287
|
this.hardcodedAccountData
|
|
273
288
|
],
|
|
274
289
|
slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
|
|
@@ -281,7 +296,7 @@ export class P2PNetworkTest {
|
|
|
281
296
|
this.ctx = this.context;
|
|
282
297
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
283
298
|
const initialFundedAccounts = [
|
|
284
|
-
...this.context.
|
|
299
|
+
...this.context.additionallyFundedAccounts.map((a)=>a.address),
|
|
285
300
|
sponsoredFPCAddress
|
|
286
301
|
];
|
|
287
302
|
const { genesis } = await getGenesisValues(initialFundedAccounts, undefined, undefined, this.context.genesis.genesisTimestamp);
|
|
@@ -310,7 +325,7 @@ export class P2PNetworkTest {
|
|
|
310
325
|
* @param checkIntervalSeconds - How often to check connectivity (default: 0.1 seconds)
|
|
311
326
|
*/ async waitForP2PMeshConnectivity(nodes, expectedNodeCount, timeoutSeconds = 30, checkIntervalSeconds = 0.1, topics = [
|
|
312
327
|
TopicType.tx
|
|
313
|
-
]) {
|
|
328
|
+
], minMeshPeerCount = 1) {
|
|
314
329
|
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
315
330
|
const minPeerCount = nodeCount - 1;
|
|
316
331
|
this.logger.warn(`Waiting for all ${nodeCount} nodes to connect to P2P mesh (at least ${minPeerCount} peers each)...`);
|
|
@@ -323,26 +338,35 @@ export class P2PNetworkTest {
|
|
|
323
338
|
}, `Node ${index} to connect to at least ${minPeerCount} peers`, timeoutSeconds, checkIntervalSeconds);
|
|
324
339
|
}));
|
|
325
340
|
this.logger.warn('All nodes connected to P2P mesh');
|
|
326
|
-
// Wait for GossipSub mesh to form for all specified topics.
|
|
327
|
-
//
|
|
328
|
-
//
|
|
341
|
+
// Wait for the GossipSub mesh to form for all specified topics. By default we only require at
|
|
342
|
+
// least 1 mesh peer per node, since GossipSub stops grafting once it reaches Dlo peers and won't
|
|
343
|
+
// fill the mesh to every available peer. Callers that need a proposal to reach the whole
|
|
344
|
+
// committee within a slot (e.g. quorum-from-genesis tests) raise `minMeshPeerCount` so the mesh
|
|
345
|
+
// is fully formed — a single mesh peer can leave some committee members unreached at first.
|
|
329
346
|
for (const topic of topics){
|
|
330
|
-
this.logger.warn(`Waiting for GossipSub mesh
|
|
347
|
+
this.logger.warn(`Waiting for GossipSub mesh (>= ${minMeshPeerCount} peers per node) for ${topic} topic...`);
|
|
331
348
|
await Promise.all(nodes.map(async (node, index)=>{
|
|
332
349
|
const p2p = node.getP2P();
|
|
333
350
|
await retryUntil(async ()=>{
|
|
334
351
|
const meshPeers = await p2p.getGossipMeshPeerCount(topic);
|
|
335
352
|
this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
|
|
336
|
-
return meshPeers >=
|
|
337
|
-
}, `Node ${index} to have gossip mesh peers for ${topic} topic`, timeoutSeconds, checkIntervalSeconds);
|
|
353
|
+
return meshPeers >= minMeshPeerCount ? true : undefined;
|
|
354
|
+
}, `Node ${index} to have >= ${minMeshPeerCount} gossip mesh peers for ${topic} topic`, timeoutSeconds, checkIntervalSeconds);
|
|
338
355
|
}));
|
|
339
|
-
this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
|
|
356
|
+
this.logger.warn(`All nodes have >= ${minMeshPeerCount} gossip mesh peers for ${topic} topic`);
|
|
340
357
|
}
|
|
341
358
|
}
|
|
342
359
|
async teardown() {
|
|
343
360
|
await this.monitor.stop();
|
|
344
361
|
await tryStop(this.bootstrapNode, this.logger);
|
|
345
362
|
await teardown(this.context);
|
|
363
|
+
if (this.dataDir) {
|
|
364
|
+
fs.rmSync(this.dataDir, {
|
|
365
|
+
recursive: true,
|
|
366
|
+
force: true,
|
|
367
|
+
maxRetries: 3
|
|
368
|
+
});
|
|
369
|
+
}
|
|
346
370
|
}
|
|
347
371
|
async getContracts() {
|
|
348
372
|
if (!this.ctx.deployL1ContractsValues) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AztecNodeService } from '@aztec/aztec-node';
|
|
2
|
+
import { P2PNetworkTest } from '../p2p_network.js';
|
|
3
|
+
export declare const NUM_VALIDATORS = 6;
|
|
4
|
+
export declare const NUM_TXS_PER_NODE = 4;
|
|
5
|
+
export declare const BOOT_NODE_UDP_PORT: number;
|
|
6
|
+
type ReqrespOptions = {
|
|
7
|
+
disableStatusHandshake?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function createReqrespTest(options?: ReqrespOptions): Promise<P2PNetworkTest>;
|
|
10
|
+
export declare function cleanupReqrespTest(params: {
|
|
11
|
+
t: P2PNetworkTest;
|
|
12
|
+
nodes?: AztecNodeService[];
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function runReqrespTxTest(params: {
|
|
15
|
+
t: P2PNetworkTest;
|
|
16
|
+
disableStatusHandshake?: boolean;
|
|
17
|
+
}): Promise<AztecNodeService[]>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wMnAvcmVxcmVzcC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBYzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUluRCxlQUFPLE1BQU0sY0FBYyxJQUFJLENBQUM7QUFDaEMsZUFBTyxNQUFNLGdCQUFnQixJQUFJLENBQUM7QUFDbEMsZUFBTyxNQUFNLGtCQUFrQixRQUF1QixDQUFDO0FBRXZELEtBQUssY0FBYyxHQUFHO0lBQ3BCLHNCQUFzQixDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQ2xDLENBQUM7QUFFRix3QkFBc0IsaUJBQWlCLENBQUMsT0FBTyxHQUFFLGNBQW1CLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQTJCN0Y7QUFFRCx3QkFBc0Isa0JBQWtCLENBQUMsTUFBTSxFQUFFO0lBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQztJQUFDLEtBQUssQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUE7Q0FBRSxpQkFNakc7QUFJRCx3QkFBc0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0lBQzdDLENBQUMsRUFBRSxjQUFjLENBQUM7SUFDbEIsc0JBQXNCLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDbEMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQWlLOUIifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/p2p/reqresp/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAc1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,KAAK,cAAc,GAAG;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2B7F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAAE,iBAMjG;AAID,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,CAAC,EAAE,cAAc,CAAC;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiK9B"}
|
|
@@ -7,9 +7,6 @@ import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
|
7
7
|
import { timesAsync } from '@aztec/foundation/collection';
|
|
8
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
9
9
|
import { expect, jest } from '@jest/globals';
|
|
10
|
-
import fs from 'fs';
|
|
11
|
-
import os from 'os';
|
|
12
|
-
import path from 'path';
|
|
13
10
|
import { getBootNodeUdpPort, shouldCollectMetrics } from '../../fixtures/fixtures.js';
|
|
14
11
|
import { createNodes } from '../../fixtures/setup_p2p_test.js';
|
|
15
12
|
import { P2PNetworkTest } from '../p2p_network.js';
|
|
@@ -18,7 +15,6 @@ import { prepareTransactions } from '../shared.js';
|
|
|
18
15
|
export const NUM_VALIDATORS = 6;
|
|
19
16
|
export const NUM_TXS_PER_NODE = 4;
|
|
20
17
|
export const BOOT_NODE_UDP_PORT = getBootNodeUdpPort();
|
|
21
|
-
export const createReqrespDataDir = ()=>fs.mkdtempSync(path.join(os.tmpdir(), 'reqresp-'));
|
|
22
18
|
export async function createReqrespTest(options = {}) {
|
|
23
19
|
const { disableStatusHandshake = false } = options;
|
|
24
20
|
const t = await P2PNetworkTest.create({
|
|
@@ -29,13 +25,11 @@ export async function createReqrespTest(options = {}) {
|
|
|
29
25
|
// To collect metrics - run in aztec-packages `docker compose --profile metrics up`
|
|
30
26
|
metricsPort: shouldCollectMetrics(),
|
|
31
27
|
initialConfig: {
|
|
32
|
-
ethereumSlotDuration:
|
|
28
|
+
ethereumSlotDuration: 12,
|
|
33
29
|
aztecSlotDuration: 36,
|
|
34
30
|
blockDurationMs: 6000,
|
|
35
|
-
l1PublishingTime: 8,
|
|
36
31
|
minTxsPerBlock: 1,
|
|
37
32
|
maxTxsPerBlock: 2,
|
|
38
|
-
enforceTimeTable: true,
|
|
39
33
|
aztecProofSubmissionEpochs: 1024,
|
|
40
34
|
...disableStatusHandshake ? {
|
|
41
35
|
p2pDisableStatusHandshake: true
|
|
@@ -52,22 +46,15 @@ export async function createReqrespTest(options = {}) {
|
|
|
52
46
|
return t;
|
|
53
47
|
}
|
|
54
48
|
export async function cleanupReqrespTest(params) {
|
|
55
|
-
const { t, nodes
|
|
49
|
+
const { t, nodes } = params;
|
|
56
50
|
if (nodes) {
|
|
57
51
|
await t.stopNodes(nodes);
|
|
58
52
|
}
|
|
59
53
|
await t.teardown();
|
|
60
|
-
for(let i = 0; i < NUM_VALIDATORS; i++){
|
|
61
|
-
fs.rmSync(`${dataDir}-${i}`, {
|
|
62
|
-
recursive: true,
|
|
63
|
-
force: true,
|
|
64
|
-
maxRetries: 3
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
54
|
}
|
|
68
55
|
const getNodePort = (nodeIndex)=>BOOT_NODE_UDP_PORT + 1 + nodeIndex;
|
|
69
56
|
export async function runReqrespTxTest(params) {
|
|
70
|
-
const { t,
|
|
57
|
+
const { t, disableStatusHandshake = false } = params;
|
|
71
58
|
if (!t.bootstrapNodeEnr) {
|
|
72
59
|
throw new Error('Bootstrap node ENR is not available');
|
|
73
60
|
}
|
|
@@ -76,7 +63,7 @@ export async function runReqrespTxTest(params) {
|
|
|
76
63
|
...t.ctx.aztecNodeConfig,
|
|
77
64
|
p2pDisableStatusHandshake: true
|
|
78
65
|
} : t.ctx.aztecNodeConfig;
|
|
79
|
-
const nodes = await createNodes(aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_VALIDATORS, BOOT_NODE_UDP_PORT, t.genesis,
|
|
66
|
+
const nodes = await createNodes(aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_VALIDATORS, BOOT_NODE_UDP_PORT, t.genesis, t.dataDirFor('validator'), shouldCollectMetrics());
|
|
80
67
|
t.logger.info('Waiting for nodes to connect');
|
|
81
68
|
await t.waitForP2PMeshConnectivity(nodes, NUM_VALIDATORS);
|
|
82
69
|
await t.setupAccount();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
+
import type { Archiver } from '@aztec/archiver';
|
|
3
|
+
import type { AztecNodeService } from '@aztec/aztec-node';
|
|
4
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
5
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
6
|
+
import { TxHash } from '@aztec/aztec.js/tx';
|
|
7
|
+
import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
8
|
+
import { type TopicType } from '@aztec/stdlib/p2p';
|
|
9
|
+
import { type ProvenTx } from '../test-wallet/utils.js';
|
|
10
|
+
import { type P2PNetworkTest } from './p2p_network.js';
|
|
11
|
+
/** One published checkpoint as returned by the archiver, including its attestations. */
|
|
12
|
+
type PublishedCheckpoint = Awaited<ReturnType<Archiver['getCheckpoints']>>[number];
|
|
13
|
+
export declare const submitComplexTxsTo: (logger: Logger, from: AztecAddress, spamContract: SpamContract, numTxs: number, opts?: {
|
|
14
|
+
callPublic?: boolean | undefined;
|
|
15
|
+
}) => Promise<TxHash[]>;
|
|
16
|
+
export declare const submitTransactions: (logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData) => Promise<TxHash[]>;
|
|
17
|
+
export declare function prepareTransactions(logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData): Promise<ProvenTx[]>;
|
|
18
|
+
/** Runs the shared p2p QoS Grafana alert check when CHECK_ALERTS=true; a no-op otherwise. */
|
|
19
|
+
export declare function maybeCheckQosAlerts(logger: Logger): Promise<void>;
|
|
20
|
+
/** Waits until every node's synced block number reaches the initial node's current tip. */
|
|
21
|
+
export declare function waitForNodesToSync(t: P2PNetworkTest, nodes: AztecNodeService[]): Promise<void>;
|
|
22
|
+
/** Reads the published checkpoint containing the block that mined the given tx. */
|
|
23
|
+
export declare function getPublishedCheckpointForTx(node: AztecNodeService, txHash: TxHash): Promise<PublishedCheckpoint>;
|
|
24
|
+
/** Polls until the archiver has indexed the first published checkpoint, then returns it. */
|
|
25
|
+
export declare function waitForFirstPublishedCheckpoint(t: P2PNetworkTest, nodes: AztecNodeService[], timeoutSeconds?: number): Promise<PublishedCheckpoint>;
|
|
26
|
+
/**
|
|
27
|
+
* Recovers the attestation signers from a published checkpoint and asserts each one belongs to the
|
|
28
|
+
* validator set formed by the given nodes. Returns the recovered signer addresses so callers can add
|
|
29
|
+
* scenario-specific assertions (e.g. an exact signer count).
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyAttestationSigners(t: P2PNetworkTest, nodes: AztecNodeService[], publishedCheckpoint: PublishedCheckpoint): Promise<string[]>;
|
|
32
|
+
/** Options that parameterize {@link runGossipScenario}. */
|
|
33
|
+
export interface GossipScenarioOptions {
|
|
34
|
+
/** The initialized P2P network test (setup() + validator registration already done). */
|
|
35
|
+
t: P2PNetworkTest;
|
|
36
|
+
/** Number of validator nodes forming the committee. */
|
|
37
|
+
numValidators: number;
|
|
38
|
+
/** Base UDP port for the validator nodes. */
|
|
39
|
+
bootNodePort: number;
|
|
40
|
+
/** Transactions submitted per validator node; 0 skips tx submission entirely (e.g. the oracle test). */
|
|
41
|
+
txsPerNode: number;
|
|
42
|
+
/** Submit tx batches sequentially instead of concurrently. */
|
|
43
|
+
submitSequentially?: boolean;
|
|
44
|
+
/** Overrides for the P2P mesh-connectivity wait; unset fields fall back to waitForP2PMeshConnectivity defaults. */
|
|
45
|
+
mesh?: {
|
|
46
|
+
expectedNodeCount?: number;
|
|
47
|
+
timeoutSeconds?: number;
|
|
48
|
+
checkIntervalSeconds?: number;
|
|
49
|
+
topics?: TopicType[];
|
|
50
|
+
minMeshPeerCount?: number;
|
|
51
|
+
};
|
|
52
|
+
/** Which published checkpoint the attestation signers are read from (defaults to the first tx's block). */
|
|
53
|
+
checkpointSource?: 'first-tx' | 'first-published';
|
|
54
|
+
/** Runs after validator registration but before the validator nodes are created. */
|
|
55
|
+
beforeCreateNodes?: () => Promise<void>;
|
|
56
|
+
/** Creates extra non-validator nodes (prover/monitor) once the validator nodes exist. */
|
|
57
|
+
createExtraNodes?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
58
|
+
/** Runs after the account is registered but before txs are submitted (sync waits, checkpoint waits, sleeps). */
|
|
59
|
+
beforeSubmit?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
60
|
+
/** Scenario-specific verification run after attestation-signer verification (proven block, price convergence). */
|
|
61
|
+
afterVerify?: (nodes: AztecNodeService[]) => Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Shared skeleton for the p2p gossip tests: create the validator nodes and any extra nodes, wait for
|
|
65
|
+
* the mesh to form, register the account, optionally submit and mine txs, then verify the attestation
|
|
66
|
+
* signers of a published checkpoint. Each varying part (validator registration, extra nodes, pre-submit
|
|
67
|
+
* waits, scenario-specific verification) is supplied via the callbacks in {@link GossipScenarioOptions}.
|
|
68
|
+
* Returns the validator nodes so the caller can track them for teardown.
|
|
69
|
+
*/
|
|
70
|
+
export declare function runGossipScenario(opts: GossipScenarioOptions): Promise<AztecNodeService[]>;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcDJwL3NoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHOUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSzVDLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSXZFLE9BQU8sRUFBMkMsS0FBSyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVc1RixPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQW9CLE1BQU0seUJBQXlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTVFLHdGQUF3RjtBQUN4RixLQUFLLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBR25GLGVBQU8sTUFBTSxrQkFBa0I7O3VCQWtCOUIsQ0FBQztBQUdGLGVBQU8sTUFBTSxrQkFBa0Isa0hBc0I5QixDQUFDO0FBRUYsd0JBQXNCLG1CQUFtQixDQUN2QyxNQUFNLEVBQUUsTUFBTSxFQUNkLElBQUksRUFBRSxnQkFBZ0IsRUFDdEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxhQUFhLEVBQUUsa0JBQWtCLEdBQ2hDLE9BQU8sQ0FBQyxRQUFRLEVB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/p2p/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { timesAsync } from '@aztec/foundation/collection';
|
|
5
|
+
import { Signature } from '@aztec/foundation/eth-signature';
|
|
6
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
7
|
+
import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.js/Test';
|
|
8
|
+
import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
9
|
+
import { CheckpointAttestation, ConsensusPayload } from '@aztec/stdlib/p2p';
|
|
10
|
+
import { expect } from '@jest/globals';
|
|
11
|
+
import { shouldCollectMetrics } from '../fixtures/fixtures.js';
|
|
12
|
+
import { SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
13
|
+
import { createNodes } from '../fixtures/setup_p2p_test.js';
|
|
14
|
+
import { waitForTxs } from '../fixtures/wait_helpers.js';
|
|
15
|
+
import { GrafanaClient } from '../quality_of_service/grafana_client.js';
|
|
16
|
+
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
17
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
18
|
+
import { proveInteraction } from '../test-wallet/utils.js';
|
|
19
|
+
import { WAIT_FOR_TX_TIMEOUT } from './p2p_network.js';
|
|
20
|
+
// submits a set of transactions to the provided Private eXecution Environment (PXE)
|
|
21
|
+
export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opts = {})=>{
|
|
22
|
+
const txs = [];
|
|
23
|
+
const seed = 1234n;
|
|
24
|
+
const spamCount = 15;
|
|
25
|
+
for(let i = 0; i < numTxs; i++){
|
|
26
|
+
const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
|
|
27
|
+
const { txHash } = await method.send({
|
|
28
|
+
from,
|
|
29
|
+
wait: NO_WAIT
|
|
30
|
+
});
|
|
31
|
+
logger.info(`Tx sent with hash ${txHash.toString()}`);
|
|
32
|
+
txs.push(txHash);
|
|
33
|
+
}
|
|
34
|
+
return txs;
|
|
35
|
+
};
|
|
36
|
+
// creates a wallet and submit a given number of transactions through it.
|
|
37
|
+
export const submitTransactions = async (logger, node, numTxs, fundedAccount)=>{
|
|
38
|
+
const rpcConfig = getRpcConfig();
|
|
39
|
+
rpcConfig.proverEnabled = false;
|
|
40
|
+
const wallet = await TestWallet.create(node, // Use checkpointed chain tip to avoid anchoring on provisional blocks that the archiver can prune
|
|
41
|
+
// when their slot ends without a checkpoint landing on L1.
|
|
42
|
+
{
|
|
43
|
+
...getPXEConfig(),
|
|
44
|
+
proverEnabled: false,
|
|
45
|
+
syncChainTip: 'checkpointed'
|
|
46
|
+
}, {
|
|
47
|
+
loggerActorLabel: 'pxe-tx'
|
|
48
|
+
});
|
|
49
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
50
|
+
const fundedAccountManager = await wallet.createAccount({
|
|
51
|
+
secret: fundedAccount.secret,
|
|
52
|
+
salt: fundedAccount.salt,
|
|
53
|
+
contract
|
|
54
|
+
});
|
|
55
|
+
return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
|
|
56
|
+
};
|
|
57
|
+
export async function prepareTransactions(logger, node, numTxs, fundedAccount) {
|
|
58
|
+
const rpcConfig = getRpcConfig();
|
|
59
|
+
rpcConfig.proverEnabled = false;
|
|
60
|
+
const wallet = await TestWallet.create(node, {
|
|
61
|
+
...getPXEConfig(),
|
|
62
|
+
proverEnabled: false,
|
|
63
|
+
syncChainTip: 'checkpointed'
|
|
64
|
+
}, {
|
|
65
|
+
loggerActorLabel: 'pxe-tx'
|
|
66
|
+
});
|
|
67
|
+
const accountContract = new SchnorrHardcodedKeyAccountContract();
|
|
68
|
+
const fundedAccountManager = await wallet.createAccount({
|
|
69
|
+
secret: fundedAccount.secret,
|
|
70
|
+
salt: fundedAccount.salt,
|
|
71
|
+
contract: accountContract
|
|
72
|
+
});
|
|
73
|
+
const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
|
|
74
|
+
salt: Fr.random()
|
|
75
|
+
});
|
|
76
|
+
await wallet.registerContract(testContractInstance, TestContractArtifact);
|
|
77
|
+
const contract = TestContract.at(testContractInstance.address, wallet);
|
|
78
|
+
return timesAsync(numTxs, async ()=>{
|
|
79
|
+
const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
|
|
80
|
+
from: fundedAccountManager.address
|
|
81
|
+
});
|
|
82
|
+
logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
|
|
83
|
+
return tx;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const CHECK_ALERTS = process.env.CHECK_ALERTS === 'true';
|
|
87
|
+
const qosAlerts = [
|
|
88
|
+
{
|
|
89
|
+
alert: 'SequencerTimeToCollectAttestations',
|
|
90
|
+
expr: 'aztec_sequencer_time_to_collect_attestations > 3500',
|
|
91
|
+
labels: {
|
|
92
|
+
severity: 'error'
|
|
93
|
+
},
|
|
94
|
+
for: '10m',
|
|
95
|
+
annotations: {}
|
|
96
|
+
}
|
|
97
|
+
];
|
|
98
|
+
/** Runs the shared p2p QoS Grafana alert check when CHECK_ALERTS=true; a no-op otherwise. */ export async function maybeCheckQosAlerts(logger) {
|
|
99
|
+
if (CHECK_ALERTS) {
|
|
100
|
+
const checker = new GrafanaClient(logger);
|
|
101
|
+
await checker.runAlertCheck(qosAlerts);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Waits until every node's synced block number reaches the initial node's current tip. */ export async function waitForNodesToSync(t, nodes) {
|
|
105
|
+
const targetBlock = await t.ctx.aztecNode.getBlockNumber();
|
|
106
|
+
t.logger.warn(`Waiting for all nodes to sync to block number ${targetBlock}`);
|
|
107
|
+
await retryUntil(async ()=>{
|
|
108
|
+
const blockNumbers = await Promise.all(nodes.map((node)=>node.getBlockNumber()));
|
|
109
|
+
const checkpointNumber = (await t.monitor.run()).checkpointNumber;
|
|
110
|
+
t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
|
|
111
|
+
return blockNumbers.every((bn)=>bn >= targetBlock);
|
|
112
|
+
}, `nodes to sync to block number ${targetBlock}`, 30, 0.5);
|
|
113
|
+
}
|
|
114
|
+
/** Reads the published checkpoint containing the block that mined the given tx. */ export async function getPublishedCheckpointForTx(node, txHash) {
|
|
115
|
+
const receipt = await node.getTxReceipt(txHash);
|
|
116
|
+
const blockNumber = receipt.blockNumber;
|
|
117
|
+
const dataStore = node.getBlockSource();
|
|
118
|
+
const blockData = await dataStore.getBlockData({
|
|
119
|
+
number: BlockNumber(blockNumber)
|
|
120
|
+
});
|
|
121
|
+
const [publishedCheckpoint] = await dataStore.getCheckpoints({
|
|
122
|
+
from: blockData.checkpointNumber,
|
|
123
|
+
limit: 1
|
|
124
|
+
});
|
|
125
|
+
return publishedCheckpoint;
|
|
126
|
+
}
|
|
127
|
+
/** Polls until the archiver has indexed the first published checkpoint, then returns it. */ export async function waitForFirstPublishedCheckpoint(t, nodes, timeoutSeconds = 120) {
|
|
128
|
+
const dataStore = nodes[0].getBlockSource();
|
|
129
|
+
t.logger.warn('Waiting for first checkpoint to be published and indexed by the archiver');
|
|
130
|
+
return await retryUntil(async ()=>{
|
|
131
|
+
const blockNumbers = await Promise.all(nodes.map((node)=>node.getBlockNumber()));
|
|
132
|
+
const checkpointNumber = (await t.monitor.run()).checkpointNumber;
|
|
133
|
+
t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
|
|
134
|
+
const [checkpoint] = await dataStore.getCheckpoints({
|
|
135
|
+
from: CheckpointNumber(1),
|
|
136
|
+
limit: 1
|
|
137
|
+
});
|
|
138
|
+
return checkpoint;
|
|
139
|
+
}, 'published checkpoint to be indexed', timeoutSeconds, 1);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Recovers the attestation signers from a published checkpoint and asserts each one belongs to the
|
|
143
|
+
* validator set formed by the given nodes. Returns the recovered signer addresses so callers can add
|
|
144
|
+
* scenario-specific assertions (e.g. an exact signer count).
|
|
145
|
+
*/ export async function verifyAttestationSigners(t, nodes, publishedCheckpoint) {
|
|
146
|
+
const signatureContext = {
|
|
147
|
+
chainId: t.ctx.aztecNodeConfig.l1ChainId,
|
|
148
|
+
rollupAddress: t.ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress
|
|
149
|
+
};
|
|
150
|
+
const payload = ConsensusPayload.fromCheckpoint(publishedCheckpoint.checkpoint, signatureContext);
|
|
151
|
+
const attestations = publishedCheckpoint.attestations.filter((a)=>!a.signature.isEmpty()).map((a)=>new CheckpointAttestation(payload, a.signature, Signature.empty()));
|
|
152
|
+
const signers = await Promise.all(attestations.map((att)=>att.getSender().toString()));
|
|
153
|
+
t.logger.info(`Attestation signers`, {
|
|
154
|
+
signers
|
|
155
|
+
});
|
|
156
|
+
// Check that the signers found are part of the proposer nodes to ensure the archiver fetched them right
|
|
157
|
+
const validatorAddresses = nodes.flatMap((node)=>node.getSequencer().validatorAddresses?.map((a)=>a.toString()));
|
|
158
|
+
t.logger.info(`Validator addresses`, {
|
|
159
|
+
addresses: validatorAddresses
|
|
160
|
+
});
|
|
161
|
+
for (const signer of signers){
|
|
162
|
+
expect(validatorAddresses).toContain(signer);
|
|
163
|
+
}
|
|
164
|
+
return signers;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Shared skeleton for the p2p gossip tests: create the validator nodes and any extra nodes, wait for
|
|
168
|
+
* the mesh to form, register the account, optionally submit and mine txs, then verify the attestation
|
|
169
|
+
* signers of a published checkpoint. Each varying part (validator registration, extra nodes, pre-submit
|
|
170
|
+
* waits, scenario-specific verification) is supplied via the callbacks in {@link GossipScenarioOptions}.
|
|
171
|
+
* Returns the validator nodes so the caller can track them for teardown.
|
|
172
|
+
*/ export async function runGossipScenario(opts) {
|
|
173
|
+
const { t, numValidators, bootNodePort, txsPerNode } = opts;
|
|
174
|
+
if (!t.bootstrapNodeEnr) {
|
|
175
|
+
throw new Error('Bootstrap node ENR is not available');
|
|
176
|
+
}
|
|
177
|
+
await opts.beforeCreateNodes?.();
|
|
178
|
+
t.logger.info('Creating validator nodes');
|
|
179
|
+
const nodes = await createNodes(t.ctx.aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, numValidators, bootNodePort, t.genesis, t.dataDirFor('validator'), shouldCollectMetrics());
|
|
180
|
+
await opts.createExtraNodes?.(nodes);
|
|
181
|
+
t.logger.info('Waiting for nodes to connect');
|
|
182
|
+
await t.waitForP2PMeshConnectivity(nodes, opts.mesh?.expectedNodeCount ?? numValidators, opts.mesh?.timeoutSeconds, opts.mesh?.checkIntervalSeconds, opts.mesh?.topics, opts.mesh?.minMeshPeerCount);
|
|
183
|
+
// We need to create the nodes before we setup the account, because those nodes form the committee
|
|
184
|
+
// and blocks cannot be built without them (targetCommitteeSize is set to the number of nodes).
|
|
185
|
+
await t.setupAccount();
|
|
186
|
+
await opts.beforeSubmit?.(nodes);
|
|
187
|
+
let firstTxHash;
|
|
188
|
+
if (txsPerNode > 0) {
|
|
189
|
+
t.logger.info('Submitting transactions');
|
|
190
|
+
const submitOne = (node)=>submitTransactions(t.logger, node, txsPerNode, t.fundedAccount);
|
|
191
|
+
// Each submitTransactions call builds its own wallet/PXE, so submissions are independent. When run
|
|
192
|
+
// concurrently, Promise.all preserves node order so submitted[i] stays aligned with nodes[i].
|
|
193
|
+
const submitted = [];
|
|
194
|
+
if (opts.submitSequentially) {
|
|
195
|
+
for (const node of nodes){
|
|
196
|
+
submitted.push(await submitOne(node));
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
submitted.push(...await Promise.all(nodes.map(submitOne)));
|
|
200
|
+
}
|
|
201
|
+
firstTxHash = submitted[0][0];
|
|
202
|
+
t.logger.info('Waiting for transactions to be mined');
|
|
203
|
+
await waitForTxs(nodes[0], submitted.flat(), {
|
|
204
|
+
timeout: WAIT_FOR_TX_TIMEOUT
|
|
205
|
+
});
|
|
206
|
+
t.logger.info('All transactions mined');
|
|
207
|
+
}
|
|
208
|
+
const publishedCheckpoint = opts.checkpointSource === 'first-published' ? await waitForFirstPublishedCheckpoint(t, nodes) : await getPublishedCheckpointForTx(nodes[0], firstTxHash);
|
|
209
|
+
await verifyAttestationSigners(t, nodes, publishedCheckpoint);
|
|
210
|
+
await opts.afterVerify?.(nodes);
|
|
211
|
+
return nodes;
|
|
212
|
+
}
|
|
@@ -25,7 +25,7 @@ import { type Hex } from 'viem';
|
|
|
25
25
|
* @param underlyingERC20Address - address of the underlying ERC20 contract to use (if none supplied, it deploys one)
|
|
26
26
|
* @returns l2 contract instance, bridge contract instance, token portal instance, token portal address and the underlying ERC20 instance
|
|
27
27
|
*/
|
|
28
|
-
export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, l1Client: ExtendedViemWalletClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress): Promise<{
|
|
28
|
+
export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, l1Client: ExtendedViemWalletClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress, predeployedTokenPortalAddress?: EthAddress): Promise<{
|
|
29
29
|
/**
|
|
30
30
|
* The L2 token contract instance.
|
|
31
31
|
*/
|
|
@@ -84,7 +84,7 @@ export declare class CrossChainTestHarness {
|
|
|
84
84
|
readonly wallet: Wallet;
|
|
85
85
|
/** Owner of the l2 token and bridge */
|
|
86
86
|
readonly ownerAddress: AztecAddress;
|
|
87
|
-
static new(aztecNode: AztecNode, l1Client: ExtendedViemWalletClient, wallet: Wallet, ownerAddress: AztecAddress, logger: Logger, underlyingERC20Address: EthAddress): Promise<CrossChainTestHarness>;
|
|
87
|
+
static new(aztecNode: AztecNode, l1Client: ExtendedViemWalletClient, wallet: Wallet, ownerAddress: AztecAddress, logger: Logger, underlyingERC20Address: EthAddress, predeployedTokenPortalAddress?: EthAddress): Promise<CrossChainTestHarness>;
|
|
88
88
|
private readonly l1TokenManager;
|
|
89
89
|
private readonly l1TokenPortalManager;
|
|
90
90
|
readonly outboxContract: OutboxContract;
|
|
@@ -140,4 +140,4 @@ export declare class CrossChainTestHarness {
|
|
|
140
140
|
makeMessageConsumable(msgHash: Fr | Hex): Promise<void>;
|
|
141
141
|
toCrossChainContext(): CrossChainContext;
|
|
142
142
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NfY2hhaW5fdGVzdF9oYXJuZXNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL2Nyb3NzX2NoYWluX3Rlc3RfaGFybmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFHTCxLQUFLLGFBQWEsRUFDbEIsS0FBSywwQkFBMEIsRUFDaEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQU03Qzs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IsMENBQTBDLENBQzlELE1BQU0sRUFBRSxNQUFNLEVBQ2QsUUFBUSxFQUFFLHdCQUF3QixFQUNsQyxxQkFBcUIsRUFBRSxVQUFVLEVBQ2pDLEtBQUssRUFBRSxZQUFZLEVBQ25CLHNCQUFzQixFQUFFLFVBQVUsRUFDbEMsNkJBQTZCLENBQUMsRUFBRSxVQUFVLEdBQ3pDLE9BQU8sQ0FBQztJQUNUOztPQUVHO0lBQ0gsS0FBSyxFQUFFLGFBQWEsQ0FBQztJQUNyQjs7T0FFRztJQUNILE1BQU0sRUFBRSxtQkFBbUIsQ0FBQztJQUM1Qjs7T0FFRztJQUNILGtCQUFrQixFQUFFLFVBQVUsQ0FBQztJQUMvQjs7T0FFRztJQUNILFdBQVcsRUFBRSxHQUFHLENBQUM7SUFDakI7O09BRUc7SUFDSCxlQUFlLEVBQUUsR0FBRyxDQUFDO0NBQ3RCLENBQUMsQ0FtREQ7QUFFRCxNQUFNLE1BQU0saUJBQWlCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLFlBQVksQ0FBQztJQUN0QixRQUFRLEVBQUUsWUFBWSxDQUFDO0lBQ3ZCLFdBQVcsRUFBRSxVQUFVLENBQUM7SUFDeEIsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUN2QixVQUFVLEVBQUUsVUFBVSxDQUFDO0lBQ3ZCLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDM0IsS0FBSyxFQUFFLFVBQVUsQ0FBQztJQUNsQixNQUFNLEVBQUUsVUFBVSxDQUFDO0NBQ3BCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxxQkFBYSxxQkFBcUI7SUE2QzlCLDJCQUEyQjtJQUNwQixTQUFTLEVBQUUsU0FBUztJQUMzQixjQUFjO0lBQ1AsTUFBTSxFQUFFLE1BQU07SUFFckIseUJBQXlCO0lBQ2xCLE9BQU8sRUFBRSxhQUFhO0lBQzdCLGdDQUFnQztJQUN6QixRQUFRLEVBQUUsbUJBQW1CO0lBRXBDLG9DQUFvQztJQUM3QixVQUFVLEVBQUUsVUFBVTtJQUU3QixzQkFBc0I7SUFDZixrQkFBa0IsRUFBRSxVQUFVO0lBQ3JDLHlDQUF5QztJQUNsQyxzQkFBc0IsRUFBRSxVQUFVO0lBQ3pDLHFDQUFxQztJQUM5QixRQUFRLEVBQUUsd0JBQXdCO0lBRXpDLGdEQUFnRDthQUNoQyxtQkFBbUIsRUFBRSxtQkFBbUI7SUFFeEQsNENBQTRDO2FBQzVCLE1BQU0sRUFBRSxNQUFNO0lBRTlCLHVDQUF1QzthQUN2QixZQUFZLEVBQUUsWUFBWTtJQXZFNUMsT0FBYSxHQUFHLENBQ2QsU0FBUyxFQUFFLFNBQVMsRUFDcEIsUUFBUSxFQUFFLHdCQUF3QixFQUNsQyxNQUFNLEVBQUUsTUFBTSxFQUNkLFlBQVksRUFBRSxZQUFZLEVBQzFCLE1BQU0sRUFBRSxNQUFNLEVBQ2Qsc0JBQXNCLEVBQUUsVUFBVSxFQUNsQyw2QkFBNkIsQ0FBQyxFQUFFLFVBQVUsR0FDekMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBNkJoQztJQUVELE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFpQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUF1QjtJQUM1RCxTQUFnQixjQUFjLEVBQUUsY0FBYyxDQUFDO0lBRS9DO0lBQ0UsMkJBQTJCO0lBQ3BCLFNBQVMsRUFBRSxTQUFTO0lBQzNCLGNBQWM7SUFDUCxNQUFNLEVBQUUsTUFBTTtJQUVyQix5QkFBeUI7SUFDbEIsT0FBTyxFQUFFLGFBQWE7SUFDN0IsZ0NBQWdDO0lBQ3pCLFFBQVEsRUFBRSxtQkFBbUI7SUFFcEMsb0NBQW9DO0lBQzdCLFVBQVUsRUFBRSxVQUFVO0lBRTdCLHNCQUFzQjtJQUNmLGtCQUFrQixFQUFFLFVBQVU7SUFDckMseUNBQXlDO0lBQ2xDLHNCQUFzQixFQUFFLFVBQVU7SUFDekMscUNBQXFDO0lBQzlCLFFBQVEsRUFBRSx3QkFBd0I7SUFFekMsZ0RBQWdEO0lBQ2hDLG1CQUFtQixFQUFFLG1CQUFtQjtJQUV4RCw0Q0FBNEM7SUFDNUIsTUFBTSxFQUFFLE1BQU07SUFFOUIsdUNBQXVDO0lBQ3ZCLFlBQVksRUFBRSxZQUFZLEVBWTNDO0lBRUssY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLGlCQVVsQztJQUVELGNBQWMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxtQkFFakM7SUFFRCx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksVUFBUSwwQkFFMUQ7SUFFRCx5QkFBeUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksVUFBUSx1Q0FFM0Q7SUFFSyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxpQkFLeEM7SUFFSyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxpQkFFekM7SUFFSyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxZQUFZLGlCQUsvRTtJQUVLLHFDQUFxQyxDQUN6QyxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLGFBQWEsR0FBRyxhQUFhLEdBQUcsa0JBQWtCLEdBQUcsV0FBVyxDQUFDLGlCQU8xRztJQUVLLG9DQUFvQyxDQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLEdBQUcsYUFBYSxHQUFHLGtCQUFrQixDQUFDLGlCQU8vRTtJQUVLLDRCQUE0QixDQUNoQyxjQUFjLEVBQUUsTUFBTSxFQUN0QixZQUFZLGdCQUFjLEVBQzFCLFdBQVcsRUFBRSxXQUFXLEdBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FNcEI7SUFFSywyQkFBMkIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLFlBQVksR0FBRSxFQUFZLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQU14RztJQUVLLHFCQUFxQixDQUFDLEtBQUssRUFBRSxZQUFZLGdCQUU5QztJQUVLLHdCQUF3QixDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBSTFFO0lBRUssb0JBQW9CLENBQUMsS0FBSyxFQUFFLFlBQVksZ0JBRTdDO0lBRUssdUJBQXVCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFHekU7SUFFSyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsR0FBRSxVQUE0QixHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FPeEc7SUFFRCwyQkFBMkIsQ0FDekIsTUFBTSxFQUFFLE1BQU0sRUFDZCxXQUFXLEVBQUUsV0FBVyxFQUN4QixxQkFBcUIsRUFBRSxNQUFNLEVBQzdCLFlBQVksRUFBRSxNQUFNLEVBQ3BCLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLGlCQVVqQztJQUVLLHFCQUFxQixDQUFDLFlBQVksRUFBRSxNQUFNLGlCQUcvQztJQUVLLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxLQUFVLGlCQUtoRTtJQUVEOzs7Ozs7T0FNRztJQUNHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsR0FBRyxpQkFNNUM7SUFFRCxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FXdkM7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"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"}
|