@aztec/end-to-end 0.0.1-commit.0c875d939 → 0.0.1-commit.0dc957cde

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 (165) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.js +21 -28
  5. package/dest/bench/utils.d.ts +1 -1
  6. package/dest/bench/utils.d.ts.map +1 -1
  7. package/dest/bench/utils.js +6 -3
  8. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -2
  9. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +15 -15
  11. package/dest/e2e_epochs/epochs_test.d.ts +26 -7
  12. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  13. package/dest/e2e_epochs/epochs_test.js +113 -43
  14. package/dest/e2e_fees/fees_test.d.ts +1 -1
  15. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  16. package/dest/e2e_fees/fees_test.js +16 -9
  17. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  18. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  19. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  20. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  21. package/dest/e2e_p2p/p2p_network.d.ts +13 -11
  22. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  23. package/dest/e2e_p2p/p2p_network.js +70 -34
  24. package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
  25. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  26. package/dest/e2e_p2p/reqresp/utils.js +46 -9
  27. package/dest/e2e_p2p/shared.d.ts +25 -7
  28. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  29. package/dest/e2e_p2p/shared.js +69 -49
  30. package/dest/e2e_token_contract/token_contract_test.d.ts +1 -1
  31. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  32. package/dest/e2e_token_contract/token_contract_test.js +11 -11
  33. package/dest/fixtures/authwit_proxy.d.ts +3 -3
  34. package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
  35. package/dest/fixtures/authwit_proxy.js +4 -0
  36. package/dest/fixtures/e2e_prover_test.d.ts +6 -5
  37. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  38. package/dest/fixtures/e2e_prover_test.js +37 -49
  39. package/dest/fixtures/elu_monitor.d.ts +21 -0
  40. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  41. package/dest/fixtures/elu_monitor.js +102 -0
  42. package/dest/fixtures/fixtures.d.ts +16 -1
  43. package/dest/fixtures/fixtures.d.ts.map +1 -1
  44. package/dest/fixtures/fixtures.js +16 -0
  45. package/dest/fixtures/get_bb_config.d.ts +1 -1
  46. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  47. package/dest/fixtures/get_bb_config.js +5 -5
  48. package/dest/fixtures/ha_setup.d.ts +2 -2
  49. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  50. package/dest/fixtures/ha_setup.js +1 -1
  51. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  52. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  53. package/dest/fixtures/schnorr_hardcoded_account_contract.js +39 -0
  54. package/dest/fixtures/setup.d.ts +45 -17
  55. package/dest/fixtures/setup.d.ts.map +1 -1
  56. package/dest/fixtures/setup.js +88 -99
  57. package/dest/fixtures/setup_p2p_test.d.ts +10 -7
  58. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  59. package/dest/fixtures/setup_p2p_test.js +18 -15
  60. package/dest/fixtures/token_utils.d.ts +2 -2
  61. package/dest/fixtures/token_utils.d.ts.map +1 -1
  62. package/dest/fixtures/token_utils.js +5 -7
  63. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  64. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  65. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  66. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  67. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  68. package/dest/forward-compatibility/wallet_service.js +109 -0
  69. package/dest/legacy-jest-resolver.d.cts +3 -0
  70. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  71. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  72. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  73. package/dest/shared/cross_chain_test_harness.js +13 -13
  74. package/dest/shared/gas_portal_test_harness.js +3 -3
  75. package/dest/shared/jest_setup.js +41 -1
  76. package/dest/shared/submit-transactions.js +1 -1
  77. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  78. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  79. package/dest/shared/uniswap_l1_l2.js +14 -21
  80. package/dest/simulators/lending_simulator.d.ts +1 -1
  81. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  82. package/dest/simulators/lending_simulator.js +4 -4
  83. package/dest/simulators/token_simulator.d.ts +1 -1
  84. package/dest/simulators/token_simulator.d.ts.map +1 -1
  85. package/dest/simulators/token_simulator.js +2 -2
  86. package/dest/spartan/setup_test_wallets.d.ts +11 -2
  87. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  88. package/dest/spartan/setup_test_wallets.js +97 -38
  89. package/dest/spartan/tx_metrics.js +1 -1
  90. package/dest/spartan/utils/bot.d.ts +3 -2
  91. package/dest/spartan/utils/bot.d.ts.map +1 -1
  92. package/dest/spartan/utils/bot.js +2 -1
  93. package/dest/spartan/utils/config.d.ts +7 -1
  94. package/dest/spartan/utils/config.d.ts.map +1 -1
  95. package/dest/spartan/utils/config.js +3 -1
  96. package/dest/spartan/utils/index.d.ts +4 -2
  97. package/dest/spartan/utils/index.d.ts.map +1 -1
  98. package/dest/spartan/utils/index.js +5 -1
  99. package/dest/spartan/utils/k8s.d.ts +3 -1
  100. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  101. package/dest/spartan/utils/k8s.js +6 -0
  102. package/dest/spartan/utils/nodes.d.ts +4 -5
  103. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  104. package/dest/spartan/utils/nodes.js +9 -9
  105. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  106. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  107. package/dest/spartan/utils/pod_logs.js +74 -0
  108. package/dest/test-wallet/test_wallet.d.ts +24 -23
  109. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  110. package/dest/test-wallet/test_wallet.js +119 -82
  111. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  112. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  113. package/dest/test-wallet/wallet_worker_script.js +48 -0
  114. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  115. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  116. package/dest/test-wallet/worker_wallet.js +151 -0
  117. package/dest/test-wallet/worker_wallet_schema.d.ts +279 -0
  118. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  119. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  120. package/package.json +43 -44
  121. package/src/bench/client_flows/client_flows_benchmark.ts +29 -12
  122. package/src/bench/utils.ts +7 -2
  123. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +21 -20
  124. package/src/e2e_epochs/epochs_test.ts +131 -70
  125. package/src/e2e_fees/fees_test.ts +17 -8
  126. package/src/e2e_nested_contract/nested_contract_test.ts +6 -4
  127. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  128. package/src/e2e_p2p/p2p_network.ts +88 -44
  129. package/src/e2e_p2p/reqresp/utils.ts +58 -9
  130. package/src/e2e_p2p/shared.ts +88 -63
  131. package/src/e2e_token_contract/token_contract_test.ts +16 -8
  132. package/src/fixtures/authwit_proxy.ts +4 -0
  133. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  134. package/src/fixtures/e2e_prover_test.ts +43 -52
  135. package/src/fixtures/elu_monitor.ts +126 -0
  136. package/src/fixtures/fixtures.ts +32 -0
  137. package/src/fixtures/get_bb_config.ts +7 -6
  138. package/src/fixtures/ha_setup.ts +4 -2
  139. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  140. package/src/fixtures/setup.ts +125 -132
  141. package/src/fixtures/setup_p2p_test.ts +17 -25
  142. package/src/fixtures/token_utils.ts +3 -3
  143. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  144. package/src/forward-compatibility/wallet_service.ts +104 -0
  145. package/src/guides/up_quick_start.sh +0 -2
  146. package/src/legacy-jest-resolver.cjs +135 -0
  147. package/src/shared/cross_chain_test_harness.ts +13 -9
  148. package/src/shared/gas_portal_test_harness.ts +1 -2
  149. package/src/shared/jest_setup.ts +51 -1
  150. package/src/shared/submit-transactions.ts +1 -1
  151. package/src/shared/uniswap_l1_l2.ts +35 -32
  152. package/src/simulators/lending_simulator.ts +8 -4
  153. package/src/simulators/token_simulator.ts +6 -2
  154. package/src/spartan/setup_test_wallets.ts +138 -31
  155. package/src/spartan/tx_metrics.ts +1 -1
  156. package/src/spartan/utils/bot.ts +3 -0
  157. package/src/spartan/utils/config.ts +2 -0
  158. package/src/spartan/utils/index.ts +7 -0
  159. package/src/spartan/utils/k8s.ts +8 -0
  160. package/src/spartan/utils/nodes.ts +15 -10
  161. package/src/spartan/utils/pod_logs.ts +99 -0
  162. package/src/test-wallet/test_wallet.ts +148 -101
  163. package/src/test-wallet/wallet_worker_script.ts +60 -0
  164. package/src/test-wallet/worker_wallet.ts +214 -0
  165. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1,23 +1,16 @@
