@aztec/end-to-end 0.0.1-commit.a89ec08 → 0.0.1-commit.aa0c64f

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 (318) hide show
  1. package/README.md +215 -27
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  9. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  10. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  12. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  13. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  15. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  16. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  17. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +23 -36
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +24 -39
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +15 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +19 -0
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +5 -5
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +53 -51
  30. package/dest/bench/client_flows/data_extractor.js +1 -0
  31. package/dest/bench/utils.d.ts +3 -3
  32. package/dest/bench/utils.d.ts.map +1 -1
  33. package/dest/bench/utils.js +97 -6
  34. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  35. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  36. package/dest/composed/ha/ha_full_setup.js +383 -0
  37. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  38. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  39. package/dest/fixtures/e2e_prover_test.d.ts +15 -11
  40. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  41. package/dest/fixtures/e2e_prover_test.js +56 -40
  42. package/dest/fixtures/elu_monitor.d.ts +21 -0
  43. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  44. package/dest/fixtures/elu_monitor.js +102 -0
  45. package/dest/fixtures/fixtures.d.ts +79 -1
  46. package/dest/fixtures/fixtures.d.ts.map +1 -1
  47. package/dest/fixtures/fixtures.js +80 -0
  48. package/dest/fixtures/get_bb_config.d.ts +1 -1
  49. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  50. package/dest/fixtures/get_bb_config.js +5 -5
  51. package/dest/fixtures/ha_setup.d.ts +4 -4
  52. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  53. package/dest/fixtures/ha_setup.js +5 -2
  54. package/dest/fixtures/index.d.ts +2 -1
  55. package/dest/fixtures/index.d.ts.map +1 -1
  56. package/dest/fixtures/index.js +1 -0
  57. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  58. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  59. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  60. package/dest/fixtures/setup.d.ts +81 -41
  61. package/dest/fixtures/setup.d.ts.map +1 -1
  62. package/dest/fixtures/setup.js +289 -198
  63. package/dest/fixtures/setup_p2p_test.d.ts +10 -6
  64. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  65. package/dest/fixtures/setup_p2p_test.js +11 -11
  66. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  67. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  68. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  69. package/dest/fixtures/timing.d.ts +42 -0
  70. package/dest/fixtures/timing.d.ts.map +1 -0
  71. package/dest/fixtures/timing.js +72 -0
  72. package/dest/fixtures/token_utils.d.ts +22 -4
  73. package/dest/fixtures/token_utils.d.ts.map +1 -1
  74. package/dest/fixtures/token_utils.js +23 -6
  75. package/dest/fixtures/utils.d.ts +2 -2
  76. package/dest/fixtures/utils.d.ts.map +1 -1
  77. package/dest/fixtures/utils.js +1 -1
  78. package/dest/fixtures/wait_helpers.d.ts +135 -0
  79. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  80. package/dest/fixtures/wait_helpers.js +154 -0
  81. package/dest/forward-compatibility/wallet_service.js +3 -3
  82. package/dest/install_legacy_contracts.d.cts +10 -0
  83. package/dest/install_legacy_contracts.d.cts.map +1 -0
  84. package/dest/legacy-jest-resolver.d.cts +1 -1
  85. package/dest/legacy-jest-resolver.d.cts.map +1 -1
  86. package/dest/multi-node/block-production/setup.d.ts +97 -0
  87. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  88. package/dest/multi-node/block-production/setup.js +158 -0
  89. package/dest/multi-node/governance/setup.d.ts +67 -0
  90. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  91. package/dest/multi-node/governance/setup.js +126 -0
  92. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  93. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  94. package/dest/multi-node/multi_node_test_context.js +347 -0
  95. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  96. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  97. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  98. package/dest/multi-node/slashing/setup.d.ts +167 -0
  99. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  100. package/dest/multi-node/slashing/setup.js +275 -0
  101. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +20 -11
  102. package/dest/p2p/p2p_network.d.ts.map +1 -0
  103. package/dest/{e2e_p2p → p2p}/p2p_network.js +83 -39
  104. package/dest/p2p/reqresp/utils.d.ts +19 -0
  105. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  106. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +45 -29
  107. package/dest/p2p/shared.d.ts +72 -0
  108. package/dest/p2p/shared.d.ts.map +1 -0
  109. package/dest/p2p/shared.js +212 -0
  110. package/dest/shared/cross_chain_test_harness.d.ts +6 -4
  111. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  112. package/dest/shared/cross_chain_test_harness.js +33 -21
  113. package/dest/shared/gas_portal_test_harness.d.ts +8 -5
  114. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  115. package/dest/shared/gas_portal_test_harness.js +24 -12
  116. package/dest/shared/jest_setup.js +41 -1
  117. package/dest/shared/submit-transactions.d.ts +1 -1
  118. package/dest/shared/submit-transactions.d.ts.map +1 -1
  119. package/dest/shared/submit-transactions.js +12 -5
  120. package/dest/shared/timing_env.d.js +5 -0
  121. package/dest/shared/timing_env.js +365 -0
  122. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  123. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  124. package/dest/shared/uniswap_l1_l2.js +50 -37
  125. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  126. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  127. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  128. package/dest/simulators/lending_simulator.d.ts +10 -3
  129. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  130. package/dest/simulators/lending_simulator.js +24 -12
  131. package/dest/simulators/token_simulator.js +1 -1
  132. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  133. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  134. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  135. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  136. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  137. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  138. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  139. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  140. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  141. package/dest/single-node/fees/fees_test.d.ts +95 -0
  142. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  143. package/dest/single-node/fees/fees_test.js +347 -0
  144. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  145. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  146. package/dest/single-node/l1-reorgs/setup.js +57 -0
  147. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  148. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  149. package/dest/single-node/partial-proofs/setup.js +5 -0
  150. package/dest/single-node/proving/setup.d.ts +5 -0
  151. package/dest/single-node/proving/setup.d.ts.map +1 -0
  152. package/dest/single-node/proving/setup.js +5 -0
  153. package/dest/single-node/recovery/setup.d.ts +5 -0
  154. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  155. package/dest/single-node/recovery/setup.js +5 -0
  156. package/dest/single-node/setup.d.ts +49 -0
  157. package/dest/single-node/setup.d.ts.map +1 -0
  158. package/dest/single-node/setup.js +56 -0
  159. package/dest/single-node/single_node_test_context.d.ts +374 -0
  160. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  161. package/dest/single-node/single_node_test_context.js +847 -0
  162. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  163. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  164. package/dest/spartan/setup_test_wallets.js +84 -50
  165. package/dest/spartan/tx_metrics.d.ts +27 -4
  166. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  167. package/dest/spartan/tx_metrics.js +106 -21
  168. package/dest/spartan/utils/config.d.ts +10 -30
  169. package/dest/spartan/utils/config.d.ts.map +1 -1
  170. package/dest/spartan/utils/config.js +3 -1
  171. package/dest/spartan/utils/index.d.ts +2 -1
  172. package/dest/spartan/utils/index.d.ts.map +1 -1
  173. package/dest/spartan/utils/index.js +2 -0
  174. package/dest/spartan/utils/nodes.d.ts +4 -5
  175. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  176. package/dest/spartan/utils/nodes.js +11 -11
  177. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  178. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  179. package/dest/spartan/utils/pod_logs.js +74 -0
  180. package/dest/test-wallet/test_wallet.d.ts +25 -4
  181. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  182. package/dest/test-wallet/test_wallet.js +107 -36
  183. package/dest/test-wallet/utils.d.ts +38 -3
  184. package/dest/test-wallet/utils.d.ts.map +1 -1
  185. package/dest/test-wallet/utils.js +65 -10
  186. package/dest/test-wallet/wallet_worker_script.js +12 -4
  187. package/dest/test-wallet/worker_wallet.d.ts +6 -5
  188. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  189. package/dest/test-wallet/worker_wallet.js +10 -4
  190. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -273
  191. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  192. package/dest/test-wallet/worker_wallet_schema.js +15 -2
  193. package/package.json +49 -47
  194. package/src/automine/README.md +60 -0
  195. package/src/automine/automine_test_context.ts +153 -0
  196. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  197. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  198. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +24 -44
  199. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +25 -48
  200. package/src/automine/token/token_test_helpers.ts +138 -0
  201. package/src/bench/client_flows/benchmark.ts +21 -0
  202. package/src/bench/client_flows/client_flows_benchmark.ts +104 -74
  203. package/src/bench/client_flows/data_extractor.ts +1 -0
  204. package/src/bench/utils.ts +110 -6
  205. package/src/composed/ha/ha_full_setup.ts +466 -0
  206. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  207. package/src/fixtures/e2e_prover_test.ts +73 -63
  208. package/src/fixtures/elu_monitor.ts +126 -0
  209. package/src/fixtures/fixtures.ts +100 -0
  210. package/src/fixtures/get_bb_config.ts +7 -6
  211. package/src/fixtures/ha_setup.ts +11 -5
  212. package/src/fixtures/index.ts +1 -0
  213. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  214. package/src/fixtures/setup.ts +360 -254
  215. package/src/fixtures/setup_p2p_test.ts +15 -11
  216. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  217. package/src/fixtures/timing.ts +97 -0
  218. package/src/fixtures/token_utils.ts +40 -8
  219. package/src/fixtures/utils.ts +2 -3
  220. package/src/fixtures/wait_helpers.ts +333 -0
  221. package/src/forward-compatibility/wallet_service.ts +6 -4
  222. package/src/guides/up_quick_start.sh +5 -2
  223. package/src/infra/README.md +12 -0
  224. package/src/install_legacy_contracts.cjs +75 -0
  225. package/src/legacy-jest-resolver.cjs +25 -48
  226. package/src/multi-node/README.md +96 -0
  227. package/src/multi-node/block-production/setup.ts +272 -0
  228. package/src/multi-node/governance/setup.ts +172 -0
  229. package/src/multi-node/multi_node_test_context.ts +447 -0
  230. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  231. package/src/multi-node/slashing/setup.ts +433 -0
  232. package/src/p2p/README.md +78 -0
  233. package/src/{e2e_p2p → p2p}/p2p_network.ts +96 -51
  234. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +56 -28
  235. package/src/p2p/shared.ts +329 -0
  236. package/src/shared/cross_chain_test_harness.ts +36 -17
  237. package/src/shared/gas_portal_test_harness.ts +32 -14
  238. package/src/shared/jest_setup.ts +51 -1
  239. package/src/shared/submit-transactions.ts +13 -8
  240. package/src/shared/timing_env.d.mts +39 -0
  241. package/src/shared/timing_env.mjs +363 -0
  242. package/src/shared/uniswap_l1_l2.ts +80 -43
  243. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  244. package/src/simulators/lending_simulator.ts +28 -14
  245. package/src/simulators/token_simulator.ts +1 -1
  246. package/src/single-node/README.md +66 -0
  247. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  248. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  249. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  250. package/src/{e2e_fees → single-node/fees}/fees_test.ts +176 -70
  251. package/src/single-node/l1-reorgs/setup.ts +93 -0
  252. package/src/single-node/partial-proofs/setup.ts +8 -0
  253. package/src/single-node/proving/setup.ts +15 -0
  254. package/src/single-node/recovery/setup.ts +8 -0
  255. package/src/single-node/setup.ts +63 -0
  256. package/src/single-node/single_node_test_context.ts +1058 -0
  257. package/src/spartan/setup_test_wallets.ts +87 -47
  258. package/src/spartan/tx_metrics.ts +108 -24
  259. package/src/spartan/utils/config.ts +2 -0
  260. package/src/spartan/utils/index.ts +3 -0
  261. package/src/spartan/utils/nodes.ts +17 -12
  262. package/src/spartan/utils/pod_logs.ts +99 -0
  263. package/src/test-wallet/test_wallet.ts +108 -33
  264. package/src/test-wallet/utils.ts +104 -11
  265. package/src/test-wallet/wallet_worker_script.ts +11 -5
  266. package/src/test-wallet/worker_wallet.ts +16 -14
  267. package/src/test-wallet/worker_wallet_schema.ts +4 -3
  268. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -56
  269. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  270. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -47
  271. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  272. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -129
  273. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  274. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  275. package/dest/e2e_deploy_contract/deploy_test.js +0 -50
  276. package/dest/e2e_epochs/epochs_test.d.ts +0 -104
  277. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  278. package/dest/e2e_epochs/epochs_test.js +0 -389
  279. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  280. package/dest/e2e_fees/fees_test.d.ts +0 -88
  281. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  282. package/dest/e2e_fees/fees_test.js +0 -255
  283. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  284. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  285. package/dest/e2e_l1_publisher/write_json.js +0 -56
  286. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  287. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  288. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  289. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  290. package/dest/e2e_nested_contract/nested_contract_test.js +0 -54
  291. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  292. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  293. package/dest/e2e_p2p/inactivity_slash_test.js +0 -137
  294. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  295. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  296. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  297. package/dest/e2e_p2p/shared.d.ts +0 -78
  298. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  299. package/dest/e2e_p2p/shared.js +0 -235
  300. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  301. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  302. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  303. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  304. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  305. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -193
  306. package/src/e2e_deploy_contract/deploy_test.ts +0 -85
  307. package/src/e2e_epochs/epochs_test.ts +0 -499
  308. package/src/e2e_l1_publisher/write_json.ts +0 -77
  309. package/src/e2e_nested_contract/nested_contract_test.ts +0 -75
  310. package/src/e2e_p2p/inactivity_slash_test.ts +0 -180
  311. package/src/e2e_p2p/shared.ts +0 -385
  312. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  313. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  314. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  315. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  316. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  317. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  318. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -1,19 +1,23 @@
