@aztec/end-to-end 0.0.1-commit.6d3c34e → 0.0.1-commit.7035c9bd6

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 (236) 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 +130 -137
  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/utils.d.ts +6 -5
  11. package/dest/bench/utils.d.ts.map +1 -1
  12. package/dest/bench/utils.js +13 -8
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +9 -8
  14. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  15. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +107 -113
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +7 -8
  17. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  18. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +68 -64
  19. package/dest/e2e_deploy_contract/deploy_test.d.ts +5 -4
  20. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  21. package/dest/e2e_deploy_contract/deploy_test.js +18 -13
  22. package/dest/e2e_epochs/epochs_test.d.ts +17 -7
  23. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  24. package/dest/e2e_epochs/epochs_test.js +90 -40
  25. package/dest/e2e_fees/bridging_race.notest.js +3 -5
  26. package/dest/e2e_fees/fees_test.d.ts +14 -14
  27. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  28. package/dest/e2e_fees/fees_test.js +133 -144
  29. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  30. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  31. package/dest/e2e_l1_publisher/write_json.js +14 -13
  32. package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
  33. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  34. package/dest/e2e_nested_contract/nested_contract_test.js +30 -40
  35. package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
  36. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
  37. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  38. package/dest/e2e_p2p/p2p_network.d.ts +11 -9
  39. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  40. package/dest/e2e_p2p/p2p_network.js +132 -108
  41. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  42. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  43. package/dest/e2e_p2p/reqresp/utils.js +190 -0
  44. package/dest/e2e_p2p/shared.d.ts +26 -6
  45. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  46. package/dest/e2e_p2p/shared.js +46 -18
  47. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  48. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  49. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  50. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  51. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  52. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  53. package/dest/e2e_token_contract/token_contract_test.d.ts +19 -10
  54. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  55. package/dest/e2e_token_contract/token_contract_test.js +100 -92
  56. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  57. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  58. package/dest/fixtures/authwit_proxy.js +30 -0
  59. package/dest/fixtures/e2e_prover_test.d.ts +11 -17
  60. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  61. package/dest/fixtures/e2e_prover_test.js +112 -127
  62. package/dest/fixtures/elu_monitor.d.ts +21 -0
  63. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  64. package/dest/fixtures/elu_monitor.js +102 -0
  65. package/dest/fixtures/fixtures.d.ts +5 -1
  66. package/dest/fixtures/fixtures.d.ts.map +1 -1
  67. package/dest/fixtures/fixtures.js +6 -0
  68. package/dest/fixtures/ha_setup.d.ts +71 -0
  69. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  70. package/dest/fixtures/ha_setup.js +116 -0
  71. package/dest/fixtures/index.d.ts +2 -1
  72. package/dest/fixtures/index.d.ts.map +1 -1
  73. package/dest/fixtures/index.js +1 -0
  74. package/dest/fixtures/setup.d.ts +239 -0
  75. package/dest/fixtures/setup.d.ts.map +1 -0
  76. package/dest/fixtures/setup.js +606 -0
  77. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  78. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  79. package/dest/fixtures/setup_p2p_test.js +40 -29
  80. package/dest/fixtures/token_utils.d.ts +2 -2
  81. package/dest/fixtures/token_utils.d.ts.map +1 -1
  82. package/dest/fixtures/token_utils.js +12 -8
  83. package/dest/fixtures/utils.d.ts +5 -191
  84. package/dest/fixtures/utils.d.ts.map +1 -1
  85. package/dest/fixtures/utils.js +4 -615
  86. package/dest/quality_of_service/prometheus_client.d.ts +38 -0
  87. package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
  88. package/dest/quality_of_service/prometheus_client.js +67 -0
  89. package/dest/shared/cross_chain_test_harness.d.ts +14 -4
  90. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  91. package/dest/shared/cross_chain_test_harness.js +24 -24
  92. package/dest/shared/gas_portal_test_harness.d.ts +11 -1
  93. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  94. package/dest/shared/gas_portal_test_harness.js +3 -3
  95. package/dest/shared/index.d.ts +2 -1
  96. package/dest/shared/index.d.ts.map +1 -1
  97. package/dest/shared/index.js +1 -0
  98. package/dest/shared/jest_setup.js +41 -1
  99. package/dest/shared/mock_state_view.d.ts +86 -0
  100. package/dest/shared/mock_state_view.d.ts.map +1 -0
  101. package/dest/shared/mock_state_view.js +186 -0
  102. package/dest/shared/submit-transactions.d.ts +4 -4
  103. package/dest/shared/submit-transactions.d.ts.map +1 -1
  104. package/dest/shared/submit-transactions.js +9 -11
  105. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  106. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  107. package/dest/shared/uniswap_l1_l2.js +27 -28
  108. package/dest/simulators/lending_simulator.d.ts +5 -1
  109. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  110. package/dest/simulators/lending_simulator.js +4 -4
  111. package/dest/simulators/token_simulator.d.ts +1 -1
  112. package/dest/simulators/token_simulator.d.ts.map +1 -1
  113. package/dest/simulators/token_simulator.js +3 -24
  114. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  115. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  116. package/dest/spartan/setup_test_wallets.js +107 -37
  117. package/dest/spartan/tx_metrics.d.ts +51 -2
  118. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  119. package/dest/spartan/tx_metrics.js +334 -7
  120. package/dest/spartan/utils/bot.d.ts +28 -0
  121. package/dest/spartan/utils/bot.d.ts.map +1 -0
  122. package/dest/spartan/utils/bot.js +142 -0
  123. package/dest/spartan/utils/chaos.d.ts +79 -0
  124. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  125. package/dest/spartan/utils/chaos.js +142 -0
  126. package/dest/spartan/utils/clients.d.ts +39 -0
  127. package/dest/spartan/utils/clients.d.ts.map +1 -0
  128. package/dest/spartan/utils/clients.js +90 -0
  129. package/dest/spartan/utils/config.d.ts +45 -0
  130. package/dest/spartan/utils/config.d.ts.map +1 -0
  131. package/dest/spartan/utils/config.js +23 -0
  132. package/dest/spartan/utils/health.d.ts +63 -0
  133. package/dest/spartan/utils/health.d.ts.map +1 -0
  134. package/dest/spartan/utils/health.js +202 -0
  135. package/dest/spartan/utils/helm.d.ts +15 -0
  136. package/dest/spartan/utils/helm.d.ts.map +1 -0
  137. package/dest/spartan/utils/helm.js +47 -0
  138. package/dest/spartan/utils/index.d.ts +11 -0
  139. package/dest/spartan/utils/index.d.ts.map +1 -0
  140. package/dest/spartan/utils/index.js +22 -0
  141. package/dest/spartan/utils/k8s.d.ts +128 -0
  142. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  143. package/dest/spartan/utils/k8s.js +381 -0
  144. package/dest/spartan/utils/nodes.d.ts +40 -0
  145. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  146. package/dest/spartan/utils/nodes.js +461 -0
  147. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  148. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  149. package/dest/spartan/utils/pod_logs.js +74 -0
  150. package/dest/spartan/utils/scripts.d.ts +30 -0
  151. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  152. package/dest/spartan/utils/scripts.js +81 -0
  153. package/dest/spartan/utils.d.ts +2 -253
  154. package/dest/spartan/utils.d.ts.map +1 -1
  155. package/dest/spartan/utils.js +1 -892
  156. package/dest/test-wallet/test_wallet.d.ts +76 -0
  157. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  158. package/dest/test-wallet/test_wallet.js +214 -0
  159. package/dest/test-wallet/utils.d.ts +41 -0
  160. package/dest/test-wallet/utils.d.ts.map +1 -0
  161. package/dest/test-wallet/utils.js +71 -0
  162. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  163. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  164. package/dest/test-wallet/wallet_worker_script.js +48 -0
  165. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  166. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  167. package/dest/test-wallet/worker_wallet.js +151 -0
  168. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  169. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  170. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  171. package/package.json +46 -43
  172. package/src/bench/client_flows/benchmark.ts +24 -2
  173. package/src/bench/client_flows/client_flows_benchmark.ts +148 -210
  174. package/src/bench/client_flows/config.ts +9 -1
  175. package/src/bench/utils.ts +15 -8
  176. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +120 -145
  177. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +103 -111
  178. package/src/e2e_deploy_contract/deploy_test.ts +22 -15
  179. package/src/e2e_epochs/epochs_test.ts +139 -91
  180. package/src/e2e_fees/bridging_race.notest.ts +4 -10
  181. package/src/e2e_fees/fees_test.ts +170 -224
  182. package/src/e2e_l1_publisher/write_json.ts +16 -13
  183. package/src/e2e_nested_contract/nested_contract_test.ts +35 -56
  184. package/src/e2e_p2p/inactivity_slash_test.ts +3 -3
  185. package/src/e2e_p2p/p2p_network.ts +196 -166
  186. package/src/e2e_p2p/reqresp/utils.ts +256 -0
  187. package/src/e2e_p2p/shared.ts +76 -23
  188. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  189. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  190. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  191. package/src/e2e_token_contract/token_contract_test.ts +121 -119
  192. package/src/fixtures/authwit_proxy.ts +50 -0
  193. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  194. package/src/fixtures/e2e_prover_test.ts +133 -171
  195. package/src/fixtures/elu_monitor.ts +126 -0
  196. package/src/fixtures/fixtures.ts +10 -0
  197. package/src/fixtures/ha_setup.ts +186 -0
  198. package/src/fixtures/index.ts +1 -0
  199. package/src/fixtures/setup.ts +903 -0
  200. package/src/fixtures/setup_p2p_test.ts +40 -44
  201. package/src/fixtures/token_utils.ts +10 -6
  202. package/src/fixtures/utils.ts +27 -901
  203. package/src/guides/up_quick_start.sh +3 -3
  204. package/src/quality_of_service/prometheus_client.ts +113 -0
  205. package/src/shared/cross_chain_test_harness.ts +24 -34
  206. package/src/shared/gas_portal_test_harness.ts +2 -2
  207. package/src/shared/index.ts +1 -0
  208. package/src/shared/jest_setup.ts +51 -1
  209. package/src/shared/mock_state_view.ts +188 -0
  210. package/src/shared/submit-transactions.ts +11 -16
  211. package/src/shared/uniswap_l1_l2.ts +49 -51
  212. package/src/simulators/lending_simulator.ts +6 -4
  213. package/src/simulators/token_simulator.ts +6 -30
  214. package/src/spartan/setup_test_wallets.ts +158 -25
  215. package/src/spartan/tx_metrics.ts +256 -10
  216. package/src/spartan/utils/bot.ts +188 -0
  217. package/src/spartan/utils/chaos.ts +253 -0
  218. package/src/spartan/utils/clients.ts +100 -0
  219. package/src/spartan/utils/config.ts +29 -0
  220. package/src/spartan/utils/health.ts +255 -0
  221. package/src/spartan/utils/helm.ts +84 -0
  222. package/src/spartan/utils/index.ts +71 -0
  223. package/src/spartan/utils/k8s.ts +535 -0
  224. package/src/spartan/utils/nodes.ts +543 -0
  225. package/src/spartan/utils/pod_logs.ts +99 -0
  226. package/src/spartan/utils/scripts.ts +99 -0
  227. package/src/spartan/utils.ts +1 -1158
  228. package/src/test-wallet/test_wallet.ts +294 -0
  229. package/src/test-wallet/utils.ts +112 -0
  230. package/src/test-wallet/wallet_worker_script.ts +60 -0
  231. package/src/test-wallet/worker_wallet.ts +213 -0
  232. package/src/test-wallet/worker_wallet_schema.ts +13 -0
  233. package/dest/fixtures/snapshot_manager.d.ts +0 -93
  234. package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
  235. package/dest/fixtures/snapshot_manager.js +0 -488
  236. package/src/fixtures/snapshot_manager.ts +0 -646
