@aztec/end-to-end 0.0.1-commit.f295ac2 → 0.0.1-commit.f504929
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 +39 -23
- 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 +5 -4
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +13 -8
- 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 +27 -18
- 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 +15 -7
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +86 -39
- package/dest/e2e_fees/bridging_race.notest.js +1 -1
- 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 +16 -16
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +1 -7
- package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
- package/dest/e2e_p2p/p2p_network.d.ts +4 -3
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +28 -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 +177 -0
- package/dest/e2e_p2p/shared.d.ts +20 -6
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +38 -18
- 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 +20 -10
- 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 +4 -4
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +41 -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/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 +43 -25
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +90 -169
- package/dest/fixtures/setup_p2p_test.d.ts +16 -9
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +40 -29
- 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 +12 -8
- package/dest/shared/cross_chain_test_harness.d.ts +3 -4
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +24 -24
- package/dest/shared/gas_portal_test_harness.js +3 -3
- package/dest/shared/index.d.ts +2 -1
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +4 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +9 -11
- 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 +24 -22
- 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 +9 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +93 -35
- package/dest/spartan/tx_metrics.d.ts +48 -2
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +310 -6
- package/dest/spartan/utils/bot.d.ts +28 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +142 -0
- package/dest/spartan/utils/chaos.d.ts +79 -0
- package/dest/spartan/utils/chaos.d.ts.map +1 -0
- package/dest/spartan/utils/chaos.js +142 -0
- package/dest/spartan/utils/clients.d.ts +39 -0
- package/dest/spartan/utils/clients.d.ts.map +1 -0
- package/dest/spartan/utils/clients.js +90 -0
- package/dest/spartan/utils/config.d.ts +42 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +22 -0
- package/dest/spartan/utils/health.d.ts +63 -0
- package/dest/spartan/utils/health.d.ts.map +1 -0
- package/dest/spartan/utils/health.js +202 -0
- package/dest/spartan/utils/helm.d.ts +15 -0
- package/dest/spartan/utils/helm.d.ts.map +1 -0
- package/dest/spartan/utils/helm.js +47 -0
- package/dest/spartan/utils/index.d.ts +10 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +20 -0
- package/dest/spartan/utils/k8s.d.ts +128 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +381 -0
- package/dest/spartan/utils/nodes.d.ts +40 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- package/dest/spartan/utils/scripts.d.ts +30 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +81 -0
- package/dest/spartan/utils.d.ts +2 -260
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -942
- package/dest/test-wallet/test_wallet.d.ts +83 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +214 -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 +46 -43
- package/src/bench/client_flows/client_flows_benchmark.ts +45 -57
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +15 -8
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +33 -23
- 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 +129 -93
- package/src/e2e_fees/bridging_race.notest.ts +2 -5
- package/src/e2e_fees/fees_test.ts +24 -39
- package/src/e2e_l1_publisher/write_json.ts +3 -8
- package/src/e2e_nested_contract/nested_contract_test.ts +7 -7
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
- package/src/e2e_p2p/p2p_network.ts +49 -17
- package/src/e2e_p2p/reqresp/utils.ts +235 -0
- package/src/e2e_p2p/shared.ts +66 -23
- 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 +27 -12
- 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 +43 -52
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +10 -0
- package/src/fixtures/ha_setup.ts +186 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/setup.ts +120 -233
- package/src/fixtures/setup_p2p_test.ts +40 -44
- package/src/fixtures/token_utils.ts +10 -6
- package/src/guides/up_quick_start.sh +3 -3
- package/src/shared/cross_chain_test_harness.ts +24 -34
- package/src/shared/gas_portal_test_harness.ts +2 -2
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +11 -16
- package/src/shared/uniswap_l1_l2.ts +26 -33
- package/src/simulators/lending_simulator.ts +6 -4
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +120 -25
- package/src/spartan/tx_metrics.ts +232 -9
- package/src/spartan/utils/bot.ts +188 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +28 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +68 -0
- package/src/spartan/utils/k8s.ts +535 -0
- package/src/spartan/utils/nodes.ts +543 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -1246
- package/src/test-wallet/test_wallet.ts +306 -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,10 +1,11 @@
|
|
|
1
1
|
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
4
|
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
4
5
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
5
6
|
import { type FeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
6
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
7
|
-
import { type AztecNode, createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
8
|
+
import { type AztecNode, createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
|
|
8
9
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
9
10
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
10
11
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
@@ -12,11 +13,14 @@ import type { Logger } from '@aztec/foundation/log';
|
|
|
12
13
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
13
14
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
14
15
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
15
|
-
import {
|
|
16
|
+
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
16
17
|
|
|
17
18
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
18
19
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
19
20
|
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
21
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
22
|
+
import { proveInteraction } from '../test-wallet/utils.js';
|
|
23
|
+
import { WorkerWallet } from '../test-wallet/worker_wallet.js';
|
|
20
24
|
|
|
21
25
|
export interface TestAccounts {
|
|
22
26
|
aztecNode: AztecNode;
|
|
@@ -84,11 +88,19 @@ export async function deploySponsoredTestAccountsWithTokens(
|
|
|
84
88
|
|
|
85
89
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
86
90
|
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
87
|
-
await recipientDeployMethod.send({
|
|
91
|
+
await recipientDeployMethod.send({
|
|
92
|
+
from: AztecAddress.ZERO,
|
|
93
|
+
fee: { paymentMethod },
|
|
94
|
+
wait: { timeout: 2400 },
|
|
95
|
+
});
|
|
88
96
|
await Promise.all(
|
|
89
97
|
fundedAccounts.map(async a => {
|
|
90
98
|
const deployMethod = await a.getDeployMethod();
|
|
91
|
-
await deployMethod.send({
|
|
99
|
+
await deployMethod.send({
|
|
100
|
+
from: AztecAddress.ZERO,
|
|
101
|
+
fee: { paymentMethod },
|
|
102
|
+
wait: { timeout: 2400 },
|
|
103
|
+
}); // increase timeout on purpose in order to account for two empty epochs
|
|
92
104
|
logger.info(`Account deployed at ${a.address}`);
|
|
93
105
|
}),
|
|
94
106
|
);
|
|
@@ -116,6 +128,56 @@ export async function deploySponsoredTestAccountsWithTokens(
|
|
|
116
128
|
};
|
|
117
129
|
}
|
|
118
130
|
|
|
131
|
+
async function deployAccountWithDiagnostics(
|
|
132
|
+
account: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any },
|
|
133
|
+
paymentMethod: SponsoredFeePaymentMethod,
|
|
134
|
+
aztecNode: AztecNode,
|
|
135
|
+
logger: Logger,
|
|
136
|
+
accountLabel: string,
|
|
137
|
+
): Promise<void> {
|
|
138
|
+
const deployMethod = await account.getDeployMethod();
|
|
139
|
+
let txHash;
|
|
140
|
+
try {
|
|
141
|
+
const deployResult = await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod }, wait: NO_WAIT });
|
|
142
|
+
txHash = deployResult.txHash;
|
|
143
|
+
await waitForTx(aztecNode, txHash, { timeout: 2400 });
|
|
144
|
+
logger.info(`${accountLabel} deployed at ${account.address}`);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
const blockNumber = await aztecNode.getBlockNumber();
|
|
147
|
+
let receipt;
|
|
148
|
+
try {
|
|
149
|
+
receipt = await aztecNode.getTxReceipt(txHash);
|
|
150
|
+
} catch {
|
|
151
|
+
receipt = 'unavailable';
|
|
152
|
+
}
|
|
153
|
+
logger.error(`${accountLabel} deployment failed`, {
|
|
154
|
+
txHash: txHash.toString(),
|
|
155
|
+
receipt: JSON.stringify(receipt),
|
|
156
|
+
currentBlockNumber: blockNumber,
|
|
157
|
+
error: String(error),
|
|
158
|
+
});
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function deployAccountsInBatches(
|
|
164
|
+
accounts: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any }[],
|
|
165
|
+
paymentMethod: SponsoredFeePaymentMethod,
|
|
166
|
+
aztecNode: AztecNode,
|
|
167
|
+
logger: Logger,
|
|
168
|
+
labelPrefix: string,
|
|
169
|
+
batchSize = 2,
|
|
170
|
+
): Promise<void> {
|
|
171
|
+
for (let i = 0; i < accounts.length; i += batchSize) {
|
|
172
|
+
const batch = accounts.slice(i, i + batchSize);
|
|
173
|
+
await Promise.all(
|
|
174
|
+
batch.map((account, idx) =>
|
|
175
|
+
deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`),
|
|
176
|
+
),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
119
181
|
export async function deploySponsoredTestAccounts(
|
|
120
182
|
wallet: TestWallet,
|
|
121
183
|
aztecNode: AztecNode,
|
|
@@ -129,15 +191,9 @@ export async function deploySponsoredTestAccounts(
|
|
|
129
191
|
await registerSponsoredFPC(wallet);
|
|
130
192
|
|
|
131
193
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
132
|
-
|
|
133
|
-
await
|
|
134
|
-
await
|
|
135
|
-
fundedAccounts.map(async a => {
|
|
136
|
-
const deployMethod = await a.getDeployMethod();
|
|
137
|
-
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 }); // increase timeout on purpose in order to account for two empty epochs
|
|
138
|
-
logger.info(`Account deployed at ${a.address}`);
|
|
139
|
-
}),
|
|
140
|
-
);
|
|
194
|
+
|
|
195
|
+
await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account');
|
|
196
|
+
await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2);
|
|
141
197
|
|
|
142
198
|
return {
|
|
143
199
|
aztecNode,
|
|
@@ -175,7 +231,7 @@ export async function deployTestAccountsWithTokens(
|
|
|
175
231
|
fundedAccounts.map(async (a, i) => {
|
|
176
232
|
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
177
233
|
const deployMethod = await a.getDeployMethod();
|
|
178
|
-
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } })
|
|
234
|
+
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } });
|
|
179
235
|
logger.info(`Account deployed at ${a.address}`);
|
|
180
236
|
}),
|
|
181
237
|
);
|
|
@@ -251,14 +307,15 @@ async function deployTokenAndMint(
|
|
|
251
307
|
logger: Logger,
|
|
252
308
|
) {
|
|
253
309
|
logger.verbose(`Deploying TokenContract...`);
|
|
254
|
-
const
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
|
|
310
|
+
const {
|
|
311
|
+
receipt: { contract: tokenContract },
|
|
312
|
+
} = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
|
|
313
|
+
from: admin,
|
|
314
|
+
fee: {
|
|
315
|
+
paymentMethod,
|
|
316
|
+
},
|
|
317
|
+
wait: { timeout: 600, returnReceipt: true },
|
|
318
|
+
});
|
|
262
319
|
|
|
263
320
|
const tokenAddress = tokenContract.address;
|
|
264
321
|
|
|
@@ -268,8 +325,7 @@ async function deployTokenAndMint(
|
|
|
268
325
|
accounts.map(acc =>
|
|
269
326
|
TokenContract.at(tokenAddress, wallet)
|
|
270
327
|
.methods.mint_to_public(acc, mintAmount)
|
|
271
|
-
.send({ from: admin, fee: { paymentMethod } })
|
|
272
|
-
.wait({ timeout: 600 }),
|
|
328
|
+
.send({ from: admin, fee: { paymentMethod }, wait: { timeout: 600 } }),
|
|
273
329
|
),
|
|
274
330
|
);
|
|
275
331
|
|
|
@@ -309,7 +365,7 @@ export async function performTransfers({
|
|
|
309
365
|
|
|
310
366
|
const provenTxs = await Promise.all(txs);
|
|
311
367
|
|
|
312
|
-
await Promise.all(provenTxs.map(t => t.send(
|
|
368
|
+
await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600 } })));
|
|
313
369
|
|
|
314
370
|
logger.info(`Completed round ${i + 1} / ${rounds}`);
|
|
315
371
|
}
|
|
@@ -347,3 +403,42 @@ export async function createWalletAndAztecNodeClient(
|
|
|
347
403
|
},
|
|
348
404
|
};
|
|
349
405
|
}
|
|
406
|
+
|
|
407
|
+
export type WorkerWalletWrapper = {
|
|
408
|
+
wallet: WorkerWallet;
|
|
409
|
+
aztecNode: AztecNode;
|
|
410
|
+
cleanup: () => Promise<void>;
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
export async function createWorkerWalletClient(
|
|
414
|
+
nodeUrl: string,
|
|
415
|
+
proverEnabled: boolean,
|
|
416
|
+
logger: Logger,
|
|
417
|
+
): Promise<WorkerWalletWrapper> {
|
|
418
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
419
|
+
const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
|
|
420
|
+
|
|
421
|
+
// Strip cleanup functions — they can't be structured-cloned for worker transfer
|
|
422
|
+
const { cleanup: bbCleanup, ...bbPaths } = bbConfig ?? {};
|
|
423
|
+
const { cleanup: acvmCleanup, ...acvmPaths } = acvmConfig ?? {};
|
|
424
|
+
|
|
425
|
+
const pxeConfig = {
|
|
426
|
+
dataDirectory: undefined,
|
|
427
|
+
dataStoreMapSizeKb: 1024 * 1024,
|
|
428
|
+
...bbPaths,
|
|
429
|
+
...acvmPaths,
|
|
430
|
+
proverEnabled,
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
const wallet = await WorkerWallet.create(nodeUrl, pxeConfig);
|
|
434
|
+
|
|
435
|
+
return {
|
|
436
|
+
wallet,
|
|
437
|
+
aztecNode,
|
|
438
|
+
async cleanup() {
|
|
439
|
+
await wallet.stop();
|
|
440
|
+
await bbCleanup?.();
|
|
441
|
+
await acvmCleanup?.();
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}
|
|
@@ -1,10 +1,137 @@
|
|
|
1
1
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
|
-
import type {
|
|
2
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
3
4
|
import type { TopicType } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { Tx, type TxReceipt
|
|
5
|
+
import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
|
|
5
6
|
|
|
6
7
|
import { createHistogram } from 'perf_hooks';
|
|
7
8
|
|
|
9
|
+
/** Metrics class for proving-related benchmarks. */
|
|
10
|
+
export class ProvingMetrics {
|
|
11
|
+
private successfulTxs: number | undefined;
|
|
12
|
+
private proofDuration: number | undefined;
|
|
13
|
+
private activeAgents: number | undefined;
|
|
14
|
+
private avgQueueTime: number | undefined;
|
|
15
|
+
private jobRetries: number | undefined;
|
|
16
|
+
private jobDuration: number | undefined;
|
|
17
|
+
private timedOutJobs: number | undefined;
|
|
18
|
+
private resolvedJobs: number | undefined;
|
|
19
|
+
private rejectedJobs: number | undefined;
|
|
20
|
+
private epochProvingDuration: number | undefined;
|
|
21
|
+
private provenTransactions: number | undefined;
|
|
22
|
+
private provenBlocks: number | undefined;
|
|
23
|
+
|
|
24
|
+
constructor(private prefix: string) {}
|
|
25
|
+
|
|
26
|
+
recordSuccessfulTxs(count: number): void {
|
|
27
|
+
this.successfulTxs = count;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
recordProofDuration(seconds: number): void {
|
|
31
|
+
this.proofDuration = seconds;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
recordActiveAgents(count: number): void {
|
|
35
|
+
this.activeAgents = count;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
recordAvgQueueTime(ms: number): void {
|
|
39
|
+
this.avgQueueTime = ms;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
recordJobRetries(count: number): void {
|
|
43
|
+
this.jobRetries = count;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
recordJobDuration(ms: number): void {
|
|
47
|
+
this.jobDuration = ms;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
recordTimedOutJobs(count: number): void {
|
|
51
|
+
this.timedOutJobs = count;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
recordResolvedJobs(count: number): void {
|
|
55
|
+
this.resolvedJobs = count;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
recordRejectedJobs(count: number): void {
|
|
59
|
+
this.rejectedJobs = count;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
recordEpochProvingDuration(seconds: number): void {
|
|
63
|
+
this.epochProvingDuration = seconds;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
recordProvenTransactions(count: number): void {
|
|
67
|
+
this.provenTransactions = count;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
recordProvenBlocks(count: number): void {
|
|
71
|
+
this.provenBlocks = count;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number }> {
|
|
75
|
+
const data: Array<{ name: string; unit: string; value: number }> = [];
|
|
76
|
+
|
|
77
|
+
if (this.successfulTxs !== undefined) {
|
|
78
|
+
data.push({ name: `${this.prefix}/successful_txs`, unit: 'count', value: this.successfulTxs });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (this.proofDuration !== undefined) {
|
|
82
|
+
data.push({ name: `${this.prefix}/proof_duration`, unit: 's', value: this.proofDuration });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (this.activeAgents !== undefined) {
|
|
86
|
+
data.push({ name: `${this.prefix}/active_agents`, unit: 'count', value: this.activeAgents });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.avgQueueTime !== undefined) {
|
|
90
|
+
data.push({ name: `${this.prefix}/avg_queue_time`, unit: 'ms', value: this.avgQueueTime });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (this.jobRetries !== undefined) {
|
|
94
|
+
data.push({ name: `${this.prefix}/job_retries`, unit: 'count', value: this.jobRetries });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (this.jobDuration !== undefined) {
|
|
98
|
+
data.push({ name: `${this.prefix}/job_duration`, unit: 'ms', value: this.jobDuration });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (this.timedOutJobs !== undefined) {
|
|
102
|
+
data.push({ name: `${this.prefix}/timed_out_jobs`, unit: 'count', value: this.timedOutJobs });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (this.resolvedJobs !== undefined) {
|
|
106
|
+
data.push({ name: `${this.prefix}/resolved_jobs`, unit: 'count', value: this.resolvedJobs });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (this.rejectedJobs !== undefined) {
|
|
110
|
+
data.push({ name: `${this.prefix}/rejected_jobs`, unit: 'count', value: this.rejectedJobs });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (this.epochProvingDuration !== undefined) {
|
|
114
|
+
data.push({ name: `${this.prefix}/epoch_proving_duration`, unit: 's', value: this.epochProvingDuration });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (this.provenTransactions !== undefined) {
|
|
118
|
+
data.push({ name: `${this.prefix}/proven_transactions`, unit: 'count', value: this.provenTransactions });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (this.provenBlocks !== undefined) {
|
|
122
|
+
data.push({ name: `${this.prefix}/proven_blocks`, unit: 'count', value: this.provenBlocks });
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const scenario = process.env.BENCH_SCENARIO?.trim();
|
|
126
|
+
if (!scenario) {
|
|
127
|
+
return data;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const scenarioPrefix = `scenario/${scenario}/`;
|
|
131
|
+
return data.map(entry => ({ ...entry, name: `${scenarioPrefix}${entry.name}` }));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
8
135
|
export type TxInclusionData = {
|
|
9
136
|
txHash: string;
|
|
10
137
|
sentAt: number;
|
|
@@ -20,16 +147,31 @@ export type TxInclusionData = {
|
|
|
20
147
|
export class TxInclusionMetrics {
|
|
21
148
|
private data = new Map<string, TxInclusionData>();
|
|
22
149
|
private groups = new Set<string>();
|
|
23
|
-
private blocks = new Map<number, Promise<
|
|
150
|
+
private blocks = new Map<number, Promise<L2Block | undefined>>();
|
|
24
151
|
|
|
25
152
|
private p2pGossipLatencyByTopic: Partial<Record<TopicType, { p50: number; p95: number }>> = {};
|
|
26
153
|
|
|
27
|
-
|
|
154
|
+
private attestationLatency: { p50: number; p95: number } | undefined;
|
|
155
|
+
private attestationCounts: { success: number; failedBad: number; failedNode: number } | undefined;
|
|
156
|
+
private reqRespStats: { fraction: number; delayP50: number; delayP95: number } | undefined;
|
|
157
|
+
private peerStats: { avgCount: number; connectionDurationP50: number; connectionDurationP95: number } | undefined;
|
|
158
|
+
private mempoolMinedDelay:
|
|
159
|
+
| { txP50: number; txP95: number; attestationP50: number; attestationP95: number }
|
|
160
|
+
| undefined;
|
|
161
|
+
|
|
162
|
+
constructor(
|
|
163
|
+
private aztecNode: AztecNode,
|
|
164
|
+
private logger?: Logger,
|
|
165
|
+
) {}
|
|
28
166
|
|
|
29
167
|
recordSentTx(tx: Tx, group: string): void {
|
|
30
168
|
const txHash = tx.getTxHash().toString();
|
|
31
169
|
const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
|
|
32
170
|
|
|
171
|
+
if (this.data.has(txHash)) {
|
|
172
|
+
this.logger?.debug(`Overwriting tx inclusion data for ${txHash}`, { txHash, group });
|
|
173
|
+
}
|
|
174
|
+
|
|
33
175
|
this.data.set(txHash, {
|
|
34
176
|
txHash,
|
|
35
177
|
sentAt: Math.trunc(Date.now() / 1000),
|
|
@@ -45,8 +187,13 @@ export class TxInclusionMetrics {
|
|
|
45
187
|
}
|
|
46
188
|
|
|
47
189
|
async recordMinedTx(txReceipt: TxReceipt): Promise<void> {
|
|
48
|
-
const {
|
|
49
|
-
if (
|
|
190
|
+
const { txHash, blockNumber } = txReceipt;
|
|
191
|
+
if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
|
|
192
|
+
this.logger?.debug('Skipping mined tx record due to receipt status', {
|
|
193
|
+
txHash: txHash.toString(),
|
|
194
|
+
status: txReceipt.status,
|
|
195
|
+
blockNumber,
|
|
196
|
+
});
|
|
50
197
|
return;
|
|
51
198
|
}
|
|
52
199
|
|
|
@@ -56,9 +203,15 @@ export class TxInclusionMetrics {
|
|
|
56
203
|
|
|
57
204
|
const block = await this.blocks.get(blockNumber)!;
|
|
58
205
|
if (!block) {
|
|
206
|
+
this.logger?.warn('Failed to load block for mined tx receipt', { txHash: txHash.toString(), blockNumber });
|
|
59
207
|
return;
|
|
60
208
|
}
|
|
61
|
-
const data = this.data.get(txHash.toString())
|
|
209
|
+
const data = this.data.get(txHash.toString());
|
|
210
|
+
if (!data) {
|
|
211
|
+
const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
|
|
212
|
+
this.logger?.warn(message, { txHash: txHash.toString(), blockNumber });
|
|
213
|
+
throw new Error(message);
|
|
214
|
+
}
|
|
62
215
|
data.blocknumber = blockNumber;
|
|
63
216
|
data.minedAt = Number(block.header.globalVariables.timestamp);
|
|
64
217
|
data.attestedAt = -1;
|
|
@@ -111,6 +264,26 @@ export class TxInclusionMetrics {
|
|
|
111
264
|
this.p2pGossipLatencyByTopic[topicName] = { p50, p95 };
|
|
112
265
|
}
|
|
113
266
|
|
|
267
|
+
public recordAttestationLatency(p50: number, p95: number): void {
|
|
268
|
+
this.attestationLatency = { p50, p95 };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
public recordAttestationCounts(success: number, failedBad: number, failedNode: number): void {
|
|
272
|
+
this.attestationCounts = { success, failedBad, failedNode };
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
public recordReqRespStats(fraction: number, delayP50: number, delayP95: number): void {
|
|
276
|
+
this.reqRespStats = { fraction, delayP50, delayP95 };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
public recordPeerStats(avgCount: number, connectionDurationP50: number, connectionDurationP95: number): void {
|
|
280
|
+
this.peerStats = { avgCount, connectionDurationP50, connectionDurationP95 };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
public recordMempoolMinedDelay(txP50: number, txP95: number, attestationP50: number, attestationP95: number): void {
|
|
284
|
+
this.mempoolMinedDelay = { txP50, txP95, attestationP50, attestationP95 };
|
|
285
|
+
}
|
|
286
|
+
|
|
114
287
|
toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> {
|
|
115
288
|
const data: Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> = [];
|
|
116
289
|
for (const group of this.groups) {
|
|
@@ -123,7 +296,7 @@ export class TxInclusionMetrics {
|
|
|
123
296
|
value: stats.mean,
|
|
124
297
|
},
|
|
125
298
|
{
|
|
126
|
-
name: `${group}/
|
|
299
|
+
name: `${group}/p50_inclusion`,
|
|
127
300
|
unit: 's',
|
|
128
301
|
value: stats.median,
|
|
129
302
|
},
|
|
@@ -148,6 +321,56 @@ export class TxInclusionMetrics {
|
|
|
148
321
|
});
|
|
149
322
|
}
|
|
150
323
|
|
|
151
|
-
|
|
324
|
+
if (this.attestationLatency) {
|
|
325
|
+
data.push(
|
|
326
|
+
{ name: 'attestation_latency/p50', unit: 'ms', value: this.attestationLatency.p50 },
|
|
327
|
+
{ name: 'attestation_latency/p95', unit: 'ms', value: this.attestationLatency.p95 },
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (this.attestationCounts) {
|
|
332
|
+
const { success, failedBad, failedNode } = this.attestationCounts;
|
|
333
|
+
const total = success + failedBad + failedNode;
|
|
334
|
+
const ratio = total > 0 ? success / total : 0;
|
|
335
|
+
data.push(
|
|
336
|
+
{ name: 'attestation/success_count', unit: 'count', value: success },
|
|
337
|
+
{ name: 'attestation/failed_bad_proposal_count', unit: 'count', value: failedBad },
|
|
338
|
+
{ name: 'attestation/failed_node_issue_count', unit: 'count', value: failedNode },
|
|
339
|
+
{ name: 'attestation/success_ratio', unit: 'ratio', value: ratio },
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (this.reqRespStats) {
|
|
344
|
+
data.push(
|
|
345
|
+
{ name: 'req_resp/txs_requested_fraction', unit: 'ratio', value: this.reqRespStats.fraction },
|
|
346
|
+
{ name: 'req_resp/delay_p50', unit: 'ms', value: this.reqRespStats.delayP50 },
|
|
347
|
+
{ name: 'req_resp/delay_p95', unit: 'ms', value: this.reqRespStats.delayP95 },
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (this.peerStats) {
|
|
352
|
+
data.push(
|
|
353
|
+
{ name: 'peers/avg_count', unit: 'peers', value: this.peerStats.avgCount },
|
|
354
|
+
{ name: 'peers/connection_duration_p50', unit: 'ms', value: this.peerStats.connectionDurationP50 },
|
|
355
|
+
{ name: 'peers/connection_duration_p95', unit: 'ms', value: this.peerStats.connectionDurationP95 },
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (this.mempoolMinedDelay) {
|
|
360
|
+
data.push(
|
|
361
|
+
{ name: 'mempool/tx_mined_delay_p50', unit: 'ms', value: this.mempoolMinedDelay.txP50 },
|
|
362
|
+
{ name: 'mempool/tx_mined_delay_p95', unit: 'ms', value: this.mempoolMinedDelay.txP95 },
|
|
363
|
+
{ name: 'mempool/attestation_mined_delay_p50', unit: 'ms', value: this.mempoolMinedDelay.attestationP50 },
|
|
364
|
+
{ name: 'mempool/attestation_mined_delay_p95', unit: 'ms', value: this.mempoolMinedDelay.attestationP95 },
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const scenario = process.env.BENCH_SCENARIO?.trim();
|
|
369
|
+
if (!scenario) {
|
|
370
|
+
return data;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const scenarioPrefix = `scenario/${scenario}/`;
|
|
374
|
+
return data.map(entry => ({ ...entry, name: `${scenarioPrefix}${entry.name}` }));
|
|
152
375
|
}
|
|
153
376
|
}
|