@aztec/end-to-end 0.0.1-commit.b655e406 → 0.0.1-commit.c0b82b2

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.
Files changed (270) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +22 -16
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +133 -122
  7. package/dest/bench/client_flows/config.d.ts +2 -2
  8. package/dest/bench/client_flows/config.d.ts.map +1 -1
  9. package/dest/bench/client_flows/config.js +18 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +1 -1
  11. package/dest/bench/client_flows/data_extractor.js +7 -27
  12. package/dest/bench/utils.d.ts +8 -7
  13. package/dest/bench/utils.d.ts.map +1 -1
  14. package/dest/bench/utils.js +27 -18
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +9 -8
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +106 -112
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +20 -14
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +92 -70
  21. package/dest/e2e_deploy_contract/deploy_test.d.ts +6 -5
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  23. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  24. package/dest/e2e_epochs/epochs_test.d.ts +25 -15
  25. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  26. package/dest/e2e_epochs/epochs_test.js +103 -53
  27. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  28. package/dest/e2e_fees/bridging_race.notest.js +5 -7
  29. package/dest/e2e_fees/fees_test.d.ts +21 -17
  30. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  31. package/dest/e2e_fees/fees_test.js +129 -141
  32. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  33. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  34. package/dest/e2e_l1_publisher/write_json.js +18 -19
  35. package/dest/e2e_multi_validator/utils.d.ts +1 -1
  36. package/dest/e2e_multi_validator/utils.js +1 -1
  37. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  38. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  39. package/dest/e2e_nested_contract/nested_contract_test.js +31 -38
  40. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  41. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  42. package/dest/e2e_p2p/inactivity_slash_test.js +7 -6
  43. package/dest/e2e_p2p/p2p_network.d.ts +226 -19
  44. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  45. package/dest/e2e_p2p/p2p_network.js +136 -111
  46. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  47. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  48. package/dest/e2e_p2p/reqresp/utils.js +177 -0
  49. package/dest/e2e_p2p/shared.d.ts +11 -11
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +20 -22
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  54. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  55. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  56. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  57. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  58. package/dest/e2e_token_contract/token_contract_test.d.ts +19 -10
  59. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  60. package/dest/e2e_token_contract/token_contract_test.js +99 -91
  61. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  62. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  63. package/dest/fixtures/authwit_proxy.js +30 -0
  64. package/dest/fixtures/e2e_prover_test.d.ts +15 -21
  65. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  66. package/dest/fixtures/e2e_prover_test.js +123 -138
  67. package/dest/fixtures/elu_monitor.d.ts +21 -0
  68. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  69. package/dest/fixtures/elu_monitor.js +102 -0
  70. package/dest/fixtures/fixtures.d.ts +6 -3
  71. package/dest/fixtures/fixtures.d.ts.map +1 -1
  72. package/dest/fixtures/fixtures.js +8 -3
  73. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  74. package/dest/fixtures/get_acvm_config.js +1 -1
  75. package/dest/fixtures/get_bb_config.d.ts +1 -1
  76. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  77. package/dest/fixtures/ha_setup.d.ts +71 -0
  78. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  79. package/dest/fixtures/ha_setup.js +116 -0
  80. package/dest/fixtures/index.d.ts +2 -1
  81. package/dest/fixtures/index.d.ts.map +1 -1
  82. package/dest/fixtures/index.js +1 -0
  83. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  84. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  85. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  86. package/dest/fixtures/logging.d.ts +1 -1
  87. package/dest/fixtures/setup.d.ts +234 -0
  88. package/dest/fixtures/setup.d.ts.map +1 -0
  89. package/dest/fixtures/setup.js +605 -0
  90. package/dest/fixtures/setup_p2p_test.d.ts +17 -10
  91. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  92. package/dest/fixtures/setup_p2p_test.js +55 -36
  93. package/dest/fixtures/token_utils.d.ts +6 -3
  94. package/dest/fixtures/token_utils.d.ts.map +1 -1
  95. package/dest/fixtures/token_utils.js +16 -9
  96. package/dest/fixtures/utils.d.ts +5 -192
  97. package/dest/fixtures/utils.d.ts.map +1 -1
  98. package/dest/fixtures/utils.js +4 -648
  99. package/dest/fixtures/web3signer.d.ts +1 -1
  100. package/dest/fixtures/web3signer.js +1 -1
  101. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  102. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  103. package/dest/fixtures/with_telemetry_utils.js +2 -2
  104. package/dest/index.d.ts +1 -1
  105. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  106. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  107. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  108. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  109. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  110. package/dest/quality_of_service/prometheus_client.js +67 -0
  111. package/dest/shared/cross_chain_test_harness.d.ts +7 -6
  112. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  113. package/dest/shared/cross_chain_test_harness.js +14 -14
  114. package/dest/shared/gas_portal_test_harness.d.ts +2 -2
  115. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  116. package/dest/shared/gas_portal_test_harness.js +2 -2
  117. package/dest/shared/index.d.ts +3 -2
  118. package/dest/shared/index.d.ts.map +1 -1
  119. package/dest/shared/index.js +1 -0
  120. package/dest/shared/jest_setup.d.ts +1 -1
  121. package/dest/shared/jest_setup.js +41 -1
  122. package/dest/shared/mock_state_view.d.ts +86 -0
  123. package/dest/shared/mock_state_view.d.ts.map +1 -0
  124. package/dest/shared/mock_state_view.js +186 -0
  125. package/dest/shared/submit-transactions.d.ts +4 -4
  126. package/dest/shared/submit-transactions.d.ts.map +1 -1
  127. package/dest/shared/submit-transactions.js +9 -11
  128. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  129. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  130. package/dest/shared/uniswap_l1_l2.js +57 -35
  131. package/dest/simulators/index.d.ts +1 -1
  132. package/dest/simulators/lending_simulator.d.ts +2 -2
  133. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  134. package/dest/simulators/lending_simulator.js +6 -4
  135. package/dest/simulators/token_simulator.d.ts +1 -1
  136. package/dest/simulators/token_simulator.d.ts.map +1 -1
  137. package/dest/simulators/token_simulator.js +2 -23
  138. package/dest/spartan/setup_test_wallets.d.ts +16 -6
  139. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  140. package/dest/spartan/setup_test_wallets.js +115 -23
  141. package/dest/spartan/tx_metrics.d.ts +88 -0
  142. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  143. package/dest/spartan/tx_metrics.js +422 -0
  144. package/dest/spartan/utils/bot.d.ts +28 -0
  145. package/dest/spartan/utils/bot.d.ts.map +1 -0
  146. package/dest/spartan/utils/bot.js +142 -0
  147. package/dest/spartan/utils/chaos.d.ts +79 -0
  148. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  149. package/dest/spartan/utils/chaos.js +142 -0
  150. package/dest/spartan/utils/clients.d.ts +39 -0
  151. package/dest/spartan/utils/clients.d.ts.map +1 -0
  152. package/dest/spartan/utils/clients.js +90 -0
  153. package/dest/spartan/utils/config.d.ts +42 -0
  154. package/dest/spartan/utils/config.d.ts.map +1 -0
  155. package/dest/spartan/utils/config.js +22 -0
  156. package/dest/spartan/utils/health.d.ts +63 -0
  157. package/dest/spartan/utils/health.d.ts.map +1 -0
  158. package/dest/spartan/utils/health.js +202 -0
  159. package/dest/spartan/utils/helm.d.ts +15 -0
  160. package/dest/spartan/utils/helm.d.ts.map +1 -0
  161. package/dest/spartan/utils/helm.js +47 -0
  162. package/dest/spartan/utils/index.d.ts +10 -0
  163. package/dest/spartan/utils/index.d.ts.map +1 -0
  164. package/dest/spartan/utils/index.js +20 -0
  165. package/dest/spartan/utils/k8s.d.ts +128 -0
  166. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  167. package/dest/spartan/utils/k8s.js +381 -0
  168. package/dest/spartan/utils/nodes.d.ts +40 -0
  169. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  170. package/dest/spartan/utils/nodes.js +461 -0
  171. package/dest/spartan/utils/scripts.d.ts +30 -0
  172. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  173. package/dest/spartan/utils/scripts.js +81 -0
  174. package/dest/spartan/utils.d.ts +2 -218
  175. package/dest/spartan/utils.d.ts.map +1 -1
  176. package/dest/spartan/utils.js +1 -749
  177. package/dest/test-wallet/test_wallet.d.ts +83 -0
  178. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  179. package/dest/test-wallet/test_wallet.js +214 -0
  180. package/dest/test-wallet/utils.d.ts +41 -0
  181. package/dest/test-wallet/utils.d.ts.map +1 -0
  182. package/dest/test-wallet/utils.js +71 -0
  183. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  184. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  185. package/dest/test-wallet/wallet_worker_script.js +48 -0
  186. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  187. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  188. package/dest/test-wallet/worker_wallet.js +151 -0
  189. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  190. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  191. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  192. package/package.json +50 -44
  193. package/src/bench/client_flows/benchmark.ts +24 -2
  194. package/src/bench/client_flows/client_flows_benchmark.ts +156 -177
  195. package/src/bench/client_flows/config.ts +9 -1
  196. package/src/bench/client_flows/data_extractor.ts +6 -28
  197. package/src/bench/utils.ts +31 -21
  198. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +114 -143
  199. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -125
  200. package/src/e2e_deploy_contract/deploy_test.ts +23 -16
  201. package/src/e2e_epochs/epochs_test.ts +166 -116
  202. package/src/e2e_fees/bridging_race.notest.ts +6 -12
  203. package/src/e2e_fees/fees_test.ts +172 -226
  204. package/src/e2e_l1_publisher/write_json.ts +20 -19
  205. package/src/e2e_multi_validator/utils.ts +1 -1
  206. package/src/e2e_nested_contract/nested_contract_test.ts +33 -55
  207. package/src/e2e_p2p/inactivity_slash_test.ts +8 -7
  208. package/src/e2e_p2p/p2p_network.ts +205 -182
  209. package/src/e2e_p2p/reqresp/utils.ts +235 -0
  210. package/src/e2e_p2p/shared.ts +37 -29
  211. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  212. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  213. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  214. package/src/e2e_token_contract/token_contract_test.ts +113 -119
  215. package/src/fixtures/authwit_proxy.ts +50 -0
  216. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  217. package/src/fixtures/e2e_prover_test.ts +138 -186
  218. package/src/fixtures/elu_monitor.ts +126 -0
  219. package/src/fixtures/fixtures.ts +12 -5
  220. package/src/fixtures/get_acvm_config.ts +1 -1
  221. package/src/fixtures/ha_setup.ts +186 -0
  222. package/src/fixtures/index.ts +1 -0
  223. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  224. package/src/fixtures/setup.ts +895 -0
  225. package/src/fixtures/setup_p2p_test.ts +58 -48
  226. package/src/fixtures/token_utils.ts +9 -7
  227. package/src/fixtures/utils.ts +27 -947
  228. package/src/fixtures/web3signer.ts +1 -1
  229. package/src/fixtures/with_telemetry_utils.ts +2 -2
  230. package/src/guides/up_quick_start.sh +4 -4
  231. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  232. package/src/quality_of_service/prometheus_client.ts +113 -0
  233. package/src/shared/cross_chain_test_harness.ts +19 -36
  234. package/src/shared/gas_portal_test_harness.ts +3 -3
  235. package/src/shared/index.ts +2 -1
  236. package/src/shared/jest_setup.ts +51 -1
  237. package/src/shared/mock_state_view.ts +188 -0
  238. package/src/shared/submit-transactions.ts +14 -16
  239. package/src/shared/uniswap_l1_l2.ts +66 -89
  240. package/src/simulators/lending_simulator.ts +7 -5
  241. package/src/simulators/token_simulator.ts +1 -29
  242. package/src/spartan/DEVELOP.md +7 -0
  243. package/src/spartan/setup_test_wallets.ts +173 -28
  244. package/src/spartan/tx_metrics.ts +376 -0
  245. package/src/spartan/utils/bot.ts +188 -0
  246. package/src/spartan/utils/chaos.ts +253 -0
  247. package/src/spartan/utils/clients.ts +100 -0
  248. package/src/spartan/utils/config.ts +28 -0
  249. package/src/spartan/utils/health.ts +255 -0
  250. package/src/spartan/utils/helm.ts +84 -0
  251. package/src/spartan/utils/index.ts +68 -0
  252. package/src/spartan/utils/k8s.ts +535 -0
  253. package/src/spartan/utils/nodes.ts +543 -0
  254. package/src/spartan/utils/scripts.ts +99 -0
  255. package/src/spartan/utils.ts +1 -942
  256. package/src/test-wallet/test_wallet.ts +306 -0
  257. package/src/test-wallet/utils.ts +112 -0
  258. package/src/test-wallet/wallet_worker_script.ts +60 -0
  259. package/src/test-wallet/worker_wallet.ts +213 -0
  260. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  261. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  262. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  263. package/dest/fixtures/setup_l1_contracts.js +0 -17
  264. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  265. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  266. package/dest/fixtures/snapshot_manager.js +0 -505
  267. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  268. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  269. package/src/fixtures/setup_l1_contracts.ts +0 -26
  270. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -1,21 +1,26 @@
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
- import { createEthereumChain, createExtendedL1Client } from '@aztec/ethereum';
10
+ import { createEthereumChain } from '@aztec/ethereum/chain';
11
+ import { createExtendedL1Client } from '@aztec/ethereum/client';
10
12
  import type { Logger } from '@aztec/foundation/log';