1
1
  import type { InitialAccountData } from '@aztec/accounts/testing';
2
- import { type Archiver, createArchiver } from '@aztec/archiver';
2
+ import { AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
5
  import type { AztecNode } from '@aztec/aztec.js/node';
6
6
  import { CheatCodes } from '@aztec/aztec/testing';
7
- import {
8
- BBCircuitVerifier,
9
- type ClientProtocolCircuitVerifier,
10
- QueuedIVCVerifier,
11
- TestCircuitVerifier,
12
- } from '@aztec/bb-prover';
7
+ import type { ClientProtocolCircuitVerifier } from '@aztec/bb-prover';
13
8
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
15
9
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
16
10
  import { Buffer32 } from '@aztec/foundation/buffer';
17
11
  import { SecretValue } from '@aztec/foundation/config';
18
12
  import { FeeAssetHandlerAbi } from '@aztec/l1-artifacts';
19
13
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
20
- import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node';
21
14
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
22
15
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
23
16
  import { getGenesisValues } from '@aztec/world-state/testing';
@@ -70,11 +63,14 @@ export class FullProverTest {
70
63
  private provenComponents: ProvenSetup[] = [];
71
64
  private bbConfigCleanup?: () => Promise<void>;
72
65
  private acvmConfigCleanup?: () => Promise<void>;
73
- circuitProofVerifier?: ClientProtocolCircuitVerifier;
66
+ /** Returns the proof verifier from the prover node (for test assertions). */
67
+ get circuitProofVerifier(): ClientProtocolCircuitVerifier | undefined {
68
+ return this.proverAztecNode?.getProofVerifier();
69
+ }
74
70
  provenAsset!: TokenContract;
75
71
  context!: EndToEndContext;
76
- private proverNode!: ProverNode;
77
- private simulatedProverNode!: ProverNode;
72
+ private proverAztecNode!: AztecNodeService;
73
+ private simulatedProverAztecNode!: AztecNodeService;
78
74
  public l1Contracts!: DeployAztecL1ContractsReturnType;
79
75
  public proverAddress!: EthAddress;
80
76
  private minNumberOfTxsPerBlock: number;
@@ -114,7 +110,7 @@ export class FullProverTest {
114
110
  FullProverTest.TOKEN_NAME,
115
111
  FullProverTest.TOKEN_SYMBOL,
116
112
  FullProverTest.TOKEN_DECIMALS,
117
- ).send({ from: this.accounts[0], wait: { returnReceipt: true } });
113
+ ).send({ from: this.accounts[0] });
118
114
  this.logger.verbose(`Token deployed to ${asset.address}`);
119
115
 
120
116
  this.fakeProofsAsset = asset;
@@ -123,7 +119,7 @@ export class FullProverTest {
123
119
 
124
120
  this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.wallet, this.accounts[0], this.logger, this.accounts);
125
121
 
126
- expect(await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).toBe(
122
+ expect((await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).result).toBe(
127
123
  this.accounts[0].toBigInt(),
128
124
  );
129
125
  }
@@ -146,7 +142,7 @@ export class FullProverTest {
146
142
  // We don't wish to mark as proven automatically, so we set the flag to false
147
143
  this.context.watcher.setIsMarkingAsProven(false);
148
144
 
149
- this.simulatedProverNode = this.context.proverNode!;
145
+ this.simulatedProverAztecNode = this.context.proverNode!;
150
146
  ({
151
147
  aztecNode: this.aztecNode,
152
148
  deployL1ContractsValues: this.l1Contracts,
@@ -155,7 +151,6 @@ export class FullProverTest {
155
151
  this.aztecNodeAdmin = this.context.aztecNodeService;
156
152
 
157
153
  const config = this.context.aztecNodeConfig;
158
- const blobClient = await createBlobClientWithFileStores(config, this.logger);
159
154
 
160
155
  // Configure a full prover PXE
161
156
  let acvmConfig: Awaited<ReturnType<typeof getACVMConfig>> | undefined;
@@ -171,9 +166,6 @@ export class FullProverTest {
171
166
 
172
167
  await Barretenberg.initSingleton({ backend: BackendType.NativeUnixSocket });
173
168
 
174
- const verifier = await BBCircuitVerifier.new(bbConfig);
175
- this.circuitProofVerifier = new QueuedIVCVerifier(bbConfig, verifier);
176
-
177
169
  this.logger.debug(`Configuring the node for real proofs...`);
178
170
  await this.aztecNodeAdmin.setConfig({
179
171
  realProofs: true,
@@ -181,7 +173,6 @@ export class FullProverTest {
181
173
  });
182
174
  } else {
183
175
  this.logger.debug(`Configuring the node min txs per block ${this.minNumberOfTxsPerBlock}...`);
184
- this.circuitProofVerifier = new TestCircuitVerifier();
185
176
  await this.aztecNodeAdmin.setConfig({
186
177
  minTxsPerBlock: this.minNumberOfTxsPerBlock,
187
178
  });
@@ -217,20 +208,13 @@ export class FullProverTest {
217
208
  this.provenWallet = provenWallet;
218
209
  this.logger.info(`Full prover PXE started`);
219
210
 
220
- // Shutdown the current, simulated prover node
211
+ // Shutdown the current, simulated prover node (by stopping its hosting aztec node)
221
212
  this.logger.verbose('Shutting down simulated prover node');
222
- await this.simulatedProverNode.stop();
223
-
224
- // Creating temp store and archiver for fully proven prover node
225
- this.logger.verbose('Starting archiver for new prover node');
226
- const archiver = await createArchiver(
227
- { ...this.context.aztecNodeConfig, dataDirectory: undefined },
228
- { blobClient, dateProvider: this.context.dateProvider },
229
- { blockUntilSync: true },
230
- );
213
+ await this.simulatedProverAztecNode.stop();
231
214
 
232
215
  // The simulated prover node (now shutdown) used private key index 2
233
216
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
217
+ const proverNodePrivateKeyHex = `0x${proverNodePrivateKey!.toString('hex')}` as const;
234
218
  const proverNodeSenderAddress = privateKeyToAddress(new Buffer32(proverNodePrivateKey!).toString());
235
219
  this.proverAddress = EthAddress.fromString(proverNodeSenderAddress);
236
220
 
@@ -238,14 +222,24 @@ export class FullProverTest {
238
222
  await this.mintFeeJuice(proverNodeSenderAddress);
239
223
 
240
224
  this.logger.verbose('Starting prover node');
241
- const proverConfig: ProverNodeConfig = {
242
- ...this.context.aztecNodeConfig,
243
- txCollectionNodeRpcUrls: [],
225
+ const sponsoredFPCAddress = await getSponsoredFPCAddress();
226
+ const { genesis } = await getGenesisValues(
227
+ this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
228
+ undefined,
229
+ undefined,
230
+ this.context.genesis!.genesisTimestamp,
231
+ );
232
+
233
+ const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
234
+ ...config,
235
+ enableProverNode: true,
236
+ disableValidator: true,
244
237
  dataDirectory: undefined,
238
+ txCollectionNodeRpcUrls: [],
245
239
  proverId: this.proverAddress,
246
240
  realProofs: this.realProofs,
247
241
  proverAgentCount: 2,
248
- publisherPrivateKeys: [new SecretValue(`0x${proverNodePrivateKey!.toString('hex')}` as const)],
242
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKeyHex)],
249
243
  proverNodeMaxPendingJobs: 100,
250
244
  proverNodeMaxParallelBlocksPerEpoch: 32,
251
245
  proverNodePollingIntervalMs: 100,
@@ -255,21 +249,14 @@ export class FullProverTest {
255
249
  txGatheringTimeoutMs: 24_000,
256
250
  proverNodeFailedEpochStore: undefined,
257
251
  proverNodeEpochProvingDelayMs: undefined,
252
+ validatorPrivateKeys: new SecretValue([]),
258
253
  };
259
- const sponsoredFPCAddress = await getSponsoredFPCAddress();
260
- const { prefilledPublicData } = await getGenesisValues(
261
- this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
262
- );
263
- this.proverNode = await createProverNode(
264
- proverConfig,
265
- {
266
- aztecNodeTxProvider: this.aztecNode,
267
- archiver: archiver as Archiver,
268
- },
269
- { prefilledPublicData },
270
- );
271
- await this.proverNode.start();
272
254
 
255
+ this.proverAztecNode = await AztecNodeService.createAndSync(
256
+ proverNodeConfig,
257
+ { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
258
+ { genesis },
259
+ );
273
260
  this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
274
261
  return this;
275
262
  }
@@ -289,8 +276,8 @@ export class FullProverTest {
289
276
  await this.provenComponents[i].teardown();
290
277
  }
291
278
 
292
- // clean up the full prover node
293
- await this.proverNode.stop();
279
+ // clean up the full prover node (by stopping its hosting aztec node)
280
+ await this.proverAztecNode.stop();
294
281
 
295
282
  await Barretenberg.destroySingleton();
296
283
  await this.bbConfigCleanup?.();
@@ -320,16 +307,20 @@ export class FullProverTest {
320
307
  } = this;
321
308
  tokenSim.mintPublic(address, publicAmount);
322
309
 
323
- const publicBalance = await fakeProofsAsset.methods.balance_of_public(address).simulate({ from: address });
310
+ const { result: publicBalance } = await fakeProofsAsset.methods
311
+ .balance_of_public(address)
312
+ .simulate({ from: address });
324
313
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
325
314
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
326
315
 
327
316
  tokenSim.mintPrivate(address, publicAmount);
328
- const privateBalance = await fakeProofsAsset.methods.balance_of_private(address).simulate({ from: address });
317
+ const { result: privateBalance } = await fakeProofsAsset.methods
318
+ .balance_of_private(address)
319
+ .simulate({ from: address });
329
320
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
330
321
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
331
322
 
332
- const totalSupply = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
323
+ const { result: totalSupply } = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
333
324
  this.logger.verbose(`Total supply: ${totalSupply}`);
334
325
  expect(totalSupply).toEqual(tokenSim.totalSupply);
335
326
  }
@@ -0,0 +1,126 @@
1
+ import { appendFileSync } from 'node:fs';
2
+ import { type EventLoopUtilization, type IntervalHistogram, monitorEventLoopDelay, performance } from 'node:perf_hooks';
3
+
4
+ const NANOS_PER_MS = 1_000_000;
5
+
6
+ /** Samples event-loop utilization, delay histogram, and heap usage per test, writing columnar text to a file. */
7
+ export class EluMonitor {
8
+ private filePath: string;
9
+ private intervalMs: number;
10
+ private timer: ReturnType<typeof setInterval> | undefined;
11
+ private lastELU: EventLoopUtilization | undefined;
12
+ private histogram: IntervalHistogram;
13
+ private testName: string | undefined;
14
+ private testStart: number | undefined;
15
+ private eluSamples: number[] = [];
16
+
17
+ constructor(filePath: string, intervalMs?: number) {
18
+ this.filePath = filePath;
19
+ this.intervalMs = intervalMs ?? 2000;
20
+ this.histogram = monitorEventLoopDelay({ resolution: 20 });
21
+ }
22
+
23
+ /** Begin sampling for a test. Writes a header line and starts the periodic sampler. */
24
+ startTest(testName: string): void {
25
+ this.stopTest();
26
+
27
+ this.testName = testName;
28
+ this.testStart = performance.now();
29
+ this.eluSamples = [];
30
+
31
+ appendFileSync(this.filePath, `\n=== Test: ${testName} ===\n`);
32
+ appendFileSync(
33
+ this.filePath,
34
+ padColumns('TIME', 'ELU', 'EL_DLY_P50', 'EL_DLY_P99', 'EL_DLY_MAX', 'HEAP_MB') + '\n',
35
+ );
36
+
37
+ this.lastELU = performance.eventLoopUtilization();
38
+ this.histogram.enable();
39
+
40
+ this.timer = setInterval(() => this.sample(), this.intervalMs);
41
+ // Allow the process to exit even if the timer is still running.
42
+ this.timer.unref();
43
+ }
44
+
45
+ /** Stop sampling and write a summary line. */
46
+ stopTest(): void {
47
+ if (!this.timer) {
48
+ return;
49
+ }
50
+
51
+ // Take a final sample before stopping.
52
+ this.sample();
53
+
54
+ clearInterval(this.timer);
55
+ this.timer = undefined;
56
+ this.histogram.disable();
57
+ this.histogram.reset();
58
+
59
+ this.writeSummary();
60
+
61
+ this.lastELU = undefined;
62
+ this.testName = undefined;
63
+ this.testStart = undefined;
64
+ this.eluSamples = [];
65
+ }
66
+
67
+ /** Alias for stopTest — call on process exit to flush any remaining data. */
68
+ stop(): void {
69
+ this.stopTest();
70
+ }
71
+
72
+ private sample(): void {
73
+ const newELU = performance.eventLoopUtilization();
74
+ const delta = performance.eventLoopUtilization(newELU, this.lastELU);
75
+ this.lastELU = newELU;
76
+
77
+ const elu = delta.utilization;
78
+ this.eluSamples.push(elu);
79
+
80
+ const p50 = this.histogram.percentile(50) / NANOS_PER_MS;
81
+ const p99 = this.histogram.percentile(99) / NANOS_PER_MS;
82
+ const max = this.histogram.max / NANOS_PER_MS;
83
+ const heapMb = Math.round(process.memoryUsage().heapUsed / (1024 * 1024));
84
+
85
+ const now = new Date();
86
+ const time = [now.getHours(), now.getMinutes(), now.getSeconds()].map(n => String(n).padStart(2, '0')).join(':');
87
+
88
+ const line = padColumns(
89
+ time,
90
+ elu.toFixed(2),
91
+ `${p50.toFixed(1)}ms`,
92
+ `${p99.toFixed(1)}ms`,
93
+ `${max.toFixed(1)}ms`,
94
+ String(heapMb),
95
+ );
96
+ appendFileSync(this.filePath, line + '\n');
97
+
98
+ // Reset histogram so next sample only reflects the new interval.
99
+ this.histogram.reset();
100
+ }
101
+
102
+ private writeSummary(): void {
103
+ if (this.eluSamples.length === 0 || this.testStart === undefined) {
104
+ return;
105
+ }
106
+
107
+ const mean = this.eluSamples.reduce((a, b) => a + b, 0) / this.eluSamples.length;
108
+ const maxElu = Math.max(...this.eluSamples);
109
+ const sorted = [...this.eluSamples].sort((a, b) => a - b);
110
+ const p90Elu = sorted[Math.floor(sorted.length * 0.9)] ?? maxElu;
111
+ const durationS = ((performance.now() - this.testStart) / 1000).toFixed(1);
112
+
113
+ let summary = `--- Summary: mean_elu=${mean.toFixed(2)} max_elu=${maxElu.toFixed(2)} p90_elu=${p90Elu.toFixed(2)} duration=${durationS}s`;
114
+ if (maxElu > 0.85) {
115
+ summary += ' WARNING:ELU>0.85';
116
+ }
117
+ summary += ' ---\n';
118
+
119
+ appendFileSync(this.filePath, summary);
120
+ }
121
+ }
122
+
123
+ function padColumns(...cols: string[]): string {
124
+ const widths = [11, 7, 12, 12, 12, 8];
125
+ return cols.map((col, i) => col.padEnd(widths[i] ?? 10)).join('');
126
+ }
@@ -1,5 +1,27 @@
1
+ import type { AztecNode } from '@aztec/aztec.js/node';
2
+ import type { GasFees } from '@aztec/stdlib/gas';
3
+
1
4
  export const METRICS_PORT = 4318;
2
5
 
6
+ /** Default fee padding applied to predicted min fees in e2e tests. */
7
+ export const DEFAULT_MIN_FEE_PADDING = 5;
8
+
9
+ /**
10
+ * Large fee padding for txs that may be mined significantly later than when they were created,
11
+ * such as cloned txs in throughput/capacity benchmarks, where fees may spike between creation and mining.
12
+ */
13
+ export const LARGE_MIN_FEE_PADDING = 15;
14
+
15
+ /** Returns worst-case predicted min fees with padding applied, mirroring the BaseWallet pattern. */
16
+ export async function getPaddedMaxFeesPerGas(node: AztecNode, padding = DEFAULT_MIN_FEE_PADDING): Promise<GasFees> {
17
+ const predicted = await node.getPredictedMinFees();
18
+ const worstCase =
19
+ predicted.length > 0
20
+ ? predicted.reduce((worst, fees) => (fees.feePerL2Gas > worst.feePerL2Gas ? fees : worst))
21
+ : await node.getCurrentMinFees();
22
+ return worstCase.mul(1 + padding);
23
+ }
24
+
3
25
  export const shouldCollectMetrics = () => {
4
26
  if (process.env.COLLECT_METRICS) {
5
27
  return METRICS_PORT;
@@ -7,6 +29,16 @@ export const shouldCollectMetrics = () => {
7
29
  return undefined;
8
30
  };
9
31
 
32
+ /** Returns the boot node UDP port from environment variable or default value. */
33
+ export function getBootNodeUdpPort(): number {
34
+ return process.env.BOOT_NODE_UDP_PORT ? parseInt(process.env.BOOT_NODE_UDP_PORT, 10) : 4500;
35
+ }
36
+
37
+ /** Returns the anvil port from environment variable or default value. */
38
+ export function getAnvilPort(): number {
39
+ return process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT, 10) : 8545;
40
+ }
41
+
10
42
  export const TEST_PEER_CHECK_INTERVAL_MS = 1000;
11
43
  export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
44
 
@@ -13,8 +13,10 @@ const {
13
13
  BB_SKIP_CLEANUP = '',
14
14
  TEMP_DIR = tmpdir(),
15
15
  BB_WORKING_DIRECTORY = '',
16
- BB_NUM_IVC_VERIFIERS = '1',
16
+ BB_NUM_IVC_VERIFIERS = '8',
17
17
  BB_IVC_CONCURRENCY = '1',
18
+ BB_CHONK_VERIFY_MAX_BATCH = '16',
19
+ BB_CHONK_VERIFY_BATCH_CONCURRENCY = '6',
18
20
  } = process.env;
19
21
 
20
22
  export const getBBConfig = async (
@@ -41,16 +43,15 @@ export const getBBConfig = async (
41
43
  const bbSkipCleanup = ['1', 'true'].includes(BB_SKIP_CLEANUP);
42
44
  const cleanup = bbSkipCleanup ? () => Promise.resolve() : () => tryRmDir(directoryToCleanup);
43
45
 
44
- const numIvcVerifiers = Number(BB_NUM_IVC_VERIFIERS);
45
- const ivcConcurrency = Number(BB_IVC_CONCURRENCY);
46
-
47
46
  return {
48
47
  bbSkipCleanup,
49
48
  bbBinaryPath,
50
49
  bbWorkingDirectory,
51
50
  cleanup,
52
- numConcurrentIVCVerifiers: numIvcVerifiers,
53
- bbIVCConcurrency: ivcConcurrency,
51
+ numConcurrentIVCVerifiers: Number(BB_NUM_IVC_VERIFIERS),
52
+ bbIVCConcurrency: Number(BB_IVC_CONCURRENCY),
53
+ bbChonkVerifyMaxBatch: Number(BB_CHONK_VERIFY_MAX_BATCH),
54
+ bbChonkVerifyConcurrency: Number(BB_CHONK_VERIFY_BATCH_CONCURRENCY),
54
55
  };
55
56
  } catch (err) {
56
57
  logger.error(`Native BB not available, error: ${err}`);
@@ -11,7 +11,7 @@ import { privateKeyToAccount } from 'viem/accounts';
11
11
  */
12
12
  export interface HADatabaseConfig {
13
13
  /** PostgreSQL connection URL */
14
- databaseUrl: string;
14
+ databaseUrl: SecretValue<string>;
15
15
  /** Node ID for HA coordination */
16
16
  nodeId: string;
17
17
  /** Enable HA signing */
@@ -28,7 +28,9 @@ export interface HADatabaseConfig {
28
28
  * Get database configuration from environment variables
29
29
  */
30
30
  export function createHADatabaseConfig(nodeId: string): HADatabaseConfig {
31
- const databaseUrl = process.env.DATABASE_URL || 'postgresql://aztec:aztec@localhost:5432/aztec_ha_test';
31
+ const databaseUrl = new SecretValue(
32
+ process.env.DATABASE_URL || 'postgresql://aztec:aztec@localhost:5432/aztec_ha_test',
33
+ );
32
34
 
33
35
  return {
34
36
  databaseUrl,
@@ -0,0 +1,49 @@
1
+ import { DefaultAccountContract } from '@aztec/accounts/defaults';
2
+ import type { ContractArtifact } from '@aztec/aztec.js/abi';
3
+ import type { AuthWitnessProvider } from '@aztec/aztec.js/account';
4
+ import type { CompleteAddress } from '@aztec/aztec.js/addresses';
5
+ import { AuthWitness } from '@aztec/aztec.js/authorization';
6
+ import type { Fr } from '@aztec/aztec.js/fields';
7
+ import { Schnorr } from '@aztec/foundation/crypto/schnorr';
8
+ import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
9
+ import { SchnorrHardcodedAccountContractArtifact } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount';
10
+
11
+ /**
12
+ * The private key that matches the hardcoded public key in the SchnorrHardcodedAccountContract.
13
+ * The corresponding public key is baked into the Noir contract as a global constant.
14
+ */
15
+ export const SCHNORR_HARDCODED_PRIVATE_KEY = GrumpkinScalar.fromHexString(
16
+ '0xd35d743ac0dfe3d6dbe6be8c877cb524a00ab1e3d52d7bada095dfc8894ccfa',
17
+ );
18
+
19
+ /**
20
+ * Account contract backed by the SchnorrHardcodedAccount Noir contract.
21
+ * This contract verifies Schnorr signatures against a public key that is hardcoded
22
+ * in the contract artifact (not stored in a note), so it does not require on-chain
23
+ * deployment or initialization. Useful for tests that need a working account without
24
+ * mining any blocks.
25
+ */
26
+ export class SchnorrHardcodedKeyAccountContract extends DefaultAccountContract {
27
+ constructor(private privateKey: GrumpkinScalar = SCHNORR_HARDCODED_PRIVATE_KEY) {
28
+ super();
29
+ }
30
+
31
+ override getContractArtifact(): Promise<ContractArtifact> {
32
+ return Promise.resolve(SchnorrHardcodedAccountContractArtifact);
33
+ }
34
+
35
+ getInitializationFunctionAndArgs() {
36
+ return Promise.resolve(undefined);
37
+ }
38
+
39
+ getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider {
40
+ const privateKey = this.privateKey;
41
+ return {
42
+ async createAuthWit(messageHash: Fr): Promise<AuthWitness> {
43
+ const signer = new Schnorr();
44
+ const signature = await signer.constructSignature(messageHash.toBuffer(), privateKey);
45
+ return new AuthWitness(messageHash, [...signature.toBuffer()]);
46
+ },
47
+ };
48
+ }
49
+ }