@aztec/end-to-end 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e

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 (252) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  3. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/benchmark.js +21 -1
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts +13 -14
  6. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  7. package/dest/bench/client_flows/client_flows_benchmark.js +118 -140
  8. package/dest/bench/client_flows/config.d.ts +2 -2
  9. package/dest/bench/client_flows/config.d.ts.map +1 -1
  10. package/dest/bench/client_flows/config.js +18 -0
  11. package/dest/bench/utils.d.ts +6 -5
  12. package/dest/bench/utils.d.ts.map +1 -1
  13. package/dest/bench/utils.js +13 -8
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +11 -9
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +108 -114
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +7 -8
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +68 -64
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  21. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  22. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  23. package/dest/e2e_epochs/epochs_test.d.ts +17 -7
  24. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  25. package/dest/e2e_epochs/epochs_test.js +92 -42
  26. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  27. package/dest/e2e_fees/fees_test.d.ts +14 -14
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +133 -144
  30. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  31. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  32. package/dest/e2e_l1_publisher/write_json.js +14 -13
  33. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  34. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  35. package/dest/e2e_nested_contract/nested_contract_test.js +30 -40
  36. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  37. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  38. package/dest/e2e_p2p/inactivity_slash_test.js +6 -6
  39. package/dest/e2e_p2p/p2p_network.d.ts +15 -15
  40. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  41. package/dest/e2e_p2p/p2p_network.js +144 -119
  42. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  43. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  44. package/dest/e2e_p2p/reqresp/utils.js +190 -0
  45. package/dest/e2e_p2p/shared.d.ts +30 -12
  46. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  47. package/dest/e2e_p2p/shared.js +62 -60
  48. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  49. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  50. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  51. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  54. package/dest/e2e_token_contract/token_contract_test.d.ts +19 -10
  55. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  56. package/dest/e2e_token_contract/token_contract_test.js +100 -92
  57. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  58. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  59. package/dest/fixtures/authwit_proxy.js +34 -0
  60. package/dest/fixtures/e2e_prover_test.d.ts +14 -19
  61. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  62. package/dest/fixtures/e2e_prover_test.js +113 -133
  63. package/dest/fixtures/elu_monitor.d.ts +21 -0
  64. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  65. package/dest/fixtures/elu_monitor.js +102 -0
  66. package/dest/fixtures/fixtures.d.ts +5 -1
  67. package/dest/fixtures/fixtures.d.ts.map +1 -1
  68. package/dest/fixtures/fixtures.js +6 -0
  69. package/dest/fixtures/get_bb_config.d.ts +1 -1
  70. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  71. package/dest/fixtures/get_bb_config.js +5 -5
  72. package/dest/fixtures/ha_setup.d.ts +71 -0
  73. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  74. package/dest/fixtures/ha_setup.js +116 -0
  75. package/dest/fixtures/index.d.ts +2 -1
  76. package/dest/fixtures/index.d.ts.map +1 -1
  77. package/dest/fixtures/index.js +1 -0
  78. package/dest/fixtures/setup.d.ts +242 -0
  79. package/dest/fixtures/setup.d.ts.map +1 -0
  80. package/dest/fixtures/setup.js +611 -0
  81. package/dest/fixtures/setup_p2p_test.d.ts +18 -11
  82. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  83. package/dest/fixtures/setup_p2p_test.js +43 -32
  84. package/dest/fixtures/token_utils.d.ts +2 -2
  85. package/dest/fixtures/token_utils.d.ts.map +1 -1
  86. package/dest/fixtures/token_utils.js +7 -6
  87. package/dest/fixtures/utils.d.ts +5 -191
  88. package/dest/fixtures/utils.d.ts.map +1 -1
  89. package/dest/fixtures/utils.js +4 -615
  90. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  91. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  92. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  93. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  94. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  95. package/dest/forward-compatibility/wallet_service.js +109 -0
  96. package/dest/legacy-jest-resolver.d.cts +3 -0
  97. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  98. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  99. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  100. package/dest/quality_of_service/prometheus_client.js +67 -0
  101. package/dest/shared/cross_chain_test_harness.d.ts +14 -4
  102. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  103. package/dest/shared/cross_chain_test_harness.js +24 -24
  104. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  105. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  106. package/dest/shared/gas_portal_test_harness.js +3 -3
  107. package/dest/shared/index.d.ts +2 -1
  108. package/dest/shared/index.d.ts.map +1 -1
  109. package/dest/shared/index.js +1 -0
  110. package/dest/shared/jest_setup.js +41 -1
  111. package/dest/shared/mock_state_view.d.ts +86 -0
  112. package/dest/shared/mock_state_view.d.ts.map +1 -0
  113. package/dest/shared/mock_state_view.js +186 -0
  114. package/dest/shared/submit-transactions.d.ts +4 -4
  115. package/dest/shared/submit-transactions.d.ts.map +1 -1
  116. package/dest/shared/submit-transactions.js +9 -11
  117. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  118. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  119. package/dest/shared/uniswap_l1_l2.js +27 -28
  120. package/dest/simulators/lending_simulator.d.ts +5 -1
  121. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  122. package/dest/simulators/lending_simulator.js +6 -6
  123. package/dest/simulators/token_simulator.d.ts +1 -1
  124. package/dest/simulators/token_simulator.d.ts.map +1 -1
  125. package/dest/simulators/token_simulator.js +3 -24
  126. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  127. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  128. package/dest/spartan/setup_test_wallets.js +130 -42
  129. package/dest/spartan/tx_metrics.d.ts +51 -2
  130. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  131. package/dest/spartan/tx_metrics.js +334 -7
  132. package/dest/spartan/utils/bot.d.ts +28 -0
  133. package/dest/spartan/utils/bot.d.ts.map +1 -0
  134. package/dest/spartan/utils/bot.js +142 -0
  135. package/dest/spartan/utils/chaos.d.ts +79 -0
  136. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  137. package/dest/spartan/utils/chaos.js +142 -0
  138. package/dest/spartan/utils/clients.d.ts +39 -0
  139. package/dest/spartan/utils/clients.d.ts.map +1 -0
  140. package/dest/spartan/utils/clients.js +90 -0
  141. package/dest/spartan/utils/config.d.ts +45 -0
  142. package/dest/spartan/utils/config.d.ts.map +1 -0
  143. package/dest/spartan/utils/config.js +23 -0
  144. package/dest/spartan/utils/health.d.ts +63 -0
  145. package/dest/spartan/utils/health.d.ts.map +1 -0
  146. package/dest/spartan/utils/health.js +202 -0
  147. package/dest/spartan/utils/helm.d.ts +15 -0
  148. package/dest/spartan/utils/helm.d.ts.map +1 -0
  149. package/dest/spartan/utils/helm.js +47 -0
  150. package/dest/spartan/utils/index.d.ts +11 -0
  151. package/dest/spartan/utils/index.d.ts.map +1 -0
  152. package/dest/spartan/utils/index.js +22 -0
  153. package/dest/spartan/utils/k8s.d.ts +128 -0
  154. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  155. package/dest/spartan/utils/k8s.js +381 -0
  156. package/dest/spartan/utils/nodes.d.ts +40 -0
  157. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  158. package/dest/spartan/utils/nodes.js +461 -0
  159. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  160. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  161. package/dest/spartan/utils/pod_logs.js +74 -0
  162. package/dest/spartan/utils/scripts.d.ts +30 -0
  163. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  164. package/dest/spartan/utils/scripts.js +81 -0
  165. package/dest/spartan/utils.d.ts +2 -253
  166. package/dest/spartan/utils.d.ts.map +1 -1
  167. package/dest/spartan/utils.js +1 -892
  168. package/dest/test-wallet/test_wallet.d.ts +84 -0
  169. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  170. package/dest/test-wallet/test_wallet.js +249 -0
  171. package/dest/test-wallet/utils.d.ts +41 -0
  172. package/dest/test-wallet/utils.d.ts.map +1 -0
  173. package/dest/test-wallet/utils.js +71 -0
  174. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  175. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  176. package/dest/test-wallet/wallet_worker_script.js +48 -0
  177. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  178. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  179. package/dest/test-wallet/worker_wallet.js +151 -0
  180. package/dest/test-wallet/worker_wallet_schema.d.ts +279 -0
  181. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  182. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  183. package/package.json +47 -43
  184. package/src/bench/client_flows/benchmark.ts +24 -2
  185. package/src/bench/client_flows/client_flows_benchmark.ts +157 -210
  186. package/src/bench/client_flows/config.ts +9 -1
  187. package/src/bench/utils.ts +15 -8
  188. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +123 -151
  189. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +103 -111
  190. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  191. package/src/e2e_epochs/epochs_test.ts +140 -92
  192. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  193. package/src/e2e_fees/fees_test.ts +170 -224
  194. package/src/e2e_l1_publisher/write_json.ts +16 -13
  195. package/src/e2e_nested_contract/nested_contract_test.ts +35 -56
  196. package/src/e2e_p2p/inactivity_slash_test.ts +6 -6
  197. package/src/e2e_p2p/p2p_network.ts +210 -185
  198. package/src/e2e_p2p/reqresp/utils.ts +256 -0
  199. package/src/e2e_p2p/shared.ts +92 -80
  200. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  201. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  202. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  203. package/src/e2e_token_contract/token_contract_test.ts +121 -119
  204. package/src/fixtures/authwit_proxy.ts +54 -0
  205. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  206. package/src/fixtures/e2e_prover_test.ts +140 -183
  207. package/src/fixtures/elu_monitor.ts +126 -0
  208. package/src/fixtures/fixtures.ts +10 -0
  209. package/src/fixtures/get_bb_config.ts +7 -6
  210. package/src/fixtures/ha_setup.ts +186 -0
  211. package/src/fixtures/index.ts +1 -0
  212. package/src/fixtures/setup.ts +910 -0
  213. package/src/fixtures/setup_p2p_test.ts +48 -52
  214. package/src/fixtures/token_utils.ts +7 -6
  215. package/src/fixtures/utils.ts +27 -901
  216. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  217. package/src/forward-compatibility/wallet_service.ts +104 -0
  218. package/src/guides/up_quick_start.sh +3 -3
  219. package/src/legacy-jest-resolver.cjs +135 -0
  220. package/src/quality_of_service/prometheus_client.ts +113 -0
  221. package/src/shared/cross_chain_test_harness.ts +24 -34
  222. package/src/shared/gas_portal_test_harness.ts +2 -2
  223. package/src/shared/index.ts +1 -0
  224. package/src/shared/jest_setup.ts +51 -1
  225. package/src/shared/mock_state_view.ts +188 -0
  226. package/src/shared/submit-transactions.ts +11 -16
  227. package/src/shared/uniswap_l1_l2.ts +49 -51
  228. package/src/simulators/lending_simulator.ts +10 -6
  229. package/src/simulators/token_simulator.ts +6 -30
  230. package/src/spartan/setup_test_wallets.ts +183 -26
  231. package/src/spartan/tx_metrics.ts +256 -10
  232. package/src/spartan/utils/bot.ts +188 -0
  233. package/src/spartan/utils/chaos.ts +253 -0
  234. package/src/spartan/utils/clients.ts +100 -0
  235. package/src/spartan/utils/config.ts +29 -0
  236. package/src/spartan/utils/health.ts +255 -0
  237. package/src/spartan/utils/helm.ts +84 -0
  238. package/src/spartan/utils/index.ts +71 -0
  239. package/src/spartan/utils/k8s.ts +535 -0
  240. package/src/spartan/utils/nodes.ts +543 -0
  241. package/src/spartan/utils/pod_logs.ts +99 -0
  242. package/src/spartan/utils/scripts.ts +99 -0
  243. package/src/spartan/utils.ts +1 -1158
  244. package/src/test-wallet/test_wallet.ts +351 -0
  245. package/src/test-wallet/utils.ts +112 -0
  246. package/src/test-wallet/wallet_worker_script.ts +60 -0
  247. package/src/test-wallet/worker_wallet.ts +214 -0
  248. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  249. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  250. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  251. package/dest/fixtures/snapshot_manager.js +0 -488
  252. package/src/fixtures/snapshot_manager.ts +0 -646
