@aztec/end-to-end 0.0.1-commit.24de95ac → 0.0.1-commit.2606882

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 (299) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/benchmark.d.ts +17 -2
  3. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/benchmark.js +38 -1
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts +23 -17
  6. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  7. package/dest/bench/client_flows/client_flows_benchmark.js +143 -136
  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/client_flows/data_extractor.d.ts +1 -1
  12. package/dest/bench/client_flows/data_extractor.js +7 -27
  13. package/dest/bench/utils.d.ts +8 -7
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +33 -19
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +12 -10
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +120 -117
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +33 -16
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +124 -70
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +7 -6
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +20 -14
  25. package/dest/e2e_epochs/epochs_test.d.ts +49 -16
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +188 -64
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
  29. package/dest/e2e_fees/bridging_race.notest.js +5 -7
  30. package/dest/e2e_fees/fees_test.d.ts +25 -18
  31. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  32. package/dest/e2e_fees/fees_test.js +162 -141
  33. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  34. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  35. package/dest/e2e_l1_publisher/write_json.js +18 -19
  36. package/dest/e2e_multi_validator/utils.d.ts +1 -1
  37. package/dest/e2e_multi_validator/utils.js +1 -1
  38. package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -10
  39. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  40. package/dest/e2e_nested_contract/nested_contract_test.js +32 -40
  41. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  42. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  43. package/dest/e2e_p2p/inactivity_slash_test.js +11 -9
  44. package/dest/e2e_p2p/p2p_network.d.ts +237 -28
  45. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  46. package/dest/e2e_p2p/p2p_network.js +176 -129
  47. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  48. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  49. package/dest/e2e_p2p/reqresp/utils.js +206 -0
  50. package/dest/e2e_p2p/shared.d.ts +44 -15
  51. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  52. package/dest/e2e_p2p/shared.js +102 -68
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  54. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  55. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  56. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  57. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  58. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  59. package/dest/e2e_token_contract/token_contract_test.d.ts +20 -11
  60. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  61. package/dest/e2e_token_contract/token_contract_test.js +103 -93
  62. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  63. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  64. package/dest/fixtures/authwit_proxy.js +34 -0
  65. package/dest/fixtures/e2e_prover_test.d.ts +19 -24
  66. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  67. package/dest/fixtures/e2e_prover_test.js +126 -145
  68. package/dest/fixtures/elu_monitor.d.ts +21 -0
  69. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  70. package/dest/fixtures/elu_monitor.js +102 -0
  71. package/dest/fixtures/fixtures.d.ts +75 -3
  72. package/dest/fixtures/fixtures.d.ts.map +1 -1
  73. package/dest/fixtures/fixtures.js +73 -3
  74. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  75. package/dest/fixtures/get_acvm_config.js +1 -1
  76. package/dest/fixtures/get_bb_config.d.ts +1 -1
  77. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  78. package/dest/fixtures/get_bb_config.js +5 -5
  79. package/dest/fixtures/ha_setup.d.ts +71 -0
  80. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  81. package/dest/fixtures/ha_setup.js +116 -0
  82. package/dest/fixtures/index.d.ts +2 -1
  83. package/dest/fixtures/index.d.ts.map +1 -1
  84. package/dest/fixtures/index.js +1 -0
  85. package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
  86. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  87. package/dest/fixtures/l1_to_l2_messaging.js +2 -2
  88. package/dest/fixtures/logging.d.ts +1 -1
  89. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  90. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  91. package/dest/fixtures/schnorr_hardcoded_account_contract.js +37 -0
  92. package/dest/fixtures/setup.d.ts +272 -0
  93. package/dest/fixtures/setup.d.ts.map +1 -0
  94. package/dest/fixtures/setup.js +735 -0
  95. package/dest/fixtures/setup_p2p_test.d.ts +22 -11
  96. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  97. package/dest/fixtures/setup_p2p_test.js +57 -38
  98. package/dest/fixtures/token_utils.d.ts +6 -3
  99. package/dest/fixtures/token_utils.d.ts.map +1 -1
  100. package/dest/fixtures/token_utils.js +13 -9
  101. package/dest/fixtures/utils.d.ts +5 -192
  102. package/dest/fixtures/utils.d.ts.map +1 -1
  103. package/dest/fixtures/utils.js +4 -648
  104. package/dest/fixtures/web3signer.d.ts +1 -1
  105. package/dest/fixtures/web3signer.js +1 -1
  106. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  107. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  108. package/dest/fixtures/with_telemetry_utils.js +2 -2
  109. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  110. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  111. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  112. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  113. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  114. package/dest/forward-compatibility/wallet_service.js +109 -0
  115. package/dest/index.d.ts +1 -1
  116. package/dest/install_legacy_contracts.d.cts +10 -0
  117. package/dest/install_legacy_contracts.d.cts.map +1 -0
  118. package/dest/legacy-jest-resolver.d.cts +3 -0
  119. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  120. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  121. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  122. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  123. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  124. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  125. package/dest/quality_of_service/prometheus_client.js +67 -0
  126. package/dest/shared/cross_chain_test_harness.d.ts +9 -6
  127. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  128. package/dest/shared/cross_chain_test_harness.js +34 -30
  129. package/dest/shared/gas_portal_test_harness.d.ts +9 -6
  130. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  131. package/dest/shared/gas_portal_test_harness.js +21 -12
  132. package/dest/shared/index.d.ts +3 -2
  133. package/dest/shared/index.d.ts.map +1 -1
  134. package/dest/shared/index.js +1 -0
  135. package/dest/shared/jest_setup.d.ts +1 -1
  136. package/dest/shared/jest_setup.js +41 -1
  137. package/dest/shared/mock_state_view.d.ts +86 -0
  138. package/dest/shared/mock_state_view.d.ts.map +1 -0
  139. package/dest/shared/mock_state_view.js +186 -0
  140. package/dest/shared/submit-transactions.d.ts +4 -4
  141. package/dest/shared/submit-transactions.d.ts.map +1 -1
  142. package/dest/shared/submit-transactions.js +9 -11
  143. package/dest/shared/uniswap_l1_l2.d.ts +3 -27
  144. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  145. package/dest/shared/uniswap_l1_l2.js +87 -50
  146. package/dest/shared/wait_for_l1_to_l2_message.d.ts +13 -0
  147. package/dest/shared/wait_for_l1_to_l2_message.d.ts.map +1 -0
  148. package/dest/shared/wait_for_l1_to_l2_message.js +10 -0
  149. package/dest/simulators/index.d.ts +1 -1
  150. package/dest/simulators/lending_simulator.d.ts +11 -4
  151. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  152. package/dest/simulators/lending_simulator.js +32 -18
  153. package/dest/simulators/token_simulator.d.ts +1 -1
  154. package/dest/simulators/token_simulator.d.ts.map +1 -1
  155. package/dest/simulators/token_simulator.js +3 -24
  156. package/dest/spartan/setup_test_wallets.d.ts +18 -6
  157. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  158. package/dest/spartan/setup_test_wallets.js +159 -30
  159. package/dest/spartan/tx_metrics.d.ts +102 -0
  160. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  161. package/dest/spartan/tx_metrics.js +475 -0
  162. package/dest/spartan/utils/bot.d.ts +28 -0
  163. package/dest/spartan/utils/bot.d.ts.map +1 -0
  164. package/dest/spartan/utils/bot.js +142 -0
  165. package/dest/spartan/utils/chaos.d.ts +79 -0
  166. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  167. package/dest/spartan/utils/chaos.js +142 -0
  168. package/dest/spartan/utils/clients.d.ts +39 -0
  169. package/dest/spartan/utils/clients.d.ts.map +1 -0
  170. package/dest/spartan/utils/clients.js +90 -0
  171. package/dest/spartan/utils/config.d.ts +19 -0
  172. package/dest/spartan/utils/config.d.ts.map +1 -0
  173. package/dest/spartan/utils/config.js +23 -0
  174. package/dest/spartan/utils/health.d.ts +63 -0
  175. package/dest/spartan/utils/health.d.ts.map +1 -0
  176. package/dest/spartan/utils/health.js +202 -0
  177. package/dest/spartan/utils/helm.d.ts +15 -0
  178. package/dest/spartan/utils/helm.d.ts.map +1 -0
  179. package/dest/spartan/utils/helm.js +47 -0
  180. package/dest/spartan/utils/index.d.ts +11 -0
  181. package/dest/spartan/utils/index.d.ts.map +1 -0
  182. package/dest/spartan/utils/index.js +22 -0
  183. package/dest/spartan/utils/k8s.d.ts +128 -0
  184. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  185. package/dest/spartan/utils/k8s.js +381 -0
  186. package/dest/spartan/utils/nodes.d.ts +40 -0
  187. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  188. package/dest/spartan/utils/nodes.js +461 -0
  189. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  190. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  191. package/dest/spartan/utils/pod_logs.js +74 -0
  192. package/dest/spartan/utils/scripts.d.ts +30 -0
  193. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  194. package/dest/spartan/utils/scripts.js +81 -0
  195. package/dest/spartan/utils.d.ts +2 -218
  196. package/dest/spartan/utils.d.ts.map +1 -1
  197. package/dest/spartan/utils.js +1 -749
  198. package/dest/test-wallet/test_wallet.d.ts +85 -0
  199. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  200. package/dest/test-wallet/test_wallet.js +273 -0
  201. package/dest/test-wallet/utils.d.ts +41 -0
  202. package/dest/test-wallet/utils.d.ts.map +1 -0
  203. package/dest/test-wallet/utils.js +66 -0
  204. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  205. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  206. package/dest/test-wallet/wallet_worker_script.js +53 -0
  207. package/dest/test-wallet/worker_wallet.d.ts +53 -0
  208. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  209. package/dest/test-wallet/worker_wallet.js +155 -0
  210. package/dest/test-wallet/worker_wallet_schema.d.ts +160 -0
  211. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  212. package/dest/test-wallet/worker_wallet_schema.js +22 -0
  213. package/package.json +56 -46
  214. package/src/bench/client_flows/benchmark.ts +43 -2
  215. package/src/bench/client_flows/client_flows_benchmark.ts +203 -206
  216. package/src/bench/client_flows/config.ts +9 -1
  217. package/src/bench/client_flows/data_extractor.ts +6 -28
  218. package/src/bench/utils.ts +38 -22
  219. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +141 -152
  220. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +180 -127
  221. package/src/e2e_deploy_contract/deploy_test.ts +25 -17
  222. package/src/e2e_epochs/epochs_test.ts +254 -116
  223. package/src/e2e_fees/bridging_race.notest.ts +6 -12
  224. package/src/e2e_fees/fees_test.ts +215 -229
  225. package/src/e2e_l1_publisher/write_json.ts +20 -19
  226. package/src/e2e_multi_validator/utils.ts +1 -1
  227. package/src/e2e_nested_contract/nested_contract_test.ts +38 -56
  228. package/src/e2e_p2p/inactivity_slash_test.ts +12 -10
  229. package/src/e2e_p2p/p2p_network.ts +246 -201
  230. package/src/e2e_p2p/reqresp/utils.ts +274 -0
  231. package/src/e2e_p2p/shared.ts +132 -82
  232. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  233. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  234. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  235. package/src/e2e_token_contract/token_contract_test.ts +129 -117
  236. package/src/fixtures/authwit_proxy.ts +54 -0
  237. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  238. package/src/fixtures/e2e_prover_test.ts +154 -199
  239. package/src/fixtures/elu_monitor.ts +126 -0
  240. package/src/fixtures/fixtures.ts +95 -5
  241. package/src/fixtures/get_acvm_config.ts +1 -1
  242. package/src/fixtures/get_bb_config.ts +7 -6
  243. package/src/fixtures/ha_setup.ts +188 -0
  244. package/src/fixtures/index.ts +1 -0
  245. package/src/fixtures/l1_to_l2_messaging.ts +4 -2
  246. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  247. package/src/fixtures/setup.ts +1056 -0
  248. package/src/fixtures/setup_p2p_test.ts +70 -56
  249. package/src/fixtures/token_utils.ts +9 -8
  250. package/src/fixtures/utils.ts +29 -947
  251. package/src/fixtures/web3signer.ts +1 -1
  252. package/src/fixtures/with_telemetry_utils.ts +2 -2
  253. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  254. package/src/forward-compatibility/wallet_service.ts +104 -0
  255. package/src/guides/up_quick_start.sh +4 -6
  256. package/src/install_legacy_contracts.cjs +75 -0
  257. package/src/legacy-jest-resolver.cjs +112 -0
  258. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  259. package/src/quality_of_service/prometheus_client.ts +113 -0
  260. package/src/shared/cross_chain_test_harness.ts +37 -40
  261. package/src/shared/gas_portal_test_harness.ts +24 -14
  262. package/src/shared/index.ts +2 -1
  263. package/src/shared/jest_setup.ts +51 -1
  264. package/src/shared/mock_state_view.ts +188 -0
  265. package/src/shared/submit-transactions.ts +11 -16
  266. package/src/shared/uniswap_l1_l2.ts +142 -114
  267. package/src/shared/wait_for_l1_to_l2_message.ts +23 -0
  268. package/src/simulators/lending_simulator.ts +39 -19
  269. package/src/simulators/token_simulator.ts +6 -30
  270. package/src/spartan/DEVELOP.md +7 -0
  271. package/src/spartan/setup_test_wallets.ts +234 -32
  272. package/src/spartan/tx_metrics.ts +434 -0
  273. package/src/spartan/utils/bot.ts +188 -0
  274. package/src/spartan/utils/chaos.ts +253 -0
  275. package/src/spartan/utils/clients.ts +100 -0
  276. package/src/spartan/utils/config.ts +29 -0
  277. package/src/spartan/utils/health.ts +255 -0
  278. package/src/spartan/utils/helm.ts +84 -0
  279. package/src/spartan/utils/index.ts +71 -0
  280. package/src/spartan/utils/k8s.ts +535 -0
  281. package/src/spartan/utils/nodes.ts +543 -0
  282. package/src/spartan/utils/pod_logs.ts +99 -0
  283. package/src/spartan/utils/scripts.ts +99 -0
  284. package/src/spartan/utils.ts +1 -942
  285. package/src/test-wallet/test_wallet.ts +376 -0
  286. package/src/test-wallet/utils.ts +108 -0
  287. package/src/test-wallet/wallet_worker_script.ts +63 -0
  288. package/src/test-wallet/worker_wallet.ts +218 -0
  289. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  290. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  291. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  292. package/dest/fixtures/setup_l1_contracts.js +0 -17
  293. package/dest/fixtures/snapshot_manager.d.ts +0 -95
  294. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  295. package/dest/fixtures/snapshot_manager.js +0 -505
  296. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  297. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  298. package/src/fixtures/setup_l1_contracts.ts +0 -26
  299. package/src/fixtures/snapshot_manager.ts +0 -665
