@aztec/end-to-end 0.0.1-commit.35158ae7e → 0.0.1-commit.3750d92a7
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 +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +11 -26
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -2
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +1 -1
- package/dest/e2e_epochs/epochs_test.js +3 -3
- package/dest/e2e_fees/fees_test.js +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
- package/dest/e2e_p2p/p2p_network.d.ts +5 -7
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +14 -13
- package/dest/e2e_p2p/reqresp/utils.js +1 -1
- package/dest/e2e_p2p/shared.d.ts +5 -7
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +16 -42
- package/dest/fixtures/authwit_proxy.d.ts +1 -1
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
- package/dest/fixtures/authwit_proxy.js +4 -0
- package/dest/fixtures/e2e_prover_test.d.ts +1 -1
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +4 -7
- package/dest/fixtures/setup.d.ts +11 -8
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +11 -9
- package/dest/fixtures/setup_p2p_test.d.ts +6 -6
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +8 -8
- package/dest/fixtures/token_utils.d.ts +1 -1
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +2 -5
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -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 +9 -42
- package/dest/test-wallet/test_wallet.d.ts +16 -8
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +82 -46
- package/dest/test-wallet/worker_wallet.d.ts +4 -4
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.d.ts +7 -2
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/package.json +40 -39
- package/src/bench/client_flows/client_flows_benchmark.ts +29 -21
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +3 -6
- package/src/e2e_epochs/epochs_test.ts +3 -3
- package/src/e2e_fees/fees_test.ts +1 -1
- package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
- package/src/e2e_p2p/p2p_network.ts +22 -27
- package/src/e2e_p2p/reqresp/utils.ts +1 -1
- package/src/e2e_p2p/shared.ts +16 -57
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/e2e_prover_test.ts +7 -6
- package/src/fixtures/setup.ts +21 -17
- package/src/fixtures/setup_p2p_test.ts +9 -9
- package/src/fixtures/token_utils.ts +1 -4
- package/src/legacy-jest-resolver.cjs +135 -0
- package/src/spartan/setup_test_wallets.ts +13 -35
- package/src/test-wallet/test_wallet.ts +100 -50
- package/src/test-wallet/worker_wallet.ts +3 -2
|
@@ -250,11 +250,14 @@ export class ClientFlowsBenchmark {
|
|
|
250
250
|
|
|
251
251
|
async applyDeployBananaToken() {
|
|
252
252
|
this.logger.info('Applying banana token deployment');
|
|
253
|
-
const {
|
|
254
|
-
|
|
255
|
-
|
|
253
|
+
const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
|
|
254
|
+
this.adminWallet,
|
|
255
|
+
this.adminAddress,
|
|
256
|
+
'BC',
|
|
257
|
+
'BC',
|
|
258
|
+
18n,
|
|
259
|
+
).send({
|
|
256
260
|
from: this.adminAddress,
|
|
257
|
-
wait: { returnReceipt: true },
|
|
258
261
|
});
|
|
259
262
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
260
263
|
this.bananaCoin = bananaCoin;
|
|
@@ -263,11 +266,14 @@ export class ClientFlowsBenchmark {
|
|
|
263
266
|
|
|
264
267
|
async applyDeployCandyBarToken() {
|
|
265
268
|
this.logger.info('Applying candy bar token deployment');
|
|
266
|
-
const {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TokenContract.deploy(
|
|
270
|
+
this.adminWallet,
|
|
271
|
+
this.adminAddress,
|
|
272
|
+
'CBC',
|
|
273
|
+
'CBC',
|
|
274
|
+
18n,
|
|
275
|
+
).send({
|
|
269
276
|
from: this.adminAddress,
|
|
270
|
-
wait: { returnReceipt: true },
|
|
271
277
|
});
|
|
272
278
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
273
279
|
this.candyBarCoin = candyBarCoin;
|
|
@@ -280,11 +286,12 @@ export class ClientFlowsBenchmark {
|
|
|
280
286
|
expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
281
287
|
|
|
282
288
|
const bananaCoin = this.bananaCoin;
|
|
283
|
-
const {
|
|
284
|
-
|
|
285
|
-
|
|
289
|
+
const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
|
|
290
|
+
this.adminWallet,
|
|
291
|
+
bananaCoin.address,
|
|
292
|
+
this.adminAddress,
|
|
293
|
+
).send({
|
|
286
294
|
from: this.adminAddress,
|
|
287
|
-
wait: { returnReceipt: true },
|
|
288
295
|
});
|
|
289
296
|
|
|
290
297
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
@@ -348,20 +355,21 @@ export class ClientFlowsBenchmark {
|
|
|
348
355
|
|
|
349
356
|
public async applyDeployAmm() {
|
|
350
357
|
this.logger.info('Applying AMM deployment');
|
|
351
|
-
const {
|
|
352
|
-
|
|
353
|
-
|
|
358
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TokenContract.deploy(
|
|
359
|
+
this.adminWallet,
|
|
360
|
+
this.adminAddress,
|
|
361
|
+
'LPT',
|
|
362
|
+
'LPT',
|
|
363
|
+
18n,
|
|
364
|
+
).send({
|
|
354
365
|
from: this.adminAddress,
|
|
355
|
-
wait: { returnReceipt: true },
|
|
356
366
|
});
|
|
357
|
-
const {
|
|
358
|
-
receipt: { contract: amm, instance: ammInstance },
|
|
359
|
-
} = await AMMContract.deploy(
|
|
367
|
+
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
360
368
|
this.adminWallet,
|
|
361
369
|
this.bananaCoin.address,
|
|
362
370
|
this.candyBarCoin.address,
|
|
363
371
|
liquidityToken.address,
|
|
364
|
-
).send({ from: this.adminAddress
|
|
372
|
+
).send({ from: this.adminAddress });
|
|
365
373
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
366
374
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
367
375
|
this.liquidityToken = liquidityToken;
|
|
@@ -379,7 +387,7 @@ export class ClientFlowsBenchmark {
|
|
|
379
387
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
380
388
|
// fee the user is willing to pay
|
|
381
389
|
const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1.5);
|
|
382
|
-
const gasSettings = GasSettings.
|
|
390
|
+
const gasSettings = GasSettings.fallback({ maxFeesPerGas });
|
|
383
391
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
384
392
|
}
|
|
385
393
|
|
|
@@ -10,6 +10,7 @@ import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist'
|
|
|
10
10
|
import { GenericProxyContract } from '@aztec/noir-test-contracts.js/GenericProxy';
|
|
11
11
|
import { InvalidAccountContract } from '@aztec/noir-test-contracts.js/InvalidAccount';
|
|
12
12
|
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
13
|
+
import type { AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
13
14
|
|
|
14
15
|
import { jest } from '@jest/globals';
|
|
15
16
|
|
|
@@ -57,7 +58,7 @@ export class BlacklistTokenContractTest {
|
|
|
57
58
|
authwitProxy!: GenericProxyContract;
|
|
58
59
|
cheatCodes!: CheatCodes;
|
|
59
60
|
sequencer!: SequencerClient;
|
|
60
|
-
aztecNode!: AztecNode;
|
|
61
|
+
aztecNode!: AztecNode & AztecNodeDebug;
|
|
61
62
|
|
|
62
63
|
adminAddress!: AztecAddress;
|
|
63
64
|
otherAddress!: AztecAddress;
|
|
@@ -68,11 +69,7 @@ export class BlacklistTokenContractTest {
|
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
async crossTimestampOfChange() {
|
|
71
|
-
await this.cheatCodes.warpL2TimeAtLeastBy(
|
|
72
|
-
this.sequencer,
|
|
73
|
-
this.aztecNode,
|
|
74
|
-
BlacklistTokenContractTest.CHANGE_ROLES_DELAY,
|
|
75
|
-
);
|
|
72
|
+
await this.cheatCodes.warpL2TimeAtLeastBy(this.aztecNode, BlacklistTokenContractTest.CHANGE_ROLES_DELAY);
|
|
76
73
|
}
|
|
77
74
|
|
|
78
75
|
/**
|
|
@@ -145,7 +145,7 @@ export class EpochsTestContext {
|
|
|
145
145
|
proverId: EthAddress.fromNumber(1),
|
|
146
146
|
worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
|
|
147
147
|
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
148
|
-
|
|
148
|
+
slasherEnabled: false,
|
|
149
149
|
l1PublishingTime,
|
|
150
150
|
...opts,
|
|
151
151
|
},
|
|
@@ -223,7 +223,7 @@ export class EpochsTestContext {
|
|
|
223
223
|
},
|
|
224
224
|
},
|
|
225
225
|
{
|
|
226
|
-
|
|
226
|
+
genesis: this.context.genesis,
|
|
227
227
|
dontStart: opts.dontStart,
|
|
228
228
|
},
|
|
229
229
|
),
|
|
@@ -278,7 +278,7 @@ export class EpochsTestContext {
|
|
|
278
278
|
slashingProtectionDb: opts.slashingProtectionDb,
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
|
-
|
|
281
|
+
genesis: this.context.genesis,
|
|
282
282
|
...opts,
|
|
283
283
|
},
|
|
284
284
|
),
|
|
@@ -193,7 +193,7 @@ export class FeesTest {
|
|
|
193
193
|
this.wallet = this.context.wallet;
|
|
194
194
|
this.aztecNode = this.context.aztecNodeService;
|
|
195
195
|
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
196
|
-
this.gasSettings = GasSettings.
|
|
196
|
+
this.gasSettings = GasSettings.fallback({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
|
|
197
197
|
this.cheatCodes = this.context.cheatCodes;
|
|
198
198
|
this.accounts = deployedAccounts.map(a => a.address);
|
|
199
199
|
this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
|
|
@@ -58,6 +58,7 @@ export class P2PInactivityTest {
|
|
|
58
58
|
basePort: BOOT_NODE_UDP_PORT,
|
|
59
59
|
startProverNode: true,
|
|
60
60
|
initialConfig: {
|
|
61
|
+
anvilSlotsInAnEpoch: 4,
|
|
61
62
|
proverNodeConfig: { proverNodeEpochProvingDelayMs: AZTEC_SLOT_DURATION * 1000 },
|
|
62
63
|
aztecTargetCommitteeSize: COMMITTEE_SIZE,
|
|
63
64
|
aztecSlotDuration: AZTEC_SLOT_DURATION,
|
|
@@ -66,7 +67,6 @@ export class P2PInactivityTest {
|
|
|
66
67
|
listenAddress: '127.0.0.1',
|
|
67
68
|
minTxsPerBlock: 0,
|
|
68
69
|
aztecEpochDuration: EPOCH_DURATION,
|
|
69
|
-
validatorReexecute: false,
|
|
70
70
|
sentinelEnabled: true,
|
|
71
71
|
slashingQuorum: SLASHING_QUORUM,
|
|
72
72
|
slashingRoundSizeInEpochs: SLASHING_ROUND_SIZE_IN_EPOCHS,
|
|
@@ -108,7 +108,7 @@ export class P2PInactivityTest {
|
|
|
108
108
|
this.test.bootstrapNodeEnr,
|
|
109
109
|
NUM_NODES - this.inactiveNodeCount - Number(this.keepInitialNode),
|
|
110
110
|
BOOT_NODE_UDP_PORT,
|
|
111
|
-
this.test.
|
|
111
|
+
this.test.genesis,
|
|
112
112
|
this.dataDir,
|
|
113
113
|
undefined,
|
|
114
114
|
Number(this.keepInitialNode),
|
|
@@ -122,7 +122,7 @@ export class P2PInactivityTest {
|
|
|
122
122
|
this.test.bootstrapNodeEnr,
|
|
123
123
|
this.inactiveNodeCount,
|
|
124
124
|
BOOT_NODE_UDP_PORT,
|
|
125
|
-
this.test.
|
|
125
|
+
this.test.genesis,
|
|
126
126
|
this.dataDir,
|
|
127
127
|
undefined,
|
|
128
128
|
NUM_NODES - this.inactiveNodeCount,
|
|
@@ -3,12 +3,7 @@ import type { AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
|
|
|
3
3
|
import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
4
4
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
5
5
|
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
|
|
6
|
-
import {
|
|
7
|
-
type EmpireSlashingProposerContract,
|
|
8
|
-
GSEContract,
|
|
9
|
-
RollupContract,
|
|
10
|
-
type TallySlashingProposerContract,
|
|
11
|
-
} from '@aztec/ethereum/contracts';
|
|
6
|
+
import { GSEContract, RollupContract, type SlashingProposerContract } from '@aztec/ethereum/contracts';
|
|
12
7
|
import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
8
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
14
9
|
import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
|
|
@@ -24,9 +19,9 @@ import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
|
24
19
|
import type { BootstrapNode } from '@aztec/p2p/bootstrap';
|
|
25
20
|
import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
|
|
26
21
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
27
|
-
import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
28
22
|
import { TopicType } from '@aztec/stdlib/p2p';
|
|
29
|
-
import
|
|
23
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
24
|
+
import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
30
25
|
import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
|
|
31
26
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
32
27
|
|
|
@@ -77,7 +72,7 @@ export class P2PNetworkTest {
|
|
|
77
72
|
public validators: Operator[] = [];
|
|
78
73
|
|
|
79
74
|
public deployedAccounts: InitialAccountData[] = [];
|
|
80
|
-
public
|
|
75
|
+
public genesis: GenesisData | undefined;
|
|
81
76
|
|
|
82
77
|
// The re-execution test needs a wallet and a spam contract
|
|
83
78
|
public wallet?: TestWallet;
|
|
@@ -124,7 +119,7 @@ export class P2PNetworkTest {
|
|
|
124
119
|
initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
|
|
125
120
|
slashingRoundSizeInEpochs:
|
|
126
121
|
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
127
|
-
|
|
122
|
+
slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
|
|
128
123
|
aztecTargetCommitteeSize: numberOfValidators,
|
|
129
124
|
metricsPort: metricsPort,
|
|
130
125
|
numberOfInitialFundedAccounts: 2,
|
|
@@ -137,7 +132,7 @@ export class P2PNetworkTest {
|
|
|
137
132
|
aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
|
|
138
133
|
slashingRoundSizeInEpochs:
|
|
139
134
|
initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
|
|
140
|
-
|
|
135
|
+
slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
|
|
141
136
|
|
|
142
137
|
ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
|
|
143
138
|
aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
|
|
@@ -305,10 +300,11 @@ export class P2PNetworkTest {
|
|
|
305
300
|
|
|
306
301
|
async setupAccount() {
|
|
307
302
|
this.logger.info('Setting up account');
|
|
308
|
-
const { deployedAccounts } = await deployAccounts(
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
303
|
+
const { deployedAccounts } = await deployAccounts(1, this.logger, {
|
|
304
|
+
wait: {
|
|
305
|
+
waitForStatus: TxStatus.CHECKPOINTED,
|
|
306
|
+
},
|
|
307
|
+
})({
|
|
312
308
|
wallet: this.context.wallet,
|
|
313
309
|
initialFundedAccounts: this.context.initialFundedAccounts,
|
|
314
310
|
});
|
|
@@ -360,7 +356,7 @@ export class P2PNetworkTest {
|
|
|
360
356
|
...this.setupOptions,
|
|
361
357
|
fundSponsoredFPC: true,
|
|
362
358
|
skipAccountDeployment: true,
|
|
363
|
-
|
|
359
|
+
slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
|
|
364
360
|
aztecTargetCommitteeSize: 0,
|
|
365
361
|
l1ContractsArgs: this.deployL1ContractsArgs,
|
|
366
362
|
},
|
|
@@ -372,8 +368,13 @@ export class P2PNetworkTest {
|
|
|
372
368
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
373
369
|
const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
|
|
374
370
|
|
|
375
|
-
const {
|
|
376
|
-
|
|
371
|
+
const { genesis } = await getGenesisValues(
|
|
372
|
+
initialFundedAccounts,
|
|
373
|
+
undefined,
|
|
374
|
+
undefined,
|
|
375
|
+
this.context.genesis!.genesisTimestamp,
|
|
376
|
+
);
|
|
377
|
+
this.genesis = genesis;
|
|
377
378
|
|
|
378
379
|
const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
|
|
379
380
|
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
|
|
@@ -468,8 +469,7 @@ export class P2PNetworkTest {
|
|
|
468
469
|
async getContracts(): Promise<{
|
|
469
470
|
rollup: RollupContract;
|
|
470
471
|
slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
|
|
471
|
-
slashingProposer:
|
|
472
|
-
slashFactory: SlashFactoryContract;
|
|
472
|
+
slashingProposer: SlashingProposerContract | undefined;
|
|
473
473
|
}> {
|
|
474
474
|
if (!this.ctx.deployL1ContractsValues) {
|
|
475
475
|
throw new Error('DeployAztecL1ContractsValues not set');
|
|
@@ -486,14 +486,9 @@ export class P2PNetworkTest {
|
|
|
486
486
|
client: this.ctx.deployL1ContractsValues.l1Client,
|
|
487
487
|
});
|
|
488
488
|
|
|
489
|
-
// Get the actual slashing proposer from rollup
|
|
489
|
+
// Get the actual slashing proposer from rollup
|
|
490
490
|
const slashingProposer = await rollup.getSlashingProposer();
|
|
491
491
|
|
|
492
|
-
|
|
493
|
-
this.ctx.deployL1ContractsValues.l1Client,
|
|
494
|
-
getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
|
|
495
|
-
);
|
|
496
|
-
|
|
497
|
-
return { rollup, slasherContract, slashingProposer, slashFactory };
|
|
492
|
+
return { rollup, slasherContract, slashingProposer };
|
|
498
493
|
}
|
|
499
494
|
}
|
package/src/e2e_p2p/shared.ts
CHANGED
|
@@ -7,11 +7,7 @@ import type { Logger } from '@aztec/aztec.js/log';
|
|
|
7
7
|
import { TxHash } from '@aztec/aztec.js/tx';
|
|
8
8
|
import type { RollupCheatCodes } from '@aztec/aztec/testing';
|
|
9
9
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
10
|
-
import type {
|
|
11
|
-
EmpireSlashingProposerContract,
|
|
12
|
-
RollupContract,
|
|
13
|
-
TallySlashingProposerContract,
|
|
14
|
-
} from '@aztec/ethereum/contracts';
|
|
10
|
+
import type { RollupContract, SlashingProposerContract } from '@aztec/ethereum/contracts';
|
|
15
11
|
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
16
12
|
import { timesAsync, unique } from '@aztec/foundation/collection';
|
|
17
13
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -22,7 +18,6 @@ import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.j
|
|
|
22
18
|
import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
23
19
|
import { getRoundForOffense } from '@aztec/slasher';
|
|
24
20
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
25
|
-
import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
26
21
|
|
|
27
22
|
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
28
23
|
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
@@ -99,7 +94,7 @@ export async function prepareTransactions(
|
|
|
99
94
|
}
|
|
100
95
|
|
|
101
96
|
export function awaitProposalExecution(
|
|
102
|
-
slashingProposer:
|
|
97
|
+
slashingProposer: SlashingProposerContract,
|
|
103
98
|
timeoutSeconds: number,
|
|
104
99
|
logger: Logger,
|
|
105
100
|
): Promise<bigint> {
|
|
@@ -109,24 +104,12 @@ export function awaitProposalExecution(
|
|
|
109
104
|
reject(new Error(`Timeout waiting for proposal execution after ${timeoutSeconds}s`));
|
|
110
105
|
}, timeoutSeconds * 1000);
|
|
111
106
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
logger.warn(`Proposal ${args.payload} from round ${args.round} executed`);
|
|
115
|
-
clearTimeout(timeout);
|
|
116
|
-
unwatch();
|
|
117
|
-
resolve(args.round);
|
|
118
|
-
});
|
|
119
|
-
} else if (slashingProposer.type === 'tally') {
|
|
120
|
-
const unwatch = slashingProposer.listenToRoundExecuted(args => {
|
|
121
|
-
logger.warn(`Slash from round ${args.round} executed`);
|
|
122
|
-
clearTimeout(timeout);
|
|
123
|
-
unwatch();
|
|
124
|
-
resolve(args.round);
|
|
125
|
-
});
|
|
126
|
-
} else {
|
|
107
|
+
const unwatch = slashingProposer.listenToRoundExecuted(args => {
|
|
108
|
+
logger.warn(`Slash from round ${args.round} executed`);
|
|
127
109
|
clearTimeout(timeout);
|
|
128
|
-
|
|
129
|
-
|
|
110
|
+
unwatch();
|
|
111
|
+
resolve(args.round);
|
|
112
|
+
});
|
|
130
113
|
});
|
|
131
114
|
}
|
|
132
115
|
|
|
@@ -245,7 +228,6 @@ export async function awaitCommitteeKicked({
|
|
|
245
228
|
rollup,
|
|
246
229
|
cheatCodes,
|
|
247
230
|
committee,
|
|
248
|
-
slashFactory,
|
|
249
231
|
slashingProposer,
|
|
250
232
|
slashingRoundSize,
|
|
251
233
|
aztecSlotDuration,
|
|
@@ -256,8 +238,7 @@ export async function awaitCommitteeKicked({
|
|
|
256
238
|
rollup: RollupContract;
|
|
257
239
|
cheatCodes: RollupCheatCodes;
|
|
258
240
|
committee: readonly `0x${string}`[];
|
|
259
|
-
|
|
260
|
-
slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
|
|
241
|
+
slashingProposer: SlashingProposerContract | undefined;
|
|
261
242
|
slashingRoundSize: number;
|
|
262
243
|
aztecSlotDuration: number;
|
|
263
244
|
aztecEpochDuration: number;
|
|
@@ -270,36 +251,14 @@ export async function awaitCommitteeKicked({
|
|
|
270
251
|
|
|
271
252
|
await cheatCodes.debugRollup();
|
|
272
253
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const events = await slashFactory.getSlashPayloadCreatedEvents();
|
|
282
|
-
return events.length > 0 ? events : undefined;
|
|
283
|
-
},
|
|
284
|
-
'slash payload created',
|
|
285
|
-
120,
|
|
286
|
-
1,
|
|
287
|
-
);
|
|
288
|
-
expect(slashPayloadEvents.length).toBe(1);
|
|
289
|
-
// The uniqueness check is needed since a validator may be slashed more than once on the same round (eg because they let two epochs be pruned)
|
|
290
|
-
expect(unique(slashPayloadEvents[0].slashes.map(slash => slash.validator.toString()))).toHaveLength(
|
|
291
|
-
committee.length,
|
|
292
|
-
);
|
|
293
|
-
} else {
|
|
294
|
-
// Use the slash offset to ensure we are in the right epoch for tally
|
|
295
|
-
const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
|
|
296
|
-
const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
|
|
297
|
-
const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
|
|
298
|
-
const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
|
|
299
|
-
const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
|
|
300
|
-
logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
|
|
301
|
-
await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
|
|
302
|
-
}
|
|
254
|
+
// Use the slash offset to ensure we are in the right epoch for tally
|
|
255
|
+
const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
|
|
256
|
+
const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
|
|
257
|
+
const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
|
|
258
|
+
const firstEpochInOffenseRound = offenseEpoch - (offenseEpoch % slashingRoundSizeInEpochs);
|
|
259
|
+
const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
|
|
260
|
+
logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
|
|
261
|
+
await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), { offset: -aztecSlotDuration / 2 });
|
|
303
262
|
|
|
304
263
|
const attestersPre = await rollup.getAttesters();
|
|
305
264
|
expect(attestersPre.length).toBe(committee.length);
|
|
@@ -17,6 +17,10 @@ async function buildProxyCall(proxy: GenericProxyContract, action: ContractFunct
|
|
|
17
17
|
return proxy.methods.forward_private_3(call.to, call.selector, call.args);
|
|
18
18
|
} else if (argCount === 4) {
|
|
19
19
|
return proxy.methods.forward_private_4(call.to, call.selector, call.args);
|
|
20
|
+
} else if (argCount === 5) {
|
|
21
|
+
return proxy.methods.forward_private_5(call.to, call.selector, call.args);
|
|
22
|
+
} else if (argCount === 6) {
|
|
23
|
+
return proxy.methods.forward_private_6(call.to, call.selector, call.args);
|
|
20
24
|
}
|
|
21
25
|
throw new Error(`No forward_private_${argCount} method on proxy`);
|
|
22
26
|
}
|
|
@@ -104,15 +104,13 @@ export class FullProverTest {
|
|
|
104
104
|
await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
|
|
105
105
|
|
|
106
106
|
this.logger.info('Applying base setup: deploying token contract');
|
|
107
|
-
const {
|
|
108
|
-
receipt: { contract: asset, instance },
|
|
109
|
-
} = await TokenContract.deploy(
|
|
107
|
+
const { contract: asset, instance } = await TokenContract.deploy(
|
|
110
108
|
this.wallet,
|
|
111
109
|
this.accounts[0],
|
|
112
110
|
FullProverTest.TOKEN_NAME,
|
|
113
111
|
FullProverTest.TOKEN_SYMBOL,
|
|
114
112
|
FullProverTest.TOKEN_DECIMALS,
|
|
115
|
-
).send({ from: this.accounts[0]
|
|
113
|
+
).send({ from: this.accounts[0] });
|
|
116
114
|
this.logger.verbose(`Token deployed to ${asset.address}`);
|
|
117
115
|
|
|
118
116
|
this.fakeProofsAsset = asset;
|
|
@@ -225,8 +223,11 @@ export class FullProverTest {
|
|
|
225
223
|
|
|
226
224
|
this.logger.verbose('Starting prover node');
|
|
227
225
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
228
|
-
const {
|
|
226
|
+
const { genesis } = await getGenesisValues(
|
|
229
227
|
this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
|
|
228
|
+
undefined,
|
|
229
|
+
undefined,
|
|
230
|
+
this.context.genesis!.genesisTimestamp,
|
|
230
231
|
);
|
|
231
232
|
|
|
232
233
|
const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
|
|
@@ -254,7 +255,7 @@ export class FullProverTest {
|
|
|
254
255
|
this.proverAztecNode = await AztecNodeService.createAndSync(
|
|
255
256
|
proverNodeConfig,
|
|
256
257
|
{ dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
|
|
257
|
-
{
|
|
258
|
+
{ genesis },
|
|
258
259
|
);
|
|
259
260
|
this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
|
|
260
261
|
return this;
|
package/src/fixtures/setup.ts
CHANGED
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
BatchCall,
|
|
8
8
|
type ContractFunctionInteraction,
|
|
9
9
|
type ContractMethod,
|
|
10
|
+
type DeployInteractionWaitOptions,
|
|
11
|
+
type DeployOptions,
|
|
10
12
|
getContractClassFromArtifact,
|
|
11
13
|
waitForProven,
|
|
12
14
|
} from '@aztec/aztec.js/contracts';
|
|
@@ -49,9 +51,10 @@ import type { ProverNodeConfig } from '@aztec/prover-node';
|
|
|
49
51
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
|
|
50
52
|
import type { SequencerClient } from '@aztec/sequencer-client';
|
|
51
53
|
import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
|
|
52
|
-
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
54
|
+
import type { AztecNodeAdmin, AztecNodeDebug } from '@aztec/stdlib/interfaces/client';
|
|
53
55
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
54
56
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
57
|
+
import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
55
58
|
import {
|
|
56
59
|
type TelemetryClient,
|
|
57
60
|
type TelemetryClientConfig,
|
|
@@ -178,6 +181,8 @@ export type SetupOptions = {
|
|
|
178
181
|
proverNodeConfig?: Partial<ProverNodeConfig>;
|
|
179
182
|
/** Whether to use a mock gossip sub network for p2p clients. */
|
|
180
183
|
mockGossipSubNetwork?: boolean;
|
|
184
|
+
/** Whether to add simulated latency to the mock gossipsub network (in ms) */
|
|
185
|
+
mockGossipSubNetworkLatency?: number;
|
|
181
186
|
/** Whether to disable the anvil test watcher (can still be manually started) */
|
|
182
187
|
disableAnvilTestWatcher?: boolean;
|
|
183
188
|
/** Whether to enable anvil automine during deployment of L1 contracts (consider defaulting this to true). */
|
|
@@ -210,7 +215,7 @@ export type EndToEndContext = {
|
|
|
210
215
|
/** The Anvil instance (only set if anvil was started locally). */
|
|
211
216
|
anvil: Anvil | undefined;
|
|
212
217
|
/** The Aztec Node service or client a connected to it. */
|
|
213
|
-
aztecNode: AztecNode;
|
|
218
|
+
aztecNode: AztecNode & AztecNodeDebug;
|
|
214
219
|
/** The Aztec Node as a service. */
|
|
215
220
|
aztecNodeService: AztecNodeService;
|
|
216
221
|
/** Client to the Aztec Node admin interface. */
|
|
@@ -249,8 +254,8 @@ export type EndToEndContext = {
|
|
|
249
254
|
sequencerDelayer: Delayer | undefined;
|
|
250
255
|
/** Delayer for prover node L1 txs (only when enableDelayer and startProverNode are true). */
|
|
251
256
|
proverDelayer: Delayer | undefined;
|
|
252
|
-
/**
|
|
253
|
-
|
|
257
|
+
/** Genesis data used for setting up nodes. */
|
|
258
|
+
genesis: GenesisData | undefined;
|
|
254
259
|
/** ACVM config (only set if running locally). */
|
|
255
260
|
acvmConfig: Awaited<ReturnType<typeof getACVMConfig>>;
|
|
256
261
|
/** BB config (only set if running locally). */
|
|
@@ -276,7 +281,7 @@ export async function setup(
|
|
|
276
281
|
let anvil: Anvil | undefined;
|
|
277
282
|
try {
|
|
278
283
|
opts.aztecTargetCommitteeSize ??= 0;
|
|
279
|
-
opts.
|
|
284
|
+
opts.slasherEnabled ??= false;
|
|
280
285
|
|
|
281
286
|
const config: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts };
|
|
282
287
|
// use initialValidators for the node config
|
|
@@ -375,10 +380,12 @@ export async function setup(
|
|
|
375
380
|
addressesToFund.push(sponsoredFPCAddress);
|
|
376
381
|
}
|
|
377
382
|
|
|
378
|
-
const
|
|
383
|
+
const genesisTimestamp = BigInt(Math.floor(Date.now() / 1000));
|
|
384
|
+
const { genesisArchiveRoot, genesis, fundingNeeded } = await getGenesisValues(
|
|
379
385
|
addressesToFund,
|
|
380
386
|
opts.initialAccountFeeJuice,
|
|
381
387
|
opts.genesisPublicData,
|
|
388
|
+
genesisTimestamp,
|
|
382
389
|
);
|
|
383
390
|
|
|
384
391
|
const wasAutomining = await ethCheatCodes.isAutoMining();
|
|
@@ -467,7 +474,7 @@ export async function setup(
|
|
|
467
474
|
let p2pClientDeps: P2PClientDeps | undefined = undefined;
|
|
468
475
|
|
|
469
476
|
if (opts.mockGossipSubNetwork) {
|
|
470
|
-
mockGossipSubNetwork = new MockGossipSubNetwork();
|
|
477
|
+
mockGossipSubNetwork = new MockGossipSubNetwork(opts.mockGossipSubNetworkLatency);
|
|
471
478
|
p2pClientDeps = { p2pServiceFactory: getMockPubSubP2PServiceFactory(mockGossipSubNetwork) };
|
|
472
479
|
}
|
|
473
480
|
|
|
@@ -496,11 +503,7 @@ export async function setup(
|
|
|
496
503
|
}
|
|
497
504
|
|
|
498
505
|
const aztecNodeService = await withLoggerBindings({ actor: 'node-0' }, () =>
|
|
499
|
-
AztecNodeService.createAndSync(
|
|
500
|
-
config,
|
|
501
|
-
{ dateProvider, telemetry: telemetryClient, p2pClientDeps },
|
|
502
|
-
{ prefilledPublicData },
|
|
503
|
-
),
|
|
506
|
+
AztecNodeService.createAndSync(config, { dateProvider, telemetry: telemetryClient, p2pClientDeps }, { genesis }),
|
|
504
507
|
);
|
|
505
508
|
const sequencerClient = aztecNodeService.getSequencer();
|
|
506
509
|
|
|
@@ -524,7 +527,7 @@ export async function setup(
|
|
|
524
527
|
dataDirectory: proverNodeDataDirectory,
|
|
525
528
|
},
|
|
526
529
|
{ dateProvider, p2pClientDeps, telemetry: telemetryClient },
|
|
527
|
-
{
|
|
530
|
+
{ genesis },
|
|
528
531
|
));
|
|
529
532
|
}
|
|
530
533
|
|
|
@@ -629,7 +632,7 @@ export async function setup(
|
|
|
629
632
|
initialFundedAccounts,
|
|
630
633
|
logger,
|
|
631
634
|
mockGossipSubNetwork,
|
|
632
|
-
|
|
635
|
+
genesis,
|
|
633
636
|
proverNode,
|
|
634
637
|
sequencerDelayer,
|
|
635
638
|
proverDelayer,
|
|
@@ -729,7 +732,7 @@ export function createAndSyncProverNode(
|
|
|
729
732
|
dateProvider: DateProvider;
|
|
730
733
|
p2pClientDeps?: P2PClientDeps;
|
|
731
734
|
},
|
|
732
|
-
options: {
|
|
735
|
+
options: { genesis?: GenesisData; dontStart?: boolean },
|
|
733
736
|
): Promise<{ proverNode: AztecNodeService }> {
|
|
734
737
|
return withLoggerBindings({ actor: 'prover-0' }, async () => {
|
|
735
738
|
const proverNode = await AztecNodeService.createAndSync(
|
|
@@ -742,7 +745,7 @@ export function createAndSyncProverNode(
|
|
|
742
745
|
proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
|
|
743
746
|
},
|
|
744
747
|
deps,
|
|
745
|
-
{
|
|
748
|
+
{ genesis: options.genesis, dontStartProverNode: options.dontStart },
|
|
746
749
|
);
|
|
747
750
|
|
|
748
751
|
if (!proverNode.getProverNode()) {
|
|
@@ -833,7 +836,7 @@ export async function ensureAccountContractsPublished(wallet: Wallet, accountsTo
|
|
|
833
836
|
* Returns deployed account data that can be used by tests.
|
|
834
837
|
*/
|
|
835
838
|
export const deployAccounts =
|
|
836
|
-
(numberOfAccounts: number, logger: Logger) =>
|
|
839
|
+
(numberOfAccounts: number, logger: Logger, deployOptions?: Partial<DeployOptions<DeployInteractionWaitOptions>>) =>
|
|
837
840
|
async ({ wallet, initialFundedAccounts }: { wallet: TestWallet; initialFundedAccounts: InitialAccountData[] }) => {
|
|
838
841
|
if (initialFundedAccounts.length < numberOfAccounts) {
|
|
839
842
|
throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
|
|
@@ -852,6 +855,7 @@ export const deployAccounts =
|
|
|
852
855
|
await deployMethod.send({
|
|
853
856
|
from: NO_FROM,
|
|
854
857
|
skipClassPublication: i !== 0, // Publish the contract class at most once.
|
|
858
|
+
...deployOptions,
|
|
855
859
|
});
|
|
856
860
|
}
|
|
857
861
|
|