@aztec/end-to-end 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/README.md +203 -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 +18 -40
  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 +22 -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 +1 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +3 -1
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +4 -4
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +31 -19
  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 +95 -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 +12 -9
  40. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  41. package/dest/fixtures/e2e_prover_test.js +47 -28
  42. package/dest/fixtures/fixtures.d.ts +19 -10
  43. package/dest/fixtures/fixtures.d.ts.map +1 -1
  44. package/dest/fixtures/fixtures.js +26 -11
  45. package/dest/fixtures/ha_setup.d.ts +3 -3
  46. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  47. package/dest/fixtures/ha_setup.js +4 -1
  48. package/dest/fixtures/index.d.ts +2 -1
  49. package/dest/fixtures/index.d.ts.map +1 -1
  50. package/dest/fixtures/index.js +1 -0
  51. package/dest/fixtures/setup.d.ts +38 -41
  52. package/dest/fixtures/setup.d.ts.map +1 -1
  53. package/dest/fixtures/setup.js +181 -228
  54. package/dest/fixtures/setup_p2p_test.d.ts +1 -1
  55. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  56. package/dest/fixtures/setup_p2p_test.js +3 -3
  57. package/dest/fixtures/timing.d.ts +42 -0
  58. package/dest/fixtures/timing.d.ts.map +1 -0
  59. package/dest/fixtures/timing.js +72 -0
  60. package/dest/fixtures/token_utils.d.ts +22 -4
  61. package/dest/fixtures/token_utils.d.ts.map +1 -1
  62. package/dest/fixtures/token_utils.js +21 -1
  63. package/dest/fixtures/utils.d.ts +2 -2
  64. package/dest/fixtures/utils.d.ts.map +1 -1
  65. package/dest/fixtures/utils.js +1 -1
  66. package/dest/fixtures/wait_helpers.d.ts +135 -0
  67. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  68. package/dest/fixtures/wait_helpers.js +154 -0
  69. package/dest/forward-compatibility/wallet_service.js +3 -3
  70. package/dest/multi-node/block-production/setup.d.ts +97 -0
  71. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  72. package/dest/multi-node/block-production/setup.js +158 -0
  73. package/dest/multi-node/governance/setup.d.ts +67 -0
  74. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  75. package/dest/multi-node/governance/setup.js +126 -0
  76. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  77. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  78. package/dest/multi-node/multi_node_test_context.js +347 -0
  79. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  80. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  81. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  82. package/dest/multi-node/slashing/setup.d.ts +167 -0
  83. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  84. package/dest/multi-node/slashing/setup.js +275 -0
  85. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +10 -2
  86. package/dest/p2p/p2p_network.d.ts.map +1 -0
  87. package/dest/{e2e_p2p → p2p}/p2p_network.js +39 -15
  88. package/dest/p2p/reqresp/utils.d.ts +19 -0
  89. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  90. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +4 -17
  91. package/dest/p2p/shared.d.ts +72 -0
  92. package/dest/p2p/shared.d.ts.map +1 -0
  93. package/dest/p2p/shared.js +212 -0
  94. package/dest/shared/cross_chain_test_harness.d.ts +3 -3
  95. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  96. package/dest/shared/cross_chain_test_harness.js +16 -15
  97. package/dest/shared/gas_portal_test_harness.d.ts +1 -1
  98. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  99. package/dest/shared/gas_portal_test_harness.js +8 -5
  100. package/dest/shared/submit-transactions.d.ts +1 -1
  101. package/dest/shared/submit-transactions.d.ts.map +1 -1
  102. package/dest/shared/submit-transactions.js +12 -5
  103. package/dest/shared/timing_env.d.js +5 -0
  104. package/dest/shared/timing_env.js +365 -0
  105. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  106. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  107. package/dest/shared/uniswap_l1_l2.js +1 -6
  108. package/dest/shared/wait_for_l1_to_l2_message.js +1 -1
  109. package/dest/simulators/lending_simulator.js +1 -1
  110. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  111. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  112. package/dest/single-node/cross-chain/cross_chain_messaging_test.js +209 -0
  113. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  114. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  115. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  116. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  117. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  118. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  119. package/dest/single-node/fees/fees_test.d.ts +93 -0
  120. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  121. package/dest/{e2e_fees → single-node/fees}/fees_test.js +48 -55
  122. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  123. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  124. package/dest/single-node/l1-reorgs/setup.js +57 -0
  125. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  126. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  127. package/dest/single-node/partial-proofs/setup.js +5 -0
  128. package/dest/single-node/proving/setup.d.ts +5 -0
  129. package/dest/single-node/proving/setup.d.ts.map +1 -0
  130. package/dest/single-node/proving/setup.js +5 -0
  131. package/dest/single-node/recovery/setup.d.ts +5 -0
  132. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  133. package/dest/single-node/recovery/setup.js +5 -0
  134. package/dest/single-node/setup.d.ts +49 -0
  135. package/dest/single-node/setup.d.ts.map +1 -0
  136. package/dest/single-node/setup.js +56 -0
  137. package/dest/single-node/single_node_test_context.d.ts +360 -0
  138. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  139. package/dest/single-node/single_node_test_context.js +833 -0
  140. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  141. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  142. package/dest/spartan/setup_test_wallets.js +19 -9
  143. package/dest/spartan/tx_metrics.d.ts +10 -1
  144. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  145. package/dest/spartan/tx_metrics.js +32 -0
  146. package/dest/test-wallet/test_wallet.d.ts +23 -3
  147. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  148. package/dest/test-wallet/test_wallet.js +56 -9
  149. package/dest/test-wallet/utils.d.ts +36 -1
  150. package/dest/test-wallet/utils.d.ts.map +1 -1
  151. package/dest/test-wallet/utils.js +64 -4
  152. package/dest/test-wallet/wallet_worker_script.js +5 -2
  153. package/dest/test-wallet/worker_wallet.d.ts +5 -5
  154. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  155. package/dest/test-wallet/worker_wallet.js +5 -3
  156. package/dest/test-wallet/worker_wallet_schema.d.ts +3 -159
  157. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -1
  158. package/dest/test-wallet/worker_wallet_schema.js +2 -1
  159. package/package.json +41 -41
  160. package/src/automine/README.md +60 -0
  161. package/src/automine/automine_test_context.ts +153 -0
  162. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  163. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  164. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +20 -57
  165. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +24 -57
  166. package/src/automine/token/token_test_helpers.ts +138 -0
  167. package/src/bench/client_flows/benchmark.ts +3 -1
  168. package/src/bench/client_flows/client_flows_benchmark.ts +45 -26
  169. package/src/bench/client_flows/data_extractor.ts +1 -0
  170. package/src/bench/utils.ts +109 -6
  171. package/src/composed/ha/ha_full_setup.ts +466 -0
  172. package/src/fixtures/e2e_prover_test.ts +58 -47
  173. package/src/fixtures/fixtures.ts +28 -11
  174. package/src/fixtures/ha_setup.ts +7 -3
  175. package/src/fixtures/index.ts +1 -0
  176. package/src/fixtures/setup.ts +220 -289
  177. package/src/fixtures/setup_p2p_test.ts +3 -3
  178. package/src/fixtures/timing.ts +97 -0
  179. package/src/fixtures/token_utils.ts +39 -4
  180. package/src/fixtures/utils.ts +0 -3
  181. package/src/fixtures/wait_helpers.ts +333 -0
  182. package/src/forward-compatibility/wallet_service.ts +6 -4
  183. package/src/guides/up_quick_start.sh +5 -0
  184. package/src/infra/README.md +12 -0
  185. package/src/multi-node/README.md +95 -0
  186. package/src/multi-node/block-production/setup.ts +272 -0
  187. package/src/multi-node/governance/setup.ts +172 -0
  188. package/src/multi-node/multi_node_test_context.ts +447 -0
  189. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  190. package/src/multi-node/slashing/setup.ts +433 -0
  191. package/src/p2p/README.md +78 -0
  192. package/src/{e2e_p2p → p2p}/p2p_network.ts +38 -13
  193. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +5 -16
  194. package/src/p2p/shared.ts +329 -0
  195. package/src/shared/cross_chain_test_harness.ts +21 -10
  196. package/src/shared/gas_portal_test_harness.ts +13 -5
  197. package/src/shared/submit-transactions.ts +13 -5
  198. package/src/shared/timing_env.d.mts +39 -0
  199. package/src/shared/timing_env.mjs +363 -0
  200. package/src/shared/uniswap_l1_l2.ts +1 -8
  201. package/src/shared/wait_for_l1_to_l2_message.ts +1 -1
  202. package/src/simulators/lending_simulator.ts +1 -1
  203. package/src/single-node/README.md +60 -0
  204. package/src/single-node/cross-chain/cross_chain_messaging_test.ts +302 -0
  205. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  206. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  207. package/src/{e2e_fees → single-node/fees}/fees_test.ts +69 -65
  208. package/src/single-node/l1-reorgs/setup.ts +93 -0
  209. package/src/single-node/partial-proofs/setup.ts +8 -0
  210. package/src/single-node/proving/setup.ts +15 -0
  211. package/src/single-node/recovery/setup.ts +8 -0
  212. package/src/single-node/setup.ts +63 -0
  213. package/src/single-node/single_node_test_context.ts +1041 -0
  214. package/src/spartan/setup_test_wallets.ts +24 -9
  215. package/src/spartan/tx_metrics.ts +26 -0
  216. package/src/test-wallet/test_wallet.ts +60 -10
  217. package/src/test-wallet/utils.ts +102 -5
  218. package/src/test-wallet/wallet_worker_script.ts +6 -3
  219. package/src/test-wallet/worker_wallet.ts +10 -12
  220. package/src/test-wallet/worker_wallet_schema.ts +3 -2
  221. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -56
  222. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  223. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -58
  224. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  225. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +0 -161
  226. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -37
  227. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  228. package/dest/e2e_deploy_contract/deploy_test.js +0 -51
  229. package/dest/e2e_epochs/epochs_test.d.ts +0 -125
  230. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  231. package/dest/e2e_epochs/epochs_test.js +0 -460
  232. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  233. package/dest/e2e_fees/fees_test.d.ts +0 -91
  234. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  235. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  236. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  237. package/dest/e2e_l1_publisher/write_json.js +0 -56
  238. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  239. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  240. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -26
  241. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  242. package/dest/e2e_nested_contract/nested_contract_test.js +0 -55
  243. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  244. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  245. package/dest/e2e_p2p/inactivity_slash_test.js +0 -137
  246. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  247. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  248. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  249. package/dest/e2e_p2p/shared.d.ts +0 -75
  250. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  251. package/dest/e2e_p2p/shared.js +0 -217
  252. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  253. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  254. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  255. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  256. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  257. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +0 -231
  258. package/src/e2e_deploy_contract/deploy_test.ts +0 -86
  259. package/src/e2e_epochs/epochs_test.ts +0 -575
  260. package/src/e2e_l1_publisher/write_json.ts +0 -77
  261. package/src/e2e_nested_contract/nested_contract_test.ts +0 -77
  262. package/src/e2e_p2p/inactivity_slash_test.ts +0 -180
  263. package/src/e2e_p2p/shared.ts +0 -332
  264. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  265. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  266. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  267. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  268. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  269. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  270. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -19,7 +19,10 @@ import { tryStop } from '@aztec/stdlib/interfaces/server';
