@aztec/end-to-end 0.0.1-commit.2ed92850 → 0.0.1-commit.343b43af6

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 (193) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +19 -11
  4. package/dest/bench/client_flows/config.d.ts +2 -2
  5. package/dest/bench/client_flows/config.d.ts.map +1 -1
  6. package/dest/bench/client_flows/config.js +18 -0
  7. package/dest/bench/utils.d.ts +1 -1
  8. package/dest/bench/utils.d.ts.map +1 -1
  9. package/dest/bench/utils.js +6 -3
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +22 -12
  13. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
  16. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  18. package/dest/e2e_epochs/epochs_test.d.ts +15 -7
  19. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  20. package/dest/e2e_epochs/epochs_test.js +86 -41
  21. package/dest/e2e_fees/fees_test.d.ts +2 -2
  22. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  23. package/dest/e2e_fees/fees_test.js +18 -11
  24. package/dest/e2e_l1_publisher/write_json.d.ts +3 -2
  25. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  26. package/dest/e2e_l1_publisher/write_json.js +1 -7
  27. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  28. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  29. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  30. package/dest/e2e_p2p/p2p_network.d.ts +5 -4
  31. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  32. package/dest/e2e_p2p/p2p_network.js +24 -7
  33. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  34. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  35. package/dest/e2e_p2p/reqresp/utils.js +190 -0
  36. package/dest/e2e_p2p/shared.d.ts +22 -2
  37. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  38. package/dest/e2e_p2p/shared.js +40 -5
  39. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  40. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  42. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  43. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  44. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  45. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  46. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  47. package/dest/e2e_token_contract/token_contract_test.js +19 -9
  48. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  49. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  50. package/dest/fixtures/authwit_proxy.js +30 -0
  51. package/dest/fixtures/e2e_prover_test.d.ts +4 -4
  52. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  53. package/dest/fixtures/e2e_prover_test.js +34 -41
  54. package/dest/fixtures/elu_monitor.d.ts +21 -0
  55. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  56. package/dest/fixtures/elu_monitor.js +102 -0
  57. package/dest/fixtures/fixtures.d.ts +5 -1
  58. package/dest/fixtures/fixtures.d.ts.map +1 -1
  59. package/dest/fixtures/fixtures.js +6 -0
  60. package/dest/fixtures/ha_setup.d.ts +71 -0
  61. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  62. package/dest/fixtures/ha_setup.js +116 -0
  63. package/dest/fixtures/index.d.ts +2 -1
  64. package/dest/fixtures/index.d.ts.map +1 -1
  65. package/dest/fixtures/index.js +1 -0
  66. package/dest/fixtures/setup.d.ts +46 -25
  67. package/dest/fixtures/setup.d.ts.map +1 -1
  68. package/dest/fixtures/setup.js +83 -167
  69. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  70. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  71. package/dest/fixtures/setup_p2p_test.js +40 -29
  72. package/dest/fixtures/token_utils.d.ts +2 -2
  73. package/dest/fixtures/token_utils.d.ts.map +1 -1
  74. package/dest/fixtures/token_utils.js +5 -4
  75. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  76. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  77. package/dest/shared/cross_chain_test_harness.js +13 -13
  78. package/dest/shared/gas_portal_test_harness.js +2 -2
  79. package/dest/shared/index.d.ts +2 -1
  80. package/dest/shared/index.d.ts.map +1 -1
  81. package/dest/shared/index.js +1 -0
  82. package/dest/shared/jest_setup.js +41 -1
  83. package/dest/shared/mock_state_view.d.ts +86 -0
  84. package/dest/shared/mock_state_view.d.ts.map +1 -0
  85. package/dest/shared/mock_state_view.js +186 -0
  86. package/dest/shared/submit-transactions.d.ts +2 -2
  87. package/dest/shared/submit-transactions.d.ts.map +1 -1
  88. package/dest/shared/submit-transactions.js +1 -1
  89. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  90. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  91. package/dest/shared/uniswap_l1_l2.js +13 -11
  92. package/dest/simulators/lending_simulator.d.ts +1 -1
  93. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  94. package/dest/simulators/lending_simulator.js +2 -2
  95. package/dest/simulators/token_simulator.d.ts +1 -1
  96. package/dest/simulators/token_simulator.d.ts.map +1 -1
  97. package/dest/simulators/token_simulator.js +3 -24
  98. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  99. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  100. package/dest/spartan/setup_test_wallets.js +54 -11
  101. package/dest/spartan/tx_metrics.d.ts +35 -1
  102. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  103. package/dest/spartan/tx_metrics.js +151 -1
  104. package/dest/spartan/utils/bot.d.ts +3 -2
  105. package/dest/spartan/utils/bot.d.ts.map +1 -1
  106. package/dest/spartan/utils/bot.js +2 -1
  107. package/dest/spartan/utils/config.d.ts +10 -1
  108. package/dest/spartan/utils/config.d.ts.map +1 -1
  109. package/dest/spartan/utils/config.js +4 -1
  110. package/dest/spartan/utils/index.d.ts +6 -4
  111. package/dest/spartan/utils/index.d.ts.map +1 -1
  112. package/dest/spartan/utils/index.js +6 -2
  113. package/dest/spartan/utils/k8s.d.ts +31 -1
  114. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  115. package/dest/spartan/utils/k8s.js +124 -0
  116. package/dest/spartan/utils/nodes.d.ts +14 -5
  117. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  118. package/dest/spartan/utils/nodes.js +204 -33
  119. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  120. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  121. package/dest/spartan/utils/pod_logs.js +74 -0
  122. package/dest/spartan/utils/scripts.d.ts +18 -4
  123. package/dest/spartan/utils/scripts.d.ts.map +1 -1
  124. package/dest/spartan/utils/scripts.js +19 -4
  125. package/dest/test-wallet/test_wallet.d.ts +83 -0
  126. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  127. package/dest/test-wallet/test_wallet.js +214 -0
  128. package/dest/test-wallet/utils.d.ts +41 -0
  129. package/dest/test-wallet/utils.d.ts.map +1 -0
  130. package/dest/test-wallet/utils.js +71 -0
  131. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  132. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  133. package/dest/test-wallet/wallet_worker_script.js +48 -0
  134. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  135. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  136. package/dest/test-wallet/worker_wallet.js +151 -0
  137. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  138. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  139. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  140. package/package.json +46 -43
  141. package/src/bench/client_flows/client_flows_benchmark.ts +42 -38
  142. package/src/bench/client_flows/config.ts +9 -1
  143. package/src/bench/utils.ts +8 -3
  144. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +28 -15
  145. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
  146. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  147. package/src/e2e_epochs/epochs_test.ts +104 -72
  148. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  149. package/src/e2e_fees/fees_test.ts +20 -28
  150. package/src/e2e_l1_publisher/write_json.ts +1 -6
  151. package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
  152. package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
  153. package/src/e2e_p2p/p2p_network.ts +36 -10
  154. package/src/e2e_p2p/reqresp/utils.ts +256 -0
  155. package/src/e2e_p2p/shared.ts +68 -5
  156. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  157. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  158. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  159. package/src/e2e_token_contract/token_contract_test.ts +26 -9
  160. package/src/fixtures/authwit_proxy.ts +50 -0
  161. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  162. package/src/fixtures/e2e_prover_test.ts +40 -44
  163. package/src/fixtures/elu_monitor.ts +126 -0
  164. package/src/fixtures/fixtures.ts +10 -0
  165. package/src/fixtures/ha_setup.ts +186 -0
  166. package/src/fixtures/index.ts +1 -0
  167. package/src/fixtures/setup.ts +113 -227
  168. package/src/fixtures/setup_p2p_test.ts +40 -44
  169. package/src/fixtures/token_utils.ts +6 -3
  170. package/src/guides/up_quick_start.sh +3 -3
  171. package/src/shared/cross_chain_test_harness.ts +13 -9
  172. package/src/shared/gas_portal_test_harness.ts +1 -1
  173. package/src/shared/index.ts +1 -0
  174. package/src/shared/jest_setup.ts +51 -1
  175. package/src/shared/mock_state_view.ts +188 -0
  176. package/src/shared/submit-transactions.ts +3 -2
  177. package/src/shared/uniswap_l1_l2.ts +15 -15
  178. package/src/simulators/lending_simulator.ts +4 -2
  179. package/src/simulators/token_simulator.ts +6 -30
  180. package/src/spartan/setup_test_wallets.ts +102 -17
  181. package/src/spartan/tx_metrics.ts +127 -1
  182. package/src/spartan/utils/bot.ts +4 -1
  183. package/src/spartan/utils/config.ts +3 -0
  184. package/src/spartan/utils/index.ts +10 -1
  185. package/src/spartan/utils/k8s.ts +160 -0
  186. package/src/spartan/utils/nodes.ts +251 -31
  187. package/src/spartan/utils/pod_logs.ts +99 -0
  188. package/src/spartan/utils/scripts.ts +43 -7
  189. package/src/test-wallet/test_wallet.ts +306 -0
  190. package/src/test-wallet/utils.ts +112 -0
  191. package/src/test-wallet/wallet_worker_script.ts +60 -0
  192. package/src/test-wallet/worker_wallet.ts +213 -0
  193. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1,15 +1,12 @@