@@ -0,0 +1,206 @@
1
+ import { createLogger } from '@aztec/aztec.js/log';
2
+ import { waitForTx } from '@aztec/aztec.js/node';
3
+ import { Tx } from '@aztec/aztec.js/tx';
4
+ import { PROPOSER_PIPELINING_SLOT_OFFSET } from '@aztec/epoch-cache';
5
+ import { RollupContract } from '@aztec/ethereum/contracts';
6
+ import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
7
+ import { timesAsync } from '@aztec/foundation/collection';
8
+ import { retryUntil } from '@aztec/foundation/retry';
9
+ import { expect, jest } from '@jest/globals';
10
+ import fs from 'fs';
11
+ import os from 'os';
12
+ import path from 'path';
13
+ import { getBootNodeUdpPort, shouldCollectMetrics } from '../../fixtures/fixtures.js';
14
+ import { createNodes } from '../../fixtures/setup_p2p_test.js';
15
+ import { P2PNetworkTest } from '../p2p_network.js';
16
+ import { prepareTransactions } from '../shared.js';
17
+ // Don't set this to a higher value than 9 because each node will use a different L1 publisher account and anvil seeds
18
+ export const NUM_VALIDATORS = 6;
19
+ export const NUM_TXS_PER_NODE = 4;
20
+ export const BOOT_NODE_UDP_PORT = getBootNodeUdpPort();
21
+ export const createReqrespDataDir = ()=>fs.mkdtempSync(path.join(os.tmpdir(), 'reqresp-'));
22
+ export async function createReqrespTest(options = {}) {
23
+ const { disableStatusHandshake = false } = options;
24
+ const t = await P2PNetworkTest.create({
25
+ testName: 'e2e_p2p_reqresp_tx',
26
+ numberOfNodes: 0,
27
+ numberOfValidators: NUM_VALIDATORS,
28
+ basePort: BOOT_NODE_UDP_PORT,
29
+ // To collect metrics - run in aztec-packages `docker compose --profile metrics up`
30
+ metricsPort: shouldCollectMetrics(),
31
+ initialConfig: {
32
+ ethereumSlotDuration: 8,
33
+ aztecSlotDuration: 36,
34
+ blockDurationMs: 6000,
35
+ l1PublishingTime: 8,
36
+ minTxsPerBlock: 1,
37
+ maxTxsPerBlock: 2,
38
+ enforceTimeTable: true,
39
+ aztecProofSubmissionEpochs: 1024,
40
+ ...disableStatusHandshake ? {
41
+ p2pDisableStatusHandshake: true
42
+ } : {},
43
+ listenAddress: '127.0.0.1',
44
+ aztecEpochDuration: 64,
45
+ // Pipelining: target-slot is one ahead of build-slot; inboxLag sources L1->L2
46
+ // messages from the previous checkpoint to avoid L1ToL2MessagesNotReadyError.
47
+ inboxLag: 2
48
+ }
49
+ });
50
+ await t.setup();
51
+ await t.applyBaseSetup();
52
+ return t;
53
+ }
54
+ export async function cleanupReqrespTest(params) {
55
+ const { t, nodes, dataDir } = params;
56
+ if (nodes) {
57
+ await t.stopNodes(nodes);
58
+ }
59
+ await t.teardown();
60
+ for(let i = 0; i < NUM_VALIDATORS; i++){
61
+ fs.rmSync(`${dataDir}-${i}`, {
62
+ recursive: true,
63
+ force: true,
64
+ maxRetries: 3
65
+ });
66
+ }
67
+ }
68
+ const getNodePort = (nodeIndex)=>BOOT_NODE_UDP_PORT + 1 + nodeIndex;
69
+ export async function runReqrespTxTest(params) {
70
+ const { t, dataDir, disableStatusHandshake = false } = params;
71
+ if (!t.bootstrapNodeEnr) {
72
+ throw new Error('Bootstrap node ENR is not available');
73
+ }
74
+ t.logger.info('Creating nodes');
75
+ const aztecNodeConfig = disableStatusHandshake ? {
76
+ ...t.ctx.aztecNodeConfig,
77
+ p2pDisableStatusHandshake: true
78
+ } : t.ctx.aztecNodeConfig;
79
+ const nodes = await createNodes(aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_VALIDATORS, BOOT_NODE_UDP_PORT, t.genesis, dataDir, shouldCollectMetrics());
80
+ t.logger.info('Waiting for nodes to connect');
81
+ await t.waitForP2PMeshConnectivity(nodes, NUM_VALIDATORS);
82
+ await t.setupAccount();
83
+ const targetBlockNumber = await t.ctx.aztecNodeService.getBlockNumber();
84
+ await retryUntil(async ()=>{
85
+ const blockNumbers = await Promise.all(nodes.map((node)=>node.getBlockNumber()));
86
+ return blockNumbers.every((blockNumber)=>blockNumber >= targetBlockNumber) ? true : undefined;
87
+ }, `validators to sync to L2 block ${targetBlockNumber}`, 60, 0.5);
88
+ t.logger.info('Preparing transactions to send');
89
+ const txBatches = await timesAsync(2, ()=>prepareTransactions(t.logger, t.ctx.aztecNodeService, NUM_TXS_PER_NODE, t.fundedAccount));
90
+ t.logger.info('Removing initial node');
91
+ await t.removeInitialNode();
92
+ t.logger.info('Starting fresh slot');
93
+ const [timestamp] = await t.ctx.cheatCodes.rollup.advanceToNextSlot();
94
+ t.ctx.dateProvider.setTime(Number(timestamp) * 1000);
95
+ const startSlotTimestamp = BigInt(timestamp);
96
+ // Under pipelining the active builder during wallclock slot S targets slot S+1, so
97
+ // we must address the proposer of S+1 (not S) for batch 0. Shift the proposer lookup
98
+ // window by the pipelining offset so we always send to the currently-building proposer.
99
+ const proposerSlotOffset = PROPOSER_PIPELINING_SLOT_OFFSET;
100
+ const { proposerIndexes, nodesToTurnOffTxGossip } = await getProposerIndexes(t, startSlotTimestamp, proposerSlotOffset);
101
+ t.logger.info(`Turning off tx gossip for nodes: ${nodesToTurnOffTxGossip.map(getNodePort)}`);
102
+ t.logger.info(`Sending txs to proposer nodes: ${proposerIndexes.map(getNodePort)}`);
103
+ // Replace the p2p node implementation of some of the nodes with a spy such that it does not store transactions that are gossiped to it
104
+ // Original implementation of `handleGossipedTx` will store received transactions in the tx pool.
105
+ // We chose the first 2 nodes that will be the proposers for the next few slots
106
+ for (const nodeIndex of nodesToTurnOffTxGossip){
107
+ const logger = createLogger(`p2p:${getNodePort(nodeIndex)}`);
108
+ jest.spyOn(nodes[nodeIndex].p2pClient.p2pService, 'handleGossipedTx').mockImplementation((payloadData)=>{
109
+ const txHash = Tx.fromBuffer(payloadData).getTxHash();
110
+ logger.info(`Skipping storage of gossiped transaction ${txHash.toString()}`);
111
+ return Promise.resolve();
112
+ });
113
+ }
114
+ // We send the tx to the proposer nodes directly, ignoring the pxe and node in each context
115
+ // We cannot just call tx.send since they were created using a pxe wired to the first node which is now stopped
116
+ t.logger.info('Sending transactions through proposer nodes');
117
+ const submittedTxs = await Promise.all(txBatches.map(async (batch, batchIndex)=>{
118
+ const proposerNode = nodes[proposerIndexes[batchIndex]];
119
+ for (const tx of batch){
120
+ t.logger.info(`Tx ${tx.getTxHash().toString()} base64: ${tx.toBuffer().toString('base64')}`);
121
+ }
122
+ const txHashes = batch.map((tx)=>tx.getTxHash().toString());
123
+ t.logger.info(`Sending batch ${batchIndex} to proposer ${getNodePort(proposerIndexes[batchIndex])}: ${txHashes.join(', ')}`);
124
+ await Promise.all(batch.map(async (tx)=>{
125
+ try {
126
+ await proposerNode.sendTx(tx);
127
+ } catch (err) {
128
+ t.logger.error(`Error sending tx: ${err}`);
129
+ throw err;
130
+ }
131
+ }));
132
+ return batch.map((tx)=>({
133
+ node: proposerNode,
134
+ txHash: tx.getTxHash()
135
+ }));
136
+ }));
137
+ // Log pool state per node after sending
138
+ for(let i = 0; i < NUM_VALIDATORS; i++){
139
+ const count = await nodes[i].getPendingTxCount();
140
+ t.logger.info(`Node ${getNodePort(i)} pool has ${count} pending txs`);
141
+ }
142
+ // Use the test's own aztecSlotDuration (not the env default that p2p_network's
143
+ // WAIT_FOR_TX_TIMEOUT is derived from) so the timeout scales with this test's 36s slot.
144
+ // Under pipelining the round-trip is roughly build-slot + target-slot + L1 publish, so
145
+ // budget for >= 3 slots.
146
+ const waitForTxTimeout = t.ctx.aztecNodeConfig.aztecSlotDuration * 4.5;
147
+ t.logger.info('Waiting for all transactions to be mined');
148
+ await Promise.all(submittedTxs.flatMap((batch, batchIndex)=>batch.map(async (submittedTx, txIndex)=>{
149
+ t.logger.info(`Waiting for tx ${batchIndex}-${txIndex} ${submittedTx.txHash.toString()} to be mined`);
150
+ await waitForTx(submittedTx.node, submittedTx.txHash, {
151
+ timeout: waitForTxTimeout
152
+ });
153
+ t.logger.info(`Tx ${batchIndex}-${txIndex} ${submittedTx.txHash.toString()} has been mined`);
154
+ })));
155
+ t.logger.info('All transactions mined');
156
+ // Assert that multiple blocks were built for at least one slot
157
+ t.logger.info('Verifying multiple blocks for at least one checkpoint');
158
+ // Wait for L1 checkpoint sync, which may lag behind P2P block propagation.
159
+ const checkpoints = await retryUntil(async ()=>{
160
+ const cps = await nodes[0].getCheckpoints(CheckpointNumber(1), 50, {
161
+ includeBlocks: true
162
+ });
163
+ return cps.length > 0 && cps.some((cp)=>(cp.blocks?.length ?? 0) >= 2) ? cps : undefined;
164
+ }, 'waiting for multi-block checkpoint to sync from L1', 30, 1);
165
+ let mbpsFound = false;
166
+ let expectedBlockNumber = checkpoints[0].blocks[0].number;
167
+ for (const published of checkpoints){
168
+ const blocks = published.blocks;
169
+ const blockCount = blocks.length;
170
+ mbpsFound = mbpsFound || blockCount >= 2;
171
+ for(let i = 0; i < blockCount; i++){
172
+ const block = blocks[i];
173
+ expect(block.indexWithinCheckpoint).toBe(i);
174
+ expect(block.checkpointNumber).toBe(published.number);
175
+ expect(block.number).toBe(expectedBlockNumber);
176
+ expectedBlockNumber++;
177
+ }
178
+ }
179
+ expect(mbpsFound).toBe(true);
180
+ return nodes;
181
+ }
182
+ async function getProposerIndexes(t, startSlotTimestamp, slotOffset = 0) {
183
+ // Get the nodes for the next set of slots
184
+ const rollupContract = new RollupContract(t.ctx.deployL1ContractsValues.l1Client, t.ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress);
185
+ const attesters = await rollupContract.getAttesters();
186
+ const startSlot = await rollupContract.getSlotAt(startSlotTimestamp);
187
+ const proposers = await Promise.all(Array.from({
188
+ length: 3
189
+ }, async (_, i)=>{
190
+ const slot = SlotNumber(startSlot + slotOffset + i);
191
+ const slotTimestamp = await rollupContract.getTimestampForSlot(slot);
192
+ return await rollupContract.getProposerAt(slotTimestamp);
193
+ }));
194
+ // Get the indexes of the nodes that are responsible for the next two slots
195
+ const proposerIndexes = proposers.map((proposer)=>attesters.findIndex((a)=>a.equals(proposer)));
196
+ if (proposerIndexes.some((i)=>i === -1)) {
197
+ throw new Error(`Proposer index not found for proposer ` + `(proposers=${proposers.map((p)=>p.toString()).join(',')}, indices=${proposerIndexes.join(',')})`);
198
+ }
199
+ const nodesToTurnOffTxGossip = Array.from({
200
+ length: NUM_VALIDATORS
201
+ }, (_, i)=>i).filter((i)=>!proposerIndexes.includes(i));
202
+ return {
203
+ proposerIndexes,
204
+ nodesToTurnOffTxGossip
205
+ };
206
+ }
@@ -1,25 +1,55 @@
1
1
  import type { InitialAccountData } from '@aztec/accounts/testing';