11
13
  import { retryUntil } from '@aztec/foundation/retry';
12
14
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
13
15
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
14
- import { TestWallet, proveInteraction, registerInitialSandboxAccountsInWallet } from '@aztec/test-wallet/server';
16
+ import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
15
17
 
16
18
  import { getACVMConfig } from '../fixtures/get_acvm_config.js';
17
19
  import { getBBConfig } from '../fixtures/get_bb_config.js';
18
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';
19
24
 
20
25
  export interface TestAccounts {
21
26
  aztecNode: AztecNode;
@@ -28,6 +33,11 @@ export interface TestAccounts {
28
33
  tokenAddress: AztecAddress;
29
34
  }
30
35
 
36
+ export type TestAccountsWithoutTokens = Omit<
37
+ TestAccounts,
38
+ 'tokenAddress' | 'tokenContract' | 'tokenName' | 'tokenAdminAddress'
39
+ >;
40
+
31
41
  const TOKEN_NAME = 'USDC';
32
42
  const TOKEN_SYMBOL = 'USD';
33
43
  const TOKEN_DECIMALS = 18n;
@@ -42,14 +52,14 @@ export async function setupTestAccountsWithTokens(
42
52
  const aztecNode = createAztecNodeClient(nodeUrl);
43
53
  const wallet = await TestWallet.create(aztecNode);
44
54
 
45
- const [recipientAccount, ...accounts] = (await registerInitialSandboxAccountsInWallet(wallet)).slice(
55
+ const [recipientAccount, ...accounts] = (await registerInitialLocalNetworkAccountsInWallet(wallet)).slice(
46
56
  0,
47
57
  ACCOUNT_COUNT + 1,
48
58
  );
49
59
 
50
60
  const tokenAdmin = accounts[0];
51
61
  const tokenAddress = await deployTokenAndMint(wallet, accounts, tokenAdmin, mintAmount, undefined, logger);
52
- const tokenContract = await TokenContract.at(tokenAddress, wallet);
62
+ const tokenContract = TokenContract.at(tokenAddress, wallet);
53
63
 
54
64
  return {
55
65
  aztecNode,
@@ -63,7 +73,7 @@ export async function setupTestAccountsWithTokens(
63
73
  };
64
74
  }
65
75
 
66
- export async function deploySponsoredTestAccounts(
76
+ export async function deploySponsoredTestAccountsWithTokens(
67
77
  wallet: TestWallet,
68
78
  aztecNode: AztecNode,
69
79
  mintAmount: bigint,
@@ -78,11 +88,19 @@ export async function deploySponsoredTestAccounts(
78
88
 
79
89
  const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
80
90
  const recipientDeployMethod = await recipientAccount.getDeployMethod();
81
- await recipientDeployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 });
91
+ await recipientDeployMethod.send({
92
+ from: AztecAddress.ZERO,
93
+ fee: { paymentMethod },
94
+ wait: { timeout: 2400 },
95
+ });
82
96
  await Promise.all(
83
97
  fundedAccounts.map(async a => {
84
98
  const deployMethod = await a.getDeployMethod();
85
- await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 }); // increase timeout on purpose in order to account for two empty epochs
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
86
104
  logger.info(`Account deployed at ${a.address}`);
87
105
  }),
88
106
  );
@@ -96,7 +114,7 @@ export async function deploySponsoredTestAccounts(
96
114
  new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()),
97
115
  logger,
98
116
  );
99
- const tokenContract = await TokenContract.at(tokenAddress, wallet);
117
+ const tokenContract = TokenContract.at(tokenAddress, wallet);
100
118
 
101
119
  return {
102
120
  aztecNode,
@@ -110,6 +128,84 @@ export async function deploySponsoredTestAccounts(
110
128
  };
111
129
  }
112
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
+ txHash = await deployMethod.send({
142
+ from: AztecAddress.ZERO,
143
+ fee: { paymentMethod },
144
+ wait: NO_WAIT,
145
+ });
146
+ await waitForTx(aztecNode, txHash, { timeout: 2400 });
147
+ logger.info(`${accountLabel} deployed at ${account.address}`);
148
+ } catch (error) {
149
+ const blockNumber = await aztecNode.getBlockNumber();
150
+ let receipt;
151
+ try {
152
+ receipt = await aztecNode.getTxReceipt(txHash);
153
+ } catch {
154
+ receipt = 'unavailable';
155
+ }
156
+ logger.error(`${accountLabel} deployment failed`, {
157
+ txHash: txHash.toString(),
158
+ receipt: JSON.stringify(receipt),
159
+ currentBlockNumber: blockNumber,
160
+ error: String(error),
161
+ });
162
+ throw error;
163
+ }
164
+ }
165
+
166
+ async function deployAccountsInBatches(
167
+ accounts: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any }[],
168
+ paymentMethod: SponsoredFeePaymentMethod,
169
+ aztecNode: AztecNode,
170
+ logger: Logger,
171
+ labelPrefix: string,
172
+ batchSize = 2,
173
+ ): Promise<void> {
174
+ for (let i = 0; i < accounts.length; i += batchSize) {
175
+ const batch = accounts.slice(i, i + batchSize);
176
+ await Promise.all(
177
+ batch.map((account, idx) =>
178
+ deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`),
179
+ ),
180
+ );
181
+ }
182
+ }
183
+
184
+ export async function deploySponsoredTestAccounts(
185
+ wallet: TestWallet,
186
+ aztecNode: AztecNode,
187
+ logger: Logger,
188
+ numberOfFundedWallets = 1,
189
+ ): Promise<TestAccountsWithoutTokens> {
190
+ const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
191
+ const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
192
+ const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
193
+
194
+ await registerSponsoredFPC(wallet);
195
+
196
+ const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
197
+
198
+ await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account');
199
+ await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2);
200
+
201
+ return {
202
+ aztecNode,
203
+ wallet,
204
+ accounts: fundedAccounts.map(acc => acc.address),
205
+ recipientAddress: recipientAccount.address,
206
+ };
207
+ }
208
+
113
209
  export async function deployTestAccountsWithTokens(
114
210
  nodeUrl: string,
115
211
  l1RpcUrls: string[],
@@ -138,7 +234,7 @@ export async function deployTestAccountsWithTokens(
138
234
  fundedAccounts.map(async (a, i) => {
139
235
  const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
140
236
  const deployMethod = await a.getDeployMethod();
141
- await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait();
237
+ await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } });
142
238
  logger.info(`Account deployed at ${a.address}`);
143
239
  }),
144
240
  );
@@ -152,7 +248,7 @@ export async function deployTestAccountsWithTokens(
152
248
  undefined,
153
249
  logger,
154
250
  );
155
- const tokenContract = await TokenContract.at(tokenAddress, wallet);
251
+ const tokenContract = TokenContract.at(tokenAddress, wallet);
156
252
 
157
253
  return {
158
254
  aztecNode,
@@ -214,25 +310,29 @@ async function deployTokenAndMint(
214
310
  logger: Logger,
215
311
  ) {
216
312
  logger.verbose(`Deploying TokenContract...`);
217
- const tokenContract = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
218
- .send({
219
- from: admin,
220
- fee: {
221
- paymentMethod,
222
- },
223
- })
224
- .deployed({ timeout: 600 });
313
+ const { contract: tokenContract } = await TokenContract.deploy(
314
+ wallet,
315
+ admin,
316
+ TOKEN_NAME,
317
+ TOKEN_SYMBOL,
318
+ TOKEN_DECIMALS,
319
+ ).send({
320
+ from: admin,
321
+ fee: {
322
+ paymentMethod,
323
+ },
324
+ wait: { timeout: 600, returnReceipt: true },
325
+ });
225
326
 
226
327
  const tokenAddress = tokenContract.address;
227
328
 
228
329
  logger.verbose(`Minting ${mintAmount} public assets to the ${accounts.length} accounts...`);
229
330
 
230
331
  await Promise.all(
231
- accounts.map(async acc =>
232
- (await TokenContract.at(tokenAddress, wallet)).methods
233
- .mint_to_public(acc, mintAmount)
234
- .send({ from: admin, fee: { paymentMethod } })
235
- .wait({ timeout: 600 }),
332
+ accounts.map(acc =>
333
+ TokenContract.at(tokenAddress, wallet)
334
+ .methods.mint_to_public(acc, mintAmount)
335
+ .send({ from: admin, fee: { paymentMethod }, wait: { timeout: 600 } }),
236
336
  ),
237
337
  );
238
338
 
@@ -260,8 +360,8 @@ export async function performTransfers({
260
360
  // Default to sponsored fee payment if no fee method is provided
261
361
  const defaultFeePaymentMethod = feePaymentMethod || new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
262
362
  for (let i = 0; i < rounds; i++) {
263
- const txs = testAccounts.accounts.map(async acc => {
264
- const token = await TokenContract.at(testAccounts.tokenAddress, testAccounts.wallet);
363
+ const txs = testAccounts.accounts.map(acc => {
364
+ const token = TokenContract.at(testAccounts.tokenAddress, testAccounts.wallet);
265
365
  return proveInteraction(wallet, token.methods.transfer_in_public(acc, recipient, transferAmount, 0), {
266
366
  from: acc,
267
367
  fee: {
@@ -272,17 +372,23 @@ export async function performTransfers({
272
372
 
273
373
  const provenTxs = await Promise.all(txs);
274
374
 
275
- await Promise.all(provenTxs.map(t => t.send().wait({ timeout: 600 })));
375
+ await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600 } })));
276
376
 
277
377
  logger.info(`Completed round ${i + 1} / ${rounds}`);
278
378
  }
279
379
  }
280
380
 
381
+ export type WalletWrapper = {
382
+ wallet: TestWallet;
383
+ aztecNode: AztecNode;
384
+ cleanup: () => Promise<void>;
385
+ };
386
+
281
387
  export async function createWalletAndAztecNodeClient(
282
388
  nodeUrl: string,
283
389
  proverEnabled: boolean,
284
390
  logger: Logger,
285
- ): Promise<{ wallet: TestWallet; aztecNode: AztecNode; cleanup: () => Promise<void> }> {
391
+ ): Promise<WalletWrapper> {
286
392
  const aztecNode = createAztecNodeClient(nodeUrl);
287
393
  const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
288
394
  const pxeConfig = {
@@ -304,3 +410,42 @@ export async function createWalletAndAztecNodeClient(
304
410
  },
305
411
  };
306
412
  }
413
+
414
+ export type WorkerWalletWrapper = {
415
+ wallet: WorkerWallet;
416
+ aztecNode: AztecNode;
417
+ cleanup: () => Promise<void>;
418
+ };
419
+
420
+ export async function createWorkerWalletClient(
421
+ nodeUrl: string,
422
+ proverEnabled: boolean,
423
+ logger: Logger,
424
+ ): Promise<WorkerWalletWrapper> {
425
+ const aztecNode = createAztecNodeClient(nodeUrl);
426
+ const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
427
+
428
+ // Strip cleanup functions — they can't be structured-cloned for worker transfer
429
+ const { cleanup: bbCleanup, ...bbPaths } = bbConfig ?? {};
430
+ const { cleanup: acvmCleanup, ...acvmPaths } = acvmConfig ?? {};
431
+
432
+ const pxeConfig = {
433
+ dataDirectory: undefined,
434
+ dataStoreMapSizeKb: 1024 * 1024,
435
+ ...bbPaths,
436
+ ...acvmPaths,
437
+ proverEnabled,
438
+ };
439
+
440
+ const wallet = await WorkerWallet.create(nodeUrl, pxeConfig);
441
+
442
+ return {
443
+ wallet,
444
+ aztecNode,
445
+ async cleanup() {
446
+ await wallet.stop();
447
+ await bbCleanup?.();
448
+ await acvmCleanup?.();
449
+ },
450
+ };
451
+ }
@@ -0,0 +1,376 @@
1
+ import type { AztecNode } from '@aztec/aztec.js/node';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import type { L2Block } from '@aztec/stdlib/block';
4
+ import type { TopicType } from '@aztec/stdlib/p2p';
5
+ import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
6
+
7
+ import { createHistogram } from 'perf_hooks';
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
+
135
+ export type TxInclusionData = {
136
+ txHash: string;
137
+ sentAt: number;
138
+ minedAt: number;
139
+ attestedAt: number;
140
+ blocknumber: number;
141
+ priorityFee: number;
142
+ totalFee: number;
143
+ positionInBlock: number;
144
+ group: string;
145
+ };
146
+
147
+ export class TxInclusionMetrics {
148
+ private data = new Map<string, TxInclusionData>();
149
+ private groups = new Set<string>();
150
+ private blocks = new Map<number, Promise<L2Block | undefined>>();
151
+
152
+ private p2pGossipLatencyByTopic: Partial<Record<TopicType, { p50: number; p95: number }>> = {};
153
+
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
+ ) {}
166
+
167
+ recordSentTx(tx: Tx, group: string): void {
168
+ const txHash = tx.getTxHash().toString();
169
+ const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
170
+
171
+ if (this.data.has(txHash)) {
172
+ this.logger?.debug(`Overwriting tx inclusion data for ${txHash}`, { txHash, group });
173
+ }
174
+
175
+ this.data.set(txHash, {
176
+ txHash,
177
+ sentAt: Math.trunc(Date.now() / 1000),
178
+ minedAt: -1,
179
+ attestedAt: -1,
180
+ blocknumber: -1,
181
+ priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
182
+ totalFee: -1,
183
+ positionInBlock: -1,
184
+ group,
185
+ });
186
+ this.groups.add(group);
187
+ }
188
+
189
+ async recordMinedTx(txReceipt: TxReceipt): Promise<void> {
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
+ });
197
+ return;
198
+ }
199
+
200
+ if (!this.blocks.has(blockNumber)) {
201
+ this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
202
+ }
203
+
204
+ const block = await this.blocks.get(blockNumber)!;
205
+ if (!block) {
206
+ this.logger?.warn('Failed to load block for mined tx receipt', { txHash: txHash.toString(), blockNumber });
207
+ return;
208
+ }
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
+ }
215
+ data.blocknumber = blockNumber;
216
+ data.minedAt = Number(block.header.globalVariables.timestamp);
217
+ data.attestedAt = -1;
218
+ data.totalFee = Number(txReceipt.transactionFee ?? 0n);
219
+ data.positionInBlock = block.body.txEffects.findIndex(txEffect => txEffect.txHash.equals(txHash));
220
+ }
221
+
222
+ public inclusionTimeInSeconds(group: string): {
223
+ count: number;
224
+ group: string;
225
+ min: number;
226
+ mean: number;
227
+ max: number;
228
+ median: number;
229
+ p99: number;
230
+ } {
231
+ const histogram = createHistogram({});
232
+ for (const tx of this.data.values()) {
233
+ if (!tx.blocknumber || tx.group !== group || tx.minedAt === -1) {
234
+ continue;
235
+ }
236
+
237
+ histogram.record(tx.minedAt - tx.sentAt);
238
+ }
239
+
240
+ if (histogram.count === 0) {
241
+ return {
242
+ group,
243
+ count: 0,
244
+ mean: 0,
245
+ max: 0,
246
+ median: 0,
247
+ min: 0,
248
+ p99: 0,
249
+ };
250
+ }
251
+
252
+ return {
253
+ group,
254
+ count: histogram.count,
255
+ mean: histogram.mean,
256
+ max: histogram.max,
257
+ median: histogram.percentile(50),
258
+ min: histogram.min,
259
+ p99: histogram.percentile(99),
260
+ };
261
+ }
262
+
263
+ public recordP2PGossipLatency(topicName: TopicType, p50: number, p95: number): void {
264
+ this.p2pGossipLatencyByTopic[topicName] = { p50, p95 };
265
+ }
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
+
287
+ toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> {
288
+ const data: Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> = [];
289
+ for (const group of this.groups) {
290
+ const stats = this.inclusionTimeInSeconds(group);
291
+
292
+ data.push(
293
+ {
294
+ name: `${group}/avg_inclusion`,
295
+ unit: 's',
296
+ value: stats.mean,
297
+ },
298
+ {
299
+ name: `${group}/median_inclusion`,
300
+ unit: 's',
301
+ value: stats.median,
302
+ },
303
+ {
304
+ name: `${group}/p99_inclusion`,
305
+ unit: 's',
306
+ value: stats.p99,
307
+ },
308
+ );
309
+ }
310
+
311
+ for (const [topic, { p50, p95 }] of Object.entries(this.p2pGossipLatencyByTopic)) {
312
+ data.push({
313
+ name: `p2p_gossip_latency/${topic}/p50`,
314
+ unit: 'ms',
315
+ value: p50,
316
+ });
317
+ data.push({
318
+ name: `p2p_gossip_latency/${topic}/p95`,
319
+ unit: 'ms',
320
+ value: p95,
321
+ });
322
+ }
323
+
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}` }));
375
+ }
376
+ }