1
1
  import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
- import { generateSchnorrAccounts, getInitialTestAccountsData } from '@aztec/accounts/testing';
3
- import { createArchiver } from '@aztec/archiver';
2
+ import { generateSchnorrAccounts } from '@aztec/accounts/testing';
4
3
  import { AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
5
4
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
6
5
  import { BatchCall, getContractClassFromArtifact, waitForProven } from '@aztec/aztec.js/contracts';
7
6
  import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
8
7
  import { Fr } from '@aztec/aztec.js/fields';
9
8
  import { createLogger } from '@aztec/aztec.js/log';
10
- import { createAztecNodeClient, waitForNode } from '@aztec/aztec.js/node';
11
9
  import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
12
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
13
10
  import { SPONSORED_FPC_SALT } from '@aztec/constants';
14
11
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
15
12
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -17,40 +14,38 @@ import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
17
14
  import { NULL_KEY } from '@aztec/ethereum/constants';
18
15
  import { deployMulticall3 } from '@aztec/ethereum/contracts';
19
16
  import { deployAztecL1Contracts } from '@aztec/ethereum/deploy-aztec-l1-contracts';
20
- import { DelayedTxUtils, EthCheatCodes, EthCheatCodesWithState, createDelayedL1TxUtilsFromViemWallet, startAnvil } from '@aztec/ethereum/test';
17
+ import { EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
21
18
  import { EpochNumber } from '@aztec/foundation/branded-types';
22
19
  import { SecretValue } from '@aztec/foundation/config';
23
20
  import { randomBytes } from '@aztec/foundation/crypto/random';
24
21
  import { tryRmDir } from '@aztec/foundation/fs';
25
- import { withLogNameSuffix } from '@aztec/foundation/log';
22
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
26
23
  import { retryUntil } from '@aztec/foundation/retry';
27
24
  import { sleep } from '@aztec/foundation/sleep';
28
- import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
25
+ import { TestDateProvider } from '@aztec/foundation/timer';
29
26
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
30
27
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
31
28
  import { MockGossipSubNetwork, getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
32
29
  import { protocolContractsHash } from '@aztec/protocol-contracts';
33
- import { createProverNode } from '@aztec/prover-node';
34
30
  import { getPXEConfig } from '@aztec/pxe/server';
35
31
  import { getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
36
32
  import { tryStop } from '@aztec/stdlib/interfaces/server';
37
33
  import { getConfigEnvVars as getTelemetryConfig, initTelemetryClient } from '@aztec/telemetry-client';
38
34
  import { BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
39
- import { TestWallet, deployFundedSchnorrAccounts } from '@aztec/test-wallet/server';
35
+ import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
40
36
  import { getGenesisValues } from '@aztec/world-state/testing';
41
37
  import fs from 'fs/promises';
42
38
  import { tmpdir } from 'os';
43
39
  import path from 'path';
44
40
  import { generatePrivateKey, mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
45
41
  import { foundry } from 'viem/chains';
42
+ import { TestWallet } from '../test-wallet/test_wallet.js';
46
43
  import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
47
44
  import { getACVMConfig } from './get_acvm_config.js';
48
45
  import { getBBConfig } from './get_bb_config.js';
49
46
  import { isMetricsLoggingRequested, setupMetricsLogger } from './logging.js';
50
47
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
51
48
  export { startAnvil };
52
- const { AZTEC_NODE_URL = '' } = process.env;
53
- const getAztecUrl = ()=>AZTEC_NODE_URL;
54
49
  let telemetry = undefined;
55
50
  async function getTelemetryClient(partialConfig = {}) {
56
51
  if (!telemetry) {
@@ -86,9 +81,9 @@ export const getPrivateKeyFromIndex = (index)=>{
86
81
  * @param aztecNode - An instance of Aztec Node.
87
82
  * @param opts - Partial configuration for the PXE.
88
83
  * @param logger - The logger to be used.
89
- * @param useLogSuffix - Whether to add a randomly generated suffix to the PXE debug logs.
84
+ * @param actor - Actor label to include in log output (e.g., 'pxe-test').
90
85
  * @returns A test wallet, logger and teardown function.
91
- */ export async function setupPXEAndGetWallet(aztecNode, opts = {}, logger = getLogger(), useLogSuffix = false) {
86
+ */ export async function setupPXEAndGetWallet(aztecNode, opts = {}, logger = getLogger(), actor) {
92
87
  const PXEConfig = {
93
88
  ...getPXEConfig(),
94
89
  ...opts
@@ -102,7 +97,7 @@ export const getPrivateKeyFromIndex = (index)=>{
102
97
  }
103
98
  const teardown = configuredDataDirectory ? ()=>Promise.resolve() : ()=>tryRmDir(PXEConfig.dataDirectory);
104
99
  const wallet = await TestWallet.create(aztecNode, PXEConfig, {
105
- useLogSuffix
100
+ loggerActorLabel: actor
106
101
  });
107
102
  return {
108
103
  wallet,
@@ -110,65 +105,6 @@ export const getPrivateKeyFromIndex = (index)=>{
110
105
  teardown
111
106
  };
112
107
  }
113
- /**
114
- * Function to setup the test against a remote deployment. It is assumed that L1 contract are already deployed
115
- */ async function setupWithRemoteEnvironment(account, config, logger, numberOfAccounts) {
116
- const aztecNodeUrl = getAztecUrl();
117
- logger.verbose(`Creating Aztec Node client to remote host ${aztecNodeUrl}`);
118
- const aztecNode = createAztecNodeClient(aztecNodeUrl);
119
- await waitForNode(aztecNode, logger);
120
- logger.verbose('JSON RPC client connected to Aztec Node');
121
- logger.verbose(`Retrieving contract addresses from ${aztecNodeUrl}`);
122
- const { l1ContractAddresses, rollupVersion } = await aztecNode.getNodeInfo();
123
- const l1Client = createExtendedL1Client(config.l1RpcUrls, account, foundry);
124
- const deployL1ContractsValues = {
125
- l1ContractAddresses,
126
- l1Client,
127
- rollupVersion
128
- };
129
- const ethCheatCodes = new EthCheatCodes(config.l1RpcUrls, new DateProvider());
130
- const wallet = await TestWallet.create(aztecNode);
131
- if (config.walletMinFeePadding !== undefined) {
132
- wallet.setMinFeePadding(config.walletMinFeePadding);
133
- }
134
- const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNode, new DateProvider());
135
- const teardown = ()=>Promise.resolve();
136
- logger.verbose('Populating wallet from already registered accounts...');
137
- const initialFundedAccounts = await getInitialTestAccountsData();
138
- if (initialFundedAccounts.length < numberOfAccounts) {
139
- throw new Error(`Required ${numberOfAccounts} accounts. Found ${initialFundedAccounts.length}.`);
140
- }
141
- const testAccounts = await Promise.all(initialFundedAccounts.slice(0, numberOfAccounts).map(async (account)=>{
142
- const accountManager = await wallet.createSchnorrAccount(account.secret, account.salt, account.signingKey);
143
- return accountManager.address;
144
- }));
145
- return {
146
- anvil: undefined,
147
- aztecNode,
148
- aztecNodeService: undefined,
149
- aztecNodeAdmin: undefined,
150
- sequencer: undefined,
151
- proverNode: undefined,
152
- deployL1ContractsValues,
153
- config,
154
- aztecNodeConfig: config,
155
- initialFundedAccounts,
156
- wallet,
157
- accounts: testAccounts,
158
- logger,
159
- cheatCodes,
160
- ethCheatCodes,
161
- prefilledPublicData: undefined,
162
- mockGossipSubNetwork: undefined,
163
- watcher: undefined,
164
- dateProvider: undefined,
165
- telemetryClient: undefined,
166
- acvmConfig: undefined,
167
- bbConfig: undefined,
168
- directoryToCleanup: undefined,
169
- teardown
170
- };
171
- }
172
108
  /**
173
109
  * Sets up the environment for the end-to-end tests.
174
110
  * @param numberOfAccounts - The number of new accounts to be created once the PXE is initiated.
@@ -191,7 +127,10 @@ export const getPrivateKeyFromIndex = (index)=>{
191
127
  config.realProofs = !!opts.realProofs;
192
128
  // Only enforce the time table if requested
193
129
  config.enforceTimeTable = !!opts.enforceTimeTable;
130
+ // Enable the tx delayer for tests (default config has it disabled, so we force-enable it here)
131
+ config.enableDelayer = true;
194
132
  config.listenAddress = '127.0.0.1';
133
+ config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
195
134
  const logger = getLogger();
196
135
  // Create a temp directory for any services that need it and cleanup later
197
136
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
@@ -205,13 +144,11 @@ export const getPrivateKeyFromIndex = (index)=>{
205
144
  if (!isAnvilTestChain(chain.id)) {
206
145
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
207
146
  }
208
- if (AZTEC_NODE_URL) {
209
- throw new Error(`AZTEC_NODE_URL provided but no ETHEREUM_HOSTS set. Refusing to run, please set both variables so tests can deploy L1 contracts to the same Anvil instance`);
210
- }
211
147
  const res = await startAnvil({
212
148
  l1BlockTime: opts.ethereumSlotDuration,
213
149
  accounts: opts.anvilAccounts,
214
- port: opts.anvilPort
150
+ port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
151
+ slotsInAnEpoch: opts.anvilSlotsInAnEpoch
215
152
  });
216
153
  anvil = res.anvil;
217
154
  config.l1RpcUrls = [
@@ -239,8 +176,8 @@ export const getPrivateKeyFromIndex = (index)=>{
239
176
  if (opts.l1PublisherKey && opts.l1PublisherKey.getValue() && opts.l1PublisherKey.getValue() != NULL_KEY) {
240
177
  publisherPrivKeyHex = opts.l1PublisherKey.getValue();
241
178
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
242
- } else if (config.publisherPrivateKeys && config.publisherPrivateKeys.length > 0 && config.publisherPrivateKeys[0].getValue() != NULL_KEY) {
243
- publisherPrivKeyHex = config.publisherPrivateKeys[0].getValue();
179
+ } else if (config.sequencerPublisherPrivateKeys && config.sequencerPublisherPrivateKeys.length > 0 && config.sequencerPublisherPrivateKeys[0].getValue() != NULL_KEY) {
180
+ publisherPrivKeyHex = config.sequencerPublisherPrivateKeys[0].getValue();
244
181
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
245
182
  } else if (!MNEMONIC) {
246
183
  throw new Error(`Mnemonic not provided and no publisher private key`);
@@ -251,17 +188,13 @@ export const getPrivateKeyFromIndex = (index)=>{
251
188
  const publisherPrivKeyRaw = publisherHdAccount.getHdKey().privateKey;
252
189
  const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
253
190
  publisherPrivKeyHex = `0x${publisherPrivKey.toString('hex')}`;
254
- config.publisherPrivateKeys = [
191
+ config.sequencerPublisherPrivateKeys = [
255
192
  new SecretValue(publisherPrivKeyHex)
256
193
  ];
257
194
  }
258
195
  if (config.coinbase === undefined) {
259
196
  config.coinbase = EthAddress.fromString(publisherHdAccount.address);
260
197
  }
261
- if (AZTEC_NODE_URL) {
262
- // we are setting up against a remote environment, l1 contracts are assumed to already be deployed
263
- return await setupWithRemoteEnvironment(publisherHdAccount, config, logger, numberOfAccounts);
264
- }
265
198
  // Determine which addresses to fund in genesis
266
199
  const initialFundedAccounts = opts.initialFundedAccounts ?? await generateSchnorrAccounts(opts.numberOfInitialFundedAccounts ?? Math.max(numberOfAccounts, 10));
267
200
  const addressesToFund = initialFundedAccounts.map((a)=>a.address);
@@ -300,8 +233,12 @@ export const getPrivateKeyFromIndex = (index)=>{
300
233
  if (enableAutomine) {
301
234
  await ethCheatCodes.setAutomine(false);
302
235
  await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
303
- dateProvider.setTime(await ethCheatCodes.timestamp() * 1000);
304
236
  }
237
+ // Always sync dateProvider to L1 time after deploying L1 contracts, regardless of mining mode.
238
+ // In compose mode, L1 time may have drifted ahead of system time due to the local-network watcher
239
+ // warping time forward on each filled slot. Without this sync, the sequencer computes the wrong
240
+ // slot from its dateProvider and cannot propose blocks.
241
+ dateProvider.setTime(await ethCheatCodes.timestamp() * 1000);
305
242
  if (opts.l2StartTime) {
306
243
  await ethCheatCodes.warp(opts.l2StartTime, {
307
244
  resetBlockInterval: true
@@ -355,32 +292,41 @@ export const getPrivateKeyFromIndex = (index)=>{
355
292
  ]);
356
293
  }
357
294
  }
358
- const aztecNodeService = await AztecNodeService.createAndSync(config, {
359
- dateProvider,
360
- telemetry: telemetryClient,
361
- p2pClientDeps,
362
- logger: createLogger('node:MAIN-aztec-node')
363
- }, {
364
- prefilledPublicData
365
- });
295
+ const aztecNodeService = await withLoggerBindings({
296
+ actor: 'node-0'
297
+ }, ()=>AztecNodeService.createAndSync(config, {
298
+ dateProvider,
299
+ telemetry: telemetryClient,
300
+ p2pClientDeps
301
+ }, {
302
+ prefilledPublicData
303
+ }));
366
304
  const sequencerClient = aztecNodeService.getSequencer();
367
- if (sequencerClient) {
368
- const publisher = sequencerClient.sequencer.publisher;
369
- publisher.l1TxUtils = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, config.ethereumSlotDuration, l1Client);
370
- }
371
305
  let proverNode = undefined;
372
306
  if (opts.startProverNode) {
373
307
  logger.verbose('Creating and syncing a simulated prover node...');
374
308
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
375
309
  const proverNodePrivateKeyHex = `0x${proverNodePrivateKey.toString('hex')}`;
376
310
  const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
377
- const proverNodeConfig = {
378
- ...config.proverNodeConfig,
379
- dataDirectory: proverNodeDataDirectory,
380
- p2pEnabled: false
311
+ const p2pClientDeps = {
312
+ p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork),
313
+ rpcTxProviders: [
314
+ aztecNodeService
315
+ ]
381
316
  };
382
- proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, config, proverNodeConfig, aztecNodeService, prefilledPublicData);
317
+ ({ proverNode } = await createAndSyncProverNode(proverNodePrivateKeyHex, config, {
318
+ ...config.proverNodeConfig,
319
+ dataDirectory: proverNodeDataDirectory
320
+ }, {
321
+ dateProvider,
322
+ p2pClientDeps,
323
+ telemetry: telemetryClient
324
+ }, {
325
+ prefilledPublicData
326
+ }));
383
327
  }
328
+ const sequencerDelayer = sequencerClient?.getDelayer();
329
+ const proverDelayer = proverNode?.getProverNode()?.getDelayer();
384
330
  logger.verbose('Creating a pxe...');
385
331
  const pxeConfig = {
386
332
  ...getPXEConfig(),
@@ -389,7 +335,9 @@ export const getPrivateKeyFromIndex = (index)=>{
389
335
  pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
390
336
  // For tests we only want proving enabled if specifically requested
391
337
  pxeConfig.proverEnabled = !!pxeOpts.proverEnabled;
392
- const wallet = await TestWallet.create(aztecNodeService, pxeConfig);
338
+ const wallet = await TestWallet.create(aztecNodeService, pxeConfig, {
339
+ loggerActorLabel: 'pxe-0'
340
+ });
393
341
  if (opts.walletMinFeePadding !== undefined) {
394
342
  wallet.setMinFeePadding(opts.walletMinFeePadding);
395
343
  }
@@ -440,7 +388,7 @@ export const getPrivateKeyFromIndex = (index)=>{
440
388
  logger.error(`Error during e2e test teardown`, err);
441
389
  } finally{
442
390
  try {
443
- await telemetryClient?.stop();
391
+ await telemetryClient.stop();
444
392
  } catch (err) {
445
393
  logger.error(`Error during telemetry client stop`, err);
446
394
  }
@@ -462,6 +410,8 @@ export const getPrivateKeyFromIndex = (index)=>{
462
410
  mockGossipSubNetwork,
463
411
  prefilledPublicData,
464
412
  proverNode,
413
+ sequencerDelayer,
414
+ proverDelayer,
465
415
  sequencer: sequencerClient,
466
416
  teardown,
467
417
  telemetryClient,
@@ -522,75 +472,41 @@ export async function waitForProvenChain(node, targetBlock, timeoutSec = 60, int
522
472
  targetBlock ??= await node.getBlockNumber();
523
473
  await retryUntil(async ()=>await node.getProvenBlockNumber() >= targetBlock, 'proven chain status', timeoutSec, intervalSec);
524
474
  }
525
- export function createAndSyncProverNode(proverNodePrivateKey, aztecNodeConfig, proverNodeConfig, aztecNode, prefilledPublicData = [], proverNodeDeps = {}) {
526
- return withLogNameSuffix('prover-node', async ()=>{
527
- const aztecNodeTxProvider = aztecNode && {
528
- getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
529
- getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
530
- stop: ()=>Promise.resolve()
531
- };
532
- const blobClient = await createBlobClientWithFileStores(aztecNodeConfig, createLogger('blob-client:prover-node'));
533
- const archiverConfig = {
534
- ...aztecNodeConfig,
535
- dataDirectory: proverNodeConfig.dataDirectory
536
- };
537
- const archiver = await createArchiver(archiverConfig, {
538
- blobClient,
539
- dateProvider: proverNodeDeps.dateProvider
540
- }, {
541
- blockUntilSync: true
542
- });
543
- const proverConfig = {
544
- ...aztecNodeConfig,
545
- txCollectionNodeRpcUrls: [],
546
- realProofs: false,
547
- proverAgentCount: 2,
548
- publisherPrivateKeys: [
475
+ /**
476
+ * Creates an AztecNodeService with the prover node enabled as a subsystem.
477
+ * Returns both the aztec node service (for lifecycle management) and the prover node (for test internals access).
478
+ */ export function createAndSyncProverNode(proverNodePrivateKey, baseConfig, configOverrides, deps, options) {
479
+ return withLoggerBindings({
480
+ actor: 'prover-0'
481
+ }, async ()=>{
482
+ const proverNode = await AztecNodeService.createAndSync({
483
+ ...baseConfig,
484
+ ...configOverrides,
485
+ p2pPort: 0,
486
+ enableProverNode: true,
487
+ disableValidator: true,
488
+ proverPublisherPrivateKeys: [
549
489
  new SecretValue(proverNodePrivateKey)
550
- ],
551
- proverNodeMaxPendingJobs: 10,
552
- proverNodeMaxParallelBlocksPerEpoch: 32,
553
- proverNodePollingIntervalMs: 200,
554
- txGatheringIntervalMs: 1000,
555
- txGatheringBatchSize: 10,
556
- txGatheringMaxParallelRequestsPerNode: 10,
557
- txGatheringTimeoutMs: 24_000,
558
- proverNodeFailedEpochStore: undefined,
559
- proverId: EthAddress.fromNumber(1),
560
- proverNodeEpochProvingDelayMs: undefined,
561
- ...proverNodeConfig
562
- };
563
- const l1TxUtils = createDelayedL1TxUtils(aztecNodeConfig, proverNodePrivateKey, 'prover-node', proverNodeDeps.dateProvider);
564
- const proverNode = await createProverNode(proverConfig, {
565
- ...proverNodeDeps,
566
- aztecNodeTxProvider,
567
- archiver: archiver,
568
- l1TxUtils
569
- }, {
570
- prefilledPublicData
571
- });
572
- getLogger().info(`Created and synced prover node`, {
573
- publisherAddress: l1TxUtils.client.account.address
490
+ ]
491
+ }, deps, {
492
+ ...options,
493
+ dontStartProverNode: options.dontStart
574
494
  });
575
- if (!proverNodeConfig.dontStart) {
576
- await proverNode.start();
495
+ if (!proverNode.getProverNode()) {
496
+ throw new Error('Prover node subsystem was not created despite enableProverNode being set');
577
497
  }
578
- return proverNode;
498
+ getLogger().info(`Created and synced prover node`);
499
+ return {
500
+ proverNode
501
+ };
579
502
  });
580
503
  }
581
- function createDelayedL1TxUtils(aztecNodeConfig, privateKey, logName, dateProvider) {
582
- const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
583
- const log = createLogger(logName);
584
- const l1TxUtils = createDelayedL1TxUtilsFromViemWallet(l1Client, log, dateProvider, aztecNodeConfig);
585
- l1TxUtils.enableDelayer(aztecNodeConfig.ethereumSlotDuration);
586
- return l1TxUtils;
587
- }
588
- export function getBalancesFn(symbol, method, from, logger) {
504
+ export function getBalancesFn(symbol, method, logger) {
589
505
  const balances = async (...addressLikes)=>{
590
506
  const addresses = addressLikes.map((addressLike)=>'address' in addressLike ? addressLike.address : addressLike);
591
- const b = await Promise.all(addresses.map((address)=>method(address).simulate({
592
- from
593
- })));
507
+ const b = await Promise.all(addresses.map(async (address)=>(await method(address).simulate({
508
+ from: address
509
+ })).result));
594
510
  const debugString = `${symbol} balances: ${addresses.map((address, i)=>`${address}: ${b[i]}`).join(', ')}`;
595
511
  logger.verbose(debugString);
596
512
  return b;
@@ -667,7 +583,7 @@ export async function expectMappingDelta(initialValues, fn, inputs, expectedDiff
667
583
  ...instances.map((instance)=>publishInstance(wallet, instance))
668
584
  ]);
669
585
  const batch = new BatchCall(wallet, calls);
670
- const txReceipt = await batch.send({
586
+ const { receipt: txReceipt } = await batch.send({
671
587
  from: accountsToDeploy[0]
672
588
  });
673
589
  if (waitUntilProven) {
@@ -3,21 +3,28 @@
3
3
  */
4
4
  import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
5
5
  import type { DateProvider } from '@aztec/foundation/timer';
6
- import type { ProverNodeDeps } from '@aztec/prover-node';
7
6
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
8
- import { AsyncLocalStorage } from 'node:async_hooks';
9
7
  export declare const ATTESTER_PRIVATE_KEYS_START_INDEX = 3;
10
8
  export declare function generatePrivateKeys(startIndex: number, numberOfKeys: number): `0x${string}`[];
11
9
  export declare function createNodes(config: AztecNodeConfig & {
12
10
  dontStartSequencer?: boolean;
13
11
  }, dateProvider: DateProvider, bootstrapNodeEnr: string, numNodes: number, bootNodePort: number, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, indexOffset?: number, validatorsPerNode?: number): Promise<AztecNodeService[]>;
14
- /** Creates a P2P enabled instance of Aztec Node Service with a validator */
15
- export declare function createNode(config: AztecNodeConfig & {
12
+ /** Extended config type for createNode with test-specific overrides. */
13
+ export type CreateNodeConfig = AztecNodeConfig & {
14
+ /** Whether to skip starting the sequencer. */
16
15
  dontStartSequencer?: boolean;
17
- }, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number | number[], prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<AztecNodeService>;
16
+ /** Override the private key (instead of deriving from addressIndex). */
17
+ validatorPrivateKey?: `0x${string}`;
18
+ };
19
+ /** Creates a P2P enabled instance of Aztec Node Service with a validator. */
20
+ export declare function createNode(config: CreateNodeConfig, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number | number[], prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number): Promise<AztecNodeService>;
18
21
  /** Creates a P2P enabled instance of Aztec Node Service without a validator */
19
- export declare function createNonValidatorNode(baseConfig: AztecNodeConfig, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<AztecNodeService>;
20
- export declare function createProverNode(config: AztecNodeConfig, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number, proverNodeDeps: ProverNodeDeps & Required<Pick<ProverNodeDeps, 'dateProvider'>>, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<import("@aztec/prover-node").ProverNode>;
22
+ export declare function createNonValidatorNode(baseConfig: AztecNodeConfig, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number): Promise<AztecNodeService>;
23
+ export declare function createProverNode(config: AztecNodeConfig, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number, deps: {
24
+ dateProvider: DateProvider;
25
+ }, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number): Promise<{
26
+ proverNode: AztecNodeService;
27
+ }>;
21
28
  export declare function createP2PConfig(config: AztecNodeConfig, bootstrapNodeEnr?: string, port?: number, dataDirectory?: string): Promise<AztecNodeConfig>;
22
- export declare function createValidatorConfig(config: AztecNodeConfig, bootstrapNodeEnr?: string, port?: number, addressIndex?: number | number[], dataDirectory?: string): Promise<AztecNodeConfig>;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBfcDJwX3Rlc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maXh0dXJlcy9zZXR1cF9wMnBfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSzNFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFvQixjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBU3JELGVBQU8sTUFBTSxpQ0FBaUMsSUFBSSxDQUFDO0FBRW5ELHdCQUFnQixtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsS0FBSyxNQUFNLEVBQUUsRUFBRSxDQU83RjtBQUVELHdCQUFzQixXQUFXLENBQy9CLE1BQU0sRUFBRSxlQUFlLEdBQUc7SUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQTtDQUFFLEVBQzFELFlBQVksRUFBRSxZQUFZLEVBQzFCLGdCQUFnQixFQUFFLE1BQU0sRUFDeEIsUUFBUSxFQUFFLE1BQU0sRUFDaEIsWUFBWSxFQUFFLE1BQU0sRUFDcEIsbUJBQW1CLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUMxQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFDcEIsV0FBVyxTQUFJLEVBQ2YsaUJBQWlCLFNBQUksR0FDcEIsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0F5QzdCO0FBRUQsNEVBQTRFO0FBQzVFLHdCQUFzQixVQUFVLENBQzlCLE1BQU0sRUFBRSxlQUFlLEdBQUc7SUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQTtDQUFFLEVBQzFELFlBQVksRUFBRSxZQUFZLEVBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQ2YsYUFBYSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQ2pDLFlBQVksRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLEVBQy9CLG1CQUFtQixDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFDMUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUN0QixXQUFXLENBQUMsRUFBRSxNQUFNLEVBQ3BCLGVBQWUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyw2QkFZNUM7QUFFRCwrRUFBK0U7QUFDL0Usd0JBQXNCLHNCQUFzQixDQUMxQyxVQUFVLEVBQUUsZUFBZSxFQUMzQixZQUFZLEVBQUUsWUFBWSxFQUMxQixPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUNqQyxtQkFBbUIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQzFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFDdEIsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUNwQixlQUFlLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsNkJBYzVDO0FBRUQsd0JBQXNCLGdCQUFnQixDQUNwQyxNQUFNLEVBQUUsZUFBZSxFQUN2QixPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUNqQyxZQUFZLEVBQUUsTUFBTSxFQUNwQixjQUFjLEVBQUUsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQy9FLG1CQUFtQixDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFDMUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUN0QixXQUFXLENBQUMsRUFBRSxNQUFNLEVBQ3BCLGVBQWUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxvREF3QjVDO0FBRUQsd0JBQXNCLGVBQWUsQ0FDbkMsTUFBTSxFQUFFLGVBQWUsRUFDdkIsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQ3pCLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFDYixhQUFhLENBQUMsRUFBRSxNQUFNLDRCQWdCdkI7QUFFRCx3QkFBc0IscUJBQXFCLENBQ3pDLE1BQU0sRUFBRSxlQUFlLEVBQ3ZCLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUN6QixJQUFJLENBQUMsRUFBRSxNQUFNLEVBQ2IsWUFBWSxHQUFFLE1BQU0sR0FBRyxNQUFNLEVBQU0sRUFDbkMsYUFBYSxDQUFDLEVBQUUsTUFBTSw0QkFtQnZCIn0=
29
+ export declare function createValidatorConfig(config: CreateNodeConfig, bootstrapNodeEnr?: string, port?: number, addressIndex?: number | number[], dataDirectory?: string): Promise<AztecNodeConfig>;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBfcDJwX3Rlc3QuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maXh0dXJlcy9zZXR1cF9wMnBfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSzNFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFXOUQsZUFBTyxNQUFNLGlDQUFpQyxJQUFJLENBQUM7QUFPbkQsd0JBQWdCLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxLQUFLLE1BQU0sRUFBRSxFQUFFLENBTzdGO0FBRUQsd0JBQXNCLFdBQVcsQ0FDL0IsTUFBTSxFQUFFLGVBQWUsR0FBRztJQUFFLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFBO0NBQUUsRUFDMUQsWUFBWSxFQUFFLFlBQVksRUFDMUIsZ0JBQWdCLEVBQUUsTUFBTSxFQUN4QixRQUFRLEVBQUUsTUFBTSxFQUNoQixZQUFZLEVBQUUsTUFBTSxFQUNwQixtQkFBbUIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQzFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFDdEIsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUNwQixXQUFXLFNBQUksRUFDZixpQkFBaUIsU0FBSSxHQUNwQixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQW1DN0I7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxNQUFNLGdCQUFnQixHQUFHLGVBQWUsR0FBRztJQUMvQyw4Q0FBOEM7SUFDOUMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDN0Isd0VBQXdFO0lBQ3hFLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQztDQUNyQyxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLHdCQUFzQixVQUFVLENBQzlCLE1BQU0sRUFBRSxnQkFBZ0IsRUFDeEIsWUFBWSxFQUFFLFlBQVksRUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFDZixhQUFhLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDakMsWUFBWSxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQUUsRUFDL0IsbUJBQW1CLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUMxQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sNkJBWXJCO0FBRUQsK0VBQStFO0FBQy9FLHdCQUFzQixzQkFBc0IsQ0FDMUMsVUFBVSxFQUFFLGVBQWUsRUFDM0IsWUFBWSxFQUFFLFlBQVksRUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFDZixhQUFhLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDakMsbUJBQW1CLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUMxQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sNkJBY3JCO0FBRUQsd0JBQXNCLGdCQUFnQixDQUNwQyxNQUFNLEVBQUUsZUFBZSxFQUN2QixPQUFPLEVBQUUsTUFBTSxFQUNmLGFBQWEsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUNqQyxZQUFZLEVBQUUsTUFBTSxFQUNwQixJQUFJLEVBQUU7SUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFBO0NBQUUsRUFDcEMsbUJBQW1CLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUMxQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FDbkIsT0FBTyxDQUFDO0lBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFBO0NBQUUsQ0FBQyxDQWdCM0M7QUFFRCx3QkFBc0IsZUFBZSxDQUNuQyxNQUFNLEVBQUUsZUFBZSxFQUN2QixnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFDekIsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUNiLGFBQWEsQ0FBQyxFQUFFLE1BQU0sNEJBZ0J2QjtBQUVELHdCQUFzQixxQkFBcUIsQ0FDekMsTUFBTSxFQUFFLGdCQUFnQixFQUN4QixnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFDekIsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUNiLFlBQVksR0FBRSxNQUFNLEdBQUcsTUFBTSxFQUFNLEVBQ25DLGFBQWEsQ0FBQyxFQUFFLE1BQU0sNEJBb0J2QiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"setup_p2p_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/setup_p2p_test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AASrD,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,EAAE,CAO7F;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,eAAe,GAAG;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1D,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,SAAI,EACf,iBAAiB,SAAI,GACpB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyC7B;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,CAC9B,MAAM,EAAE,eAAe,GAAG;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1D,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,EAC/B,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,6BAY5C;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,6BAc5C;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,EAC/E,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,oDAwB5C;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,gBAAgB,CAAC,EAAE,MAAM,EACzB,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,4BAgBvB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,gBAAgB,CAAC,EAAE,MAAM,EACzB,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,GAAE,MAAM,GAAG,MAAM,EAAM,EACnC,aAAa,CAAC,EAAE,MAAM,4BAmBvB"}
1
+ {"version":3,"file":"setup_p2p_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/setup_p2p_test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAW9D,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAOnD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,EAAE,CAO7F;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,eAAe,GAAG;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1D,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,SAAI,EACf,iBAAiB,SAAI,GACpB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmC7B;AAED,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG;IAC/C,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,6EAA6E;AAC7E,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,EAC/B,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,6BAYrB;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,eAAe,EAC3B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,6BAcrB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,EACpC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,EAC1C,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,UAAU,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAgB3C;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,gBAAgB,CAAC,EAAE,MAAM,EACzB,IAAI,CAAC,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,4BAgBvB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,gBAAgB,CAAC,EAAE,MAAM,EACzB,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,GAAE,MAAM,GAAG,MAAM,EAAM,EACnC,aAAa,CAAC,EAAE,MAAM,4BAoBvB"}
@@ -3,10 +3,9 @@
3
3
  */ import { AztecNodeService } from '@aztec/aztec-node';
4
4
  import { range } from '@aztec/foundation/array';
5
5
  import { SecretValue } from '@aztec/foundation/config';
6
- import { addLogNameHandler, removeLogNameHandler } from '@aztec/foundation/log';
6
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
7
7
  import { bufferToHex } from '@aztec/foundation/string';
8
8
  import getPort from 'get-port';
9
- import { AsyncLocalStorage } from 'node:async_hooks';
10
9
  import { TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
11
10
  import { createAndSyncProverNode, getPrivateKeyFromIndex } from './utils.js';
12
11
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
@@ -14,6 +13,10 @@ import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
14
13
  // index 1, and prover node with index 2, so all of our loops here need to start from 3
15
14
  // to avoid running validators with the same key
16
15
  export const ATTESTER_PRIVATE_KEYS_START_INDEX = 3;
16
+ // Global counters for actor naming (start at 1)
17
+ let validatorCounter = 1;
18
+ let nodeCounter = 1;
19
+ let proverCounter = 1;
17
20
  export function generatePrivateKeys(startIndex, numberOfKeys) {
18
21
  const privateKeys = [];
19
22
  // Do not start from 0 as it is used during setup
@@ -24,9 +27,6 @@ export function generatePrivateKeys(startIndex, numberOfKeys) {
24
27
  }
25
28
  export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNodes, bootNodePort, prefilledPublicData, dataDirectory, metricsPort, indexOffset = 0, validatorsPerNode = 1) {
26
29
  const nodePromises = [];
27
- const loggerIdStorage = new AsyncLocalStorage();
28
- const logNameHandler = (module)=>loggerIdStorage.getStore() ? `${module}:${loggerIdStorage.getStore()}` : module;
29
- addLogNameHandler(logNameHandler);
30
30
  for(let i = 0; i < numNodes; i++){
31
31
  const index = indexOffset + i;
32
32
  // We run on ports from the bootnode upwards
@@ -35,7 +35,7 @@ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNod
35
35
  const validatorIndices = validatorsPerNode === 1 ? index : range(validatorsPerNode, validatorsPerNode * index);
36
36
  // Assign data directory
37
37
  const dataDir = dataDirectory ? `${dataDirectory}-${index}` : undefined;
38
- const nodePromise = createNode(config, dateProvider, port, bootstrapNodeEnr, validatorIndices, prefilledPublicData, dataDir, metricsPort, loggerIdStorage);
38
+ const nodePromise = createNode(config, dateProvider, port, bootstrapNodeEnr, validatorIndices, prefilledPublicData, dataDir, metricsPort);
39
39
  nodePromises.push(nodePromise);
40
40
  }
41
41
  const nodes = await Promise.all(nodePromises);
@@ -44,11 +44,13 @@ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNod
44
44
  if (!seqClient && config.disableValidator === false) {
45
45
  throw new Error('Sequencer not found');
46
46
  }
47
- removeLogNameHandler(logNameHandler);
48
47
  return nodes;
49
48
  }
50
- /** Creates a P2P enabled instance of Aztec Node Service with a validator */ export async function createNode(config, dateProvider, tcpPort, bootstrapNode, addressIndex, prefilledPublicData, dataDirectory, metricsPort, loggerIdStorage) {
51
- const createNode = async ()=>{
49
+ /** Creates a P2P enabled instance of Aztec Node Service with a validator. */ export async function createNode(config, dateProvider, tcpPort, bootstrapNode, addressIndex, prefilledPublicData, dataDirectory, metricsPort) {
50
+ const actorIndex = validatorCounter++;
51
+ return await withLoggerBindings({
52
+ actor: `validator-${actorIndex}`
53
+ }, async ()=>{
52
54
  const validatorConfig = await createValidatorConfig(config, bootstrapNode, tcpPort, addressIndex, dataDirectory);
53
55
  const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
54
56
  return await AztecNodeService.createAndSync(validatorConfig, {
@@ -58,17 +60,19 @@ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNod
58
60
  prefilledPublicData,
59
61
  dontStartSequencer: config.dontStartSequencer
60
62
  });
61
- };
62
- return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createNode) : createNode();
63
+ });
63
64
  }
64
- /** Creates a P2P enabled instance of Aztec Node Service without a validator */ export async function createNonValidatorNode(baseConfig, dateProvider, tcpPort, bootstrapNode, prefilledPublicData, dataDirectory, metricsPort, loggerIdStorage) {
65
- const createNode = async ()=>{
65
+ /** Creates a P2P enabled instance of Aztec Node Service without a validator */ export async function createNonValidatorNode(baseConfig, dateProvider, tcpPort, bootstrapNode, prefilledPublicData, dataDirectory, metricsPort) {
66
+ const actorIndex = nodeCounter++;
67
+ return await withLoggerBindings({
68
+ actor: `node-${actorIndex}`
69
+ }, async ()=>{
66
70
  const p2pConfig = await createP2PConfig(baseConfig, bootstrapNode, tcpPort, dataDirectory);
67
71
  const config = {
68
72
  ...p2pConfig,
69
73
  disableValidator: true,
70
74
  validatorPrivateKeys: undefined,
71
- publisherPrivateKeys: []
75
+ sequencerPublisherPrivateKeys: []
72
76
  };
73
77
  const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
74
78
  return await AztecNodeService.createAndSync(config, {
@@ -77,24 +81,28 @@ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNod
77
81
  }, {
78
82
  prefilledPublicData
79
83
  });
80
- };
81
- return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createNode) : createNode();
84
+ });
82
85
  }
83
- export async function createProverNode(config, tcpPort, bootstrapNode, addressIndex, proverNodeDeps, prefilledPublicData, dataDirectory, metricsPort, loggerIdStorage) {
84
- const createProverNode = async ()=>{
86
+ export async function createProverNode(config, tcpPort, bootstrapNode, addressIndex, deps, prefilledPublicData, dataDirectory, metricsPort) {
87
+ const actorIndex = proverCounter++;
88
+ return await withLoggerBindings({
89
+ actor: `prover-${actorIndex}`
90
+ }, async ()=>{
85
91
  const proverNodePrivateKey = getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex);
86
92
  const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
87
- const proverConfig = await createP2PConfig(config, bootstrapNode, tcpPort, dataDirectory);
88
- const aztecNodeRpcTxProvider = undefined;
89
- return await createAndSyncProverNode(bufferToHex(proverNodePrivateKey), config, {
90
- ...proverConfig,
93
+ const p2pConfig = await createP2PConfig(config, bootstrapNode, tcpPort, dataDirectory);
94
+ return await createAndSyncProverNode(bufferToHex(proverNodePrivateKey), {
95
+ ...config,
96
+ ...p2pConfig
97
+ }, {
91
98
  dataDirectory
92
- }, aztecNodeRpcTxProvider, prefilledPublicData, {
93
- ...proverNodeDeps,
99
+ }, {
100
+ ...deps,
94
101
  telemetry
102
+ }, {
103
+ prefilledPublicData: prefilledPublicData ?? []
95
104
  });
96
- };
97
- return loggerIdStorage ? await loggerIdStorage.run(tcpPort.toString(), createProverNode) : createProverNode();
105
+ });
98
106
  }
99
107
  export async function createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory) {
100
108
  port = port ?? await getPort();
@@ -116,16 +124,19 @@ export async function createValidatorConfig(config, bootstrapNodeEnr, port, addr
116
124
  const addressIndices = Array.isArray(addressIndex) ? addressIndex : [
117
125
  addressIndex
118
126
  ];
119
- if (addressIndices.length === 0) {
127
+ if (addressIndices.length === 0 && !config.validatorPrivateKey) {
120
128
  throw new Error('At least one address index must be provided to create a validator config');
121
129
  }
122
- const attesterPrivateKeys = addressIndices.map((index)=>bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)));
130
+ // Use override private key if provided, otherwise derive from address indices
131
+ const attesterPrivateKeys = config.validatorPrivateKey ? [
132
+ config.validatorPrivateKey
133
+ ] : addressIndices.map((index)=>bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)));
123
134
  const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
124
135
  const nodeConfig = {
125
136
  ...config,
126
137
  ...p2pConfig,
127
138
  validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
128
- publisherPrivateKeys: [
139
+ sequencerPublisherPrivateKeys: [
129
140
  new SecretValue(attesterPrivateKeys[0])
130
141
  ]
131
142
  };