@aztec/end-to-end 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a
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/benchmark.d.ts +15 -1
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +17 -0
- 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 +33 -36
- package/dest/bench/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +8 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +5 -4
- 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 +28 -19
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +15 -4
- 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 +39 -7
- package/dest/e2e_deploy_contract/deploy_test.d.ts +3 -3
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +2 -1
- package/dest/e2e_epochs/epochs_test.d.ts +25 -2
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +88 -14
- package/dest/e2e_fees/fees_test.d.ts +5 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +44 -11
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +3 -3
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +6 -7
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +5 -3
- package/dest/e2e_p2p/p2p_network.d.ts +13 -11
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +65 -43
- 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 +42 -13
- 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 +73 -50
- package/dest/e2e_token_contract/token_contract_test.d.ts +3 -3
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +15 -13
- 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 +6 -5
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +13 -17
- package/dest/fixtures/fixtures.d.ts +73 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +68 -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 +2 -2
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +1 -1
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
- package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
- package/dest/fixtures/setup.d.ts +44 -12
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +138 -29
- package/dest/fixtures/setup_p2p_test.d.ts +10 -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/fixtures/utils.d.ts +2 -2
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +1 -1
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- 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 +4 -2
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +22 -18
- package/dest/shared/gas_portal_test_harness.d.ts +8 -5
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +19 -10
- 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 +60 -39
- package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
- package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
- package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
- package/dest/simulators/lending_simulator.d.ts +10 -3
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +26 -14
- 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 +72 -39
- package/dest/spartan/tx_metrics.d.ts +18 -4
- package/dest/spartan/tx_metrics.d.ts.map +1 -1
- package/dest/spartan/tx_metrics.js +74 -21
- package/dest/spartan/utils/config.d.ts +9 -32
- 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/nodes.js +2 -2
- 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 +25 -23
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +146 -87
- package/dest/test-wallet/utils.d.ts +3 -3
- package/dest/test-wallet/utils.d.ts.map +1 -1
- package/dest/test-wallet/utils.js +2 -7
- package/dest/test-wallet/wallet_worker_script.js +2 -2
- package/dest/test-wallet/worker_wallet.d.ts +5 -4
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet.js +5 -1
- package/dest/test-wallet/worker_wallet_schema.d.ts +110 -224
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.js +14 -2
- package/package.json +49 -46
- package/src/bench/client_flows/benchmark.ts +19 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +60 -41
- package/src/bench/utils.ts +9 -3
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +42 -24
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +49 -11
- package/src/e2e_deploy_contract/deploy_test.ts +3 -2
- package/src/e2e_epochs/epochs_test.ts +99 -11
- package/src/e2e_fees/fees_test.ts +49 -9
- package/src/e2e_nested_contract/nested_contract_test.ts +9 -5
- package/src/e2e_p2p/inactivity_slash_test.ts +5 -3
- package/src/e2e_p2p/p2p_network.ts +82 -60
- package/src/e2e_p2p/reqresp/utils.ts +51 -12
- package/src/e2e_p2p/shared.ts +92 -64
- package/src/e2e_token_contract/token_contract_test.ts +28 -10
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/e2e_prover_test.ts +22 -19
- package/src/fixtures/fixtures.ts +86 -0
- package/src/fixtures/get_bb_config.ts +7 -6
- package/src/fixtures/ha_setup.ts +4 -2
- package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
- package/src/fixtures/setup.ts +176 -34
- package/src/fixtures/setup_p2p_test.ts +13 -9
- package/src/fixtures/token_utils.ts +1 -2
- package/src/fixtures/utils.ts +2 -0
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/guides/up_quick_start.sh +0 -2
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +112 -0
- package/src/shared/cross_chain_test_harness.ts +27 -13
- package/src/shared/gas_portal_test_harness.ts +21 -11
- package/src/shared/jest_setup.ts +36 -1
- package/src/shared/submit-transactions.ts +1 -4
- package/src/shared/uniswap_l1_l2.ts +77 -50
- package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
- package/src/simulators/lending_simulator.ts +32 -14
- package/src/simulators/token_simulator.ts +6 -2
- package/src/spartan/setup_test_wallets.ts +91 -37
- package/src/spartan/tx_metrics.ts +82 -24
- package/src/spartan/utils/config.ts +1 -0
- package/src/spartan/utils/index.ts +3 -0
- package/src/spartan/utils/nodes.ts +2 -2
- package/src/spartan/utils/pod_logs.ts +99 -0
- package/src/test-wallet/test_wallet.ts +174 -104
- package/src/test-wallet/utils.ts +3 -7
- package/src/test-wallet/wallet_worker_script.ts +2 -2
- package/src/test-wallet/worker_wallet.ts +9 -4
- package/src/test-wallet/worker_wallet_schema.ts +2 -2
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
-
import {
|
|
2
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
3
3
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
4
4
|
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
5
5
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
6
6
|
import { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
7
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
8
|
+
import { waitForL1ToL2MessageReady } from '@aztec/aztec.js/messaging';
|
|
8
9
|
import { createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
|
|
9
10
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
10
11
|
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
11
|
-
import { retryUntil } from '@aztec/foundation/retry';
|
|
12
|
+
import { makeBackoff, retry, retryUntil } from '@aztec/foundation/retry';
|
|
12
13
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
13
14
|
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
14
15
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
@@ -47,7 +48,7 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
|
|
|
47
48
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
48
49
|
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
49
50
|
await recipientDeployMethod.send({
|
|
50
|
-
from:
|
|
51
|
+
from: NO_FROM,
|
|
51
52
|
fee: {
|
|
52
53
|
paymentMethod
|
|
53
54
|
},
|
|
@@ -58,7 +59,7 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
|
|
|
58
59
|
await Promise.all(fundedAccounts.map(async (a)=>{
|
|
59
60
|
const deployMethod = await a.getDeployMethod();
|
|
60
61
|
await deployMethod.send({
|
|
61
|
-
from:
|
|
62
|
+
from: NO_FROM,
|
|
62
63
|
fee: {
|
|
63
64
|
paymentMethod
|
|
64
65
|
},
|
|
@@ -82,52 +83,84 @@ export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, m
|
|
|
82
83
|
recipientAddress: recipientAccount.address
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
|
-
async function deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, accountLabel) {
|
|
86
|
+
async function deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, accountLabel, estimateGas) {
|
|
86
87
|
const deployMethod = await account.getDeployMethod();
|
|
87
|
-
let
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
from:
|
|
88
|
+
let gasSettings;
|
|
89
|
+
if (estimateGas) {
|
|
90
|
+
const sim = await deployMethod.simulate({
|
|
91
|
+
from: NO_FROM,
|
|
91
92
|
fee: {
|
|
92
93
|
paymentMethod
|
|
93
|
-
}
|
|
94
|
-
wait: NO_WAIT
|
|
95
|
-
});
|
|
96
|
-
await waitForTx(aztecNode, txHash, {
|
|
97
|
-
timeout: 2400
|
|
94
|
+
}
|
|
98
95
|
});
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
96
|
+
gasSettings = sim.estimatedGas;
|
|
97
|
+
logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`);
|
|
98
|
+
}
|
|
99
|
+
// Track the tx hash across retries so we don't re-send when the previous tx is still pending.
|
|
100
|
+
let sentTxHash;
|
|
101
|
+
await retry(async ()=>{
|
|
102
|
+
// Check if already deployed (handles case where previous attempt succeeded but waitForTx timed out)
|
|
103
|
+
const existing = await aztecNode.getContract(account.address);
|
|
104
|
+
if (existing) {
|
|
105
|
+
logger.info(`${accountLabel} already deployed at ${account.address}, skipping`);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// If we already sent a tx, check if it was dropped before deciding to re-send.
|
|
109
|
+
if (sentTxHash) {
|
|
110
|
+
const prevReceipt = await aztecNode.getTxReceipt(sentTxHash.txHash);
|
|
111
|
+
if (prevReceipt.isDropped()) {
|
|
112
|
+
logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} was dropped, re-sending`);
|
|
113
|
+
sentTxHash = undefined;
|
|
114
|
+
} else {
|
|
115
|
+
logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} still pending, waiting again...`);
|
|
116
|
+
}
|
|
107
117
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
118
|
+
if (!sentTxHash) {
|
|
119
|
+
const deployResult = await deployMethod.send({
|
|
120
|
+
from: NO_FROM,
|
|
121
|
+
fee: {
|
|
122
|
+
paymentMethod,
|
|
123
|
+
gasSettings
|
|
124
|
+
},
|
|
125
|
+
wait: NO_WAIT
|
|
126
|
+
});
|
|
127
|
+
sentTxHash = {
|
|
128
|
+
txHash: deployResult.txHash
|
|
129
|
+
};
|
|
130
|
+
logger.info(`${accountLabel} tx sent`, {
|
|
131
|
+
txHash: sentTxHash.txHash.toString()
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const receipt = await waitForTx(aztecNode, sentTxHash.txHash, {
|
|
135
|
+
timeout: 600
|
|
113
136
|
});
|
|
114
|
-
|
|
115
|
-
|
|
137
|
+
if (receipt.isDropped()) {
|
|
138
|
+
sentTxHash = undefined;
|
|
139
|
+
throw new Error(`${accountLabel} tx was dropped, retrying...`);
|
|
140
|
+
}
|
|
141
|
+
logger.info(`${accountLabel} deployed at ${account.address}`);
|
|
142
|
+
}, `deploy ${accountLabel}`, makeBackoff([
|
|
143
|
+
1,
|
|
144
|
+
2,
|
|
145
|
+
4,
|
|
146
|
+
8,
|
|
147
|
+
16
|
|
148
|
+
]), logger);
|
|
116
149
|
}
|
|
117
|
-
async function deployAccountsInBatches(accounts, paymentMethod, aztecNode, logger, labelPrefix, batchSize = 2) {
|
|
150
|
+
async function deployAccountsInBatches(accounts, paymentMethod, aztecNode, logger, labelPrefix, batchSize = 2, estimateGas) {
|
|
118
151
|
for(let i = 0; i < accounts.length; i += batchSize){
|
|
119
152
|
const batch = accounts.slice(i, i + batchSize);
|
|
120
|
-
await Promise.all(batch.map((account, idx)=>deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}
|
|
153
|
+
await Promise.all(batch.map((account, idx)=>deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`, estimateGas)));
|
|
121
154
|
}
|
|
122
155
|
}
|
|
123
|
-
export async function deploySponsoredTestAccounts(wallet, aztecNode, logger, numberOfFundedWallets = 1) {
|
|
156
|
+
export async function deploySponsoredTestAccounts(wallet, aztecNode, logger, numberOfFundedWallets = 1, opts) {
|
|
124
157
|
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
125
158
|
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
126
159
|
const fundedAccounts = await Promise.all(funded.map((a)=>wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
127
160
|
await registerSponsoredFPC(wallet);
|
|
128
161
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
129
|
-
await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account');
|
|
130
|
-
await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2);
|
|
162
|
+
await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account', opts?.estimateGas);
|
|
163
|
+
await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2, opts?.estimateGas);
|
|
131
164
|
return {
|
|
132
165
|
aztecNode,
|
|
133
166
|
wallet,
|
|
@@ -150,7 +183,7 @@ export async function deployTestAccountsWithTokens(nodeUrl, l1RpcUrls, mnemonicO
|
|
|
150
183
|
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
151
184
|
const deployMethod = await a.getDeployMethod();
|
|
152
185
|
await deployMethod.send({
|
|
153
|
-
from:
|
|
186
|
+
from: NO_FROM,
|
|
154
187
|
fee: {
|
|
155
188
|
paymentMethod
|
|
156
189
|
}
|
|
@@ -177,8 +210,9 @@ async function bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, reci
|
|
|
177
210
|
const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
|
|
178
211
|
const portal = await L1FeeJuicePortalManager.new(aztecNode, l1Client, log);
|
|
179
212
|
const claim = await portal.bridgeTokensPublic(recipient, amount, true);
|
|
180
|
-
|
|
181
|
-
|
|
213
|
+
await waitForL1ToL2MessageReady(aztecNode, Fr.fromHexString(claim.messageHash), {
|
|
214
|
+
timeoutSeconds: 24
|
|
215
|
+
});
|
|
182
216
|
log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
|
|
183
217
|
return claim;
|
|
184
218
|
}
|
|
@@ -206,8 +240,7 @@ async function deployTokenAndMint(wallet, accounts, admin, mintAmount, paymentMe
|
|
|
206
240
|
paymentMethod
|
|
207
241
|
},
|
|
208
242
|
wait: {
|
|
209
|
-
timeout: 600
|
|
210
|
-
returnReceipt: true
|
|
243
|
+
timeout: 600
|
|
211
244
|
}
|
|
212
245
|
});
|
|
213
246
|
const tokenAddress = tokenContract.address;
|
|
@@ -38,9 +38,12 @@ export declare class ProvingMetrics {
|
|
|
38
38
|
}
|
|
39
39
|
export type TxInclusionData = {
|
|
40
40
|
txHash: string;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
/** Wall-clock at client when the tx was submitted, in ms (Date.now()). */
|
|
42
|
+
sentAtMs: number;
|
|
43
|
+
/** Wall-clock at client when the block containing the tx first became visible, in ms (Date.now()). -1 if never observed. */
|
|
44
|
+
minedAtMs: number;
|
|
45
|
+
/** Reserved for future attestation-observed-at signal; -1 today. */
|
|
46
|
+
attestedAtMs: number;
|
|
44
47
|
blocknumber: number;
|
|
45
48
|
priorityFee: number;
|
|
46
49
|
totalFee: number;
|
|
@@ -61,7 +64,18 @@ export declare class TxInclusionMetrics {
|
|
|
61
64
|
private mempoolMinedDelay;
|
|
62
65
|
constructor(aztecNode: AztecNode, logger?: Logger | undefined);
|
|
63
66
|
recordSentTx(tx: Tx, group: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Stamp mined-at metadata for any tracked tx contained in this block, using
|
|
69
|
+
* `observedAtMs` (caller-supplied wall-clock at the moment they first saw the
|
|
70
|
+
* block). Idempotent: existing minedAtMs is preserved so the first observer
|
|
71
|
+
* wins (typically the block-watcher; recordMinedTx is a fallback).
|
|
72
|
+
*/
|
|
73
|
+
observeBlockForMinedTxs(blockNumber: number, txHashes: ReadonlyArray<{
|
|
74
|
+
toString(): string;
|
|
75
|
+
}>, observedAtMs: number): void;
|
|
64
76
|
recordMinedTx(txReceipt: TxReceipt): Promise<void>;
|
|
77
|
+
/** Per-tx inclusion records for a group. Used to serialise out for downstream tooling. */
|
|
78
|
+
getInclusionRecords(group?: string): TxInclusionData[];
|
|
65
79
|
inclusionTimeInSeconds(group: string): {
|
|
66
80
|
count: number;
|
|
67
81
|
group: string;
|
|
@@ -85,4 +99,4 @@ export declare class TxInclusionMetrics {
|
|
|
85
99
|
extra?: string;
|
|
86
100
|
}>;
|
|
87
101
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJdEQsb0RBQW9EO0FBQ3BELHFCQUFhLGNBQWM7SUFjYixPQUFPLENBQUMsTUFBTTtJQWIxQixPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFxQjtJQUMxQyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFxQjtJQUN2QyxPQUFPLENBQUMsV0FBVyxDQUFxQjtJQUN4QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsWUFBWSxDQUFxQjtJQUN6QyxPQUFPLENBQUMsb0JBQW9CLENBQXFCO0lBQ2pELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBcUI7SUFDL0MsT0FBTyxDQUFDLFlBQVksQ0FBcUI7SUFFekMsWUFBb0IsTUFBTSxFQUFFLE1BQU0sRUFBSTtJQUV0QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdkM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFekM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FFdEM7SUFFRCxrQkFBa0IsQ0FBQyxFQUFF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAItD,oDAAoD;AACpD,qBAAa,cAAc;IAcb,OAAO,CAAC,MAAM;IAb1B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAoB,MAAM,EAAE,MAAM,EAAI;IAEtC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvC;IAED,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpC;IAED,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAElC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;IAED,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5C;IAED,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,2BAA2B,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CA0DlF;CACF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"tx_metrics.d.ts","sourceRoot":"","sources":["../../src/spartan/tx_metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -180,9 +180,9 @@ export class TxInclusionMetrics {
|
|
|
180
180
|
}
|
|
181
181
|
this.data.set(txHash, {
|
|
182
182
|
txHash,
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
sentAtMs: Date.now(),
|
|
184
|
+
minedAtMs: -1,
|
|
185
|
+
attestedAtMs: -1,
|
|
186
186
|
blocknumber: -1,
|
|
187
187
|
priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
|
|
188
188
|
totalFee: -1,
|
|
@@ -191,6 +191,22 @@ export class TxInclusionMetrics {
|
|
|
191
191
|
});
|
|
192
192
|
this.groups.add(group);
|
|
193
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Stamp mined-at metadata for any tracked tx contained in this block, using
|
|
196
|
+
* `observedAtMs` (caller-supplied wall-clock at the moment they first saw the
|
|
197
|
+
* block). Idempotent: existing minedAtMs is preserved so the first observer
|
|
198
|
+
* wins (typically the block-watcher; recordMinedTx is a fallback).
|
|
199
|
+
*/ observeBlockForMinedTxs(blockNumber, txHashes, observedAtMs) {
|
|
200
|
+
txHashes.forEach((txHash, position)=>{
|
|
201
|
+
const data = this.data.get(txHash.toString());
|
|
202
|
+
if (!data || data.minedAtMs !== -1) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
data.blocknumber = blockNumber;
|
|
206
|
+
data.minedAtMs = observedAtMs;
|
|
207
|
+
data.positionInBlock = position;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
194
210
|
async recordMinedTx(txReceipt) {
|
|
195
211
|
const { txHash, blockNumber } = txReceipt;
|
|
196
212
|
if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
|
|
@@ -201,17 +217,6 @@ export class TxInclusionMetrics {
|
|
|
201
217
|
});
|
|
202
218
|
return;
|
|
203
219
|
}
|
|
204
|
-
if (!this.blocks.has(blockNumber)) {
|
|
205
|
-
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
|
|
206
|
-
}
|
|
207
|
-
const block = await this.blocks.get(blockNumber);
|
|
208
|
-
if (!block) {
|
|
209
|
-
this.logger?.warn('Failed to load block for mined tx receipt', {
|
|
210
|
-
txHash: txHash.toString(),
|
|
211
|
-
blockNumber
|
|
212
|
-
});
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
220
|
const data = this.data.get(txHash.toString());
|
|
216
221
|
if (!data) {
|
|
217
222
|
const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
|
|
@@ -221,19 +226,67 @@ export class TxInclusionMetrics {
|
|
|
221
226
|
});
|
|
222
227
|
throw new Error(message);
|
|
223
228
|
}
|
|
224
|
-
data.blocknumber = blockNumber;
|
|
225
|
-
data.minedAt = Number(block.header.globalVariables.timestamp);
|
|
226
|
-
data.attestedAt = -1;
|
|
227
229
|
data.totalFee = Number(txReceipt.transactionFee ?? 0n);
|
|
228
|
-
|
|
230
|
+
// Fallback path for txs the block-watcher missed (e.g. observed only after
|
|
231
|
+
// the watcher stopped). Stamp with the block's L2 slot timestamp; this is
|
|
232
|
+
// earlier than the true client-observed time by attestation+propagation
|
|
233
|
+
// lag, but it's the only deterministic timestamp available post-hoc.
|
|
234
|
+
if (data.minedAtMs === -1) {
|
|
235
|
+
if (!this.blocks.has(blockNumber)) {
|
|
236
|
+
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber, {
|
|
237
|
+
includeTransactions: true
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
const block = await this.blocks.get(blockNumber);
|
|
241
|
+
if (!block) {
|
|
242
|
+
this.logger?.warn('Failed to load block for mined tx receipt', {
|
|
243
|
+
txHash: txHash.toString(),
|
|
244
|
+
blockNumber
|
|
245
|
+
});
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
data.blocknumber = blockNumber;
|
|
249
|
+
data.minedAtMs = Number(block.header.globalVariables.timestamp) * 1000;
|
|
250
|
+
data.positionInBlock = block.body.txEffects.findIndex((txEffect)=>txEffect.txHash.equals(txHash));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/** Per-tx inclusion records for a group. Used to serialise out for downstream tooling. */ getInclusionRecords(group) {
|
|
254
|
+
const out = [];
|
|
255
|
+
for (const tx of this.data.values()){
|
|
256
|
+
if (group !== undefined && tx.group !== group) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
out.push({
|
|
260
|
+
...tx
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
229
264
|
}
|
|
230
265
|
inclusionTimeInSeconds(group) {
|
|
231
266
|
const histogram = createHistogram({});
|
|
267
|
+
let nonPositive = 0;
|
|
232
268
|
for (const tx of this.data.values()){
|
|
233
|
-
if (!tx.blocknumber || tx.group !== group || tx.
|
|
269
|
+
if (!tx.blocknumber || tx.group !== group || tx.minedAtMs === -1) {
|
|
234
270
|
continue;
|
|
235
271
|
}
|
|
236
|
-
|
|
272
|
+
// Both timestamps are client wall-clock (ms). A negative delta should be
|
|
273
|
+
// impossible since the watcher stamps minedAtMs strictly after sentAtMs,
|
|
274
|
+
// but the fallback path (recordMinedTx via L2 slot timestamp) can stamp
|
|
275
|
+
// earlier than sentAtMs. perf_hooks.createHistogram rejects <=0; skip
|
|
276
|
+
// those instead of crashing.
|
|
277
|
+
const deltaMs = tx.minedAtMs - tx.sentAtMs;
|
|
278
|
+
if (deltaMs <= 0) {
|
|
279
|
+
nonPositive++;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Histogram is recorded in seconds (rounded) to match the existing
|
|
283
|
+
// toGithubActionBenchmarkJSON output unit; per-tx records carry the raw ms.
|
|
284
|
+
histogram.record(Math.max(1, Math.round(deltaMs / 1000)));
|
|
285
|
+
}
|
|
286
|
+
if (nonPositive > 0) {
|
|
287
|
+
this.logger?.debug(`Dropped ${nonPositive} tx inclusion samples with non-positive delta`, {
|
|
288
|
+
group
|
|
289
|
+
});
|
|
237
290
|
}
|
|
238
291
|
if (histogram.count === 0) {
|
|
239
292
|
return {
|
|
@@ -306,7 +359,7 @@ export class TxInclusionMetrics {
|
|
|
306
359
|
unit: 's',
|
|
307
360
|
value: stats.mean
|
|
308
361
|
}, {
|
|
309
|
-
name: `${group}/
|
|
362
|
+
name: `${group}/p50_inclusion`,
|
|
310
363
|
unit: 's',
|
|
311
364
|
value: stats.median
|
|
312
365
|
}, {
|
|
@@ -1,42 +1,19 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
declare const testConfigSchema: z.ZodObject<{
|
|
3
3
|
NAMESPACE: z.ZodDefault<z.ZodString>;
|
|
4
|
-
REAL_VERIFIER: z.ZodDefault<z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.
|
|
5
|
-
|
|
4
|
+
REAL_VERIFIER: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodNumber & z.ZodType<0 | 1, number, z.core.$ZodTypeInternals<0 | 1, number>>, z.ZodTransform<boolean, 0 | 1>>, z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<boolean, string>>]>>>;
|
|
5
|
+
DEBUG_FORCE_TX_PROOF_VERIFICATION: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodNumber & z.ZodType<0 | 1, number, z.core.$ZodTypeInternals<0 | 1, number>>, z.ZodTransform<boolean, 0 | 1>>, z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<boolean, string>>]>>>;
|
|
6
|
+
CREATE_ETH_DEVNET: z.ZodDefault<z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodPipe<z.ZodNumber & z.ZodType<0 | 1, number, z.core.$ZodTypeInternals<0 | 1, number>>, z.ZodTransform<boolean, 0 | 1>>, z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<boolean, string>>]>>>;
|
|
6
7
|
L1_RPC_URLS_JSON: z.ZodOptional<z.ZodString>;
|
|
7
8
|
L1_ACCOUNT_MNEMONIC: z.ZodOptional<z.ZodString>;
|
|
8
|
-
AZTEC_SLOT_DURATION: z.ZodDefault<z.ZodOptional<z.
|
|
9
|
-
AZTEC_EPOCH_DURATION: z.ZodDefault<z.ZodOptional<z.
|
|
10
|
-
AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodDefault<z.ZodOptional<z.
|
|
11
|
-
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: z.ZodDefault<z.ZodOptional<z.
|
|
9
|
+
AZTEC_SLOT_DURATION: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
10
|
+
AZTEC_EPOCH_DURATION: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
11
|
+
AZTEC_PROOF_SUBMISSION_WINDOW: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
12
|
+
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
12
13
|
FUNDING_PRIVATE_KEY: z.ZodOptional<z.ZodString>;
|
|
13
14
|
AZTEC_ADMIN_API_KEY: z.ZodOptional<z.ZodString>;
|
|
14
|
-
},
|
|
15
|
-
NAMESPACE: string;
|
|
16
|
-
REAL_VERIFIER: boolean;
|
|
17
|
-
CREATE_ETH_DEVNET: boolean;
|
|
18
|
-
L1_RPC_URLS_JSON?: string | undefined;
|
|
19
|
-
L1_ACCOUNT_MNEMONIC?: string | undefined;
|
|
20
|
-
AZTEC_SLOT_DURATION: number;
|
|
21
|
-
AZTEC_EPOCH_DURATION: number;
|
|
22
|
-
AZTEC_PROOF_SUBMISSION_WINDOW: number;
|
|
23
|
-
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: number;
|
|
24
|
-
FUNDING_PRIVATE_KEY?: string | undefined;
|
|
25
|
-
AZTEC_ADMIN_API_KEY?: string | undefined;
|
|
26
|
-
}, {
|
|
27
|
-
NAMESPACE?: string | undefined;
|
|
28
|
-
REAL_VERIFIER?: string | number | boolean | undefined;
|
|
29
|
-
CREATE_ETH_DEVNET?: string | number | boolean | undefined;
|
|
30
|
-
L1_RPC_URLS_JSON?: string | undefined;
|
|
31
|
-
L1_ACCOUNT_MNEMONIC?: string | undefined;
|
|
32
|
-
AZTEC_SLOT_DURATION?: number | undefined;
|
|
33
|
-
AZTEC_EPOCH_DURATION?: number | undefined;
|
|
34
|
-
AZTEC_PROOF_SUBMISSION_WINDOW?: number | undefined;
|
|
35
|
-
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET?: number | undefined;
|
|
36
|
-
FUNDING_PRIVATE_KEY?: string | undefined;
|
|
37
|
-
AZTEC_ADMIN_API_KEY?: string | undefined;
|
|
38
|
-
}>;
|
|
15
|
+
}, z.core.$strip>;
|
|
39
16
|
export type TestConfig = z.infer<typeof testConfigSchema>;
|
|
40
17
|
export declare function setupEnvironment(env: unknown): TestConfig;
|
|
41
18
|
export {};
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3BhcnRhbi91dGlscy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUl4QixRQUFBLE1BQU0sZ0JBQWdCOzs7Ozs7Ozs7Ozs7O2lCQWFwQixDQUFDO0FBRUgsTUFBTSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztBQUUxRCx3QkFBZ0IsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxVQUFVLENBSXpEIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;iBAapB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAIzD"}
|
|
@@ -5,6 +5,7 @@ const logger = createLogger('e2e:k8s-utils');
|
|
|
5
5
|
const testConfigSchema = z.object({
|
|
6
6
|
NAMESPACE: z.string().default('scenario'),
|
|
7
7
|
REAL_VERIFIER: schemas.Boolean.optional().default(true),
|
|
8
|
+
DEBUG_FORCE_TX_PROOF_VERIFICATION: schemas.Boolean.optional().default(true),
|
|
8
9
|
CREATE_ETH_DEVNET: schemas.Boolean.optional().default(false),
|
|
9
10
|
L1_RPC_URLS_JSON: z.string().optional(),
|
|
10
11
|
L1_ACCOUNT_MNEMONIC: z.string().optional(),
|
|
@@ -7,4 +7,5 @@ export { restartBot, installTransferBot, uninstallTransferBot } from './bot.js';
|
|
|
7
7
|
export { awaitCheckpointNumber, waitForProvenToAdvance, getSequencers, updateSequencersConfig, getSequencersConfig, withSequencersAdmin, setValidatorTxDrop, restartValidators, enableValidatorDynamicBootNode, rollAztecPods, } from './nodes.js';
|
|
8
8
|
export { getPublicViemClient, getL1DeploymentAddresses, getNodeClient } from './clients.js';
|
|
9
9
|
export { ChainHealth, type ChainHealthSnapshot } from './health.js';
|
|
10
|
-
|
|
10
|
+
export { type BlockBuiltLogEntry, fetchBlockBuiltLogs } from './pod_logs.js';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zcGFydGFuL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdoRSxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdoSCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCxLQUFLLGVBQWUsRUFDcEIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsbUNBQW1DLEVBQ25DLGlCQUFpQixHQUNsQixNQUFNLFVBQVUsQ0FBQztBQUdsQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixtQkFBbUIsR0FDcEIsTUFBTSxZQUFZLENBQUM7QUFHcEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHaEYsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUdwQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdwRSxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,8BAA8B,EAC9B,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,KAAK,eAAe,EACpB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mCAAmC,EACnC,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,EAC9B,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,8BAA8B,EAC9B,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,KAAK,eAAe,EACpB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mCAAmC,EACnC,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,EAC9B,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,KAAK,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -18,3 +18,5 @@ export { awaitCheckpointNumber, waitForProvenToAdvance, getSequencers, updateSeq
|
|
|
18
18
|
export { getPublicViemClient, getL1DeploymentAddresses, getNodeClient } from './clients.js';
|
|
19
19
|
// Health checks
|
|
20
20
|
export { ChainHealth } from './health.js';
|
|
21
|
+
// Pod log extraction
|
|
22
|
+
export { fetchBlockBuiltLogs } from './pod_logs.js';
|
|
@@ -37,7 +37,7 @@ export async function awaitCheckpointNumber(rollupCheatCodes, checkpointNumber,
|
|
|
37
37
|
// Get current proven block number
|
|
38
38
|
let initialProvenBlock;
|
|
39
39
|
try {
|
|
40
|
-
const tips = await node.
|
|
40
|
+
const tips = await node.getChainTips();
|
|
41
41
|
initialProvenBlock = Number(tips.proven.block.number);
|
|
42
42
|
log.info(`Current proven block: ${initialProvenBlock}. Waiting for it to increase...`);
|
|
43
43
|
} catch (err) {
|
|
@@ -46,7 +46,7 @@ export async function awaitCheckpointNumber(rollupCheatCodes, checkpointNumber,
|
|
|
46
46
|
}
|
|
47
47
|
await retryUntil(async ()=>{
|
|
48
48
|
try {
|
|
49
|
-
const tips = await node.
|
|
49
|
+
const tips = await node.getChainTips();
|
|
50
50
|
const currentProvenBlock = Number(tips.proven.block.number);
|
|
51
51
|
const proposedBlock = Number(tips.proposed.number);
|
|
52
52
|
log.verbose(`Chain state: proposed=${proposedBlock}, proven=${currentProvenBlock} (waiting for > ${initialProvenBlock})`);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
2
|
+
/** Parsed l2-block-built stats from a sequencer pod log line. */
|
|
3
|
+
export type BlockBuiltLogEntry = {
|
|
4
|
+
blockNumber: number;
|
|
5
|
+
txCount: number;
|
|
6
|
+
duration: number;
|
|
7
|
+
publicProcessDuration: number;
|
|
8
|
+
manaPerSec: number;
|
|
9
|
+
privateLogCount: number;
|
|
10
|
+
publicLogCount: number;
|
|
11
|
+
contractClassLogCount: number;
|
|
12
|
+
contractClassLogSize: number;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Fetches l2-block-built log entries from sequencer pods for given block numbers.
|
|
16
|
+
* Queries all validator pods (only the proposer will have the log for a given block).
|
|
17
|
+
*
|
|
18
|
+
* @param namespace - Kubernetes namespace
|
|
19
|
+
* @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
|
|
20
|
+
* @param blockNumbers - Set of block numbers to filter for
|
|
21
|
+
* @param logger - Logger instance
|
|
22
|
+
* @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
|
|
23
|
+
*/
|
|
24
|
+
export declare function fetchBlockBuiltLogs(namespace: string, sinceTime: string, blockNumbers: Set<number>, logger: Logger): Promise<BlockBuiltLogEntry[]>;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9kX2xvZ3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zcGFydGFuL3V0aWxzL3BvZF9sb2dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBU3BELGlFQUFpRTtBQUNqRSxNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0lBQzlCLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsZUFBZSxFQUFFLE1BQU0sQ0FBQztJQUN4QixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7Q0FDOUIsQ0FBQztBQWNGOzs7Ozs7Ozs7R0FTRztBQUNILHdCQUFzQixtQkFBbUIsQ0FDdkMsU0FBUyxFQUFFLE1BQU0sRUFDakIsU0FBUyxFQUFFLE1BQU0sRUFDakIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDekIsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQWlEL0IifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod_logs.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/pod_logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AASpD,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAcF;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiD/B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { getSequencers } from './nodes.js';
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
const FIELDS = [
|
|
6
|
+
'blockNumber',
|
|
7
|
+
'txCount',
|
|
8
|
+
'duration',
|
|
9
|
+
'publicProcessDuration',
|
|
10
|
+
'manaPerSec',
|
|
11
|
+
'privateLogCount',
|
|
12
|
+
'publicLogCount',
|
|
13
|
+
'contractClassLogCount',
|
|
14
|
+
'contractClassLogSize'
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Fetches l2-block-built log entries from sequencer pods for given block numbers.
|
|
18
|
+
* Queries all validator pods (only the proposer will have the log for a given block).
|
|
19
|
+
*
|
|
20
|
+
* @param namespace - Kubernetes namespace
|
|
21
|
+
* @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
|
|
22
|
+
* @param blockNumbers - Set of block numbers to filter for
|
|
23
|
+
* @param logger - Logger instance
|
|
24
|
+
* @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
|
|
25
|
+
*/ export async function fetchBlockBuiltLogs(namespace, sinceTime, blockNumbers, logger) {
|
|
26
|
+
const pods = await getSequencers(namespace);
|
|
27
|
+
const entriesByBlock = new Map();
|
|
28
|
+
// Subtract 60s from sinceTime to account for clock skew between test runner and k8s pods.
|
|
29
|
+
// Block number filtering ensures we only match the right blocks, so extra lines are harmless.
|
|
30
|
+
const sinceDate = new Date(new Date(sinceTime).getTime() - 60_000);
|
|
31
|
+
const sinceFlag = sinceDate.toISOString();
|
|
32
|
+
for (const pod of pods){
|
|
33
|
+
try {
|
|
34
|
+
const cmd = `kubectl logs ${pod} -n ${namespace} -c aztec --since-time=${sinceFlag}`;
|
|
35
|
+
logger.info(`Fetching logs: ${cmd}`);
|
|
36
|
+
const { stdout } = await execAsync(cmd, {
|
|
37
|
+
maxBuffer: 10 * 1024 * 1024
|
|
38
|
+
});
|
|
39
|
+
const lines = stdout.split('\n');
|
|
40
|
+
const matchingLines = lines.filter((l)=>l.includes('l2-block-built'));
|
|
41
|
+
logger.info(`Pod ${pod}: ${lines.length} log lines, ${matchingLines.length} contain l2-block-built`);
|
|
42
|
+
for (const line of matchingLines){
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(line);
|
|
45
|
+
if (parsed.eventName !== 'l2-block-built' || !blockNumbers.has(parsed.blockNumber)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (entriesByBlock.has(parsed.blockNumber)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const entry = {};
|
|
52
|
+
for (const field of FIELDS){
|
|
53
|
+
entry[field] = parsed[field] ?? 0;
|
|
54
|
+
}
|
|
55
|
+
entriesByBlock.set(entry.blockNumber, entry);
|
|
56
|
+
logger.verbose(`Parsed l2-block-built log for block ${entry.blockNumber}`, entry);
|
|
57
|
+
} catch {
|
|
58
|
+
// Not valid JSON, skip
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
} catch (err) {
|
|
62
|
+
logger.warn(`Failed to fetch logs from pod ${pod}: ${err}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (entriesByBlock.size < blockNumbers.size) {
|
|
66
|
+
const missing = [
|
|
67
|
+
...blockNumbers
|
|
68
|
+
].filter((bn)=>!entriesByBlock.has(bn));
|
|
69
|
+
logger.warn(`Missing l2-block-built logs for block(s): ${missing.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
return [
|
|
72
|
+
...entriesByBlock.values()
|
|
73
|
+
].sort((a, b)=>a.blockNumber - b.blockNumber);
|
|
74
|
+
}
|