@aztec/end-to-end 0.0.1-commit.c2595eba → 0.0.1-commit.c2eed6949
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +21 -13
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- package/dest/bench/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +6 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -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 +22 -12
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +11 -7
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +62 -34
- package/dest/e2e_fees/fees_test.d.ts +2 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +18 -11
- 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/p2p_network.d.ts +5 -4
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +24 -7
- package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/e2e_p2p/reqresp/utils.js +190 -0
- package/dest/e2e_p2p/shared.d.ts +22 -2
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +38 -3
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +19 -9
- package/dest/fixtures/authwit_proxy.d.ts +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +30 -0
- package/dest/fixtures/e2e_prover_test.d.ts +7 -6
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +36 -45
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +5 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +6 -0
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +5 -5
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +116 -0
- package/dest/fixtures/index.d.ts +2 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +1 -0
- package/dest/fixtures/setup.d.ts +44 -23
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +70 -156
- package/dest/fixtures/setup_p2p_test.d.ts +15 -7
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +18 -12
- package/dest/fixtures/token_utils.d.ts +2 -2
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +5 -4
- 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/index.d.ts +2 -1
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +2 -2
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +16 -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 +3 -24
- package/dest/spartan/setup_test_wallets.d.ts +12 -3
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +59 -16
- package/dest/spartan/tx_metrics.js +1 -1
- package/dest/spartan/utils/bot.d.ts +3 -2
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +2 -1
- package/dest/spartan/utils/config.d.ts +10 -1
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +4 -1
- package/dest/spartan/utils/index.d.ts +5 -3
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +5 -1
- package/dest/spartan/utils/k8s.d.ts +3 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +6 -0
- package/dest/spartan/utils/nodes.d.ts +4 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +16 -10
- package/dest/spartan/utils/pod_logs.d.ts +25 -0
- package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
- package/dest/spartan/utils/pod_logs.js +74 -0
- package/dest/spartan/utils/scripts.d.ts +18 -4
- package/dest/spartan/utils/scripts.d.ts.map +1 -1
- package/dest/spartan/utils/scripts.js +19 -4
- package/dest/test-wallet/test_wallet.d.ts +76 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +213 -0
- package/dest/test-wallet/utils.d.ts +41 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +71 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +48 -0
- package/dest/test-wallet/worker_wallet.d.ts +52 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +151 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +10 -0
- package/package.json +45 -43
- package/src/bench/client_flows/client_flows_benchmark.ts +44 -39
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +8 -3
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +28 -15
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
- package/src/e2e_deploy_contract/deploy_test.ts +3 -3
- package/src/e2e_epochs/epochs_test.ts +83 -61
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +20 -28
- package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
- package/src/e2e_p2p/p2p_network.ts +36 -10
- package/src/e2e_p2p/reqresp/utils.ts +256 -0
- package/src/e2e_p2p/shared.ts +58 -3
- package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
- package/src/e2e_token_contract/token_contract_test.ts +26 -9
- package/src/fixtures/authwit_proxy.ts +50 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +44 -54
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +10 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +186 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +106 -217
- package/src/fixtures/setup_p2p_test.ts +25 -24
- package/src/fixtures/token_utils.ts +6 -3
- package/src/guides/up_quick_start.sh +3 -3
- package/src/shared/cross_chain_test_harness.ts +13 -9
- package/src/shared/gas_portal_test_harness.ts +1 -1
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +3 -2
- package/src/shared/uniswap_l1_l2.ts +38 -33
- package/src/simulators/lending_simulator.ts +8 -4
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +104 -18
- package/src/spartan/tx_metrics.ts +1 -1
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +3 -0
- package/src/spartan/utils/index.ts +8 -1
- package/src/spartan/utils/k8s.ts +8 -0
- package/src/spartan/utils/nodes.ts +18 -10
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/spartan/utils/scripts.ts +43 -7
- package/src/test-wallet/test_wallet.ts +301 -0
- package/src/test-wallet/utils.ts +112 -0
- package/src/test-wallet/wallet_worker_script.ts +60 -0
- package/src/test-wallet/worker_wallet.ts +213 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
2
3
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
4
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
4
5
|
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
@@ -13,11 +14,14 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
13
14
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
14
15
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
15
16
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
16
|
-
import {
|
|
17
|
+
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
17
18
|
|
|
18
19
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
19
20
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
20
21
|
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
22
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
23
|
+
import { proveInteraction } from '../test-wallet/utils.js';
|
|
24
|
+
import { WorkerWallet } from '../test-wallet/worker_wallet.js';
|
|
21
25
|
|
|
22
26
|
export interface TestAccounts {
|
|
23
27
|
aztecNode: AztecNode;
|
|
@@ -85,11 +89,19 @@ export async function deploySponsoredTestAccountsWithTokens(
|
|
|
85
89
|
|
|
86
90
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
87
91
|
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
88
|
-
await recipientDeployMethod.send({
|
|
92
|
+
await recipientDeployMethod.send({
|
|
93
|
+
from: NO_FROM,
|
|
94
|
+
fee: { paymentMethod },
|
|
95
|
+
wait: { timeout: 2400 },
|
|
96
|
+
});
|
|
89
97
|
await Promise.all(
|
|
90
98
|
fundedAccounts.map(async a => {
|
|
91
99
|
const deployMethod = await a.getDeployMethod();
|
|
92
|
-
await deployMethod.send({
|
|
100
|
+
await deployMethod.send({
|
|
101
|
+
from: NO_FROM,
|
|
102
|
+
fee: { paymentMethod },
|
|
103
|
+
wait: { timeout: 2400 },
|
|
104
|
+
}); // increase timeout on purpose in order to account for two empty epochs
|
|
93
105
|
logger.info(`Account deployed at ${a.address}`);
|
|
94
106
|
}),
|
|
95
107
|
);
|
|
@@ -118,16 +130,28 @@ export async function deploySponsoredTestAccountsWithTokens(
|
|
|
118
130
|
}
|
|
119
131
|
|
|
120
132
|
async function deployAccountWithDiagnostics(
|
|
121
|
-
account: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any },
|
|
133
|
+
account: { getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>; address: any },
|
|
122
134
|
paymentMethod: SponsoredFeePaymentMethod,
|
|
123
135
|
aztecNode: AztecNode,
|
|
124
136
|
logger: Logger,
|
|
125
137
|
accountLabel: string,
|
|
138
|
+
estimateGas?: boolean,
|
|
126
139
|
): Promise<void> {
|
|
127
140
|
const deployMethod = await account.getDeployMethod();
|
|
128
141
|
let txHash;
|
|
129
142
|
try {
|
|
130
|
-
|
|
143
|
+
let gasSettings;
|
|
144
|
+
if (estimateGas) {
|
|
145
|
+
const sim = await deployMethod.simulate({ from: NO_FROM, fee: { paymentMethod } });
|
|
146
|
+
gasSettings = sim.estimatedGas;
|
|
147
|
+
logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`);
|
|
148
|
+
}
|
|
149
|
+
const deployResult = await deployMethod.send({
|
|
150
|
+
from: NO_FROM,
|
|
151
|
+
fee: { paymentMethod, gasSettings },
|
|
152
|
+
wait: NO_WAIT,
|
|
153
|
+
});
|
|
154
|
+
txHash = deployResult.txHash;
|
|
131
155
|
await waitForTx(aztecNode, txHash, { timeout: 2400 });
|
|
132
156
|
logger.info(`${accountLabel} deployed at ${account.address}`);
|
|
133
157
|
} catch (error) {
|
|
@@ -149,18 +173,29 @@ async function deployAccountWithDiagnostics(
|
|
|
149
173
|
}
|
|
150
174
|
|
|
151
175
|
async function deployAccountsInBatches(
|
|
152
|
-
accounts: {
|
|
176
|
+
accounts: {
|
|
177
|
+
getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>;
|
|
178
|
+
address: any;
|
|
179
|
+
}[],
|
|
153
180
|
paymentMethod: SponsoredFeePaymentMethod,
|
|
154
181
|
aztecNode: AztecNode,
|
|
155
182
|
logger: Logger,
|
|
156
183
|
labelPrefix: string,
|
|
157
184
|
batchSize = 2,
|
|
185
|
+
estimateGas?: boolean,
|
|
158
186
|
): Promise<void> {
|
|
159
187
|
for (let i = 0; i < accounts.length; i += batchSize) {
|
|
160
188
|
const batch = accounts.slice(i, i + batchSize);
|
|
161
189
|
await Promise.all(
|
|
162
190
|
batch.map((account, idx) =>
|
|
163
|
-
deployAccountWithDiagnostics(
|
|
191
|
+
deployAccountWithDiagnostics(
|
|
192
|
+
account,
|
|
193
|
+
paymentMethod,
|
|
194
|
+
aztecNode,
|
|
195
|
+
logger,
|
|
196
|
+
`${labelPrefix}${i + idx + 1}`,
|
|
197
|
+
estimateGas,
|
|
198
|
+
),
|
|
164
199
|
),
|
|
165
200
|
);
|
|
166
201
|
}
|
|
@@ -171,6 +206,7 @@ export async function deploySponsoredTestAccounts(
|
|
|
171
206
|
aztecNode: AztecNode,
|
|
172
207
|
logger: Logger,
|
|
173
208
|
numberOfFundedWallets = 1,
|
|
209
|
+
opts?: { estimateGas?: boolean },
|
|
174
210
|
): Promise<TestAccountsWithoutTokens> {
|
|
175
211
|
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
176
212
|
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
@@ -180,8 +216,23 @@ export async function deploySponsoredTestAccounts(
|
|
|
180
216
|
|
|
181
217
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
182
218
|
|
|
183
|
-
await deployAccountWithDiagnostics(
|
|
184
|
-
|
|
219
|
+
await deployAccountWithDiagnostics(
|
|
220
|
+
recipientAccount,
|
|
221
|
+
paymentMethod,
|
|
222
|
+
aztecNode,
|
|
223
|
+
logger,
|
|
224
|
+
'Recipient account',
|
|
225
|
+
opts?.estimateGas,
|
|
226
|
+
);
|
|
227
|
+
await deployAccountsInBatches(
|
|
228
|
+
fundedAccounts,
|
|
229
|
+
paymentMethod,
|
|
230
|
+
aztecNode,
|
|
231
|
+
logger,
|
|
232
|
+
'Funded account ',
|
|
233
|
+
2,
|
|
234
|
+
opts?.estimateGas,
|
|
235
|
+
);
|
|
185
236
|
|
|
186
237
|
return {
|
|
187
238
|
aztecNode,
|
|
@@ -219,7 +270,7 @@ export async function deployTestAccountsWithTokens(
|
|
|
219
270
|
fundedAccounts.map(async (a, i) => {
|
|
220
271
|
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
221
272
|
const deployMethod = await a.getDeployMethod();
|
|
222
|
-
await deployMethod.send({ from:
|
|
273
|
+
await deployMethod.send({ from: NO_FROM, fee: { paymentMethod } });
|
|
223
274
|
logger.info(`Account deployed at ${a.address}`);
|
|
224
275
|
}),
|
|
225
276
|
);
|
|
@@ -263,7 +314,7 @@ async function bridgeL1FeeJuice(
|
|
|
263
314
|
const claim = await portal.bridgeTokensPublic(recipient, amount, true /* mint */);
|
|
264
315
|
|
|
265
316
|
const isSynced = async () =>
|
|
266
|
-
(await aztecNode.
|
|
317
|
+
(await aztecNode.getL1ToL2MessageCheckpoint(Fr.fromHexString(claim.messageHash))) !== undefined;
|
|
267
318
|
await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 0.5);
|
|
268
319
|
|
|
269
320
|
log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
|
|
@@ -295,13 +346,9 @@ async function deployTokenAndMint(
|
|
|
295
346
|
logger: Logger,
|
|
296
347
|
) {
|
|
297
348
|
logger.verbose(`Deploying TokenContract...`);
|
|
298
|
-
const {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
TOKEN_NAME,
|
|
302
|
-
TOKEN_SYMBOL,
|
|
303
|
-
TOKEN_DECIMALS,
|
|
304
|
-
).send({
|
|
349
|
+
const {
|
|
350
|
+
receipt: { contract: tokenContract },
|
|
351
|
+
} = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
|
|
305
352
|
from: admin,
|
|
306
353
|
fee: {
|
|
307
354
|
paymentMethod,
|
|
@@ -395,3 +442,42 @@ export async function createWalletAndAztecNodeClient(
|
|
|
395
442
|
},
|
|
396
443
|
};
|
|
397
444
|
}
|
|
445
|
+
|
|
446
|
+
export type WorkerWalletWrapper = {
|
|
447
|
+
wallet: WorkerWallet;
|
|
448
|
+
aztecNode: AztecNode;
|
|
449
|
+
cleanup: () => Promise<void>;
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
export async function createWorkerWalletClient(
|
|
453
|
+
nodeUrl: string,
|
|
454
|
+
proverEnabled: boolean,
|
|
455
|
+
logger: Logger,
|
|
456
|
+
): Promise<WorkerWalletWrapper> {
|
|
457
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
458
|
+
const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
|
|
459
|
+
|
|
460
|
+
// Strip cleanup functions — they can't be structured-cloned for worker transfer
|
|
461
|
+
const { cleanup: bbCleanup, ...bbPaths } = bbConfig ?? {};
|
|
462
|
+
const { cleanup: acvmCleanup, ...acvmPaths } = acvmConfig ?? {};
|
|
463
|
+
|
|
464
|
+
const pxeConfig = {
|
|
465
|
+
dataDirectory: undefined,
|
|
466
|
+
dataStoreMapSizeKb: 1024 * 1024,
|
|
467
|
+
...bbPaths,
|
|
468
|
+
...acvmPaths,
|
|
469
|
+
proverEnabled,
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
const wallet = await WorkerWallet.create(nodeUrl, pxeConfig);
|
|
473
|
+
|
|
474
|
+
return {
|
|
475
|
+
wallet,
|
|
476
|
+
aztecNode,
|
|
477
|
+
async cleanup() {
|
|
478
|
+
await wallet.stop();
|
|
479
|
+
await bbCleanup?.();
|
|
480
|
+
await acvmCleanup?.();
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
}
|
package/src/spartan/utils/bot.ts
CHANGED
|
@@ -34,7 +34,8 @@ export async function installTransferBot({
|
|
|
34
34
|
logger: log,
|
|
35
35
|
replicas = 1,
|
|
36
36
|
txIntervalSeconds = 10,
|
|
37
|
-
followChain = '
|
|
37
|
+
followChain = 'CHECKPOINTED',
|
|
38
|
+
pxeSyncChainTip = 'proposed',
|
|
38
39
|
mnemonic = process.env.LABS_INFRA_MNEMONIC ?? 'test test test test test test test test test test test junk',
|
|
39
40
|
mnemonicStartIndex,
|
|
40
41
|
botPrivateKey = process.env.BOT_TRANSFERS_L2_PRIVATE_KEY ?? '0xcafe01',
|
|
@@ -49,6 +50,7 @@ export async function installTransferBot({
|
|
|
49
50
|
replicas?: number;
|
|
50
51
|
txIntervalSeconds?: number;
|
|
51
52
|
followChain?: string;
|
|
53
|
+
pxeSyncChainTip?: string;
|
|
52
54
|
mnemonic?: string;
|
|
53
55
|
mnemonicStartIndex?: number | string;
|
|
54
56
|
botPrivateKey?: string;
|
|
@@ -67,6 +69,7 @@ export async function installTransferBot({
|
|
|
67
69
|
'bot.replicaCount': replicas,
|
|
68
70
|
'bot.txIntervalSeconds': txIntervalSeconds,
|
|
69
71
|
'bot.followChain': followChain,
|
|
72
|
+
'bot.pxeSyncChainTip': pxeSyncChainTip,
|
|
70
73
|
'bot.botPrivateKey': botPrivateKey,
|
|
71
74
|
'bot.nodeUrl': resolvedNodeUrl,
|
|
72
75
|
'bot.mnemonic': mnemonic,
|
|
@@ -8,6 +8,7 @@ const logger = createLogger('e2e:k8s-utils');
|
|
|
8
8
|
const testConfigSchema = z.object({
|
|
9
9
|
NAMESPACE: z.string().default('scenario'),
|
|
10
10
|
REAL_VERIFIER: schemas.Boolean.optional().default(true),
|
|
11
|
+
DEBUG_FORCE_TX_PROOF_VERIFICATION: schemas.Boolean.optional().default(true),
|
|
11
12
|
CREATE_ETH_DEVNET: schemas.Boolean.optional().default(false),
|
|
12
13
|
L1_RPC_URLS_JSON: z.string().optional(),
|
|
13
14
|
L1_ACCOUNT_MNEMONIC: z.string().optional(),
|
|
@@ -15,6 +16,8 @@ const testConfigSchema = z.object({
|
|
|
15
16
|
AZTEC_EPOCH_DURATION: z.coerce.number().optional().default(32),
|
|
16
17
|
AZTEC_PROOF_SUBMISSION_WINDOW: z.coerce.number().optional().default(5),
|
|
17
18
|
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: z.coerce.number().optional().default(2),
|
|
19
|
+
FUNDING_PRIVATE_KEY: z.string().optional(),
|
|
20
|
+
AZTEC_ADMIN_API_KEY: z.string().optional(),
|
|
18
21
|
});
|
|
19
22
|
|
|
20
23
|
export type TestConfig = z.infer<typeof testConfigSchema>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export { type TestConfig, setupEnvironment } from './config.js';
|
|
6
6
|
|
|
7
7
|
// Scripts
|
|
8
|
-
export { getGitProjectRoot, getAztecBin, runAztecBin, runProjectScript } from './scripts.js';
|
|
8
|
+
export { type ScriptResult, getGitProjectRoot, getAztecBin, runAztecBin, runProjectScript } from './scripts.js';
|
|
9
9
|
|
|
10
10
|
// K8s operations
|
|
11
11
|
export {
|
|
@@ -25,6 +25,7 @@ export {
|
|
|
25
25
|
getRPCEndpoint,
|
|
26
26
|
getEthereumEndpoint,
|
|
27
27
|
createResilientPrometheusConnection,
|
|
28
|
+
scaleProverAgents,
|
|
28
29
|
} from './k8s.js';
|
|
29
30
|
|
|
30
31
|
// Chaos Mesh
|
|
@@ -40,6 +41,9 @@ export {
|
|
|
40
41
|
applyNetworkShaping,
|
|
41
42
|
} from './chaos.js';
|
|
42
43
|
|
|
44
|
+
// Helm
|
|
45
|
+
export { hasDeployedHelmRelease } from './helm.js';
|
|
46
|
+
|
|
43
47
|
// Bot management
|
|
44
48
|
export { restartBot, installTransferBot, uninstallTransferBot } from './bot.js';
|
|
45
49
|
|
|
@@ -62,3 +66,6 @@ export { getPublicViemClient, getL1DeploymentAddresses, getNodeClient } from './
|
|
|
62
66
|
|
|
63
67
|
// Health checks
|
|
64
68
|
export { ChainHealth, type ChainHealthSnapshot } from './health.js';
|
|
69
|
+
|
|
70
|
+
// Pod log extraction
|
|
71
|
+
export { type BlockBuiltLogEntry, fetchBlockBuiltLogs } from './pod_logs.js';
|
package/src/spartan/utils/k8s.ts
CHANGED
|
@@ -522,6 +522,14 @@ export function createResilientPrometheusConnection(
|
|
|
522
522
|
return { connect, runAlertCheck };
|
|
523
523
|
}
|
|
524
524
|
|
|
525
|
+
/** Scales the prover-agent Deployment to the given number of replicas. */
|
|
526
|
+
export async function scaleProverAgents(namespace: string, replicas: number, log: Logger): Promise<void> {
|
|
527
|
+
const label = 'app.kubernetes.io/component=prover-agent';
|
|
528
|
+
const command = `kubectl scale deployment -l ${label} -n ${namespace} --replicas=${replicas} --timeout=2m`;
|
|
529
|
+
log.info(`Scaling prover agents to ${replicas}: ${command}`);
|
|
530
|
+
await execAsync(command);
|
|
531
|
+
}
|
|
532
|
+
|
|
525
533
|
export function getChartDir(spartanDir: string, chartName: string) {
|
|
526
534
|
return path.join(spartanDir.trim(), chartName);
|
|
527
535
|
}
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
getChartDir,
|
|
22
22
|
startPortForward,
|
|
23
23
|
waitForResourceByLabel,
|
|
24
|
+
waitForResourceByName,
|
|
24
25
|
waitForStatefulSetsReady,
|
|
25
26
|
} from './k8s.js';
|
|
26
27
|
|
|
@@ -154,6 +155,8 @@ export async function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNo
|
|
|
154
155
|
const results = [];
|
|
155
156
|
|
|
156
157
|
for (const sequencer of sequencers) {
|
|
158
|
+
// Ensure pod is Ready before attempting port-forward.
|
|
159
|
+
await waitForResourceByName({ resource: 'pods', name: sequencer, namespace });
|
|
157
160
|
// Wrap port-forward + fetch in a retry to handle flaky port-forwards
|
|
158
161
|
const result = await retry(
|
|
159
162
|
async () => {
|
|
@@ -170,7 +173,7 @@ export async function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNo
|
|
|
170
173
|
if (statusRes.status !== 200) {
|
|
171
174
|
throw new Error(`Admin endpoint returned status ${statusRes.status}`);
|
|
172
175
|
}
|
|
173
|
-
const client = createAztecNodeAdminClient(url);
|
|
176
|
+
const client = createAztecNodeAdminClient(url, {}, undefined, env.AZTEC_ADMIN_API_KEY);
|
|
174
177
|
return { result: await fn(client), process };
|
|
175
178
|
} catch (err) {
|
|
176
179
|
// Kill the port-forward before retrying
|
|
@@ -252,21 +255,18 @@ export async function initHADb(namespace: string): Promise<void> {
|
|
|
252
255
|
}
|
|
253
256
|
|
|
254
257
|
/**
|
|
255
|
-
*
|
|
256
|
-
* Wired to env
|
|
258
|
+
* Sets probabilistic transaction dropping on validators and waits for rollout.
|
|
259
|
+
* Use probability=0 to disable. Wired to env var P2P_DROP_TX_CHANCE via Helm values.
|
|
257
260
|
*/
|
|
258
261
|
export async function setValidatorTxDrop({
|
|
259
262
|
namespace,
|
|
260
|
-
enabled,
|
|
261
263
|
probability,
|
|
262
264
|
logger: log,
|
|
263
265
|
}: {
|
|
264
266
|
namespace: string;
|
|
265
|
-
enabled: boolean;
|
|
266
267
|
probability: number;
|
|
267
268
|
logger: Logger;
|
|
268
269
|
}) {
|
|
269
|
-
const drop = enabled ? 'true' : 'false';
|
|
270
270
|
const prob = String(probability);
|
|
271
271
|
|
|
272
272
|
const selectors = ['app.kubernetes.io/name=validator', 'app.kubernetes.io/component=validator', 'app=validator'];
|
|
@@ -281,7 +281,7 @@ export async function setValidatorTxDrop({
|
|
|
281
281
|
if (names.length === 0) {
|
|
282
282
|
continue;
|
|
283
283
|
}
|
|
284
|
-
const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace}
|
|
284
|
+
const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace} P2P_DROP_TX_CHANCE=${prob}`;
|
|
285
285
|
log.info(`command: ${cmd}`);
|
|
286
286
|
await execAsync(cmd);
|
|
287
287
|
updated = true;
|
|
@@ -363,16 +363,24 @@ export async function enableValidatorDynamicBootNode(
|
|
|
363
363
|
*/
|
|
364
364
|
export async function rollAztecPods(namespace: string, clearState: boolean = false) {
|
|
365
365
|
// Pod components use 'validator', but StatefulSets and PVCs use 'sequencer-node' for validators
|
|
366
|
+
// RPC nodes have nodeType='rpc-node' in Helm values, so their component label is 'rpc-node' (not 'rpc')
|
|
366
367
|
const podComponents = [
|
|
367
368
|
'p2p-bootstrap',
|
|
368
369
|
'prover-node',
|
|
369
370
|
'prover-broker',
|
|
370
371
|
'prover-agent',
|
|
371
372
|
'sequencer-node',
|
|
372
|
-
'rpc',
|
|
373
|
+
'rpc-node',
|
|
374
|
+
'validator-ha-db',
|
|
375
|
+
];
|
|
376
|
+
const pvcComponents = [
|
|
377
|
+
'p2p-bootstrap',
|
|
378
|
+
'prover-node',
|
|
379
|
+
'prover-broker',
|
|
380
|
+
'sequencer-node',
|
|
381
|
+
'rpc-node',
|
|
373
382
|
'validator-ha-db',
|
|
374
383
|
];
|
|
375
|
-
const pvcComponents = ['p2p-bootstrap', 'prover-node', 'prover-broker', 'sequencer-node', 'rpc', 'validator-ha-db'];
|
|
376
384
|
// StatefulSet components that need to be scaled down before PVC deletion
|
|
377
385
|
// Note: validators use 'sequencer-node' as component label, not 'validator'
|
|
378
386
|
const statefulSetComponents = [
|
|
@@ -380,7 +388,7 @@ export async function rollAztecPods(namespace: string, clearState: boolean = fal
|
|
|
380
388
|
'prover-node',
|
|
381
389
|
'prover-broker',
|
|
382
390
|
'sequencer-node',
|
|
383
|
-
'rpc',
|
|
391
|
+
'rpc-node',
|
|
384
392
|
'validator-ha-db',
|
|
385
393
|
];
|
|
386
394
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { exec } from 'child_process';
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
|
|
6
|
+
import { getSequencers } from './nodes.js';
|
|
7
|
+
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
|
|
10
|
+
/** Parsed l2-block-built stats from a sequencer pod log line. */
|
|
11
|
+
export type BlockBuiltLogEntry = {
|
|
12
|
+
blockNumber: number;
|
|
13
|
+
txCount: number;
|
|
14
|
+
duration: number;
|
|
15
|
+
publicProcessDuration: number;
|
|
16
|
+
manaPerSec: number;
|
|
17
|
+
privateLogCount: number;
|
|
18
|
+
publicLogCount: number;
|
|
19
|
+
contractClassLogCount: number;
|
|
20
|
+
contractClassLogSize: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const FIELDS: (keyof BlockBuiltLogEntry)[] = [
|
|
24
|
+
'blockNumber',
|
|
25
|
+
'txCount',
|
|
26
|
+
'duration',
|
|
27
|
+
'publicProcessDuration',
|
|
28
|
+
'manaPerSec',
|
|
29
|
+
'privateLogCount',
|
|
30
|
+
'publicLogCount',
|
|
31
|
+
'contractClassLogCount',
|
|
32
|
+
'contractClassLogSize',
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Fetches l2-block-built log entries from sequencer pods for given block numbers.
|
|
37
|
+
* Queries all validator pods (only the proposer will have the log for a given block).
|
|
38
|
+
*
|
|
39
|
+
* @param namespace - Kubernetes namespace
|
|
40
|
+
* @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
|
|
41
|
+
* @param blockNumbers - Set of block numbers to filter for
|
|
42
|
+
* @param logger - Logger instance
|
|
43
|
+
* @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
|
|
44
|
+
*/
|
|
45
|
+
export async function fetchBlockBuiltLogs(
|
|
46
|
+
namespace: string,
|
|
47
|
+
sinceTime: string,
|
|
48
|
+
blockNumbers: Set<number>,
|
|
49
|
+
logger: Logger,
|
|
50
|
+
): Promise<BlockBuiltLogEntry[]> {
|
|
51
|
+
const pods = await getSequencers(namespace);
|
|
52
|
+
const entriesByBlock = new Map<number, BlockBuiltLogEntry>();
|
|
53
|
+
|
|
54
|
+
// Subtract 60s from sinceTime to account for clock skew between test runner and k8s pods.
|
|
55
|
+
// Block number filtering ensures we only match the right blocks, so extra lines are harmless.
|
|
56
|
+
const sinceDate = new Date(new Date(sinceTime).getTime() - 60_000);
|
|
57
|
+
const sinceFlag = sinceDate.toISOString();
|
|
58
|
+
|
|
59
|
+
for (const pod of pods) {
|
|
60
|
+
try {
|
|
61
|
+
const cmd = `kubectl logs ${pod} -n ${namespace} -c aztec --since-time=${sinceFlag}`;
|
|
62
|
+
logger.info(`Fetching logs: ${cmd}`);
|
|
63
|
+
const { stdout } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024 });
|
|
64
|
+
|
|
65
|
+
const lines = stdout.split('\n');
|
|
66
|
+
const matchingLines = lines.filter(l => l.includes('l2-block-built'));
|
|
67
|
+
logger.info(`Pod ${pod}: ${lines.length} log lines, ${matchingLines.length} contain l2-block-built`);
|
|
68
|
+
|
|
69
|
+
for (const line of matchingLines) {
|
|
70
|
+
try {
|
|
71
|
+
const parsed = JSON.parse(line);
|
|
72
|
+
if (parsed.eventName !== 'l2-block-built' || !blockNumbers.has(parsed.blockNumber)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (entriesByBlock.has(parsed.blockNumber)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const entry: BlockBuiltLogEntry = {} as BlockBuiltLogEntry;
|
|
79
|
+
for (const field of FIELDS) {
|
|
80
|
+
entry[field] = parsed[field] ?? 0;
|
|
81
|
+
}
|
|
82
|
+
entriesByBlock.set(entry.blockNumber, entry);
|
|
83
|
+
logger.verbose(`Parsed l2-block-built log for block ${entry.blockNumber}`, entry);
|
|
84
|
+
} catch {
|
|
85
|
+
// Not valid JSON, skip
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
logger.warn(`Failed to fetch logs from pod ${pod}: ${err}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (entriesByBlock.size < blockNumbers.size) {
|
|
94
|
+
const missing = [...blockNumbers].filter(bn => !entriesByBlock.has(bn));
|
|
95
|
+
logger.warn(`Missing l2-block-built logs for block(s): ${missing.join(', ')}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return [...entriesByBlock.values()].sort((a, b) => a.blockNumber - b.blockNumber);
|
|
99
|
+
}
|
|
@@ -3,24 +3,47 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
3
3
|
import { execSync, spawn } from 'child_process';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
|
|
6
|
+
/** Result from running a script */
|
|
7
|
+
export type ScriptResult = {
|
|
8
|
+
exitCode: number;
|
|
9
|
+
stdout: string;
|
|
10
|
+
stderr: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
6
13
|
/**
|
|
7
14
|
* @param scriptPath - The path to the script, relative to the project root
|
|
8
15
|
* @param args - The arguments to pass to the script
|
|
9
16
|
* @param logger - The logger to use
|
|
10
|
-
* @returns The exit code of the script
|
|
17
|
+
* @returns The exit code, stdout, and stderr of the script
|
|
11
18
|
*/
|
|
12
|
-
function runScript(
|
|
19
|
+
function runScript(
|
|
20
|
+
scriptPath: string,
|
|
21
|
+
args: string[],
|
|
22
|
+
logger: Logger,
|
|
23
|
+
env?: Record<string, string>,
|
|
24
|
+
): Promise<ScriptResult> {
|
|
13
25
|
const childProcess = spawn(scriptPath, args, {
|
|
14
26
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
15
27
|
env: env ? { ...process.env, ...env } : process.env,
|
|
16
28
|
});
|
|
17
|
-
|
|
18
|
-
|
|
29
|
+
const stdoutChunks: Buffer[] = [];
|
|
30
|
+
const stderrChunks: Buffer[] = [];
|
|
31
|
+
|
|
32
|
+
return new Promise<ScriptResult>((resolve, reject) => {
|
|
33
|
+
childProcess.on('close', (code: number | null) =>
|
|
34
|
+
resolve({
|
|
35
|
+
exitCode: code ?? 0,
|
|
36
|
+
stdout: Buffer.concat(stdoutChunks).toString(),
|
|
37
|
+
stderr: Buffer.concat(stderrChunks).toString(),
|
|
38
|
+
}),
|
|
39
|
+
);
|
|
19
40
|
childProcess.on('error', reject);
|
|
20
41
|
childProcess.stdout?.on('data', (data: Buffer) => {
|
|
42
|
+
stdoutChunks.push(data);
|
|
21
43
|
logger.info(data.toString());
|
|
22
44
|
});
|
|
23
45
|
childProcess.stderr?.on('data', (data: Buffer) => {
|
|
46
|
+
stderrChunks.push(data);
|
|
24
47
|
logger.error(data.toString());
|
|
25
48
|
});
|
|
26
49
|
});
|
|
@@ -51,13 +74,26 @@ export function getAztecBin() {
|
|
|
51
74
|
* @param args - The arguments to pass to the Aztec binary
|
|
52
75
|
* @param logger - The logger to use
|
|
53
76
|
* @param env - Optional environment variables to set for the process
|
|
54
|
-
* @returns The exit code of the Aztec binary
|
|
77
|
+
* @returns The exit code, stdout, and stderr of the Aztec binary
|
|
55
78
|
*/
|
|
56
|
-
export function runAztecBin(args: string[], logger: Logger, env?: Record<string, string>) {
|
|
79
|
+
export function runAztecBin(args: string[], logger: Logger, env?: Record<string, string>): Promise<ScriptResult> {
|
|
57
80
|
return runScript('node', [getAztecBin(), ...args], logger, env);
|
|
58
81
|
}
|
|
59
82
|
|
|
60
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Runs a script from the project root
|
|
85
|
+
* @param script - The path to the script, relative to the project root
|
|
86
|
+
* @param args - The arguments to pass to the script
|
|
87
|
+
* @param logger - The logger to use
|
|
88
|
+
* @param env - Optional environment variables to set for the process
|
|
89
|
+
* @returns The exit code, stdout, and stderr of the script
|
|
90
|
+
*/
|
|
91
|
+
export function runProjectScript(
|
|
92
|
+
script: string,
|
|
93
|
+
args: string[],
|
|
94
|
+
logger: Logger,
|
|
95
|
+
env?: Record<string, string>,
|
|
96
|
+
): Promise<ScriptResult> {
|
|
61
97
|
const scriptPath = script.startsWith('/') ? script : path.join(getGitProjectRoot(), script);
|
|
62
98
|
return runScript(scriptPath, args, logger, env);
|
|
63
99
|
}
|