@aztec/end-to-end 0.0.0-test.1 → 0.0.1-commit.1142ef1

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 (186) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +61 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +80 -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 +336 -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 +106 -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 +14 -40
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +37 -70
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +21 -13
  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 +85 -57
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +29 -28
  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 +79 -82
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +16 -8
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +13 -19
  25. package/dest/e2e_epochs/epochs_test.d.ts +65 -22
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +233 -49
  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 +63 -0
  31. package/dest/e2e_fees/fees_test.d.ts +27 -12
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +107 -110
  34. package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +55 -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 +10 -7
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +24 -20
  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 +276 -23
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +188 -133
  49. package/dest/e2e_p2p/shared.d.ts +43 -7
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +164 -19
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +12 -6
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +50 -26
  55. package/dest/fixtures/e2e_prover_test.d.ts +61 -0
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +108 -113
  58. package/dest/fixtures/fixtures.d.ts +6 -8
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +5 -5
  61. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  62. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  63. package/dest/fixtures/get_acvm_config.js +3 -15
  64. package/dest/fixtures/get_bb_config.d.ts +2 -2
  65. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_bb_config.js +10 -17
  67. package/dest/fixtures/index.d.ts +1 -1
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts +11 -7
  69. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  70. package/dest/fixtures/l1_to_l2_messaging.js +45 -19
  71. package/dest/fixtures/logging.d.ts +1 -1
  72. package/dest/fixtures/setup_p2p_test.d.ts +15 -14
  73. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  74. package/dest/fixtures/setup_p2p_test.js +82 -22
  75. package/dest/fixtures/snapshot_manager.d.ts +20 -14
  76. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  77. package/dest/fixtures/snapshot_manager.js +147 -138
  78. package/dest/fixtures/token_utils.d.ts +10 -4
  79. package/dest/fixtures/token_utils.d.ts.map +1 -1
  80. package/dest/fixtures/token_utils.js +28 -12
  81. package/dest/fixtures/utils.d.ts +92 -54
  82. package/dest/fixtures/utils.d.ts.map +1 -1
  83. package/dest/fixtures/utils.js +452 -389
  84. package/dest/fixtures/web3signer.d.ts +5 -0
  85. package/dest/fixtures/web3signer.d.ts.map +1 -0
  86. package/dest/fixtures/web3signer.js +53 -0
  87. package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
  88. package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
  89. package/dest/fixtures/with_telemetry_utils.js +2 -2
  90. package/dest/index.d.ts +1 -1
  91. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  92. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  93. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  94. package/dest/shared/cross_chain_test_harness.d.ts +42 -35
  95. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  96. package/dest/shared/cross_chain_test_harness.js +106 -52
  97. package/dest/shared/gas_portal_test_harness.d.ts +29 -31
  98. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  99. package/dest/shared/gas_portal_test_harness.js +51 -30
  100. package/dest/shared/index.d.ts +2 -2
  101. package/dest/shared/index.d.ts.map +1 -1
  102. package/dest/shared/jest_setup.d.ts +1 -1
  103. package/dest/shared/jest_setup.js +1 -1
  104. package/dest/shared/submit-transactions.d.ts +6 -4
  105. package/dest/shared/submit-transactions.d.ts.map +1 -1
  106. package/dest/shared/submit-transactions.js +8 -7
  107. package/dest/shared/uniswap_l1_l2.d.ts +3 -25
  108. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  109. package/dest/shared/uniswap_l1_l2.js +170 -120
  110. package/dest/simulators/index.d.ts +1 -1
  111. package/dest/simulators/lending_simulator.d.ts +7 -11
  112. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  113. package/dest/simulators/lending_simulator.js +16 -17
  114. package/dest/simulators/token_simulator.d.ts +6 -3
  115. package/dest/simulators/token_simulator.d.ts.map +1 -1
  116. package/dest/simulators/token_simulator.js +16 -13
  117. package/dest/spartan/setup_test_wallets.d.ts +27 -11
  118. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  119. package/dest/spartan/setup_test_wallets.js +202 -58
  120. package/dest/spartan/tx_metrics.d.ts +39 -0
  121. package/dest/spartan/tx_metrics.d.ts.map +1 -0
  122. package/dest/spartan/tx_metrics.js +95 -0
  123. package/dest/spartan/utils.d.ts +151 -313
  124. package/dest/spartan/utils.d.ts.map +1 -1
  125. package/dest/spartan/utils.js +598 -151
  126. package/package.json +65 -58
  127. package/src/bench/client_flows/benchmark.ts +341 -0
  128. package/src/bench/client_flows/client_flows_benchmark.ts +450 -0
  129. package/src/bench/client_flows/config.ts +61 -0
  130. package/src/bench/client_flows/data_extractor.ts +89 -0
  131. package/src/bench/utils.ts +35 -81
  132. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
  133. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +103 -122
  134. package/src/e2e_deploy_contract/deploy_test.ts +24 -39
  135. package/src/e2e_epochs/epochs_test.ts +299 -65
  136. package/src/e2e_fees/bridging_race.notest.ts +80 -0
  137. package/src/e2e_fees/fees_test.ts +150 -142
  138. package/src/e2e_l1_publisher/write_json.ts +74 -0
  139. package/src/e2e_multi_validator/utils.ts +258 -0
  140. package/src/e2e_nested_contract/nested_contract_test.ts +29 -19
  141. package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
  142. package/src/e2e_p2p/p2p_network.ts +274 -171
  143. package/src/e2e_p2p/shared.ts +252 -29
  144. package/src/e2e_token_contract/token_contract_test.ts +43 -39
  145. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  146. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +112 -160
  147. package/src/fixtures/fixtures.ts +5 -7
  148. package/src/fixtures/get_acvm_config.ts +4 -12
  149. package/src/fixtures/get_bb_config.ts +18 -13
  150. package/src/fixtures/l1_to_l2_messaging.ts +56 -24
  151. package/src/fixtures/setup_p2p_test.ts +127 -39
  152. package/src/fixtures/snapshot_manager.ts +189 -160
  153. package/src/fixtures/token_utils.ts +32 -15
  154. package/src/fixtures/utils.ts +556 -475
  155. package/src/fixtures/web3signer.ts +63 -0
  156. package/src/fixtures/with_telemetry_utils.ts +2 -2
  157. package/src/guides/up_quick_start.sh +7 -15
  158. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +2 -2
  159. package/src/shared/cross_chain_test_harness.ts +113 -87
  160. package/src/shared/gas_portal_test_harness.ts +59 -50
  161. package/src/shared/index.ts +1 -1
  162. package/src/shared/jest_setup.ts +1 -1
  163. package/src/shared/submit-transactions.ts +12 -8
  164. package/src/shared/uniswap_l1_l2.ts +194 -211
  165. package/src/simulators/lending_simulator.ts +15 -16
  166. package/src/simulators/token_simulator.ts +21 -13
  167. package/src/spartan/DEVELOP.md +128 -0
  168. package/src/spartan/setup_test_wallets.ts +258 -93
  169. package/src/spartan/tx_metrics.ts +130 -0
  170. package/src/spartan/utils.ts +722 -146
  171. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  172. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  173. package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
  174. package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
  175. package/dest/fixtures/setup_l1_contracts.js +0 -17
  176. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  177. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  178. package/dest/sample-dapp/connect.js +0 -12
  179. package/dest/sample-dapp/contracts.js +0 -10
  180. package/dest/sample-dapp/deploy.js +0 -35
  181. package/dest/sample-dapp/index.js +0 -98
  182. package/src/fixtures/setup_l1_contracts.ts +0 -27
  183. package/src/sample-dapp/connect.mjs +0 -16
  184. package/src/sample-dapp/contracts.mjs +0 -14
  185. package/src/sample-dapp/deploy.mjs +0 -40
  186. package/src/sample-dapp/index.mjs +0 -128
