@aztec/end-to-end 0.0.1-commit.d1f2d6c → 0.0.1-commit.d20b825a7

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 (214) 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 +3 -2
  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 +32 -7
  20. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  21. package/dest/e2e_epochs/epochs_test.js +144 -49
  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 +21 -14
  25. package/dest/e2e_l1_publisher/write_json.d.ts +3 -2
  26. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  27. package/dest/e2e_l1_publisher/write_json.js +1 -7
  28. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  29. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  30. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  31. package/dest/e2e_p2p/inactivity_slash_test.js +3 -3
  32. package/dest/e2e_p2p/p2p_network.d.ts +14 -12
  33. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  34. package/dest/e2e_p2p/p2p_network.js +69 -32
  35. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  36. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  37. package/dest/e2e_p2p/reqresp/utils.js +190 -0
  38. package/dest/e2e_p2p/shared.d.ts +26 -8
  39. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  40. package/dest/e2e_p2p/shared.js +76 -52
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  42. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  43. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  44. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  45. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  46. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  47. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  48. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  49. package/dest/e2e_token_contract/token_contract_test.js +19 -9
  50. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  51. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  52. package/dest/fixtures/authwit_proxy.js +34 -0
  53. package/dest/fixtures/e2e_prover_test.d.ts +7 -6
  54. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  55. package/dest/fixtures/e2e_prover_test.js +38 -50
  56. package/dest/fixtures/elu_monitor.d.ts +21 -0
  57. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  58. package/dest/fixtures/elu_monitor.js +102 -0
  59. package/dest/fixtures/fixtures.d.ts +16 -1
  60. package/dest/fixtures/fixtures.d.ts.map +1 -1
  61. package/dest/fixtures/fixtures.js +16 -0
  62. package/dest/fixtures/get_bb_config.d.ts +1 -1
  63. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  64. package/dest/fixtures/get_bb_config.js +5 -5
  65. package/dest/fixtures/ha_setup.d.ts +71 -0
  66. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  67. package/dest/fixtures/ha_setup.js +116 -0
  68. package/dest/fixtures/index.d.ts +2 -1
  69. package/dest/fixtures/index.d.ts.map +1 -1
  70. package/dest/fixtures/index.js +1 -0
  71. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts +25 -0
  72. package/dest/fixtures/schnorr_hardcoded_account_contract.d.ts.map +1 -0
  73. package/dest/fixtures/schnorr_hardcoded_account_contract.js +39 -0
  74. package/dest/fixtures/setup.d.ts +62 -32
  75. package/dest/fixtures/setup.d.ts.map +1 -1
  76. package/dest/fixtures/setup.js +116 -175
  77. package/dest/fixtures/setup_p2p_test.d.ts +18 -11
  78. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  79. package/dest/fixtures/setup_p2p_test.js +43 -32
  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 +5 -7
  83. package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
  84. package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
  85. package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
  86. package/dest/forward-compatibility/wallet_service.d.ts +3 -0
  87. package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
  88. package/dest/forward-compatibility/wallet_service.js +109 -0
  89. package/dest/legacy-jest-resolver.d.cts +3 -0
  90. package/dest/legacy-jest-resolver.d.cts.map +1 -0
  91. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  92. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  93. package/dest/shared/cross_chain_test_harness.js +13 -13
  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 +2 -2
  103. package/dest/shared/submit-transactions.d.ts.map +1 -1
  104. package/dest/shared/submit-transactions.js +1 -1
  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 +16 -21
  108. package/dest/simulators/lending_simulator.d.ts +1 -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 +100 -39
  117. package/dest/spartan/tx_metrics.d.ts +35 -1
  118. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  119. package/dest/spartan/tx_metrics.js +166 -2
  120. package/dest/spartan/utils/bot.d.ts +3 -2
  121. package/dest/spartan/utils/bot.d.ts.map +1 -1
  122. package/dest/spartan/utils/bot.js +2 -1
  123. package/dest/spartan/utils/config.d.ts +10 -1
  124. package/dest/spartan/utils/config.d.ts.map +1 -1
  125. package/dest/spartan/utils/config.js +4 -1
  126. package/dest/spartan/utils/index.d.ts +6 -4
  127. package/dest/spartan/utils/index.d.ts.map +1 -1
  128. package/dest/spartan/utils/index.js +6 -2
  129. package/dest/spartan/utils/k8s.d.ts +31 -1
  130. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  131. package/dest/spartan/utils/k8s.js +124 -0
  132. package/dest/spartan/utils/nodes.d.ts +14 -5
  133. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  134. package/dest/spartan/utils/nodes.js +204 -33
  135. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  136. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  137. package/dest/spartan/utils/pod_logs.js +74 -0
  138. package/dest/spartan/utils/scripts.d.ts +18 -4
  139. package/dest/spartan/utils/scripts.d.ts.map +1 -1
  140. package/dest/spartan/utils/scripts.js +19 -4
  141. package/dest/test-wallet/test_wallet.d.ts +84 -0
  142. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  143. package/dest/test-wallet/test_wallet.js +255 -0
  144. package/dest/test-wallet/utils.d.ts +41 -0
  145. package/dest/test-wallet/utils.d.ts.map +1 -0
  146. package/dest/test-wallet/utils.js +71 -0
  147. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  148. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  149. package/dest/test-wallet/wallet_worker_script.js +48 -0
  150. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  151. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  152. package/dest/test-wallet/worker_wallet.js +151 -0
  153. package/dest/test-wallet/worker_wallet_schema.d.ts +279 -0
  154. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  155. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  156. package/package.json +46 -43
  157. package/src/bench/client_flows/client_flows_benchmark.ts +33 -20
  158. package/src/bench/client_flows/config.ts +9 -1
  159. package/src/bench/utils.ts +8 -3
  160. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +31 -21
  161. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
  162. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  163. package/src/e2e_epochs/epochs_test.ts +168 -76
  164. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  165. package/src/e2e_fees/fees_test.ts +24 -30
  166. package/src/e2e_l1_publisher/write_json.ts +1 -6
  167. package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
  168. package/src/e2e_p2p/inactivity_slash_test.ts +7 -7
  169. package/src/e2e_p2p/p2p_network.ts +93 -48
  170. package/src/e2e_p2p/reqresp/utils.ts +256 -0
  171. package/src/e2e_p2p/shared.ts +99 -64
  172. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  173. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  174. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  175. package/src/e2e_token_contract/token_contract_test.ts +26 -9
  176. package/src/fixtures/authwit_proxy.ts +54 -0
  177. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  178. package/src/fixtures/e2e_prover_test.ts +47 -56
  179. package/src/fixtures/elu_monitor.ts +126 -0
  180. package/src/fixtures/fixtures.ts +32 -0
  181. package/src/fixtures/get_bb_config.ts +7 -6
  182. package/src/fixtures/ha_setup.ts +188 -0
  183. package/src/fixtures/index.ts +1 -0
  184. package/src/fixtures/schnorr_hardcoded_account_contract.ts +49 -0
  185. package/src/fixtures/setup.ts +162 -236
  186. package/src/fixtures/setup_p2p_test.ts +48 -52
  187. package/src/fixtures/token_utils.ts +3 -3
  188. package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
  189. package/src/forward-compatibility/wallet_service.ts +104 -0
  190. package/src/guides/up_quick_start.sh +3 -5
  191. package/src/legacy-jest-resolver.cjs +135 -0
  192. package/src/shared/cross_chain_test_harness.ts +13 -9
  193. package/src/shared/gas_portal_test_harness.ts +1 -2
  194. package/src/shared/index.ts +1 -0
  195. package/src/shared/jest_setup.ts +51 -1
  196. package/src/shared/mock_state_view.ts +188 -0
  197. package/src/shared/submit-transactions.ts +3 -2
  198. package/src/shared/uniswap_l1_l2.ts +38 -37
  199. package/src/simulators/lending_simulator.ts +8 -4
  200. package/src/simulators/token_simulator.ts +6 -30
  201. package/src/spartan/setup_test_wallets.ts +141 -32
  202. package/src/spartan/tx_metrics.ts +140 -2
  203. package/src/spartan/utils/bot.ts +4 -1
  204. package/src/spartan/utils/config.ts +3 -0
  205. package/src/spartan/utils/index.ts +10 -1
  206. package/src/spartan/utils/k8s.ts +160 -0
  207. package/src/spartan/utils/nodes.ts +251 -31
  208. package/src/spartan/utils/pod_logs.ts +99 -0
  209. package/src/spartan/utils/scripts.ts +43 -7
  210. package/src/test-wallet/test_wallet.ts +357 -0
  211. package/src/test-wallet/utils.ts +112 -0
  212. package/src/test-wallet/wallet_worker_script.ts +60 -0
  213. package/src/test-wallet/worker_wallet.ts +214 -0
  214. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -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,7 +122,7 @@ 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,
