@aztec/end-to-end 0.0.1-commit.10bd49492 → 0.0.1-commit.11bf3dd6e
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 +13 -28
- 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.d.ts +3 -1
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +6 -4
- 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 +4 -3
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +7 -12
- 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/setup.d.ts +11 -8
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +23 -18
- 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/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/simulators/lending_simulator.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +2 -2
- package/dest/simulators/token_simulator.js +1 -1
- 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 +63 -45
- package/dest/test-wallet/test_wallet.d.ts +24 -23
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +115 -80
- 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 +9 -4
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/package.json +40 -40
- package/src/bench/client_flows/client_flows_benchmark.ts +31 -22
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +3 -6
- package/src/e2e_epochs/epochs_test.ts +16 -5
- 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 +12 -17
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/setup.ts +32 -25
- package/src/fixtures/setup_p2p_test.ts +9 -9
- package/src/fixtures/token_utils.ts +1 -4
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/legacy-jest-resolver.cjs +135 -0
- package/src/simulators/lending_simulator.ts +4 -2
- package/src/simulators/token_simulator.ts +1 -1
- package/src/spartan/setup_test_wallets.ts +63 -39
- package/src/test-wallet/test_wallet.ts +144 -99
- package/src/test-wallet/worker_wallet.ts +3 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
3
4
|
import { type FeePaymentMethod, PrivateFeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
@@ -249,11 +250,14 @@ export class ClientFlowsBenchmark {
|
|
|
249
250
|
|
|
250
251
|
async applyDeployBananaToken() {
|
|
251
252
|
this.logger.info('Applying banana token deployment');
|
|
252
|
-
const {
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
const { contract: bananaCoin, instance: bananaCoinInstance } = await BananaCoin.deploy(
|
|
254
|
+
this.adminWallet,
|
|
255
|
+
this.adminAddress,
|
|
256
|
+
'BC',
|
|
257
|
+
'BC',
|
|
258
|
+
18n,
|
|
259
|
+
).send({
|
|
255
260
|
from: this.adminAddress,
|
|
256
|
-
wait: { returnReceipt: true },
|
|
257
261
|
});
|
|
258
262
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
259
263
|
this.bananaCoin = bananaCoin;
|
|
@@ -262,11 +266,14 @@ export class ClientFlowsBenchmark {
|
|
|
262
266
|
|
|
263
267
|
async applyDeployCandyBarToken() {
|
|
264
268
|
this.logger.info('Applying candy bar token deployment');
|
|
265
|
-
const {
|
|
266
|
-
|
|
267
|
-
|
|
269
|
+
const { contract: candyBarCoin, instance: candyBarCoinInstance } = await TokenContract.deploy(
|
|
270
|
+
this.adminWallet,
|
|
271
|
+
this.adminAddress,
|
|
272
|
+
'CBC',
|
|
273
|
+
'CBC',
|
|
274
|
+
18n,
|
|
275
|
+
).send({
|
|
268
276
|
from: this.adminAddress,
|
|
269
|
-
wait: { returnReceipt: true },
|
|
270
277
|
});
|
|
271
278
|
this.logger.info(`CandyBarCoin deployed at ${candyBarCoin.address}`);
|
|
272
279
|
this.candyBarCoin = candyBarCoin;
|
|
@@ -279,11 +286,12 @@ export class ClientFlowsBenchmark {
|
|
|
279
286
|
expect((await this.context.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
280
287
|
|
|
281
288
|
const bananaCoin = this.bananaCoin;
|
|
282
|
-
const {
|
|
283
|
-
|
|
284
|
-
|
|
289
|
+
const { contract: bananaFPC, instance: bananaFPCInstance } = await FPCContract.deploy(
|
|
290
|
+
this.adminWallet,
|
|
291
|
+
bananaCoin.address,
|
|
292
|
+
this.adminAddress,
|
|
293
|
+
).send({
|
|
285
294
|
from: this.adminAddress,
|
|
286
|
-
wait: { returnReceipt: true },
|
|
287
295
|
});
|
|
288
296
|
|
|
289
297
|
this.logger.info(`BananaPay deployed at ${bananaFPC.address}`);
|
|
@@ -333,7 +341,7 @@ export class ClientFlowsBenchmark {
|
|
|
333
341
|
const claim = await this.feeJuiceBridgeTestHarness.prepareTokensOnL1(benchysAddress);
|
|
334
342
|
const behchysDeployMethod = await benchysAccountManager.getDeployMethod();
|
|
335
343
|
await behchysDeployMethod.send({
|
|
336
|
-
from:
|
|
344
|
+
from: NO_FROM,
|
|
337
345
|
fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(benchysAddress, claim) },
|
|
338
346
|
});
|
|
339
347
|
// Register benchy on the user's Wallet, where we're going to be interacting from
|
|
@@ -347,20 +355,21 @@ export class ClientFlowsBenchmark {
|
|
|
347
355
|
|
|
348
356
|
public async applyDeployAmm() {
|
|
349
357
|
this.logger.info('Applying AMM deployment');
|
|
350
|
-
const {
|
|
351
|
-
|
|
352
|
-
|
|
358
|
+
const { contract: liquidityToken, instance: liquidityTokenInstance } = await TokenContract.deploy(
|
|
359
|
+
this.adminWallet,
|
|
360
|
+
this.adminAddress,
|
|
361
|
+
'LPT',
|
|
362
|
+
'LPT',
|
|
363
|
+
18n,
|
|
364
|
+
).send({
|
|
353
365
|
from: this.adminAddress,
|
|
354
|
-
wait: { returnReceipt: true },
|
|
355
366
|
});
|
|
356
|
-
const {
|
|
357
|
-
receipt: { contract: amm, instance: ammInstance },
|
|
358
|
-
} = await AMMContract.deploy(
|
|
367
|
+
const { contract: amm, instance: ammInstance } = await AMMContract.deploy(
|
|
359
368
|
this.adminWallet,
|
|
360
369
|
this.bananaCoin.address,
|
|
361
370
|
this.candyBarCoin.address,
|
|
362
371
|
liquidityToken.address,
|
|
363
|
-
).send({ from: this.adminAddress
|
|
372
|
+
).send({ from: this.adminAddress });
|
|
364
373
|
this.logger.info(`AMM deployed at ${amm.address}`);
|
|
365
374
|
await liquidityToken.methods.set_minter(amm.address, true).send({ from: this.adminAddress });
|
|
366
375
|
this.liquidityToken = liquidityToken;
|
|
@@ -378,7 +387,7 @@ export class ClientFlowsBenchmark {
|
|
|
378
387
|
// The private fee paying method assembled on the app side requires knowledge of the maximum
|
|
379
388
|
// fee the user is willing to pay
|
|
380
389
|
const maxFeesPerGas = (await this.aztecNode.getCurrentMinFees()).mul(1.5);
|
|
381
|
-
const gasSettings = GasSettings.
|
|
390
|
+
const gasSettings = GasSettings.fallback({ maxFeesPerGas });
|
|
382
391
|
return new PrivateFeePaymentMethod(this.bananaFPC.address, sender, wallet, gasSettings);
|
|
383
392
|
}
|
|
384
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
|
/**
|
|
@@ -28,6 +28,7 @@ import { type SequencerClient, type SequencerEvents, SequencerState } from '@azt
|
|
|
28
28
|
import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
|
|
29
29
|
import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
30
30
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
31
|
+
import type { SlashingProtectionDatabase } from '@aztec/validator-ha-signer/types';
|
|
31
32
|
|
|
32
33
|
import { join } from 'path';
|
|
33
34
|
import type { Hex } from 'viem';
|
|
@@ -144,7 +145,7 @@ export class EpochsTestContext {
|
|
|
144
145
|
proverId: EthAddress.fromNumber(1),
|
|
145
146
|
worldStateCheckpointHistory: WORLD_STATE_CHECKPOINT_HISTORY,
|
|
146
147
|
exitDelaySeconds: DefaultL1ContractsConfig.exitDelaySeconds,
|
|
147
|
-
|
|
148
|
+
slasherEnabled: false,
|
|
148
149
|
l1PublishingTime,
|
|
149
150
|
...opts,
|
|
150
151
|
},
|
|
@@ -222,7 +223,7 @@ export class EpochsTestContext {
|
|
|
222
223
|
},
|
|
223
224
|
},
|
|
224
225
|
{
|
|
225
|
-
|
|
226
|
+
genesis: this.context.genesis,
|
|
226
227
|
dontStart: opts.dontStart,
|
|
227
228
|
},
|
|
228
229
|
),
|
|
@@ -238,13 +239,21 @@ export class EpochsTestContext {
|
|
|
238
239
|
|
|
239
240
|
public createValidatorNode(
|
|
240
241
|
privateKeys: `0x${string}`[],
|
|
241
|
-
opts: Partial<AztecNodeConfig> & {
|
|
242
|
+
opts: Partial<AztecNodeConfig> & {
|
|
243
|
+
dontStartSequencer?: boolean;
|
|
244
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
245
|
+
} = {},
|
|
242
246
|
) {
|
|
243
247
|
this.logger.warn('Creating and syncing a validator node...');
|
|
244
248
|
return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
|
|
245
249
|
}
|
|
246
250
|
|
|
247
|
-
private async createNode(
|
|
251
|
+
private async createNode(
|
|
252
|
+
opts: Partial<AztecNodeConfig> & {
|
|
253
|
+
dontStartSequencer?: boolean;
|
|
254
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
255
|
+
} = {},
|
|
256
|
+
) {
|
|
248
257
|
const nodeIndex = this.nodes.length + 1;
|
|
249
258
|
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
250
259
|
const { mockGossipSubNetwork } = this.context;
|
|
@@ -257,6 +266,7 @@ export class EpochsTestContext {
|
|
|
257
266
|
...resolvedConfig,
|
|
258
267
|
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
259
268
|
validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
|
|
269
|
+
nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
|
|
260
270
|
p2pEnabled,
|
|
261
271
|
p2pIp,
|
|
262
272
|
},
|
|
@@ -265,9 +275,10 @@ export class EpochsTestContext {
|
|
|
265
275
|
p2pClientDeps: {
|
|
266
276
|
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
267
277
|
},
|
|
278
|
+
slashingProtectionDb: opts.slashingProtectionDb,
|
|
268
279
|
},
|
|
269
280
|
{
|
|
270
|
-
|
|
281
|
+
genesis: this.context.genesis,
|
|
271
282
|
...opts,
|
|
272
283
|
},
|
|
273
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
|
}
|
|
@@ -4,12 +4,7 @@ import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
|
|
|
4
4
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
5
5
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
6
6
|
import { CheatCodes } from '@aztec/aztec/testing';
|
|
7
|
-
import {
|
|
8
|
-
BBCircuitVerifier,
|
|
9
|
-
type ClientProtocolCircuitVerifier,
|
|
10
|
-
QueuedIVCVerifier,
|
|
11
|
-
TestCircuitVerifier,
|
|
12
|
-
} from '@aztec/bb-prover';
|
|
7
|
+
import type { ClientProtocolCircuitVerifier } from '@aztec/bb-prover';
|
|
13
8
|
import { BackendType, Barretenberg } from '@aztec/bb.js';
|
|
14
9
|
import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
15
10
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
@@ -68,7 +63,10 @@ export class FullProverTest {
|
|
|
68
63
|
private provenComponents: ProvenSetup[] = [];
|
|
69
64
|
private bbConfigCleanup?: () => Promise<void>;
|
|
70
65
|
private acvmConfigCleanup?: () => Promise<void>;
|
|
71
|
-
|
|
66
|
+
/** Returns the proof verifier from the prover node (for test assertions). */
|
|
67
|
+
get circuitProofVerifier(): ClientProtocolCircuitVerifier | undefined {
|
|
68
|
+
return this.proverAztecNode?.getProofVerifier();
|
|
69
|
+
}
|
|
72
70
|
provenAsset!: TokenContract;
|
|
73
71
|
context!: EndToEndContext;
|
|
74
72
|
private proverAztecNode!: AztecNodeService;
|
|
@@ -106,15 +104,13 @@ export class FullProverTest {
|
|
|
106
104
|
await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
|
|
107
105
|
|
|
108
106
|
this.logger.info('Applying base setup: deploying token contract');
|
|
109
|
-
const {
|
|
110
|
-
receipt: { contract: asset, instance },
|
|
111
|
-
} = await TokenContract.deploy(
|
|
107
|
+
const { contract: asset, instance } = await TokenContract.deploy(
|
|
112
108
|
this.wallet,
|
|
113
109
|
this.accounts[0],
|
|
114
110
|
FullProverTest.TOKEN_NAME,
|
|
115
111
|
FullProverTest.TOKEN_SYMBOL,
|
|
116
112
|
FullProverTest.TOKEN_DECIMALS,
|
|
117
|
-
).send({ from: this.accounts[0]
|
|
113
|
+
).send({ from: this.accounts[0] });
|
|
118
114
|
this.logger.verbose(`Token deployed to ${asset.address}`);
|
|
119
115
|
|
|
120
116
|
this.fakeProofsAsset = asset;
|
|
@@ -170,9 +166,6 @@ export class FullProverTest {
|
|
|
170
166
|
|
|
171
167
|
await Barretenberg.initSingleton({ backend: BackendType.NativeUnixSocket });
|
|
172
168
|
|
|
173
|
-
const verifier = await BBCircuitVerifier.new(bbConfig);
|
|
174
|
-
this.circuitProofVerifier = new QueuedIVCVerifier(bbConfig, verifier);
|
|
175
|
-
|
|
176
169
|
this.logger.debug(`Configuring the node for real proofs...`);
|
|
177
170
|
await this.aztecNodeAdmin.setConfig({
|
|
178
171
|
realProofs: true,
|
|
@@ -180,7 +173,6 @@ export class FullProverTest {
|
|
|
180
173
|
});
|
|
181
174
|
} else {
|
|
182
175
|
this.logger.debug(`Configuring the node min txs per block ${this.minNumberOfTxsPerBlock}...`);
|
|
183
|
-
this.circuitProofVerifier = new TestCircuitVerifier();
|
|
184
176
|
await this.aztecNodeAdmin.setConfig({
|
|
185
177
|
minTxsPerBlock: this.minNumberOfTxsPerBlock,
|
|
186
178
|
});
|
|
@@ -231,8 +223,11 @@ export class FullProverTest {
|
|
|
231
223
|
|
|
232
224
|
this.logger.verbose('Starting prover node');
|
|
233
225
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
234
|
-
const {
|
|
226
|
+
const { genesis } = await getGenesisValues(
|
|
235
227
|
this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
|
|
228
|
+
undefined,
|
|
229
|
+
undefined,
|
|
230
|
+
this.context.genesis!.genesisTimestamp,
|
|
236
231
|
);
|
|
237
232
|
|
|
238
233
|
const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
|
|
@@ -260,7 +255,7 @@ export class FullProverTest {
|
|
|
260
255
|
this.proverAztecNode = await AztecNodeService.createAndSync(
|
|
261
256
|
proverNodeConfig,
|
|
262
257
|
{ dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
|
|
263
|
-
{
|
|
258
|
+
{ genesis },
|
|
264
259
|
);
|
|
265
260
|
this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
|
|
266
261
|
return this;
|
|
@@ -13,8 +13,10 @@ const {
|
|
|
13
13
|
BB_SKIP_CLEANUP = '',
|
|
14
14
|
TEMP_DIR = tmpdir(),
|
|
15
15
|
BB_WORKING_DIRECTORY = '',
|
|
16
|
-
BB_NUM_IVC_VERIFIERS = '
|
|
16
|
+
BB_NUM_IVC_VERIFIERS = '8',
|
|
17
17
|
BB_IVC_CONCURRENCY = '1',
|
|
18
|
+
BB_CHONK_VERIFY_MAX_BATCH = '16',
|
|
19
|
+
BB_CHONK_VERIFY_BATCH_CONCURRENCY = '6',
|
|
18
20
|
} = process.env;
|
|
19
21
|
|
|
20
22
|
export const getBBConfig = async (
|
|
@@ -41,16 +43,15 @@ export const getBBConfig = async (
|
|
|
41
43
|
const bbSkipCleanup = ['1', 'true'].includes(BB_SKIP_CLEANUP);
|
|
42
44
|
const cleanup = bbSkipCleanup ? () => Promise.resolve() : () => tryRmDir(directoryToCleanup);
|
|
43
45
|
|
|
44
|
-
const numIvcVerifiers = Number(BB_NUM_IVC_VERIFIERS);
|
|
45
|
-
const ivcConcurrency = Number(BB_IVC_CONCURRENCY);
|
|
46
|
-
|
|
47
46
|
return {
|
|
48
47
|
bbSkipCleanup,
|
|
49
48
|
bbBinaryPath,
|
|
50
49
|
bbWorkingDirectory,
|
|
51
50
|
cleanup,
|
|
52
|
-
numConcurrentIVCVerifiers:
|
|
53
|
-
bbIVCConcurrency:
|
|
51
|
+
numConcurrentIVCVerifiers: Number(BB_NUM_IVC_VERIFIERS),
|
|
52
|
+
bbIVCConcurrency: Number(BB_IVC_CONCURRENCY),
|
|
53
|
+
bbChonkVerifyMaxBatch: Number(BB_CHONK_VERIFY_MAX_BATCH),
|
|
54
|
+
bbChonkVerifyConcurrency: Number(BB_CHONK_VERIFY_BATCH_CONCURRENCY),
|
|
54
55
|
};
|
|
55
56
|
} catch (err) {
|
|
56
57
|
logger.error(`Native BB not available, error: ${err}`);
|