@@ -1,22 +1,27 @@
1
1
  import { generateSchnorrAccounts } from '@aztec/accounts/testing';
2
+ import { NO_FROM } from '@aztec/aztec.js/account';
2
3
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
3
5
  import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
4
6
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
5
7
  import { type FeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
6
8
  import { Fr } from '@aztec/aztec.js/fields';
7
- import { type AztecNode, createAztecNodeClient } from '@aztec/aztec.js/node';
9
+ import { type AztecNode, createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
8
10
  import type { Wallet } from '@aztec/aztec.js/wallet';
9
11
  import { createEthereumChain } from '@aztec/ethereum/chain';
10
12
  import { createExtendedL1Client } from '@aztec/ethereum/client';
11
13
  import type { Logger } from '@aztec/foundation/log';
12
- import { retryUntil } from '@aztec/foundation/retry';
14
+ import { makeBackoff, retry, retryUntil } from '@aztec/foundation/retry';
13
15
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
14
16
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
15
- import { TestWallet, proveInteraction, registerInitialLocalNetworkAccountsInWallet } from '@aztec/test-wallet/server';
17
+ import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
16
18
 
17
19
  import { getACVMConfig } from '../fixtures/get_acvm_config.js';
18
20
  import { getBBConfig } from '../fixtures/get_bb_config.js';
19
21
  import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
22
+ import { TestWallet } from '../test-wallet/test_wallet.js';
23
+ import { proveInteraction } from '../test-wallet/utils.js';
24
+ import { WorkerWallet } from '../test-wallet/worker_wallet.js';
20
25
 
21
26
  export interface TestAccounts {
22
27
  aztecNode: AztecNode;
@@ -84,11 +89,19 @@ export async function deploySponsoredTestAccountsWithTokens(
84
89
 
85
90
  const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
86
91
  const recipientDeployMethod = await recipientAccount.getDeployMethod();
87
- await recipientDeployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 });
92
+ await recipientDeployMethod.send({
93
+ from: NO_FROM,
94
+ fee: { paymentMethod },
95
+ wait: { timeout: 2400 },
96
+ });
88
97
  await Promise.all(
89
98
  fundedAccounts.map(async a => {
90
99
  const deployMethod = await a.getDeployMethod();
91
- await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 }); // increase timeout on purpose in order to account for two empty epochs
100
+ await deployMethod.send({
101
+ from: NO_FROM,
102
+ fee: { paymentMethod },
103
+ wait: { timeout: 2400 },
104
+ }); // increase timeout on purpose in order to account for two empty epochs
92
105
  logger.info(`Account deployed at ${a.address}`);
93
106
  }),
94
107
  );
