@aztec/end-to-end 0.0.1-commit.9372f48 → 0.0.1-commit.949a33fd8

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 (210) hide show
  1. package/README.md +27 -0
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  3. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  4. package/dest/bench/client_flows/client_flows_benchmark.js +24 -31
  5. package/dest/bench/client_flows/config.d.ts +2 -2
  6. package/dest/bench/client_flows/config.d.ts.map +1 -1
  7. package/dest/bench/client_flows/config.js +18 -0
  8. package/dest/bench/utils.d.ts +1 -1
  9. package/dest/bench/utils.d.ts.map +1 -1
  10. package/dest/bench/utils.js +6 -3
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +6 -3
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  13. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +23 -13
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  16. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +4 -3
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  18. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  19. package/dest/e2e_epochs/epochs_test.d.ts +26 -7
  20. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  21. package/dest/e2e_epochs/epochs_test.js +117 -41
  22. package/dest/e2e_fees/fees_test.d.ts +2 -2
  23. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  24. package/dest/e2e_fees/fees_test.js +22 -15
  25. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  26. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  27. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  28. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  29. package/dest/e2e_p2p/p2p_network.d.ts +14 -12
  30. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  31. package/dest/e2e_p2p/p2p_network.js +70 -34
  32. package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
  33. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  34. package/dest/e2e_p2p/reqresp/utils.js +49 -9
  35. package/dest/e2e_p2p/shared.d.ts +26 -8
  36. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  37. package/dest/e2e_p2p/shared.js +74 -50
  38. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  39. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  40. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  42. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  43. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  44. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  45. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  46. package/dest/e2e_token_contract/token_contract_test.js +19 -9
  47. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  48. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  49. package/dest/fixtures/authwit_proxy.js +34 -0
  50. package/dest/fixtures/e2e_prover_test.d.ts +7 -6
  51. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  52. package/dest/fixtures/e2e_prover_test.js +37 -49
  53. package/dest/fixtures/elu_monitor.d.ts +21 -0
  54. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  55. package/dest/fixtures/elu_monitor.js +102 -0
  56. package/dest/fixtures/fixtures.d.ts +16 -1
  57. package/dest/fixtures/fixtures.d.ts.map +1 -1
  58. package/dest/fixtures/fixtures.js +16 -0
  59. package/dest/fixtures/get_bb_config.d.ts +1 -1
  60. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  61. package/dest/fixtures/get_bb_config.js +5 -5
  62. package/dest/fixtures/ha_setup.d.ts +71 -0
  63. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  64. package/dest/fixtures/ha_setup.js +116 -0
  65. package/dest/fixtures/index.d.ts +2 -1
  66. package/dest/fixtures/index.d.ts.map +1 -1
  67. package/dest/fixtures/index.js +1 -0
  68. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  69. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  70. package/dest/fixtures/schnorr_hardcoded_account_contract.js +39 -0
  71. package/dest/fixtures/setup.d.ts +59 -31
  72. package/dest/fixtures/setup.d.ts.map +1 -1
  73. package/dest/fixtures/setup.js +97 -167
  74. package/dest/fixtures/setup_p2p_test.d.ts +18 -10
  75. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  76. package/dest/fixtures/setup_p2p_test.js +23 -17
  77. package/dest/fixtures/token_utils.d.ts +2 -2
  78. package/dest/fixtures/token_utils.d.ts.map +1 -1
  79. package/dest/fixtures/token_utils.js +5 -7
  80. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  81. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  82. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  83. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  84. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  85. package/dest/forward-compatibility/wallet_service.js +109 -0
  86. package/dest/legacy-jest-resolver.d.cts +3 -0
  87. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  88. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  89. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  90. package/dest/shared/cross_chain_test_harness.js +13 -13
  91. package/dest/shared/gas_portal_test_harness.js +3 -3
  92. package/dest/shared/index.d.ts +2 -1
  93. package/dest/shared/index.d.ts.map +1 -1
  94. package/dest/shared/index.js +1 -0
  95. package/dest/shared/jest_setup.js +41 -1
  96. package/dest/shared/mock_state_view.d.ts +86 -0
  97. package/dest/shared/mock_state_view.d.ts.map +1 -0
  98. package/dest/shared/mock_state_view.js +186 -0
  99. package/dest/shared/submit-transactions.d.ts +2 -2
  100. package/dest/shared/submit-transactions.d.ts.map +1 -1
  101. package/dest/shared/submit-transactions.js +1 -1
  102. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  103. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  104. package/dest/shared/uniswap_l1_l2.js +16 -21
  105. package/dest/simulators/lending_simulator.d.ts +1 -1
  106. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  107. package/dest/simulators/lending_simulator.js +4 -4
  108. package/dest/simulators/token_simulator.d.ts +1 -1
  109. package/dest/simulators/token_simulator.d.ts.map +1 -1
  110. package/dest/simulators/token_simulator.js +3 -24
  111. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  112. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  113. package/dest/spartan/setup_test_wallets.js +100 -39
  114. package/dest/spartan/tx_metrics.d.ts +1 -1
  115. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  116. package/dest/spartan/tx_metrics.js +19 -3
  117. package/dest/spartan/utils/bot.d.ts +3 -2
  118. package/dest/spartan/utils/bot.d.ts.map +1 -1
  119. package/dest/spartan/utils/bot.js +2 -1
  120. package/dest/spartan/utils/config.d.ts +10 -1
  121. package/dest/spartan/utils/config.d.ts.map +1 -1
  122. package/dest/spartan/utils/config.js +4 -1
  123. package/dest/spartan/utils/index.d.ts +5 -3
  124. package/dest/spartan/utils/index.d.ts.map +1 -1
  125. package/dest/spartan/utils/index.js +5 -1
  126. package/dest/spartan/utils/k8s.d.ts +3 -1
  127. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  128. package/dest/spartan/utils/k8s.js +6 -0
  129. package/dest/spartan/utils/nodes.d.ts +4 -5
  130. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  131. package/dest/spartan/utils/nodes.js +9 -9
  132. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  133. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  134. package/dest/spartan/utils/pod_logs.js +74 -0
  135. package/dest/spartan/utils/scripts.d.ts +18 -4
  136. package/dest/spartan/utils/scripts.d.ts.map +1 -1
  137. package/dest/spartan/utils/scripts.js +19 -4
  138. package/dest/test-wallet/test_wallet.d.ts +84 -0
  139. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  140. package/dest/test-wallet/test_wallet.js +255 -0
  141. package/dest/test-wallet/utils.d.ts +41 -0
  142. package/dest/test-wallet/utils.d.ts.map +1 -0
  143. package/dest/test-wallet/utils.js +71 -0
  144. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  145. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  146. package/dest/test-wallet/wallet_worker_script.js +48 -0
  147. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  148. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  149. package/dest/test-wallet/worker_wallet.js +151 -0
  150. package/dest/test-wallet/worker_wallet_schema.d.ts +279 -0
  151. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  152. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  153. package/package.json +46 -43
  154. package/src/bench/client_flows/client_flows_benchmark.ts +33 -20
  155. package/src/bench/client_flows/config.ts +9 -1
  156. package/src/bench/utils.ts +8 -3
  157. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +31 -21
  158. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +8 -9
  159. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  160. package/src/e2e_epochs/epochs_test.ts +138 -67
  161. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  162. package/src/e2e_fees/fees_test.ts +25 -31
  163. package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
  164. package/src/e2e_p2p/inactivity_slash_test.ts +7 -7
  165. package/src/e2e_p2p/p2p_network.ts +93 -49
  166. package/src/e2e_p2p/reqresp/utils.ts +63 -13
  167. package/src/e2e_p2p/shared.ts +91 -64
  168. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  169. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  170. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  171. package/src/e2e_token_contract/token_contract_test.ts +26 -9
  172. package/src/fixtures/authwit_proxy.ts +54 -0
  173. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  174. package/src/fixtures/e2e_prover_test.ts +46 -55
  175. package/src/fixtures/elu_monitor.ts +126 -0
  176. package/src/fixtures/fixtures.ts +32 -0
  177. package/src/fixtures/get_bb_config.ts +7 -6
  178. package/src/fixtures/ha_setup.ts +188 -0
  179. package/src/fixtures/index.ts +1 -0
  180. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  181. package/src/fixtures/setup.ts +147 -232
  182. package/src/fixtures/setup_p2p_test.ts +33 -32
  183. package/src/fixtures/token_utils.ts +3 -3
  184. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  185. package/src/forward-compatibility/wallet_service.ts +104 -0
  186. package/src/guides/up_quick_start.sh +3 -5
  187. package/src/legacy-jest-resolver.cjs +135 -0
  188. package/src/shared/cross_chain_test_harness.ts +13 -9
  189. package/src/shared/gas_portal_test_harness.ts +1 -2
  190. package/src/shared/index.ts +1 -0
  191. package/src/shared/jest_setup.ts +51 -1
  192. package/src/shared/mock_state_view.ts +188 -0
  193. package/src/shared/submit-transactions.ts +3 -2
  194. package/src/shared/uniswap_l1_l2.ts +38 -37
  195. package/src/simulators/lending_simulator.ts +8 -4
  196. package/src/simulators/token_simulator.ts +6 -30
  197. package/src/spartan/setup_test_wallets.ts +141 -32
  198. package/src/spartan/tx_metrics.ts +17 -5
  199. package/src/spartan/utils/bot.ts +4 -1
  200. package/src/spartan/utils/config.ts +3 -0
  201. package/src/spartan/utils/index.ts +8 -1
  202. package/src/spartan/utils/k8s.ts +8 -0
  203. package/src/spartan/utils/nodes.ts +15 -10
  204. package/src/spartan/utils/pod_logs.ts +99 -0
  205. package/src/spartan/utils/scripts.ts +43 -7
  206. package/src/test-wallet/test_wallet.ts +357 -0
  207. package/src/test-wallet/utils.ts +112 -0
  208. package/src/test-wallet/wallet_worker_script.ts +60 -0
  209. package/src/test-wallet/worker_wallet.ts +214 -0
  210. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1,7 +1,7 @@