2
2
  import type { AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
- import { type SentTx } from '@aztec/aztec.js/contracts';
5
4
  import type { Logger } from '@aztec/aztec.js/log';
6
- import { Tx } from '@aztec/aztec.js/tx';
5
+ import { TxHash } from '@aztec/aztec.js/tx';
7
6
  import type { RollupCheatCodes } from '@aztec/aztec/testing';
8
- import type { EmpireSlashingProposerContract, RollupContract, TallySlashingProposerContract } from '@aztec/ethereum';
7
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
8
+ import type { RollupContract, SlashingProposerContract } from '@aztec/ethereum/contracts';
9
+ import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
10
+ import { EthAddress } from '@aztec/foundation/eth-address';
9
11
  import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
10
12
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
11
- import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
13
+ import { type ProvenTx } from '../test-wallet/utils.js';
12
14
  export declare const submitComplexTxsTo: (logger: Logger, from: AztecAddress, spamContract: SpamContract, numTxs: number, opts?: {
13
- callPublic?: boolean;
14
- }) => Promise<SentTx[]>;
15
- export declare const submitTransactions: (logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData) => Promise<SentTx[]>;
16
- export declare function prepareTransactions(logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData): Promise<Tx[]>;
17
- export declare function awaitProposalExecution(slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract, timeoutSeconds: number, logger: Logger): Promise<bigint>;
18
- export declare function awaitCommitteeExists({ rollup, logger, }: {
15
+ callPublic?: boolean | undefined;
16
+ }) => Promise<TxHash[]>;
17
+ export declare const submitTransactions: (logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData) => Promise<TxHash[]>;
18
+ export declare function prepareTransactions(logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData): Promise<ProvenTx[]>;
19
+ export declare function awaitProposalExecution(slashingProposer: SlashingProposerContract, timeoutSeconds: number, logger: Logger): Promise<bigint>;
20
+ export declare function awaitCommitteeExists({ rollup, logger }: {
19
21
  rollup: RollupContract;
20
22
  logger: Logger;
21
23
  }): Promise<readonly `0x${string}`[]>;
22
- export declare function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSize, epochDuration, waitUntilOffenseCount, timeoutSeconds, }: {
24
+ /**
25
+ * Advance epochs until we find one where the target proposer is selected for a slot at least
26
+ * `warmupSlots` into the epoch, then stop one epoch before it. This leaves time for the caller to
27
+ * start sequencers before warping to the target epoch, avoiding the race where the target epoch
28
+ * passes before sequencers are ready.
29
+ *
30
+ * The first `warmupSlots` slots of the epoch are skipped on purpose. Callers warp to one slot
31
+ * before the target epoch and, under proposer pipelining, the proposer begins building one slot
32
+ * before its proposal slot. If the proposer were in the first slot of the epoch, that build would
33
+ * begin at the exact instant of the warp, leaving the freshly-started sequencer no warm-up margin;
34
+ * it then serializes its (often AVM-heavy) proposal past the slot boundary and honest receivers
35
+ * reject it as late. Picking a slot at least `warmupSlots` into the epoch guarantees that many full
36
+ * slots of wall-clock between the warp and the start of the proposer's build.
37
+ *
38
+ * Returns the target epoch and the concrete target slot so the caller can warp to it after starting
39
+ * sequencers.
40
+ */
41
+ export declare function advanceToEpochBeforeProposer({ epochCache, cheatCodes, targetProposer, logger, maxAttempts, warmupSlots }: {
42
+ epochCache: EpochCacheInterface;
43
+ cheatCodes: RollupCheatCodes;
44
+ targetProposer: EthAddress;
45
+ logger: Logger;
46
+ maxAttempts?: number;
47
+ warmupSlots?: number;
48
+ }): Promise<{
49
+ targetEpoch: EpochNumber;
50
+ targetSlot: SlotNumber;
51
+ }>;
52
+ export declare function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSize, epochDuration, waitUntilOffenseCount, timeoutSeconds }: {
23
53
  nodeAdmin: AztecNodeAdmin;
24
54
  logger: Logger;
25
55
  slashingRoundSize: number;
@@ -31,16 +61,15 @@ export declare function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundS
31
61
  * Await the committee to be slashed out of the validator set.
32
62
  * Currently assumes that the committee is the same size as the validator set.
33
63
  */
34
- export declare function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashFactory, slashingProposer, slashingRoundSize, aztecSlotDuration, aztecEpochDuration, logger, offenseEpoch, }: {
64
+ export declare function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashingProposer, slashingRoundSize, aztecSlotDuration, aztecEpochDuration, logger, offenseEpoch }: {
35
65
  rollup: RollupContract;
36
66
  cheatCodes: RollupCheatCodes;
37
67
  committee: readonly `0x${string}`[];
38
- slashFactory: SlashFactoryContract;
39
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
68
+ slashingProposer: SlashingProposerContract | undefined;
40
69
  slashingRoundSize: number;
41
70
  aztecSlotDuration: number;
42
71
  aztecEpochDuration: number;
43
72
  logger: Logger;
44
73
  offenseEpoch: number;
45
74
  }): Promise<void>;
