@aztec/end-to-end 0.0.0-test.1 → 0.0.1-commit.001888fc

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 (293) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +62 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +281 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +79 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +329 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +124 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +79 -0
  13. package/dest/bench/utils.d.ts +16 -41
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +44 -72
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +28 -19
  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 +125 -103
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +32 -32
  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 +105 -104
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +19 -10
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +26 -27
  25. package/dest/e2e_epochs/epochs_test.d.ts +75 -24
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +290 -58
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +61 -0
  31. package/dest/e2e_fees/fees_test.d.ts +38 -23
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +169 -183
  34. package/dest/e2e_l1_publisher/write_json.d.ts +11 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +56 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +15 -15
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +36 -42
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +136 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +282 -27
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +255 -176
  49. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  50. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  51. package/dest/e2e_p2p/reqresp/utils.js +190 -0
  52. package/dest/e2e_p2p/shared.d.ts +64 -8
  53. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  54. package/dest/e2e_p2p/shared.js +200 -27
  55. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  56. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  57. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  58. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  59. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  60. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  61. package/dest/e2e_token_contract/token_contract_test.d.ts +29 -14
  62. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  63. package/dest/e2e_token_contract/token_contract_test.js +107 -75
  64. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  65. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  66. package/dest/fixtures/authwit_proxy.js +30 -0
  67. package/dest/fixtures/e2e_prover_test.d.ts +55 -0
  68. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  69. package/dest/fixtures/e2e_prover_test.js +271 -0
  70. package/dest/fixtures/elu_monitor.d.ts +21 -0
  71. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  72. package/dest/fixtures/elu_monitor.js +102 -0
  73. package/dest/fixtures/fixtures.d.ts +10 -8
  74. package/dest/fixtures/fixtures.d.ts.map +1 -1
  75. package/dest/fixtures/fixtures.js +11 -5
  76. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  77. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  78. package/dest/fixtures/get_acvm_config.js +3 -15
  79. package/dest/fixtures/get_bb_config.d.ts +2 -2
  80. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  81. package/dest/fixtures/get_bb_config.js +10 -17
  82. package/dest/fixtures/ha_setup.d.ts +71 -0
  83. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  84. package/dest/fixtures/ha_setup.js +116 -0
  85. package/dest/fixtures/index.d.ts +2 -1
  86. package/dest/fixtures/index.d.ts.map +1 -1
  87. package/dest/fixtures/index.js +1 -0
  88. package/dest/fixtures/l1_to_l2_messaging.d.ts +11 -7
  89. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  90. package/dest/fixtures/l1_to_l2_messaging.js +45 -19
  91. package/dest/fixtures/logging.d.ts +1 -1
  92. package/dest/fixtures/setup.d.ts +239 -0
  93. package/dest/fixtures/setup.d.ts.map +1 -0
  94. package/dest/fixtures/setup.js +606 -0
  95. package/dest/fixtures/setup_p2p_test.d.ts +23 -15
  96. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  97. package/dest/fixtures/setup_p2p_test.js +102 -31
  98. package/dest/fixtures/token_utils.d.ts +10 -4
  99. package/dest/fixtures/token_utils.d.ts.map +1 -1
  100. package/dest/fixtures/token_utils.js +33 -13
  101. package/dest/fixtures/utils.d.ts +5 -153
  102. package/dest/fixtures/utils.d.ts.map +1 -1
  103. package/dest/fixtures/utils.js +4 -552
  104. package/dest/fixtures/web3signer.d.ts +5 -0
  105. package/dest/fixtures/web3signer.d.ts.map +1 -0
  106. package/dest/fixtures/web3signer.js +53 -0
  107. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  108. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  109. package/dest/fixtures/with_telemetry_utils.js +2 -2
  110. package/dest/index.d.ts +1 -1
  111. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  112. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  113. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  114. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  115. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  116. package/dest/quality_of_service/prometheus_client.js +67 -0
  117. package/dest/shared/cross_chain_test_harness.d.ts +44 -27
  118. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  119. package/dest/shared/cross_chain_test_harness.js +107 -53
  120. package/dest/shared/gas_portal_test_harness.d.ts +33 -25
  121. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  122. package/dest/shared/gas_portal_test_harness.js +51 -30
  123. package/dest/shared/index.d.ts +3 -2
  124. package/dest/shared/index.d.ts.map +1 -1
  125. package/dest/shared/index.js +1 -0
  126. package/dest/shared/jest_setup.d.ts +1 -1
  127. package/dest/shared/jest_setup.js +42 -2
  128. package/dest/shared/mock_state_view.d.ts +86 -0
  129. package/dest/shared/mock_state_view.d.ts.map +1 -0
  130. package/dest/shared/mock_state_view.js +186 -0
  131. package/dest/shared/submit-transactions.d.ts +6 -4
  132. package/dest/shared/submit-transactions.d.ts.map +1 -1
  133. package/dest/shared/submit-transactions.js +15 -16
  134. package/dest/shared/uniswap_l1_l2.d.ts +3 -25
  135. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  136. package/dest/shared/uniswap_l1_l2.js +175 -126
  137. package/dest/simulators/index.d.ts +1 -1
  138. package/dest/simulators/lending_simulator.d.ts +7 -7
  139. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  140. package/dest/simulators/lending_simulator.js +17 -18
  141. package/dest/simulators/token_simulator.d.ts +6 -3
  142. package/dest/simulators/token_simulator.d.ts.map +1 -1
  143. package/dest/simulators/token_simulator.js +12 -30
  144. package/dest/spartan/setup_test_wallets.d.ts +36 -11
  145. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  146. package/dest/spartan/setup_test_wallets.js +276 -62
  147. package/dest/spartan/tx_metrics.d.ts +88 -0
  148. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  149. package/dest/spartan/tx_metrics.js +422 -0
  150. package/dest/spartan/utils/bot.d.ts +28 -0
  151. package/dest/spartan/utils/bot.d.ts.map +1 -0
  152. package/dest/spartan/utils/bot.js +142 -0
  153. package/dest/spartan/utils/chaos.d.ts +79 -0
  154. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  155. package/dest/spartan/utils/chaos.js +142 -0
  156. package/dest/spartan/utils/clients.d.ts +39 -0
  157. package/dest/spartan/utils/clients.d.ts.map +1 -0
  158. package/dest/spartan/utils/clients.js +90 -0
  159. package/dest/spartan/utils/config.d.ts +45 -0
  160. package/dest/spartan/utils/config.d.ts.map +1 -0
  161. package/dest/spartan/utils/config.js +23 -0
  162. package/dest/spartan/utils/health.d.ts +63 -0
  163. package/dest/spartan/utils/health.d.ts.map +1 -0
  164. package/dest/spartan/utils/health.js +202 -0
  165. package/dest/spartan/utils/helm.d.ts +15 -0
  166. package/dest/spartan/utils/helm.d.ts.map +1 -0
  167. package/dest/spartan/utils/helm.js +47 -0
  168. package/dest/spartan/utils/index.d.ts +11 -0
  169. package/dest/spartan/utils/index.d.ts.map +1 -0
  170. package/dest/spartan/utils/index.js +22 -0
  171. package/dest/spartan/utils/k8s.d.ts +128 -0
  172. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  173. package/dest/spartan/utils/k8s.js +381 -0
  174. package/dest/spartan/utils/nodes.d.ts +40 -0
  175. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  176. package/dest/spartan/utils/nodes.js +461 -0
  177. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  178. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  179. package/dest/spartan/utils/pod_logs.js +74 -0
  180. package/dest/spartan/utils/scripts.d.ts +30 -0
  181. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  182. package/dest/spartan/utils/scripts.js +81 -0
  183. package/dest/spartan/utils.d.ts +2 -415
  184. package/dest/spartan/utils.d.ts.map +1 -1
  185. package/dest/spartan/utils.js +1 -445
  186. package/dest/test-wallet/test_wallet.d.ts +83 -0
  187. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  188. package/dest/test-wallet/test_wallet.js +214 -0
  189. package/dest/test-wallet/utils.d.ts +41 -0
  190. package/dest/test-wallet/utils.d.ts.map +1 -0
  191. package/dest/test-wallet/utils.js +71 -0
  192. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  193. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  194. package/dest/test-wallet/wallet_worker_script.js +48 -0
  195. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  196. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  197. package/dest/test-wallet/worker_wallet.js +151 -0
  198. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  199. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  200. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  201. package/package.json +72 -62
  202. package/src/bench/client_flows/benchmark.ts +363 -0
  203. package/src/bench/client_flows/client_flows_benchmark.ts +388 -0
  204. package/src/bench/client_flows/config.ts +69 -0
  205. package/src/bench/client_flows/data_extractor.ts +89 -0
  206. package/src/bench/utils.ts +47 -86
  207. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +149 -171
  208. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +155 -182
  209. package/src/e2e_deploy_contract/deploy_test.ts +40 -48
  210. package/src/e2e_epochs/epochs_test.ts +364 -93
  211. package/src/e2e_fees/bridging_race.notest.ts +74 -0
  212. package/src/e2e_fees/fees_test.ts +213 -259
  213. package/src/e2e_l1_publisher/write_json.ts +77 -0
  214. package/src/e2e_multi_validator/utils.ts +258 -0
  215. package/src/e2e_nested_contract/nested_contract_test.ts +48 -59
  216. package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
  217. package/src/e2e_p2p/p2p_network.ts +367 -234
  218. package/src/e2e_p2p/reqresp/utils.ts +256 -0
  219. package/src/e2e_p2p/shared.ts +315 -39
  220. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  221. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  222. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  223. package/src/e2e_token_contract/token_contract_test.ts +132 -126
  224. package/src/fixtures/authwit_proxy.ts +50 -0
  225. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  226. package/src/fixtures/e2e_prover_test.ts +332 -0
  227. package/src/fixtures/elu_monitor.ts +126 -0
  228. package/src/fixtures/fixtures.ts +15 -7
  229. package/src/fixtures/get_acvm_config.ts +4 -12
  230. package/src/fixtures/get_bb_config.ts +18 -13
  231. package/src/fixtures/ha_setup.ts +186 -0
  232. package/src/fixtures/index.ts +1 -0
  233. package/src/fixtures/l1_to_l2_messaging.ts +56 -24
  234. package/src/fixtures/setup.ts +903 -0
  235. package/src/fixtures/setup_p2p_test.ts +134 -50
  236. package/src/fixtures/token_utils.ts +37 -16
  237. package/src/fixtures/utils.ts +27 -820
  238. package/src/fixtures/web3signer.ts +63 -0
  239. package/src/fixtures/with_telemetry_utils.ts +2 -2
  240. package/src/guides/up_quick_start.sh +9 -17
  241. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +2 -2
  242. package/src/quality_of_service/prometheus_client.ts +113 -0
  243. package/src/shared/cross_chain_test_harness.ts +110 -94
  244. package/src/shared/gas_portal_test_harness.ts +59 -50
  245. package/src/shared/index.ts +2 -1
  246. package/src/shared/jest_setup.ts +52 -2
  247. package/src/shared/mock_state_view.ts +188 -0
  248. package/src/shared/submit-transactions.ts +19 -20
  249. package/src/shared/uniswap_l1_l2.ts +207 -226
  250. package/src/simulators/lending_simulator.ts +18 -17
  251. package/src/simulators/token_simulator.ts +18 -34
  252. package/src/spartan/DEVELOP.md +128 -0
  253. package/src/spartan/setup_test_wallets.ts +393 -95
  254. package/src/spartan/tx_metrics.ts +376 -0
  255. package/src/spartan/utils/bot.ts +188 -0
  256. package/src/spartan/utils/chaos.ts +253 -0
  257. package/src/spartan/utils/clients.ts +100 -0
  258. package/src/spartan/utils/config.ts +29 -0
  259. package/src/spartan/utils/health.ts +255 -0
  260. package/src/spartan/utils/helm.ts +84 -0
  261. package/src/spartan/utils/index.ts +71 -0
  262. package/src/spartan/utils/k8s.ts +535 -0
  263. package/src/spartan/utils/nodes.ts +543 -0
  264. package/src/spartan/utils/pod_logs.ts +99 -0
  265. package/src/spartan/utils/scripts.ts +99 -0
  266. package/src/spartan/utils.ts +1 -582
  267. package/src/test-wallet/test_wallet.ts +306 -0
  268. package/src/test-wallet/utils.ts +112 -0
  269. package/src/test-wallet/wallet_worker_script.ts +60 -0
  270. package/src/test-wallet/worker_wallet.ts +213 -0
  271. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  272. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  273. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  274. package/dest/e2e_prover/e2e_prover_test.js +0 -291
  275. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  276. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  277. package/dest/fixtures/setup_l1_contracts.js +0 -17
  278. package/dest/fixtures/snapshot_manager.d.ts +0 -87
  279. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  280. package/dest/fixtures/snapshot_manager.js +0 -479
  281. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  282. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  283. package/dest/sample-dapp/connect.js +0 -12
  284. package/dest/sample-dapp/contracts.js +0 -10
  285. package/dest/sample-dapp/deploy.js +0 -35
  286. package/dest/sample-dapp/index.js +0 -98
  287. package/src/e2e_prover/e2e_prover_test.ts +0 -418
  288. package/src/fixtures/setup_l1_contracts.ts +0 -27
  289. package/src/fixtures/snapshot_manager.ts +0 -617
  290. package/src/sample-dapp/connect.mjs +0 -16
  291. package/src/sample-dapp/contracts.mjs +0 -14
  292. package/src/sample-dapp/deploy.mjs +0 -40
  293. package/src/sample-dapp/index.mjs +0 -128
