@aztec/end-to-end 0.0.1-commit.03f7ef2 → 0.0.1-commit.04852196a

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 (240) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +3 -2
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/benchmark.js +21 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +13 -14
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  6. package/dest/bench/client_flows/client_flows_benchmark.js +131 -138
  7. package/dest/bench/client_flows/config.d.ts +2 -2
  8. package/dest/bench/client_flows/config.d.ts.map +1 -1
  9. package/dest/bench/client_flows/config.js +18 -0
  10. package/dest/bench/client_flows/data_extractor.js +3 -1
  11. package/dest/bench/utils.d.ts +9 -8
  12. package/dest/bench/utils.d.ts.map +1 -1
  13. package/dest/bench/utils.js +31 -19
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +9 -8
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +107 -113
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +16 -11
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +90 -70
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  21. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  22. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  23. package/dest/e2e_epochs/epochs_test.d.ts +15 -7
  24. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  25. package/dest/e2e_epochs/epochs_test.js +87 -40
  26. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  27. package/dest/e2e_fees/fees_test.d.ts +14 -14
  28. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  29. package/dest/e2e_fees/fees_test.js +134 -145
  30. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  31. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  32. package/dest/e2e_l1_publisher/write_json.js +14 -16
  33. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  34. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  35. package/dest/e2e_nested_contract/nested_contract_test.js +30 -40
  36. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  37. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  38. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  39. package/dest/e2e_p2p/p2p_network.d.ts +11 -9
  40. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  41. package/dest/e2e_p2p/p2p_network.js +133 -109
  42. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  43. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  44. package/dest/e2e_p2p/reqresp/utils.js +177 -0
  45. package/dest/e2e_p2p/shared.d.ts +20 -6
  46. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  47. package/dest/e2e_p2p/shared.js +42 -22
  48. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  49. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  50. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  51. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  53. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  54. package/dest/e2e_token_contract/token_contract_test.d.ts +19 -10
  55. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  56. package/dest/e2e_token_contract/token_contract_test.js +100 -92
  57. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  58. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  59. package/dest/fixtures/authwit_proxy.js +30 -0
  60. package/dest/fixtures/e2e_prover_test.d.ts +11 -17
  61. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  62. package/dest/fixtures/e2e_prover_test.js +112 -128
  63. package/dest/fixtures/elu_monitor.d.ts +21 -0
  64. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  65. package/dest/fixtures/elu_monitor.js +102 -0
  66. package/dest/fixtures/fixtures.d.ts +6 -2
  67. package/dest/fixtures/fixtures.d.ts.map +1 -1
  68. package/dest/fixtures/fixtures.js +7 -1
  69. package/dest/fixtures/ha_setup.d.ts +71 -0
  70. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  71. package/dest/fixtures/ha_setup.js +116 -0
  72. package/dest/fixtures/index.d.ts +2 -1
  73. package/dest/fixtures/index.d.ts.map +1 -1
  74. package/dest/fixtures/index.js +1 -0
  75. package/dest/fixtures/setup.d.ts +234 -0
  76. package/dest/fixtures/setup.d.ts.map +1 -0
  77. package/dest/fixtures/setup.js +605 -0
  78. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  79. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  80. package/dest/fixtures/setup_p2p_test.js +40 -29
  81. package/dest/fixtures/token_utils.d.ts +2 -2
  82. package/dest/fixtures/token_utils.d.ts.map +1 -1
  83. package/dest/fixtures/token_utils.js +12 -8
  84. package/dest/fixtures/utils.d.ts +5 -194
  85. package/dest/fixtures/utils.d.ts.map +1 -1
  86. package/dest/fixtures/utils.js +4 -619
  87. package/dest/quality_of_service/grafana_client.d.ts +41 -0
  88. package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
  89. package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
  90. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  91. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  92. package/dest/quality_of_service/prometheus_client.js +67 -0
  93. package/dest/shared/cross_chain_test_harness.d.ts +16 -6
  94. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  95. package/dest/shared/cross_chain_test_harness.js +26 -26
  96. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  97. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  98. package/dest/shared/gas_portal_test_harness.js +3 -3
  99. package/dest/shared/index.d.ts +3 -2
  100. package/dest/shared/index.d.ts.map +1 -1
  101. package/dest/shared/index.js +1 -0
  102. package/dest/shared/jest_setup.js +41 -1
  103. package/dest/shared/mock_state_view.d.ts +86 -0
  104. package/dest/shared/mock_state_view.d.ts.map +1 -0
  105. package/dest/shared/mock_state_view.js +186 -0
  106. package/dest/shared/submit-transactions.d.ts +4 -4
  107. package/dest/shared/submit-transactions.d.ts.map +1 -1
  108. package/dest/shared/submit-transactions.js +9 -11
  109. package/dest/shared/uniswap_l1_l2.d.ts +3 -28
  110. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  111. package/dest/shared/uniswap_l1_l2.js +57 -37
  112. package/dest/simulators/lending_simulator.d.ts +5 -1
  113. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  114. package/dest/simulators/lending_simulator.js +4 -4
  115. package/dest/simulators/token_simulator.d.ts +1 -1
  116. package/dest/simulators/token_simulator.d.ts.map +1 -1
  117. package/dest/simulators/token_simulator.js +3 -24
  118. package/dest/spartan/setup_test_wallets.d.ts +12 -4
  119. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  120. package/dest/spartan/setup_test_wallets.js +94 -36
  121. package/dest/spartan/tx_metrics.d.ts +51 -2
  122. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  123. package/dest/spartan/tx_metrics.js +334 -7
  124. package/dest/spartan/utils/bot.d.ts +28 -0
  125. package/dest/spartan/utils/bot.d.ts.map +1 -0
  126. package/dest/spartan/utils/bot.js +142 -0
  127. package/dest/spartan/utils/chaos.d.ts +79 -0
  128. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  129. package/dest/spartan/utils/chaos.js +142 -0
  130. package/dest/spartan/utils/clients.d.ts +39 -0
  131. package/dest/spartan/utils/clients.d.ts.map +1 -0
  132. package/dest/spartan/utils/clients.js +90 -0
  133. package/dest/spartan/utils/config.d.ts +42 -0
  134. package/dest/spartan/utils/config.d.ts.map +1 -0
  135. package/dest/spartan/utils/config.js +22 -0
  136. package/dest/spartan/utils/health.d.ts +63 -0
  137. package/dest/spartan/utils/health.d.ts.map +1 -0
  138. package/dest/spartan/utils/health.js +202 -0
  139. package/dest/spartan/utils/helm.d.ts +15 -0
  140. package/dest/spartan/utils/helm.d.ts.map +1 -0
  141. package/dest/spartan/utils/helm.js +47 -0
  142. package/dest/spartan/utils/index.d.ts +10 -0
  143. package/dest/spartan/utils/index.d.ts.map +1 -0
  144. package/dest/spartan/utils/index.js +20 -0
  145. package/dest/spartan/utils/k8s.d.ts +128 -0
  146. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  147. package/dest/spartan/utils/k8s.js +381 -0
  148. package/dest/spartan/utils/nodes.d.ts +40 -0
  149. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  150. package/dest/spartan/utils/nodes.js +461 -0
  151. package/dest/spartan/utils/scripts.d.ts +30 -0
  152. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  153. package/dest/spartan/utils/scripts.js +81 -0
  154. package/dest/spartan/utils.d.ts +2 -231
  155. package/dest/spartan/utils.d.ts.map +1 -1
  156. package/dest/spartan/utils.js +1 -853
  157. package/dest/test-wallet/test_wallet.d.ts +83 -0
  158. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  159. package/dest/test-wallet/test_wallet.js +214 -0
  160. package/dest/test-wallet/utils.d.ts +41 -0
  161. package/dest/test-wallet/utils.d.ts.map +1 -0
  162. package/dest/test-wallet/utils.js +71 -0
  163. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  164. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  165. package/dest/test-wallet/wallet_worker_script.js +48 -0
  166. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  167. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  168. package/dest/test-wallet/worker_wallet.js +151 -0
  169. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  170. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  171. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  172. package/package.json +47 -43
  173. package/src/bench/client_flows/benchmark.ts +24 -2
  174. package/src/bench/client_flows/client_flows_benchmark.ts +149 -211
  175. package/src/bench/client_flows/config.ts +9 -1
  176. package/src/bench/client_flows/data_extractor.ts +1 -1
  177. package/src/bench/utils.ts +36 -21
  178. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +120 -145
  179. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +127 -117
  180. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  181. package/src/e2e_epochs/epochs_test.ts +130 -94
  182. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  183. package/src/e2e_fees/fees_test.ts +171 -227
  184. package/src/e2e_l1_publisher/write_json.ts +16 -16
  185. package/src/e2e_nested_contract/nested_contract_test.ts +35 -56
  186. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  187. package/src/e2e_p2p/p2p_network.ts +197 -167
  188. package/src/e2e_p2p/reqresp/utils.ts +235 -0
  189. package/src/e2e_p2p/shared.ts +72 -28
  190. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  191. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  192. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  193. package/src/e2e_token_contract/token_contract_test.ts +121 -119
  194. package/src/fixtures/authwit_proxy.ts +50 -0
  195. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  196. package/src/fixtures/e2e_prover_test.ts +133 -172
  197. package/src/fixtures/elu_monitor.ts +126 -0
  198. package/src/fixtures/fixtures.ts +11 -1
  199. package/src/fixtures/ha_setup.ts +186 -0
  200. package/src/fixtures/index.ts +1 -0
  201. package/src/fixtures/setup.ts +897 -0
  202. package/src/fixtures/setup_p2p_test.ts +40 -44
  203. package/src/fixtures/token_utils.ts +10 -6
  204. package/src/fixtures/utils.ts +27 -907
  205. package/src/guides/up_quick_start.sh +3 -3
  206. package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
  207. package/src/quality_of_service/prometheus_client.ts +113 -0
  208. package/src/shared/cross_chain_test_harness.ts +27 -43
  209. package/src/shared/gas_portal_test_harness.ts +2 -2
  210. package/src/shared/index.ts +2 -1
  211. package/src/shared/jest_setup.ts +51 -1
  212. package/src/shared/mock_state_view.ts +188 -0
  213. package/src/shared/submit-transactions.ts +11 -16
  214. package/src/shared/uniswap_l1_l2.ts +64 -83
  215. package/src/simulators/lending_simulator.ts +6 -4
  216. package/src/simulators/token_simulator.ts +6 -30
  217. package/src/spartan/setup_test_wallets.ts +128 -27
  218. package/src/spartan/tx_metrics.ts +256 -10
  219. package/src/spartan/utils/bot.ts +188 -0
  220. package/src/spartan/utils/chaos.ts +253 -0
  221. package/src/spartan/utils/clients.ts +100 -0
  222. package/src/spartan/utils/config.ts +28 -0
  223. package/src/spartan/utils/health.ts +255 -0
  224. package/src/spartan/utils/helm.ts +84 -0
  225. package/src/spartan/utils/index.ts +68 -0
  226. package/src/spartan/utils/k8s.ts +535 -0
  227. package/src/spartan/utils/nodes.ts +543 -0
  228. package/src/spartan/utils/scripts.ts +99 -0
  229. package/src/spartan/utils.ts +1 -1077
  230. package/src/test-wallet/test_wallet.ts +306 -0
  231. package/src/test-wallet/utils.ts +112 -0
  232. package/src/test-wallet/wallet_worker_script.ts +60 -0
  233. package/src/test-wallet/worker_wallet.ts +213 -0
  234. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  235. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  236. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  237. package/dest/fixtures/snapshot_manager.js +0 -493
  238. package/dest/quality_of_service/alert_checker.d.ts +0 -41
  239. package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
  240. package/src/fixtures/snapshot_manager.ts +0 -651