1
1
  import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
3
3
  import type { AztecNode } from '@aztec/aztec.js/node';
4
- import { CheatCodes } from '@aztec/aztec/testing';
4
+ import { CheatCodes, getTokenAllowedSetupFunctions } from '@aztec/aztec/testing';
5
5
  import { createExtendedL1Client } from '@aztec/ethereum/client';
6
6
  import { RollupContract } from '@aztec/ethereum/contracts';
7
7
  import type { DeployAztecL1ContractsArgs } from '@aztec/ethereum/deploy-aztec-l1-contracts';
@@ -20,11 +20,10 @@ import { ProtocolContractAddress } from '@aztec/protocol-contracts';
20
20
  import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice';
21
21
  import { GasSettings } from '@aztec/stdlib/gas';
22
22
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
23
- import { TestWallet } from '@aztec/test-wallet/server';
24
23
 
25
24
  import { getContract } from 'viem';
26
25
 
27
- import { MNEMONIC } from '../fixtures/fixtures.js';
26
+ import { MNEMONIC, getPaddedMaxFeesPerGas } from '../fixtures/fixtures.js';
28
27
  import {
29
28
  type EndToEndContext,
30
29
  type SetupOptions,
@@ -36,6 +35,7 @@ import {
36
35
  import { mintTokensToPrivate } from '../fixtures/token_utils.js';
37
36
  import { type BalancesFn, getBalancesFn, setupSponsoredFPC } from '../fixtures/utils.js';
38
37
  import { FeeJuicePortalTestingHarnessFactory, type GasBridgingTestHarness } from '../shared/gas_portal_test_harness.js';
38
+ import { TestWallet } from '../test-wallet/test_wallet.js';
39
39
 
40
40
  /**
41
41
  * Test fixture for testing fees. Provides the following setup steps:
@@ -104,16 +104,19 @@ export class FeesTest {
104
104
 
105
105
  async setup() {
106
106
  this.logger.verbose('Setting up fresh context...');
107
+ // Token allowlist entries are test-only: FPC-based fee payment with custom tokens won't work on mainnet alpha.
108
+ const tokenAllowList = await getTokenAllowedSetupFunctions();
107
109
  this.context = await setup(0, {
108
110
  startProverNode: true,
109
111
  ...this.setupOptions,
110
112
  fundSponsoredFPC: true,
111
113
  skipAccountDeployment: true,
112
114
  l1ContractsArgs: { ...this.setupOptions },
115
+ txPublicSetupAllowListExtend: [...(this.setupOptions.txPublicSetupAllowListExtend ?? []), ...tokenAllowList],
113
116
  });
114
117
 
115
118
  this.rollupContract = RollupContract.getFromConfig(this.context.config);
116
- this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider!, this.logger, 200).start();
119
+ this.chainMonitor = new ChainMonitor(this.rollupContract, this.context.dateProvider, this.logger, 200).start();
117
120
 
118
121
  await this.applyBaseSetup();
119
122
 
@@ -126,12 +129,12 @@ export class FeesTest {
126
129
  }
127
130
 
128
131
  setIsMarkingAsProven(b: boolean) {
129
- this.context.watcher!.setIsMarkingAsProven(b);
132
+ this.context.watcher.setIsMarkingAsProven(b);
130
133
  }
131
134
 
132
135
  async catchUpProvenChain() {
133
136
  const bn = await this.aztecNode.getBlockNumber();
134
- while ((await this.aztecNode.getProvenBlockNumber()) < bn) {
137
+ while ((await this.aztecNode.getBlockNumber('proven')) < bn) {
135
138
  await sleep(1000);
136
139
  }
137
140
  }
@@ -157,15 +160,15 @@ export class FeesTest {
157
160
 
158
161
  /** Alice mints bananaCoin tokens privately to the target address and redeems them. */
159
162
  async mintPrivateBananas(amount: bigint, address: AztecAddress) {
160
- const balanceBefore = await this.bananaCoin.methods
163
+ const { result: balanceBefore } = await this.bananaCoin.methods
161
164
  .balance_of_private(address)
162
- .simulate({ from: this.aliceAddress });
165
+ .simulate({ from: address });
163
166
 
164
167
  await mintTokensToPrivate(this.bananaCoin, this.aliceAddress, address, amount);
165
168
 
166
- const balanceAfter = await this.bananaCoin.methods
169
+ const { result: balanceAfter } = await this.bananaCoin.methods
167
170
  .balance_of_private(address)
168
- .simulate({ from: this.aliceAddress });
171
+ .simulate({ from: address });
169
172
  expect(balanceAfter).toEqual(balanceBefore + amount);
170
173
  }
171
174
 
@@ -188,9 +191,11 @@ export class FeesTest {
188
191
  });
189
192
 
190
193
  this.wallet = this.context.wallet;
191
- this.aztecNode = this.context.aztecNodeService!;
192
- this.aztecNodeAdmin = this.context.aztecNodeService!;
193
- this.gasSettings = GasSettings.default({ maxFeesPerGas: (await this.aztecNode.getCurrentMinFees()).mul(2) });
194
+ this.aztecNode = this.context.aztecNodeService;
195
+ this.aztecNodeAdmin = this.context.aztecNodeService;
196
+ this.gasSettings = GasSettings.fallback({
197
+ maxFeesPerGas: await getPaddedMaxFeesPerGas(this.aztecNode),
198
+ });
194
199
  this.cheatCodes = this.context.cheatCodes;
195
200
  this.accounts = deployedAccounts.map(a => a.address);
196
201
  this.accounts.forEach((a, i) => this.logger.verbose(`Account ${i} address: ${a}`));
@@ -213,16 +218,11 @@ export class FeesTest {
213
218
 
214
219
  this.feeJuiceContract = FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, this.wallet);
215
220
 
216
- this.getGasBalanceFn = getBalancesFn(
217
- '⛽',
218
- this.feeJuiceContract.methods.balance_of_public,
219
- this.aliceAddress,
220
- this.logger,
221
- );
221
+ this.getGasBalanceFn = getBalancesFn('⛽', this.feeJuiceContract.methods.balance_of_public, this.logger);
222
222
 
223
223
  this.feeJuiceBridgeTestHarness = await FeeJuicePortalTestingHarnessFactory.create({
224
- aztecNode: this.context.aztecNodeService!,
225
- aztecNodeAdmin: this.context.aztecNodeService!,
224
+ aztecNode: this.context.aztecNodeService,
225
+ aztecNodeAdmin: this.context.aztecNodeService,
226
226
  l1Client: this.context.deployL1ContractsValues.l1Client,
227
227
  wallet: this.wallet,
228
228
  logger: this.logger,
@@ -232,22 +232,16 @@ export class FeesTest {
232
232
  async applyDeployBananaToken() {
233
233
  this.logger.info('Applying deploy banana token setup');
234
234
 
235
- const bananaCoin = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
235
+ const { contract: bananaCoin } = await BananaCoin.deploy(this.wallet, this.aliceAddress, 'BC', 'BC', 18n).send({
236
236
  from: this.aliceAddress,
237
237
  });
238
238
  this.logger.info(`BananaCoin deployed at ${bananaCoin.address}`);
239
239
 
240
240
  this.bananaCoin = bananaCoin;
241
- this.getBananaPublicBalanceFn = getBalancesFn(
242
- '🍌.public',
243
- this.bananaCoin.methods.balance_of_public,
244
- this.aliceAddress,
245
- this.logger,
246
- );
241
+ this.getBananaPublicBalanceFn = getBalancesFn('🍌.public', this.bananaCoin.methods.balance_of_public, this.logger);
247
242
  this.getBananaPrivateBalanceFn = getBalancesFn(
248
243
  '🍌.private',
249
244
  this.bananaCoin.methods.balance_of_private,
250
- this.aliceAddress,
251
245
  this.logger,
252
246
  );
253
247
  }
@@ -259,7 +253,7 @@ export class FeesTest {
259
253
  expect((await this.wallet.getContractMetadata(feeJuiceContract.address)).isContractPublished).toBe(true);
260
254
 
261
255
  const bananaCoin = this.bananaCoin;
262
- const bananaFPC = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
256
+ const { contract: bananaFPC } = await FPCContract.deploy(this.wallet, bananaCoin.address, this.fpcAdmin).send({
263
257
  from: this.aliceAddress,
264
258
  });
265
259
 
@@ -290,7 +284,7 @@ export class FeesTest {
290
284
 
291
285
  // @todo @lherskind As we deal with #13601
292
286
  // Right now the value is from `FeeLib.sol`
293
- const L1_GAS_PER_EPOCH_VERIFIED = 1000000n;
287
+ const L1_GAS_PER_EPOCH_VERIFIED = 3600000n;
294
288
 
295
289
  // We round up
296
290
  const mulDiv = (a: bigint, b: bigint, c: bigint) => (a * b) / c + ((a * b) % c > 0n ? 1n : 0n);
@@ -44,7 +44,7 @@ export class NestedContractTest {
44
44
  });
45
45
  this.wallet = this.context.wallet;
46
46
  [{ address: this.defaultAccountAddress }] = deployedAccounts;
47
- this.aztecNode = this.context.aztecNodeService!;
47
+ this.aztecNode = this.context.aztecNodeService;
48
48
 
49
49
  this.logger.info('Public deploy accounts');
50
50
  await publicDeployAccounts(this.wallet, [this.defaultAccountAddress]);
@@ -65,9 +65,11 @@ export class NestedContractTest {
65
65
 
66
66
  async applyManual() {
67
67
  this.logger.info('Deploying parent and child contracts');
68
- const parentContract = await ParentContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
69
- const childContract = await ChildContract.deploy(this.wallet).send({ from: this.defaultAccountAddress });
70
- this.parentContract = parentContract;
71
- this.childContract = childContract;
68
+ ({ contract: this.parentContract } = await ParentContract.deploy(this.wallet).send({
69
+ from: this.defaultAccountAddress,
70
+ }));
71
+ ({ contract: this.childContract } = await ChildContract.deploy(this.wallet).send({
72
+ from: this.defaultAccountAddress,
73
+ }));
72
74
  }
73
75
  }
@@ -58,6 +58,7 @@ export class P2PInactivityTest {
58
58
  basePort: BOOT_NODE_UDP_PORT,
59
59
  startProverNode: true,
60
60
  initialConfig: {
61
+ anvilSlotsInAnEpoch: 4,
61
62
  proverNodeConfig: { proverNodeEpochProvingDelayMs: AZTEC_SLOT_DURATION * 1000 },
62
63
  aztecTargetCommitteeSize: COMMITTEE_SIZE,
63
64
  aztecSlotDuration: AZTEC_SLOT_DURATION,
@@ -66,7 +67,6 @@ export class P2PInactivityTest {
66
67
  listenAddress: '127.0.0.1',
67
68
  minTxsPerBlock: 0,
68
69
  aztecEpochDuration: EPOCH_DURATION,
69
- validatorReexecute: false,
70
70
  sentinelEnabled: true,
71
71
  slashingQuorum: SLASHING_QUORUM,
72
72
  slashingRoundSizeInEpochs: SLASHING_ROUND_SIZE_IN_EPOCHS,
@@ -98,17 +98,17 @@ export class P2PInactivityTest {
98
98
  this.rollup = rollup;
99
99
 
100
100
  if (!this.keepInitialNode) {
101
- await this.test.ctx.aztecNodeService!.stop();
101
+ await this.test.ctx.aztecNodeService.stop();
102
102
  }
103
103
 
104
104
  // Create all active nodes
105
105
  this.activeNodes = await createNodes(
106
106
  this.test.ctx.aztecNodeConfig,
107
- this.test.ctx.dateProvider!,
107
+ this.test.ctx.dateProvider,
108
108
  this.test.bootstrapNodeEnr,
109
109
  NUM_NODES - this.inactiveNodeCount - Number(this.keepInitialNode),
110
110
  BOOT_NODE_UDP_PORT,
111
- this.test.prefilledPublicData,
111
+ this.test.genesis,
112
112
  this.dataDir,
113
113
  undefined,
114
114
  Number(this.keepInitialNode),
@@ -118,18 +118,18 @@ export class P2PInactivityTest {
118
118
  const inactiveConfig = { ...this.test.ctx.aztecNodeConfig, dontStartSequencer: true };
119
119
  this.inactiveNodes = await createNodes(
120
120
  inactiveConfig,
121
- this.test.ctx.dateProvider!,
121
+ this.test.ctx.dateProvider,
122
122
  this.test.bootstrapNodeEnr,
123
123
  this.inactiveNodeCount,
124
124
  BOOT_NODE_UDP_PORT,
125
- this.test.prefilledPublicData,
125
+ this.test.genesis,
126
126
  this.dataDir,
127
127
  undefined,
128
128
  NUM_NODES - this.inactiveNodeCount,
129
129
  );
130
130
 
131
131
  this.nodes = [
132
- ...(this.keepInitialNode ? [this.test.ctx.aztecNodeService!] : []),
132
+ ...(this.keepInitialNode ? [this.test.ctx.aztecNodeService] : []),
133
133
  ...this.activeNodes,
134
134
  ...this.inactiveNodes,
135
135
  ];
@@ -1,18 +1,14 @@
1
- import type { InitialAccountData } from '@aztec/accounts/testing';
1
+ import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
2
2
  import type { AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
3
+ import { getAccountContractAddress } from '@aztec/aztec.js/account';
3
4
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
5
  import { Fr } from '@aztec/aztec.js/fields';
5
6
  import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
6
- import {
7
- type EmpireSlashingProposerContract,
8
- GSEContract,
9
- RollupContract,
10
- type TallySlashingProposerContract,
11
- } from '@aztec/ethereum/contracts';
7
+ import { GSEContract, RollupContract, type SlashingProposerContract } from '@aztec/ethereum/contracts';
12
8
  import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
13
9
  import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
14
10
  import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
15
- import { createL1TxUtilsFromViemWallet } from '@aztec/ethereum/l1-tx-utils';
11
+ import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
16
12
  import { ChainMonitor } from '@aztec/ethereum/test';
17
13
  import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
18
14
  import { EpochNumber } from '@aztec/foundation/branded-types';
@@ -24,20 +20,22 @@ import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
24
20
  import type { BootstrapNode } from '@aztec/p2p/bootstrap';
25
21
  import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
26
22
  import { tryStop } from '@aztec/stdlib/interfaces/server';
27
- import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
28
- import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
23
+ import { TopicType } from '@aztec/stdlib/p2p';
24
+ import type { GenesisData } from '@aztec/stdlib/world-state';
29
25
  import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
30
- import type { TestWallet } from '@aztec/test-wallet/server';
31
26
  import { getGenesisValues } from '@aztec/world-state/testing';
32
27
 
33
28
  import getPort from 'get-port';
34
29
  import { type GetContractReturnType, getAddress, getContract } from 'viem';
35
30
  import { privateKeyToAccount } from 'viem/accounts';
36
31
 
32
+ import {
33
+ SCHNORR_HARDCODED_PRIVATE_KEY,
34
+ SchnorrHardcodedKeyAccountContract,
35
+ } from '../fixtures/schnorr_hardcoded_account_contract.js';
37
36
  import {
38
37
  type EndToEndContext,
39
38
  type SetupOptions,
40
- deployAccounts,
41
39
  getPrivateKeyFromIndex,
42
40
  getSponsoredFPCAddress,
43
41
  setup,
@@ -49,6 +47,7 @@ import {
49
47
  generatePrivateKeys,
50
48
  } from '../fixtures/setup_p2p_test.js';
51
49
  import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
50
+ import type { TestWallet } from '../test-wallet/test_wallet.js';
52
51
 
53
52
  // Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
54
53
  const BOOTSTRAP_NODE_PRIVATE_KEY = '080212208f988fc0899e4a73a5aee4d271a5f20670603a756ad8d84f2c94263a6427c591';
@@ -58,7 +57,7 @@ export const WAIT_FOR_TX_TIMEOUT = l1ContractsConfig.aztecSlotDuration * 3;
58
57
  export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
59
58
  aztecSlotDuration: 12,
60
59
  ethereumSlotDuration: 4,
61
- aztecProofSubmissionWindow: 640,
60
+ aztecProofSubmissionEpochs: 640,
62
61
  };
63
62
 
64
63
  export class P2PNetworkTest {
@@ -75,8 +74,8 @@ export class P2PNetworkTest {
75
74
  public peerIdPrivateKeys: string[] = [];
76
75
  public validators: Operator[] = [];
77
76
 
78
- public deployedAccounts: InitialAccountData[] = [];
79
- public prefilledPublicData: PublicDataTreeLeaf[] = [];
77
+ public hardcodedAccountData!: InitialAccountData;
78
+ public genesis: GenesisData | undefined;
80
79
 
81
80
  // The re-execution test needs a wallet and a spam contract
82
81
  public wallet?: TestWallet;
@@ -123,12 +122,11 @@ export class P2PNetworkTest {
123
122
  initialValidatorConfig.aztecProofSubmissionEpochs ?? l1ContractsConfig.aztecProofSubmissionEpochs,
124
123
  slashingRoundSizeInEpochs:
125
124
  initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
126
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
125
+ slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
127
126
  aztecTargetCommitteeSize: numberOfValidators,
128
127
  metricsPort: metricsPort,
129
128
  numberOfInitialFundedAccounts: 2,
130
129
  startProverNode,
131
- walletMinFeePadding: 2.0,
132
130
  };
133
131
 
134
132
  this.deployL1ContractsArgs = {
@@ -136,7 +134,7 @@ export class P2PNetworkTest {
136
134
  aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
137
135
  slashingRoundSizeInEpochs:
138
136
  initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
139
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
137
+ slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
140
138
 
141
139
  ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
142
140
  aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
@@ -191,10 +189,10 @@ export class P2PNetworkTest {
191
189
  }
192
190
 
193
191
  get fundedAccount() {
194
- if (!this.deployedAccounts[0]) {
195
- throw new Error('Call setupAccount to create a funded account.');
192
+ if (!this.hardcodedAccountData) {
193
+ throw new Error('Call setup to initialize the hardcoded account.');
196
194
  }
197
- return this.deployedAccounts[0];
195
+ return this.hardcodedAccountData;
198
196
  }
199
197
 
200
198
  async addBootstrapNode() {
@@ -302,17 +300,22 @@ export class P2PNetworkTest {
302
300
  await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
303
301
  }
304
302
 
303
+ /** Points the wallet to a P2P-enabled node so transactions can propagate through the network. */
304
+ setupWalletOnNode(node: AztecNodeService) {
305
+ this.logger.info('Pointing wallet to a P2P-enabled node');
306
+ this.context.wallet.updateNode(node);
307
+ }
308
+
309
+ /** Registers the hardcoded account in PXE without on-chain deployment. No sequencer needed. */
305
310
  async setupAccount() {
306
- this.logger.info('Setting up account');
307
- const { deployedAccounts } = await deployAccounts(
308
- 1,
309
- this.logger,
310
- )({
311
- wallet: this.context.wallet,
312
- initialFundedAccounts: this.context.initialFundedAccounts,
311
+ this.logger.info('Registering hardcoded account (no deployment)');
312
+ const contract = new SchnorrHardcodedKeyAccountContract();
313
+ const accountManager = await (this.context.wallet as TestWallet).createAccount({
314
+ secret: this.hardcodedAccountData.secret,
315
+ salt: this.hardcodedAccountData.salt,
316
+ contract,
313
317
  });
314
- this.deployedAccounts = deployedAccounts;
315
- [{ address: this.defaultAccountAddress }] = deployedAccounts;
318
+ this.defaultAccountAddress = accountManager.address;
316
319
  this.wallet = this.context.wallet;
317
320
  }
318
321
 
@@ -322,8 +325,9 @@ export class P2PNetworkTest {
322
325
  throw new Error('Call setupAccount before deploying spam contract');
323
326
  }
324
327
 
325
- const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
326
- this.spamContract = spamContract;
328
+ ({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
329
+ from: this.defaultAccountAddress!,
330
+ }));
327
331
  }
328
332
 
329
333
  async removeInitialNode() {
@@ -333,9 +337,9 @@ export class P2PNetworkTest {
333
337
  const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
334
338
  blockNumber: receipt.blockNumber,
335
339
  });
336
- this.context.dateProvider!.setTime(Number(block.timestamp) * 1000);
340
+ this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
337
341
 
338
- await this.context.aztecNodeService!.stop();
342
+ await this.context.aztecNodeService.stop();
339
343
  }
340
344
 
341
345
  async sendDummyTx() {
@@ -343,7 +347,7 @@ export class P2PNetworkTest {
343
347
  }
344
348
 
345
349
  private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
346
- const l1TxUtils = createL1TxUtilsFromViemWallet(l1Client);
350
+ const l1TxUtils = createL1TxUtils(l1Client);
347
351
  return await l1TxUtils.sendAndMonitorTransaction({
348
352
  to: l1Client.account!.address,
349
353
  value: 1n,
@@ -352,13 +356,30 @@ export class P2PNetworkTest {
352
356
 
353
357
  async setup() {
354
358
  this.logger.info('Setting up subsystems from fresh');
359
+
360
+ // Pre-compute hardcoded account data so it gets funded in genesis.
361
+ const contract = new SchnorrHardcodedKeyAccountContract();
362
+ const secret = Fr.random();
363
+ const salt = Fr.random();
364
+ this.hardcodedAccountData = {
365
+ secret,
366
+ salt,
367
+ signingKey: SCHNORR_HARDCODED_PRIVATE_KEY,
368
+ address: await getAccountContractAddress(contract, secret, salt),
369
+ };
370
+
371
+ // Generate regular Schnorr accounts for tests that need deployable accounts (e.g. add_rollup).
372
+ const regularAccounts = await generateSchnorrAccounts(this.setupOptions.numberOfInitialFundedAccounts ?? 2);
373
+
355
374
  this.context = await setup(
356
375
  0,
357
376
  {
358
377
  ...this.setupOptions,
359
378
  fundSponsoredFPC: true,
360
379
  skipAccountDeployment: true,
361
- slasherFlavor: this.setupOptions.slasherFlavor ?? this.deployL1ContractsArgs.slasherFlavor ?? 'none',
380
+ skipInitialSequencer: true,
381
+ initialFundedAccounts: [...regularAccounts, this.hardcodedAccountData],
382
+ slasherEnabled: this.setupOptions.slasherEnabled ?? this.deployL1ContractsArgs.slasherEnabled ?? false,
362
383
  aztecTargetCommitteeSize: 0,
363
384
  l1ContractsArgs: this.deployL1ContractsArgs,
364
385
  },
@@ -370,12 +391,17 @@ export class P2PNetworkTest {
370
391
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
371
392
  const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
372
393
 
373
- const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
374
- this.prefilledPublicData = prefilledPublicData;
394
+ const { genesis } = await getGenesisValues(
395
+ initialFundedAccounts,
396
+ undefined,
397
+ undefined,
398
+ this.context.genesis!.genesisTimestamp,
399
+ );
400
+ this.genesis = genesis;
375
401
 
376
402
  const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
377
- this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider!).start();
378
- this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider!.setTime(Number(timestamp) * 1000));
403
+ this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
404
+ this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider.setTime(Number(timestamp) * 1000));
379
405
  }
380
406
 
381
407
  async stopNodes(nodes: AztecNodeService[]) {
@@ -406,6 +432,7 @@ export class P2PNetworkTest {
406
432
  expectedNodeCount?: number,
407
433
  timeoutSeconds = 30,
408
434
  checkIntervalSeconds = 0.1,
435
+ topics: TopicType[] = [TopicType.tx],
409
436
  ) {
410
437
  const nodeCount = expectedNodeCount ?? nodes.length;
411
438
  const minPeerCount = nodeCount - 1;
@@ -431,6 +458,29 @@ export class P2PNetworkTest {
431
458
  );
432
459
 
433
460
  this.logger.warn('All nodes connected to P2P mesh');
461
+
462
+ // Wait for GossipSub mesh to form for all specified topics.
463
+ // We only require at least 1 mesh peer per node because GossipSub
464
+ // stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
465
+ for (const topic of topics) {
466
+ this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
467
+ await Promise.all(
468
+ nodes.map(async (node, index) => {
469
+ const p2p = node.getP2P();
470
+ await retryUntil(
471
+ async () => {
472
+ const meshPeers = await p2p.getGossipMeshPeerCount(topic);
473
+ this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
474
+ return meshPeers >= 1 ? true : undefined;
475
+ },
476
+ `Node ${index} to have gossip mesh peers for ${topic} topic`,
477
+ timeoutSeconds,
478
+ checkIntervalSeconds,
479
+ );
480
+ }),
481
+ );
482
+ this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
483
+ }
434
484
  }
435
485
 
436
486
  async teardown() {
@@ -442,8 +492,7 @@ export class P2PNetworkTest {
442
492
  async getContracts(): Promise<{
443
493
  rollup: RollupContract;
444
494
  slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
445
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
446
- slashFactory: SlashFactoryContract;
495
+ slashingProposer: SlashingProposerContract | undefined;
447
496
  }> {
448
497
  if (!this.ctx.deployL1ContractsValues) {
449
498
  throw new Error('DeployAztecL1ContractsValues not set');
@@ -460,14 +509,9 @@ export class P2PNetworkTest {
460
509
  client: this.ctx.deployL1ContractsValues.l1Client,
461
510
  });
462
511
 
463
- // Get the actual slashing proposer from rollup (which handles both empire and tally)
512
+ // Get the actual slashing proposer from rollup
464
513
  const slashingProposer = await rollup.getSlashingProposer();
465
514
 
466
- const slashFactory = new SlashFactoryContract(
467
- this.ctx.deployL1ContractsValues.l1Client,
468
- getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
469
- );
470
-
471
- return { rollup, slasherContract, slashingProposer, slashFactory };
515
+ return { rollup, slasherContract, slashingProposer };
472
516
  }
473
517
  }