@aztec/end-to-end 0.0.1-commit.9372f48 → 0.0.1-commit.949a33fd8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +24 -31
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- package/dest/bench/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +6 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -3
- 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 +23 -13
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +4 -3
- package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +26 -7
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +117 -41
- package/dest/e2e_fees/fees_test.d.ts +2 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +22 -15
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
- package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
- package/dest/e2e_p2p/p2p_network.d.ts +14 -12
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +70 -34
- package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
- package/dest/e2e_p2p/reqresp/utils.js +49 -9
- package/dest/e2e_p2p/shared.d.ts +26 -8
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +74 -50
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +19 -9
- package/dest/fixtures/authwit_proxy.d.ts +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +34 -0
- package/dest/fixtures/e2e_prover_test.d.ts +7 -6
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +37 -49
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +16 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +16 -0
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +5 -5
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +116 -0
- package/dest/fixtures/index.d.ts +2 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +39 -0
- package/dest/fixtures/setup.d.ts +59 -31
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +97 -167
- package/dest/fixtures/setup_p2p_test.d.ts +18 -10
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +23 -17
- package/dest/fixtures/token_utils.d.ts +2 -2
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +5 -7
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- package/dest/shared/cross_chain_test_harness.d.ts +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +13 -13
- package/dest/shared/gas_portal_test_harness.js +3 -3
- package/dest/shared/index.d.ts +2 -1
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +2 -2
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +16 -21
- package/dest/simulators/lending_simulator.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +4 -4
- package/dest/simulators/token_simulator.d.ts +1 -1
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +3 -24
- package/dest/spartan/setup_test_wallets.d.ts +12 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +100 -39
- package/dest/spartan/tx_metrics.d.ts +1 -1
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +19 -3
- package/dest/spartan/utils/bot.d.ts +3 -2
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +2 -1
- package/dest/spartan/utils/config.d.ts +10 -1
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +4 -1
- package/dest/spartan/utils/index.d.ts +5 -3
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +5 -1
- package/dest/spartan/utils/k8s.d.ts +3 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +6 -0
- package/dest/spartan/utils/nodes.d.ts +4 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +9 -9
- package/dest/spartan/utils/pod_logs.d.ts +25 -0
- package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
- package/dest/spartan/utils/pod_logs.js +74 -0
- package/dest/spartan/utils/scripts.d.ts +18 -4
- package/dest/spartan/utils/scripts.d.ts.map +1 -1
- package/dest/spartan/utils/scripts.js +19 -4
- package/dest/test-wallet/test_wallet.d.ts +84 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +255 -0
- package/dest/test-wallet/utils.d.ts +41 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +71 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +48 -0
- package/dest/test-wallet/worker_wallet.d.ts +52 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +151 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +279 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +10 -0
- package/package.json +46 -43
- package/src/bench/client_flows/client_flows_benchmark.ts +33 -20
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +8 -3
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +31 -21
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +8 -9
- package/src/e2e_deploy_contract/deploy_test.ts +3 -3
- package/src/e2e_epochs/epochs_test.ts +138 -67
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +25 -31
- package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
- package/src/e2e_p2p/inactivity_slash_test.ts +7 -7
- package/src/e2e_p2p/p2p_network.ts +93 -49
- package/src/e2e_p2p/reqresp/utils.ts +63 -13
- package/src/e2e_p2p/shared.ts +91 -64
- package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
- package/src/e2e_token_contract/token_contract_test.ts +26 -9
- package/src/fixtures/authwit_proxy.ts +54 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +46 -55
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +32 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +188 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +147 -232
- package/src/fixtures/setup_p2p_test.ts +33 -32
- package/src/fixtures/token_utils.ts +3 -3
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/guides/up_quick_start.sh +3 -5
- package/src/legacy-jest-resolver.cjs +135 -0
- package/src/shared/cross_chain_test_harness.ts +13 -9
- package/src/shared/gas_portal_test_harness.ts +1 -2
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +3 -2
- package/src/shared/uniswap_l1_l2.ts +38 -37
- package/src/simulators/lending_simulator.ts +8 -4
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +141 -32
- package/src/spartan/tx_metrics.ts +17 -5
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +3 -0
- package/src/spartan/utils/index.ts +8 -1
- package/src/spartan/utils/k8s.ts +8 -0
- package/src/spartan/utils/nodes.ts +15 -10
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +43 -7
- package/src/test-wallet/test_wallet.ts +357 -0
- package/src/test-wallet/utils.ts +112 -0
- package/src/test-wallet/wallet_worker_script.ts +60 -0
- package/src/test-wallet/worker_wallet.ts +214 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
package/src/bench/utils.ts
CHANGED
|
@@ -25,10 +25,10 @@ export async function benchmarkSetup(
|
|
|
25
25
|
) {
|
|
26
26
|
const context = await setup(1, { ...opts, telemetryConfig: { benchmark: true } });
|
|
27
27
|
const defaultAccountAddress = context.accounts[0];
|
|
28
|
-
const contract = await BenchmarkingContract.deploy(context.wallet).send({ from: defaultAccountAddress });
|
|
28
|
+
const { contract } = await BenchmarkingContract.deploy(context.wallet).send({ from: defaultAccountAddress });
|
|
29
29
|
context.logger.info(`Deployed benchmarking contract at ${contract.address}`);
|
|
30
30
|
const sequencer = (context.aztecNode as AztecNodeService).getSequencer()!;
|
|
31
|
-
const telemetry = context.telemetryClient
|
|
31
|
+
const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
|
|
32
32
|
context.logger.warn(`Cleared benchmark data points from setup`);
|
|
33
33
|
telemetry.clear();
|
|
34
34
|
const origTeardown = context.teardown.bind(context);
|
|
@@ -149,7 +149,12 @@ export async function sendTxs(
|
|
|
149
149
|
context.logger.info(`Creating ${txCount} txs`);
|
|
150
150
|
const [from] = context.accounts;
|
|
151
151
|
context.logger.info(`Sending ${txCount} txs`);
|
|
152
|
-
return Promise.all(
|
|
152
|
+
return Promise.all(
|
|
153
|
+
calls.map(async call => {
|
|
154
|
+
const { txHash } = await call.send({ from, wait: NO_WAIT });
|
|
155
|
+
return txHash;
|
|
156
|
+
}),
|
|
157
|
+
);
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
export async function waitTxs(txs: TxHash[], context: EndToEndContext, txWaitOpts?: WaitOpts) {
|
|
@@ -7,14 +7,16 @@ import type { TxHash } from '@aztec/aztec.js/tx';
|
|
|
7
7
|
import type { CheatCodes } from '@aztec/aztec/testing';
|
|
8
8
|
import type { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
9
9
|
import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
|
|
10
|
+
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
10
11
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
11
12
|
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
12
|
-
import type {
|
|
13
|
+
import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
13
14
|
|
|
14
15
|
import { jest } from '@jest/globals';
|
|
15
16
|
|
|
16
17
|
import { type EndToEndContext, deployAccounts, publicDeployAccounts, setup, teardown } from '../fixtures/setup.js';
|
|
17
18
|
import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
19
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
18
20
|
|
|
19
21
|
export class Role {
|
|
20
22
|
private isAdmin = false;
|
|
@@ -53,9 +55,10 @@ export class BlacklistTokenContractTest {
|
|
|
53
55
|
asset!: TokenBlacklistContract;
|
|
54
56
|
tokenSim!: TokenSimulator;
|
|
55
57
|
badAccount!: InvalidAccountContract;
|
|
58
|
+
authwitProxy!: GenericProxyContract;
|
|
56
59
|
cheatCodes!: CheatCodes;
|
|
57
60
|
sequencer!: SequencerClient;
|
|
58
|
-
aztecNode!: AztecNode;
|
|
61
|
+
aztecNode!: AztecNode & AztecNodeDebug;
|
|
59
62
|
|
|
60
63
|
adminAddress!: AztecAddress;
|
|
61
64
|
otherAddress!: AztecAddress;
|
|
@@ -66,11 +69,7 @@ export class BlacklistTokenContractTest {
|
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
async crossTimestampOfChange() {
|
|
69
|
-
await this.cheatCodes.warpL2TimeAtLeastBy(
|
|
70
|
-
this.sequencer,
|
|
71
|
-
this.aztecNode,
|
|
72
|
-
BlacklistTokenContractTest.CHANGE_ROLES_DELAY,
|
|
73
|
-
);
|
|
72
|
+
await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/**
|
|
@@ -92,7 +91,7 @@ export class BlacklistTokenContractTest {
|
|
|
92
91
|
});
|
|
93
92
|
|
|
94
93
|
this.cheatCodes = this.context.cheatCodes;
|
|
95
|
-
this.aztecNode = this.context.aztecNodeService
|
|
94
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
96
95
|
this.sequencer = this.context.sequencer!;
|
|
97
96
|
this.wallet = this.context.wallet;
|
|
98
97
|
this.adminAddress = deployedAccounts[0].address;
|
|
@@ -105,15 +104,26 @@ export class BlacklistTokenContractTest {
|
|
|
105
104
|
await publicDeployAccounts(this.wallet, [this.adminAddress, this.otherAddress, this.blacklistedAddress]);
|
|
106
105
|
|
|
107
106
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
108
|
-
this.asset = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
|
|
107
|
+
({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
|
|
109
108
|
from: this.adminAddress,
|
|
110
|
-
});
|
|
109
|
+
}));
|
|
111
110
|
this.logger.verbose(`Token deployed to ${this.asset.address}`);
|
|
112
111
|
|
|
113
112
|
this.logger.verbose(`Deploying bad account...`);
|
|
114
|
-
this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({
|
|
113
|
+
({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
|
|
114
|
+
from: this.adminAddress,
|
|
115
|
+
}));
|
|
115
116
|
this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
|
|
116
117
|
|
|
118
|
+
// Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
|
|
119
|
+
// (so their notes are in scope), but msg_sender in the target must differ from the note owner
|
|
120
|
+
// to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
|
|
121
|
+
this.logger.verbose(`Deploying generic proxy...`);
|
|
122
|
+
({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
|
|
123
|
+
from: this.adminAddress,
|
|
124
|
+
}));
|
|
125
|
+
this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
|
|
126
|
+
|
|
117
127
|
await this.crossTimestampOfChange();
|
|
118
128
|
|
|
119
129
|
this.tokenSim = new TokenSimulator(
|
|
@@ -124,9 +134,9 @@ export class BlacklistTokenContractTest {
|
|
|
124
134
|
[this.adminAddress, this.otherAddress, this.blacklistedAddress],
|
|
125
135
|
);
|
|
126
136
|
|
|
127
|
-
expect(
|
|
128
|
-
|
|
129
|
-
);
|
|
137
|
+
expect(
|
|
138
|
+
(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
|
|
139
|
+
).toEqual(new Role().withAdmin().toNoirStruct());
|
|
130
140
|
}
|
|
131
141
|
|
|
132
142
|
async setup() {
|
|
@@ -180,9 +190,9 @@ export class BlacklistTokenContractTest {
|
|
|
180
190
|
|
|
181
191
|
await this.crossTimestampOfChange();
|
|
182
192
|
|
|
183
|
-
expect(
|
|
184
|
-
|
|
185
|
-
);
|
|
193
|
+
expect(
|
|
194
|
+
(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
|
|
195
|
+
).toEqual(adminMinterRole.toNoirStruct());
|
|
186
196
|
|
|
187
197
|
this.logger.verbose(`Minting ${amount} publicly...`);
|
|
188
198
|
await asset.methods.mint_public(this.adminAddress, amount).send({ from: this.adminAddress });
|
|
@@ -190,7 +200,7 @@ export class BlacklistTokenContractTest {
|
|
|
190
200
|
this.logger.verbose(`Minting ${amount} privately...`);
|
|
191
201
|
const secret = Fr.random();
|
|
192
202
|
const secretHash = await computeSecretHash(secret);
|
|
193
|
-
const receipt = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
|
|
203
|
+
const { receipt } = await asset.methods.mint_private(amount, secretHash).send({ from: this.adminAddress });
|
|
194
204
|
|
|
195
205
|
await this.addPendingShieldNoteToPXE(asset, this.adminAddress, amount, secretHash, receipt.txHash);
|
|
196
206
|
await asset.methods.redeem_shield(this.adminAddress, amount, secret).send({ from: this.adminAddress });
|
|
@@ -198,20 +208,20 @@ export class BlacklistTokenContractTest {
|
|
|
198
208
|
|
|
199
209
|
tokenSim.mintPublic(this.adminAddress, amount);
|
|
200
210
|
|
|
201
|
-
const publicBalance = await asset.methods
|
|
211
|
+
const { result: publicBalance } = await asset.methods
|
|
202
212
|
.balance_of_public(this.adminAddress)
|
|
203
213
|
.simulate({ from: this.adminAddress });
|
|
204
214
|
this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
|
|
205
215
|
expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(this.adminAddress));
|
|
206
216
|
|
|
207
217
|
tokenSim.mintPrivate(this.adminAddress, amount);
|
|
208
|
-
const privateBalance = await asset.methods
|
|
218
|
+
const { result: privateBalance } = await asset.methods
|
|
209
219
|
.balance_of_private(this.adminAddress)
|
|
210
220
|
.simulate({ from: this.adminAddress });
|
|
211
221
|
this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
|
|
212
222
|
expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(this.adminAddress));
|
|
213
223
|
|
|
214
|
-
const totalSupply = await asset.methods.total_supply().simulate({ from: this.adminAddress });
|
|
224
|
+
const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: this.adminAddress });
|
|
215
225
|
this.logger.verbose(`Total supply: ${totalSupply}`);
|
|
216
226
|
expect(totalSupply).toEqual(tokenSim.totalSupply);
|
|
217
227
|
}
|
|
@@ -13,13 +13,12 @@ import type {
|
|
|
13
13
|
} from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
14
14
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
15
15
|
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
16
|
-
import {
|
|
16
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
17
17
|
import { sleep } from '@aztec/foundation/sleep';
|
|
18
18
|
import { TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
|
|
19
19
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
20
20
|
import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
21
21
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
22
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
23
22
|
|
|
24
23
|
import { MNEMONIC } from '../fixtures/fixtures.js';
|
|
25
24
|
import {
|
|
@@ -31,6 +30,7 @@ import {
|
|
|
31
30
|
teardown,
|
|
32
31
|
} from '../fixtures/setup.js';
|
|
33
32
|
import { CrossChainTestHarness } from '../shared/cross_chain_test_harness.js';
|
|
33
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
34
34
|
|
|
35
35
|
export class CrossChainMessagingTest {
|
|
36
36
|
private requireEpochProven: boolean;
|
|
@@ -86,9 +86,8 @@ export class CrossChainMessagingTest {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
async advanceToEpochProven(l2TxReceipt: TxReceipt): Promise<EpochNumber> {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
);
|
|
89
|
+
const block = await this.aztecNode.getBlock(l2TxReceipt.blockNumber!);
|
|
90
|
+
const epoch = await this.rollup.getEpochNumberForCheckpoint(block!.checkpointNumber);
|
|
92
91
|
// Warp to the next epoch.
|
|
93
92
|
await this.cheatCodes.rollup.advanceToEpoch(EpochNumber(epoch + 1));
|
|
94
93
|
// Wait for the tx to be proven.
|
|
@@ -99,7 +98,7 @@ export class CrossChainMessagingTest {
|
|
|
99
98
|
|
|
100
99
|
async catchUpProvenChain() {
|
|
101
100
|
const bn = await this.aztecNode.getBlockNumber();
|
|
102
|
-
while ((await this.aztecNode.
|
|
101
|
+
while ((await this.aztecNode.getBlockNumber('proven')) < bn) {
|
|
103
102
|
await sleep(1000);
|
|
104
103
|
}
|
|
105
104
|
}
|
|
@@ -110,16 +109,16 @@ export class CrossChainMessagingTest {
|
|
|
110
109
|
|
|
111
110
|
async applyBaseSetup() {
|
|
112
111
|
// Set up base context fields
|
|
113
|
-
this.aztecNode = this.context.aztecNodeService
|
|
112
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
114
113
|
this.wallet = this.context.wallet;
|
|
115
114
|
this.aztecNodeConfig = this.context.config;
|
|
116
115
|
this.cheatCodes = this.context.cheatCodes;
|
|
117
116
|
this.deployL1ContractsValues = this.context.deployL1ContractsValues;
|
|
118
|
-
this.aztecNodeAdmin = this.context.aztecNodeService
|
|
117
|
+
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
119
118
|
|
|
120
119
|
if (this.requireEpochProven) {
|
|
121
120
|
// Turn off the watcher to prevent it from keep marking blocks as proven.
|
|
122
|
-
this.context.watcher
|
|
121
|
+
this.context.watcher.setIsMarkingAsProven(false);
|
|
123
122
|
}
|
|
124
123
|
|
|
125
124
|
// Deploy 3 accounts
|
|
@@ -8,9 +8,9 @@ import type { AztecNode } from '@aztec/aztec.js/node';
|
|
|
8
8
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
9
9
|
import type { StatefulTestContract } from '@aztec/noir-test-contracts.js/StatefulTest';
|
|
10
10
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
11
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
12
11
|
|
|
13
12
|
import { type EndToEndContext, deployAccounts, setup, teardown } from '../fixtures/setup.js';
|
|
13
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
14
14
|
|
|
15
15
|
export class DeployTest {
|
|
16
16
|
public context!: EndToEndContext;
|
|
@@ -30,9 +30,9 @@ export class DeployTest {
|
|
|
30
30
|
fundSponsoredFPC: true,
|
|
31
31
|
skipAccountDeployment: true,
|
|
32
32
|
});
|
|
33
|
-
this.aztecNode = this.context.aztecNodeService
|
|
33
|
+
this.aztecNode = this.context.aztecNodeService;
|
|
34
34
|
this.wallet = this.context.wallet;
|
|
35
|
-
this.aztecNodeAdmin = this.context.aztecNodeService
|
|
35
|
+
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
36
36
|
await this.applyInitialAccount();
|
|
37
37
|
return this;
|
|
38
38
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import type { InitialAccountData } from '@aztec/accounts/testing';
|
|
2
|
+
import type { Archiver } from '@aztec/archiver';
|
|
1
3
|
import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
4
|
+
import { getAccountContractAddress } from '@aztec/aztec.js/account';
|
|
2
5
|
import { getTimestampRangeForEpoch } from '@aztec/aztec.js/block';
|
|
3
6
|
import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
|
|
4
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
@@ -9,7 +12,8 @@ import { EpochCache } from '@aztec/epoch-cache';
|
|
|
9
12
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
10
13
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum/config';
|
|
11
14
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
12
|
-
import {
|
|
15
|
+
import { Delayer, createDelayer, waitUntilL1Timestamp, wrapClientWithDelayer } from '@aztec/ethereum/l1-tx-utils';
|
|
16
|
+
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
13
17
|
import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
|
|
14
18
|
import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
15
19
|
import { SecretValue } from '@aztec/foundation/config';
|
|
@@ -20,24 +24,22 @@ import { sleep } from '@aztec/foundation/sleep';
|
|
|
20
24
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
21
25
|
import { TestContract } from '@aztec/noir-test-contracts.js/Test';
|
|
22
26
|
import { getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
|
|
23
|
-
import {
|
|
24
|
-
import type { TestProverNode } from '@aztec/prover-node/test';
|
|
27
|
+
import type { ProverNodeConfig } from '@aztec/prover-node';
|
|
25
28
|
import type { PXEConfig } from '@aztec/pxe/config';
|
|
26
|
-
import {
|
|
27
|
-
type SequencerClient,
|
|
28
|
-
type SequencerEvents,
|
|
29
|
-
type SequencerPublisher,
|
|
30
|
-
SequencerState,
|
|
31
|
-
} from '@aztec/sequencer-client';
|
|
32
|
-
import type { TestSequencerClient } from '@aztec/sequencer-client/test';
|
|
29
|
+
import { type SequencerClient, type SequencerEvents, SequencerState } from '@aztec/sequencer-client';
|
|
33
30
|
import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
|
|
34
31
|
import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
35
32
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
33
|
+
import type { SlashingProtectionDatabase } from '@aztec/validator-ha-signer/types';
|
|
36
34
|
|
|
37
35
|
import { join } from 'path';
|
|
38
36
|
import type { Hex } from 'viem';
|
|
39
37
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
40
38
|
|
|
39
|
+
import {
|
|
40
|
+
SCHNORR_HARDCODED_PRIVATE_KEY,
|
|
41
|
+
SchnorrHardcodedKeyAccountContract,
|
|
42
|
+
} from '../fixtures/schnorr_hardcoded_account_contract.js';
|
|
41
43
|
import {
|
|
42
44
|
type EndToEndContext,
|
|
43
45
|
type SetupOptions,
|
|
@@ -45,8 +47,9 @@ import {
|
|
|
45
47
|
getPrivateKeyFromIndex,
|
|
46
48
|
setup,
|
|
47
49
|
} from '../fixtures/utils.js';
|
|
50
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
48
51
|
|
|
49
|
-
export const
|
|
52
|
+
export const WORLD_STATE_CHECKPOINT_HISTORY = 2;
|
|
50
53
|
export const WORLD_STATE_BLOCK_CHECK_INTERVAL = 50;
|
|
51
54
|
export const ARCHIVER_POLL_INTERVAL = 50;
|
|
52
55
|
export const DEFAULT_L1_BLOCK_TIME = process.env.CI ? 12 : 8;
|
|
@@ -55,6 +58,8 @@ export type EpochsTestOpts = Partial<SetupOptions> & {
|
|
|
55
58
|
numberOfAccounts?: number;
|
|
56
59
|
pxeOpts?: Partial<PXEConfig>;
|
|
57
60
|
aztecSlotDurationInL1Slots?: number;
|
|
61
|
+
/** Skip creating/registering the hardcoded account during setup (for tests that handle accounts themselves). */
|
|
62
|
+
skipHardcodedAccount?: boolean;
|
|
58
63
|
};
|
|
59
64
|
|
|
60
65
|
export type TrackedSequencerEvent = {
|
|
@@ -81,7 +86,7 @@ export class EpochsTestContext {
|
|
|
81
86
|
public proverDelayer!: Delayer;
|
|
82
87
|
public sequencerDelayer!: Delayer;
|
|
83
88
|
|
|
84
|
-
public proverNodes:
|
|
89
|
+
public proverNodes: AztecNodeService[] = [];
|
|
85
90
|
public nodes: AztecNodeService[] = [];
|
|
86
91
|
|
|
87
92
|
public epochDuration!: number;
|
|
@@ -125,10 +130,18 @@ export class EpochsTestContext {
|
|
|
125
130
|
this.L1_BLOCK_TIME_IN_S = ethereumSlotDuration;
|
|
126
131
|
this.L2_SLOT_DURATION_IN_S = aztecSlotDuration;
|
|
127
132
|
|
|
133
|
+
// When skipInitialSequencer is set, auto-create a hardcoded account funded via genesis.
|
|
134
|
+
// This avoids needing to deploy accounts on-chain (which would require a running sequencer).
|
|
135
|
+
const useHardcodedAccount = opts.skipInitialSequencer && !opts.skipHardcodedAccount;
|
|
136
|
+
let hardcodedAccountData: InitialAccountData | undefined;
|
|
137
|
+
if (useHardcodedAccount) {
|
|
138
|
+
hardcodedAccountData = await EpochsTestContext.getHardcodedAccountData(Fr.random(), Fr.random());
|
|
139
|
+
}
|
|
140
|
+
|
|
128
141
|
// Set up system without any account nor protocol contracts
|
|
129
142
|
// and with faster block times and shorter epochs.
|
|
130
143
|
const context = await setup(
|
|
131
|
-
opts.numberOfAccounts ?? 0,
|
|
144
|
+
useHardcodedAccount ? 0 : (opts.numberOfAccounts ?? 0),
|
|
132
145
|
{
|
|
133
146
|
automineL1Setup: true,
|
|
134
147
|
checkIntervalMs: 50,
|
|
@@ -143,15 +156,13 @@ export class EpochsTestContext {
|
|
|
143
156
|
realProofs: false,
|
|
144
157
|
startProverNode: true,
|
|
145
158
|
proverTestDelayMs: opts.proverTestDelayMs ?? 0,
|
|
146
|
-
// We use numeric incremental prover ids for simplicity, but we can switch to
|
|
147
|
-
// using the prover's eth address if the proverId is used for something in the rollup contract
|
|
148
|
-
// Use numeric EthAddress for deterministic prover id
|
|
149
159
|
proverId: EthAddress.fromNumber(1),
|
|
150
|
-
|
|
160
|
+
worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
|
|
151
161
|
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
152
|
-
|
|
162
|
+
slasherEnabled: false,
|
|
153
163
|
l1PublishingTime,
|
|
154
164
|
...opts,
|
|
165
|
+
...(hardcodedAccountData ? { initialFundedAccounts: [hardcodedAccountData], numberOfAccounts: 0 } : {}),
|
|
155
166
|
},
|
|
156
167
|
// Use checkpointed chain tip for PXE by default to avoid issues with blocks being dropped due to pruned anchor blocks.
|
|
157
168
|
// Can be overridden via opts.pxeOpts.
|
|
@@ -159,6 +170,11 @@ export class EpochsTestContext {
|
|
|
159
170
|
);
|
|
160
171
|
|
|
161
172
|
this.context = context;
|
|
173
|
+
|
|
174
|
+
// Register the hardcoded account in PXE (local only, no on-chain deployment needed).
|
|
175
|
+
if (hardcodedAccountData) {
|
|
176
|
+
await this.registerHardcodedAccount(hardcodedAccountData);
|
|
177
|
+
}
|
|
162
178
|
this.proverNodes = context.proverNode ? [context.proverNode] : [];
|
|
163
179
|
this.nodes = context.aztecNode ? [context.aztecNode as AztecNodeService] : [];
|
|
164
180
|
this.logger = context.logger;
|
|
@@ -169,17 +185,8 @@ export class EpochsTestContext {
|
|
|
169
185
|
// Loop that tracks L1 and L2 block numbers and logs whenever there's a new one.
|
|
170
186
|
this.monitor = new ChainMonitor(this.rollup, context.dateProvider, this.logger).start();
|
|
171
187
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
this.proverDelayer = context.proverNode
|
|
175
|
-
? (((context.proverNode as TestProverNode).publisher as ProverNodePublisher).l1TxUtils as DelayedTxUtils).delayer!
|
|
176
|
-
: undefined!;
|
|
177
|
-
this.sequencerDelayer = context.sequencer
|
|
178
|
-
? (
|
|
179
|
-
((context.sequencer as TestSequencerClient).sequencer.publisher as SequencerPublisher)
|
|
180
|
-
.l1TxUtils as DelayedTxUtils
|
|
181
|
-
).delayer!
|
|
182
|
-
: undefined!;
|
|
188
|
+
this.proverDelayer = context.proverDelayer!;
|
|
189
|
+
this.sequencerDelayer = context.sequencerDelayer!;
|
|
183
190
|
|
|
184
191
|
if ((context.proverNode && !this.proverDelayer) || (context.sequencer && !this.sequencerDelayer)) {
|
|
185
192
|
throw new Error(`Could not find prover or sequencer delayer`);
|
|
@@ -194,6 +201,8 @@ export class EpochsTestContext {
|
|
|
194
201
|
l1GenesisTime: await this.rollup.getL1GenesisTime(),
|
|
195
202
|
ethereumSlotDuration,
|
|
196
203
|
proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
|
|
204
|
+
targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
|
|
205
|
+
rollupManaLimit: Number(await this.rollup.getManaLimit()),
|
|
197
206
|
};
|
|
198
207
|
|
|
199
208
|
this.logger.info(
|
|
@@ -208,23 +217,64 @@ export class EpochsTestContext {
|
|
|
208
217
|
await this.context.teardown();
|
|
209
218
|
}
|
|
210
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Computes InitialAccountData for a SchnorrHardcodedKeyAccountContract.
|
|
222
|
+
* This contract has a hardcoded signing key and no initializer, so it can be used without
|
|
223
|
+
* on-chain deployment. Pass the returned data in `initialFundedAccounts` so the address
|
|
224
|
+
* gets funded with fee juice in genesis.
|
|
225
|
+
*/
|
|
226
|
+
public static async getHardcodedAccountData(secret: Fr, salt: Fr): Promise<InitialAccountData> {
|
|
227
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
228
|
+
const address = await getAccountContractAddress(contract, secret, salt);
|
|
229
|
+
const signingKey = SCHNORR_HARDCODED_PRIVATE_KEY;
|
|
230
|
+
return { secret, salt, signingKey, address };
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Registers a SchnorrHardcodedKeyAccountContract in PXE. The account must have been funded
|
|
235
|
+
* at genesis (via getHardcodedAccountData). No on-chain deployment or block mining needed.
|
|
236
|
+
*/
|
|
237
|
+
public async registerHardcodedAccount(accountData: InitialAccountData) {
|
|
238
|
+
const contract = new SchnorrHardcodedKeyAccountContract();
|
|
239
|
+
const wallet = this.context.wallet;
|
|
240
|
+
const accountManager = await (wallet as TestWallet).createAccount({
|
|
241
|
+
secret: accountData.secret,
|
|
242
|
+
salt: accountData.salt,
|
|
243
|
+
contract,
|
|
244
|
+
});
|
|
245
|
+
this.context.accounts = [accountManager.address];
|
|
246
|
+
return accountManager.address;
|
|
247
|
+
}
|
|
248
|
+
|
|
211
249
|
public async createProverNode(opts: { dontStart?: boolean } & Partial<ProverNodeConfig> = {}) {
|
|
212
250
|
this.logger.warn('Creating and syncing a simulated prover node...');
|
|
213
251
|
const proverNodePrivateKey = this.getNextPrivateKey();
|
|
214
252
|
const proverIndex = this.proverNodes.length + 1;
|
|
215
|
-
const
|
|
253
|
+
const { mockGossipSubNetwork } = this.context;
|
|
254
|
+
const { proverNode } = await withLoggerBindings({ actor: `prover-${proverIndex}` }, () =>
|
|
216
255
|
createAndSyncProverNode(
|
|
217
256
|
proverNodePrivateKey,
|
|
218
|
-
{ ...this.context.config },
|
|
219
257
|
{
|
|
220
|
-
|
|
258
|
+
...this.context.config,
|
|
259
|
+
p2pEnabled: this.context.config.p2pEnabled || mockGossipSubNetwork !== undefined,
|
|
221
260
|
proverId: EthAddress.fromNumber(proverIndex),
|
|
222
261
|
dontStart: opts.dontStart,
|
|
223
262
|
...opts,
|
|
224
263
|
},
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
264
|
+
{
|
|
265
|
+
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
dateProvider: this.context.dateProvider,
|
|
269
|
+
p2pClientDeps: {
|
|
270
|
+
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
271
|
+
rpcTxProviders: [this.context.aztecNode],
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
genesis: this.context.genesis,
|
|
276
|
+
dontStart: opts.dontStart,
|
|
277
|
+
},
|
|
228
278
|
),
|
|
229
279
|
);
|
|
230
280
|
this.proverNodes.push(proverNode);
|
|
@@ -238,14 +288,20 @@ export class EpochsTestContext {
|
|
|
238
288
|
|
|
239
289
|
public createValidatorNode(
|
|
240
290
|
privateKeys: `0x${string}`[],
|
|
241
|
-
opts: Partial<AztecNodeConfig> & {
|
|
291
|
+
opts: Partial<AztecNodeConfig> & {
|
|
292
|
+
dontStartSequencer?: boolean;
|
|
293
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
294
|
+
} = {},
|
|
242
295
|
) {
|
|
243
296
|
this.logger.warn('Creating and syncing a validator node...');
|
|
244
297
|
return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
|
|
245
298
|
}
|
|
246
299
|
|
|
247
300
|
private async createNode(
|
|
248
|
-
opts: Partial<AztecNodeConfig> & {
|
|
301
|
+
opts: Partial<AztecNodeConfig> & {
|
|
302
|
+
dontStartSequencer?: boolean;
|
|
303
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
304
|
+
} = {},
|
|
249
305
|
) {
|
|
250
306
|
const nodeIndex = this.nodes.length + 1;
|
|
251
307
|
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
@@ -259,6 +315,7 @@ export class EpochsTestContext {
|
|
|
259
315
|
...resolvedConfig,
|
|
260
316
|
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
261
317
|
validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
|
|
318
|
+
nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
|
|
262
319
|
p2pEnabled,
|
|
263
320
|
p2pIp,
|
|
264
321
|
},
|
|
@@ -267,34 +324,15 @@ export class EpochsTestContext {
|
|
|
267
324
|
p2pClientDeps: {
|
|
268
325
|
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
269
326
|
},
|
|
327
|
+
slashingProtectionDb: opts.slashingProtectionDb,
|
|
270
328
|
},
|
|
271
329
|
{
|
|
272
|
-
|
|
330
|
+
genesis: this.context.genesis,
|
|
273
331
|
...opts,
|
|
274
332
|
},
|
|
275
333
|
),
|
|
276
334
|
);
|
|
277
335
|
|
|
278
|
-
// REFACTOR: We're getting too much into the internals of the sequencer here.
|
|
279
|
-
// We should have a single method for constructing an aztec node that returns a TestAztecNodeService
|
|
280
|
-
// which directly exposes the delayer and sets any test config.
|
|
281
|
-
if (opts.txDelayerMaxInclusionTimeIntoSlot !== undefined) {
|
|
282
|
-
this.logger.info(
|
|
283
|
-
`Setting tx delayer max inclusion time into slot to ${opts.txDelayerMaxInclusionTimeIntoSlot} seconds`,
|
|
284
|
-
);
|
|
285
|
-
// Here we reach into the sequencer and hook in a tx delayer. The problem is that the sequencer's l1 utils only uses a public client, not a wallet.
|
|
286
|
-
// The delayer needs a wallet (a client that can sign), so we have to create one here.
|
|
287
|
-
const l1Client = createExtendedL1Client(
|
|
288
|
-
resolvedConfig.l1RpcUrls!,
|
|
289
|
-
resolvedConfig.publisherPrivateKeys![0]!.getValue(),
|
|
290
|
-
);
|
|
291
|
-
const sequencer = node.getSequencer() as TestSequencerClient;
|
|
292
|
-
const publisher = sequencer.sequencer.publisher;
|
|
293
|
-
const delayed = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, this.L1_BLOCK_TIME_IN_S, l1Client);
|
|
294
|
-
delayed.delayer!.setMaxInclusionTimeIntoSlot(opts.txDelayerMaxInclusionTimeIntoSlot);
|
|
295
|
-
publisher.l1TxUtils = delayed;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
336
|
this.nodes.push(node);
|
|
299
337
|
return node;
|
|
300
338
|
}
|
|
@@ -346,7 +384,10 @@ export class EpochsTestContext {
|
|
|
346
384
|
this.logger.info(`Waiting until last slot of submission window for epoch ${epochNumber} at ${date}`, {
|
|
347
385
|
oneSlotBefore,
|
|
348
386
|
});
|
|
349
|
-
|
|
387
|
+
// Use a timeout that accounts for the full proof submission window
|
|
388
|
+
const proofSubmissionWindowDuration =
|
|
389
|
+
this.constants.proofSubmissionEpochs * this.epochDuration * this.L2_SLOT_DURATION_IN_S;
|
|
390
|
+
await waitUntilL1Timestamp(this.l1Client, oneSlotBefore, undefined, proofSubmissionWindowDuration * 2);
|
|
350
391
|
}
|
|
351
392
|
|
|
352
393
|
/** Waits for the aztec node to sync to the target block number. */
|
|
@@ -398,15 +439,13 @@ export class EpochsTestContext {
|
|
|
398
439
|
|
|
399
440
|
/** Creates an L1 client using a fresh account with funds from anvil, with a tx delayer already set up. */
|
|
400
441
|
public async createL1Client() {
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
this.l1Client.chain,
|
|
406
|
-
),
|
|
407
|
-
this.context.dateProvider!,
|
|
408
|
-
{ ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S },
|
|
442
|
+
const rawClient = createExtendedL1Client(
|
|
443
|
+
[...this.l1Client.chain.rpcUrls.default.http],
|
|
444
|
+
privateKeyToAccount(this.getNextPrivateKey()),
|
|
445
|
+
this.l1Client.chain,
|
|
409
446
|
);
|
|
447
|
+
const delayer = createDelayer(this.context.dateProvider, { ethereumSlotDuration: this.L1_BLOCK_TIME_IN_S }, {});
|
|
448
|
+
const client = wrapClientWithDelayer(rawClient, delayer);
|
|
410
449
|
expect(await client.getBalance({ address: client.account.address })).toBeGreaterThan(0n);
|
|
411
450
|
return { client, delayer };
|
|
412
451
|
}
|
|
@@ -423,6 +462,38 @@ export class EpochsTestContext {
|
|
|
423
462
|
expect(result).toBe(expectedSuccess);
|
|
424
463
|
}
|
|
425
464
|
|
|
465
|
+
/** Verifies at least one checkpoint has the target number of blocks (for MBPS validation). */
|
|
466
|
+
public async assertMultipleBlocksPerSlot(targetBlockCount: number) {
|
|
467
|
+
const archiver = (this.context.aztecNode as AztecNodeService).getBlockSource() as Archiver;
|
|
468
|
+
const checkpoints = await archiver.getCheckpoints(CheckpointNumber(1), 50);
|
|
469
|
+
|
|
470
|
+
this.logger.warn(`Retrieved ${checkpoints.length} checkpoints from archiver`, {
|
|
471
|
+
checkpoints: checkpoints.map(pc => pc.checkpoint.getStats()),
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
|
|
475
|
+
let targetFound = false;
|
|
476
|
+
|
|
477
|
+
for (const checkpoint of checkpoints) {
|
|
478
|
+
const blockCount = checkpoint.checkpoint.blocks.length;
|
|
479
|
+
targetFound = targetFound || blockCount >= targetBlockCount;
|
|
480
|
+
|
|
481
|
+
this.logger.verbose(`Checkpoint ${checkpoint.checkpoint.number} has ${blockCount} blocks`, {
|
|
482
|
+
checkpoint: checkpoint.checkpoint.getStats(),
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
for (let i = 0; i < blockCount; i++) {
|
|
486
|
+
const block = checkpoint.checkpoint.blocks[i];
|
|
487
|
+
expect(block.indexWithinCheckpoint).toBe(i);
|
|
488
|
+
expect(block.checkpointNumber).toBe(checkpoint.checkpoint.number);
|
|
489
|
+
expect(block.number).toBe(expectedBlockNumber);
|
|
490
|
+
expectedBlockNumber++;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
expect(targetFound).toBe(true);
|
|
495
|
+
}
|
|
496
|
+
|
|
426
497
|
public watchSequencerEvents(
|
|
427
498
|
sequencers: SequencerClient[],
|
|
428
499
|
getMetadata: (i: number) => Record<string, any> = () => ({}),
|
|
@@ -4,11 +4,11 @@ import type { Logger } from '@aztec/aztec.js/log';
|
|
|
4
4
|
import { Fq } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
6
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
8
7
|
|
|
9
8
|
import { jest } from '@jest/globals';
|
|
10
9
|
import type { Hex } from 'viem';
|
|
11
10
|
|
|
11
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
12
12
|
import { FeesTest } from './fees_test.js';
|
|
13
13
|
|
|
14
14
|
jest.setTimeout(300_000);
|