@@ -1,50 +1,82 @@
1
- import type { L1ContractAddresses, ViemPublicClient, ViemWalletClient } from '@aztec/ethereum';
2
- import { Fr } from '@aztec/foundation/fields';
1
+ import { RollupContract } from '@aztec/ethereum/contracts';
2
+ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
3
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
5
+ import { tryJsonStringify } from '@aztec/foundation/json-rpc';
3
6
  import { InboxAbi } from '@aztec/l1-artifacts';
4
7
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
8
 
6
- import { expect } from '@jest/globals';
7
9
  import { decodeEventLog, getContract } from 'viem';
8
10
 
11
+ import { getLogger } from './utils.js';
12
+
9
13
  export async function sendL1ToL2Message(
10
14
  message: { recipient: AztecAddress; content: Fr; secretHash: Fr },
11
15
  ctx: {
12
- walletClient: ViemWalletClient;
13
- publicClient: ViemPublicClient;
14
- l1ContractAddresses: Pick<L1ContractAddresses, 'inboxAddress'>;
16
+ l1Client: ExtendedViemWalletClient;
17
+ l1ContractAddresses: Pick<L1ContractAddresses, 'inboxAddress' | 'rollupAddress'>;
15
18
  },
16
19
  ) {
20
+ const logger = getLogger();
17
21
  const inbox = getContract({
18
22
  address: ctx.l1ContractAddresses.inboxAddress.toString(),
19
23
  abi: InboxAbi,
20
- client: ctx.walletClient,
24
+ client: ctx.l1Client,
21
25
  });
22
26
 
23
27
  const { recipient, content, secretHash } = message;
24
- const version = 1;
28
+
29
+ const version = await new RollupContract(ctx.l1Client, ctx.l1ContractAddresses.rollupAddress.toString()).getVersion();
25
30
 
26
31
  // We inject the message to Inbox
27
- const txHash = await inbox.write.sendL2Message([
28
- { actor: recipient.toString(), version: BigInt(version) },
29
- content.toString(),
30
- secretHash.toString(),
31
- ]);
32
+ const txHash = await inbox.write.sendL2Message(
33
+ [{ actor: recipient.toString(), version: BigInt(version) }, content.toString(), secretHash.toString()],
34
+ {
35
+ gas: 1_000_000n,
36
+ },
37
+ );
38
+ logger.info(`L1 to L2 message sent in tx ${txHash}`);
32
39
 
33
40
  // We check that the message was correctly injected by checking the emitted event
34
- const txReceipt = await ctx.publicClient.waitForTransactionReceipt({ hash: txHash });
41
+ const txReceipt = await ctx.l1Client.waitForTransactionReceipt({ hash: txHash });
35
42
 
36
- // Exactly 1 event should be emitted in the transaction
37
- expect(txReceipt.logs.length).toBe(1);
43
+ if (txReceipt.status !== 'success') {
44
+ throw new Error(`L1 to L2 message failed to be sent in tx ${txHash}. Status: ${txReceipt.status}`);
45
+ }
38
46
 
39
- // We decode the event and get leaf out of it
40
- const messageSentLog = txReceipt.logs[0];
41
- const topics = decodeEventLog({
42
- abi: InboxAbi,
43
- data: messageSentLog.data,
44
- topics: messageSentLog.topics,
45
- });
47
+ logger.info(`L1 to L2 message receipt retrieved for tx ${txReceipt.transactionHash}`, txReceipt);
48
+
49
+ if (txReceipt.transactionHash !== txHash) {
50
+ throw new Error(`Receipt transaction hash mismatch: ${txReceipt.transactionHash} !== ${txHash}`);
51
+ }
52
+
53
+ // Filter for MessageSent events from the Inbox contract by trying to decode each log
54
+ const messageSentLogs = txReceipt.logs
55
+ .filter(log => log.address.toLowerCase() === ctx.l1ContractAddresses.inboxAddress.toString().toLowerCase())
56
+ .map(log => {
57
+ try {
58
+ const decoded = decodeEventLog({
59
+ abi: InboxAbi,
60
+ data: log.data,
61
+ topics: log.topics,
62
+ });
63
+ return { log, decoded };
64
+ } catch {
65
+ return null; // Not a decodable event from this ABI
66
+ }
67
+ })
68
+ .filter((item): item is { log: any; decoded: any } => item !== null && item.decoded.eventName === 'MessageSent');
69
+
70
+ if (messageSentLogs.length !== 1) {
71
+ throw new Error(
72
+ `Wrong number of MessageSent logs found in ${txHash} transaction (got ${messageSentLogs.length} expected 1)\n${tryJsonStringify(messageSentLogs.map(item => item.log))}`,
73
+ );
74
+ }
75
+
76
+ // We already have the decoded event
77
+ const topics = messageSentLogs[0].decoded;
46
78
  const receivedMsgHash = topics.args.hash;
47
79
  const receivedGlobalLeafIndex = topics.args.index;
48
80
 
49
- return [Fr.fromHexString(receivedMsgHash), new Fr(receivedGlobalLeafIndex)];
81
+ return { msgHash: Fr.fromHexString(receivedMsgHash), globalLeafIndex: new Fr(receivedGlobalLeafIndex), txReceipt };
50
82
  }