@@ -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,22 +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
- },
259
+
260
+ this.proverAztecNode = await AztecNodeService.createAndSync(
261
+ proverNodeConfig,
262
+ { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
285
263
  { prefilledPublicData },
286
264
  );
287
- await this.proverNode.start();
288
-
289
- this.logger.warn(`Proofs are now enabled`);
265
+ this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
290
266
  return this;
291
267
  }
292
268
 
@@ -299,72 +275,58 @@ export class FullProverTest {
299
275
  await this.context.deployL1ContractsValues.l1Client.waitForTransactionReceipt({ hash });
300
276
  }
301
277
 
302
- snapshot = <T>(
303
- name: string,
304
- apply: (context: SubsystemsContext) => Promise<T>,
305
- restore: (snapshotData: T, context: SubsystemsContext) => Promise<void> = () => Promise.resolve(),
306
- ): Promise<void> => this.snapshotManager.snapshot(name, apply, restore);
307
-
308
278
  async teardown() {
309
- await this.snapshotManager.teardown();
310
-
311
279
  // Cleanup related to the full prover PXEs
312
280
  for (let i = 0; i < this.provenComponents.length; i++) {
313
281
  await this.provenComponents[i].teardown();
314
282
  }
315
283
 
316
- // clean up the full prover node
317
- await this.proverNode.stop();
284
+ // clean up the full prover node (by stopping its hosting aztec node)
285
+ await this.proverAztecNode.stop();
318
286
 
319
287
  await Barretenberg.destroySingleton();
320
288
  await this.bbConfigCleanup?.();
321
289
  await this.acvmConfigCleanup?.();
290
+
291
+ await teardown(this.context);
322
292
  }