46
- //# sourceMappingURL=shared.d.ts.map
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZTJlX3AycC9zaGFyZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSXZFLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBS3RFLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBb0IsTUFBTSx5QkFBeUIsQ0FBQztBQUcxRSxlQUFPLE1BQU0sa0JBQWtCOzt1QkFrQjlCLENBQUM7QUFHRixlQUFPLE1BQU0sa0JBQWtCLGtIQXNCOUIsQ0FBQztBQUVGLHdCQUFzQixtQkFBbUIsQ0FDdkMsTUFBTSxFQUFFLE1BQU0sRUFDZCxJQUFJLEVBQUUsZ0JBQWdCLEVBQ3RCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsYUFBYSxFQUFFLGtCQUFrQixHQUNoQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0E2QnJCO0FBRUQsd0JBQWdCLHNCQUFzQixDQUNwQyxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFDMUMsY0FBYyxFQUFFLE1BQU0sRUFDdEIsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsTUFBTSxDQUFDLENBY2pCO0FBRUQsd0JBQXNCLG9CQUFvQixDQUFDLEVBQ3pDLE1BQU0sRUFDTixNQUFNLEVBQ1AsRUFBRTtJQUNELE1BQU0sRUFBRSxjQUFjLENBQUM7SUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNoQixHQUFHLE9BQU8sQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQWFwQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsd0JBQXNCLDRCQUE0QixDQUFDLEVBQ2pELFVBQVUsRUFDVixVQUFVLEVBQ1YsY0FBYyxFQUNkLE1BQU0sRUFDTixXQUFnQixFQUNoQixXQUFlLEVBQ2hCLEVBQUU7SUFDRCxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsVUFBVSxFQUFFLGdCQUFnQixDQUFDO0lBQzdCLGNBQWMsRUFBRSxVQUFVLENBQUM7SUFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixXQUFXLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDdEIsR0FBRyxPQUFPLENBQUM7SUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0lBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQTtDQUFFLENBQUMsQ0FpQ2hFO0FBRUQsd0JBQXNCLG9CQUFvQixDQUFDLEVBQ3pDLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsY0FBb0IsRUFDckIsRUFBRTtJQUNELFNBQVMsRUFBRSxjQUFjLENBQUM7SUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUMxQixhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHFCQUFxQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQy9CLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUN6QiwrQ0FrQkE7QUFFRDs7O0dBR0c7QUFDSCx3QkFBc0Isb0JBQW9CLENBQUMsRUFDekMsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixZQUFZLEVBQ2IsRUFBRTtJQUNELE1BQU0sRUFBRSxjQUFjLENBQUM7SUFDdkIsVUFBVSxFQUFFLGdCQUFnQixDQUFDO0lBQzdCLFNBQVMsRUFBRSxTQUFTLEtBQUssTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNwQyxnQkFBZ0IsRUFBRSx3QkFBd0IsR0FBRyxTQUFTLENBQUM7SUFDdkQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO0lBQzFCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUMxQixrQkFBa0IsRUFBRSxNQUFNLENBQUM7SUFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLFlBQVksRUFBRSxNQUFNLENBQUM7Q0FDdEIsaUJBMERBIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/shared.ts"],"names":[],"mappings":"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"}
@@ -1,32 +1,29 @@
1
- import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
1
+ import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
2
2
  import { Fr } from '@aztec/aztec.js/fields';