19
19
  import { TopicType } from '@aztec/stdlib/p2p';
20
20
  import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
21
21
  import { getGenesisValues } from '@aztec/world-state/testing';
22
+ import fs from 'fs';
22
23
  import getPort from 'get-port';
24
+ import os from 'os';
25
+ import path from 'path';
23
26
  import { getAddress, getContract } from 'viem';
24
27
  import { privateKeyToAccount } from 'viem/accounts';
25
28
  import { SCHNORR_HARDCODED_PRIVATE_KEY, SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
@@ -59,6 +62,8 @@ export class P2PNetworkTest {
59
62
  defaultAccountAddress;
60
63
  spamContract;
61
64
  bootstrapNode;
65
+ // Root temp directory holding every node's data dir. Created in setup(), removed in teardown().
66
+ dataDir;
62
67
  // Store setup options for use in setup()
63
68
  setupOptions;
64
69
  deployL1ContractsArgs;
@@ -92,7 +97,6 @@ export class P2PNetworkTest {
92
97
  slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
93
98
  aztecTargetCommitteeSize: numberOfValidators,
94
99
  metricsPort: metricsPort,
95
- numberOfInitialFundedAccounts: 2,
96
100
  startProverNode
97
101
  };
98
102
  this.deployL1ContractsArgs = {
@@ -124,6 +128,17 @@ export class P2PNetworkTest {
124
128
  }
125
129
  return this.hardcodedAccountData;
126
130
  }
131
+ /**
132
+ * Returns a per-role data directory nested under this test's root data dir. The multi-node factories
133
+ * (`createNodes`) append `-<index>` to this base for each node they spawn; single-node factories
134
+ * (`createProverNode`, `createNonValidatorNode`, `createNode`) use it verbatim. Everything lives under
135
+ * `this.dataDir`, so a single recursive remove in teardown() cleans up all of it.
136
+ */ dataDirFor(label) {
137
+ if (!this.dataDir) {
138
+ throw new Error('Call setup to initialize the data directory.');
139
+ }
140
+ return path.join(this.dataDir, label);
141
+ }
127
142
  async addBootstrapNode() {
128
143
  this.logger.info('Adding bootstrap node');
129
144
  const telemetry = await getEndToEndTestTelemetryClient(this.metricsPort);
@@ -250,6 +265,7 @@ export class P2PNetworkTest {
250
265
  }
251
266
  async setup() {
252
267
  this.logger.info('Setting up subsystems from fresh');
268
+ this.dataDir = fs.mkdtempSync(path.join(os.tmpdir(), `${this.testName}-`));
253
269
  // Pre-compute hardcoded account data so it gets funded in genesis.
254
270
  const contract = new SchnorrHardcodedKeyAccountContract();
255
271
  const secret = Fr.random();
@@ -260,15 +276,14 @@ export class P2PNetworkTest {
260
276
  signingKey: SCHNORR_HARDCODED_PRIVATE_KEY,
261
277
  address: await getAccountContractAddress(contract, secret, salt)
262
278
  };
263
- // Generate regular Schnorr accounts for tests that need deployable accounts (e.g. add_rollup).
264
- const regularAccounts = await generateSchnorrAccounts(this.setupOptions.numberOfInitialFundedAccounts ?? 2);
279
+ // Generate funded (initializerless) Schnorr accounts for tests that create accounts from them (e.g. add_rollup).
280
+ const fundedAccounts = await generateSchnorrAccounts(2);
265
281
  this.context = await setup(0, {
266
282
  ...this.setupOptions,
267
283
  fundSponsoredFPC: true,
268
- skipAccountDeployment: true,
269
284
  skipInitialSequencer: true,
270
- initialFundedAccounts: [
271
- ...regularAccounts,
285
+ additionallyFundedAccounts: [
286
+ ...fundedAccounts,
272
287
  this.hardcodedAccountData
273
288
  ],
274
289
  slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
@@ -281,7 +296,7 @@ export class P2PNetworkTest {
281
296
  this.ctx = this.context;
282
297
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
283
298
  const initialFundedAccounts = [
284
- ...this.context.initialFundedAccounts.map((a)=>a.address),
299
+ ...this.context.additionallyFundedAccounts.map((a)=>a.address),
285
300
  sponsoredFPCAddress
286
301
  ];
287
302
  const { genesis } = await getGenesisValues(initialFundedAccounts, undefined, undefined, this.context.genesis.genesisTimestamp);
@@ -310,7 +325,7 @@ export class P2PNetworkTest {
310
325
  * @param checkIntervalSeconds - How often to check connectivity (default: 0.1 seconds)
311
326
  */ async waitForP2PMeshConnectivity(nodes, expectedNodeCount, timeoutSeconds = 30, checkIntervalSeconds = 0.1, topics = [
312
327
  TopicType.tx
313
- ]) {
328
+ ], minMeshPeerCount = 1) {
314
329
  const nodeCount = expectedNodeCount ?? nodes.length;
315
330
  const minPeerCount = nodeCount - 1;
316
331
  this.logger.warn(`Waiting for all ${nodeCount} nodes to connect to P2P mesh (at least ${minPeerCount} peers each)...`);
@@ -323,26 +338,35 @@ export class P2PNetworkTest {
323
338
  }, `Node ${index} to connect to at least ${minPeerCount} peers`, timeoutSeconds, checkIntervalSeconds);
324
339
  }));
325
340
  this.logger.warn('All nodes connected to P2P mesh');
326
- // Wait for GossipSub mesh to form for all specified topics.
327
- // We only require at least 1 mesh peer per node because GossipSub
328
- // stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
341
+ // Wait for the GossipSub mesh to form for all specified topics. By default we only require at
342
+ // least 1 mesh peer per node, since GossipSub stops grafting once it reaches Dlo peers and won't
343
+ // fill the mesh to every available peer. Callers that need a proposal to reach the whole
344
+ // committee within a slot (e.g. quorum-from-genesis tests) raise `minMeshPeerCount` so the mesh
345
+ // is fully formed — a single mesh peer can leave some committee members unreached at first.
329
346
  for (const topic of topics){
330
- this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
347
+ this.logger.warn(`Waiting for GossipSub mesh (>= ${minMeshPeerCount} peers per node) for ${topic} topic...`);
331
348
  await Promise.all(nodes.map(async (node, index)=>{
332
349
  const p2p = node.getP2P();
333
350
  await retryUntil(async ()=>{
334
351
  const meshPeers = await p2p.getGossipMeshPeerCount(topic);
335
352
  this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
336
- return meshPeers >= 1 ? true : undefined;
337
- }, `Node ${index} to have gossip mesh peers for ${topic} topic`, timeoutSeconds, checkIntervalSeconds);
353
+ return meshPeers >= minMeshPeerCount ? true : undefined;
354
+ }, `Node ${index} to have >= ${minMeshPeerCount} gossip mesh peers for ${topic} topic`, timeoutSeconds, checkIntervalSeconds);
338
355
  }));
339
- this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
356
+ this.logger.warn(`All nodes have >= ${minMeshPeerCount} gossip mesh peers for ${topic} topic`);
340
357
  }
341
358
  }
342
359
  async teardown() {
343
360
  await this.monitor.stop();
344
361
  await tryStop(this.bootstrapNode, this.logger);
345
362
  await teardown(this.context);
363
+ if (this.dataDir) {
364
+ fs.rmSync(this.dataDir, {
365
+ recursive: true,
366
+ force: true,
367
+ maxRetries: 3
368
+ });
369
+ }
346
370
  }
347
371
  async getContracts() {
348
372
  if (!this.ctx.deployL1ContractsValues) {
@@ -0,0 +1,19 @@
1
+ import type { AztecNodeService } from '@aztec/aztec-node';
2
+ import { P2PNetworkTest } from '../p2p_network.js';
3
+ export declare const NUM_VALIDATORS = 6;
4
+ export declare const NUM_TXS_PER_NODE = 4;
5
+ export declare const BOOT_NODE_UDP_PORT: number;
6
+ type ReqrespOptions = {
7
+ disableStatusHandshake?: boolean;
8
+ };
9
+ export declare function createReqrespTest(options?: ReqrespOptions): Promise<P2PNetworkTest>;
10
+ export declare function cleanupReqrespTest(params: {
11
+ t: P2PNetworkTest;
12
+ nodes?: AztecNodeService[];
13
+ }): Promise<void>;
14
+ export declare function runReqrespTxTest(params: {
15
+ t: P2PNetworkTest;
16
+ disableStatusHandshake?: boolean;
17
+ }): Promise<AztecNodeService[]>;
18
+ export {};
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wMnAvcmVxcmVzcC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBYzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUluRCxlQUFPLE1BQU0sY0FBYyxJQUFJLENBQUM7QUFDaEMsZUFBTyxNQUFNLGdCQUFnQixJQUFJLENBQUM7QUFDbEMsZUFBTyxNQUFNLGtCQUFrQixRQUF1QixDQUFDO0FBRXZELEtBQUssY0FBYyxHQUFHO0lBQ3BCLHNCQUFzQixDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQ2xDLENBQUM7QUFFRix3QkFBc0IsaUJBQWlCLENBQUMsT0FBTyxHQUFFLGNBQW1CLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQTJCN0Y7QUFFRCx3QkFBc0Isa0JBQWtCLENBQUMsTUFBTSxFQUFFO0lBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQztJQUFDLEtBQUssQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUE7Q0FBRSxpQkFNakc7QUFJRCx3QkFBc0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0lBQzdDLENBQUMsRUFBRSxjQUFjLENBQUM7SUFDbEIsc0JBQXNCLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDbEMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQWlLOUIifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/p2p/reqresp/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAc1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,KAAK,cAAc,GAAG;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2B7F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAAE,iBAMjG;AAID,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,CAAC,EAAE,cAAc,CAAC;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiK9B"}
@@ -7,9 +7,6 @@ import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
7
7
  import { timesAsync } from '@aztec/foundation/collection';
8
8
  import { retryUntil } from '@aztec/foundation/retry';
9
9
  import { expect, jest } from '@jest/globals';
10
- import fs from 'fs';
11
- import os from 'os';
12
- import path from 'path';
13
10
  import { getBootNodeUdpPort, shouldCollectMetrics } from '../../fixtures/fixtures.js';
14
11
  import { createNodes } from '../../fixtures/setup_p2p_test.js';
15
12
  import { P2PNetworkTest } from '../p2p_network.js';
@@ -18,7 +15,6 @@ import { prepareTransactions } from '../shared.js';
18
15
  export const NUM_VALIDATORS = 6;
19
16
  export const NUM_TXS_PER_NODE = 4;
20
17
  export const BOOT_NODE_UDP_PORT = getBootNodeUdpPort();
21
- export const createReqrespDataDir = ()=>fs.mkdtempSync(path.join(os.tmpdir(), 'reqresp-'));
22
18
  export async function createReqrespTest(options = {}) {
23
19
  const { disableStatusHandshake = false } = options;
24
20
  const t = await P2PNetworkTest.create({
@@ -29,13 +25,11 @@ export async function createReqrespTest(options = {}) {
29
25
  // To collect metrics - run in aztec-packages `docker compose --profile metrics up`
30
26
  metricsPort: shouldCollectMetrics(),
31
27
  initialConfig: {
32
- ethereumSlotDuration: 8,
28
+ ethereumSlotDuration: 12,
33
29
  aztecSlotDuration: 36,
34
30
  blockDurationMs: 6000,
35
- l1PublishingTime: 8,
36
31
  minTxsPerBlock: 1,
37
32
  maxTxsPerBlock: 2,
38
- enforceTimeTable: true,
39
33
  aztecProofSubmissionEpochs: 1024,
40
34
  ...disableStatusHandshake ? {
41
35
  p2pDisableStatusHandshake: true
@@ -52,22 +46,15 @@ export async function createReqrespTest(options = {}) {
52
46
  return t;
53
47
  }
54
48
  export async function cleanupReqrespTest(params) {
55
- const { t, nodes, dataDir } = params;
49
+ const { t, nodes } = params;
56
50
  if (nodes) {
57
51
  await t.stopNodes(nodes);
58
52
  }
59
53
  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
54
  }
68
55
  const getNodePort = (nodeIndex)=>BOOT_NODE_UDP_PORT + 1 + nodeIndex;
69
56
  export async function runReqrespTxTest(params) {
70
- const { t, dataDir, disableStatusHandshake = false } = params;
57
+ const { t, disableStatusHandshake = false } = params;
71
58
  if (!t.bootstrapNodeEnr) {
72
59
  throw new Error('Bootstrap node ENR is not available');
73
60
  }
@@ -76,7 +63,7 @@ export async function runReqrespTxTest(params) {
76
63
  ...t.ctx.aztecNodeConfig,
77
64
  p2pDisableStatusHandshake: true
78
65
  } : t.ctx.aztecNodeConfig;
79
- const nodes = await createNodes(aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_VALIDATORS, BOOT_NODE_UDP_PORT, t.genesis, dataDir, shouldCollectMetrics());
66
+ const nodes = await createNodes(aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_VALIDATORS, BOOT_NODE_UDP_PORT, t.genesis, t.dataDirFor('validator'), shouldCollectMetrics());
80
67
  t.logger.info('Waiting for nodes to connect');
81
68
  await t.waitForP2PMeshConnectivity(nodes, NUM_VALIDATORS);
82
69
  await t.setupAccount();
@@ -0,0 +1,72 @@
1
+ import type { InitialAccountData } from '@aztec/accounts/testing';
2
+ import type { Archiver } from '@aztec/archiver';
3
+ import type { AztecNodeService } from '@aztec/aztec-node';
4
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
5
+ import type { Logger } from '@aztec/aztec.js/log';
6
+ import { TxHash } from '@aztec/aztec.js/tx';
7
+ import type { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
8
+ import { type TopicType } from '@aztec/stdlib/p2p';
9
+ import { type ProvenTx } from '../test-wallet/utils.js';
10
+ import { type P2PNetworkTest } from './p2p_network.js';
11
+ /** One published checkpoint as returned by the archiver, including its attestations. */
12
+ type PublishedCheckpoint = Awaited<ReturnType<Archiver['getCheckpoints']>>[number];
13
+ export declare const submitComplexTxsTo: (logger: Logger, from: AztecAddress, spamContract: SpamContract, numTxs: number, opts?: {
14
+ callPublic?: boolean | undefined;
15
+ }) => Promise<TxHash[]>;
16
+ export declare const submitTransactions: (logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData) => Promise<TxHash[]>;
17
+ export declare function prepareTransactions(logger: Logger, node: AztecNodeService, numTxs: number, fundedAccount: InitialAccountData): Promise<ProvenTx[]>;
18
+ /** Runs the shared p2p QoS Grafana alert check when CHECK_ALERTS=true; a no-op otherwise. */
19
+ export declare function maybeCheckQosAlerts(logger: Logger): Promise<void>;
20
+ /** Waits until every node's synced block number reaches the initial node's current tip. */
21
+ export declare function waitForNodesToSync(t: P2PNetworkTest, nodes: AztecNodeService[]): Promise<void>;
22
+ /** Reads the published checkpoint containing the block that mined the given tx. */
23
+ export declare function getPublishedCheckpointForTx(node: AztecNodeService, txHash: TxHash): Promise<PublishedCheckpoint>;
24
+ /** Polls until the archiver has indexed the first published checkpoint, then returns it. */
25
+ export declare function waitForFirstPublishedCheckpoint(t: P2PNetworkTest, nodes: AztecNodeService[], timeoutSeconds?: number): Promise<PublishedCheckpoint>;
26
+ /**
27
+ * Recovers the attestation signers from a published checkpoint and asserts each one belongs to the
28
+ * validator set formed by the given nodes. Returns the recovered signer addresses so callers can add
29
+ * scenario-specific assertions (e.g. an exact signer count).
30
+ */
31
+ export declare function verifyAttestationSigners(t: P2PNetworkTest, nodes: AztecNodeService[], publishedCheckpoint: PublishedCheckpoint): Promise<string[]>;
32
+ /** Options that parameterize {@link runGossipScenario}. */
33
+ export interface GossipScenarioOptions {
34
+ /** The initialized P2P network test (setup() + validator registration already done). */
35
+ t: P2PNetworkTest;
36
+ /** Number of validator nodes forming the committee. */
37
+ numValidators: number;
38
+ /** Base UDP port for the validator nodes. */
39
+ bootNodePort: number;
40
+ /** Transactions submitted per validator node; 0 skips tx submission entirely (e.g. the oracle test). */
41
+ txsPerNode: number;
42
+ /** Submit tx batches sequentially instead of concurrently. */
43
+ submitSequentially?: boolean;
44
+ /** Overrides for the P2P mesh-connectivity wait; unset fields fall back to waitForP2PMeshConnectivity defaults. */
45
+ mesh?: {
46
+ expectedNodeCount?: number;
47
+ timeoutSeconds?: number;
48
+ checkIntervalSeconds?: number;
49
+ topics?: TopicType[];
50
+ minMeshPeerCount?: number;
51
+ };
52
+ /** Which published checkpoint the attestation signers are read from (defaults to the first tx's block). */
53
+ checkpointSource?: 'first-tx' | 'first-published';
54
+ /** Runs after validator registration but before the validator nodes are created. */
55
+ beforeCreateNodes?: () => Promise<void>;
56
+ /** Creates extra non-validator nodes (prover/monitor) once the validator nodes exist. */
57
+ createExtraNodes?: (nodes: AztecNodeService[]) => Promise<void>;
58
+ /** Runs after the account is registered but before txs are submitted (sync waits, checkpoint waits, sleeps). */
59
+ beforeSubmit?: (nodes: AztecNodeService[]) => Promise<void>;
60
+ /** Scenario-specific verification run after attestation-signer verification (proven block, price convergence). */
61
+ afterVerify?: (nodes: AztecNodeService[]) => Promise<void>;
62
+ }
63
+ /**
64
+ * Shared skeleton for the p2p gossip tests: create the validator nodes and any extra nodes, wait for
65
+ * the mesh to form, register the account, optionally submit and mine txs, then verify the attestation
66
+ * signers of a published checkpoint. Each varying part (validator registration, extra nodes, pre-submit
67
+ * waits, scenario-specific verification) is supplied via the callbacks in {@link GossipScenarioOptions}.
68
+ * Returns the validator nodes so the caller can track them for teardown.
69
+ */
70
+ export declare function runGossipScenario(opts: GossipScenarioOptions): Promise<AztecNodeService[]>;
71
+ export {};
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcDJwL3NoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHOUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSzVDLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBSXZFLE9BQU8sRUFBMkMsS0FBSyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVc1RixPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQW9CLE1BQU0seUJBQXlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTVFLHdGQUF3RjtBQUN4RixLQUFLLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBR25GLGVBQU8sTUFBTSxrQkFBa0I7O3VCQWtCOUIsQ0FBQztBQUdGLGVBQU8sTUFBTSxrQkFBa0Isa0hBc0I5QixDQUFDO0FBRUYsd0JBQXNCLG1CQUFtQixDQUN2QyxNQUFNLEVBQUUsTUFBTSxFQUNkLElBQUksRUFBRSxnQkFBZ0IsRUFDdEIsTUFBTSxFQUFFLE1BQU0sRUFDZCxhQUFhLEVBQUUsa0JBQWtCLEdBQ2hDLE9BQU8sQ0FBQyxRQUFRLEVB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/p2p/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
2
+ import { Fr } from '@aztec/aztec.js/fields';
3
+ import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
4
+ import { timesAsync } from '@aztec/foundation/collection';
5
+ import { Signature } from '@aztec/foundation/eth-signature';
6
+ import { retryUntil } from '@aztec/foundation/retry';
7
+ import { TestContract, TestContractArtifact } from '@aztec/noir-test-contracts.js/Test';
8
+ import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
9
+ import { CheckpointAttestation, ConsensusPayload } from '@aztec/stdlib/p2p';
10
+ import { expect } from '@jest/globals';
11
+ import { shouldCollectMetrics } from '../fixtures/fixtures.js';
12
+ import { SchnorrHardcodedKeyAccountContract } from '../fixtures/schnorr_hardcoded_account_contract.js';
13
+ import { createNodes } from '../fixtures/setup_p2p_test.js';
14
+ import { waitForTxs } from '../fixtures/wait_helpers.js';
15
+ import { GrafanaClient } from '../quality_of_service/grafana_client.js';
16
+ import { submitTxsTo } from '../shared/submit-transactions.js';
17
+ import { TestWallet } from '../test-wallet/test_wallet.js';
18
+ import { proveInteraction } from '../test-wallet/utils.js';
19
+ import { WAIT_FOR_TX_TIMEOUT } from './p2p_network.js';
20
+ // submits a set of transactions to the provided Private eXecution Environment (PXE)
21
+ export const submitComplexTxsTo = async (logger, from, spamContract, numTxs, opts = {})=>{
22
+ const txs = [];
23
+ const seed = 1234n;
24
+ const spamCount = 15;
25
+ for(let i = 0; i < numTxs; i++){
26
+ const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
27
+ const { txHash } = await method.send({
28
+ from,
29
+ wait: NO_WAIT
30
+ });
31
+ logger.info(`Tx sent with hash ${txHash.toString()}`);
32
+ txs.push(txHash);
33
+ }
34
+ return txs;
35
+ };
36
+ // creates a wallet and submit a given number of transactions through it.
37
+ export const submitTransactions = async (logger, node, numTxs, fundedAccount)=>{
38
+ const rpcConfig = getRpcConfig();
39
+ rpcConfig.proverEnabled = false;
40
+ const wallet = await TestWallet.create(node, // Use checkpointed chain tip to avoid anchoring on provisional blocks that the archiver can prune
41
+ // when their slot ends without a checkpoint landing on L1.
42
+ {
43
+ ...getPXEConfig(),
44
+ proverEnabled: false,
45
+ syncChainTip: 'checkpointed'
46
+ }, {
47
+ loggerActorLabel: 'pxe-tx'
48
+ });
49
+ const contract = new SchnorrHardcodedKeyAccountContract();
50
+ const fundedAccountManager = await wallet.createAccount({
51
+ secret: fundedAccount.secret,
52
+ salt: fundedAccount.salt,
53
+ contract
54
+ });
55
+ return submitTxsTo(wallet, fundedAccountManager.address, numTxs, logger);
56
+ };
57
+ export async function prepareTransactions(logger, node, numTxs, fundedAccount) {
58
+ const rpcConfig = getRpcConfig();
59
+ rpcConfig.proverEnabled = false;
60
+ const wallet = await TestWallet.create(node, {
61
+ ...getPXEConfig(),
62
+ proverEnabled: false,
63
+ syncChainTip: 'checkpointed'
64
+ }, {
65
+ loggerActorLabel: 'pxe-tx'
66
+ });
67
+ const accountContract = new SchnorrHardcodedKeyAccountContract();
68
+ const fundedAccountManager = await wallet.createAccount({
69
+ secret: fundedAccount.secret,
70
+ salt: fundedAccount.salt,
71
+ contract: accountContract
72
+ });
73
+ const testContractInstance = await getContractInstanceFromInstantiationParams(TestContractArtifact, {
74
+ salt: Fr.random()
75
+ });
76
+ await wallet.registerContract(testContractInstance, TestContractArtifact);
77
+ const contract = TestContract.at(testContractInstance.address, wallet);
78
+ return timesAsync(numTxs, async ()=>{
79
+ const tx = await proveInteraction(wallet, contract.methods.emit_nullifier(Fr.random()), {
80
+ from: fundedAccountManager.address
81
+ });
82
+ logger.info(`Tx prepared with hash ${tx.getTxHash()}`);
83
+ return tx;
84
+ });
85
+ }
86
+ const CHECK_ALERTS = process.env.CHECK_ALERTS === 'true';
87
+ const qosAlerts = [
88
+ {
89
+ alert: 'SequencerTimeToCollectAttestations',
90
+ expr: 'aztec_sequencer_time_to_collect_attestations > 3500',
91
+ labels: {
92
+ severity: 'error'
93
+ },
94
+ for: '10m',
95
+ annotations: {}
96
+ }
97
+ ];
98
+ /** Runs the shared p2p QoS Grafana alert check when CHECK_ALERTS=true; a no-op otherwise. */ export async function maybeCheckQosAlerts(logger) {
99
+ if (CHECK_ALERTS) {
100
+ const checker = new GrafanaClient(logger);
101
+ await checker.runAlertCheck(qosAlerts);
102
+ }
103
+ }
104
+ /** Waits until every node's synced block number reaches the initial node's current tip. */ export async function waitForNodesToSync(t, nodes) {
105
+ const targetBlock = await t.ctx.aztecNode.getBlockNumber();
106
+ t.logger.warn(`Waiting for all nodes to sync to block number ${targetBlock}`);
107
+ await retryUntil(async ()=>{
108
+ const blockNumbers = await Promise.all(nodes.map((node)=>node.getBlockNumber()));
109
+ const checkpointNumber = (await t.monitor.run()).checkpointNumber;
110
+ t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
111
+ return blockNumbers.every((bn)=>bn >= targetBlock);
112
+ }, `nodes to sync to block number ${targetBlock}`, 30, 0.5);
113
+ }
114
+ /** Reads the published checkpoint containing the block that mined the given tx. */ export async function getPublishedCheckpointForTx(node, txHash) {
115
+ const receipt = await node.getTxReceipt(txHash);
116
+ const blockNumber = receipt.blockNumber;
117
+ const dataStore = node.getBlockSource();
118
+ const blockData = await dataStore.getBlockData({
119
+ number: BlockNumber(blockNumber)
120
+ });
121
+ const [publishedCheckpoint] = await dataStore.getCheckpoints({
122
+ from: blockData.checkpointNumber,
123
+ limit: 1
124
+ });
125
+ return publishedCheckpoint;
126
+ }
127
+ /** Polls until the archiver has indexed the first published checkpoint, then returns it. */ export async function waitForFirstPublishedCheckpoint(t, nodes, timeoutSeconds = 120) {
128
+ const dataStore = nodes[0].getBlockSource();
129
+ t.logger.warn('Waiting for first checkpoint to be published and indexed by the archiver');
130
+ return await retryUntil(async ()=>{
131
+ const blockNumbers = await Promise.all(nodes.map((node)=>node.getBlockNumber()));
132
+ const checkpointNumber = (await t.monitor.run()).checkpointNumber;
133
+ t.logger.info(`Current block numbers ${blockNumbers} (checkpoint number on L1 is ${checkpointNumber})`);
134
+ const [checkpoint] = await dataStore.getCheckpoints({
135
+ from: CheckpointNumber(1),
136
+ limit: 1
137
+ });
138
+ return checkpoint;
139
+ }, 'published checkpoint to be indexed', timeoutSeconds, 1);
140
+ }
141
+ /**
142
+ * Recovers the attestation signers from a published checkpoint and asserts each one belongs to the
143
+ * validator set formed by the given nodes. Returns the recovered signer addresses so callers can add
144
+ * scenario-specific assertions (e.g. an exact signer count).
145
+ */ export async function verifyAttestationSigners(t, nodes, publishedCheckpoint) {
146
+ const signatureContext = {
147
+ chainId: t.ctx.aztecNodeConfig.l1ChainId,
148
+ rollupAddress: t.ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress
149
+ };
150
+ const payload = ConsensusPayload.fromCheckpoint(publishedCheckpoint.checkpoint, signatureContext);
151
+ const attestations = publishedCheckpoint.attestations.filter((a)=>!a.signature.isEmpty()).map((a)=>new CheckpointAttestation(payload, a.signature, Signature.empty()));
152
+ const signers = await Promise.all(attestations.map((att)=>att.getSender().toString()));
153
+ t.logger.info(`Attestation signers`, {
154
+ signers
155
+ });
156
+ // Check that the signers found are part of the proposer nodes to ensure the archiver fetched them right
157
+ const validatorAddresses = nodes.flatMap((node)=>node.getSequencer().validatorAddresses?.map((a)=>a.toString()));
158
+ t.logger.info(`Validator addresses`, {
159
+ addresses: validatorAddresses
160
+ });
161
+ for (const signer of signers){
162
+ expect(validatorAddresses).toContain(signer);
163
+ }
164
+ return signers;
165
+ }
166
+ /**
167
+ * Shared skeleton for the p2p gossip tests: create the validator nodes and any extra nodes, wait for
168
+ * the mesh to form, register the account, optionally submit and mine txs, then verify the attestation
169
+ * signers of a published checkpoint. Each varying part (validator registration, extra nodes, pre-submit
170
+ * waits, scenario-specific verification) is supplied via the callbacks in {@link GossipScenarioOptions}.
171
+ * Returns the validator nodes so the caller can track them for teardown.
172
+ */ export async function runGossipScenario(opts) {
173
+ const { t, numValidators, bootNodePort, txsPerNode } = opts;
174
+ if (!t.bootstrapNodeEnr) {
175
+ throw new Error('Bootstrap node ENR is not available');
176
+ }
177
+ await opts.beforeCreateNodes?.();
178
+ t.logger.info('Creating validator nodes');
179
+ const nodes = await createNodes(t.ctx.aztecNodeConfig, t.ctx.dateProvider, t.bootstrapNodeEnr, numValidators, bootNodePort, t.genesis, t.dataDirFor('validator'), shouldCollectMetrics());
180
+ await opts.createExtraNodes?.(nodes);
181
+ t.logger.info('Waiting for nodes to connect');
182
+ await t.waitForP2PMeshConnectivity(nodes, opts.mesh?.expectedNodeCount ?? numValidators, opts.mesh?.timeoutSeconds, opts.mesh?.checkIntervalSeconds, opts.mesh?.topics, opts.mesh?.minMeshPeerCount);
183
+ // We need to create the nodes before we setup the account, because those nodes form the committee
184
+ // and blocks cannot be built without them (targetCommitteeSize is set to the number of nodes).
185
+ await t.setupAccount();
186
+ await opts.beforeSubmit?.(nodes);
187
+ let firstTxHash;
188
+ if (txsPerNode > 0) {
189
+ t.logger.info('Submitting transactions');
190
+ const submitOne = (node)=>submitTransactions(t.logger, node, txsPerNode, t.fundedAccount);
191
+ // Each submitTransactions call builds its own wallet/PXE, so submissions are independent. When run
192
+ // concurrently, Promise.all preserves node order so submitted[i] stays aligned with nodes[i].
193
+ const submitted = [];
194
+ if (opts.submitSequentially) {
195
+ for (const node of nodes){
196
+ submitted.push(await submitOne(node));
197
+ }
198
+ } else {
199
+ submitted.push(...await Promise.all(nodes.map(submitOne)));
200
+ }
201
+ firstTxHash = submitted[0][0];
202
+ t.logger.info('Waiting for transactions to be mined');
203
+ await waitForTxs(nodes[0], submitted.flat(), {
204
+ timeout: WAIT_FOR_TX_TIMEOUT
205
+ });
206
+ t.logger.info('All transactions mined');
207
+ }
208
+ const publishedCheckpoint = opts.checkpointSource === 'first-published' ? await waitForFirstPublishedCheckpoint(t, nodes) : await getPublishedCheckpointForTx(nodes[0], firstTxHash);
209
+ await verifyAttestationSigners(t, nodes, publishedCheckpoint);
210
+ await opts.afterVerify?.(nodes);
211
+ return nodes;
212
+ }
@@ -25,7 +25,7 @@ import { type Hex } from 'viem';
25
25
  * @param underlyingERC20Address - address of the underlying ERC20 contract to use (if none supplied, it deploys one)
26
26
  * @returns l2 contract instance, bridge contract instance, token portal instance, token portal address and the underlying ERC20 instance
27
27
  */
28
- export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, l1Client: ExtendedViemWalletClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress): Promise<{
28
+ export declare function deployAndInitializeTokenAndBridgeContracts(wallet: Wallet, l1Client: ExtendedViemWalletClient, rollupRegistryAddress: EthAddress, owner: AztecAddress, underlyingERC20Address: EthAddress, predeployedTokenPortalAddress?: EthAddress): Promise<{
29
29
  /**
30
30
  * The L2 token contract instance.
31
31
  */
@@ -84,7 +84,7 @@ export declare class CrossChainTestHarness {
84
84
  readonly wallet: Wallet;
85
85
  /** Owner of the l2 token and bridge */
86
86
  readonly ownerAddress: AztecAddress;
87
- static new(aztecNode: AztecNode, l1Client: ExtendedViemWalletClient, wallet: Wallet, ownerAddress: AztecAddress, logger: Logger, underlyingERC20Address: EthAddress): Promise<CrossChainTestHarness>;
87
+ static new(aztecNode: AztecNode, l1Client: ExtendedViemWalletClient, wallet: Wallet, ownerAddress: AztecAddress, logger: Logger, underlyingERC20Address: EthAddress, predeployedTokenPortalAddress?: EthAddress): Promise<CrossChainTestHarness>;
88
88
  private readonly l1TokenManager;
89
89
  private readonly l1TokenPortalManager;
90
90
  readonly outboxContract: OutboxContract;
@@ -140,4 +140,4 @@ export declare class CrossChainTestHarness {
140
140
  makeMessageConsumable(msgHash: Fr | Hex): Promise<void>;
141
141
  toCrossChainContext(): CrossChainContext;
142
142
  }
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NfY2hhaW5fdGVzdF9oYXJuZXNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL2Nyb3NzX2NoYWluX3Rlc3RfaGFybmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFHTCxLQUFLLGFBQWEsRUFDbEIsS0FBSywwQkFBMEIsRUFDaEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFz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
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NfY2hhaW5fdGVzdF9oYXJuZXNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL2Nyb3NzX2NoYWluX3Rlc3RfaGFybmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFHTCxLQUFLLGFBQWEsRUFDbEIsS0FBSywwQkFBMEIsRUFDaEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFz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
@@ -1 +1 @@
1
- {"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cross_chain_test_harness.d.ts","sourceRoot":"","sources":["../../src/shared/cross_chain_test_harness.ts"],"names":[],"mappings":"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"}