@@ -135,7 +134,7 @@ export class P2PNetworkTest {
135
134
  aztecEpochDuration: initialValidatorConfig.aztecEpochDuration ?? l1ContractsConfig.aztecEpochDuration,
136
135
  slashingRoundSizeInEpochs:
137
136
  initialValidatorConfig.slashingRoundSizeInEpochs ?? l1ContractsConfig.slashingRoundSizeInEpochs,
138
- slasherFlavor: initialValidatorConfig.slasherFlavor ?? 'tally',
137
+ slasherEnabled: initialValidatorConfig.slasherEnabled ?? true,
139
138
 
140
139
  ethereumSlotDuration: initialValidatorConfig.ethereumSlotDuration ?? l1ContractsConfig.ethereumSlotDuration,
141
140
  aztecSlotDuration: initialValidatorConfig.aztecSlotDuration ?? l1ContractsConfig.aztecSlotDuration,
@@ -190,10 +189,10 @@ export class P2PNetworkTest {
190
189
  }
191
190
 
192
191
  get fundedAccount() {
193
- if (!this.deployedAccounts[0]) {
194
- 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.');
195
194
  }
196
- return this.deployedAccounts[0];
195
+ return this.hardcodedAccountData;
197
196
  }
198
197
 
199
198
  async addBootstrapNode() {
@@ -301,17 +300,22 @@ export class P2PNetworkTest {
301
300
  await this._sendDummyTx(this.context.deployL1ContractsValues.l1Client);
302
301
  }
303
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. */
304
310
  async setupAccount() {
305
- this.logger.info('Setting up account');
306
- const { deployedAccounts } = await deployAccounts(
307
- 1,
308
- this.logger,
309
- )({
310
- wallet: this.context.wallet,
311
- 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,
312
317
  });
313
- this.deployedAccounts = deployedAccounts;
314
- [{ address: this.defaultAccountAddress }] = deployedAccounts;
318
+ this.defaultAccountAddress = accountManager.address;
315
319
  this.wallet = this.context.wallet;
316
320
  }
317
321
 
@@ -321,8 +325,9 @@ export class P2PNetworkTest {
321
325
  throw new Error('Call setupAccount before deploying spam contract');
322
326
  }
323
327
 
324
- const spamContract = await SpamContract.deploy(this.wallet).send({ from: this.defaultAccountAddress! });
325
- this.spamContract = spamContract;
328
+ ({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
329
+ from: this.defaultAccountAddress!,
330
+ }));
326
331
  }
