@aztec/end-to-end 3.0.0-canary.a9708bd → 3.0.0-devnet.20251212
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/benchmark.d.ts +4 -3
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +25 -14
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +111 -90
- package/dest/bench/client_flows/config.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +8 -30
- package/dest/bench/utils.d.ts +4 -13
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +10 -34
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +8 -8
- 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 +42 -42
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +12 -9
- 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 +35 -35
- package/dest/e2e_deploy_contract/deploy_test.d.ts +12 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +9 -18
- package/dest/e2e_epochs/epochs_test.d.ts +19 -12
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +30 -22
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +14 -11
- package/dest/e2e_fees/fees_test.d.ts +10 -8
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +35 -38
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +9 -8
- package/dest/e2e_multi_validator/utils.d.ts +2 -2
- package/dest/e2e_multi_validator/utils.d.ts.map +1 -1
- package/dest/e2e_multi_validator/utils.js +4 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -4
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +11 -12
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
- package/dest/e2e_p2p/inactivity_slash_test.js +139 -0
- package/dest/e2e_p2p/p2p_network.d.ts +238 -17
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +46 -19
- package/dest/e2e_p2p/shared.d.ts +16 -17
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +56 -55
- package/dest/e2e_token_contract/token_contract_test.d.ts +6 -5
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +14 -17
- package/dest/fixtures/e2e_prover_test.d.ts +12 -8
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +53 -58
- package/dest/fixtures/fixtures.d.ts +1 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +1 -1
- package/dest/fixtures/get_acvm_config.d.ts +2 -2
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +2 -2
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +2 -2
- package/dest/fixtures/index.d.ts +1 -1
- package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/logging.d.ts +1 -1
- package/dest/fixtures/setup_l1_contracts.d.ts +476 -5
- package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
- package/dest/fixtures/setup_l1_contracts.js +3 -3
- package/dest/fixtures/setup_p2p_test.d.ts +12 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +50 -24
- package/dest/fixtures/snapshot_manager.d.ts +13 -10
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +66 -51
- package/dest/fixtures/token_utils.d.ts +10 -5
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +17 -18
- package/dest/fixtures/utils.d.ts +479 -35
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +106 -125
- package/dest/fixtures/web3signer.d.ts +5 -0
- package/dest/fixtures/web3signer.d.ts.map +1 -0
- package/dest/fixtures/web3signer.js +53 -0
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/quality_of_service/alert_checker.d.ts +2 -2
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +20 -23
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -16
- package/dest/shared/gas_portal_test_harness.d.ts +10 -17
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +11 -8
- package/dest/shared/index.d.ts +1 -1
- package/dest/shared/jest_setup.d.ts +1 -1
- package/dest/shared/jest_setup.js +1 -1
- package/dest/shared/submit-transactions.d.ts +6 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +8 -7
- package/dest/shared/uniswap_l1_l2.d.ts +12 -8
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +44 -58
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +4 -7
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +8 -5
- package/dest/simulators/token_simulator.d.ts +4 -2
- 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 +22 -14
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +144 -86
- package/dest/spartan/tx_metrics.d.ts +39 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +95 -0
- package/dest/spartan/utils.d.ts +92 -17
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +386 -63
- package/package.json +43 -40
- package/src/bench/client_flows/benchmark.ts +8 -8
- package/src/bench/client_flows/client_flows_benchmark.ts +141 -114
- package/src/bench/client_flows/data_extractor.ts +9 -31
- package/src/bench/utils.ts +9 -37
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +46 -63
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +38 -51
- package/src/e2e_deploy_contract/deploy_test.ts +18 -36
- package/src/e2e_epochs/epochs_test.ts +41 -35
- package/src/e2e_fees/bridging_race.notest.ts +16 -11
- package/src/e2e_fees/fees_test.ts +42 -47
- package/src/e2e_l1_publisher/write_json.ts +12 -9
- package/src/e2e_multi_validator/utils.ts +5 -11
- package/src/e2e_nested_contract/nested_contract_test.ts +15 -13
- package/src/e2e_p2p/inactivity_slash_test.ts +184 -0
- package/src/e2e_p2p/p2p_network.ts +124 -82
- package/src/e2e_p2p/shared.ts +66 -58
- package/src/e2e_token_contract/token_contract_test.ts +17 -17
- package/src/fixtures/e2e_prover_test.ts +60 -97
- package/src/fixtures/fixtures.ts +1 -2
- package/src/fixtures/get_acvm_config.ts +2 -2
- package/src/fixtures/get_bb_config.ts +3 -2
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup_l1_contracts.ts +5 -4
- package/src/fixtures/setup_p2p_test.ts +79 -32
- package/src/fixtures/snapshot_manager.ts +87 -82
- package/src/fixtures/token_utils.ts +16 -24
- package/src/fixtures/utils.ts +142 -172
- package/src/fixtures/web3signer.ts +63 -0
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/guides/up_quick_start.sh +3 -11
- package/src/quality_of_service/alert_checker.ts +1 -1
- package/src/shared/cross_chain_test_harness.ts +23 -31
- package/src/shared/gas_portal_test_harness.ts +14 -21
- package/src/shared/jest_setup.ts +1 -1
- package/src/shared/submit-transactions.ts +12 -8
- package/src/shared/uniswap_l1_l2.ts +77 -86
- package/src/simulators/lending_simulator.ts +9 -6
- package/src/simulators/token_simulator.ts +5 -2
- package/src/spartan/DEVELOP.md +15 -3
- package/src/spartan/setup_test_wallets.ts +171 -127
- package/src/spartan/tx_metrics.ts +130 -0
- package/src/spartan/utils.ts +463 -64
|
@@ -1,116 +1,164 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
4
|
+
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
5
|
+
import { SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
6
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
7
|
+
import { createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
8
|
+
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
9
|
+
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
10
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
5
11
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
6
|
-
import {
|
|
12
|
+
import { TestWallet, proveInteraction, registerInitialLocalNetworkAccountsInWallet } from '@aztec/test-wallet/server';
|
|
7
13
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
8
14
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
9
15
|
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
10
16
|
const TOKEN_NAME = 'USDC';
|
|
11
17
|
const TOKEN_SYMBOL = 'USD';
|
|
12
18
|
const TOKEN_DECIMALS = 18n;
|
|
13
|
-
export async function
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
19
|
+
export async function setupTestAccountsWithTokens(nodeUrl, mintAmount, logger) {
|
|
20
|
+
const ACCOUNT_COUNT = 1; // TODO fix this to allow for 16 wallets again
|
|
21
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
22
|
+
const wallet = await TestWallet.create(aztecNode);
|
|
23
|
+
const [recipientAccount, ...accounts] = (await registerInitialLocalNetworkAccountsInWallet(wallet)).slice(0, ACCOUNT_COUNT + 1);
|
|
24
|
+
const tokenAdmin = accounts[0];
|
|
25
|
+
const tokenAddress = await deployTokenAndMint(wallet, accounts, tokenAdmin, mintAmount, undefined, logger);
|
|
26
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
20
27
|
return {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
tokenAdminAddress: tokenAdmin
|
|
28
|
+
aztecNode,
|
|
29
|
+
accounts,
|
|
30
|
+
wallet,
|
|
31
|
+
tokenAdminAddress: tokenAdmin,
|
|
25
32
|
tokenName: TOKEN_NAME,
|
|
26
33
|
tokenAddress,
|
|
27
|
-
|
|
28
|
-
|
|
34
|
+
tokenContract,
|
|
35
|
+
recipientAddress: recipientAccount
|
|
29
36
|
};
|
|
30
37
|
}
|
|
31
|
-
export async function
|
|
38
|
+
export async function deploySponsoredTestAccountsWithTokens(wallet, aztecNode, mintAmount, logger, numberOfFundedWallets = 1) {
|
|
32
39
|
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
33
|
-
const
|
|
34
|
-
const fundedAccounts = await Promise.all(funded.map((a)=>
|
|
35
|
-
await registerSponsoredFPC(
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
41
|
+
const fundedAccounts = await Promise.all(funded.map((a)=>wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
42
|
+
await registerSponsoredFPC(wallet);
|
|
43
|
+
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
44
|
+
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
45
|
+
await recipientDeployMethod.send({
|
|
46
|
+
from: AztecAddress.ZERO,
|
|
47
|
+
fee: {
|
|
48
|
+
paymentMethod
|
|
49
|
+
}
|
|
50
|
+
}).wait({
|
|
51
|
+
timeout: 2400
|
|
52
|
+
});
|
|
53
|
+
await Promise.all(fundedAccounts.map(async (a)=>{
|
|
54
|
+
const deployMethod = await a.getDeployMethod();
|
|
55
|
+
await deployMethod.send({
|
|
56
|
+
from: AztecAddress.ZERO,
|
|
40
57
|
fee: {
|
|
41
58
|
paymentMethod
|
|
42
59
|
}
|
|
43
60
|
}).wait({
|
|
44
61
|
timeout: 2400
|
|
45
62
|
}); // increase timeout on purpose in order to account for two empty epochs
|
|
46
|
-
logger.info(`Account deployed at ${a.
|
|
47
|
-
return wallet;
|
|
63
|
+
logger.info(`Account deployed at ${a.address}`);
|
|
48
64
|
}));
|
|
49
|
-
const tokenAdmin =
|
|
50
|
-
const tokenAddress = await deployTokenAndMint(
|
|
51
|
-
const
|
|
65
|
+
const tokenAdmin = fundedAccounts[0];
|
|
66
|
+
const tokenAddress = await deployTokenAndMint(wallet, fundedAccounts.map((acc)=>acc.address), tokenAdmin.address, mintAmount, new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()), logger);
|
|
67
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
52
68
|
return {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
69
|
+
aztecNode,
|
|
70
|
+
wallet,
|
|
71
|
+
accounts: fundedAccounts.map((acc)=>acc.address),
|
|
72
|
+
tokenAdminAddress: tokenAdmin.address,
|
|
57
73
|
tokenName: TOKEN_NAME,
|
|
58
74
|
tokenAddress,
|
|
59
|
-
|
|
60
|
-
recipientAddress:
|
|
75
|
+
tokenContract,
|
|
76
|
+
recipientAddress: recipientAccount.address
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export async function deploySponsoredTestAccounts(wallet, aztecNode, logger, numberOfFundedWallets = 1) {
|
|
80
|
+
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
81
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
82
|
+
const fundedAccounts = await Promise.all(funded.map((a)=>wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
83
|
+
await registerSponsoredFPC(wallet);
|
|
84
|
+
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
85
|
+
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
86
|
+
await recipientDeployMethod.send({
|
|
87
|
+
from: AztecAddress.ZERO,
|
|
88
|
+
fee: {
|
|
89
|
+
paymentMethod
|
|
90
|
+
}
|
|
91
|
+
}).wait({
|
|
92
|
+
timeout: 2400
|
|
93
|
+
});
|
|
94
|
+
await Promise.all(fundedAccounts.map(async (a)=>{
|
|
95
|
+
const deployMethod = await a.getDeployMethod();
|
|
96
|
+
await deployMethod.send({
|
|
97
|
+
from: AztecAddress.ZERO,
|
|
98
|
+
fee: {
|
|
99
|
+
paymentMethod
|
|
100
|
+
}
|
|
101
|
+
}).wait({
|
|
102
|
+
timeout: 2400
|
|
103
|
+
}); // increase timeout on purpose in order to account for two empty epochs
|
|
104
|
+
logger.info(`Account deployed at ${a.address}`);
|
|
105
|
+
}));
|
|
106
|
+
return {
|
|
107
|
+
aztecNode,
|
|
108
|
+
wallet,
|
|
109
|
+
accounts: fundedAccounts.map((acc)=>acc.address),
|
|
110
|
+
recipientAddress: recipientAccount.address
|
|
61
111
|
};
|
|
62
112
|
}
|
|
63
|
-
export async function
|
|
64
|
-
const
|
|
65
|
-
const
|
|
113
|
+
export async function deployTestAccountsWithTokens(nodeUrl, l1RpcUrls, mnemonicOrPrivateKey, mintAmount, logger, numberOfFundedWallets = 1) {
|
|
114
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
115
|
+
const wallet = await TestWallet.create(aztecNode);
|
|
66
116
|
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
67
|
-
const
|
|
68
|
-
const fundedAccounts = await Promise.all(funded.map((a)=>
|
|
69
|
-
const claims = await Promise.all(fundedAccounts.map((a)=>bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey,
|
|
117
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
118
|
+
const fundedAccounts = await Promise.all(funded.map((a)=>wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
119
|
+
const claims = await Promise.all(fundedAccounts.map((a)=>bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, a.address, undefined, logger)));
|
|
70
120
|
// Progress by 3 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
|
|
71
|
-
await advanceL2Block(
|
|
72
|
-
await advanceL2Block(
|
|
73
|
-
await advanceL2Block(
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
const
|
|
77
|
-
await
|
|
121
|
+
await advanceL2Block(aztecNode);
|
|
122
|
+
await advanceL2Block(aztecNode);
|
|
123
|
+
await advanceL2Block(aztecNode);
|
|
124
|
+
await Promise.all(fundedAccounts.map(async (a, i)=>{
|
|
125
|
+
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
126
|
+
const deployMethod = await a.getDeployMethod();
|
|
127
|
+
await deployMethod.send({
|
|
128
|
+
from: AztecAddress.ZERO,
|
|
78
129
|
fee: {
|
|
79
130
|
paymentMethod
|
|
80
131
|
}
|
|
81
132
|
}).wait();
|
|
82
|
-
logger.info(`Account deployed at ${a.
|
|
83
|
-
return wallet;
|
|
133
|
+
logger.info(`Account deployed at ${a.address}`);
|
|
84
134
|
}));
|
|
85
|
-
const tokenAdmin =
|
|
86
|
-
const tokenAddress = await deployTokenAndMint(
|
|
87
|
-
const
|
|
135
|
+
const tokenAdmin = fundedAccounts[0];
|
|
136
|
+
const tokenAddress = await deployTokenAndMint(wallet, fundedAccounts.map((acc)=>acc.address), tokenAdmin.address, mintAmount, undefined, logger);
|
|
137
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
88
138
|
return {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
139
|
+
aztecNode,
|
|
140
|
+
wallet,
|
|
141
|
+
accounts: fundedAccounts.map((acc)=>acc.address),
|
|
142
|
+
tokenAdminAddress: tokenAdmin.address,
|
|
93
143
|
tokenName: TOKEN_NAME,
|
|
94
144
|
tokenAddress,
|
|
95
|
-
|
|
96
|
-
recipientAddress:
|
|
145
|
+
tokenContract,
|
|
146
|
+
recipientAddress: recipientAccount.address
|
|
97
147
|
};
|
|
98
148
|
}
|
|
99
|
-
async function bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey,
|
|
100
|
-
const { l1ChainId } = await
|
|
149
|
+
async function bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, recipient, amount, log) {
|
|
150
|
+
const { l1ChainId } = await aztecNode.getNodeInfo();
|
|
101
151
|
const chain = createEthereumChain(l1RpcUrls, l1ChainId);
|
|
102
152
|
const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
|
|
103
|
-
|
|
104
|
-
const portal = await L1FeeJuicePortalManager.new(pxe, l1Client, log);
|
|
153
|
+
const portal = await L1FeeJuicePortalManager.new(aztecNode, l1Client, log);
|
|
105
154
|
const claim = await portal.bridgeTokensPublic(recipient, amount, true);
|
|
106
|
-
|
|
107
|
-
const isSynced = async ()=>await pxe.isL1ToL2MessageSynced(Fr.fromHexString(claim.messageHash));
|
|
155
|
+
const isSynced = async ()=>await aztecNode.getL1ToL2MessageBlock(Fr.fromHexString(claim.messageHash)) !== undefined;
|
|
108
156
|
await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 0.5);
|
|
109
157
|
log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
|
|
110
158
|
return claim;
|
|
111
159
|
}
|
|
112
|
-
async function advanceL2Block(
|
|
113
|
-
const initialBlockNumber = await
|
|
160
|
+
async function advanceL2Block(aztecNode, nodeAdmin) {
|
|
161
|
+
const initialBlockNumber = await aztecNode.getBlockNumber();
|
|
114
162
|
let minTxsPerBlock = undefined;
|
|
115
163
|
if (nodeAdmin) {
|
|
116
164
|
({ minTxsPerBlock } = await nodeAdmin.getConfig());
|
|
@@ -118,16 +166,16 @@ async function advanceL2Block(node, nodeAdmin) {
|
|
|
118
166
|
minTxsPerBlock: 0
|
|
119
167
|
}); // Set to 0 to ensure we can advance the block
|
|
120
168
|
}
|
|
121
|
-
await retryUntil(async ()=>await
|
|
169
|
+
await retryUntil(async ()=>await aztecNode.getBlockNumber() >= initialBlockNumber + 1);
|
|
122
170
|
if (nodeAdmin && minTxsPerBlock !== undefined) {
|
|
123
171
|
await nodeAdmin.setConfig({
|
|
124
172
|
minTxsPerBlock
|
|
125
173
|
});
|
|
126
174
|
}
|
|
127
175
|
}
|
|
128
|
-
async function deployTokenAndMint(
|
|
176
|
+
async function deployTokenAndMint(wallet, accounts, admin, mintAmount, paymentMethod, logger) {
|
|
129
177
|
logger.verbose(`Deploying TokenContract...`);
|
|
130
|
-
const tokenContract = await TokenContract.deploy(
|
|
178
|
+
const tokenContract = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
|
|
131
179
|
from: admin,
|
|
132
180
|
fee: {
|
|
133
181
|
paymentMethod
|
|
@@ -136,8 +184,8 @@ async function deployTokenAndMint(wallets, admin, mintAmount, paymentMethod, log
|
|
|
136
184
|
timeout: 600
|
|
137
185
|
});
|
|
138
186
|
const tokenAddress = tokenContract.address;
|
|
139
|
-
logger.verbose(`Minting ${mintAmount} public assets to the ${
|
|
140
|
-
await Promise.all(
|
|
187
|
+
logger.verbose(`Minting ${mintAmount} public assets to the ${accounts.length} accounts...`);
|
|
188
|
+
await Promise.all(accounts.map((acc)=>TokenContract.at(tokenAddress, wallet).methods.mint_to_public(acc, mintAmount).send({
|
|
141
189
|
from: admin,
|
|
142
190
|
fee: {
|
|
143
191
|
paymentMethod
|
|
@@ -148,12 +196,20 @@ async function deployTokenAndMint(wallets, admin, mintAmount, paymentMethod, log
|
|
|
148
196
|
logger.verbose(`Minting complete.`);
|
|
149
197
|
return tokenAddress;
|
|
150
198
|
}
|
|
151
|
-
export async function performTransfers({
|
|
152
|
-
const recipient =
|
|
199
|
+
export async function performTransfers({ wallet, testAccounts, rounds, transferAmount, logger, feePaymentMethod }) {
|
|
200
|
+
const recipient = testAccounts.recipientAddress;
|
|
201
|
+
// Default to sponsored fee payment if no fee method is provided
|
|
202
|
+
const defaultFeePaymentMethod = feePaymentMethod || new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
153
203
|
for(let i = 0; i < rounds; i++){
|
|
154
|
-
const txs =
|
|
155
|
-
|
|
156
|
-
|
|
204
|
+
const txs = testAccounts.accounts.map((acc)=>{
|
|
205
|
+
const token = TokenContract.at(testAccounts.tokenAddress, testAccounts.wallet);
|
|
206
|
+
return proveInteraction(wallet, token.methods.transfer_in_public(acc, recipient, transferAmount, 0), {
|
|
207
|
+
from: acc,
|
|
208
|
+
fee: {
|
|
209
|
+
paymentMethod: defaultFeePaymentMethod
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
});
|
|
157
213
|
const provenTxs = await Promise.all(txs);
|
|
158
214
|
await Promise.all(provenTxs.map((t)=>t.send().wait({
|
|
159
215
|
timeout: 600
|
|
@@ -161,23 +217,25 @@ export async function performTransfers({ testWallets, rounds, transferAmount, lo
|
|
|
161
217
|
logger.info(`Completed round ${i + 1} / ${rounds}`);
|
|
162
218
|
}
|
|
163
219
|
}
|
|
164
|
-
export async function
|
|
165
|
-
const
|
|
220
|
+
export async function createWalletAndAztecNodeClient(nodeUrl, proverEnabled, logger) {
|
|
221
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
166
222
|
const [bbConfig, acvmConfig] = await Promise.all([
|
|
167
223
|
getBBConfig(logger),
|
|
168
224
|
getACVMConfig(logger)
|
|
169
225
|
]);
|
|
170
|
-
const
|
|
226
|
+
const pxeConfig = {
|
|
171
227
|
dataDirectory: undefined,
|
|
172
|
-
|
|
228
|
+
dataStoreMapSizeKb: 1024 * 1024,
|
|
173
229
|
...bbConfig,
|
|
174
230
|
...acvmConfig,
|
|
175
231
|
proverEnabled
|
|
176
|
-
}
|
|
232
|
+
};
|
|
233
|
+
const wallet = await TestWallet.create(aztecNode, pxeConfig);
|
|
177
234
|
return {
|
|
178
|
-
|
|
235
|
+
wallet,
|
|
236
|
+
aztecNode,
|
|
179
237
|
async cleanup () {
|
|
180
|
-
await
|
|
238
|
+
await wallet.stop();
|
|
181
239
|
await bbConfig?.cleanup();
|
|
182
240
|
await acvmConfig?.cleanup();
|
|
183
241
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
|
+
import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
|
|
3
|
+
export type TxInclusionData = {
|
|
4
|
+
txHash: string;
|
|
5
|
+
sentAt: number;
|
|
6
|
+
minedAt: number;
|
|
7
|
+
attestedAt: number;
|
|
8
|
+
blocknumber: number;
|
|
9
|
+
priorityFee: number;
|
|
10
|
+
totalFee: number;
|
|
11
|
+
positionInBlock: number;
|
|
12
|
+
group: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class TxInclusionMetrics {
|
|
15
|
+
private aztecNode;
|
|
16
|
+
private data;
|
|
17
|
+
private groups;
|
|
18
|
+
private blocks;
|
|
19
|
+
constructor(aztecNode: AztecNode);
|
|
20
|
+
recordSentTx(tx: Tx, group: string): void;
|
|
21
|
+
recordMinedTx(txReceipt: TxReceipt): Promise<void>;
|
|
22
|
+
inclusionTimeInSeconds(group: string): {
|
|
23
|
+
count: number;
|
|
24
|
+
group: string;
|
|
25
|
+
min: number;
|
|
26
|
+
mean: number;
|
|
27
|
+
max: number;
|
|
28
|
+
median: number;
|
|
29
|
+
p99: number;
|
|
30
|
+
};
|
|
31
|
+
toGithubActionBenchmarkJSON(): Array<{
|
|
32
|
+
name: string;
|
|
33
|
+
unit: string;
|
|
34
|
+
value: number;
|
|
35
|
+
range?: number;
|
|
36
|
+
extra?: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NwYXJ0YW4vdHhfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFJaEUsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsVUFBVSxFQUFFLE1BQU0sQ0FBQztJQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFDcEIsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNqQixlQUFlLEVBQUUsTUFBTSxDQUFDO0lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUM7Q0FDZixDQUFDO0FBRUYscUJBQWEsa0JBQWtCO0lBS2pCLE9BQU8sQ0FBQyxTQUFTO0lBSjdCLE9BQU8sQ0FBQyxJQUFJLENBQXNDO0lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQXFCO0lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQXVDO0lBRXJELFlBQW9CLFNBQVMsRUFBRSxTQUFTLEVBQUk7SUFFNUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBZ0J4QztJQUVLLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FpQnZEO0lBRU0sc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRztRQUM1QyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNkLEdBQUcsRUFBRSxNQUFNLENBQUM7UUFDWixJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQ2IsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDZixHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ2IsQ0ErQkE7SUFFRCwyQkFBMkIsSUFBSSxLQUFLLENBQUM7UUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBeUJsSDtDQUNGIn0=
|
|
@@ -0,0 +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;AAEtD,OAAO,EAAE,EAAE,EAAE,KAAK,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAIhE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,kBAAkB;IAKjB,OAAO,CAAC,SAAS;IAJ7B,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAuC;IAErD,YAAoB,SAAS,EAAE,SAAS,EAAI;IAE5C,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAgBxC;IAEK,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvD;IAEM,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC5C,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CA+BA;IAED,2BAA2B,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAyBlH;CACF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
2
|
+
import { createHistogram } from 'perf_hooks';
|
|
3
|
+
export class TxInclusionMetrics {
|
|
4
|
+
aztecNode;
|
|
5
|
+
data;
|
|
6
|
+
groups;
|
|
7
|
+
blocks;
|
|
8
|
+
constructor(aztecNode){
|
|
9
|
+
this.aztecNode = aztecNode;
|
|
10
|
+
this.data = new Map();
|
|
11
|
+
this.groups = new Set();
|
|
12
|
+
this.blocks = new Map();
|
|
13
|
+
}
|
|
14
|
+
recordSentTx(tx, group) {
|
|
15
|
+
const txHash = tx.getTxHash().toString();
|
|
16
|
+
const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
|
|
17
|
+
this.data.set(txHash, {
|
|
18
|
+
txHash,
|
|
19
|
+
sentAt: Math.trunc(Date.now() / 1000),
|
|
20
|
+
minedAt: -1,
|
|
21
|
+
attestedAt: -1,
|
|
22
|
+
blocknumber: -1,
|
|
23
|
+
priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
|
|
24
|
+
totalFee: -1,
|
|
25
|
+
positionInBlock: -1,
|
|
26
|
+
group
|
|
27
|
+
});
|
|
28
|
+
this.groups.add(group);
|
|
29
|
+
}
|
|
30
|
+
async recordMinedTx(txReceipt) {
|
|
31
|
+
const { status, txHash, blockNumber } = txReceipt;
|
|
32
|
+
if (status !== TxStatus.SUCCESS || !blockNumber) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!this.blocks.has(blockNumber)) {
|
|
36
|
+
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
|
|
37
|
+
}
|
|
38
|
+
const block = await this.blocks.get(blockNumber);
|
|
39
|
+
const data = this.data.get(txHash.toString());
|
|
40
|
+
data.blocknumber = blockNumber;
|
|
41
|
+
data.minedAt = Number(block.header.globalVariables.timestamp);
|
|
42
|
+
data.attestedAt = -1;
|
|
43
|
+
data.totalFee = Number(txReceipt.transactionFee ?? 0n);
|
|
44
|
+
data.positionInBlock = block.body.txEffects.findIndex((txEffect)=>txEffect.txHash.equals(txHash));
|
|
45
|
+
}
|
|
46
|
+
inclusionTimeInSeconds(group) {
|
|
47
|
+
const histogram = createHistogram({});
|
|
48
|
+
for (const tx of this.data.values()){
|
|
49
|
+
if (!tx.blocknumber || tx.group !== group) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
histogram.record(tx.minedAt - tx.sentAt);
|
|
53
|
+
}
|
|
54
|
+
if (histogram.count === 0) {
|
|
55
|
+
return {
|
|
56
|
+
group,
|
|
57
|
+
count: 0,
|
|
58
|
+
mean: 0,
|
|
59
|
+
max: 0,
|
|
60
|
+
median: 0,
|
|
61
|
+
min: 0,
|
|
62
|
+
p99: 0
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
group,
|
|
67
|
+
count: histogram.count,
|
|
68
|
+
mean: histogram.mean,
|
|
69
|
+
max: histogram.max,
|
|
70
|
+
median: histogram.percentile(50),
|
|
71
|
+
min: histogram.min,
|
|
72
|
+
p99: histogram.percentile(99)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
toGithubActionBenchmarkJSON() {
|
|
76
|
+
const data = [];
|
|
77
|
+
for (const group of this.groups){
|
|
78
|
+
const stats = this.inclusionTimeInSeconds(group);
|
|
79
|
+
data.push({
|
|
80
|
+
name: `${group}/avg_inclusion`,
|
|
81
|
+
unit: 's',
|
|
82
|
+
value: stats.mean
|
|
83
|
+
}, {
|
|
84
|
+
name: `${group}/median_inclusion`,
|
|
85
|
+
unit: 's',
|
|
86
|
+
value: stats.median
|
|
87
|
+
}, {
|
|
88
|
+
name: `${group}/p99_inclusion`,
|
|
89
|
+
unit: 's',
|
|
90
|
+
value: stats.p99
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return data;
|
|
94
|
+
}
|
|
95
|
+
}
|