3
- import { TxStatus } from '@aztec/aztec.js/tx';
3
+ import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
4
4
  import { timesAsync, unique } from '@aztec/foundation/collection';
5
5
  import { retryUntil } from '@aztec/foundation/retry';
6
6
  import { pluralize } from '@aztec/foundation/string';
7
7
  import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.js/Test';
8
8
  import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
9
9
  import { getRoundForOffense } from '@aztec/slasher';
10
- import { TestWallet, proveInteraction } from '@aztec/test-wallet/server';
10
+ import { SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
11
11
  import { submitTxsTo } from '../shared/submit-transactions.js';
12
+ import { TestWallet } from '../test-wallet/test_wallet.js';
13
+ import { proveInteraction } from '../test-wallet/utils.js';
12
14
  // submits a set of transactions to the provided Private eXecution Environment (PXE)
13
15
  export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opts = {})=>{
14
16
  const txs = [];
15
17
  const seed = 1234n;
16
18
  const spamCount = 15;
17
19
  for(let i = 0; i < numTxs; i++){
18
- const tx = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic).send({
19
- from
20
+ const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
21
+ const { txHash } = await method.send({
22
+ from,
23
+ wait: NO_WAIT
20
24
  });
21
- const txHash = await tx.getTxHash();
22
25
  logger.info(`Tx sent with hash ${txHash.toString()}`);
23
- const receipt = await tx.getReceipt();
24
- expect(receipt).toEqual(expect.objectContaining({
25
- status: TxStatus.PENDING,
26
- error: ''
27
- }));
28
- logger.info(`Receipt received for ${txHash.toString()}`);
29
- txs.push(tx);
26
+ txs.push(txHash);
30
27
  }
31
28
  return txs;
32
29
  };
@@ -34,13 +31,21 @@ export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opt
34
31
  export const submitTransactions = async (logger, node, numTxs, fundedAccount)=>{
35
32
  const rpcConfig = getRpcConfig();
36
33
  rpcConfig.proverEnabled = false;
37
- const wallet = await TestWallet.create(node, {
34
+ const wallet = await TestWallet.create(node, // Use checkpointed chain tip to avoid anchoring on provisional blocks that the archiver can prune
35
+ // when their slot ends without a checkpoint landing on L1.
36
+ {
38
37
  ...getPXEConfig(),
39
- proverEnabled: false
38
+ proverEnabled: false,
39
+ syncChainTip: 'checkpointed'
40
40
  }, {
41
- useLogSuffix: true
41
+ loggerActorLabel: 'pxe-tx'
42
+ });
43
+ const contract = new SchnorrHardcodedKeyAccountContract();
44
+ const fundedAccountManager = await wallet.createAccount({
45
+ secret: fundedAccount.secret,
46
+ salt: fundedAccount.salt,
47
+ contract
42
48
  });
43
- const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
44
49
  return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
45
50
  };
46
51
  export async function prepareTransactions(logger, node, numTxs, fundedAccount) {
@@ -48,22 +53,27 @@ export async function prepareTransactions(logger, node, numTxs, fundedAccount) {
48
53
  rpcConfig.proverEnabled = false;
49
54
  const wallet = await TestWallet.create(node, {
50
55
  ...getPXEConfig(),
51
- proverEnabled: false
56
+ proverEnabled: false,
57
+ syncChainTip: 'checkpointed'
52
58
  }, {
53
- useLogSuffix: true
59
+ loggerActorLabel: 'pxe-tx'
60
+ });
61
+ const accountContract = new SchnorrHardcodedKeyAccountContract();
62
+ const fundedAccountManager = await wallet.createAccount({
63
+ secret: fundedAccount.secret,
64
+ salt: fundedAccount.salt,
65
+ contract: accountContract
54
66
  });
55
- const fundedAccountManager = await wallet.createSchnorrAccount(fundedAccount.secret, fundedAccount.salt);
56
67
  const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
57
68
  salt: Fr.random()
58
69
  });
59
70
  await wallet.registerContract(testContractInstance, TestContractArtifact);
60
- const contract = await TestContract.at(testContractInstance.address, wallet);
71
+ const contract = TestContract.at(testContractInstance.address, wallet);
61
72
  return timesAsync(numTxs, async ()=>{
62
73
  const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
63
74
  from: fundedAccountManager.address
64
75
  });
65
- const txHash = tx.getTxHash();
66
- logger.info(`Tx prepared with hash ${txHash}`);
76
+ logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
67
77
  return tx;
68
78
  });
69
79
  }