@@ -1,5 +1,5 @@
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';
@@ -11,34 +11,32 @@ import {
11
11
  TestCircuitVerifier,
12
12
  } from '@aztec/bb-prover';
13
13
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
15
14
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
16
15
  import { Buffer32 } from '@aztec/foundation/buffer';
17
16
  import { SecretValue } from '@aztec/foundation/config';
18
17
  import { FeeAssetHandlerAbi } from '@aztec/l1-artifacts';
19
18
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
20
- import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node';
21
19
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
22
20
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
23
- import { TestWallet } from '@aztec/test-wallet/server';
24
21
  import { getGenesisValues } from '@aztec/world-state/testing';
25
22
 
26
23
  import { type Hex, getContract } from 'viem';
27
24
  import { privateKeyToAddress } from 'viem/accounts';
28
25
 
29
26
  import { TokenSimulator } from '../simulators/token_simulator.js';
27
+ import { TestWallet } from '../test-wallet/test_wallet.js';
30
28
  import { getACVMConfig } from './get_acvm_config.js';
31
29
  import { getBBConfig } from './get_bb_config.js';
32
30
  import {
33
- type ISnapshotManager,
34
- type SubsystemsContext,
35
- createSnapshotManager,
31
+ type EndToEndContext,
36
32
  deployAccounts,
33
+ getPrivateKeyFromIndex,
34
+ getSponsoredFPCAddress,
37
35
  publicDeployAccounts,
38
- } from './snapshot_manager.js';
39
- import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setupPXEAndGetWallet } from './utils.js';
40
-
41
- const { E2E_DATA_PATH: dataPath } = process.env;
36
+ setup,
37
+ setupPXEAndGetWallet,
38
+ teardown,
39
+ } from './setup.js';
42
40
 