@@ -2,29 +2,28 @@
2
2
  * Test fixtures and utilities to set up and run a test using multiple validators
3
3
  */
4
4
  import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
5
- import type { SentTx } from '@aztec/aztec.js';
6
- import { addLogNameHandler, removeLogNameHandler } from '@aztec/foundation/log';
5
+ import { range } from '@aztec/foundation/array';
6
+ import { SecretValue } from '@aztec/foundation/config';
7
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
8
+ import { bufferToHex } from '@aztec/foundation/string';
7
9
  import type { DateProvider } from '@aztec/foundation/timer';
8
- import type { PXEService } from '@aztec/pxe/server';
9
10
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
10
11
 
11
12
  import getPort from 'get-port';
12
- import { AsyncLocalStorage } from 'node:async_hooks';
13
13
 
14
14
  import { TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
15
- import { getPrivateKeyFromIndex } from './utils.js';
15
+ import { createAndSyncProverNode, getPrivateKeyFromIndex } from './utils.js';
16
16
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
17
17
 
18
- // Setup snapshots will create a node with index 0, so all of our loops here
19
- // need to start from 1 to avoid running validators with the same key
20
- export const PROPOSER_PRIVATE_KEYS_START_INDEX = 1;
21
- export const ATTESTER_PRIVATE_KEYS_START_INDEX = 1001;
18
+ // Setup snapshots will create a node with index 0, and run extra bootstrap with
19
+ // index 1, and prover node with index 2, so all of our loops here need to start from 3
20
+ // to avoid running validators with the same key
21
+ export const ATTESTER_PRIVATE_KEYS_START_INDEX = 3;
22
22
 
23
- export interface NodeContext {
24
- node: AztecNodeService;
25
- pxeService: PXEService;
26
- txs: SentTx[];
27
- }
23
+ // Global counters for actor naming (start at 1)
24
+ let validatorCounter = 1;
25
+ let nodeCounter = 1;
26
+ let proverCounter = 1;
28
27
 
29
28
  export function generatePrivateKeys(startIndex: number, numberOfKeys: number): `0x${string}`[] {
30
29
  const privateKeys: `0x${string}`[] = [];
@@ -36,7 +35,7 @@ export function generatePrivateKeys(startIndex: number, numberOfKeys: number): `
36
35
  }
37
36
 
38
37
  export async function createNodes(
39
- config: AztecNodeConfig,
38
+ config: AztecNodeConfig & { dontStartSequencer?: boolean },
40
39
  dateProvider: DateProvider,
41
40
  bootstrapNodeEnr: string,
42
41
  numNodes: number,
@@ -44,81 +43,139 @@ export async function createNodes(
44
43
  prefilledPublicData?: PublicDataTreeLeaf[],
45
44
  dataDirectory?: string,
46
45
  metricsPort?: number,
46
+ indexOffset = 0,
47
+ validatorsPerNode = 1,
47
48
  ): Promise<AztecNodeService[]> {
48
49
  const nodePromises: Promise<AztecNodeService>[] = [];
49
- const loggerIdStorage = new AsyncLocalStorage<string>();
50
- const logNameHandler = (module: string) =>
51
- loggerIdStorage.getStore() ? `${module}:${loggerIdStorage.getStore()}` : module;
52
- addLogNameHandler(logNameHandler);
53
50
 
54
51
  for (let i = 0; i < numNodes; i++) {
52
+ const index = indexOffset + i;
55
53
  // We run on ports from the bootnode upwards
56
- const port = bootNodePort + i + 1;
54
+ const port = bootNodePort + 1 + index;
55
+
56
+ // Determine validator indices for this node
57
+ const validatorIndices = validatorsPerNode === 1 ? index : range(validatorsPerNode, validatorsPerNode * index);
58
+
59
+ // Assign data directory
60
+ const dataDir = dataDirectory ? `${dataDirectory}-${index}` : undefined;
57
61
 
58
- const dataDir = dataDirectory ? `${dataDirectory}-${i}` : undefined;
59
62
  const nodePromise = createNode(
60
63
  config,
61
64
  dateProvider,
62
65
  port,
63
66
  bootstrapNodeEnr,
64
- i,
67
+ validatorIndices,
65
68
  prefilledPublicData,
66
69
  dataDir,
67
70
  metricsPort,
68
- loggerIdStorage,
69
71
  );
70
72
  nodePromises.push(nodePromise);
71
73
  }
72
74
  const nodes = await Promise.all(nodePromises);
73
- removeLogNameHandler(logNameHandler);
75
+
76
+ // Sanity check that we have a sequencer if required
77
+ const seqClient = nodes[0].getSequencer();
78
+ if (!seqClient && config.disableValidator === false) {
79
+ throw new Error('Sequencer not found');
80
+ }
81
+
74
82
  return nodes;
75
83
  }
76
84
 
77
- // creates a P2P enabled instance of Aztec Node Service
85
+ /** Extended config type for createNode with test-specific overrides. */
86
+ export type CreateNodeConfig = AztecNodeConfig & {
87
+ /** Whether to skip starting the sequencer. */
88
+ dontStartSequencer?: boolean;
89
+ /** Override the private key (instead of deriving from addressIndex). */
90
+ validatorPrivateKey?: `0x${string}`;
91
+ };
92
+
93
+ /** Creates a P2P enabled instance of Aztec Node Service with a validator. */
78
94
  export async function createNode(
79
- config: AztecNodeConfig,
95
+ config: CreateNodeConfig,
80
96
  dateProvider: DateProvider,
81
97
  tcpPort: number,
82
98
  bootstrapNode: string | undefined,
83
- accountIndex: number,
99
+ addressIndex: number | number[],
84
100
  prefilledPublicData?: PublicDataTreeLeaf[],
85
101
  dataDirectory?: string,
86
102
  metricsPort?: number,
87
- loggerIdStorage?: AsyncLocalStorage<string>,
88
103
  ) {
89
- const createNode = async () => {
90
- const validatorConfig = await createValidatorConfig(config, bootstrapNode, tcpPort, accountIndex, dataDirectory);
91
- const telemetry = getEndToEndTestTelemetryClient(metricsPort);
92
- return await AztecNodeService.createAndSync(validatorConfig, { telemetry, dateProvider }, { prefilledPublicData });
93
- };
94
- return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createNode) : createNode();
104
+ const actorIndex = validatorCounter++;
105
+ return await withLoggerBindings({ actor: `validator-${actorIndex}` }, async () => {
106
+ const validatorConfig = await createValidatorConfig(config, bootstrapNode, tcpPort, addressIndex, dataDirectory);
107
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
108
+ return await AztecNodeService.createAndSync(
109
+ validatorConfig,
110
+ { telemetry, dateProvider },
111
+ { prefilledPublicData, dontStartSequencer: config.dontStartSequencer },
112
+ );
113
+ });
95
114
  }
96
115
 
97
- export async function createValidatorConfig(
116
+ /** Creates a P2P enabled instance of Aztec Node Service without a validator */
117
+ export async function createNonValidatorNode(
118
+ baseConfig: AztecNodeConfig,
119
+ dateProvider: DateProvider,
120
+ tcpPort: number,
121
+ bootstrapNode: string | undefined,
122
+ prefilledPublicData?: PublicDataTreeLeaf[],
123
+ dataDirectory?: string,
124
+ metricsPort?: number,
125
+ ) {
126
+ const actorIndex = nodeCounter++;
127
+ return await withLoggerBindings({ actor: `node-${actorIndex}` }, async () => {
128
+ const p2pConfig = await createP2PConfig(baseConfig, bootstrapNode, tcpPort, dataDirectory);
129
+ const config: AztecNodeConfig = {
130
+ ...p2pConfig,
131
+ disableValidator: true,
132
+ validatorPrivateKeys: undefined,
133
+ sequencerPublisherPrivateKeys: [],
134
+ };
135
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
136
+ return await AztecNodeService.createAndSync(config, { telemetry, dateProvider }, { prefilledPublicData });
137
+ });
138
+ }
139
+
140
+ export async function createProverNode(
141
+ config: AztecNodeConfig,
142
+ tcpPort: number,
143
+ bootstrapNode: string | undefined,
144
+ addressIndex: number,
145
+ deps: { dateProvider: DateProvider },
146
+ prefilledPublicData?: PublicDataTreeLeaf[],
147
+ dataDirectory?: string,
148
+ metricsPort?: number,
149
+ ): Promise<{ proverNode: AztecNodeService }> {
150
+ const actorIndex = proverCounter++;
151
+ return await withLoggerBindings({ actor: `prover-${actorIndex}` }, async () => {
152
+ const proverNodePrivateKey = getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex)!;
153
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
154
+
155
+ const p2pConfig = await createP2PConfig(config, bootstrapNode, tcpPort, dataDirectory);
156
+
157
+ return await createAndSyncProverNode(
158
+ bufferToHex(proverNodePrivateKey),
159
+ { ...config, ...p2pConfig },
160
+ { dataDirectory },
161
+ { ...deps, telemetry },
162
+ { prefilledPublicData: prefilledPublicData ?? [] },
163
+ );
164
+ });
165
+ }
166
+
167
+ export async function createP2PConfig(
98
168
  config: AztecNodeConfig,
99
169
  bootstrapNodeEnr?: string,
100
170
  port?: number,
101
- accountIndex: number = 1,
102
171
  dataDirectory?: string,
103
172
  ) {
104
173
  port = port ?? (await getPort());
105
174
 
106
- const attesterPrivateKey: `0x${string}` = `0x${getPrivateKeyFromIndex(
107
- ATTESTER_PRIVATE_KEYS_START_INDEX + accountIndex,
108
- )!.toString('hex')}`;
109
- const proposerPrivateKey: `0x${string}` = `0x${getPrivateKeyFromIndex(
110
- PROPOSER_PRIVATE_KEYS_START_INDEX + accountIndex,
111
- )!.toString('hex')}`;
112
-
113
- config.validatorPrivateKey = attesterPrivateKey;
114
- config.publisherPrivateKey = proposerPrivateKey;
115
-
116
175
  const nodeConfig: AztecNodeConfig = {
117
176
  ...config,
118
- udpListenAddress: `0.0.0.0:${port}`,
119
- tcpListenAddress: `0.0.0.0:${port}`,
120
- tcpAnnounceAddress: `127.0.0.1:${port}`,
121
- udpAnnounceAddress: `127.0.0.1:${port}`,
177
+ p2pIp: `127.0.0.1`,
178
+ p2pPort: port,
122
179
  p2pEnabled: true,
123
180
  peerCheckIntervalMS: TEST_PEER_CHECK_INTERVAL_MS,
124
181
  blockCheckIntervalMS: 1000,
@@ -128,3 +185,30 @@ export async function createValidatorConfig(
128
185
 
129
186
  return nodeConfig;
130
187
  }
188
+
189
+ export async function createValidatorConfig(
190
+ config: CreateNodeConfig,
191
+ bootstrapNodeEnr?: string,
192
+ port?: number,
193
+ addressIndex: number | number[] = 1,
194
+ dataDirectory?: string,
195
+ ) {
196
+ const addressIndices = Array.isArray(addressIndex) ? addressIndex : [addressIndex];
197
+ if (addressIndices.length === 0 && !config.validatorPrivateKey) {
198
+ throw new Error('At least one address index must be provided to create a validator config');
199
+ }
200
+
201
+ // Use override private key if provided, otherwise derive from address indices
202
+ const attesterPrivateKeys = config.validatorPrivateKey
203
+ ? [config.validatorPrivateKey]
204
+ : addressIndices.map(index => bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)!));
205
+ const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
206
+ const nodeConfig: AztecNodeConfig = {
207
+ ...config,
208
+ ...p2pConfig,
209
+ validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
210
+ sequencerPublisherPrivateKeys: [new SecretValue(attesterPrivateKeys[0])],
211
+ };
212
+
213
+ return nodeConfig;
214
+ }
@@ -1,34 +1,36 @@
1
- // docs:start:token_utils
2
- import type { AztecAddress, Logger, Wallet } from '@aztec/aztec.js';
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { BatchCall } from '@aztec/aztec.js/contracts';
3
+ import type { Logger } from '@aztec/aztec.js/log';
4
+ import type { Wallet } from '@aztec/aztec.js/wallet';
3
5
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
4
6
 
5
- export async function deployToken(adminWallet: Wallet, initialAdminBalance: bigint, logger: Logger) {
7
+ export async function deployToken(wallet: Wallet, admin: AztecAddress, initialAdminBalance: bigint, logger: Logger) {
6
8
  logger.info(`Deploying Token contract...`);
7
- const contract = await TokenContract.deploy(adminWallet, adminWallet.getAddress(), 'TokenName', 'TokenSymbol', 18)
8
- .send()
9
- .deployed();
9
+ const {
10
+ receipt: { contract, instance },
11
+ } = await TokenContract.deploy(wallet, admin, 'TokenName', 'TokenSymbol', 18).send({
12
+ from: admin,
13
+ wait: { returnReceipt: true },
14
+ });
10
15
 
11
16
  if (initialAdminBalance > 0n) {
12
- // Minter is minting to herself so contract as minter is the same as contract as recipient
13
- await mintTokensToPrivate(contract, adminWallet, adminWallet.getAddress(), initialAdminBalance);
17
+ await mintTokensToPrivate(contract, admin, admin, initialAdminBalance);
14
18
  }
15
19
 
16
20
  logger.info('L2 contract deployed');
17
21
 
18
- return contract;
22
+ return { contract, instance };
19
23
  }
20
24
 
21
25
  export async function mintTokensToPrivate(
22
26
  token: TokenContract,
23
- minterWallet: Wallet,
27
+ minter: AztecAddress,
24
28
  recipient: AztecAddress,
25
29
  amount: bigint,
30
+ additionalScopes?: AztecAddress[],
26
31
  ) {
27
- const tokenAsMinter = await TokenContract.at(token.address, minterWallet);
28
- const from = minterWallet.getAddress(); // we are setting from to minter here because we need a sender to calculate the tag
29
- await tokenAsMinter.methods.mint_to_private(from, recipient, amount).send().wait();
32
+ await token.methods.mint_to_private(recipient, amount).send({ from: minter, additionalScopes });
30
33
  }
31
- // docs:end:token_utils
32
34
 
33
35
  export async function expectTokenBalance(
34
36
  wallet: Wallet,
@@ -38,8 +40,27 @@ export async function expectTokenBalance(
38
40
  logger: Logger,
39
41
  ) {
40
42
  // Then check the balance
41
- const contractWithWallet = await TokenContract.at(token.address, wallet);
42
- const balance = await contractWithWallet.methods.balance_of_private(owner).simulate({ from: owner });
43
+ const contractWithWallet = TokenContract.at(token.address, wallet);
44
+ const { result: balance } = await contractWithWallet.methods.balance_of_private(owner).simulate({ from: owner });
43
45
  logger.info(`Account ${owner} balance: ${balance}`);
44
46
  expect(balance).toBe(expectedBalance);
45
47
  }
48
+
49
+ export async function mintNotes(
50
+ wallet: Wallet,
51
+ minter: AztecAddress,
52
+ recipient: AztecAddress,
53
+ asset: TokenContract,
54
+ noteAmounts: bigint[],
55
+ ): Promise<bigint> {
56
+ // We can only mint 5 notes at a time, since that's the maximum number of calls our entrypoints allow
57
+ // TODO(#13024): mint as many notes as possible in a single tx
58
+ const notesPerIteration = 5;
59
+ for (let mintedNotes = 0; mintedNotes < noteAmounts.length; mintedNotes += notesPerIteration) {
60
+ const toMint = noteAmounts.slice(mintedNotes, mintedNotes + notesPerIteration);
61
+ const actions = toMint.map(amt => asset.methods.mint_to_private(recipient, amt));
62
+ await new BatchCall(wallet, actions).send({ from: minter });
63
+ }
64
+
65
+ return noteAmounts.reduce((prev, curr) => prev + curr, 0n);
66
+ }