@@ -73,24 +83,12 @@ export function awaitProposalExecution(slashingProposer, timeoutSeconds, logger)
73
83
  logger.warn(`Timed out waiting for proposal execution`);
74
84
  reject(new Error(`Timeout waiting for proposal execution after ${timeoutSeconds}s`));
75
85
  }, timeoutSeconds * 1000);
76
- if (slashingProposer.type === 'empire') {
77
- const unwatch = slashingProposer.listenToPayloadSubmitted((args)=>{
78
- logger.warn(`Proposal ${args.payload} from round ${args.round} executed`);
79
- clearTimeout(timeout);
80
- unwatch();
81
- resolve(args.round);
82
- });
83
- } else if (slashingProposer.type === 'tally') {
84
- const unwatch = slashingProposer.listenToRoundExecuted((args)=>{
85
- logger.warn(`Slash from round ${args.round} executed`);
86
- clearTimeout(timeout);
87
- unwatch();
88
- resolve(args.round);
89
- });
90
- } else {
86
+ const unwatch = slashingProposer.listenToRoundExecuted((args)=>{
87
+ logger.warn(`Slash from round ${args.round} executed`);
91
88
  clearTimeout(timeout);
92
- reject(new Error(`Unknown slashing proposer type: ${slashingProposer.type}`));
93
- }
89
+ unwatch();
90
+ resolve(args.round);
91
+ });
94
92
  });