@@ -2,29 +2,25 @@
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';
5
+ import { range } from '@aztec/foundation/array';
6
+ import { SecretValue } from '@aztec/foundation/config';
6
7
  import { addLogNameHandler, removeLogNameHandler } from '@aztec/foundation/log';
8
+ import { bufferToHex } from '@aztec/foundation/string';
7
9
  import type { DateProvider } from '@aztec/foundation/timer';
8
- import type { PXEService } from '@aztec/pxe/server';
10
+ import type { ProverNodeConfig, ProverNodeDeps } from '@aztec/prover-node';
9
11
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
10
12
 
11
13
  import getPort from 'get-port';
12
14
  import { AsyncLocalStorage } from 'node:async_hooks';
13
15
 
14
16
  import { TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
15
- import { getPrivateKeyFromIndex } from './utils.js';
17
+ import { createAndSyncProverNode, getPrivateKeyFromIndex } from './utils.js';
16
18
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
17
19
 
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;
22
-
23
- export interface NodeContext {
24
- node: AztecNodeService;
25
- pxeService: PXEService;
26
- txs: SentTx[];
27
- }
20
+ // Setup snapshots will create a node with index 0, and run extra bootstrap with
21
+ // index 1, and prover node with index 2, so all of our loops here need to start from 3
22
+ // to avoid running validators with the same key
23
+ export const ATTESTER_PRIVATE_KEYS_START_INDEX = 3;
28
24
 
29
25
  export function generatePrivateKeys(startIndex: number, numberOfKeys: number): `0x${string}`[] {
30
26
  const privateKeys: `0x${string}`[] = [];
@@ -36,7 +32,7 @@ export function generatePrivateKeys(startIndex: number, numberOfKeys: number): `
36
32
  }
37
33
 
38
34
  export async function createNodes(
39
- config: AztecNodeConfig,
35
+ config: AztecNodeConfig & { dontStartSequencer?: boolean },
40
36
  dateProvider: DateProvider,
41
37
  bootstrapNodeEnr: string,
42
38
  numNodes: number,
@@ -44,6 +40,8 @@ export async function createNodes(
44
40
  prefilledPublicData?: PublicDataTreeLeaf[],
45
41
  dataDirectory?: string,
46
42
  metricsPort?: number,
43
+ indexOffset = 0,
44
+ validatorsPerNode = 1,
47
45
  ): Promise<AztecNodeService[]> {
48
46
  const nodePromises: Promise<AztecNodeService>[] = [];
49
47
  const loggerIdStorage = new AsyncLocalStorage<string>();
@@ -52,16 +50,22 @@ export async function createNodes(
52
50
  addLogNameHandler(logNameHandler);
53
51
 
54
52
  for (let i = 0; i < numNodes; i++) {
53
+ const index = indexOffset + i;
55
54
  // We run on ports from the bootnode upwards
56
- const port = bootNodePort + i + 1;
55
+ const port = bootNodePort + 1 + index;
56
+
57
+ // Determine validator indices for this node
58
+ const validatorIndices = validatorsPerNode === 1 ? index : range(validatorsPerNode, validatorsPerNode * index);
59
+
60
+ // Assign data directory
61
+ const dataDir = dataDirectory ? `${dataDirectory}-${index}` : undefined;
57
62
 
58
- const dataDir = dataDirectory ? `${dataDirectory}-${i}` : undefined;
59
63
  const nodePromise = createNode(
60
64
  config,
61
65
  dateProvider,
62
66
  port,
63
67
  bootstrapNodeEnr,
64
- i,
68
+ validatorIndices,
65
69
  prefilledPublicData,
66
70
  dataDir,
67
71
  metricsPort,
@@ -70,55 +74,113 @@ export async function createNodes(
70
74
  nodePromises.push(nodePromise);
71
75
  }
72
76
  const nodes = await Promise.all(nodePromises);
77
+
78
+ // Sanity check that we have a sequencer if required
79
+ const seqClient = nodes[0].getSequencer();
80
+ if (!seqClient && config.disableValidator === false) {
81
+ throw new Error('Sequencer not found');
82
+ }
83
+
73
84
  removeLogNameHandler(logNameHandler);
74
85
  return nodes;
75
86
  }
76
87
 
77
- // creates a P2P enabled instance of Aztec Node Service
88
+ /** Creates a P2P enabled instance of Aztec Node Service with a validator */
78
89
  export async function createNode(
79
- config: AztecNodeConfig,
90
+ config: AztecNodeConfig & { dontStartSequencer?: boolean },
80
91
  dateProvider: DateProvider,
81
92
  tcpPort: number,
82
93
  bootstrapNode: string | undefined,
83
- accountIndex: number,
94
+ addressIndex: number | number[],
84
95
  prefilledPublicData?: PublicDataTreeLeaf[],
85
96
  dataDirectory?: string,
86
97
  metricsPort?: number,
87
98
  loggerIdStorage?: AsyncLocalStorage<string>,
88
99
  ) {
89
100
  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 });
101
+ const validatorConfig = await createValidatorConfig(config, bootstrapNode, tcpPort, addressIndex, dataDirectory);
102
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
103
+ return await AztecNodeService.createAndSync(
104
+ validatorConfig,
105
+ { telemetry, dateProvider },
106
+ { prefilledPublicData, dontStartSequencer: config.dontStartSequencer },
107
+ );
93
108
  };
94
109
  return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createNode) : createNode();
95
110
  }
96
111
 
97
- export async function createValidatorConfig(
112
+ /** Creates a P2P enabled instance of Aztec Node Service without a validator */
113
+ export async function createNonValidatorNode(
114
+ baseConfig: AztecNodeConfig,
115
+ dateProvider: DateProvider,
116
+ tcpPort: number,
117
+ bootstrapNode: string | undefined,
118
+ prefilledPublicData?: PublicDataTreeLeaf[],
119
+ dataDirectory?: string,
120
+ metricsPort?: number,
121
+ loggerIdStorage?: AsyncLocalStorage<string>,
122
+ ) {
123
+ const createNode = async () => {
124
+ const p2pConfig = await createP2PConfig(baseConfig, bootstrapNode, tcpPort, dataDirectory);
125
+ const config: AztecNodeConfig = {
126
+ ...p2pConfig,
127
+ disableValidator: true,
128
+ validatorPrivateKeys: undefined,
129
+ publisherPrivateKeys: [],
130
+ };
131
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
132
+ return await AztecNodeService.createAndSync(config, { telemetry, dateProvider }, { prefilledPublicData });
133
+ };
134
+ return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createNode) : createNode();
135
+ }
136
+
137
+ export async function createProverNode(
138
+ config: AztecNodeConfig,
139
+ tcpPort: number,
140
+ bootstrapNode: string | undefined,
141
+ addressIndex: number,
142
+ proverNodeDeps: ProverNodeDeps & Required<Pick<ProverNodeDeps, 'dateProvider'>>,
143
+ prefilledPublicData?: PublicDataTreeLeaf[],
144
+ dataDirectory?: string,
145
+ metricsPort?: number,
146
+ loggerIdStorage?: AsyncLocalStorage<string>,
147
+ ) {
148
+ const createProverNode = async () => {
149
+ const proverNodePrivateKey = getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex)!;
150
+ const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
151
+
152
+ const proverConfig: Partial<ProverNodeConfig> = await createP2PConfig(
153
+ config,
154
+ bootstrapNode,
155
+ tcpPort,
156
+ dataDirectory,
157
+ );
158
+
159
+ const aztecNodeRpcTxProvider = undefined;
160
+ return await createAndSyncProverNode(
161
+ bufferToHex(proverNodePrivateKey),
162
+ config,
163
+ { ...proverConfig, dataDirectory },
164
+ aztecNodeRpcTxProvider,
165
+ prefilledPublicData,
166
+ { ...proverNodeDeps, telemetry },
167
+ );
168
+ };
169
+ return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createProverNode) : createProverNode();
170
+ }
171
+
172
+ export async function createP2PConfig(
98
173
  config: AztecNodeConfig,
99
174
  bootstrapNodeEnr?: string,
100
175
  port?: number,
101
- accountIndex: number = 1,
102
176
  dataDirectory?: string,
103
177
  ) {
104
178
  port = port ?? (await getPort());
105
179
 
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
180
  const nodeConfig: AztecNodeConfig = {
117
181
  ...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}`,
182
+ p2pIp: `127.0.0.1`,
183
+ p2pPort: port,
122
184
  p2pEnabled: true,
123
185
  peerCheckIntervalMS: TEST_PEER_CHECK_INTERVAL_MS,
124
186
  blockCheckIntervalMS: 1000,
@@ -128,3 +190,29 @@ export async function createValidatorConfig(
128
190
 
129
191
  return nodeConfig;
130
192
  }
193
+
194
+ export async function createValidatorConfig(
195
+ config: AztecNodeConfig,
196
+ bootstrapNodeEnr?: string,
197
+ port?: number,
198
+ addressIndex: number | number[] = 1,
199
+ dataDirectory?: string,
200
+ ) {
201
+ const addressIndices = Array.isArray(addressIndex) ? addressIndex : [addressIndex];
202
+ if (addressIndices.length === 0) {
203
+ throw new Error('At least one address index must be provided to create a validator config');
204
+ }
205
+
206
+ const attesterPrivateKeys = addressIndices.map(index =>
207
+ bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)!),
208
+ );
209
+ const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
210
+ const nodeConfig: AztecNodeConfig = {
211
+ ...config,
212
+ ...p2pConfig,
213
+ validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
214
+ publisherPrivateKeys: [new SecretValue(attesterPrivateKeys[0])],
215
+ };
216
+
217
+ return nodeConfig;
218
+ }