@@ -116,11 +129,103 @@ export async function deploySponsoredTestAccountsWithTokens(
116
129
  };
117
130
  }
118
131
 
132
+ async function deployAccountWithDiagnostics(
133
+ account: { getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>; address: any },
134
+ paymentMethod: SponsoredFeePaymentMethod,
135
+ aztecNode: AztecNode,
136
+ logger: Logger,
137
+ accountLabel: string,
138
+ estimateGas?: boolean,
139
+ ): Promise<void> {
140
+ const deployMethod = await account.getDeployMethod();
141
+ let gasSettings: any;
142
+ if (estimateGas) {
143
+ const sim = await deployMethod.simulate({ from: NO_FROM, fee: { paymentMethod } });
144
+ gasSettings = sim.estimatedGas;
145
+ logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`);
146
+ }
147
+
148
+ // Track the tx hash across retries so we don't re-send when the previous tx is still pending.
149
+ let sentTxHash: { txHash: any } | undefined;
150
+
151
+ await retry(
152
+ async () => {
153
+ // Check if already deployed (handles case where previous attempt succeeded but waitForTx timed out)
154
+ const existing = await aztecNode.getContract(account.address);
155
+ if (existing) {
156
+ logger.info(`${accountLabel} already deployed at ${account.address}, skipping`);
157
+ return;
158
+ }
159
+
160
+ // If we already sent a tx, check if it was dropped before deciding to re-send.
161
+ if (sentTxHash) {
162
+ const prevReceipt = await aztecNode.getTxReceipt(sentTxHash.txHash);
163
+ if (prevReceipt.isDropped()) {
164
+ logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} was dropped, re-sending`);
165
+ sentTxHash = undefined;
166
+ } else {
167
+ logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} still pending, waiting again...`);
168
+ }
169
+ }
170
+
171
+ if (!sentTxHash) {
172
+ const deployResult = await deployMethod.send({
173
+ from: NO_FROM,
174
+ fee: { paymentMethod, gasSettings },
175
+ wait: NO_WAIT,
176
+ });
177
+ sentTxHash = { txHash: deployResult.txHash };
178
+ logger.info(`${accountLabel} tx sent`, { txHash: sentTxHash.txHash.toString() });
179
+ }
180
+
181
+ const receipt = await waitForTx(aztecNode, sentTxHash.txHash, { timeout: 600 });
182
+ if (receipt.isDropped()) {
183
+ sentTxHash = undefined;
184
+ throw new Error(`${accountLabel} tx was dropped, retrying...`);
185
+ }
186
+ logger.info(`${accountLabel} deployed at ${account.address}`);
187
+ },
188
+ `deploy ${accountLabel}`,
189
+ makeBackoff([1, 2, 4, 8, 16]),
190
+ logger,
191
+ );
192
+ }
193
+
194
+ async function deployAccountsInBatches(
195
+ accounts: {
196
+ getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>;
197
+ address: any;
198
+ }[],
199
+ paymentMethod: SponsoredFeePaymentMethod,
200
+ aztecNode: AztecNode,
201
+ logger: Logger,
202
+ labelPrefix: string,
203
+ batchSize = 2,
204
+ estimateGas?: boolean,
205
+ ): Promise<void> {
206
+ for (let i = 0; i < accounts.length; i += batchSize) {
207
+ const batch = accounts.slice(i, i + batchSize);
208
+ await Promise.all(
209
+ batch.map((account, idx) =>
210
+ deployAccountWithDiagnostics(
211
+ account,
212
+ paymentMethod,
213
+ aztecNode,
214
+ logger,
215
+ `${labelPrefix}${i + idx + 1}`,
216
+ estimateGas,
217
+ ),
218
+ ),
219
+ );
220
+ }
221
+ }
222
+
119
223
  export async function deploySponsoredTestAccounts(
120
224
  wallet: TestWallet,
121
225
  aztecNode: AztecNode,
122
226
  logger: Logger,
123
227
  numberOfFundedWallets = 1,
228
+ opts?: { estimateGas?: boolean },
124
229
  ): Promise<TestAccountsWithoutTokens> {
125
230
  const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
126
231
  const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
@@ -129,14 +234,23 @@ export async function deploySponsoredTestAccounts(
129
234
  await registerSponsoredFPC(wallet);
130
235
 
131
236
  const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
132
- const recipientDeployMethod = await recipientAccount.getDeployMethod();
133
- await recipientDeployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 });
134
- await Promise.all(
135
- fundedAccounts.map(async a => {
136
- const deployMethod = await a.getDeployMethod();
137
- await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 }); // increase timeout on purpose in order to account for two empty epochs
138
- logger.info(`Account deployed at ${a.address}`);
139
- }),
237
+
238
+ await deployAccountWithDiagnostics(
239
+ recipientAccount,
240
+ paymentMethod,
241
+ aztecNode,
242
+ logger,
243
+ 'Recipient account',
244
+ opts?.estimateGas,
245
+ );
246
+ await deployAccountsInBatches(
247
+ fundedAccounts,
248
+ paymentMethod,
249
+ aztecNode,
250
+ logger,
251
+ 'Funded account ',
252
+ 2,
253
+ opts?.estimateGas,
140
254
  );
141
255
 
142
256
  return {
@@ -175,7 +289,7 @@ export async function deployTestAccountsWithTokens(
175
289
  fundedAccounts.map(async (a, i) => {
176
290
  const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
177
291
  const deployMethod = await a.getDeployMethod();
178
- await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait();
292
+ await deployMethod.send({ from: NO_FROM, fee: { paymentMethod } });
179
293
  logger.info(`Account deployed at ${a.address}`);
180
294
  }),
181
295
  );
@@ -219,7 +333,7 @@ async function bridgeL1FeeJuice(
219
333
  const claim = await portal.bridgeTokensPublic(recipient, amount, true /* mint */);
220
334
 
221
335
  const isSynced = async () =>
222
- (await aztecNode.getL1ToL2MessageBlock(Fr.fromHexString(claim.messageHash))) !== undefined;
336
+ (await aztecNode.getL1ToL2MessageCheckpoint(Fr.fromHexString(claim.messageHash))) !== undefined;
223
337
  await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 0.5);
224
338
 
225
339
  log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
@@ -251,14 +365,19 @@ async function deployTokenAndMint(
251
365
  logger: Logger,
252
366
  ) {
253
367
  logger.verbose(`Deploying TokenContract...`);
254
- const tokenContract = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
255
- .send({
256
- from: admin,
257
- fee: {
258
- paymentMethod,
259
- },
260
- })
261
- .deployed({ timeout: 600 });
368
+ const { contract: tokenContract } = await TokenContract.deploy(
369
+ wallet,
370
+ admin,
371
+ TOKEN_NAME,
372
+ TOKEN_SYMBOL,
373
+ TOKEN_DECIMALS,
374
+ ).send({
375
+ from: admin,
376
+ fee: {
377
+ paymentMethod,
378
+ },
379
+ wait: { timeout: 600 },
380
+ });
262
381
 
263
382
  const tokenAddress = tokenContract.address;
264
383
 
@@ -268,8 +387,7 @@ async function deployTokenAndMint(
268
387
  accounts.map(acc =>
269
388
  TokenContract.at(tokenAddress, wallet)
270
389
  .methods.mint_to_public(acc, mintAmount)
271
- .send({ from: admin, fee: { paymentMethod } })
272
- .wait({ timeout: 600 }),
390
+ .send({ from: admin, fee: { paymentMethod }, wait: { timeout: 600 } }),
273
391
  ),
274
392
  );
275
393
 
@@ -309,7 +427,7 @@ export async function performTransfers({
309
427
 
310
428
  const provenTxs = await Promise.all(txs);
311
429
 
312
- await Promise.all(provenTxs.map(t => t.send().wait({ timeout: 600 })));
430
+ await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600 } })));
313
431
 
314
432
  logger.info(`Completed round ${i + 1} / ${rounds}`);
315
433
  }
@@ -347,3 +465,42 @@ export async function createWalletAndAztecNodeClient(
347
465
  },
348
466
  };
349
467
  }
468
+
469
+ export type WorkerWalletWrapper = {
470
+ wallet: WorkerWallet;
471
+ aztecNode: AztecNode;
472
+ cleanup: () => Promise<void>;
473
+ };
474
+
475
+ export async function createWorkerWalletClient(
476
+ nodeUrl: string,
477
+ proverEnabled: boolean,
478
+ logger: Logger,
479
+ ): Promise<WorkerWalletWrapper> {
480
+ const aztecNode = createAztecNodeClient(nodeUrl);
481
+ const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
482
+
483
+ // Strip cleanup functions — they can't be structured-cloned for worker transfer
484
+ const { cleanup: bbCleanup, ...bbPaths } = bbConfig ?? {};
485
+ const { cleanup: acvmCleanup, ...acvmPaths } = acvmConfig ?? {};
486
+
487
+ const pxeConfig = {
488
+ dataDirectory: undefined,
489
+ dataStoreMapSizeKb: 1024 * 1024,
490
+ ...bbPaths,
491
+ ...acvmPaths,
492
+ proverEnabled,
493
+ };
494
+
495
+ const wallet = await WorkerWallet.create(nodeUrl, pxeConfig);
496
+
497
+ return {
498
+ wallet,
499
+ aztecNode,
500
+ async cleanup() {
501
+ await wallet.stop();
502
+ await bbCleanup?.();
503
+ await acvmCleanup?.();
504
+ },
505
+ };
506
+ }
@@ -1,9 +1,137 @@
1
1
  import type { AztecNode } from '@aztec/aztec.js/node';
2
+ import type { Logger } from '@aztec/foundation/log';
2
3
  import type { L2Block } from '@aztec/stdlib/block';
3
- import { Tx, type TxReceipt, TxStatus } from '@aztec/stdlib/tx';
4
+ import type { TopicType } from '@aztec/stdlib/p2p';
5
+ import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
4
6
 
5
7
  import { createHistogram } from 'perf_hooks';
6
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
+
7
135
  export type TxInclusionData = {
8
136
  txHash: string;
9
137
  sentAt: number;
@@ -19,14 +147,31 @@ export type TxInclusionData = {
19
147
  export class TxInclusionMetrics {
20
148
  private data = new Map<string, TxInclusionData>();
21
149
  private groups = new Set<string>();
22
- private blocks = new Map<number, Promise<L2Block>>();
150
+ private blocks = new Map<number, Promise<L2Block | undefined>>();
151
+
152
+ private p2pGossipLatencyByTopic: Partial<Record<TopicType, { p50: number; p95: number }>> = {};
23
153
 
24
- constructor(private aztecNode: AztecNode) {}
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
+ ) {}
25
166
 
26
167
  recordSentTx(tx: Tx, group: string): void {
27
168
  const txHash = tx.getTxHash().toString();
28
169
  const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
29
170
 
171
+ if (this.data.has(txHash)) {
172
+ this.logger?.debug(`Overwriting tx inclusion data for ${txHash}`, { txHash, group });
173
+ }
174
+
30
175
  this.data.set(txHash, {
31
176
  txHash,
32
177
  sentAt: Math.trunc(Date.now() / 1000),
@@ -42,17 +187,31 @@ export class TxInclusionMetrics {
42
187
  }
43
188
 
44
189
  async recordMinedTx(txReceipt: TxReceipt): Promise<void> {
45
- const { status, txHash, blockNumber } = txReceipt;
46
- if (status !== TxStatus.SUCCESS || !blockNumber) {
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
+ });
47
197
  return;
48
198
  }
49
199
 
50
200
  if (!this.blocks.has(blockNumber)) {
51
- this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber) as Promise<L2Block>);
201
+ this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
52
202
  }
53
203
 
54
204
  const block = await this.blocks.get(blockNumber)!;
55
- const data = this.data.get(txHash.toString())!;
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
+ }
56
215
  data.blocknumber = blockNumber;
57
216
  data.minedAt = Number(block.header.globalVariables.timestamp);
58
217
  data.attestedAt = -1;
@@ -71,7 +230,7 @@ export class TxInclusionMetrics {
71
230
  } {
72
231
  const histogram = createHistogram({});
73
232
  for (const tx of this.data.values()) {
74
- if (!tx.blocknumber || tx.group !== group) {
233
+ if (!tx.blocknumber || tx.group !== group || tx.minedAt === -1) {
75
234
  continue;
76
235
  }
77
236
 
@@ -101,6 +260,30 @@ export class TxInclusionMetrics {
101
260
  };
102
261
  }
103
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
+
104
287
  toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> {
105
288
  const data: Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> = [];
106
289
  for (const group of this.groups) {
@@ -113,7 +296,7 @@ export class TxInclusionMetrics {
113
296
  value: stats.mean,
114
297
  },
115
298
  {
116
- name: `${group}/median_inclusion`,
299
+ name: `${group}/p50_inclusion`,
117
300
  unit: 's',
118
301
  value: stats.median,
119
302
  },
@@ -125,6 +308,69 @@ export class TxInclusionMetrics {
125
308
  );
126
309
  }
127
310
 
128
- return data;
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}` }));
129
375
  }
130
376
  }