95
93
  }
96
94
  export async function awaitCommitteeExists({ rollup, logger }) {
@@ -100,7 +98,54 @@ export async function awaitCommitteeExists({ rollup, logger }) {
100
98
  committee = await rollup.getCurrentEpochCommittee();
101
99
  return committee && committee.length > 0;
102
100
  }, 'non-empty committee', 60);
103
- return committee;
101
+ logger.warn(`Committee has been formed`, {
102
+ committee: committee.map((c)=>c.toString())
103
+ });
104
+ return committee.map((c)=>c.toString());
105
+ }
106
+ /**
107
+ * Advance epochs until we find one where the target proposer is selected for a slot at least
108
+ * `warmupSlots` into the epoch, then stop one epoch before it. This leaves time for the caller to
109
+ * start sequencers before warping to the target epoch, avoiding the race where the target epoch
110
+ * passes before sequencers are ready.
111
+ *
112
+ * The first `warmupSlots` slots of the epoch are skipped on purpose. Callers warp to one slot
113
+ * before the target epoch and, under proposer pipelining, the proposer begins building one slot
114
+ * before its proposal slot. If the proposer were in the first slot of the epoch, that build would
115
+ * begin at the exact instant of the warp, leaving the freshly-started sequencer no warm-up margin;
116
+ * it then serializes its (often AVM-heavy) proposal past the slot boundary and honest receivers
117
+ * reject it as late. Picking a slot at least `warmupSlots` into the epoch guarantees that many full
118
+ * slots of wall-clock between the warp and the start of the proposer's build.
119
+ *
120
+ * Returns the target epoch and the concrete target slot so the caller can warp to it after starting
121
+ * sequencers.
122
+ */ export async function advanceToEpochBeforeProposer({ epochCache, cheatCodes, targetProposer, logger, maxAttempts = 20, warmupSlots = 1 }) {
123
+ const { epochDuration } = await cheatCodes.getConfig();
124
+ for(let attempt = 0; attempt < maxAttempts; attempt++){
125
+ const currentEpoch = await cheatCodes.getEpoch();
126
+ // Check the NEXT epoch's slots so we stay one epoch before the target,
127
+ // giving the caller time to start sequencers before the target epoch arrives.
128
+ const nextEpoch = Number(currentEpoch) + 1;
129
+ const epochStartSlot = nextEpoch * Number(epochDuration);
130
+ // Skip the first `warmupSlots` slots so the caller keeps a warm-up margin after warping to one
131
+ // slot before the epoch (see the doc comment above).
132
+ const startSlot = epochStartSlot + warmupSlots;
133
+ const endSlot = epochStartSlot + Number(epochDuration);
134
+ logger.info(`Checking next epoch ${nextEpoch} (slots ${startSlot}-${endSlot - 1}) for proposer ${targetProposer} (current epoch: ${currentEpoch})`);
135
+ for(let s = startSlot; s < endSlot; s++){
136
+ const proposer = await epochCache.getProposerAttesterAddressInSlot(SlotNumber(s));
137
+ if (proposer && proposer.equals(targetProposer)) {
138
+ logger.warn(`Found target proposer ${targetProposer} in slot ${s} of epoch ${nextEpoch}. Staying at epoch ${currentEpoch} to allow sequencer startup.`);
139
+ return {
140
+ targetEpoch: EpochNumber(nextEpoch),
141
+ targetSlot: SlotNumber(s)
142
+ };
143
+ }
144
+ }
145
+ logger.info(`Target proposer not found in epoch ${nextEpoch}, advancing to next epoch`);
146
+ await cheatCodes.advanceToNextEpoch();
147
+ }
148
+ throw new Error(`Target proposer ${targetProposer} not found in any slot after ${maxAttempts} epoch attempts`);
104
149
  }
