@aztec/end-to-end 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bench/client_flows/benchmark.d.ts +4 -3
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +26 -15
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +111 -90
- package/dest/bench/client_flows/config.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +10 -30
- package/dest/bench/utils.d.ts +3 -12
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +17 -37
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +8 -8
- 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 +42 -42
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +13 -10
- 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 +35 -35
- package/dest/e2e_deploy_contract/deploy_test.d.ts +12 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +9 -18
- package/dest/e2e_epochs/epochs_test.d.ts +20 -12
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +36 -27
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +14 -11
- package/dest/e2e_fees/fees_test.d.ts +13 -9
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +39 -40
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +9 -8
- package/dest/e2e_multi_validator/utils.d.ts +2 -2
- package/dest/e2e_multi_validator/utils.d.ts.map +1 -1
- package/dest/e2e_multi_validator/utils.js +4 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -4
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +11 -12
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
- package/dest/e2e_p2p/inactivity_slash_test.js +136 -0
- package/dest/e2e_p2p/p2p_network.d.ts +238 -18
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +50 -25
- package/dest/e2e_p2p/shared.d.ts +16 -17
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +57 -56
- package/dest/e2e_token_contract/token_contract_test.d.ts +6 -5
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +14 -17
- package/dest/fixtures/e2e_prover_test.d.ts +13 -11
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +57 -66
- package/dest/fixtures/fixtures.d.ts +2 -3
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +2 -3
- package/dest/fixtures/get_acvm_config.d.ts +2 -2
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +2 -2
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +2 -2
- package/dest/fixtures/index.d.ts +1 -1
- package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/logging.d.ts +1 -1
- package/dest/fixtures/setup_p2p_test.d.ts +12 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +50 -24
- package/dest/fixtures/snapshot_manager.d.ts +16 -15
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +84 -88
- package/dest/fixtures/token_utils.d.ts +10 -5
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +17 -18
- package/dest/fixtures/utils.d.ts +44 -47
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +128 -185
- package/dest/fixtures/web3signer.d.ts +5 -0
- package/dest/fixtures/web3signer.d.ts.map +1 -0
- package/dest/fixtures/web3signer.js +53 -0
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/quality_of_service/alert_checker.d.ts +2 -2
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +20 -23
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -16
- package/dest/shared/gas_portal_test_harness.d.ts +10 -17
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +11 -8
- package/dest/shared/index.d.ts +1 -1
- package/dest/shared/jest_setup.d.ts +1 -1
- package/dest/shared/jest_setup.js +1 -1
- package/dest/shared/submit-transactions.d.ts +6 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +8 -7
- package/dest/shared/uniswap_l1_l2.d.ts +13 -9
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +44 -58
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +4 -7
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +8 -5
- package/dest/simulators/token_simulator.d.ts +4 -2
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +22 -14
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +144 -86
- package/dest/spartan/tx_metrics.d.ts +39 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +95 -0
- package/dest/spartan/utils.d.ts +101 -16
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +414 -52
- package/package.json +43 -40
- package/src/bench/client_flows/benchmark.ts +8 -8
- package/src/bench/client_flows/client_flows_benchmark.ts +143 -115
- package/src/bench/client_flows/data_extractor.ts +9 -31
- package/src/bench/utils.ts +15 -39
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +46 -63
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +46 -55
- package/src/e2e_deploy_contract/deploy_test.ts +18 -36
- package/src/e2e_epochs/epochs_test.ts +59 -42
- package/src/e2e_fees/bridging_race.notest.ts +16 -11
- package/src/e2e_fees/fees_test.ts +48 -52
- package/src/e2e_l1_publisher/write_json.ts +12 -9
- package/src/e2e_multi_validator/utils.ts +5 -11
- package/src/e2e_nested_contract/nested_contract_test.ts +15 -13
- package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
- package/src/e2e_p2p/p2p_network.ts +125 -89
- package/src/e2e_p2p/shared.ts +69 -60
- package/src/e2e_token_contract/token_contract_test.ts +17 -17
- package/src/fixtures/e2e_prover_test.ts +65 -105
- package/src/fixtures/fixtures.ts +2 -5
- package/src/fixtures/get_acvm_config.ts +2 -2
- package/src/fixtures/get_bb_config.ts +3 -2
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup_p2p_test.ts +79 -32
- package/src/fixtures/snapshot_manager.ts +120 -131
- package/src/fixtures/token_utils.ts +16 -24
- package/src/fixtures/utils.ts +175 -269
- package/src/fixtures/web3signer.ts +63 -0
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/guides/up_quick_start.sh +3 -11
- package/src/quality_of_service/alert_checker.ts +1 -1
- package/src/shared/cross_chain_test_harness.ts +23 -31
- package/src/shared/gas_portal_test_harness.ts +14 -21
- package/src/shared/jest_setup.ts +1 -1
- package/src/shared/submit-transactions.ts +12 -8
- package/src/shared/uniswap_l1_l2.ts +80 -88
- package/src/simulators/lending_simulator.ts +9 -6
- package/src/simulators/token_simulator.ts +5 -2
- package/src/spartan/DEVELOP.md +15 -3
- package/src/spartan/setup_test_wallets.ts +171 -127
- package/src/spartan/tx_metrics.ts +130 -0
- package/src/spartan/utils.ts +543 -45
- package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
- package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
- package/dest/fixtures/setup_l1_contracts.js +0 -17
- package/src/fixtures/setup_l1_contracts.ts +0 -26
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Fr
|
|
1
|
+
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { createLogger } from '@aztec/aztec.js/log';
|
|
3
4
|
import { createSnapshotManager, deployAccounts } from '../fixtures/snapshot_manager.js';
|
|
4
5
|
const { E2E_DATA_PATH: dataPath } = process.env;
|
|
5
6
|
export class DeployTest {
|
|
6
7
|
snapshotManager;
|
|
7
8
|
logger;
|
|
8
|
-
pxe;
|
|
9
9
|
wallet;
|
|
10
10
|
defaultAccountAddress;
|
|
11
11
|
aztecNode;
|
|
@@ -17,7 +17,7 @@ export class DeployTest {
|
|
|
17
17
|
async setup() {
|
|
18
18
|
await this.applyInitialAccountSnapshot();
|
|
19
19
|
const context = await this.snapshotManager.setup();
|
|
20
|
-
({
|
|
20
|
+
({ aztecNode: this.aztecNode, wallet: this.wallet } = context);
|
|
21
21
|
this.aztecNodeAdmin = context.aztecNode;
|
|
22
22
|
return this;
|
|
23
23
|
}
|
|
@@ -25,11 +25,9 @@ export class DeployTest {
|
|
|
25
25
|
await this.snapshotManager.teardown();
|
|
26
26
|
}
|
|
27
27
|
async applyInitialAccountSnapshot() {
|
|
28
|
-
await this.snapshotManager.snapshot('initial_account', deployAccounts(1, this.logger),
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
this.wallet = wallets[0];
|
|
32
|
-
this.defaultAccountAddress = this.wallet.getAddress();
|
|
28
|
+
await this.snapshotManager.snapshot('initial_account', deployAccounts(1, this.logger), ({ deployedAccounts })=>{
|
|
29
|
+
this.defaultAccountAddress = deployedAccounts[0].address;
|
|
30
|
+
return Promise.resolve();
|
|
33
31
|
});
|
|
34
32
|
}
|
|
35
33
|
async registerContract(wallet, contractArtifact, opts = {}) {
|
|
@@ -37,18 +35,11 @@ export class DeployTest {
|
|
|
37
35
|
const instance = await getContractInstanceFromInstantiationParams(contractArtifact.artifact, {
|
|
38
36
|
constructorArgs: initArgs ?? [],
|
|
39
37
|
constructorArtifact: constructorName,
|
|
40
|
-
salt,
|
|
38
|
+
salt: salt ?? Fr.random(),
|
|
41
39
|
publicKeys,
|
|
42
40
|
deployer
|
|
43
41
|
});
|
|
44
|
-
await wallet.registerContract(
|
|
45
|
-
artifact: contractArtifact.artifact,
|
|
46
|
-
instance
|
|
47
|
-
});
|
|
42
|
+
await wallet.registerContract(instance, contractArtifact.artifact);
|
|
48
43
|
return contractArtifact.at(instance.address, wallet);
|
|
49
44
|
}
|
|
50
|
-
async registerRandomAccount() {
|
|
51
|
-
const completeAddress = await this.pxe.registerAccount(Fr.random(), Fr.random());
|
|
52
|
-
return completeAddress.address;
|
|
53
|
-
}
|
|
54
45
|
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
2
|
-
import { Fr
|
|
3
|
-
import {
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
4
|
+
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
5
|
+
import { EpochCache } from '@aztec/epoch-cache';
|
|
4
6
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
5
7
|
import { ChainMonitor, type Delayer } from '@aztec/ethereum/test';
|
|
8
|
+
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
9
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
6
10
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
7
|
-
import { ProverNode } from '@aztec/prover-node';
|
|
11
|
+
import { ProverNode, type ProverNodeConfig } from '@aztec/prover-node';
|
|
8
12
|
import { type SequencerClient, type SequencerEvents } from '@aztec/sequencer-client';
|
|
9
|
-
import {
|
|
13
|
+
import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
|
|
10
14
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
11
15
|
import { type EndToEndContext, type SetupOptions } from '../fixtures/utils.js';
|
|
12
16
|
export declare const WORLD_STATE_BLOCK_HISTORY = 2;
|
|
@@ -35,6 +39,7 @@ export declare class EpochsTestContext {
|
|
|
35
39
|
constants: L1RollupConstants;
|
|
36
40
|
logger: Logger;
|
|
37
41
|
monitor: ChainMonitor;
|
|
42
|
+
epochCache: EpochCache;
|
|
38
43
|
proverDelayer: Delayer;
|
|
39
44
|
sequencerDelayer: Delayer;
|
|
40
45
|
proverNodes: ProverNode[];
|
|
@@ -44,6 +49,7 @@ export declare class EpochsTestContext {
|
|
|
44
49
|
L2_SLOT_DURATION_IN_S: number;
|
|
45
50
|
static setup(opts?: EpochsTestOpts): Promise<EpochsTestContext>;
|
|
46
51
|
static getSlotDurations(opts?: EpochsTestOpts): {
|
|
52
|
+
l1PublishingTime: number;
|
|
47
53
|
ethereumSlotDuration: number;
|
|
48
54
|
aztecSlotDuration: number;
|
|
49
55
|
aztecEpochDuration: number;
|
|
@@ -51,7 +57,9 @@ export declare class EpochsTestContext {
|
|
|
51
57
|
};
|
|
52
58
|
setup(opts?: EpochsTestOpts): Promise<void>;
|
|
53
59
|
teardown(): Promise<void>;
|
|
54
|
-
createProverNode(
|
|
60
|
+
createProverNode(opts?: {
|
|
61
|
+
dontStart?: boolean;
|
|
62
|
+
} & Partial<ProverNodeConfig>): Promise<ProverNode>;
|
|
55
63
|
createNonValidatorNode(opts?: Partial<AztecNodeConfig>): Promise<AztecNodeService>;
|
|
56
64
|
createValidatorNode(privateKeys: `0x${string}`[], opts?: Partial<AztecNodeConfig> & {
|
|
57
65
|
txDelayerMaxInclusionTimeIntoSlot?: number;
|
|
@@ -61,14 +69,14 @@ export declare class EpochsTestContext {
|
|
|
61
69
|
private getNextPrivateKey;
|
|
62
70
|
/** Waits until the epoch begins (ie until the immediately previous L1 block is mined). */
|
|
63
71
|
waitUntilEpochStarts(epoch: number): Promise<bigint>;
|
|
64
|
-
/** Waits until the given
|
|
65
|
-
|
|
66
|
-
/** Waits until the given
|
|
67
|
-
|
|
72
|
+
/** Waits until the given checkpoint number is mined. */
|
|
73
|
+
waitUntilCheckpointNumber(target: CheckpointNumber, timeout?: number): Promise<void>;
|
|
74
|
+
/** Waits until the given checkpoint number is marked as proven. */
|
|
75
|
+
waitUntilProvenCheckpointNumber(target: CheckpointNumber, timeout?: number): Promise<CheckpointNumber>;
|
|
68
76
|
/** Waits until the last slot of the proof submission window for a given epoch. */
|
|
69
77
|
waitUntilLastSlotOfProofSubmissionWindow(epochNumber: number | bigint): Promise<void>;
|
|
70
78
|
/** Waits for the aztec node to sync to the target block number. */
|
|
71
|
-
waitForNodeToSync(blockNumber:
|
|
79
|
+
waitForNodeToSync(blockNumber: BlockNumber, type: 'proven' | 'finalized' | 'historic'): Promise<void>;
|
|
72
80
|
/** Registers the SpamContract on the given wallet. */
|
|
73
81
|
registerSpamContract(wallet: Wallet, salt?: Fr): Promise<SpamContract>;
|
|
74
82
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
|
|
@@ -77,10 +85,10 @@ export declare class EpochsTestContext {
|
|
|
77
85
|
delayer: Delayer;
|
|
78
86
|
}>;
|
|
79
87
|
/** Verifies whether the given block number is found on the aztec node. */
|
|
80
|
-
verifyHistoricBlock(blockNumber:
|
|
88
|
+
verifyHistoricBlock(blockNumber: BlockParameter, expectedSuccess: boolean): Promise<void>;
|
|
81
89
|
watchSequencerEvents(sequencers: SequencerClient[], getMetadata?: (i: number) => Record<string, any>): {
|
|
82
90
|
failEvents: TrackedSequencerEvent[];
|
|
83
91
|
stateChanges: TrackedSequencerEvent[];
|
|
84
92
|
};
|
|
85
93
|
}
|
|
86
|
-
//# sourceMappingURL=
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hzX3Rlc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lMmVfZXBvY2hzL2Vwb2Noc190ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzNFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQWtCLEtBQUssT0FBTyxFQUFxQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JILE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBTTdGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssZ0JBQWdCLEVBQXVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUYsT0FBTyxFQUNMLEtBQUssZUFBZSxFQUNwQixLQUFLLGVBQWUsRUFHckIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssaUJBQWlCLEVBQXVDLE1BQU0sNkJBQTZCLENBQUM7QUFPMUcsT0FBTyxFQUNMLEtBQUssZUFBZSxFQUNwQixLQUFLLFlBQVksRUFJ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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epochs_test.d.ts","sourceRoot":"","sources":["../../src/e2e_epochs/epochs_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"epochs_test.d.ts","sourceRoot":"","sources":["../../src/e2e_epochs/epochs_test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { AztecNodeService } from '@aztec/aztec-node';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { getTimestampRangeForEpoch } from '@aztec/aztec.js/block';
|
|
3
|
+
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
4
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
5
|
+
import { MerkleTreeId } from '@aztec/aztec.js/trees';
|
|
6
|
+
import { EpochCache } from '@aztec/epoch-cache';
|
|
7
|
+
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
8
|
+
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
4
9
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
5
10
|
import { ChainMonitor, DelayedTxUtils, waitUntilL1Timestamp, withDelayer } from '@aztec/ethereum/test';
|
|
11
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
6
12
|
import { SecretValue } from '@aztec/foundation/config';
|
|
7
|
-
import { randomBytes } from '@aztec/foundation/crypto';
|
|
13
|
+
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
8
14
|
import { withLogNameSuffix } from '@aztec/foundation/log';
|
|
15
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
16
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
9
17
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
10
18
|
import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
|
|
11
19
|
import { SequencerState } from '@aztec/sequencer-client';
|
|
@@ -30,6 +38,7 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
30
38
|
constants;
|
|
31
39
|
logger;
|
|
32
40
|
monitor;
|
|
41
|
+
epochCache;
|
|
33
42
|
proverDelayer;
|
|
34
43
|
sequencerDelayer;
|
|
35
44
|
proverNodes = [];
|
|
@@ -48,7 +57,9 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
48
57
|
const aztecSlotDuration = opts.aztecSlotDuration ?? ethereumSlotDuration * 2;
|
|
49
58
|
const aztecEpochDuration = opts.aztecEpochDuration ?? 6;
|
|
50
59
|
const aztecProofSubmissionEpochs = opts.aztecProofSubmissionEpochs ?? 1;
|
|
60
|
+
const l1PublishingTime = opts.l1PublishingTime ?? 1;
|
|
51
61
|
return {
|
|
62
|
+
l1PublishingTime,
|
|
52
63
|
ethereumSlotDuration,
|
|
53
64
|
aztecSlotDuration,
|
|
54
65
|
aztecEpochDuration,
|
|
@@ -56,7 +67,7 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
56
67
|
};
|
|
57
68
|
}
|
|
58
69
|
async setup(opts = {}) {
|
|
59
|
-
const { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs } = EpochsTestContext.getSlotDurations(opts);
|
|
70
|
+
const { ethereumSlotDuration, aztecSlotDuration, aztecEpochDuration, aztecProofSubmissionEpochs, l1PublishingTime } = EpochsTestContext.getSlotDurations(opts);
|
|
60
71
|
this.L1_BLOCK_TIME_IN_S = ethereumSlotDuration;
|
|
61
72
|
this.L2_SLOT_DURATION_IN_S = aztecSlotDuration;
|
|
62
73
|
// Set up system without any account nor protocol contracts
|
|
@@ -66,8 +77,6 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
66
77
|
checkIntervalMs: 50,
|
|
67
78
|
archiverPollingIntervalMS: ARCHIVER_POLL_INTERVAL,
|
|
68
79
|
worldStateBlockCheckIntervalMS: WORLD_STATE_BLOCK_CHECK_INTERVAL,
|
|
69
|
-
skipProtocolContracts: true,
|
|
70
|
-
salt: 1,
|
|
71
80
|
aztecEpochDuration,
|
|
72
81
|
aztecSlotDuration,
|
|
73
82
|
ethereumSlotDuration,
|
|
@@ -81,12 +90,10 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
81
90
|
// using the prover's eth address if the proverId is used for something in the rollup contract
|
|
82
91
|
// Use numeric EthAddress for deterministic prover id
|
|
83
92
|
proverId: EthAddress.fromNumber(1),
|
|
84
|
-
// This must be enough so that the tx from the prover is delayed properly,
|
|
85
|
-
// but not so much to hang the sequencer and timeout the teardown
|
|
86
|
-
txPropagationMaxQueryAttempts: opts.txPropagationMaxQueryAttempts ?? 12,
|
|
87
93
|
worldStateBlockHistory: WORLD_STATE_BLOCK_HISTORY,
|
|
88
94
|
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
89
95
|
slasherFlavor: 'none',
|
|
96
|
+
l1PublishingTime,
|
|
90
97
|
...opts
|
|
91
98
|
});
|
|
92
99
|
this.context = context;
|
|
@@ -99,6 +106,9 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
99
106
|
this.logger = context.logger;
|
|
100
107
|
this.l1Client = context.deployL1ContractsValues.l1Client;
|
|
101
108
|
this.rollup = RollupContract.getFromConfig(context.config);
|
|
109
|
+
this.epochCache = await EpochCache.create(this.rollup, context.config, {
|
|
110
|
+
dateProvider: context.dateProvider
|
|
111
|
+
});
|
|
102
112
|
// Loop that tracks L1 and L2 block numbers and logs whenever there's a new one.
|
|
103
113
|
this.monitor = new ChainMonitor(this.rollup, context.dateProvider, this.logger).start();
|
|
104
114
|
// This is hideous.
|
|
@@ -126,15 +136,17 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
126
136
|
await Promise.all(this.nodes.map((node)=>tryStop(node, this.logger)));
|
|
127
137
|
await this.context.teardown();
|
|
128
138
|
}
|
|
129
|
-
async createProverNode() {
|
|
139
|
+
async createProverNode(opts = {}) {
|
|
130
140
|
this.logger.warn('Creating and syncing a simulated prover node...');
|
|
131
141
|
const proverNodePrivateKey = this.getNextPrivateKey();
|
|
132
142
|
const suffix = (this.proverNodes.length + 1).toString();
|
|
133
143
|
const proverNode = await withLogNameSuffix(suffix, ()=>createAndSyncProverNode(proverNodePrivateKey, {
|
|
134
|
-
...this.context.config
|
|
135
|
-
proverId: EthAddress.fromNumber(parseInt(suffix, 10))
|
|
144
|
+
...this.context.config
|
|
136
145
|
}, {
|
|
137
|
-
dataDirectory: join(this.context.config.dataDirectory, randomBytes(8).toString('hex'))
|
|
146
|
+
dataDirectory: join(this.context.config.dataDirectory, randomBytes(8).toString('hex')),
|
|
147
|
+
proverId: EthAddress.fromNumber(parseInt(suffix, 10)),
|
|
148
|
+
dontStart: opts.dontStart,
|
|
149
|
+
...opts
|
|
138
150
|
}, this.context.aztecNode, undefined, {
|
|
139
151
|
dateProvider: this.context.dateProvider
|
|
140
152
|
}));
|
|
@@ -202,20 +214,20 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
202
214
|
return `0x${key.toString('hex')}`;
|
|
203
215
|
}
|
|
204
216
|
/** Waits until the epoch begins (ie until the immediately previous L1 block is mined). */ async waitUntilEpochStarts(epoch) {
|
|
205
|
-
const [start] = getTimestampRangeForEpoch(
|
|
217
|
+
const [start] = getTimestampRangeForEpoch(EpochNumber(epoch), this.constants);
|
|
206
218
|
this.logger.info(`Waiting until L1 timestamp ${start} is reached as the start of epoch ${epoch}`);
|
|
207
219
|
await waitUntilL1Timestamp(this.l1Client, start - BigInt(this.L1_BLOCK_TIME_IN_S), undefined, 30 * this.epochDuration);
|
|
208
220
|
return start;
|
|
209
221
|
}
|
|
210
|
-
/** Waits until the given
|
|
211
|
-
await retryUntil(()=>Promise.resolve(target <= this.monitor.
|
|
222
|
+
/** Waits until the given checkpoint number is mined. */ async waitUntilCheckpointNumber(target, timeout = 120) {
|
|
223
|
+
await retryUntil(()=>Promise.resolve(target <= this.monitor.checkpointNumber), `Wait until checkpoint ${target}`, timeout, 0.1);
|
|
212
224
|
}
|
|
213
|
-
/** Waits until the given
|
|
214
|
-
await retryUntil(()=>Promise.resolve(
|
|
215
|
-
return this.monitor.
|
|
225
|
+
/** Waits until the given checkpoint number is marked as proven. */ async waitUntilProvenCheckpointNumber(target, timeout = 120) {
|
|
226
|
+
await retryUntil(()=>Promise.resolve(target <= this.monitor.provenCheckpointNumber), `Wait proven checkpoint ${target}`, timeout, 0.1);
|
|
227
|
+
return this.monitor.provenCheckpointNumber;
|
|
216
228
|
}
|
|
217
229
|
/** Waits until the last slot of the proof submission window for a given epoch. */ async waitUntilLastSlotOfProofSubmissionWindow(epochNumber) {
|
|
218
|
-
const deadline = getProofSubmissionDeadlineTimestamp(BigInt(epochNumber), this.constants);
|
|
230
|
+
const deadline = getProofSubmissionDeadlineTimestamp(EpochNumber.fromBigInt(BigInt(epochNumber)), this.constants);
|
|
219
231
|
const oneSlotBefore = deadline - BigInt(this.constants.slotDuration);
|
|
220
232
|
const date = new Date(Number(oneSlotBefore) * 1000);
|
|
221
233
|
this.logger.info(`Waiting until last slot of submission window for epoch ${epochNumber} at ${date}`, {
|
|
@@ -255,10 +267,7 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
255
267
|
publicKeys: undefined,
|
|
256
268
|
deployer: undefined
|
|
257
269
|
});
|
|
258
|
-
await wallet.registerContract(
|
|
259
|
-
artifact: SpamContract.artifact,
|
|
260
|
-
instance
|
|
261
|
-
});
|
|
270
|
+
await wallet.registerContract(instance, SpamContract.artifact);
|
|
262
271
|
return SpamContract.at(instance.address, wallet);
|
|
263
272
|
}
|
|
264
273
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */ async createL1Client() {
|
|
@@ -287,11 +296,11 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
287
296
|
watchSequencerEvents(sequencers, getMetadata = ()=>({})) {
|
|
288
297
|
const stateChanges = [];
|
|
289
298
|
const failEvents = [];
|
|
290
|
-
// Note we do not include the 'tx-count-check-failed' event here, since it is fine if we dont build
|
|
299
|
+
// Note we do not include the 'block-tx-count-check-failed' event here, since it is fine if we dont build
|
|
291
300
|
// due to lack of txs available.
|
|
292
301
|
const failEventsKeys = [
|
|
293
302
|
'block-build-failed',
|
|
294
|
-
'
|
|
303
|
+
'checkpoint-publish-failed',
|
|
295
304
|
'proposer-rollup-check-failed'
|
|
296
305
|
];
|
|
297
306
|
const makeEvent = (i, eventName, args)=>({
|
|
@@ -318,7 +327,7 @@ export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
|
318
327
|
sequencer.getSequencer().on(eventName, (args)=>{
|
|
319
328
|
const evt = makeEvent(i, eventName, args);
|
|
320
329
|
failEvents.push(evt);
|
|
321
|
-
this.logger.error(`Failed event ${eventName} from sequencer ${sequencerIndex}`, evt);
|
|
330
|
+
this.logger.error(`Failed event ${eventName} from sequencer ${sequencerIndex}`, undefined, evt);
|
|
322
331
|
});
|
|
323
332
|
});
|
|
324
333
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJpZGdpbmdfcmFjZS5ub3Rlc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lMmVfZmVlcy9icmlkZ2luZ19yYWNlLm5vdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Fr
|
|
3
|
-
import { Fq } from '@aztec/foundation/
|
|
1
|
+
import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
|
|
2
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { Fq } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
4
5
|
import { jest } from '@jest/globals';
|
|
5
6
|
import { FeesTest } from './fees_test.js';
|
|
6
7
|
jest.setTimeout(300_000);
|
|
@@ -18,22 +19,24 @@ describe('e2e_fees bridging_race', ()=>{
|
|
|
18
19
|
await t.applyInitialAccountsSnapshot();
|
|
19
20
|
await t.applyPublicDeployAccountsSnapshot();
|
|
20
21
|
await t.applySetupFeeJuiceSnapshot();
|
|
21
|
-
({
|
|
22
|
+
({ wallet, logger } = await t.setup());
|
|
22
23
|
});
|
|
23
24
|
afterAll(async ()=>{
|
|
24
25
|
await t.teardown();
|
|
25
26
|
});
|
|
26
27
|
let logger;
|
|
27
|
-
let pxe;
|
|
28
28
|
let bobsAddress;
|
|
29
|
+
let wallet;
|
|
29
30
|
beforeEach(async ()=>{
|
|
30
31
|
const bobsSecretKey = Fr.random();
|
|
31
32
|
const bobsPrivateSigningKey = Fq.random();
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
const bobsSalt = Fr.random();
|
|
34
|
+
const bobsAccountManager = await wallet.createAccount({
|
|
35
|
+
secret: bobsSecretKey,
|
|
36
|
+
salt: bobsSalt,
|
|
37
|
+
contract: new SchnorrAccountContract(bobsPrivateSigningKey)
|
|
38
|
+
});
|
|
39
|
+
bobsAddress = bobsAccountManager.address;
|
|
37
40
|
});
|
|
38
41
|
it('Alice bridges funds to Bob', async ()=>{
|
|
39
42
|
// Tweak the token manager so the bridging happens immediately before the end of the current L2 slot
|
|
@@ -42,7 +45,7 @@ describe('e2e_fees bridging_race', ()=>{
|
|
|
42
45
|
const origApprove = l1TokenManager.approve.bind(l1TokenManager);
|
|
43
46
|
l1TokenManager.approve = async (amount, address, addressName = '')=>{
|
|
44
47
|
await origApprove(amount, address, addressName);
|
|
45
|
-
const sleepTime = (Number(t.chainMonitor.
|
|
48
|
+
const sleepTime = (Number(t.chainMonitor.checkpointTimestamp) + AZTEC_SLOT_DURATION) * 1000 - Date.now() - 500;
|
|
46
49
|
logger.info(`Sleeping for ${sleepTime}ms until near end of L2 slot before sending L1 fee juice to L2 inbox`);
|
|
47
50
|
await sleep(sleepTime);
|
|
48
51
|
};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { type Logger } from '@aztec/aztec.js/log';
|
|
3
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
4
|
import { CheatCodes } from '@aztec/aztec/testing';
|
|
3
|
-
import {
|
|
5
|
+
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
6
|
+
import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
4
7
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
8
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
5
9
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
10
|
import { AppSubscriptionContract } from '@aztec/noir-contracts.js/AppSubscription';
|
|
7
11
|
import { FPCContract } from '@aztec/noir-contracts.js/FPC';
|
|
@@ -10,6 +14,8 @@ import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
|
|
|
10
14
|
import { TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token';
|
|
11
15
|
import { CounterContract } from '@aztec/noir-test-contracts.js/Counter';
|
|
12
16
|
import { GasSettings } from '@aztec/stdlib/gas';
|
|
17
|
+
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
18
|
+
import { TestWallet } from '@aztec/test-wallet/server';
|
|
13
19
|
import { type SubsystemsContext } from '../fixtures/snapshot_manager.js';
|
|
14
20
|
import { type BalancesFn, type SetupOptions } from '../fixtures/utils.js';
|
|
15
21
|
import { type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.js';
|
|
@@ -26,15 +32,13 @@ import { type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.j
|
|
|
26
32
|
export declare class FeesTest {
|
|
27
33
|
private numberOfAccounts;
|
|
28
34
|
private snapshotManager;
|
|
29
|
-
private wallets;
|
|
30
35
|
private accounts;
|
|
31
36
|
logger: Logger;
|
|
32
|
-
pxe: PXE;
|
|
33
37
|
aztecNode: AztecNode;
|
|
38
|
+
aztecNodeAdmin: AztecNodeAdmin;
|
|
34
39
|
cheatCodes: CheatCodes;
|
|
35
|
-
|
|
40
|
+
wallet: TestWallet;
|
|
36
41
|
aliceAddress: AztecAddress;
|
|
37
|
-
bobWallet: AccountWallet;
|
|
38
42
|
bobAddress: AztecAddress;
|
|
39
43
|
sequencerAddress: AztecAddress;
|
|
40
44
|
coinbase: EthAddress;
|
|
@@ -55,11 +59,11 @@ export declare class FeesTest {
|
|
|
55
59
|
getGasBalanceFn: BalancesFn;
|
|
56
60
|
getBananaPublicBalanceFn: BalancesFn;
|
|
57
61
|
getBananaPrivateBalanceFn: BalancesFn;
|
|
58
|
-
getProverFee: (blockNumber:
|
|
62
|
+
getProverFee: (blockNumber: BlockNumber) => Promise<bigint>;
|
|
59
63
|
readonly ALICE_INITIAL_BANANAS: bigint;
|
|
60
64
|
readonly SUBSCRIPTION_AMOUNT: bigint;
|
|
61
65
|
readonly APP_SPONSORED_TX_GAS_LIMIT: bigint;
|
|
62
|
-
constructor(testName: string, numberOfAccounts?: number, setupOptions?: Partial<SetupOptions &
|
|
66
|
+
constructor(testName: string, numberOfAccounts?: number, setupOptions?: Partial<SetupOptions & DeployAztecL1ContractsArgs>);
|
|
63
67
|
setup(): Promise<this>;
|
|
64
68
|
teardown(): Promise<void>;
|
|
65
69
|
setIsMarkingAsProven(b: boolean): void;
|
|
@@ -81,4 +85,4 @@ export declare class FeesTest {
|
|
|
81
85
|
applyFundAliceWithBananas(): Promise<void>;
|
|
82
86
|
applyFundAliceWithPrivateBananas(): Promise<void>;
|
|
83
87
|
}
|
|
84
|
-
//# sourceMappingURL=
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlc190ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZTJlX2ZlZXMvZmVlc190ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLElBQUksVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fees_test.d.ts","sourceRoot":"","sources":["../../src/e2e_fees/fees_test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fees_test.d.ts","sourceRoot":"","sources":["../../src/e2e_fees/fees_test.ts"],"names":[],"mappings":"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"}
|