1
1
  import { generateSchnorrAccounts } from '@aztec/accounts/testing';
2
2
  import { NO_FROM } from '@aztec/aztec.js/account';
3
3
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
- import { NO_WAIT } from '@aztec/aztec.js/contracts';
4
+ import { DefaultWaitOpts, NO_WAIT } from '@aztec/aztec.js/contracts';
5
5
  import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
6
6
  import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
7
7
  import { type FeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
8
8
  import { Fr } from '@aztec/aztec.js/fields';
9
+ import { waitForL1ToL2MessageReady } from '@aztec/aztec.js/messaging';
9
10
  import { type AztecNode, createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
10
11
  import type { Wallet } from '@aztec/aztec.js/wallet';
11
12
  import { createEthereumChain } from '@aztec/ethereum/chain';
12
13
  import { createExtendedL1Client } from '@aztec/ethereum/client';
13
14
  import type { Logger } from '@aztec/foundation/log';
14
- import { retryUntil } from '@aztec/foundation/retry';
15
+ import { makeBackoff, retry, retryUntil } from '@aztec/foundation/retry';
15
16
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
17
+ import { Gas } from '@aztec/stdlib/gas';
16
18
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
19
+ import { TxStatus } from '@aztec/stdlib/tx';
20
+ import { getGasLimits } from '@aztec/wallet-sdk/base-wallet';
17
21
  import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
18
22
 
19
23
  import { getACVMConfig } from '../fixtures/get_acvm_config.js';
@@ -52,6 +56,8 @@ export async function setupTestAccountsWithTokens(
52
56
 
53
57
  const aztecNode = createAztecNodeClient(nodeUrl);
54
58
  const wallet = await TestWallet.create(aztecNode);
59
+ // Remote JSON-RPC node: keep the 1s poll cadence rather than the in-process TestWallet fast default.
60
+ wallet.setDefaultWaitInterval(DefaultWaitOpts.interval);
55
61
 
56
62
  const [recipientAccount, ...accounts] = (await registerInitialLocalNetworkAccountsInWallet(wallet)).slice(
57
63
  0,
@@ -82,8 +88,10 @@ export async function deploySponsoredTestAccountsWithTokens(
82
88
  numberOfFundedWallets = 1,
83
89
  ): Promise<TestAccounts> {
84
90
  const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
85
- const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
86
- const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
91
+ const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt, recipient.signingKey);
92
+ const fundedAccounts = await Promise.all(
93
+ funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt, a.signingKey)),
94
+ );
87
95
 
88
96
  await registerSponsoredFPC(wallet);
89
97
 
@@ -138,38 +146,58 @@ async function deployAccountWithDiagnostics(
138
146
  estimateGas?: boolean,
139
147
  ): Promise<void> {
140
148
  const deployMethod = await account.getDeployMethod();
141
- let txHash;
142
- try {
143
- let gasSettings;
144
- if (estimateGas) {
145
- const sim = await deployMethod.simulate({ from: NO_FROM, fee: { paymentMethod } });
146
- gasSettings = sim.estimatedGas;
147
- logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`);
148
- }
149
- const deployResult = await deployMethod.send({
150
- from: NO_FROM,
151
- fee: { paymentMethod, gasSettings },
152
- wait: NO_WAIT,
153
- });
154
- txHash = deployResult.txHash;
155
- await waitForTx(aztecNode, txHash, { timeout: 2400 });
156
- logger.info(`${accountLabel} deployed at ${account.address}`);
157
- } catch (error) {
158
- const blockNumber = await aztecNode.getBlockNumber();
159
- let receipt;
160
- try {
161
- receipt = await aztecNode.getTxReceipt(txHash);
162
- } catch {
163
- receipt = 'unavailable';
164
- }
165
- logger.error(`${accountLabel} deployment failed`, {
166
- txHash: txHash.toString(),
167
- receipt: JSON.stringify(receipt),
168
- currentBlockNumber: blockNumber,
169
- error: String(error),
170
- });
171
- throw error;
149
+ let gasSettings: any;
150
+ if (estimateGas) {
151
+ const sim = await deployMethod.simulate({ from: NO_FROM, fee: { paymentMethod }, includeMetadata: true });
152
+ const { txsLimits } = await aztecNode.getNodeInfo();
153
+ gasSettings = getGasLimits(sim.gasUsed!, Gas.from(txsLimits.gas));
154
+ logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`);
172
155
  }
156
+
157
+ // Track the tx hash across retries so we don't re-send when the previous tx is still pending.
158
+ let sentTxHash: { txHash: any } | undefined;
159
+
160
+ await retry(
161
+ async () => {
162
+ // Check if already deployed (handles case where previous attempt succeeded but waitForTx timed out)
163
+ const existing = await aztecNode.getContract(account.address);
164
+ if (existing) {
165
+ logger.info(`${accountLabel} already deployed at ${account.address}, skipping`);
166
+ return;
167
+ }
168
+
169
+ // If we already sent a tx, check if it was dropped before deciding to re-send.
170
+ if (sentTxHash) {
171
+ const prevReceipt = await aztecNode.getTxReceipt(sentTxHash.txHash);
172
+ if (prevReceipt.isDropped()) {
173
+ logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} was dropped, re-sending`);
174
+ sentTxHash = undefined;
175
+ } else {
176
+ logger.info(`${accountLabel} previous tx ${sentTxHash.txHash} still pending, waiting again...`);
177
+ }
178
+ }
179
+
180
+ if (!sentTxHash) {
181
+ const deployResult = await deployMethod.send({
182
+ from: NO_FROM,
183
+ fee: { paymentMethod, gasSettings },
184
+ wait: NO_WAIT,
185
+ });
186
+ sentTxHash = { txHash: deployResult.txHash };
187
+ logger.info(`${accountLabel} tx sent`, { txHash: sentTxHash.txHash.toString() });
188
+ }
189
+
190
+ const receipt = await waitForTx(aztecNode, sentTxHash.txHash, { timeout: 600 });
191
+ if (receipt.isDropped()) {
192
+ sentTxHash = undefined;
193
+ throw new Error(`${accountLabel} tx was dropped, retrying...`);
194
+ }
195
+ logger.info(`${accountLabel} deployed at ${account.address}`);
196
+ },
197
+ `deploy ${accountLabel}`,
198
+ makeBackoff([1, 2, 4, 8, 16]),
199
+ logger,
200
+ );
173
201
  }
174
202
 
175
203
  async function deployAccountsInBatches(
@@ -209,8 +237,10 @@ export async function deploySponsoredTestAccounts(
209
237
  opts?: { estimateGas?: boolean },
210
238
  ): Promise<TestAccountsWithoutTokens> {
211
239
  const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
212
- const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
213
- const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
240
+ const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt, recipient.signingKey);
241
+ const fundedAccounts = await Promise.all(
242
+ funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt, a.signingKey)),
243
+ );
214
244
 
215
245
  await registerSponsoredFPC(wallet);
216
246
 
@@ -252,10 +282,14 @@ export async function deployTestAccountsWithTokens(
252
282
  ): Promise<TestAccounts> {
253
283
  const aztecNode = createAztecNodeClient(nodeUrl);
254
284
  const wallet = await TestWallet.create(aztecNode);
285
+ // Remote JSON-RPC node: keep the 1s poll cadence rather than the in-process TestWallet fast default.
286
+ wallet.setDefaultWaitInterval(DefaultWaitOpts.interval);
255
287
 
256
288
  const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
257
- const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
258
- const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
289
+ const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt, recipient.signingKey);
290
+ const fundedAccounts = await Promise.all(
291
+ funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt, a.signingKey)),
292
+ );
259
293
 
260
294
  const claims = await Promise.all(
261
295
  fundedAccounts.map(a => bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, a.address, undefined, logger)),
@@ -313,9 +347,7 @@ async function bridgeL1FeeJuice(
313
347
  const portal = await L1FeeJuicePortalManager.new(aztecNode, l1Client, log);
314
348
  const claim = await portal.bridgeTokensPublic(recipient, amount, true /* mint */);
315
349
 
316
- const isSynced = async () =>
317
- (await aztecNode.getL1ToL2MessageCheckpoint(Fr.fromHexString(claim.messageHash))) !== undefined;
318
- await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 0.5);
350
+ await waitForL1ToL2MessageReady(aztecNode, Fr.fromHexString(claim.messageHash), { timeoutSeconds: 24 });
319
351
 
320
352
  log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
321
353
  return claim;
@@ -346,14 +378,18 @@ async function deployTokenAndMint(
346
378
  logger: Logger,
347
379
  ) {
348
380
  logger.verbose(`Deploying TokenContract...`);
349
- const {
350
- receipt: { contract: tokenContract },
351
- } = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS).send({
381
+ const { contract: tokenContract } = await TokenContract.deploy(
382
+ wallet,
383
+ admin,
384
+ TOKEN_NAME,
385
+ TOKEN_SYMBOL,
386
+ TOKEN_DECIMALS,
387
+ ).send({
352
388
  from: admin,
353
389
  fee: {
354
390
  paymentMethod,
355
391
  },
356
- wait: { timeout: 600, returnReceipt: true },
392
+ wait: { timeout: 600 },
357
393
  });
358
394
 
359
395
  const tokenAddress = tokenContract.address;
@@ -404,7 +440,9 @@ export async function performTransfers({
404
440
 
405
441
  const provenTxs = await Promise.all(txs);
406
442
 
407
- await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600 } })));
443
+ // Wait only for the txs to be proposed, not checkpointed. This is enough to keep the chain
444
+ // loaded for the reorg scenario, and avoids each round blocking on the (slower) checkpoint lag.
445
+ await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600, waitForStatus: TxStatus.PROPOSED } })));
408
446
 
409
447
  logger.info(`Completed round ${i + 1} / ${rounds}`);
410
448
  }
@@ -431,6 +469,8 @@ export async function createWalletAndAztecNodeClient(
431
469
  proverEnabled,
432
470
  };
433
471
  const wallet = await TestWallet.create(aztecNode, pxeConfig);
472
+ // Remote JSON-RPC node: keep the 1s poll cadence rather than the in-process TestWallet fast default.
473
+ wallet.setDefaultWaitInterval(DefaultWaitOpts.interval);
434
474
 
435
475
  return {
436
476
  wallet,
@@ -1,6 +1,6 @@
1
1
  import type { AztecNode } from '@aztec/aztec.js/node';
2
2
  import type { Logger } from '@aztec/foundation/log';
3
- import type { L2Block } from '@aztec/stdlib/block';
3
+ import type { BlockResponse } from '@aztec/stdlib/interfaces/client';
4
4
  import type { TopicType } from '@aztec/stdlib/p2p';
5
5
  import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
6
6
 
@@ -134,9 +134,12 @@ export class ProvingMetrics {
134
134
 
135
135
  export type TxInclusionData = {
136
136
  txHash: string;
137
- sentAt: number;
138
- minedAt: number;
139
- attestedAt: number;
137
+ /** Wall-clock at client when the tx was submitted, in ms (Date.now()). */
138
+ sentAtMs: number;
139
+ /** Wall-clock at client when the block containing the tx first became visible, in ms (Date.now()). -1 if never observed. */
140
+ minedAtMs: number;
141
+ /** Reserved for future attestation-observed-at signal; -1 today. */
142
+ attestedAtMs: number;
140
143
  blocknumber: number;
141
144
  priorityFee: number;
142
145
  totalFee: number;
@@ -147,7 +150,7 @@ export type TxInclusionData = {
147
150
  export class TxInclusionMetrics {
148
151
  private data = new Map<string, TxInclusionData>();
149
152
  private groups = new Set<string>();
150
- private blocks = new Map<number, Promise<L2Block | undefined>>();
153
+ private blocks = new Map<number, Promise<BlockResponse<{ includeTransactions: true }> | undefined>>();
151
154
 
152
155
  private p2pGossipLatencyByTopic: Partial<Record<TopicType, { p50: number; p95: number }>> = {};
153
156
 
@@ -158,6 +161,7 @@ export class TxInclusionMetrics {
158
161
  private mempoolMinedDelay:
159
162
  | { txP50: number; txP95: number; attestationP50: number; attestationP95: number }
160
163
  | undefined;
164
+ private inclusionOutcome: { mined: number; failed: number } | undefined;
161
165
 
162
166
  constructor(
163
167
  private aztecNode: AztecNode,
@@ -174,9 +178,9 @@ export class TxInclusionMetrics {
174
178
 
175
179
  this.data.set(txHash, {
176
180
  txHash,
177
- sentAt: Math.trunc(Date.now() / 1000),
178
- minedAt: -1,
179
- attestedAt: -1,
181
+ sentAtMs: Date.now(),
182
+ minedAtMs: -1,
183
+ attestedAtMs: -1,
180
184
  blocknumber: -1,
181
185
  priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
182
186
  totalFee: -1,
@@ -186,6 +190,28 @@ export class TxInclusionMetrics {
186
190
  this.groups.add(group);
187
191
  }
188
192
 
193
+ /**
194
+ * Stamp mined-at metadata for any tracked tx contained in this block, using
195
+ * `observedAtMs` (caller-supplied wall-clock at the moment they first saw the
196
+ * block). Idempotent: existing minedAtMs is preserved so the first observer
197
+ * wins (typically the block-watcher; recordMinedTx is a fallback).
198
+ */
199
+ observeBlockForMinedTxs(
200
+ blockNumber: number,
201
+ txHashes: ReadonlyArray<{ toString(): string }>,
202
+ observedAtMs: number,
203
+ ): void {
204
+ txHashes.forEach((txHash, position) => {
205
+ const data = this.data.get(txHash.toString());
206
+ if (!data || data.minedAtMs !== -1) {
207
+ return;
208
+ }
209
+ data.blocknumber = blockNumber;
210
+ data.minedAtMs = observedAtMs;
211
+ data.positionInBlock = position;
212
+ });
213
+ }
214
+
189
215
  async recordMinedTx(txReceipt: TxReceipt): Promise<void> {
190
216
  const { txHash, blockNumber } = txReceipt;
191
217
  if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
@@ -197,26 +223,53 @@ export class TxInclusionMetrics {
197
223
  return;
198
224
  }
199
225
 
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
226
  const data = this.data.get(txHash.toString());
210
227
  if (!data) {
211
228
  const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
212
229
  this.logger?.warn(message, { txHash: txHash.toString(), blockNumber });
213
230
  throw new Error(message);
214
231
  }
215
- data.blocknumber = blockNumber;
216
- data.minedAt = Number(block.header.globalVariables.timestamp);
217
- data.attestedAt = -1;
218
232
  data.totalFee = Number(txReceipt.transactionFee ?? 0n);
219
- data.positionInBlock = block.body.txEffects.findIndex(txEffect => txEffect.txHash.equals(txHash));
233
+
234
+ // Fallback path for txs the block-watcher missed (e.g. observed only after
235
+ // the watcher stopped). Stamp with the block's L2 slot timestamp; this is
236
+ // earlier than the true client-observed time by attestation+propagation
237
+ // lag, but it's the only deterministic timestamp available post-hoc.
238
+ if (data.minedAtMs === -1) {
239
+ if (!this.blocks.has(blockNumber)) {
240
+ this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber, { includeTransactions: true }));
241
+ }
242
+ const block = await this.blocks.get(blockNumber)!;
243
+ if (!block) {
244
+ this.logger?.warn('Failed to load block for mined tx receipt', { txHash: txHash.toString(), blockNumber });
245
+ return;
246
+ }
247
+ data.blocknumber = blockNumber;
248
+ data.minedAtMs = Number(block.header.globalVariables.timestamp) * 1000;
249
+ data.positionInBlock = block.body.txEffects.findIndex(txEffect => txEffect.txHash.equals(txHash));
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Whether this tx was ever observed in a block (by the block-watcher or a mined receipt).
255
+ * Idempotent first-sighting semantics: a later reorg / pool eviction never clears it, so callers
256
+ * can treat "ever mined" as included regardless of what happens to the tx afterwards.
257
+ */
258
+ public wasMined(txHash: string): boolean {
259
+ const d = this.data.get(txHash);
260
+ return !!d && d.minedAtMs !== -1;
261
+ }
262
+
263
+ /** Per-tx inclusion records for a group. Used to serialise out for downstream tooling. */
264
+ getInclusionRecords(group?: string): TxInclusionData[] {
265
+ const out: TxInclusionData[] = [];
266
+ for (const tx of this.data.values()) {
267
+ if (group !== undefined && tx.group !== group) {
268
+ continue;
269
+ }
270
+ out.push({ ...tx });
271
+ }
272
+ return out;
220
273
  }
221
274
 
222
275
  public inclusionTimeInSeconds(group: string): {
@@ -229,12 +282,28 @@ export class TxInclusionMetrics {
229
282
  p99: number;
230
283
  } {
231
284
  const histogram = createHistogram({});
285
+ let nonPositive = 0;
232
286
  for (const tx of this.data.values()) {
233
- if (!tx.blocknumber || tx.group !== group || tx.minedAt === -1) {
287
+ if (!tx.blocknumber || tx.group !== group || tx.minedAtMs === -1) {
234
288
  continue;
235
289
  }
236
290
 
237
- histogram.record(tx.minedAt - tx.sentAt);
291
+ // Both timestamps are client wall-clock (ms). A negative delta should be
292
+ // impossible since the watcher stamps minedAtMs strictly after sentAtMs,
293
+ // but the fallback path (recordMinedTx via L2 slot timestamp) can stamp
294
+ // earlier than sentAtMs. perf_hooks.createHistogram rejects <=0; skip
295
+ // those instead of crashing.
296
+ const deltaMs = tx.minedAtMs - tx.sentAtMs;
297
+ if (deltaMs <= 0) {
298
+ nonPositive++;
299
+ continue;
300
+ }
301
+ // Histogram is recorded in seconds (rounded) to match the existing
302
+ // toGithubActionBenchmarkJSON output unit; per-tx records carry the raw ms.
303
+ histogram.record(Math.max(1, Math.round(deltaMs / 1000)));
304
+ }
305
+ if (nonPositive > 0) {
306
+ this.logger?.debug(`Dropped ${nonPositive} tx inclusion samples with non-positive delta`, { group });
238
307
  }
239
308
 
240
309
  if (histogram.count === 0) {
@@ -284,6 +353,11 @@ export class TxInclusionMetrics {
284
353
  this.mempoolMinedDelay = { txP50, txP95, attestationP50, attestationP95 };
285
354
  }
286
355
 
356
+ /** Mined vs failed counts for the high-value lane — recorded instead of asserting strict 1:1 inclusion. */
357
+ public recordInclusionOutcome(mined: number, failed: number): void {
358
+ this.inclusionOutcome = { mined, failed };
359
+ }
360
+
287
361
  toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> {
288
362
  const data: Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> = [];
289
363
  for (const group of this.groups) {
@@ -296,7 +370,7 @@ export class TxInclusionMetrics {
296
370
  value: stats.mean,
297
371
  },
298
372
  {
299
- name: `${group}/median_inclusion`,
373
+ name: `${group}/p50_inclusion`,
300
374
  unit: 's',
301
375
  value: stats.median,
302
376
  },
@@ -365,6 +439,16 @@ export class TxInclusionMetrics {
365
439
  );
366
440
  }
367
441
 
442
+ if (this.inclusionOutcome) {
443
+ const { mined, failed } = this.inclusionOutcome;
444
+ const total = mined + failed;
445
+ data.push(
446
+ { name: 'inclusion/mined_count', unit: 'count', value: mined },
447
+ { name: 'inclusion/failed_count', unit: 'count', value: failed },
448
+ { name: 'inclusion/success_ratio', unit: 'ratio', value: total > 0 ? mined / total : 0 },
449
+ );
450
+ }
451
+
368
452
  const scenario = process.env.BENCH_SCENARIO?.trim();
369
453
  if (!scenario) {
370
454
  return data;
@@ -8,6 +8,7 @@ const logger = createLogger('e2e:k8s-utils');
8
8
  const testConfigSchema = z.object({
9
9
  NAMESPACE: z.string().default('scenario'),
10
10
  REAL_VERIFIER: schemas.Boolean.optional().default(true),
11
+ DEBUG_FORCE_TX_PROOF_VERIFICATION: schemas.Boolean.optional().default(true),
11
12
  CREATE_ETH_DEVNET: schemas.Boolean.optional().default(false),
12
13
  L1_RPC_URLS_JSON: z.string().optional(),
13
14
  L1_ACCOUNT_MNEMONIC: z.string().optional(),
@@ -16,6 +17,7 @@ const testConfigSchema = z.object({
16
17
  AZTEC_PROOF_SUBMISSION_WINDOW: z.coerce.number().optional().default(5),
17
18
  AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: z.coerce.number().optional().default(2),
18
19
  FUNDING_PRIVATE_KEY: z.string().optional(),
20
+ AZTEC_ADMIN_API_KEY: z.string().optional(),
19
21
  });
20
22
 
21
23
  export type TestConfig = z.infer<typeof testConfigSchema>;
@@ -66,3 +66,6 @@ export { getPublicViemClient, getL1DeploymentAddresses, getNodeClient } from './
66
66
 
67
67
  // Health checks
68
68
  export { ChainHealth, type ChainHealthSnapshot } from './health.js';
69
+
70
+ // Pod log extraction
71
+ export { type BlockBuiltLogEntry, fetchBlockBuiltLogs } from './pod_logs.js';
@@ -71,7 +71,7 @@ export async function waitForProvenToAdvance(
71
71
  // Get current proven block number
72
72
  let initialProvenBlock: number;
73
73
  try {
74
- const tips = await node.getL2Tips();
74
+ const tips = await node.getChainTips();
75
75
  initialProvenBlock = Number(tips.proven.block.number);
76
76
  log.info(`Current proven block: ${initialProvenBlock}. Waiting for it to increase...`);
77
77
  } catch (err) {
@@ -82,7 +82,7 @@ export async function waitForProvenToAdvance(
82
82
  await retryUntil(
83
83
  async () => {
84
84
  try {
85
- const tips = await node.getL2Tips();
85
+ const tips = await node.getChainTips();
86
86
  const currentProvenBlock = Number(tips.proven.block.number);
87
87
  const proposedBlock = Number(tips.proposed.number);
88
88
 
@@ -173,7 +173,7 @@ export async function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNo
173
173
  if (statusRes.status !== 200) {
174
174
  throw new Error(`Admin endpoint returned status ${statusRes.status}`);
175
175
  }
176
- const client = createAztecNodeAdminClient(url);
176
+ const client = createAztecNodeAdminClient(url, {}, undefined, env.AZTEC_ADMIN_API_KEY);
177
177
  return { result: await fn(client), process };
178
178
  } catch (err) {
179
179
  // Kill the port-forward before retrying
@@ -255,21 +255,18 @@ export async function initHADb(namespace: string): Promise<void> {
255
255
  }
256
256
 
257
257
  /**
258
- * Enables or disables probabilistic transaction dropping on validators and waits for rollout.
259
- * Wired to env vars P2P_DROP_TX and P2P_DROP_TX_CHANCE via Helm values.
258
+ * Sets probabilistic transaction dropping on validators and waits for rollout.
259
+ * Use probability=0 to disable. Wired to env var P2P_DROP_TX_CHANCE via Helm values.
260
260
  */
261
261
  export async function setValidatorTxDrop({
262
262
  namespace,
263
- enabled,
264
263
  probability,
265
264
  logger: log,
266
265
  }: {
267
266
  namespace: string;
268
- enabled: boolean;
269
267
  probability: number;
270
268
  logger: Logger;
271
269
  }) {
272
- const drop = enabled ? 'true' : 'false';
273
270
  const prob = String(probability);
274
271
 
275
272
  const selectors = ['app.kubernetes.io/name=validator', 'app.kubernetes.io/component=validator', 'app=validator'];
@@ -284,7 +281,7 @@ export async function setValidatorTxDrop({
284
281
  if (names.length === 0) {
285
282
  continue;
286
283
  }
287
- const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace} P2P_DROP_TX=${drop} P2P_DROP_TX_CHANCE=${prob}`;
284
+ const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace} P2P_DROP_TX_CHANCE=${prob}`;
288
285
  log.info(`command: ${cmd}`);
289
286
  await execAsync(cmd);
290
287
  updated = true;
@@ -366,16 +363,24 @@ export async function enableValidatorDynamicBootNode(
366
363
  */
367
364
  export async function rollAztecPods(namespace: string, clearState: boolean = false) {
368
365
  // Pod components use 'validator', but StatefulSets and PVCs use 'sequencer-node' for validators
366
+ // RPC nodes have nodeType='rpc-node' in Helm values, so their component label is 'rpc-node' (not 'rpc')
369
367
  const podComponents = [
370
368
  'p2p-bootstrap',
371
369
  'prover-node',
372
370
  'prover-broker',
373
371
  'prover-agent',
374
372
  'sequencer-node',
375
- 'rpc',
373
+ 'rpc-node',
374
+ 'validator-ha-db',
375
+ ];
376
+ const pvcComponents = [
377
+ 'p2p-bootstrap',
378
+ 'prover-node',
379
+ 'prover-broker',
380
+ 'sequencer-node',
381
+ 'rpc-node',
376
382
  'validator-ha-db',
377
383
  ];
378
- const pvcComponents = ['p2p-bootstrap', 'prover-node', 'prover-broker', 'sequencer-node', 'rpc', 'validator-ha-db'];
379
384
  // StatefulSet components that need to be scaled down before PVC deletion
380
385
  // Note: validators use 'sequencer-node' as component label, not 'validator'
381
386
  const statefulSetComponents = [
@@ -383,7 +388,7 @@ export async function rollAztecPods(namespace: string, clearState: boolean = fal
383
388
  'prover-node',
384
389
  'prover-broker',
385
390
  'sequencer-node',
386
- 'rpc',
391
+ 'rpc-node',
387
392
  'validator-ha-db',
388
393
  ];
389
394
 
@@ -0,0 +1,99 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+
3
+ import { exec } from 'child_process';
4
+ import { promisify } from 'util';
5
+
6
+ import { getSequencers } from './nodes.js';
7
+
8
+ const execAsync = promisify(exec);
9
+
10
+ /** Parsed l2-block-built stats from a sequencer pod log line. */
11
+ export type BlockBuiltLogEntry = {
12
+ blockNumber: number;
13
+ txCount: number;
14
+ duration: number;
15
+ publicProcessDuration: number;
16
+ manaPerSec: number;
17
+ privateLogCount: number;
18
+ publicLogCount: number;
19
+ contractClassLogCount: number;
20
+ contractClassLogSize: number;
21
+ };
22
+
23
+ const FIELDS: (keyof BlockBuiltLogEntry)[] = [
24
+ 'blockNumber',
25
+ 'txCount',
26
+ 'duration',
27
+ 'publicProcessDuration',
28
+ 'manaPerSec',
29
+ 'privateLogCount',
30
+ 'publicLogCount',
31
+ 'contractClassLogCount',
32
+ 'contractClassLogSize',
33
+ ];
34
+
35
+ /**
36
+ * Fetches l2-block-built log entries from sequencer pods for given block numbers.
37
+ * Queries all validator pods (only the proposer will have the log for a given block).
38
+ *
39
+ * @param namespace - Kubernetes namespace
40
+ * @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
41
+ * @param blockNumbers - Set of block numbers to filter for
42
+ * @param logger - Logger instance
43
+ * @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
44
+ */
45
+ export async function fetchBlockBuiltLogs(
46
+ namespace: string,
47
+ sinceTime: string,
48
+ blockNumbers: Set<number>,
49
+ logger: Logger,
50
+ ): Promise<BlockBuiltLogEntry[]> {
51
+ const pods = await getSequencers(namespace);
52
+ const entriesByBlock = new Map<number, BlockBuiltLogEntry>();
53
+
54
+ // Subtract 60s from sinceTime to account for clock skew between test runner and k8s pods.
55
+ // Block number filtering ensures we only match the right blocks, so extra lines are harmless.
56
+ const sinceDate = new Date(new Date(sinceTime).getTime() - 60_000);
57
+ const sinceFlag = sinceDate.toISOString();
58
+
59
+ for (const pod of pods) {
60
+ try {
61
+ const cmd = `kubectl logs ${pod} -n ${namespace} -c aztec --since-time=${sinceFlag}`;
62
+ logger.info(`Fetching logs: ${cmd}`);
63
+ const { stdout } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024 });
64
+
65
+ const lines = stdout.split('\n');
66
+ const matchingLines = lines.filter(l => l.includes('l2-block-built'));
67
+ logger.info(`Pod ${pod}: ${lines.length} log lines, ${matchingLines.length} contain l2-block-built`);
68
+
69
+ for (const line of matchingLines) {
70
+ try {
71
+ const parsed = JSON.parse(line);
72
+ if (parsed.eventName !== 'l2-block-built' || !blockNumbers.has(parsed.blockNumber)) {
73
+ continue;
74
+ }
75
+ if (entriesByBlock.has(parsed.blockNumber)) {
76
+ continue;
77
+ }
78
+ const entry: BlockBuiltLogEntry = {} as BlockBuiltLogEntry;
79
+ for (const field of FIELDS) {
80
+ entry[field] = parsed[field] ?? 0;
81
+ }
82
+ entriesByBlock.set(entry.blockNumber, entry);
83
+ logger.verbose(`Parsed l2-block-built log for block ${entry.blockNumber}`, entry);
84
+ } catch {
85
+ // Not valid JSON, skip
86
+ }
87
+ }
88
+ } catch (err) {
89
+ logger.warn(`Failed to fetch logs from pod ${pod}: ${err}`);
90
+ }
91
+ }
92
+
93
+ if (entriesByBlock.size < blockNumbers.size) {
94
+ const missing = [...blockNumbers].filter(bn => !entriesByBlock.has(bn));
95
+ logger.warn(`Missing l2-block-built logs for block(s): ${missing.join(', ')}`);
96
+ }
97
+
98
+ return [...entriesByBlock.values()].sort((a, b) => a.blockNumber - b.blockNumber);
99
+ }