105
150
  export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSize, epochDuration, waitUntilOffenseCount, timeoutSeconds = 120 }) {
106
151
  const targetOffenseCount = waitUntilOffenseCount ?? 1;
@@ -122,42 +167,31 @@ export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSiz
122
167
  /**
123
168
  * Await the committee to be slashed out of the validator set.
124
169
  * Currently assumes that the committee is the same size as the validator set.
125
- */ export async function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashFactory, slashingProposer, slashingRoundSize, aztecSlotDuration, aztecEpochDuration, logger, offenseEpoch }) {
170
+ */ export async function awaitCommitteeKicked({ rollup, cheatCodes, committee, slashingProposer, slashingRoundSize, aztecSlotDuration, aztecEpochDuration, logger, offenseEpoch }) {
126
171
  if (!slashingProposer) {
127
172
  throw new Error('No slashing proposer configured. Cannot test slashing.');
128
173
  }
129
174
  await cheatCodes.debugRollup();
130
- if (slashingProposer.type === 'empire') {
131
- // Await for the slash payload to be created if empire (no payload is created on tally until execution time)
132
- const targetEpoch = await cheatCodes.getEpoch() + await rollup.getLagInEpochs() + 1n;
133
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
134
- await cheatCodes.advanceToEpoch(targetEpoch);
135
- const slashPayloadEvents = await retryUntil(async ()=>{
136
- const events = await slashFactory.getSlashPayloadCreatedEvents();
137
- return events.length > 0 ? events : undefined;
138
- }, 'slash payload created', 120, 1);
139
- expect(slashPayloadEvents.length).toBe(1);
140
- // The uniqueness check is needed since a validator may be slashed more than once on the same round (eg because they let two epochs be pruned)
141
- expect(unique(slashPayloadEvents[0].slashes.map((slash)=>slash.validator.toString()))).toHaveLength(committee.length);
142
- } else {
143
- // Use the slash offset to ensure we are in the right epoch for tally
144
- const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
145
- const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
146
- const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
147
- const firstEpochInOffenseRound = offenseEpoch - offenseEpoch % slashingRoundSizeInEpochs;
148
- const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
149
- logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
150
- await cheatCodes.advanceToEpoch(targetEpoch, {
151
- offset: -aztecSlotDuration / 2
152
- });
153
- }
175
+ // Use the slash offset to ensure we are in the right epoch for tally
176
+ const slashOffsetInRounds = await slashingProposer.getSlashOffsetInRounds();
177
+ const slashingRoundSizeInEpochs = slashingRoundSize / aztecEpochDuration;
178
+ const slashingOffsetInEpochs = Number(slashOffsetInRounds) * slashingRoundSizeInEpochs;
179
+ const firstEpochInOffenseRound = offenseEpoch - offenseEpoch % slashingRoundSizeInEpochs;
180
+ const targetEpoch = firstEpochInOffenseRound + slashingOffsetInEpochs;
181
+ logger.info(`Advancing to epoch ${targetEpoch} so we start slashing`);
182
+ await cheatCodes.advanceToEpoch(EpochNumber(targetEpoch), {
183
+ offset: -aztecSlotDuration / 2
184
+ });
154
185
  const attestersPre = await rollup.getAttesters();
155
186
  expect(attestersPre.length).toBe(committee.length);
156
187
  for (const attester of attestersPre){
157
188
  const attesterInfo = await rollup.getAttesterView(attester);
158
189
  expect(attesterInfo.status).toEqual(1); // Validating
159
190
  }
160
- const timeout = slashingRoundSize * 2 * aztecSlotDuration + 30;
191
+ // Allow up to four round-lengths so that under proposer pipelining, where individual rounds
192
+ // sometimes fail to gather quorum because parts of the committee miss votes due to chain-state
193
+ // races, we still see a later round execute the slash.
194
+ const timeout = slashingRoundSize * 4 * aztecSlotDuration + 30;
161
195
  logger.info(`Waiting for slash to be executed (timeout ${timeout}s)`);
162
196
  await awaitProposalExecution(slashingProposer, timeout, logger);
163
197
  // The attesters should still form the committee but they should be reduced to the "living" status
@@ -172,7 +206,7 @@ export async function awaitOffenseDetected({ logger, nodeAdmin, slashingRoundSiz
172
206
  }
173
207
  logger.info(`Advancing to check current committee`);
174
208
  await cheatCodes.debugRollup();
175
- await cheatCodes.advanceToEpoch(await cheatCodes.getEpoch() + await rollup.getLagInEpochs() + 1n);
209
+ await cheatCodes.advanceToEpoch(EpochNumber(await cheatCodes.getEpoch() + await rollup.getLagInEpochsForValidatorSet() + 1));
176
210
  await cheatCodes.debugRollup();
177
211
  const committeeNextEpoch = await rollup.getCurrentEpochCommittee();
178
212
  // The committee should be undefined, since the validator set is empty
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZV9wcm9vZl9mZXRjaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZTJlX3N0b3JhZ2VfcHJvb2YvZml4dHVyZXMvc3RvcmFnZV9wcm9vZl9mZXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage_proof_fetcher.d.ts","sourceRoot":"","sources":["../../../src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts"],"names":[],"mappings":""}