@aztec/end-to-end 0.0.1-commit.ec5f612 → 0.0.1-commit.ec7ac5448
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 +19 -26
- 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 +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 +15 -15
- 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 +8 -5
- package/dest/e2e_fees/fees_test.d.ts +1 -1
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +13 -6
- 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 +8 -9
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +33 -29
- package/dest/e2e_p2p/reqresp/utils.d.ts +1 -1
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
- package/dest/e2e_p2p/reqresp/utils.js +16 -3
- package/dest/e2e_p2p/shared.d.ts +25 -7
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +49 -44
- package/dest/e2e_token_contract/token_contract_test.d.ts +1 -1
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +11 -11
- package/dest/fixtures/authwit_proxy.d.ts +3 -3
- 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 +11 -16
- 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 +17 -9
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +27 -21
- 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/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 +2 -2
- package/dest/shared/jest_setup.js +32 -1
- package/dest/shared/submit-transactions.d.ts +1 -1
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +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 +14 -17
- 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 +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +4 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +69 -38
- package/dest/spartan/tx_metrics.js +1 -1
- package/dest/spartan/utils/config.d.ts +4 -1
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +1 -0
- package/dest/spartan/utils/index.d.ts +2 -1
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +2 -0
- 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/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 +4 -4
- package/package.json +43 -44
- package/src/bench/client_flows/client_flows_benchmark.ts +27 -10
- package/src/bench/utils.ts +7 -2
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -20
- package/src/e2e_epochs/epochs_test.ts +17 -5
- package/src/e2e_fees/fees_test.ts +13 -6
- package/src/e2e_nested_contract/nested_contract_test.ts +6 -4
- package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
- package/src/e2e_p2p/p2p_network.ts +47 -48
- package/src/e2e_p2p/reqresp/utils.ts +24 -3
- package/src/e2e_p2p/shared.ts +71 -59
- package/src/e2e_token_contract/token_contract_test.ts +16 -8
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/e2e_prover_test.ts +19 -18
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/setup.ts +43 -28
- package/src/fixtures/setup_p2p_test.ts +9 -9
- package/src/fixtures/token_utils.ts +1 -2
- 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 -1
- package/src/shared/jest_setup.ts +36 -1
- package/src/shared/submit-transactions.ts +1 -4
- package/src/shared/uniswap_l1_l2.ts +35 -28
- package/src/simulators/lending_simulator.ts +8 -4
- package/src/simulators/token_simulator.ts +6 -2
- package/src/spartan/setup_test_wallets.ts +90 -35
- package/src/spartan/tx_metrics.ts +1 -1
- package/src/spartan/utils/config.ts +1 -0
- package/src/spartan/utils/index.ts +3 -0
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/test-wallet/test_wallet.ts +144 -99
- package/src/test-wallet/worker_wallet.ts +3 -2
package/src/bench/utils.ts
CHANGED
|
@@ -25,7 +25,7 @@ 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
31
|
const telemetry = context.telemetryClient as BenchmarkTelemetryClient;
|
|
@@ -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) {
|
|
@@ -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
|
/**
|
|
@@ -107,20 +104,24 @@ export class BlacklistTokenContractTest {
|
|
|
107
104
|
await publicDeployAccounts(this.wallet, [this.adminAddress, this.otherAddress, this.blacklistedAddress]);
|
|
108
105
|
|
|
109
106
|
this.logger.verbose(`Deploying TokenContract...`);
|
|
110
|
-
this.asset = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
|
|
107
|
+
({ contract: this.asset } = await TokenBlacklistContract.deploy(this.wallet, this.adminAddress).send({
|
|
111
108
|
from: this.adminAddress,
|
|
112
|
-
});
|
|
109
|
+
}));
|
|
113
110
|
this.logger.verbose(`Token deployed to ${this.asset.address}`);
|
|
114
111
|
|
|
115
112
|
this.logger.verbose(`Deploying bad account...`);
|
|
116
|
-
this.badAccount = await InvalidAccountContract.deploy(this.wallet).send({
|
|
113
|
+
({ contract: this.badAccount } = await InvalidAccountContract.deploy(this.wallet).send({
|
|
114
|
+
from: this.adminAddress,
|
|
115
|
+
}));
|
|
117
116
|
this.logger.verbose(`Deployed to ${this.badAccount.address}.`);
|
|
118
117
|
|
|
119
118
|
// Deploy a proxy contract for "on behalf of other" tests. The note owner must be the tx sender
|
|
120
119
|
// (so their notes are in scope), but msg_sender in the target must differ from the note owner
|
|
121
120
|
// to trigger authwit validation. The proxy forwards calls so that msg_sender != tx sender.
|
|
122
121
|
this.logger.verbose(`Deploying generic proxy...`);
|
|
123
|
-
this.authwitProxy = await GenericProxyContract.deploy(this.wallet).send({
|
|
122
|
+
({ contract: this.authwitProxy } = await GenericProxyContract.deploy(this.wallet).send({
|
|
123
|
+
from: this.adminAddress,
|
|
124
|
+
}));
|
|
124
125
|
this.logger.verbose(`Deployed to ${this.authwitProxy.address}.`);
|
|
125
126
|
|
|
126
127
|
await this.crossTimestampOfChange();
|
|
@@ -133,9 +134,9 @@ export class BlacklistTokenContractTest {
|
|
|
133
134
|
[this.adminAddress, this.otherAddress, this.blacklistedAddress],
|
|
134
135
|
);
|
|
135
136
|
|
|
136
|
-
expect(
|
|
137
|
-
|
|
138
|
-
);
|
|
137
|
+
expect(
|
|
138
|
+
(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
|
|
139
|
+
).toEqual(new Role().withAdmin().toNoirStruct());
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
async setup() {
|
|
@@ -189,9 +190,9 @@ export class BlacklistTokenContractTest {
|
|
|
189
190
|
|
|
190
191
|
await this.crossTimestampOfChange();
|
|
191
192
|
|
|
192
|
-
expect(
|
|
193
|
-
|
|
194
|
-
);
|
|
193
|
+
expect(
|
|
194
|
+
(await this.asset.methods.get_roles(this.adminAddress).simulate({ from: this.adminAddress })).result,
|
|
195
|
+
).toEqual(adminMinterRole.toNoirStruct());
|
|
195
196
|
|
|
196
197
|
this.logger.verbose(`Minting ${amount} publicly...`);
|
|
197
198
|
await asset.methods.mint_public(this.adminAddress, amount).send({ from: this.adminAddress });
|
|
@@ -199,7 +200,7 @@ export class BlacklistTokenContractTest {
|
|
|
199
200
|
this.logger.verbose(`Minting ${amount} privately...`);
|
|
200
201
|
const secret = Fr.random();
|
|
201
202
|
const secretHash = await computeSecretHash(secret);
|
|
202
|
-
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 });
|
|
203
204
|
|
|
204
205
|
await this.addPendingShieldNoteToPXE(asset, this.adminAddress, amount, secretHash, receipt.txHash);
|
|
205
206
|
await asset.methods.redeem_shield(this.adminAddress, amount, secret).send({ from: this.adminAddress });
|
|
@@ -207,20 +208,20 @@ export class BlacklistTokenContractTest {
|
|
|
207
208
|
|
|
208
209
|
tokenSim.mintPublic(this.adminAddress, amount);
|
|
209
210
|
|
|
210
|
-
const publicBalance = await asset.methods
|
|
211
|
+
const { result: publicBalance } = await asset.methods
|
|
211
212
|
.balance_of_public(this.adminAddress)
|
|
212
213
|
.simulate({ from: this.adminAddress });
|
|
213
214
|
this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
|
|
214
215
|
expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(this.adminAddress));
|
|
215
216
|
|
|
216
217
|
tokenSim.mintPrivate(this.adminAddress, amount);
|
|
217
|
-
const privateBalance = await asset.methods
|
|
218
|
+
const { result: privateBalance } = await asset.methods
|
|
218
219
|
.balance_of_private(this.adminAddress)
|
|
219
220
|
.simulate({ from: this.adminAddress });
|
|
220
221
|
this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
|
|
221
222
|
expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(this.adminAddress));
|
|
222
223
|
|
|
223
|
-
const totalSupply = await asset.methods.total_supply().simulate({ from: this.adminAddress });
|
|
224
|
+
const { result: totalSupply } = await asset.methods.total_supply().simulate({ from: this.adminAddress });
|
|
224
225
|
this.logger.verbose(`Total supply: ${totalSupply}`);
|
|
225
226
|
expect(totalSupply).toEqual(tokenSim.totalSupply);
|
|
226
227
|
}
|
|
@@ -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
|
},
|
|
@@ -181,6 +182,7 @@ export class EpochsTestContext {
|
|
|
181
182
|
ethereumSlotDuration,
|
|
182
183
|
proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
|
|
183
184
|
targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
|
|
185
|
+
rollupManaLimit: Number(await this.rollup.getManaLimit()),
|
|
184
186
|
};
|
|
185
187
|
|
|
186
188
|
this.logger.info(
|
|
@@ -221,7 +223,7 @@ export class EpochsTestContext {
|
|
|
221
223
|
},
|
|
222
224
|
},
|
|
223
225
|
{
|
|
224
|
-
|
|
226
|
+
genesis: this.context.genesis,
|
|
225
227
|
dontStart: opts.dontStart,
|
|
226
228
|
},
|
|
227
229
|
),
|
|
@@ -237,13 +239,21 @@ export class EpochsTestContext {
|
|
|
237
239
|
|
|
238
240
|
public createValidatorNode(
|
|
239
241
|
privateKeys: `0x${string}`[],
|
|
240
|
-
opts: Partial<AztecNodeConfig> & {
|
|
242
|
+
opts: Partial<AztecNodeConfig> & {
|
|
243
|
+
dontStartSequencer?: boolean;
|
|
244
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
245
|
+
} = {},
|
|
241
246
|
) {
|
|
242
247
|
this.logger.warn('Creating and syncing a validator node...');
|
|
243
248
|
return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
|
|
244
249
|
}
|
|
245
250
|
|
|
246
|
-
private async createNode(
|
|
251
|
+
private async createNode(
|
|
252
|
+
opts: Partial<AztecNodeConfig> & {
|
|
253
|
+
dontStartSequencer?: boolean;
|
|
254
|
+
slashingProtectionDb?: SlashingProtectionDatabase;
|
|
255
|
+
} = {},
|
|
256
|
+
) {
|
|
247
257
|
const nodeIndex = this.nodes.length + 1;
|
|
248
258
|
const actorPrefix = opts.disableValidator ? 'node' : 'validator';
|
|
249
259
|
const { mockGossipSubNetwork } = this.context;
|
|
@@ -256,6 +266,7 @@ export class EpochsTestContext {
|
|
|
256
266
|
...resolvedConfig,
|
|
257
267
|
dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
|
|
258
268
|
validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
|
|
269
|
+
nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
|
|
259
270
|
p2pEnabled,
|
|
260
271
|
p2pIp,
|
|
261
272
|
},
|
|
@@ -264,9 +275,10 @@ export class EpochsTestContext {
|
|
|
264
275
|
p2pClientDeps: {
|
|
265
276
|
p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
|
|
266
277
|
},
|
|
278
|
+
slashingProtectionDb: opts.slashingProtectionDb,
|
|
267
279
|
},
|
|
268
280
|
{
|
|
269
|
-
|
|
281
|
+
genesis: this.context.genesis,
|
|
270
282
|
...opts,
|
|
271
283
|
},
|
|
272
284
|
),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { type Logger, createLogger } from '@aztec/aztec.js/log';
|
|
3
3
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
4
|
-
import { CheatCodes } from '@aztec/aztec/testing';
|
|
4
|
+
import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
|
|
5
5
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
6
6
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
7
7
|
import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
@@ -104,12 +104,15 @@ export class FeesTest {
|
|
|
104
104
|
|
|
105
105
|
async setup() {
|
|
106
106
|
this.logger.verbose('Setting up fresh context...');
|
|
107
|
+
// Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
|
|
108
|
+
const tokenAllowList = await getTokenAllowedSetupFunctions();
|
|
107
109
|
this.context = await setup(0, {
|
|
108
110
|
startProverNode: true,
|
|
109
111
|
...this.setupOptions,
|
|
110
112
|
fundSponsoredFPC: true,
|
|
111
113
|
skipAccountDeployment: true,
|
|
112
114
|
l1ContractsArgs: { ...this.setupOptions },
|
|
115
|
+
txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
|
|
113
116
|
});
|
|
114
117
|
|
|
115
118
|
this.rollupContract = RollupContract.getFromConfig(this.context.config);
|
|
@@ -157,11 +160,15 @@ export class FeesTest {
|
|
|
157
160
|
|
|
158
161
|
/** Alice mints bananaCoin tokens privately to the target address and redeems them. */
|
|
159
162
|
async mintPrivateBananas(amount: bigint, address: AztecAddress) {
|
|
160
|
-
const balanceBefore = await this.bananaCoin.methods
|
|
163
|
+
const { result: balanceBefore } = await this.bananaCoin.methods
|
|
164
|
+
.balance_of_private(address)
|
|
165
|
+
.simulate({ from: address });
|
|
161
166
|
|
|
162
167
|
await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
|
|
163
168
|
|
|
164
|
-
const balanceAfter = await this.bananaCoin.methods
|
|
169
|
+
const { result: balanceAfter } = await this.bananaCoin.methods
|
|
170
|
+
.balance_of_private(address)
|
|
171
|
+
.simulate({ from: address });
|
|
165
172
|
expect(balanceAfter).toEqual(balanceBefore + amount);
|
|
166
173
|
}
|
|
167
174
|
|
|
@@ -186,7 +193,7 @@ export class FeesTest {
|
|
|
186
193
|
this.wallet = this.context.wallet;
|
|
187
194
|
this.aztecNode = this.context.aztecNodeService;
|
|
188
195
|
this.aztecNodeAdmin = this.context.aztecNodeService;
|
|
189
|
-
this.gasSettings = GasSettings.
|
|
196
|
+
this.gasSettings = GasSettings.fallback({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
|
|
190
197
|
this.cheatCodes = this.context.cheatCodes;
|
|
191
198
|
this.accounts = deployedAccounts.map(a => a.address);
|
|
192
199
|
this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
|
|
@@ -223,7 +230,7 @@ export class FeesTest {
|
|
|
223
230
|
async applyDeployBananaToken() {
|
|
224
231
|
this.logger.info('Applying deploy banana token setup');
|
|
225
232
|
|
|
226
|
-
const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
|
|
233
|
+
const { contract: bananaCoin } = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
|
|
227
234
|
from: this.aliceAddress,
|
|
228
235
|
});
|
|
229
236
|
this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
|
|
@@ -244,7 +251,7 @@ export class FeesTest {
|
|
|
244
251
|
expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
|
|
245
252
|
|
|
246
253
|
const bananaCoin = this.bananaCoin;
|
|
247
|
-
const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
|
|
254
|
+
const { contract: bananaFPC } = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
|
|
248
255
|
from: this.aliceAddress,
|
|
249
256
|
});
|
|
250
257
|
|
|
@@ -65,9 +65,11 @@ export class NestedContractTest {
|
|
|
65
65
|
|
|
66
66
|
async applyManual() {
|
|
67
67
|
this.logger.info('Deploying parent and child contracts');
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
this.childContract =
|
|
68
|
+
({ contract: this.parentContract } = await ParentContract.deploy(this.wallet).send({
|
|
69
|
+
from: this.defaultAccountAddress,
|
|
70
|
+
}));
|
|
71
|
+
({ contract: this.childContract } = await ChildContract.deploy(this.wallet).send({
|
|
72
|
+
from: this.defaultAccountAddress,
|
|
73
|
+
}));
|
|
72
74
|
}
|
|
73
75
|
}
|
|
@@ -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
|
|
|
@@ -59,7 +54,7 @@ export const WAIT_FOR_TX_TIMEOUT = l1ContractsConfig.aztecSlotDuration * 3;
|
|
|
59
54
|
export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
|
|
60
55
|
aztecSlotDuration: 12,
|
|
61
56
|
ethereumSlotDuration: 4,
|
|
62
|
-
|
|
57
|
+
aztecProofSubmissionEpochs: 640,
|
|
63
58
|
};
|
|
64
59
|
|
|
65
60
|
export class P2PNetworkTest {
|
|
@@ -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
|
});
|
|
@@ -323,8 +319,9 @@ export class P2PNetworkTest {
|
|
|
323
319
|
throw new Error('Call setupAccount before deploying spam contract');
|
|
324
320
|
}
|
|
325
321
|
|
|
326
|
-
|
|
327
|
-
|
|
322
|
+
({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
|
|
323
|
+
from: this.defaultAccountAddress!,
|
|
324
|
+
}));
|
|
328
325
|
}
|
|
329
326
|
|
|
330
327
|
async removeInitialNode() {
|
|
@@ -359,7 +356,7 @@ export class P2PNetworkTest {
|
|
|
359
356
|
...this.setupOptions,
|
|
360
357
|
fundSponsoredFPC: true,
|
|
361
358
|
skipAccountDeployment: true,
|
|
362
|
-
|
|
359
|
+
slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
|
|
363
360
|
aztecTargetCommitteeSize: 0,
|
|
364
361
|
l1ContractsArgs: this.deployL1ContractsArgs,
|
|
365
362
|
},
|
|
@@ -371,8 +368,13 @@ export class P2PNetworkTest {
|
|
|
371
368
|
const sponsoredFPCAddress = await getSponsoredFPCAddress();
|
|
372
369
|
const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
|
|
373
370
|
|
|
374
|
-
const {
|
|
375
|
-
|
|
371
|
+
const { genesis } = await getGenesisValues(
|
|
372
|
+
initialFundedAccounts,
|
|
373
|
+
undefined,
|
|
374
|
+
undefined,
|
|
375
|
+
this.context.genesis!.genesisTimestamp,
|
|
376
|
+
);
|
|
377
|
+
this.genesis = genesis;
|
|
376
378
|
|
|
377
379
|
const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
|
|
378
380
|
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
|
|
@@ -407,6 +409,7 @@ export class P2PNetworkTest {
|
|
|
407
409
|
expectedNodeCount?: number,
|
|
408
410
|
timeoutSeconds = 30,
|
|
409
411
|
checkIntervalSeconds = 0.1,
|
|
412
|
+
topics: TopicType[] = [TopicType.tx],
|
|
410
413
|
) {
|
|
411
414
|
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
412
415
|
const minPeerCount = nodeCount - 1;
|
|
@@ -433,26 +436,28 @@ export class P2PNetworkTest {
|
|
|
433
436
|
|
|
434
437
|
this.logger.warn('All nodes connected to P2P mesh');
|
|
435
438
|
|
|
436
|
-
// Wait for GossipSub mesh to form for
|
|
439
|
+
// Wait for GossipSub mesh to form for all specified topics.
|
|
437
440
|
// We only require at least 1 mesh peer per node because GossipSub
|
|
438
441
|
// stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
442
|
+
for (const topic of topics) {
|
|
443
|
+
this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
|
|
444
|
+
await Promise.all(
|
|
445
|
+
nodes.map(async (node, index) => {
|
|
446
|
+
const p2p = node.getP2P();
|
|
447
|
+
await retryUntil(
|
|
448
|
+
async () => {
|
|
449
|
+
const meshPeers = await p2p.getGossipMeshPeerCount(topic);
|
|
450
|
+
this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
|
|
451
|
+
return meshPeers >= 1 ? true : undefined;
|
|
452
|
+
},
|
|
453
|
+
`Node ${index} to have gossip mesh peers for ${topic} topic`,
|
|
454
|
+
timeoutSeconds,
|
|
455
|
+
checkIntervalSeconds,
|
|
456
|
+
);
|
|
457
|
+
}),
|
|
458
|
+
);
|
|
459
|
+
this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
|
|
460
|
+
}
|
|
456
461
|
}
|
|
457
462
|
|
|
458
463
|
async teardown() {
|
|
@@ -464,8 +469,7 @@ export class P2PNetworkTest {
|
|
|
464
469
|
async getContracts(): Promise<{
|
|
465
470
|
rollup: RollupContract;
|
|
466
471
|
slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
|
|
467
|
-
slashingProposer:
|
|
468
|
-
slashFactory: SlashFactoryContract;
|
|
472
|
+
slashingProposer: SlashingProposerContract | undefined;
|
|
469
473
|
}> {
|
|
470
474
|
if (!this.ctx.deployL1ContractsValues) {
|
|
471
475
|
throw new Error('DeployAztecL1ContractsValues not set');
|
|
@@ -482,14 +486,9 @@ export class P2PNetworkTest {
|
|
|
482
486
|
client: this.ctx.deployL1ContractsValues.l1Client,
|
|
483
487
|
});
|
|
484
488
|
|
|
485
|
-
// Get the actual slashing proposer from rollup
|
|
489
|
+
// Get the actual slashing proposer from rollup
|
|
486
490
|
const slashingProposer = await rollup.getSlashingProposer();
|
|
487
491
|
|
|
488
|
-
|
|
489
|
-
this.ctx.deployL1ContractsValues.l1Client,
|
|
490
|
-
getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
|
|
491
|
-
);
|
|
492
|
-
|
|
493
|
-
return { rollup, slasherContract, slashingProposer, slashFactory };
|
|
492
|
+
return { rollup, slasherContract, slashingProposer };
|
|
494
493
|
}
|
|
495
494
|
}
|
|
@@ -91,7 +91,7 @@ export async function runReqrespTxTest(params: {
|
|
|
91
91
|
t.bootstrapNodeEnr,
|
|
92
92
|
NUM_VALIDATORS,
|
|
93
93
|
BOOT_NODE_UDP_PORT,
|
|
94
|
-
t.
|
|
94
|
+
t.genesis,
|
|
95
95
|
dataDir,
|
|
96
96
|
shouldCollectMetrics(),
|
|
97
97
|
);
|
|
@@ -149,6 +149,13 @@ export async function runReqrespTxTest(params: {
|
|
|
149
149
|
const submittedTxs = await Promise.all(
|
|
150
150
|
txBatches.map(async (batch, batchIndex) => {
|
|
151
151
|
const proposerNode = nodes[proposerIndexes[batchIndex]];
|
|
152
|
+
for (const tx of batch) {
|
|
153
|
+
t.logger.info(`Tx ${tx.getTxHash().toString()} base64: ${tx.toBuffer().toString('base64')}`);
|
|
154
|
+
}
|
|
155
|
+
const txHashes = batch.map(tx => tx.getTxHash().toString());
|
|
156
|
+
t.logger.info(
|
|
157
|
+
`Sending batch ${batchIndex} to proposer ${getNodePort(proposerIndexes[batchIndex])}: ${txHashes.join(', ')}`,
|
|
158
|
+
);
|
|
152
159
|
await Promise.all(
|
|
153
160
|
batch.map(async tx => {
|
|
154
161
|
try {
|
|
@@ -163,6 +170,12 @@ export async function runReqrespTxTest(params: {
|
|
|
163
170
|
}),
|
|
164
171
|
);
|
|
165
172
|
|
|
173
|
+
// Log pool state per node after sending
|
|
174
|
+
for (let i = 0; i < NUM_VALIDATORS; i++) {
|
|
175
|
+
const count = await nodes[i].getPendingTxCount();
|
|
176
|
+
t.logger.info(`Node ${getNodePort(i)} pool has ${count} pending txs`);
|
|
177
|
+
}
|
|
178
|
+
|
|
166
179
|
t.logger.info('Waiting for all transactions to be mined');
|
|
167
180
|
await Promise.all(
|
|
168
181
|
submittedTxs.flatMap((batch, batchIndex) =>
|
|
@@ -178,8 +191,16 @@ export async function runReqrespTxTest(params: {
|
|
|
178
191
|
|
|
179
192
|
// Assert that multiple blocks were built for at least one slot
|
|
180
193
|
t.logger.info('Verifying multiple blocks for at least one checkpoint');
|
|
181
|
-
|
|
182
|
-
|
|
194
|
+
// Wait for L1 checkpoint sync, which may lag behind P2P block propagation.
|
|
195
|
+
const checkpoints = await retryUntil(
|
|
196
|
+
async () => {
|
|
197
|
+
const cps = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
|
|
198
|
+
return cps.length > 0 && cps.some(cp => cp.checkpoint.blocks.length >= 2) ? cps : undefined;
|
|
199
|
+
},
|
|
200
|
+
'waiting for multi-block checkpoint to sync from L1',
|
|
201
|
+
30,
|
|
202
|
+
1,
|
|
203
|
+
);
|
|
183
204
|
|
|
184
205
|
let mbpsFound = false;
|
|
185
206
|
let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
|