327
332
 
328
333
  async removeInitialNode() {
@@ -332,9 +337,9 @@ export class P2PNetworkTest {
332
337
  const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
333
338
  blockNumber: receipt.blockNumber,
334
339
  });
335
- this.context.dateProvider!.setTime(Number(block.timestamp) * 1000);
340
+ this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
336
341
 
337
- await this.context.aztecNodeService!.stop();
342
+ await this.context.aztecNodeService.stop();
338
343
  }
339
344
 
340
345
  async sendDummyTx() {
@@ -342,7 +347,7 @@ export class P2PNetworkTest {
342
347
  }
343
348
 
344
349
  private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
345
- const l1TxUtils = createL1TxUtilsFromViemWallet(l1Client);
350
+ const l1TxUtils = createL1TxUtils(l1Client);
346
351
  return await l1TxUtils.sendAndMonitorTransaction({
347
352
  to: l1Client.account!.address,
348
353
  value: 1n,
@@ -351,13 +356,30 @@ export class P2PNetworkTest {
351
356
 
352
357
  async setup() {
353
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
+
354
374
  this.context = await setup(
355
375
  0,
356
376
  {
357
377
  ...this.setupOptions,
358
378
  fundSponsoredFPC: true,
359
379
  skipAccountDeployment: true,
360
- 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,
361
383
  aztecTargetCommitteeSize: 0,
362
384
  l1ContractsArgs: this.deployL1ContractsArgs,
363
385
  },
@@ -369,12 +391,17 @@ export class P2PNetworkTest {
369
391
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
370
392
  const initialFundedAccounts = [...this.context.initialFundedAccounts.map(a => a.address), sponsoredFPCAddress];
371
393
 
372
- const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
373
- this.prefilledPublicData = prefilledPublicData;
394
+ const { genesis } = await getGenesisValues(
395
+ initialFundedAccounts,
396
+ undefined,
397
+ undefined,
398
+ this.context.genesis!.genesisTimestamp,
399
+ );
400
+ this.genesis = genesis;
374
401
 
375
402
  const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
376
- this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider!).start();
377
- 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));
378
405
  }
379
406
 
380
407
  async stopNodes(nodes: AztecNodeService[]) {
@@ -405,6 +432,7 @@ export class P2PNetworkTest {
405
432
  expectedNodeCount?: number,
406
433
  timeoutSeconds = 30,
407
434
  checkIntervalSeconds = 0.1,
435
+ topics: TopicType[] = [TopicType.tx],
408
436
  ) {
409
437
  const nodeCount = expectedNodeCount ?? nodes.length;
410
438
  const minPeerCount = nodeCount - 1;
@@ -430,6 +458,29 @@ export class P2PNetworkTest {
430
458
  );
431
459
 
432
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
+ }
433
484
  }
434
485
 
435
486
  async teardown() {
@@ -441,8 +492,7 @@ export class P2PNetworkTest {
441
492
  async getContracts(): Promise<{
442
493
  rollup: RollupContract;
443
494
  slasherContract: GetContractReturnType<typeof SlasherAbi, ViemClient>;
444
- slashingProposer: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
445
- slashFactory: SlashFactoryContract;
495
+ slashingProposer: SlashingProposerContract | undefined;
446
496
  }> {
447
497
  if (!this.ctx.deployL1ContractsValues) {
448
498
  throw new Error('DeployAztecL1ContractsValues not set');
@@ -459,14 +509,9 @@ export class P2PNetworkTest {
459
509
  client: this.ctx.deployL1ContractsValues.l1Client,
460
510
  });
461
511
 
462
- // Get the actual slashing proposer from rollup (which handles both empire and tally)
512
+ // Get the actual slashing proposer from rollup
463
513
  const slashingProposer = await rollup.getSlashingProposer();
464
514
 
465
- const slashFactory = new SlashFactoryContract(
466
- this.ctx.deployL1ContractsValues.l1Client,
467
- getAddress(this.ctx.deployL1ContractsValues.l1ContractAddresses.slashFactoryAddress!.toString()),
468
- );
469
-
470
- return { rollup, slasherContract, slashingProposer, slashFactory };
515
+ return { rollup, slasherContract, slashingProposer };
471
516
  }
472
517
  }
@@ -0,0 +1,256 @@
1
+ import type { AztecNodeService } from '@aztec/aztec-node';
2
+ import { createLogger } from '@aztec/aztec.js/log';
3
+ import { waitForTx } from '@aztec/aztec.js/node';
4
+ import { Tx } from '@aztec/aztec.js/tx';
5
+ import { RollupContract } from '@aztec/ethereum/contracts';
6
+ import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
7
+ import { timesAsync } from '@aztec/foundation/collection';
8
+ import { retryUntil } from '@aztec/foundation/retry';
9
+
10
+ import { expect, jest } from '@jest/globals';
11
+ import fs from 'fs';
12
+ import os from 'os';
13
+ import path from 'path';
14
+
15
+ import { getBootNodeUdpPort, shouldCollectMetrics } from '../../fixtures/fixtures.js';
16
+ import { createNodes } from '../../fixtures/setup_p2p_test.js';
17
+ import { P2PNetworkTest, WAIT_FOR_TX_TIMEOUT } from '../p2p_network.js';
18
+ import { prepareTransactions } from '../shared.js';
19
+
20
+ // Don't set this to a higher value than 9 because each node will use a different L1 publisher account and anvil seeds
21
+ export const NUM_VALIDATORS = 6;
22
+ export const NUM_TXS_PER_NODE = 4;
23
+ export const BOOT_NODE_UDP_PORT = getBootNodeUdpPort();
24
+
25
+ export const createReqrespDataDir = () => fs.mkdtempSync(path.join(os.tmpdir(), 'reqresp-'));
26
+
27
+ type ReqrespOptions = {
28
+ disableStatusHandshake?: boolean;
29
+ };
30
+
31
+ export async function createReqrespTest(options: ReqrespOptions = {}): Promise<P2PNetworkTest> {
32
+ const { disableStatusHandshake = false } = options;
33
+ const t = await P2PNetworkTest.create({
34
+ testName: 'e2e_p2p_reqresp_tx',
35
+ numberOfNodes: 0,
36
+ numberOfValidators: NUM_VALIDATORS,
37
+ basePort: BOOT_NODE_UDP_PORT,
38
+ // To collect metrics - run in aztec-packages `docker compose --profile metrics up`
39
+ metricsPort: shouldCollectMetrics(),
40
+ initialConfig: {
41
+ ethereumSlotDuration: 8,
42
+ aztecSlotDuration: 36,
43
+ blockDurationMs: 6000,
44
+ l1PublishingTime: 8,
45
+ minTxsPerBlock: 1,
46
+ maxTxsPerBlock: 2,
47
+ enforceTimeTable: true,
48
+ aztecProofSubmissionEpochs: 1024, // effectively do not reorg
49
+ ...(disableStatusHandshake ? { p2pDisableStatusHandshake: true } : {}),
50
+ listenAddress: '127.0.0.1',
51
+ aztecEpochDuration: 64, // stable committee
52
+ },
53
+ });
54
+ await t.setup();
55
+ await t.applyBaseSetup();
56
+ return t;
57
+ }
58
+
59
+ export async function cleanupReqrespTest(params: { t: P2PNetworkTest; nodes?: AztecNodeService[]; dataDir: string }) {
60
+ const { t, nodes, dataDir } = params;
61
+ if (nodes) {
62
+ await t.stopNodes(nodes);
63
+ }
64
+ await t.teardown();
65
+ for (let i = 0; i < NUM_VALIDATORS; i++) {
66
+ fs.rmSync(`${dataDir}-${i}`, { recursive: true, force: true, maxRetries: 3 });
67
+ }
68
+ }
69
+
70
+ const getNodePort = (nodeIndex: number) => BOOT_NODE_UDP_PORT + 1 + nodeIndex;
71
+
72
+ export async function runReqrespTxTest(params: {
73
+ t: P2PNetworkTest;
74
+ dataDir: string;
75
+ disableStatusHandshake?: boolean;
76
+ }): Promise<AztecNodeService[]> {
77
+ const { t, dataDir, disableStatusHandshake = false } = params;
78
+
79
+ if (!t.bootstrapNodeEnr) {
80
+ throw new Error('Bootstrap node ENR is not available');
81
+ }
82
+
83
+ t.logger.info('Creating nodes');
84
+ const aztecNodeConfig = disableStatusHandshake
85
+ ? { ...t.ctx.aztecNodeConfig, p2pDisableStatusHandshake: true }
86
+ : t.ctx.aztecNodeConfig;
87
+
88
+ const nodes = await createNodes(
89
+ aztecNodeConfig,
90
+ t.ctx.dateProvider,
91
+ t.bootstrapNodeEnr,
92
+ NUM_VALIDATORS,
93
+ BOOT_NODE_UDP_PORT,
94
+ t.genesis,
95
+ dataDir,
96
+ shouldCollectMetrics(),
97
+ );
98
+
99
+ t.logger.info('Waiting for nodes to connect');
100
+ await t.waitForP2PMeshConnectivity(nodes, NUM_VALIDATORS);
101
+
102
+ await t.setupAccount();
103
+
104
+ const targetBlockNumber = await t.ctx.aztecNodeService.getBlockNumber();
105
+ await retryUntil(
106
+ async () => {
107
+ const blockNumbers = await Promise.all(nodes.map(node => node.getBlockNumber()));
108
+ return blockNumbers.every(blockNumber => blockNumber >= targetBlockNumber) ? true : undefined;
109
+ },
110
+ `validators to sync to L2 block ${targetBlockNumber}`,
111
+ 60,
112
+ 0.5,
113
+ );
114
+
115
+ t.logger.info('Preparing transactions to send');
116
+ const txBatches = await timesAsync(2, () =>
117
+ prepareTransactions(t.logger, t.ctx.aztecNodeService, NUM_TXS_PER_NODE, t.fundedAccount),
118
+ );
119
+
120
+ t.logger.info('Removing initial node');
121
+ await t.removeInitialNode();
122
+
123
+ t.logger.info('Starting fresh slot');
124
+ const [timestamp] = await t.ctx.cheatCodes.rollup.advanceToNextSlot();
125
+ t.ctx.dateProvider.setTime(Number(timestamp) * 1000);
126
+ const startSlotTimestamp = BigInt(timestamp);
127
+
128
+ const { proposerIndexes, nodesToTurnOffTxGossip } = await getProposerIndexes(t, startSlotTimestamp);
129
+ t.logger.info(`Turning off tx gossip for nodes: ${nodesToTurnOffTxGossip.map(getNodePort)}`);
130
+ t.logger.info(`Sending txs to proposer nodes: ${proposerIndexes.map(getNodePort)}`);
131
+
132
+ // Replace the p2p node implementation of some of the nodes with a spy such that it does not store transactions that are gossiped to it
133
+ // Original implementation of `handleGossipedTx` will store received transactions in the tx pool.
134
+ // We chose the first 2 nodes that will be the proposers for the next few slots
135
+ for (const nodeIndex of nodesToTurnOffTxGossip) {
136
+ const logger = createLogger(`p2p:${getNodePort(nodeIndex)}`);
137
+ jest.spyOn((nodes[nodeIndex] as any).p2pClient.p2pService, 'handleGossipedTx').mockImplementation(((
138
+ payloadData: Buffer,
139
+ ) => {
140
+ const txHash = Tx.fromBuffer(payloadData).getTxHash();
141
+ logger.info(`Skipping storage of gossiped transaction ${txHash.toString()}`);
142
+ return Promise.resolve();
143
+ }) as any);
144
+ }
145
+
146
+ // We send the tx to the proposer nodes directly, ignoring the pxe and node in each context
147
+ // We cannot just call tx.send since they were created using a pxe wired to the first node which is now stopped
148
+ t.logger.info('Sending transactions through proposer nodes');
149
+ const submittedTxs = await Promise.all(
150
+ txBatches.map(async (batch, batchIndex) => {
151
+ const proposerNode = nodes[proposerIndexes[batchIndex]];
152
+ for (const tx of batch) {
153
+ t.logger.info(`Tx ${tx.getTxHash().toString()} base64: ${tx.toBuffer().toString('base64')}`);
154
+ }
155
+ const txHashes = batch.map(tx => tx.getTxHash().toString());
156
+ t.logger.info(
157
+ `Sending batch ${batchIndex} to proposer ${getNodePort(proposerIndexes[batchIndex])}: ${txHashes.join(', ')}`,
158
+ );
159
+ await Promise.all(
160
+ batch.map(async tx => {
161
+ try {
162
+ await proposerNode.sendTx(tx);
163
+ } catch (err) {
164
+ t.logger.error(`Error sending tx: ${err}`);
165
+ throw err;
166
+ }
167
+ }),
168
+ );
169
+ return batch.map(tx => ({ node: proposerNode, txHash: tx.getTxHash() }));
170
+ }),
171
+ );
172
+
173
+ // Log pool state per node after sending
174
+ for (let i = 0; i < NUM_VALIDATORS; i++) {
175
+ const count = await nodes[i].getPendingTxCount();
176
+ t.logger.info(`Node ${getNodePort(i)} pool has ${count} pending txs`);
177
+ }
178
+
179
+ t.logger.info('Waiting for all transactions to be mined');
180
+ await Promise.all(
181
+ submittedTxs.flatMap((batch, batchIndex) =>
182
+ batch.map(async (submittedTx, txIndex) => {
183
+ t.logger.info(`Waiting for tx ${batchIndex}-${txIndex} ${submittedTx.txHash.toString()} to be mined`);
184
+ await waitForTx(submittedTx.node, submittedTx.txHash, { timeout: WAIT_FOR_TX_TIMEOUT * 1.5 });
185
+ t.logger.info(`Tx ${batchIndex}-${txIndex} ${submittedTx.txHash.toString()} has been mined`);
186
+ }),
187
+ ),
188
+ );
189
+
190
+ t.logger.info('All transactions mined');
191
+
192
+ // Assert that multiple blocks were built for at least one slot
193
+ t.logger.info('Verifying multiple blocks for at least one checkpoint');
194
+ // Wait for L1 checkpoint sync, which may lag behind P2P block propagation.
195
+ const checkpoints = await retryUntil(
196
+ async () => {
197
+ const cps = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
198
+ return cps.length > 0 && cps.some(cp => cp.checkpoint.blocks.length >= 2) ? cps : undefined;
199
+ },
200
+ 'waiting for multi-block checkpoint to sync from L1',
201
+ 30,
202
+ 1,
203
+ );
204
+
205
+ let mbpsFound = false;
206
+ let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
207
+
208
+ for (const published of checkpoints) {
209
+ const blockCount = published.checkpoint.blocks.length;
210
+ mbpsFound = mbpsFound || blockCount >= 2;
211
+
212
+ for (let i = 0; i < blockCount; i++) {
213
+ const block = published.checkpoint.blocks[i];
214
+ expect(block.indexWithinCheckpoint).toBe(i);
215
+ expect(block.checkpointNumber).toBe(published.checkpoint.number);
216
+ expect(block.number).toBe(expectedBlockNumber);
217
+ expectedBlockNumber++;
218
+ }
219
+ }
220
+
221
+ expect(mbpsFound).toBe(true);
222
+ return nodes;
223
+ }
224
+
225
+ async function getProposerIndexes(t: P2PNetworkTest, startSlotTimestamp: bigint) {
226
+ // Get the nodes for the next set of slots
227
+ const rollupContract = new RollupContract(
228
+ t.ctx.deployL1ContractsValues.l1Client,
229
+ t.ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress,
230
+ );
231
+
232
+ const attesters = await rollupContract.getAttesters();
233
+ const startSlot = await rollupContract.getSlotAt(startSlotTimestamp);
234
+
235
+ const proposers = await Promise.all(
236
+ Array.from({ length: 3 }, async (_, i) => {
237
+ const slot = SlotNumber(startSlot + i);
238
+ const slotTimestamp = await rollupContract.getTimestampForSlot(slot);
239
+ return await rollupContract.getProposerAt(slotTimestamp);
240
+ }),
241
+ );
242
+ // Get the indexes of the nodes that are responsible for the next two slots
243
+ const proposerIndexes = proposers.map(proposer => attesters.findIndex(a => a.equals(proposer)));
244
+
245
+ if (proposerIndexes.some(i => i === -1)) {
246
+ throw new Error(
247
+ `Proposer index not found for proposer ` +
248
+ `(proposers=${proposers.map(p => p.toString()).join(',')}, indices=${proposerIndexes.join(',')})`,
249
+ );
250
+ }
251
+
252
+ const nodesToTurnOffTxGossip = Array.from({ length: NUM_VALIDATORS }, (_, i) => i).filter(
253
+ i => !proposerIndexes.includes(i),
254
+ );
255
+ return { proposerIndexes, nodesToTurnOffTxGossip };
256
+ }