@aztec/end-to-end 5.0.0-rc.1 → 5.0.0

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 (257) hide show
  1. package/README.md +215 -27
  2. package/dest/automine/automine_test_context.d.ts +85 -0
  3. package/dest/automine/automine_test_context.d.ts.map +1 -0
  4. package/dest/automine/automine_test_context.js +98 -0
  5. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts +2 -0
  6. package/dest/automine/contracts/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  7. package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.d.ts +1 -1
  8. package/dest/automine/contracts/fixtures/storage_proof_fixture.d.ts.map +1 -0
  9. package/dest/automine/delivery/interactive_handshake_responder.d.ts +48 -0
  10. package/dest/automine/delivery/interactive_handshake_responder.d.ts.map +1 -0
  11. package/dest/automine/delivery/interactive_handshake_responder.js +76 -0
  12. package/dest/automine/delivery/onchain_delivery_harness.d.ts +19 -0
  13. package/dest/automine/delivery/onchain_delivery_harness.d.ts.map +1 -0
  14. package/dest/automine/delivery/onchain_delivery_harness.js +141 -0
  15. package/dest/automine/token/blacklist_token_contract_test.d.ts +49 -0
  16. package/dest/automine/token/blacklist_token_contract_test.d.ts.map +1 -0
  17. package/dest/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.js +17 -24
  18. package/dest/automine/token/token_contract_test.d.ts +40 -0
  19. package/dest/automine/token/token_contract_test.d.ts.map +1 -0
  20. package/dest/{e2e_token_contract → automine/token}/token_contract_test.js +22 -28
  21. package/dest/automine/token/token_test_helpers.d.ts +73 -0
  22. package/dest/automine/token/token_test_helpers.d.ts.map +1 -0
  23. package/dest/automine/token/token_test_helpers.js +97 -0
  24. package/dest/bench/client_flows/benchmark.d.ts +1 -1
  25. package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
  26. package/dest/bench/client_flows/benchmark.js +3 -1
  27. package/dest/bench/client_flows/client_flows_benchmark.d.ts +4 -4
  28. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  29. package/dest/bench/client_flows/client_flows_benchmark.js +25 -10
  30. package/dest/bench/utils.d.ts +1 -1
  31. package/dest/composed/ha/ha_full_setup.d.ts +77 -0
  32. package/dest/composed/ha/ha_full_setup.d.ts.map +1 -0
  33. package/dest/composed/ha/ha_full_setup.js +383 -0
  34. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts +12 -0
  35. package/dest/composed/web3signer/multi_validator_keystore_utils.d.ts.map +1 -0
  36. package/dest/fixtures/e2e_prover_test.d.ts +10 -7
  37. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  38. package/dest/fixtures/e2e_prover_test.js +33 -14
  39. package/dest/fixtures/fixtures.d.ts +8 -5
  40. package/dest/fixtures/fixtures.d.ts.map +1 -1
  41. package/dest/fixtures/fixtures.js +12 -4
  42. package/dest/fixtures/ha_setup.d.ts +3 -3
  43. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  44. package/dest/fixtures/ha_setup.js +4 -1
  45. package/dest/fixtures/index.d.ts +2 -1
  46. package/dest/fixtures/index.d.ts.map +1 -1
  47. package/dest/fixtures/index.js +1 -0
  48. package/dest/fixtures/setup.d.ts +35 -9
  49. package/dest/fixtures/setup.d.ts.map +1 -1
  50. package/dest/fixtures/setup.js +175 -142
  51. package/dest/fixtures/setup_p2p_test.d.ts +1 -1
  52. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  53. package/dest/fixtures/setup_p2p_test.js +3 -3
  54. package/dest/fixtures/standard_contracts_genesis.d.ts +16 -0
  55. package/dest/fixtures/standard_contracts_genesis.d.ts.map +1 -0
  56. package/dest/fixtures/standard_contracts_genesis.js +25 -0
  57. package/dest/fixtures/timing.d.ts +42 -0
  58. package/dest/fixtures/timing.d.ts.map +1 -0
  59. package/dest/fixtures/timing.js +72 -0
  60. package/dest/fixtures/token_utils.d.ts +22 -4
  61. package/dest/fixtures/token_utils.d.ts.map +1 -1
  62. package/dest/fixtures/token_utils.js +21 -1
  63. package/dest/fixtures/wait_helpers.d.ts +135 -0
  64. package/dest/fixtures/wait_helpers.d.ts.map +1 -0
  65. package/dest/fixtures/wait_helpers.js +154 -0
  66. package/dest/forward-compatibility/wallet_service.js +1 -1
  67. package/dest/multi-node/block-production/setup.d.ts +97 -0
  68. package/dest/multi-node/block-production/setup.d.ts.map +1 -0
  69. package/dest/multi-node/block-production/setup.js +158 -0
  70. package/dest/multi-node/governance/setup.d.ts +67 -0
  71. package/dest/multi-node/governance/setup.d.ts.map +1 -0
  72. package/dest/multi-node/governance/setup.js +126 -0
  73. package/dest/multi-node/multi_node_test_context.d.ts +212 -0
  74. package/dest/multi-node/multi_node_test_context.d.ts.map +1 -0
  75. package/dest/multi-node/multi_node_test_context.js +347 -0
  76. package/dest/multi-node/slashing/inactivity_setup.d.ts +27 -0
  77. package/dest/multi-node/slashing/inactivity_setup.d.ts.map +1 -0
  78. package/dest/multi-node/slashing/inactivity_setup.js +111 -0
  79. package/dest/multi-node/slashing/setup.d.ts +167 -0
  80. package/dest/multi-node/slashing/setup.d.ts.map +1 -0
  81. package/dest/multi-node/slashing/setup.js +275 -0
  82. package/dest/{e2e_p2p → p2p}/p2p_network.d.ts +10 -2
  83. package/dest/p2p/p2p_network.d.ts.map +1 -0
  84. package/dest/{e2e_p2p → p2p}/p2p_network.js +36 -9
  85. package/dest/p2p/reqresp/utils.d.ts +19 -0
  86. package/dest/p2p/reqresp/utils.d.ts.map +1 -0
  87. package/dest/{e2e_p2p → p2p}/reqresp/utils.js +4 -15
  88. package/dest/p2p/shared.d.ts +72 -0
  89. package/dest/p2p/shared.d.ts.map +1 -0
  90. package/dest/p2p/shared.js +212 -0
  91. package/dest/shared/cross_chain_test_harness.d.ts +3 -3
  92. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  93. package/dest/shared/cross_chain_test_harness.js +24 -16
  94. package/dest/shared/gas_portal_test_harness.d.ts +1 -1
  95. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  96. package/dest/shared/gas_portal_test_harness.js +8 -5
  97. package/dest/shared/submit-transactions.d.ts +1 -1
  98. package/dest/shared/submit-transactions.d.ts.map +1 -1
  99. package/dest/shared/submit-transactions.js +12 -5
  100. package/dest/shared/timing_env.d.js +5 -0
  101. package/dest/shared/timing_env.js +365 -0
  102. package/dest/shared/wait_for_l1_to_l2_message.js +1 -1
  103. package/dest/simulators/lending_simulator.js +1 -1
  104. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts +75 -0
  105. package/dest/single-node/cross-chain/cross_chain_messaging_test.d.ts.map +1 -0
  106. package/dest/{e2e_cross_chain_messaging → single-node/cross-chain}/cross_chain_messaging_test.js +77 -27
  107. package/dest/single-node/cross-chain/message_test_helpers.d.ts +38 -0
  108. package/dest/single-node/cross-chain/message_test_helpers.d.ts.map +1 -0
  109. package/dest/single-node/cross-chain/message_test_helpers.js +70 -0
  110. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.d.ts +1 -1
  111. package/dest/single-node/fees/bridging_race.notest.d.ts.map +1 -0
  112. package/dest/{e2e_fees → single-node/fees}/bridging_race.notest.js +17 -4
  113. package/dest/single-node/fees/fees_test.d.ts +95 -0
  114. package/dest/single-node/fees/fees_test.d.ts.map +1 -0
  115. package/dest/{e2e_fees → single-node/fees}/fees_test.js +124 -46
  116. package/dest/single-node/l1-reorgs/setup.d.ts +42 -0
  117. package/dest/single-node/l1-reorgs/setup.d.ts.map +1 -0
  118. package/dest/single-node/l1-reorgs/setup.js +57 -0
  119. package/dest/single-node/partial-proofs/setup.d.ts +5 -0
  120. package/dest/single-node/partial-proofs/setup.d.ts.map +1 -0
  121. package/dest/single-node/partial-proofs/setup.js +5 -0
  122. package/dest/single-node/proving/setup.d.ts +5 -0
  123. package/dest/single-node/proving/setup.d.ts.map +1 -0
  124. package/dest/single-node/proving/setup.js +5 -0
  125. package/dest/single-node/recovery/setup.d.ts +5 -0
  126. package/dest/single-node/recovery/setup.d.ts.map +1 -0
  127. package/dest/single-node/recovery/setup.js +5 -0
  128. package/dest/single-node/setup.d.ts +49 -0
  129. package/dest/single-node/setup.d.ts.map +1 -0
  130. package/dest/single-node/setup.js +56 -0
  131. package/dest/single-node/single_node_test_context.d.ts +373 -0
  132. package/dest/single-node/single_node_test_context.d.ts.map +1 -0
  133. package/dest/single-node/single_node_test_context.js +845 -0
  134. package/dest/spartan/setup_test_wallets.d.ts +1 -1
  135. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  136. package/dest/spartan/setup_test_wallets.js +18 -8
  137. package/dest/spartan/tx_metrics.d.ts +10 -1
  138. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  139. package/dest/spartan/tx_metrics.js +32 -0
  140. package/dest/test-wallet/test_wallet.d.ts +23 -4
  141. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  142. package/dest/test-wallet/test_wallet.js +20 -4
  143. package/dest/test-wallet/utils.d.ts +36 -1
  144. package/dest/test-wallet/utils.d.ts.map +1 -1
  145. package/dest/test-wallet/utils.js +64 -4
  146. package/dest/test-wallet/wallet_worker_script.js +5 -2
  147. package/dest/test-wallet/worker_wallet.d.ts +5 -5
  148. package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
  149. package/dest/test-wallet/worker_wallet.js +2 -2
  150. package/dest/test-wallet/worker_wallet_schema.js +2 -1
  151. package/package.json +41 -41
  152. package/src/automine/README.md +60 -0
  153. package/src/automine/automine_test_context.ts +153 -0
  154. package/src/automine/delivery/interactive_handshake_responder.ts +125 -0
  155. package/src/automine/delivery/onchain_delivery_harness.ts +213 -0
  156. package/src/{e2e_blacklist_token_contract → automine/token}/blacklist_token_contract_test.ts +19 -39
  157. package/src/{e2e_token_contract → automine/token}/token_contract_test.ts +24 -43
  158. package/src/automine/token/token_test_helpers.ts +138 -0
  159. package/src/bench/client_flows/benchmark.ts +3 -1
  160. package/src/bench/client_flows/client_flows_benchmark.ts +39 -12
  161. package/src/composed/ha/ha_full_setup.ts +466 -0
  162. package/src/fixtures/e2e_prover_test.ts +40 -23
  163. package/src/fixtures/fixtures.ts +14 -4
  164. package/src/fixtures/ha_setup.ts +7 -3
  165. package/src/fixtures/index.ts +1 -0
  166. package/src/fixtures/setup.ts +217 -146
  167. package/src/fixtures/setup_p2p_test.ts +3 -3
  168. package/src/fixtures/standard_contracts_genesis.ts +28 -0
  169. package/src/fixtures/timing.ts +97 -0
  170. package/src/fixtures/token_utils.ts +39 -4
  171. package/src/fixtures/wait_helpers.ts +333 -0
  172. package/src/forward-compatibility/wallet_service.ts +2 -2
  173. package/src/guides/up_quick_start.sh +5 -0
  174. package/src/infra/README.md +12 -0
  175. package/src/multi-node/README.md +96 -0
  176. package/src/multi-node/block-production/setup.ts +272 -0
  177. package/src/multi-node/governance/setup.ts +172 -0
  178. package/src/multi-node/multi_node_test_context.ts +447 -0
  179. package/src/multi-node/slashing/inactivity_setup.ts +139 -0
  180. package/src/multi-node/slashing/setup.ts +433 -0
  181. package/src/p2p/README.md +78 -0
  182. package/src/{e2e_p2p → p2p}/p2p_network.ts +36 -7
  183. package/src/{e2e_p2p → p2p}/reqresp/utils.ts +5 -14
  184. package/src/p2p/shared.ts +329 -0
  185. package/src/shared/cross_chain_test_harness.ts +22 -13
  186. package/src/shared/gas_portal_test_harness.ts +13 -5
  187. package/src/shared/submit-transactions.ts +13 -5
  188. package/src/shared/timing_env.d.mts +39 -0
  189. package/src/shared/timing_env.mjs +363 -0
  190. package/src/shared/wait_for_l1_to_l2_message.ts +1 -1
  191. package/src/simulators/lending_simulator.ts +1 -1
  192. package/src/single-node/README.md +66 -0
  193. package/src/{e2e_cross_chain_messaging → single-node/cross-chain}/cross_chain_messaging_test.ts +110 -39
  194. package/src/single-node/cross-chain/message_test_helpers.ts +125 -0
  195. package/src/{e2e_fees → single-node/fees}/bridging_race.notest.ts +19 -5
  196. package/src/{e2e_fees → single-node/fees}/fees_test.ts +141 -48
  197. package/src/single-node/l1-reorgs/setup.ts +93 -0
  198. package/src/single-node/partial-proofs/setup.ts +8 -0
  199. package/src/single-node/proving/setup.ts +15 -0
  200. package/src/single-node/recovery/setup.ts +8 -0
  201. package/src/single-node/setup.ts +63 -0
  202. package/src/single-node/single_node_test_context.ts +1054 -0
  203. package/src/spartan/setup_test_wallets.ts +23 -8
  204. package/src/spartan/tx_metrics.ts +26 -0
  205. package/src/test-wallet/test_wallet.ts +28 -6
  206. package/src/test-wallet/utils.ts +102 -5
  207. package/src/test-wallet/wallet_worker_script.ts +6 -3
  208. package/src/test-wallet/worker_wallet.ts +5 -9
  209. package/src/test-wallet/worker_wallet_schema.ts +1 -1
  210. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +0 -56
  211. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +0 -1
  212. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +0 -58
  213. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +0 -1
  214. package/dest/e2e_deploy_contract/deploy_test.d.ts +0 -36
  215. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +0 -1
  216. package/dest/e2e_deploy_contract/deploy_test.js +0 -42
  217. package/dest/e2e_epochs/epochs_test.d.ts +0 -137
  218. package/dest/e2e_epochs/epochs_test.d.ts.map +0 -1
  219. package/dest/e2e_epochs/epochs_test.js +0 -485
  220. package/dest/e2e_fees/bridging_race.notest.d.ts.map +0 -1
  221. package/dest/e2e_fees/fees_test.d.ts +0 -89
  222. package/dest/e2e_fees/fees_test.d.ts.map +0 -1
  223. package/dest/e2e_l1_publisher/write_json.d.ts +0 -11
  224. package/dest/e2e_l1_publisher/write_json.d.ts.map +0 -1
  225. package/dest/e2e_l1_publisher/write_json.js +0 -56
  226. package/dest/e2e_multi_validator/utils.d.ts +0 -12
  227. package/dest/e2e_multi_validator/utils.d.ts.map +0 -1
  228. package/dest/e2e_nested_contract/nested_contract_test.d.ts +0 -22
  229. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +0 -1
  230. package/dest/e2e_nested_contract/nested_contract_test.js +0 -40
  231. package/dest/e2e_p2p/inactivity_slash_test.d.ts +0 -31
  232. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +0 -1
  233. package/dest/e2e_p2p/inactivity_slash_test.js +0 -138
  234. package/dest/e2e_p2p/p2p_network.d.ts.map +0 -1
  235. package/dest/e2e_p2p/reqresp/utils.d.ts +0 -22
  236. package/dest/e2e_p2p/reqresp/utils.d.ts.map +0 -1
  237. package/dest/e2e_p2p/shared.d.ts +0 -75
  238. package/dest/e2e_p2p/shared.d.ts.map +0 -1
  239. package/dest/e2e_p2p/shared.js +0 -217
  240. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +0 -2
  241. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +0 -1
  242. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +0 -1
  243. package/dest/e2e_token_contract/token_contract_test.d.ts +0 -44
  244. package/dest/e2e_token_contract/token_contract_test.d.ts.map +0 -1
  245. package/src/e2e_deploy_contract/deploy_test.ts +0 -73
  246. package/src/e2e_epochs/epochs_test.ts +0 -596
  247. package/src/e2e_l1_publisher/write_json.ts +0 -77
  248. package/src/e2e_nested_contract/nested_contract_test.ts +0 -51
  249. package/src/e2e_p2p/inactivity_slash_test.ts +0 -181
  250. package/src/e2e_p2p/shared.ts +0 -332
  251. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.js +0 -0
  252. /package/dest/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.js +0 -0
  253. /package/dest/{e2e_multi_validator/utils.js → composed/web3signer/multi_validator_keystore_utils.js} +0 -0
  254. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof.json +0 -0
  255. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fetcher.ts +0 -0
  256. /package/src/{e2e_storage_proof → automine/contracts}/fixtures/storage_proof_fixture.ts +0 -0
  257. /package/src/{e2e_multi_validator/utils.ts → composed/web3signer/multi_validator_keystore_utils.ts} +0 -0
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Shared setup for the docker-compose HA full suite.
3
+ *
4
+ * Stands up the complete HA cluster used by `e2e_ha_full.parallel.test.ts` and
5
+ * `e2e_ha_distribute_work.test.ts`: a bootstrap RPC/P2P node plus NODE_COUNT in-proc
6
+ * `AztecNodeService` HA peers that share one PostgreSQL slashing-protection DB and a Web3Signer keystore.
7
+ * Requires the docker-compose HA suite (run_test.sh ha): live Postgres (DATABASE_URL) and Web3Signer
8
+ * sidecar.
9
+ *
10
+ * The suite is split across two files because the "distribute work" test kills nodes as it runs, leaving
11
+ * the cluster unusable; giving it its own file (its own cluster) removes the previous "must run last"
12
+ * ordering contract without changing what any test asserts.
13
+ */ import { createAztecNodeService } from '@aztec/aztec-node';
14
+ import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
15
+ import { NO_WAIT, getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
16
+ import { Fr } from '@aztec/aztec.js/fields';
17
+ import { waitForTx } from '@aztec/aztec.js/node';
18
+ import { GovernanceProposerContract } from '@aztec/ethereum/contracts';
19
+ import { SecretValue } from '@aztec/foundation/config';
20
+ import { withLoggerBindings } from '@aztec/foundation/log/server';
21
+ import { retryUntil } from '@aztec/foundation/retry';
22
+ import { TestContract } from '@aztec/noir-test-contracts.js/Test';
23
+ import { TopicType } from '@aztec/stdlib/p2p';
24
+ import { TxStatus } from '@aztec/stdlib/tx';
25
+ import getPort, { portNumbers } from 'get-port';
26
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
27
+ import { tmpdir } from 'node:os';
28
+ import { join } from 'node:path';
29
+ import { Pool } from 'pg';
30
+ import { PIPELINING_SETUP_OPTS } from '../../fixtures/fixtures.js';
31
+ import { cleanupHADatabase, createHADatabaseConfig, createInitialValidatorsFromPrivateKeys, getAddressesFromPrivateKeys, setupHADatabase } from '../../fixtures/ha_setup.js';
32
+ import { getPrivateKeyFromIndex, setup } from '../../fixtures/utils.js';
33
+ import { createWeb3SignerKeystore, getWeb3SignerTestKeystoreDir, getWeb3SignerUrl, refreshWeb3Signer } from '../../fixtures/web3signer.js';
34
+ import { proveInteraction } from '../../test-wallet/utils.js';
35
+ export const NODE_COUNT = 5;
36
+ export const VALIDATOR_COUNT = 4;
37
+ export const COMMITTEE_SIZE = 4;
38
+ // Allocate p2p listen ports from above the OS ephemeral range (Linux default tops out at 60999) so they
39
+ // never collide with an ephemeral socket the OS may already have handed out -- e.g. the in-process prover
40
+ // node (which listens on p2pPort 0) or any outbound connection. The previous fixed 4040x ports sat inside
41
+ // the ephemeral range, so an ephemeral socket occasionally held a node's port at bind time, surfacing as
42
+ // libp2p ERR_NO_VALID_ADDRESSES and aborting beforeAll. get-port also locks each returned port briefly, so
43
+ // concurrent calls within this process never hand back the same one.
44
+ const getFreeP2PPort = ()=>getPort({
45
+ port: portNumbers(61000, 65535)
46
+ });
47
+ export async function registerTestContract(wallet) {
48
+ const instance = await getContractInstanceFromInstantiationParams(TestContract.artifact, {
49
+ constructorArgs: [],
50
+ constructorArtifact: undefined,
51
+ salt: Fr.ZERO,
52
+ publicKeys: undefined,
53
+ deployer: undefined
54
+ });
55
+ await wallet.registerContract(instance, TestContract.artifact);
56
+ return TestContract.at(instance.address, wallet);
57
+ }
58
+ export async function submitTriggerTx(wallet, testContract, from) {
59
+ const tx = await proveInteraction(wallet, testContract.methods.emit_nullifier(Fr.random()), {
60
+ from
61
+ });
62
+ return await tx.send({
63
+ wait: NO_WAIT
64
+ });
65
+ }
66
+ export async function waitForTriggerTx(node, txHash) {
67
+ const receipt = await waitForTx(node, txHash, {
68
+ waitForStatus: TxStatus.CHECKPOINTED
69
+ });
70
+ if (!receipt.blockNumber) {
71
+ throw new Error('Trigger tx was checkpointed without a block number');
72
+ }
73
+ return receipt;
74
+ }
75
+ /**
76
+ * Owns the full HA cluster lifecycle and the shared helpers the two HA test files drive it with. Each
77
+ * test file constructs one instance and calls {@link setup} in `beforeAll` / {@link teardown} in
78
+ * `afterAll`; state fields are populated by {@link setup} and read directly by the tests.
79
+ */ export class HaFullTestContext {
80
+ logger;
81
+ wallet;
82
+ ownerAddress;
83
+ testContract;
84
+ aztecNode;
85
+ config;
86
+ accounts;
87
+ dateProvider;
88
+ genesis;
89
+ haNodePools;
90
+ haNodeServices;
91
+ haKeystoreDirs;
92
+ mainPool;
93
+ databaseConfig;
94
+ attesterPrivateKeys;
95
+ attesterAddresses;
96
+ publisherPrivateKeys;
97
+ publisherAddresses;
98
+ web3SignerUrl;
99
+ deployL1ContractsValues;
100
+ governanceProposer;
101
+ /** Per-node initial keystore JSON (all 4 attesters, node's own publisher) for restore after reload test */ initialKeystoreJsons;
102
+ teardownBootstrap = async ()=>{};
103
+ haSequencersStarted = false;
104
+ stoppedHANodeIndexes = new Set();
105
+ getSignatureContext = ()=>({
106
+ chainId: this.config.l1ChainId,
107
+ rollupAddress: this.deployL1ContractsValues.l1ContractAddresses.rollupAddress
108
+ });
109
+ startHASequencers = async ()=>{
110
+ if (this.haSequencersStarted) {
111
+ return;
112
+ }
113
+ await Promise.all(this.haNodeServices.map(async (service, i)=>{
114
+ this.logger.info(`Starting HA peer node ${i} sequencer`);
115
+ await service.getSequencer()?.start();
116
+ }));
117
+ this.haSequencersStarted = true;
118
+ this.logger.info('All HA peer sequencers started');
119
+ };
120
+ sendTriggerTx = async ()=>{
121
+ await this.startHASequencers();
122
+ const txHash = await submitTriggerTx(this.wallet, this.testContract, this.ownerAddress);
123
+ return await waitForTriggerTx(this.aztecNode, txHash);
124
+ };
125
+ stopHANode = async (nodeIndex)=>{
126
+ if (this.stoppedHANodeIndexes.has(nodeIndex)) {
127
+ return;
128
+ }
129
+ this.logger.info(`Stopping HA peer node ${nodeIndex}`);
130
+ await this.haNodeServices[nodeIndex].stop();
131
+ this.stoppedHANodeIndexes.add(nodeIndex);
132
+ };
133
+ async setup() {
134
+ // Check required environment variables
135
+ if (!process.env.DATABASE_URL) {
136
+ throw new Error('DATABASE_URL environment variable must be set for HA tests');
137
+ }
138
+ this.web3SignerUrl = getWeb3SignerUrl();
139
+ if (!this.web3SignerUrl) {
140
+ throw new Error('WEB3_SIGNER_URL environment variable must be set for HA tests');
141
+ }
142
+ // Setup database configuration
143
+ this.databaseConfig = createHADatabaseConfig('ha-full-test');
144
+ // Connect to database (migrations already run by docker-compose entrypoint)
145
+ this.mainPool = setupHADatabase(this.databaseConfig.databaseUrl.getValue());
146
+ this.attesterPrivateKeys = Array.from({
147
+ length: VALIDATOR_COUNT
148
+ }, (_, i)=>`0x${getPrivateKeyFromIndex(i).toString('hex')}`);
149
+ this.publisherPrivateKeys = Array.from({
150
+ length: NODE_COUNT
151
+ }, (_, i)=>`0x${getPrivateKeyFromIndex(i + VALIDATOR_COUNT).toString('hex')}`);
152
+ const web3SignerDir = getWeb3SignerTestKeystoreDir();
153
+ const allKeys = [
154
+ ...this.attesterPrivateKeys,
155
+ ...this.publisherPrivateKeys
156
+ ];
157
+ for (const key of allKeys){
158
+ await createWeb3SignerKeystore(web3SignerDir, key);
159
+ }
160
+ this.attesterAddresses = getAddressesFromPrivateKeys(this.attesterPrivateKeys);
161
+ this.publisherAddresses = getAddressesFromPrivateKeys(this.publisherPrivateKeys);
162
+ // Refresh Web3Signer to load all the keys (attesters + publishers)
163
+ await refreshWeb3Signer(this.web3SignerUrl, ...this.attesterAddresses, ...this.publisherAddresses);
164
+ // Create database pools for HA nodes
165
+ this.haNodePools = Array.from({
166
+ length: NODE_COUNT
167
+ }, ()=>{
168
+ const pool = new Pool({
169
+ connectionString: this.databaseConfig.databaseUrl.getValue()
170
+ });
171
+ // pg-pool re-emits idle-client errors on the pool; with no listener the emit throws - in production this
172
+ // crashes the validator process.
173
+ pool.on('error', (err)=>this.logger?.warn(`HA node pool error: ${err.message}`));
174
+ return pool;
175
+ });
176
+ const initialValidators = createInitialValidatorsFromPrivateKeys(this.attesterPrivateKeys);
177
+ const bootstrapP2PPort = await getFreeP2PPort();
178
+ ({ teardown: this.teardownBootstrap, logger: this.logger, wallet: this.wallet, aztecNode: this.aztecNode, config: this.config, accounts: this.accounts, dateProvider: this.dateProvider, deployL1ContractsValues: this.deployL1ContractsValues, genesis: this.genesis } = await setup(// A single default initializerless account, created/funded/registered by setup with no on-chain
179
+ // deploy tx -- the bootstrap node can't build blocks (disableValidator), so the owner must be usable
180
+ // without one.
181
+ 1, {
182
+ ...PIPELINING_SETUP_OPTS,
183
+ automineL1Setup: true,
184
+ initialValidators,
185
+ sequencerPublisherPrivateKeys: [
186
+ new SecretValue(this.publisherPrivateKeys[0])
187
+ ],
188
+ aztecTargetCommitteeSize: COMMITTEE_SIZE,
189
+ // The full HA docker/Web3Signer stack can still be joining and syncing after the shared
190
+ // 12s pipelining preset's 2.5s start window has closed. Keep real sequencing, but give
191
+ // HA validators enough time to pass the enforced build-start gate in CI.
192
+ aztecSlotDuration: 16,
193
+ // This suite validates HA coordination on tx-bearing checkpoints. Requiring one tx avoids a startup empty
194
+ // checkpoint from occupying the shared HA publisher while the trigger tx is still being prepared.
195
+ minTxsPerBlock: 1,
196
+ archiverPollingIntervalMS: 200,
197
+ sequencerPollingIntervalMS: 200,
198
+ worldStateBlockCheckIntervalMS: 200,
199
+ blockCheckIntervalMS: 200,
200
+ startProverNode: true,
201
+ // The bootstrap node is only an RPC/P2P anchor. HA validators are the first block producers in this suite.
202
+ disableValidator: true,
203
+ // Enable P2P for transaction gossip
204
+ p2pEnabled: true,
205
+ // Bind the bootstrap node above the ephemeral range too (see getFreeP2PPort), so it can't lose
206
+ // its port to an ephemeral socket and abort the whole suite before any HA node is created. Set
207
+ // the broadcast port explicitly to the same value: discv5 otherwise defaults p2pBroadcastPort to
208
+ // p2pPort by mutating this config object in place, and that mutated value would then leak into the
209
+ // HA nodes' configs below (built by spreading `config`), making them advertise the wrong port.
210
+ p2pPort: bootstrapP2PPort,
211
+ p2pBroadcastPort: bootstrapP2PPort,
212
+ // Enable slashing for testing governance + slashing vote coordination
213
+ slasherEnabled: true,
214
+ slashingRoundSizeInEpochs: 1,
215
+ slashingQuorum: 17
216
+ }, {
217
+ syncChainTip: 'proven'
218
+ }));
219
+ this.ownerAddress = this.accounts[0];
220
+ this.testContract = await registerTestContract(this.wallet);
221
+ if (!this.dateProvider) {
222
+ throw new Error('dateProvider must be provided by setup for HA tests');
223
+ }
224
+ this.logger.info('Bootstrap node setup complete; funded initializerless account and test contract registered locally');
225
+ // Get bootstrap node's P2P ENR for HA nodes to connect to
226
+ const bootstrapNodeEnr = await this.aztecNode.getEncodedEnr();
227
+ if (!bootstrapNodeEnr) {
228
+ throw new Error('Failed to get bootstrap node ENR - P2P may not be enabled');
229
+ }
230
+ this.logger.info(`Bootstrap node ENR: ${bootstrapNodeEnr}`);
231
+ // L1 contract wrappers for querying votes
232
+ this.governanceProposer = new GovernanceProposerContract(this.deployL1ContractsValues.l1Client, this.deployL1ContractsValues.l1ContractAddresses.governanceProposerAddress.toString());
233
+ this.logger.info('L1 contract wrappers initialized');
234
+ this.haNodeServices = [];
235
+ this.haKeystoreDirs = [];
236
+ this.logger.info(`Starting ${NODE_COUNT} HA peer nodes...`);
237
+ // Per-node keystore: all attesters but only this node's publisher to avoid nonce conflicts.
238
+ // When keyStoreDirectory is set the node loads validators/publishers from file only, so we omit them from config.
239
+ this.initialKeystoreJsons = [];
240
+ for(let i = 0; i < NODE_COUNT; i++){
241
+ const nodeId = `${this.databaseConfig.nodeId}-${i + 1}`;
242
+ this.logger.info(`Starting HA peer node ${i} with nodeId: ${nodeId}`);
243
+ const keystoreContent = {
244
+ schemaVersion: 1,
245
+ validators: [
246
+ {
247
+ attester: this.attesterAddresses,
248
+ feeRecipient: AztecAddress.ZERO.toString(),
249
+ coinbase: EthAddress.fromString(this.attesterAddresses[0]).toChecksumString(),
250
+ remoteSigner: this.web3SignerUrl,
251
+ publisher: [
252
+ this.publisherAddresses[i]
253
+ ]
254
+ }
255
+ ]
256
+ };
257
+ const keystoreJson = JSON.stringify(keystoreContent, null, 2);
258
+ this.initialKeystoreJsons.push(keystoreJson);
259
+ const keystoreDir = await mkdtemp(join(tmpdir(), `ha-keystore-${i}-`));
260
+ this.haKeystoreDirs.push(keystoreDir);
261
+ await writeFile(join(keystoreDir, 'keystore.json'), keystoreJson);
262
+ const dataDirectory = this.config.dataDirectory ? `${this.config.dataDirectory}-${i}` : undefined;
263
+ const nodeP2PPort = await getFreeP2PPort();
264
+ const nodeConfig = {
265
+ ...this.config,
266
+ nodeId,
267
+ keyStoreDirectory: keystoreDir,
268
+ // Ensure txs are included in proposals to test full signing path
269
+ publishTxsWithProposals: true,
270
+ dataDirectory,
271
+ databaseUrl: this.databaseConfig.databaseUrl,
272
+ pollingIntervalMs: this.databaseConfig.pollingIntervalMs,
273
+ peerSigningTimeoutMs: this.databaseConfig.peerSigningTimeoutMs,
274
+ maxStuckDutiesAgeMs: this.databaseConfig.maxStuckDutiesAgeMs,
275
+ haSigningEnabled: true,
276
+ disableValidator: false,
277
+ // Enable P2P for transaction and block gossip
278
+ p2pEnabled: true,
279
+ // Each HA node gets its own free port above the ephemeral range. Override the broadcast port too:
280
+ // `...config` carries the bootstrap node's broadcast port (discv5 sets it in place), which would
281
+ // otherwise make every HA node advertise the bootstrap's port instead of its own.
282
+ p2pPort: nodeP2PPort,
283
+ p2pBroadcastPort: nodeP2PPort,
284
+ // Connect to bootstrap node for tx gossip
285
+ bootstrapNodes: [
286
+ bootstrapNodeEnr
287
+ ],
288
+ web3SignerUrl: this.web3SignerUrl
289
+ };
290
+ const nodeService = await withLoggerBindings({
291
+ actor: `HA-${i}`
292
+ }, async ()=>{
293
+ return await createAztecNodeService(nodeConfig, {
294
+ dateProvider: this.dateProvider
295
+ }, {
296
+ genesis: this.genesis,
297
+ dontStartSequencer: true
298
+ });
299
+ });
300
+ this.haNodeServices.push(nodeService);
301
+ this.logger.info(`HA peer node ${i} started successfully`);
302
+ }
303
+ this.logger.info(`All ${NODE_COUNT} HA peer nodes started and coordinating via PostgreSQL database`);
304
+ this.logger.info('Waiting for HA peer nodes to join the tx gossip mesh');
305
+ await retryUntil(async ()=>{
306
+ const meshStates = await Promise.all(this.haNodeServices.map(async (service, nodeIndex)=>{
307
+ const p2p = service.getP2P();
308
+ const [peers, txMeshPeerCount] = await Promise.all([
309
+ p2p.getPeers(),
310
+ p2p.getGossipMeshPeerCount(TopicType.tx)
311
+ ]);
312
+ return {
313
+ nodeIndex,
314
+ peerCount: peers.length,
315
+ txMeshPeerCount
316
+ };
317
+ }));
318
+ this.logger.debug('HA tx gossip mesh status', {
319
+ meshStates
320
+ });
321
+ return meshStates.every(({ peerCount, txMeshPeerCount })=>peerCount > 0 && txMeshPeerCount > 0) ? true : undefined;
322
+ }, 'HA tx gossip mesh readiness', 60, 1);
323
+ // The owner is an initializerless account, so it needs no deployment tx -- it was funded at genesis
324
+ // and registered during setup, and is ready to transact as soon as the HA nodes start building blocks.
325
+ this.logger.info(`Test account ready at ${this.ownerAddress}`);
326
+ }
327
+ async teardown() {
328
+ // Stop all sequencers before tearing down the nodes: a sequencer stop awaits its in-flight
329
+ // iteration, which can spend tens of seconds finishing a vote or checkpoint publish on L1.
330
+ // Stops must be awaited fully — jest runs without forceExit, so a node abandoned mid-stop
331
+ // outlives the test environment and keeps the worker process alive until the CI job timeout.
332
+ // The dateProvider reset must wait until nodes are stopped: it rewinds the shared clock from
333
+ // chain time to wall time (minutes apart after the automine deploy burst), and any publisher
334
+ // deadline armed against the rewound clock would block shutdown until wall time catches up.
335
+ if (this.haNodeServices) {
336
+ await Promise.allSettled(this.haNodeServices.map(async (service, i)=>{
337
+ try {
338
+ await service.getSequencer()?.stop();
339
+ } catch (error) {
340
+ this.logger.error(`Failed to stop sequencer of HA peer node ${i}: ${error}`);
341
+ }
342
+ }));
343
+ await Promise.allSettled(this.haNodeServices.map((_, i)=>this.stopHANode(i).catch((error)=>{
344
+ this.logger.error(`Failed to stop HA peer node ${i}: ${error}`);
345
+ })));
346
+ }
347
+ this.dateProvider?.reset();
348
+ // Cleanup HA keystore temp directories
349
+ if (this.haKeystoreDirs) {
350
+ for(let i = 0; i < this.haKeystoreDirs.length; i++){
351
+ try {
352
+ await rm(this.haKeystoreDirs[i], {
353
+ recursive: true
354
+ });
355
+ } catch (error) {
356
+ this.logger.error(`Failed to remove HA keystore dir ${i}: ${error}`);
357
+ }
358
+ }
359
+ }
360
+ // Cleanup HA resources (database pools, etc.)
361
+ if (this.haNodePools) {
362
+ for (const pool of this.haNodePools){
363
+ try {
364
+ await pool.end();
365
+ } catch (error) {
366
+ this.logger.error(`Failed to close HA node pool: ${error}`);
367
+ }
368
+ }
369
+ }
370
+ await cleanupHADatabase(this.mainPool, this.logger);
371
+ await this.mainPool.end();
372
+ // Cleanup bootstrap node and test infrastructure (this cleans up the shared data directory)
373
+ await this.teardownBootstrap();
374
+ }
375
+ /** Clean up database state between tests. */ async resetDutiesTable() {
376
+ try {
377
+ await this.mainPool.query('DELETE FROM validator_duties');
378
+ } catch (error) {
379
+ // Ignore cleanup errors (table might not exist on first run failure)
380
+ this.logger?.warn(`Failed to clean up validator_duties: ${error}`);
381
+ }
382
+ }
383
+ }
@@ -0,0 +1,12 @@
1
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import type { EthPrivateKey } from '@aztec/node-keystore';
4
+ export declare function createJSONRPCSigner(keyLookup: Map<string, EthPrivateKey>, stats: Map<string, number>): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
5
+ export declare function createKeyFile1(fileName: string, mnemonic: string, validatorIndex: number, publisher1Key: EthPrivateKey, publisher2Key: EthPrivateKey, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
6
+ export declare function createKeyFile2(fileName: string, validatorKey: EthPrivateKey, publisherMnemonic: string, publisher1Index: number, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
7
+ export declare function createKeyFile3(fileName: string, validatorAddress: EthAddress, publisher1Key: EthPrivateKey, publisher2Key: EthPrivateKey, coinbase: EthAddress, remoteSignerUrl: string, feeRecipient: AztecAddress): Promise<void>;
8
+ export declare function createKeyFile4(fileName: string, validator1Address: EthAddress, validator2Address: EthAddress, publisher1Index: number, publisher2Key: EthPrivateKey, mnemonic: string, publisher3Key: EthPrivateKey, coinbase1: EthAddress, coinbase2: EthAddress, remoteSignerUrl: string, feeRecipient1: AztecAddress, feeRecipient2: AztecAddress): Promise<void>;
9
+ export declare function createKeyFile5(fileName: string, proverAddress: EthAddress, remoteSignerUrl: string): Promise<void>;
10
+ export declare function createKeyFile6(fileName: string, mnemonic: string, validator1Index: number, coinbase: EthAddress, feeRecipient: AztecAddress): Promise<void>;
11
+ export declare function addressForPrivateKey(privateKey: EthPrivateKey): EthAddress;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfdmFsaWRhdG9yX2tleXN0b3JlX3V0aWxzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9zZWQvd2ViM3NpZ25lci9tdWx0aV92YWxpZGF0b3Jfa2V5c3RvcmVfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVcxRCx3QkFBZ0IsbUJBQW1CLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLHNHQTBFcEc7QUFHRCx3QkFBc0IsY0FBYyxDQUNsQyxRQUFRLEVBQUUsTUFBTSxFQUNoQixRQUFRLEVBQUUsTUFBTSxFQUNoQixjQUFjLEVBQUUsTUFBTSxFQUN0QixhQUFhLEVBQUUsYUFBYSxFQUM1QixhQUFhLEVBQUUsYUFBYSxFQUM1QixRQUFRLEVBQUUsVUFBVSxFQUNwQixZQUFZLEVBQUUsWUFBWSxpQkFtQjNCO0FBRUQsd0JBQXNCLGNBQWMsQ0FDbEMsUUFBUSxFQUFFLE1BQU0sRUFDaEIsWUFBWSxFQUFFLGFBQWEsRUFDM0IsaUJBQWlCLEVBQUUsTUFBTSxFQUN6QixlQUFlLEVBQUUsTUFBTSxFQUN2QixRQUFRLEVBQUUsVUFBVSxFQUNwQixZQUFZLEVBQUUsWUFBWSxpQkFtQjNCO0FBRUQsd0JBQXNCLGNBQWMsQ0FDbEMsUUFBUSxFQUFFLE1BQU0sRUFDaEIsZ0JBQWdCLEVBQUUsVUFBVSxFQUM1QixhQUFhLEVBQUUsYUFBYSxFQUM1QixhQUFhLEVBQUUsYUFBYSxFQUM1QixRQUFRLEVBQUUsVUFBVSxFQUNwQixlQUFlLEVBQUUsTUFBTSxFQUN2QixZQUFZLEVBQUUsWUFBWSxpQkFpQjNCO0FBRUQsd0JBQXNCLGNBQWMsQ0FDbEMsUUFBUSxFQUFFLE1BQU0sRUFDaEIsaUJBQWlCLEVBQUUsVUFBVSxFQUM3QixpQkFBaUIsRUFBRSxVQUFVLEVBQzdCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFNBQVMsRUFBRSxVQUFVLEVBQ3JCLFNBQVMsRUFBRSxVQUFVLEVBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLGFBQWEsRUFBRSxZQUFZLEVBQzNCLGFBQWEsRUFBRSxZQUFZLGlCQTRCNUI7QUFFRCx3QkFBc0IsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFjeEc7QUFFRCx3QkFBc0IsY0FBYyxDQUNsQyxRQUFRLEVBQUUsTUFBTSxFQUNoQixRQUFRLEVBQUUsTUFBTSxFQUNoQixlQUFlLEVBQUUsTUFBTSxFQUN2QixRQUFRLEVBQUUsVUFBVSxFQUNwQixZQUFZLEVBQUUsWUFBWSxpQkFrQjNCO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxhQUFhLEdBQUcsVUFBVSxDQUUxRSJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi_validator_keystore_utils.d.ts","sourceRoot":"","sources":["../../../src/composed/web3signer/multi_validator_keystore_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,sGA0EpG;AAGD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAmB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,aAAa,EAC3B,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAmB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,UAAU,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,UAAU,EACpB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,YAAY,iBAiB3B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,UAAU,EAC7B,iBAAiB,EAAE,UAAU,EAC7B,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,EACrB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,YAAY,EAC3B,aAAa,EAAE,YAAY,iBA4B5B;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAcxG;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,UAAU,EACpB,YAAY,EAAE,YAAY,iBAkB3B;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,CAE1E"}
@@ -1,6 +1,5 @@
1
1
  import { type InitialAccountData } from '@aztec/accounts/testing';
2
2
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
3
- import { type Logger } from '@aztec/aztec.js/log';
4
3
  import type { AztecNode } from '@aztec/aztec.js/node';
5
4
  import { CheatCodes } from '@aztec/aztec/testing';
6
5
  import type { ClientProtocolCircuitVerifier } from '@aztec/bb-prover';
@@ -9,19 +8,23 @@ import { TokenContract } from '@aztec/noir-contracts.js/Token';
9
8
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
10
9
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
11
10
  import { TokenSimulator } from '../simulators/token_simulator.js';
11
+ import { SingleNodeTestContext, type SingleNodeTestOpts } from '../single-node/single_node_test_context.js';
12
12
  import { TestWallet } from '../test-wallet/test_wallet.js';
13
- import { type EndToEndContext, type SetupOptions } from './setup.js';
14
13
  /**
15
14
  * Largely taken from the e2e_token_contract test file. We deploy 2 accounts and a token contract.
16
15
  * However, we then setup a second PXE with a full prover instance.
17
16
  * We configure this instance with all of the accounts and contracts.
18
17
  * We then prove and verify transactions created via this full prover PXE.
18
+ *
19
+ * The real-prover sub-base of the single-node topology: extends {@link SingleNodeTestContext} so it
20
+ * reuses the base node tracking / chain monitor / teardown machinery, but builds its environment with
21
+ * the bespoke prover opts below (real BB, `realVerifier` L1, the snapshot/account + TokenSimulator
22
+ * harness, and a hand-built prover node) rather than the base's default fake-prover config.
19
23
  */
20
- export declare class FullProverTest {
24
+ export declare class FullProverTest extends SingleNodeTestContext {
21
25
  static TOKEN_NAME: string;
22
26
  static TOKEN_SYMBOL: string;
23
27
  static TOKEN_DECIMALS: bigint;
24
- logger: Logger;
25
28
  wallet: TestWallet;
26
29
  provenWallet: TestWallet;
27
30
  accounts: AztecAddress[];
@@ -38,19 +41,19 @@ export declare class FullProverTest {
38
41
  /** Returns the proof verifier from the prover node (for test assertions). */
39
42
  get circuitProofVerifier(): ClientProtocolCircuitVerifier | undefined;
40
43
  provenAsset: TokenContract;
41
- context: EndToEndContext;
42
44
  private proverAztecNode;
43
45
  private simulatedProverAztecNode;
44
46
  l1Contracts: DeployAztecL1ContractsReturnType;
45
47
  proverAddress: EthAddress;
48
+ private testName;
46
49
  private minNumberOfTxsPerBlock;
47
50
  private coinbase;
48
51
  private realProofs;
49
52
  constructor(testName: string, minNumberOfTxsPerBlock: number, coinbase: EthAddress, realProofs?: boolean);
50
53
  private applyBaseSetup;
51
- setup(opts?: Partial<SetupOptions>): Promise<this>;
54
+ setup(opts?: SingleNodeTestOpts): Promise<void>;
52
55
  private mintFeeJuice;
53
56
  teardown(): Promise<void>;
54
57
  private applyMint;
55
58
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlX3Byb3Zlcl90ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZml4dHVyZXMvZTJlX3Byb3Zlcl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUEyQixNQUFNLHlCQUF5QixDQUFDO0FBRTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXRFLE9BQU8sS0FBSyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFJbEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFNdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUczRCxPQUFPLEVBQ0wsS0FBSyxlQUFlLEVBQ3BCLEtBQUssWUFBWSxFQU1sQixNQUFNLFlBQVksQ0FBQztBQU9wQjs7Ozs7R0FLRztBQUVILHFCQUFhLGNBQWM7SUFDekIsTUFBTSxDQUFDLFVBQVUsU0FBVTtJQUMzQixNQUFNLENBQUMsWUFBWSxTQUFTO0lBQzVCLE1BQU0sQ0FBQyxjQUFjLFNBQU87SUFDNUIsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLE1BQU0sRUFBRyxVQUFVLENBQUM7SUFDcEIsWUFBWSxFQUFHLFVBQVUsQ0FBQztJQUMxQixRQUFRLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDOUIsY0FBYyxFQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDdEMsZUFBZSxFQUFHLGFBQWEsQ0FBQztJQUNoQyx1QkFBdUIsRUFBRywyQkFBMkIsQ0FBQztJQUN0RCxRQUFRLEVBQUcsY0FBYyxDQUFDO0lBQzFCLFNBQVMsRUFBRyxTQUFTLENBQUM7SUFDdEIsY0FBYyxFQUFHLGNBQWMsQ0FBQztJQUNoQyxVQUFVLEVBQUcsVUFBVSxDQUFDO0lBQ3hCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBcUI7SUFDN0MsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBc0I7SUFDaEQsNkVBQTZFO0lBQzdFLElBQUksb0JBQW9CLElBQUksNkJBQTZCLEdBQUcsU0FBUyxDQUVwRTtJQUNELFdBQVcsRUFBRyxhQUFhLENBQUM7SUFDNUIsT0FBTyxFQUFHLGVBQWUsQ0FBQztJQUMxQixPQUFPLENBQUMsZUFBZSxDQUFvQjtJQUMzQyxPQUFPLENBQUMsd0JBQXdCLENBQW9CO0lBQzdDLFdBQVcsRUFBRyxnQ0FBZ0MsQ0FBQztJQUMvQyxhQUFhLEVBQUcsVUFBVSxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBUztJQUN2QyxPQUFPLENBQUMsUUFBUSxDQUFhO0lBQzdCLE9BQU8sQ0FBQyxVQUFVLENBQVU7SUFFNUIsWUFBWSxRQUFRLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsVUFBTyxFQUtwRztZQUthLGNBQWM7SUE4QnRCLEtBQUssQ0FBQyxJQUFJLEdBQUUsT0FBTyxDQUFDLFlBQVksQ0FBTSxpQkE2STNDO1lBRWEsWUFBWTtJQVNwQixRQUFRLGtCQWNiO1lBRWEsU0FBUztDQXNDeEIifQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTJlX3Byb3Zlcl90ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZml4dHVyZXMvZTJlX3Byb3Zlcl90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUEyQixNQUFNLHlCQUF5QixDQUFDO0FBRTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEUsT0FBTyxLQUFLLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUlsRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU10RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFXM0Q7Ozs7Ozs7Ozs7R0FVRztBQUVILHFCQUFhLGNBQWUsU0FBUSxxQkFBcUI7SUFDdkQsTUFBTSxDQUFDLFVBQVUsU0FBVTtJQUMzQixNQUFNLENBQUMsWUFBWSxTQUFTO0lBQzVCLE1BQU0sQ0FBQyxjQUFjLFNBQU87SUFDNUIsTUFBTSxFQUFHLFVBQVUsQ0FBQztJQUNwQixZQUFZLEVBQUcsVUFBVSxDQUFDO0lBQzFCLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBTTtJQUM5QixjQUFjLEVBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUN0QyxlQUFlLEVBQUcsYUFBYSxDQUFDO0lBQ2hDLHVCQUF1QixFQUFHLDJCQUEyQixDQUFDO0lBQ3RELFFBQVEsRUFBRyxjQUFjLENBQUM7SUFDMUIsU0FBUyxFQUFHLFNBQVMsQ0FBQztJQUN0QixjQUFjLEVBQUcsY0FBYyxDQUFDO0lBQ2hDLFVBQVUsRUFBRyxVQUFVLENBQUM7SUFDeEIsT0FBTyxDQUFDLGdCQUFnQixDQUFxQjtJQUM3QyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQXNCO0lBQzlDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFzQjtJQUNoRCw2RUFBNkU7SUFDN0UsSUFBSSxvQkFBb0IsSUFBSSw2QkFBNkIsR0FBRyxTQUFTLENBRXBFO0lBQ0QsV0FBVyxFQUFHLGFBQWEsQ0FBQztJQUM1QixPQUFPLENBQUMsZUFBZSxDQUFvQjtJQUMzQyxPQUFPLENBQUMsd0JBQXdCLENBQW9CO0lBQzdDLFdBQVcsRUFBRyxnQ0FBZ0MsQ0FBQztJQUMvQyxhQUFhLEVBQUcsVUFBVSxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxRQUFRLENBQVM7SUFDekIsT0FBTyxDQUFDLHNCQUFzQixDQUFTO0lBQ3ZDLE9BQU8sQ0FBQyxRQUFRLENBQWE7SUFDN0IsT0FBTyxDQUFDLFVBQVUsQ0FBVTtJQUU1QixZQUFZLFFBQVEsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxVQUFPLEVBT3BHO1lBS2EsY0FBYztJQThCYixLQUFLLENBQUMsSUFBSSxHQUFFLGtCQUF1QixpQkE0SmpEO1lBRWEsWUFBWTtJQVNYLFFBQVEsa0JBZ0J0QjtZQUVhLFNBQVM7Q0FzQ3hCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"e2e_prover_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/e2e_prover_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2B,MAAM,yBAAyB,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAIlG,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMtE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,YAAY,EAMlB,MAAM,YAAY,CAAC;AAOpB;;;;;GAKG;AAEH,qBAAa,cAAc;IACzB,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAG,UAAU,CAAC;IACpB,YAAY,EAAG,UAAU,CAAC;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,cAAc,EAAG,kBAAkB,EAAE,CAAC;IACtC,eAAe,EAAG,aAAa,CAAC;IAChC,uBAAuB,EAAG,2BAA2B,CAAC;IACtD,QAAQ,EAAG,cAAc,CAAC;IAC1B,SAAS,EAAG,SAAS,CAAC;IACtB,cAAc,EAAG,cAAc,CAAC;IAChC,UAAU,EAAG,UAAU,CAAC;IACxB,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,6EAA6E;IAC7E,IAAI,oBAAoB,IAAI,6BAA6B,GAAG,SAAS,CAEpE;IACD,WAAW,EAAG,aAAa,CAAC;IAC5B,OAAO,EAAG,eAAe,CAAC;IAC1B,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,wBAAwB,CAAoB;IAC7C,WAAW,EAAG,gCAAgC,CAAC;IAC/C,aAAa,EAAG,UAAU,CAAC;IAClC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAU;IAE5B,YAAY,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,UAAO,EAKpG;YAKa,cAAc;IA8BtB,KAAK,CAAC,IAAI,GAAE,OAAO,CAAC,YAAY,CAAM,iBA6I3C;YAEa,YAAY;IASpB,QAAQ,kBAcb;YAEa,SAAS;CAsCxB"}
1
+ {"version":3,"file":"e2e_prover_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/e2e_prover_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2B,MAAM,yBAAyB,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAIlG,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAMtE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAC5G,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAW3D;;;;;;;;;;GAUG;AAEH,qBAAa,cAAe,SAAQ,qBAAqB;IACvD,MAAM,CAAC,UAAU,SAAU;IAC3B,MAAM,CAAC,YAAY,SAAS;IAC5B,MAAM,CAAC,cAAc,SAAO;IAC5B,MAAM,EAAG,UAAU,CAAC;IACpB,YAAY,EAAG,UAAU,CAAC;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,cAAc,EAAG,kBAAkB,EAAE,CAAC;IACtC,eAAe,EAAG,aAAa,CAAC;IAChC,uBAAuB,EAAG,2BAA2B,CAAC;IACtD,QAAQ,EAAG,cAAc,CAAC;IAC1B,SAAS,EAAG,SAAS,CAAC;IACtB,cAAc,EAAG,cAAc,CAAC;IAChC,UAAU,EAAG,UAAU,CAAC;IACxB,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,6EAA6E;IAC7E,IAAI,oBAAoB,IAAI,6BAA6B,GAAG,SAAS,CAEpE;IACD,WAAW,EAAG,aAAa,CAAC;IAC5B,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,wBAAwB,CAAoB;IAC7C,WAAW,EAAG,gCAAgC,CAAC;IAC/C,aAAa,EAAG,UAAU,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,UAAU,CAAU;IAE5B,YAAY,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,UAAO,EAOpG;YAKa,cAAc;IA8Bb,KAAK,CAAC,IAAI,GAAE,kBAAuB,iBA4JjD;YAEa,YAAY;IASX,QAAQ,kBAgBtB;YAEa,SAAS;CAsCxB"}
@@ -1,5 +1,5 @@
1
1
  import { generateSchnorrAccounts } from '@aztec/accounts/testing';
2
- import { AztecNodeService } from '@aztec/aztec-node';
2
+ import { createAztecNodeService } from '@aztec/aztec-node';
3
3
  import { EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { createLogger } from '@aztec/aztec.js/log';
5
5
  import { BackendType, Barretenberg } from '@aztec/bb.js';
@@ -11,19 +11,25 @@ import { getGenesisValues } from '@aztec/world-state/testing';
11
11
  import { getContract } from 'viem';
12
12
  import { privateKeyToAddress } from 'viem/accounts';
13
13
  import { TokenSimulator } from '../simulators/token_simulator.js';
14
+ import { SingleNodeTestContext } from '../single-node/single_node_test_context.js';
14
15
  import { getACVMConfig } from './get_acvm_config.js';
15
16
  import { getBBConfig } from './get_bb_config.js';
16
- import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWallet, teardown } from './setup.js';
17
+ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWallet } from './setup.js';
18
+ import { getStandardContractGenesisNullifiers } from './standard_contracts_genesis.js';
17
19
  /**
18
20
  * Largely taken from the e2e_token_contract test file. We deploy 2 accounts and a token contract.
19
21
  * However, we then setup a second PXE with a full prover instance.
20
22
  * We configure this instance with all of the accounts and contracts.
21
23
  * We then prove and verify transactions created via this full prover PXE.
22
- */ export class FullProverTest {
24
+ *
25
+ * The real-prover sub-base of the single-node topology: extends {@link SingleNodeTestContext} so it
26
+ * reuses the base node tracking / chain monitor / teardown machinery, but builds its environment with
27
+ * the bespoke prover opts below (real BB, `realVerifier` L1, the snapshot/account + TokenSimulator
28
+ * harness, and a hand-built prover node) rather than the base's default fake-prover config.
29
+ */ export class FullProverTest extends SingleNodeTestContext {
23
30
  static TOKEN_NAME = 'USDC';
24
31
  static TOKEN_SYMBOL = 'USD';
25
32
  static TOKEN_DECIMALS = 18n;
26
- logger;
27
33
  wallet;
28
34
  provenWallet;
29
35
  accounts = [];
@@ -41,15 +47,17 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
41
47
  return this.proverAztecNode?.getProofVerifier();
42
48
  }
43
49
  provenAsset;
44
- context;
45
50
  proverAztecNode;
46
51
  simulatedProverAztecNode;
47
52
  l1Contracts;
48
53
  proverAddress;
54
+ testName;
49
55
  minNumberOfTxsPerBlock;
50
56
  coinbase;
51
57
  realProofs;
52
58
  constructor(testName, minNumberOfTxsPerBlock, coinbase, realProofs = true){
59
+ super();
60
+ this.testName = testName;
53
61
  this.logger = createLogger(`e2e:full_prover_test:${testName}`);
54
62
  this.minNumberOfTxsPerBlock = minNumberOfTxsPerBlock;
55
63
  this.coinbase = coinbase;
@@ -80,7 +88,7 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
80
88
  }
81
89
  async setup(opts = {}) {
82
90
  this.logger.info('Setting up subsystems from fresh');
83
- this.context = await setup(0, {
91
+ const context = await setup(0, {
84
92
  ...opts,
85
93
  startProverNode: true,
86
94
  coinbase: this.coinbase,
@@ -90,6 +98,11 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
90
98
  realVerifier: this.realProofs
91
99
  }
92
100
  });
101
+ // Reuse the base context machinery (rollup, epoch cache, chain monitor, node tracking, teardown)
102
+ // over the environment built above. Restore the FullProverTest-named logger afterwards, since
103
+ // hydrateFromContext repoints `this.logger` at the context logger.
104
+ await this.hydrateFromContext(context);
105
+ this.logger = createLogger(`e2e:full_prover_test:${this.testName}`);
93
106
  await this.applyBaseSetup();
94
107
  await this.applyMint();
95
108
  this.logger.info(`Enabling proving`, {
@@ -131,7 +144,7 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
131
144
  this.logger.verbose(`Marking current block as proven`);
132
145
  await this.context.cheatCodes.rollup.markAsProven();
133
146
  this.logger.verbose(`Main setup completed, initializing full prover PXE, Node, and Prover Node`);
134
- const { wallet: provenWallet, teardown: provenTeardown } = await setupPXEAndGetWallet(this.aztecNode, {
147
+ const { wallet: provenWallet, teardown: provenTeardown } = await setupPXEAndGetWallet(this.aztecNode, this.context.aztecNode, {
135
148
  proverEnabled: this.realProofs
136
149
  }, undefined, 'pxe-proven');
137
150
  this.logger.debug(`Contract address ${this.fakeProofsAsset.address}`);
@@ -139,8 +152,8 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
139
152
  for(let i = 0; i < 2; i++){
140
153
  // Mirror the initializerless funded accounts (created via createFundedAccounts) in both wallets so
141
154
  // their addresses match the genesis-funded ones.
142
- await provenWallet.createSchnorrInitializerlessAccount(this.fundedAccounts[i].secret, this.fundedAccounts[i].salt);
143
- await this.wallet.createSchnorrInitializerlessAccount(this.fundedAccounts[i].secret, this.fundedAccounts[i].salt);
155
+ await provenWallet.createSchnorrInitializerlessAccount(this.fundedAccounts[i].secret, this.fundedAccounts[i].salt, this.fundedAccounts[i].signingKey);
156
+ await this.wallet.createSchnorrInitializerlessAccount(this.fundedAccounts[i].secret, this.fundedAccounts[i].salt, this.fundedAccounts[i].signingKey);
144
157
  }
145
158
  const asset = TokenContract.at(this.fakeProofsAsset.address, provenWallet);
146
159
  this.provenComponents.push({
@@ -162,7 +175,7 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
162
175
  await this.mintFeeJuice(proverNodeSenderAddress);
163
176
  this.logger.verbose('Starting prover node');
164
177
  const sponsoredFPCAddress = await getSponsoredFPCAddress();
165
- const { genesis } = await getGenesisValues(this.context.additionallyFundedAccounts.map((a)=>a.address).concat(sponsoredFPCAddress), undefined, undefined, this.context.genesis.genesisTimestamp);
178
+ const { genesis } = await getGenesisValues(this.context.additionallyFundedAccounts.map((a)=>a.address).concat(sponsoredFPCAddress), undefined, undefined, this.context.genesis.genesisTimestamp, await getStandardContractGenesisNullifiers());
166
179
  const proverNodeConfig = {
167
180
  ...config,
168
181
  enableProverNode: true,
@@ -189,7 +202,7 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
189
202
  proverNodeEpochProvingDelayMs: undefined,
190
203
  validatorPrivateKeys: new SecretValue([])
191
204
  };
192
- this.proverAztecNode = await AztecNodeService.createAndSync(proverNodeConfig, {
205
+ this.proverAztecNode = await createAztecNodeService(proverNodeConfig, {
193
206
  dateProvider: this.context.dateProvider,
194
207
  p2pClientDeps: {
195
208
  rpcTxProviders: [
@@ -199,10 +212,14 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
199
212
  }, {
200
213
  genesis
201
214
  });
215
+ // Track the real prover node so the base teardown stops it (the simulated one created by `setup`
216
+ // was already stopped above).
217
+ this.proverNodes = [
218
+ this.proverAztecNode
219
+ ];
202
220
  this.logger.warn(`Proofs are now enabled`, {
203
221
  realProofs: this.realProofs
204
222
  });
205
- return this;
206
223
  }
207
224
  async mintFeeJuice(recipient) {
208
225
  const handlerAddress = this.context.deployL1ContractsValues.l1ContractAddresses.feeAssetHandlerAddress;
@@ -225,12 +242,14 @@ import { getPrivateKeyFromIndex, getSponsoredFPCAddress, setup, setupPXEAndGetWa
225
242
  for(let i = 0; i < this.provenComponents.length; i++){
226
243
  await this.provenComponents[i].teardown();
227
244
  }
228
- // clean up the full prover node (by stopping its hosting aztec node)
245
+ // Stop the prover node before destroying the BB singleton it proves with.
229
246
  await this.proverAztecNode.stop();
230
247
  await Barretenberg.destroySingleton();
231
248
  await this.bbConfigCleanup?.();
232
249
  await this.acvmConfigCleanup?.();
233
- await teardown(this.context);
250
+ // Stops the chain monitor, the tracked nodes (main node + the already-stopped prover node, a
251
+ // safe no-op), and the context.
252
+ await super.teardown();
234
253
  }
235
254
  async applyMint() {
236
255
  this.logger.info('Applying mint setup');