323
293
 
324
- async applyMintSnapshot() {
325
- await this.snapshotManager.snapshot(
326
- 'mint',
327
- async () => {
328
- const { fakeProofsAsset: asset, accounts } = this;
329
- const privateAmount = 10000n;
330
- const publicAmount = 10000n;
331
-
332
- this.logger.verbose(`Minting ${privateAmount + publicAmount} publicly...`);
333
- await asset.methods
334
- .mint_to_public(accounts[0], privateAmount + publicAmount)
335
- .send({ from: accounts[0] })
336
- .wait();
337
-
338
- this.logger.verbose(`Transferring ${privateAmount} to private...`);
339
- await asset.methods.transfer_to_private(accounts[0], privateAmount).send({ from: accounts[0] }).wait();
340
-
341
- this.logger.verbose(`Minting complete.`);
342
-
343
- return { amount: publicAmount };
344
- },
345
- async ({ amount }) => {
346
- const {
347
- fakeProofsAsset: asset,
348
- accounts: [address],
349
- tokenSim,
350
- } = this;
351
- tokenSim.mintPublic(address, amount);
352
-
353
- const publicBalance = await asset.methods.balance_of_public(address).simulate({ from: address });
354
- this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
355
- expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
356
-
357
- tokenSim.mintPrivate(address, amount);
358
- const privateBalance = await asset.methods.balance_of_private(address).simulate({ from: address });
359
- this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
360
- expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
361
-
362
- const totalSupply = await asset.methods.total_supply().simulate({ from: address });
363
- this.logger.verbose(`Total supply: ${totalSupply}`);
364
- expect(totalSupply).toEqual(tokenSim.totalSupply);
365
-
366
- return Promise.resolve();
367
- },
368
- );
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);
369
331
  }
370
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,6 +7,16 @@ 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
21
  export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
22