43
41
  type ProvenSetup = {
44
42
  wallet: TestWallet;
@@ -56,7 +54,6 @@ export class FullProverTest {
56
54
  static TOKEN_NAME = 'USDC';
57
55
  static TOKEN_SYMBOL = 'USD';
58
56
  static TOKEN_DECIMALS = 18n;
59
- private snapshotManager: ISnapshotManager;
60
57
  logger: Logger;
61
58
  wallet!: TestWallet;
62
59
  provenWallet!: TestWallet;
@@ -73,105 +70,91 @@ export class FullProverTest {
73
70
  private acvmConfigCleanup?: () => Promise<void>;
74
71
  circuitProofVerifier?: ClientProtocolCircuitVerifier;
75
72
  provenAsset!: TokenContract;
76
- private context!: SubsystemsContext;
77
- private proverNode!: ProverNode;
78
- private simulatedProverNode!: ProverNode;
73
+ context!: EndToEndContext;
74
+ private proverAztecNode!: AztecNodeService;
75
+ private simulatedProverAztecNode!: AztecNodeService;
79
76
  public l1Contracts!: DeployAztecL1ContractsReturnType;
80
77
  public proverAddress!: EthAddress;
78
+ private minNumberOfTxsPerBlock: number;
79
+ private coinbase: EthAddress;
80
+ private realProofs: boolean;
81
81
 
82
- constructor(
83
- testName: string,
84
- private minNumberOfTxsPerBlock: number,
85
- coinbase: EthAddress,
86
- private realProofs = true,
87
- ) {
82
+ constructor(testName: string, minNumberOfTxsPerBlock: number, coinbase: EthAddress, realProofs = true) {
88
83
  this.logger = createLogger(`e2e:full_prover_test:${testName}`);
89
- this.snapshotManager = createSnapshotManager(
90
- `full_prover_integration/${testName}`,
91
- dataPath,
92
- { startProverNode: true, coinbase },
93
- {
94
- realVerifier: realProofs,
95
- },
96
- );
84
+ this.minNumberOfTxsPerBlock = minNumberOfTxsPerBlock;
85
+ this.coinbase = coinbase;
86
+ this.realProofs = realProofs;
97
87
  }
98
88
 
99
89
  /**
100
- * Adds two state shifts to snapshot manager.
101
- * 1. Add 2 accounts.
102
- * 2. Publicly deploy accounts, deploy token contract
90
+ * Applies base setup: deploys 2 accounts and token contract.
103
91
  */
104
- async applyBaseSnapshots() {
105
- await this.snapshotManager.snapshot(
106
- '2_accounts',
107
- deployAccounts(2, this.logger),
108
- ({ deployedAccounts }, { wallet }) => {
109
- this.deployedAccounts = deployedAccounts;
110
- this.accounts = deployedAccounts.map(a => a.address);
111
- this.wallet = wallet;
112
- return Promise.resolve();
113
- },
114
- );
115
-
116
- await this.snapshotManager.snapshot(
117
- 'client_prover_integration',
118
- async () => {
119
- // Create the token contract state.
120
- // Move this account thing to addAccounts above?
121
- this.logger.verbose(`Public deploy accounts...`);
122
- await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
123
-
124
- this.logger.verbose(`Deploying TokenContract...`);
125
- const { contract: asset, instance } = await TokenContract.deploy(
126
- this.wallet,
127
- this.accounts[0],
128
- FullProverTest.TOKEN_NAME,
129
- FullProverTest.TOKEN_SYMBOL,
130
- FullProverTest.TOKEN_DECIMALS,
131
- )
132
- .send({ from: this.accounts[0] })
133
- .wait();
134
- this.logger.verbose(`Token deployed to ${asset.address}`);
135
-
136
- return { tokenContractAddress: asset.address, tokenContractInstance: instance };
137
- },
138
- async ({ tokenContractAddress, tokenContractInstance }) => {
139
- // Restore the token contract state.
140
- this.fakeProofsAsset = TokenContract.at(tokenContractAddress, this.wallet);
141
- this.fakeProofsAssetInstance = tokenContractInstance;
142
- this.logger.verbose(`Token contract address: ${this.fakeProofsAsset.address}`);
143
-
144
- this.tokenSim = new TokenSimulator(
145
- this.fakeProofsAsset,
146
- this.wallet,
147
- this.accounts[0],
148
- this.logger,
149
- this.accounts,
150
- );
151
-
152
- expect(await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).toBe(
153
- this.accounts[0].toBigInt(),
154
- );
155
- },
92
+ private async applyBaseSetup() {
93
+ this.logger.info('Applying base setup: deploying accounts');
94
+ const { deployedAccounts } = await deployAccounts(
95
+ 2,
96
+ this.logger,
97
+ )({
98
+ wallet: this.context.wallet,
99
+ initialFundedAccounts: this.context.initialFundedAccounts,
100
+ });
101
+ this.deployedAccounts = deployedAccounts;
102
+ this.accounts = deployedAccounts.map(a => a.address);
103
+ this.wallet = this.context.wallet;
104
+
105
+ this.logger.info('Applying base setup: publicly deploying accounts');
106
+ await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
107
+
108
+ this.logger.info('Applying base setup: deploying token contract');
109
+ const {
110
+ receipt: { contract: asset, instance },
111
+ } = await TokenContract.deploy(
112
+ this.wallet,
113
+ this.accounts[0],
114
+ FullProverTest.TOKEN_NAME,
115
+ FullProverTest.TOKEN_SYMBOL,
116
+ FullProverTest.TOKEN_DECIMALS,
117
+ ).send({ from: this.accounts[0], wait: { returnReceipt: true } });
118
+ this.logger.verbose(`Token deployed to ${asset.address}`);
119
+
120
+ this.fakeProofsAsset = asset;
121
+ this.fakeProofsAssetInstance = instance;
122
+ this.logger.verbose(`Token contract address: ${this.fakeProofsAsset.address}`);
123
+
124
+ this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.wallet, this.accounts[0], this.logger, this.accounts);
125
+
126
+ expect((await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).result).toBe(
127
+ this.accounts[0].toBigInt(),
156
128
  );
157
129
  }
158
130
 
159
131
  async setup() {
160
- this.context = await this.snapshotManager.setup();
132
+ this.logger.info('Setting up subsystems from fresh');
133
+ this.context = await setup(0, {
134
+ startProverNode: true,
135
+ coinbase: this.coinbase,
136
+ fundSponsoredFPC: true,
137
+ skipAccountDeployment: true,
138
+ l1ContractsArgs: { realVerifier: this.realProofs },
139
+ });
140
+
141
+ await this.applyBaseSetup();
142
+ await this.applyMint();
143
+
144
+ this.logger.info(`Enabling proving`, { realProofs: this.realProofs });
161
145
 
162
146
  // We don't wish to mark as proven automatically, so we set the flag to false
163
147
  this.context.watcher.setIsMarkingAsProven(false);
164
148
 
165
- this.simulatedProverNode = this.context.proverNode!;
149
+ this.simulatedProverAztecNode = this.context.proverNode!;
166
150
  ({
167
151
  aztecNode: this.aztecNode,
168
152
  deployL1ContractsValues: this.l1Contracts,
169
153
  cheatCodes: this.cheatCodes,
170
154
  } = this.context);
171
- this.aztecNodeAdmin = this.context.aztecNode;
155
+ this.aztecNodeAdmin = this.context.aztecNodeService;
172
156
 
173
157
  const config = this.context.aztecNodeConfig;
174
- const blobClient = await createBlobClientWithFileStores(config, this.logger);
175
158
 
176
159
  // Configure a full prover PXE
177
160
  let acvmConfig: Awaited<ReturnType<typeof getACVMConfig>> | undefined;
@@ -214,7 +197,7 @@ export class FullProverTest {
214
197
  this.aztecNode,
215
198
  { proverEnabled: this.realProofs },
216
199
  undefined,
217
- true,
200
+ 'pxe-proven',
218
201
  );
219
202
  this.logger.debug(`Contract address ${this.fakeProofsAsset.address}`);
220
203
  await provenWallet.registerContract(this.fakeProofsAssetInstance, TokenContract.artifact);
@@ -233,20 +216,13 @@ export class FullProverTest {
233
216
  this.provenWallet = provenWallet;
234
217
  this.logger.info(`Full prover PXE started`);
235
218
 
236
- // Shutdown the current, simulated prover node
219
+ // Shutdown the current, simulated prover node (by stopping its hosting aztec node)
237
220
  this.logger.verbose('Shutting down simulated prover node');
238
- await this.simulatedProverNode.stop();
239
-
240
- // Creating temp store and archiver for fully proven prover node
241
- this.logger.verbose('Starting archiver for new prover node');
242
- const archiver = await createArchiver(
243
- { ...this.context.aztecNodeConfig, dataDirectory: undefined },
244
- { blobClient, dateProvider: this.context.dateProvider },
245
- { blockUntilSync: true },
246
- );
221
+ await this.simulatedProverAztecNode.stop();
247
222
 
248
223
  // The simulated prover node (now shutdown) used private key index 2
249
224
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
225
+ const proverNodePrivateKeyHex = `0x${proverNodePrivateKey!.toString('hex')}` as const;
250
226
  const proverNodeSenderAddress = privateKeyToAddress(new Buffer32(proverNodePrivateKey!).toString());
251
227
  this.proverAddress = EthAddress.fromString(proverNodeSenderAddress);
252
228
 
@@ -254,14 +230,21 @@ export class FullProverTest {
254
230
  await this.mintFeeJuice(proverNodeSenderAddress);
255
231
 
256
232
  this.logger.verbose('Starting prover node');
257
- const proverConfig: ProverNodeConfig = {
258
- ...this.context.aztecNodeConfig,
259
- txCollectionNodeRpcUrls: [],
233
+ const sponsoredFPCAddress = await getSponsoredFPCAddress();
234
+ const { prefilledPublicData } = await getGenesisValues(
235
+ this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
236
+ );
237
+
238
+ const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
239
+ ...config,
240
+ enableProverNode: true,
241
+ disableValidator: true,
260
242
  dataDirectory: undefined,
243
+ txCollectionNodeRpcUrls: [],
261
244
  proverId: this.proverAddress,
262
245
  realProofs: this.realProofs,
263
246
  proverAgentCount: 2,
264
- publisherPrivateKeys: [new SecretValue(`0x${proverNodePrivateKey!.toString('hex')}` as const)],
247
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKeyHex)],
265
248
  proverNodeMaxPendingJobs: 100,
266
249
  proverNodeMaxParallelBlocksPerEpoch: 32,
267
250
  proverNodePollingIntervalMs: 100,
@@ -271,23 +254,15 @@ export class FullProverTest {
271
254
  txGatheringTimeoutMs: 24_000,
272
255
  proverNodeFailedEpochStore: undefined,
273
256
  proverNodeEpochProvingDelayMs: undefined,
257
+ validatorPrivateKeys: new SecretValue([]),
274
258
  };
275
- const sponsoredFPCAddress = await getSponsoredFPCAddress();
276
- const { prefilledPublicData } = await getGenesisValues(
277
- this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
278
- );
279
- this.proverNode = await createProverNode(
280
- proverConfig,
281
- {
282
- aztecNodeTxProvider: this.aztecNode,
283
- archiver: archiver as Archiver,
284
- blobClient,
285
- },
259
+
260
+ this.proverAztecNode = await AztecNodeService.createAndSync(
261
+ proverNodeConfig,
262
+ { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
286
263
  { prefilledPublicData },
287
264
  );
288
- await this.proverNode.start();
289
-
290
- this.logger.warn(`Proofs are now enabled`);
265
+ this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
291
266
  return this;
292
267
  }
293
268
 
@@ -300,72 +275,58 @@ export class FullProverTest {
300
275
  await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash });
301
276
  }
302
277
 
303
- snapshot = <T>(
304
- name: string,
305
- apply: (context: SubsystemsContext) => Promise<T>,
306
- restore: (snapshotData: T, context: SubsystemsContext) => Promise<void> = () => Promise.resolve(),
307
- ): Promise<void> => this.snapshotManager.snapshot(name, apply, restore);
308
-
309
278
  async teardown() {
310
- await this.snapshotManager.teardown();
311
-
312
279
  // Cleanup related to the full prover PXEs
313
280
  for (let i = 0; i < this.provenComponents.length; i++) {
314
281
  await this.provenComponents[i].teardown();
315
282
  }
316
283
 
317
- // clean up the full prover node
318
- await this.proverNode.stop();
284
+ // clean up the full prover node (by stopping its hosting aztec node)
285
+ await this.proverAztecNode.stop();
319
286
 
320
287
  await Barretenberg.destroySingleton();
321
288
  await this.bbConfigCleanup?.();
322
289
  await this.acvmConfigCleanup?.();
290
+
291
+ await teardown(this.context);
323
292
  }
324
293
 
325
- async applyMintSnapshot() {
326
- await this.snapshotManager.snapshot(
327
- 'mint',
328
- async () => {
329
- const { fakeProofsAsset: asset, accounts } = this;
330
- const privateAmount = 10000n;
331
- const publicAmount = 10000n;
332
-
333
- this.logger.verbose(`Minting ${privateAmount + publicAmount} publicly...`);
334
- await asset.methods
335
- .mint_to_public(accounts[0], privateAmount + publicAmount)
336
- .send({ from: accounts[0] })
337
- .wait();
338
-
339
- this.logger.verbose(`Transferring ${privateAmount} to private...`);
340
- await asset.methods.transfer_to_private(accounts[0], privateAmount).send({ from: accounts[0] }).wait();
341
-
342
- this.logger.verbose(`Minting complete.`);
343
-
344
- return { amount: publicAmount };
345
- },
346
- async ({ amount }) => {
347
- const {
348
- fakeProofsAsset: asset,
349
- accounts: [address],
350
- tokenSim,
351
- } = this;
352
- tokenSim.mintPublic(address, amount);
353
-
354
- const publicBalance = await asset.methods.balance_of_public(address).simulate({ from: address });
355
- this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
356
- expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
357
-
358
- tokenSim.mintPrivate(address, amount);
359
- const privateBalance = await asset.methods.balance_of_private(address).simulate({ from: address });
360
- this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
361
- expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
362
-
363
- const totalSupply = await asset.methods.total_supply().simulate({ from: address });
364
- this.logger.verbose(`Total supply: ${totalSupply}`);
365
- expect(totalSupply).toEqual(tokenSim.totalSupply);
366
-
367
- return Promise.resolve();
368
- },
369
- );
294
+ private async applyMint() {
295
+ this.logger.info('Applying mint setup');
296
+ const { fakeProofsAsset: asset, accounts } = this;
297
+ const privateAmount = 10000n;
298
+ const publicAmount = 10000n;
299
+
300
+ this.logger.verbose(`Minting ${privateAmount + publicAmount} publicly...`);
301
+ await asset.methods.mint_to_public(accounts[0], privateAmount + publicAmount).send({ from: accounts[0] });
302
+
303
+ this.logger.verbose(`Transferring ${privateAmount} to private...`);
304
+ await asset.methods.transfer_to_private(accounts[0], privateAmount).send({ from: accounts[0] });
305
+
306
+ this.logger.info(`Minting complete`);
307
+
308
+ const {
309
+ fakeProofsAsset,
310
+ accounts: [address],
311
+ tokenSim,
312
+ } = this;
313
+ tokenSim.mintPublic(address, publicAmount);
314
+
315
+ const { result: publicBalance } = await fakeProofsAsset.methods
316
+ .balance_of_public(address)
317
+ .simulate({ from: address });
318
+ this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
319
+ expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
320
+
321
+ tokenSim.mintPrivate(address, publicAmount);
322
+ const { result: privateBalance } = await fakeProofsAsset.methods
323
+ .balance_of_private(address)
324
+ .simulate({ from: address });
325
+ this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
326
+ expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
327
+
328
+ const { result: totalSupply } = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
329
+ this.logger.verbose(`Total supply: ${totalSupply}`);
330
+ expect(totalSupply).toEqual(tokenSim.totalSupply);
370
331
  }
371
332
  }
@@ -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
+ }
@@ -7,8 +7,18 @@ export const shouldCollectMetrics = () => {
7
7
  return undefined;
8
8
  };
9
9
 
10
+ /** Returns the boot node UDP port from environment variable or default value. */
11
+ export function getBootNodeUdpPort(): number {
12
+ return process.env.BOOT_NODE_UDP_PORT ? parseInt(process.env.BOOT_NODE_UDP_PORT, 10) : 4500;
13
+ }
14
+
15
+ /** Returns the anvil port from environment variable or default value. */
16
+ export function getAnvilPort(): number {
17
+ return process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT, 10) : 8545;
18
+ }
19
+
10
20
  export const TEST_PEER_CHECK_INTERVAL_MS = 1000;
11
- export const TEST_MAX_TX_POOL_SIZE = 2 * 1024 * 1024 * 1024; // 2GB
21
+ export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
22
 
13
23
  export const MNEMONIC = 'test test test test test test test test test test test junk';
14
24
  export const privateKey = Buffer.from('ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', 'hex');