@aztec/end-to-end 0.0.1-commit.9d2bcf6d → 0.0.1-commit.9ee6fcc6

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 (183) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +19 -11
  4. package/dest/bench/client_flows/config.d.ts +2 -2
  5. package/dest/bench/client_flows/config.d.ts.map +1 -1
  6. package/dest/bench/client_flows/config.js +18 -0
  7. package/dest/bench/utils.d.ts +1 -1
  8. package/dest/bench/utils.d.ts.map +1 -1
  9. package/dest/bench/utils.js +6 -3
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +22 -12
  13. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
  16. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  18. package/dest/e2e_epochs/epochs_test.d.ts +11 -7
  19. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  20. package/dest/e2e_epochs/epochs_test.js +62 -34
  21. package/dest/e2e_fees/fees_test.d.ts +2 -2
  22. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  23. package/dest/e2e_fees/fees_test.js +18 -11
  24. package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
  25. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  26. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  27. package/dest/e2e_p2p/p2p_network.d.ts +5 -4
  28. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  29. package/dest/e2e_p2p/p2p_network.js +24 -7
  30. package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
  31. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  32. package/dest/e2e_p2p/reqresp/utils.js +45 -8
  33. package/dest/e2e_p2p/shared.d.ts +22 -2
  34. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  35. package/dest/e2e_p2p/shared.js +38 -3
  36. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  37. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  38. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  39. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  40. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  42. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  43. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  44. package/dest/e2e_token_contract/token_contract_test.js +19 -9
  45. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  46. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  47. package/dest/fixtures/authwit_proxy.js +30 -0
  48. package/dest/fixtures/e2e_prover_test.d.ts +7 -6
  49. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  50. package/dest/fixtures/e2e_prover_test.js +36 -45
  51. package/dest/fixtures/elu_monitor.d.ts +21 -0
  52. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  53. package/dest/fixtures/elu_monitor.js +102 -0
  54. package/dest/fixtures/fixtures.d.ts +5 -1
  55. package/dest/fixtures/fixtures.d.ts.map +1 -1
  56. package/dest/fixtures/fixtures.js +6 -0
  57. package/dest/fixtures/get_bb_config.d.ts +1 -1
  58. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  59. package/dest/fixtures/get_bb_config.js +5 -5
  60. package/dest/fixtures/ha_setup.d.ts +1 -1
  61. package/dest/fixtures/ha_setup.d.ts.map +1 -1
  62. package/dest/fixtures/ha_setup.js +3 -1
  63. package/dest/fixtures/setup.d.ts +44 -23
  64. package/dest/fixtures/setup.d.ts.map +1 -1
  65. package/dest/fixtures/setup.js +67 -154
  66. package/dest/fixtures/setup_p2p_test.d.ts +15 -7
  67. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  68. package/dest/fixtures/setup_p2p_test.js +18 -12
  69. package/dest/fixtures/token_utils.d.ts +2 -2
  70. package/dest/fixtures/token_utils.d.ts.map +1 -1
  71. package/dest/fixtures/token_utils.js +5 -4
  72. package/dest/shared/cross_chain_test_harness.d.ts +1 -1
  73. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  74. package/dest/shared/cross_chain_test_harness.js +13 -13
  75. package/dest/shared/gas_portal_test_harness.js +2 -2
  76. package/dest/shared/index.d.ts +2 -1
  77. package/dest/shared/index.d.ts.map +1 -1
  78. package/dest/shared/index.js +1 -0
  79. package/dest/shared/jest_setup.js +41 -1
  80. package/dest/shared/mock_state_view.d.ts +86 -0
  81. package/dest/shared/mock_state_view.d.ts.map +1 -0
  82. package/dest/shared/mock_state_view.js +186 -0
  83. package/dest/shared/submit-transactions.d.ts +2 -2
  84. package/dest/shared/submit-transactions.d.ts.map +1 -1
  85. package/dest/shared/submit-transactions.js +1 -1
  86. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  87. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  88. package/dest/shared/uniswap_l1_l2.js +16 -17
  89. package/dest/simulators/lending_simulator.d.ts +1 -1
  90. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  91. package/dest/simulators/lending_simulator.js +4 -4
  92. package/dest/simulators/token_simulator.d.ts +1 -1
  93. package/dest/simulators/token_simulator.d.ts.map +1 -1
  94. package/dest/simulators/token_simulator.js +3 -24
  95. package/dest/spartan/setup_test_wallets.d.ts +12 -3
  96. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  97. package/dest/spartan/setup_test_wallets.js +54 -11
  98. package/dest/spartan/tx_metrics.js +1 -1
  99. package/dest/spartan/utils/bot.d.ts +3 -2
  100. package/dest/spartan/utils/bot.d.ts.map +1 -1
  101. package/dest/spartan/utils/bot.js +2 -1
  102. package/dest/spartan/utils/config.d.ts +7 -1
  103. package/dest/spartan/utils/config.d.ts.map +1 -1
  104. package/dest/spartan/utils/config.js +3 -1
  105. package/dest/spartan/utils/index.d.ts +4 -2
  106. package/dest/spartan/utils/index.d.ts.map +1 -1
  107. package/dest/spartan/utils/index.js +5 -1
  108. package/dest/spartan/utils/k8s.d.ts +3 -1
  109. package/dest/spartan/utils/k8s.d.ts.map +1 -1
  110. package/dest/spartan/utils/k8s.js +6 -0
  111. package/dest/spartan/utils/nodes.d.ts +4 -5
  112. package/dest/spartan/utils/nodes.d.ts.map +1 -1
  113. package/dest/spartan/utils/nodes.js +9 -9
  114. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  115. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  116. package/dest/spartan/utils/pod_logs.js +74 -0
  117. package/dest/test-wallet/test_wallet.d.ts +76 -0
  118. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  119. package/dest/test-wallet/test_wallet.js +214 -0
  120. package/dest/test-wallet/utils.d.ts +41 -0
  121. package/dest/test-wallet/utils.d.ts.map +1 -0
  122. package/dest/test-wallet/utils.js +71 -0
  123. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  124. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  125. package/dest/test-wallet/wallet_worker_script.js +48 -0
  126. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  127. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  128. package/dest/test-wallet/worker_wallet.js +151 -0
  129. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  130. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  131. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  132. package/package.json +42 -43
  133. package/src/bench/client_flows/client_flows_benchmark.ts +42 -38
  134. package/src/bench/client_flows/config.ts +9 -1
  135. package/src/bench/utils.ts +8 -3
  136. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +28 -15
  137. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
  138. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  139. package/src/e2e_epochs/epochs_test.ts +83 -61
  140. package/src/e2e_fees/bridging_race.notest.ts +1 -1
  141. package/src/e2e_fees/fees_test.ts +20 -28
  142. package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
  143. package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
  144. package/src/e2e_p2p/p2p_network.ts +36 -10
  145. package/src/e2e_p2p/reqresp/utils.ts +61 -12
  146. package/src/e2e_p2p/shared.ts +58 -3
  147. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  148. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  149. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  150. package/src/e2e_token_contract/token_contract_test.ts +26 -9
  151. package/src/fixtures/authwit_proxy.ts +50 -0
  152. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  153. package/src/fixtures/e2e_prover_test.ts +44 -54
  154. package/src/fixtures/elu_monitor.ts +126 -0
  155. package/src/fixtures/fixtures.ts +10 -0
  156. package/src/fixtures/get_bb_config.ts +7 -6
  157. package/src/fixtures/ha_setup.ts +3 -1
  158. package/src/fixtures/setup.ts +104 -216
  159. package/src/fixtures/setup_p2p_test.ts +25 -24
  160. package/src/fixtures/token_utils.ts +6 -3
  161. package/src/guides/up_quick_start.sh +3 -3
  162. package/src/shared/cross_chain_test_harness.ts +13 -9
  163. package/src/shared/gas_portal_test_harness.ts +1 -1
  164. package/src/shared/index.ts +1 -0
  165. package/src/shared/jest_setup.ts +51 -1
  166. package/src/shared/mock_state_view.ts +188 -0
  167. package/src/shared/submit-transactions.ts +3 -2
  168. package/src/shared/uniswap_l1_l2.ts +38 -33
  169. package/src/simulators/lending_simulator.ts +8 -4
  170. package/src/simulators/token_simulator.ts +6 -30
  171. package/src/spartan/setup_test_wallets.ts +102 -17
  172. package/src/spartan/tx_metrics.ts +1 -1
  173. package/src/spartan/utils/bot.ts +4 -1
  174. package/src/spartan/utils/config.ts +2 -0
  175. package/src/spartan/utils/index.ts +7 -0
  176. package/src/spartan/utils/k8s.ts +8 -0
  177. package/src/spartan/utils/nodes.ts +15 -10
  178. package/src/spartan/utils/pod_logs.ts +99 -0
  179. package/src/test-wallet/test_wallet.ts +294 -0
  180. package/src/test-wallet/utils.ts +112 -0
  181. package/src/test-wallet/wallet_worker_script.ts +60 -0
  182. package/src/test-wallet/worker_wallet.ts +213 -0
  183. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1,6 +1,5 @@
1
1
  import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
- import { type InitialAccountData, generateSchnorrAccounts, getInitialTestAccountsData } from '@aztec/accounts/testing';
3
- import { type Archiver, createArchiver } from '@aztec/archiver';
2
+ import { type InitialAccountData, generateSchnorrAccounts } from '@aztec/accounts/testing';
4
3
  import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
5
4
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
6
5
  import {
@@ -13,10 +12,9 @@ import {
13
12
  import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
14
13
  import { Fr } from '@aztec/aztec.js/fields';
15
14
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
16
- import { type AztecNode, createAztecNodeClient, waitForNode } from '@aztec/aztec.js/node';
15
+ import type { AztecNode } from '@aztec/aztec.js/node';
17
16
  import type { Wallet } from '@aztec/aztec.js/wallet';
18
17
  import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
19
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
20
18
  import { SPONSORED_FPC_SALT } from '@aztec/constants';
21
19
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
22
20
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -30,13 +28,9 @@ import {
30
28
  type ZKPassportArgs,
31
29
  deployAztecL1Contracts,
32
30
  } from '@aztec/ethereum/deploy-aztec-l1-contracts';
33
- import {
34
- DelayedTxUtils,
35
- EthCheatCodes,
36
- EthCheatCodesWithState,
37
- createDelayedL1TxUtilsFromViemWallet,
38
- startAnvil,
39
- } from '@aztec/ethereum/test';
31
+ import type { Delayer } from '@aztec/ethereum/l1-tx-utils';
32
+ import { EthCheatCodes, EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
33
+ import type { Anvil } from '@aztec/ethereum/test';
40
34
  import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
41
35
  import { SecretValue } from '@aztec/foundation/config';
42
36
  import { randomBytes } from '@aztec/foundation/crypto/random';
@@ -45,20 +39,17 @@ import { withLoggerBindings } from '@aztec/foundation/log/server';
45
39
  import { retryUntil } from '@aztec/foundation/retry';
46
40
  import { sleep } from '@aztec/foundation/sleep';
47
41
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
48
- import type { DataStoreConfig } from '@aztec/kv-store/config';
49
42
  import { SponsoredFPCContract } from '@aztec/noir-contracts.js/SponsoredFPC';
50
43
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
51
44
  import type { P2PClientDeps } from '@aztec/p2p';
52
45
  import { MockGossipSubNetwork, getMockPubSubP2PServiceFactory } from '@aztec/p2p/test-helpers';
53
46
  import { protocolContractsHash } from '@aztec/protocol-contracts';
54
- import { type ProverNode, type ProverNodeConfig, type ProverNodeDeps, createProverNode } from '@aztec/prover-node';
47
+ import type { ProverNodeConfig } from '@aztec/prover-node';
55
48
  import { type PXEConfig, getPXEConfig } from '@aztec/pxe/server';
56
49
  import type { SequencerClient } from '@aztec/sequencer-client';
57
- import type { TestSequencerClient } from '@aztec/sequencer-client/test';
58
50
  import { type ContractInstanceWithAddress, getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
59
51
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
60
52
  import { tryStop } from '@aztec/stdlib/interfaces/server';
61
- import type { P2PClientType } from '@aztec/stdlib/p2p';
62
53
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
63
54
  import {
64
55
  type TelemetryClient,
@@ -67,10 +58,9 @@ import {
67
58
  initTelemetryClient,
68
59
  } from '@aztec/telemetry-client';
69
60
  import { BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
70
- import { TestWallet, deployFundedSchnorrAccounts } from '@aztec/test-wallet/server';
61
+ import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
71
62
  import { getGenesisValues } from '@aztec/world-state/testing';
72
63
 
73
- import type { Anvil } from '@viem/anvil';
74
64
  import fs from 'fs/promises';
75
65
  import { tmpdir } from 'os';
76
66
  import path from 'path';
@@ -84,6 +74,7 @@ import {
84
74
  } from 'viem/accounts';
85
75
  import { type Chain, foundry } from 'viem/chains';
86
76
 
77
+ import { TestWallet } from '../test-wallet/test_wallet.js';
87
78
  import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
88
79
  import { getACVMConfig } from './get_acvm_config.js';
89
80
  import { getBBConfig } from './get_bb_config.js';
@@ -92,9 +83,6 @@ import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
92
83
 
93
84
  export { startAnvil };
94
85
 
95
- const { AZTEC_NODE_URL = '' } = process.env;
96
- const getAztecUrl = () => AZTEC_NODE_URL;
97
-
98
86
  let telemetry: TelemetryClient | undefined = undefined;
99
87
  async function getTelemetryClient(partialConfig: Partial<TelemetryClientConfig> & { benchmark?: boolean } = {}) {
100
88
  if (!telemetry) {
@@ -197,6 +185,11 @@ export type SetupOptions = {
197
185
  anvilAccounts?: number;
198
186
  /** Port to start anvil (defaults to 8545) */
199
187
  anvilPort?: number;
188
+ /**
189
+ * Number of slots per epoch for Anvil's finality simulation.
190
+ * Anvil reports `finalized = latest - slotsInAnEpoch * 2`.
191
+ */
192
+ anvilSlotsInAnEpoch?: number;
200
193
  /** Key to use for publishing L1 contracts */
201
194
  l1PublisherKey?: SecretValue<`0x${string}`>;
202
195
  /** ZkPassport configuration (domain, scope, mock verifier) */
@@ -217,13 +210,13 @@ export type EndToEndContext = {
217
210
  anvil: Anvil | undefined;
218
211
  /** The Aztec Node service or client a connected to it. */
219
212
  aztecNode: AztecNode;
220
- /** The Aztec Node as a service (only set if running locally). */
221
- aztecNodeService: AztecNodeService | undefined;
222
- /** Client to the Aztec Node admin interface (undefined if connected to remote environment) */
223
- aztecNodeAdmin: AztecNodeAdmin | undefined;
224
- /** The prover node service (only set if startProverNode is true) */
225
- proverNode: ProverNode | undefined;
226
- /** A client to the sequencer service (undefined if connected to remote environment) */
213
+ /** The Aztec Node as a service. */
214
+ aztecNodeService: AztecNodeService;
215
+ /** Client to the Aztec Node admin interface. */
216
+ aztecNodeAdmin: AztecNodeAdmin;
217
+ /** The aztec node running the prover node subsystem (only set if startProverNode is true). */
218
+ proverNode: AztecNodeService | undefined;
219
+ /** A client to the sequencer service. */
227
220
  sequencer: SequencerClient | undefined;
228
221
  /** Return values from deployAztecL1Contracts function. */
229
222
  deployL1ContractsValues: DeployAztecL1ContractsReturnType;
@@ -243,14 +236,18 @@ export type EndToEndContext = {
243
236
  cheatCodes: CheatCodes;
244
237
  /** The cheat codes for L1 */
245
238
  ethCheatCodes: EthCheatCodes;
246
- /** The anvil test watcher (undefined if connected to remote environment) */
247
- watcher: AnvilTestWatcher | undefined;
248
- /** Allows tweaking current system time, used by the epoch cache only (undefined if connected to remote environment) */
249
- dateProvider: TestDateProvider | undefined;
239
+ /** The anvil test watcher. */
240
+ watcher: AnvilTestWatcher;
241
+ /** Allows tweaking current system time, used by the epoch cache only. */
242
+ dateProvider: TestDateProvider;
250
243
  /** Telemetry client */
251
- telemetryClient: TelemetryClient | undefined;
244
+ telemetryClient: TelemetryClient;
252
245
  /** Mock gossip sub network used for gossipping messages (only if mockGossipSubNetwork was set to true in opts) */
253
246
  mockGossipSubNetwork: MockGossipSubNetwork | undefined;
247
+ /** Delayer for sequencer L1 txs (only when enableDelayer is true). */
248
+ sequencerDelayer: Delayer | undefined;
249
+ /** Delayer for prover node L1 txs (only when enableDelayer and startProverNode are true). */
250
+ proverDelayer: Delayer | undefined;
254
251
  /** Prefilled public data used for setting up nodes. */
255
252
  prefilledPublicData: PublicDataTreeLeaf[] | undefined;
256
253
  /** ACVM config (only set if running locally). */
@@ -258,87 +255,11 @@ export type EndToEndContext = {
258
255
  /** BB config (only set if running locally). */
259
256
  bbConfig: Awaited<ReturnType<typeof getBBConfig>>;
260
257
  /** Directory to cleanup on teardown. */
261
- directoryToCleanup: string | undefined;
258
+ directoryToCleanup: string;
262
259
  /** Function to stop the started services. */
263
260
  teardown: () => Promise<void>;
264
261
  };
265
262
 
266
- /**
267
- * Function to setup the test against a remote deployment. It is assumed that L1 contract are already deployed
268
- */
269
- async function setupWithRemoteEnvironment(
270
- account: HDAccount | PrivateKeyAccount,
271
- config: AztecNodeConfig & SetupOptions,
272
- logger: Logger,
273
- numberOfAccounts: number,
274
- ): Promise<EndToEndContext> {
275
- const aztecNodeUrl = getAztecUrl();
276
- logger.verbose(`Creating Aztec Node client to remote host ${aztecNodeUrl}`);
277
- const aztecNode = createAztecNodeClient(aztecNodeUrl);
278
- await waitForNode(aztecNode, logger);
279
- logger.verbose('JSON RPC client connected to Aztec Node');
280
- logger.verbose(`Retrieving contract addresses from ${aztecNodeUrl}`);
281
- const { l1ContractAddresses, rollupVersion } = await aztecNode.getNodeInfo();
282
-
283
- const l1Client = createExtendedL1Client(config.l1RpcUrls, account, foundry);
284
-
285
- const deployL1ContractsValues: DeployAztecL1ContractsReturnType = {
286
- l1ContractAddresses,
287
- l1Client,
288
- rollupVersion,
289
- };
290
- const ethCheatCodes = new EthCheatCodes(config.l1RpcUrls, new DateProvider());
291
- const wallet = await TestWallet.create(aztecNode);
292
-
293
- if (config.walletMinFeePadding !== undefined) {
294
- wallet.setMinFeePadding(config.walletMinFeePadding);
295
- }
296
-
297
- const cheatCodes = await CheatCodes.create(config.l1RpcUrls, aztecNode, new DateProvider());
298
- const teardown = () => Promise.resolve();
299
-
300
- logger.verbose('Populating wallet from already registered accounts...');
301
- const initialFundedAccounts = await getInitialTestAccountsData();
302
-
303
- if (initialFundedAccounts.length < numberOfAccounts) {
304
- throw new Error(`Required ${numberOfAccounts} accounts. Found ${initialFundedAccounts.length}.`);
305
- }
306
-
307
- const testAccounts = await Promise.all(
308
- initialFundedAccounts.slice(0, numberOfAccounts).map(async account => {
309
- const accountManager = await wallet.createSchnorrAccount(account.secret, account.salt, account.signingKey);
310
- return accountManager.address;
311
- }),
312
- );
313
-
314
- return {
315
- anvil: undefined,
316
- aztecNode,
317
- aztecNodeService: undefined,
318
- aztecNodeAdmin: undefined,
319
- sequencer: undefined,
320
- proverNode: undefined,
321
- deployL1ContractsValues,
322
- config,
323
- aztecNodeConfig: config,
324
- initialFundedAccounts,
325
- wallet,
326
- accounts: testAccounts,
327
- logger,
328
- cheatCodes,
329
- ethCheatCodes,
330
- prefilledPublicData: undefined,
331
- mockGossipSubNetwork: undefined,
332
- watcher: undefined,
333
- dateProvider: undefined,
334
- telemetryClient: undefined,
335
- acvmConfig: undefined,
336
- bbConfig: undefined,
337
- directoryToCleanup: undefined,
338
- teardown,
339
- };
340
- }
341
-
342
263
  /**
343
264
  * Sets up the environment for the end-to-end tests.
344
265
  * @param numberOfAccounts - The number of new accounts to be created once the PXE is initiated.
@@ -366,8 +287,12 @@ export async function setup(
366
287
  config.realProofs = !!opts.realProofs;
367
288
  // Only enforce the time table if requested
368
289
  config.enforceTimeTable = !!opts.enforceTimeTable;
290
+ // Enable the tx delayer for tests (default config has it disabled, so we force-enable it here)
291
+ config.enableDelayer = true;
369
292
  config.listenAddress = '127.0.0.1';
370
293
 
294
+ config.minTxPoolAgeMs = opts.minTxPoolAgeMs ?? 0;
295
+
371
296
  const logger = getLogger();
372
297
 
373
298
  // Create a temp directory for any services that need it and cleanup later
@@ -377,20 +302,18 @@ export async function setup(
377
302
  config.dataDirectory = directoryToCleanup;
378
303
  }
379
304
 
305
+ const dateProvider = new TestDateProvider();
306
+
380
307
  if (!config.l1RpcUrls?.length) {
381
308
  if (!isAnvilTestChain(chain.id)) {
382
309
  throw new Error(`No ETHEREUM_HOSTS set but non anvil chain requested`);
383
310
  }
384
- if (AZTEC_NODE_URL) {
385
- throw new Error(
386
- `AZTEC_NODE_URL provided but no ETHEREUM_HOSTS set. Refusing to run, please set both variables so tests can deploy L1 contracts to the same Anvil instance`,
387
- );
388
- }
389
-
390
311
  const res = await startAnvil({
391
312
  l1BlockTime: opts.ethereumSlotDuration,
392
313
  accounts: opts.anvilAccounts,
393
314
  port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
315
+ slotsInAnEpoch: opts.anvilSlotsInAnEpoch,
316
+ dateProvider,
394
317
  });
395
318
  anvil = res.anvil;
396
319
  config.l1RpcUrls = [res.rpcUrl];
@@ -402,8 +325,6 @@ export async function setup(
402
325
  logger.info(`Logging metrics to ${filename}`);
403
326
  setupMetricsLogger(filename);
404
327
  }
405
-
406
- const dateProvider = new TestDateProvider();
407
328
  const ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrls, dateProvider);
408
329
 
409
330
  if (opts.stateLoad) {
@@ -421,11 +342,11 @@ export async function setup(
421
342
  publisherPrivKeyHex = opts.l1PublisherKey.getValue();
422
343
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
423
344
  } else if (
424
- config.publisherPrivateKeys &&
425
- config.publisherPrivateKeys.length > 0 &&
426
- config.publisherPrivateKeys[0].getValue() != NULL_KEY
345
+ config.sequencerPublisherPrivateKeys &&
346
+ config.sequencerPublisherPrivateKeys.length > 0 &&
347
+ config.sequencerPublisherPrivateKeys[0].getValue() != NULL_KEY
427
348
  ) {
428
- publisherPrivKeyHex = config.publisherPrivateKeys[0].getValue();
349
+ publisherPrivKeyHex = config.sequencerPublisherPrivateKeys[0].getValue();
429
350
  publisherHdAccount = privateKeyToAccount(publisherPrivKeyHex);
430
351
  } else if (!MNEMONIC) {
431
352
  throw new Error(`Mnemonic not provided and no publisher private key`);
@@ -434,18 +355,13 @@ export async function setup(
434
355
  const publisherPrivKeyRaw = publisherHdAccount.getHdKey().privateKey;
435
356
  const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
436
357
  publisherPrivKeyHex = `0x${publisherPrivKey!.toString('hex')}` as const;
437
- config.publisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
358
+ config.sequencerPublisherPrivateKeys = [new SecretValue(publisherPrivKeyHex)];
438
359
  }
439
360
 
440
361
  if (config.coinbase === undefined) {
441
362
  config.coinbase = EthAddress.fromString(publisherHdAccount.address);
442
363
  }
443
364
 
444
- if (AZTEC_NODE_URL) {
445
- // we are setting up against a remote environment, l1 contracts are assumed to already be deployed
446
- return await setupWithRemoteEnvironment(publisherHdAccount!, config, logger, numberOfAccounts);
447
- }
448
-
449
365
  // Determine which addresses to fund in genesis
450
366
  const initialFundedAccounts =
451
367
  opts.initialFundedAccounts ??
@@ -502,7 +418,13 @@ export async function setup(
502
418
  if (enableAutomine) {
503
419
  await ethCheatCodes.setAutomine(false);
504
420
  await ethCheatCodes.setIntervalMining(config.ethereumSlotDuration);
505
- dateProvider.setTime((await ethCheatCodes.timestamp()) * 1000);
421
+ }
422
+
423
+ // In compose mode (no local anvil), sync dateProvider to L1 time since it may have drifted
424
+ // ahead of system time due to the local-network watcher warping time forward on each filled slot.
425
+ // When running with a local anvil, the dateProvider is kept in sync via the stdout listener.
426
+ if (!anvil) {
427
+ dateProvider.setTime((await ethCheatCodes.lastBlockTimestamp()) * 1000);
506
428
  }
507
429
 
508
430
  if (opts.l2StartTime) {
@@ -541,7 +463,7 @@ export async function setup(
541
463
  }
542
464
 
543
465
  let mockGossipSubNetwork: MockGossipSubNetwork | undefined;
544
- let p2pClientDeps: P2PClientDeps<P2PClientType.Full> | undefined = undefined;
466
+ let p2pClientDeps: P2PClientDeps | undefined = undefined;
545
467
 
546
468
  if (opts.mockGossipSubNetwork) {
547
469
  mockGossipSubNetwork = new MockGossipSubNetwork();
@@ -581,31 +503,33 @@ export async function setup(
581
503
  );
582
504
  const sequencerClient = aztecNodeService.getSequencer();
583
505
 
584
- if (sequencerClient) {
585
- const publisher = (sequencerClient as TestSequencerClient).sequencer.publisher;
586
- publisher.l1TxUtils = DelayedTxUtils.fromL1TxUtils(publisher.l1TxUtils, config.ethereumSlotDuration, l1Client);
587
- }
588
-
589
- let proverNode: ProverNode | undefined = undefined;
506
+ let proverNode: AztecNodeService | undefined = undefined;
590
507
  if (opts.startProverNode) {
591
508
  logger.verbose('Creating and syncing a simulated prover node...');
592
509
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
593
510
  const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`;
594
511
  const proverNodeDataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
595
- const proverNodeConfig = {
596
- ...config.proverNodeConfig,
597
- dataDirectory: proverNodeDataDirectory,
598
- p2pEnabled: false,
512
+
513
+ const p2pClientDeps: Partial<P2PClientDeps> = {
514
+ p2pServiceFactory: mockGossipSubNetwork && getMockPubSubP2PServiceFactory(mockGossipSubNetwork!),
515
+ rpcTxProviders: [aztecNodeService],
599
516
  };
600
- proverNode = await createAndSyncProverNode(
517
+
518
+ ({ proverNode } = await createAndSyncProverNode(
601
519
  proverNodePrivateKeyHex,
602
520
  config,
603
- proverNodeConfig,
604
- aztecNodeService,
605
- prefilledPublicData,
606
- );
521
+ {
522
+ ...config.proverNodeConfig,
523
+ dataDirectory: proverNodeDataDirectory,
524
+ },
525
+ { dateProvider, p2pClientDeps, telemetry: telemetryClient },
526
+ { prefilledPublicData },
527
+ ));
607
528
  }
608
529
 
530
+ const sequencerDelayer = sequencerClient?.getDelayer();
531
+ const proverDelayer = proverNode?.getProverNode()?.getDelayer();
532
+
609
533
  logger.verbose('Creating a pxe...');
610
534
  const pxeConfig = { ...getPXEConfig(), ...pxeOpts };
611
535
  pxeConfig.dataDirectory = path.join(directoryToCleanup, randomBytes(8).toString('hex'));
@@ -683,7 +607,7 @@ export async function setup(
683
607
  logger.error(`Error during e2e test teardown`, err);
684
608
  } finally {
685
609
  try {
686
- await telemetryClient?.stop();
610
+ await telemetryClient.stop();
687
611
  } catch (err) {
688
612
  logger.error(`Error during telemetry client stop`, err);
689
613
  }
@@ -706,6 +630,8 @@ export async function setup(
706
630
  mockGossipSubNetwork,
707
631
  prefilledPublicData,
708
632
  proverNode,
633
+ sequencerDelayer,
634
+ proverDelayer,
709
635
  sequencer: sequencerClient,
710
636
  teardown,
711
637
  telemetryClient,
@@ -789,93 +715,55 @@ export async function waitForProvenChain(node: AztecNode, targetBlock?: BlockNum
789
715
  );
790
716
  }
791
717
 
718
+ /**
719
+ * Creates an AztecNodeService with the prover node enabled as a subsystem.
720
+ * Returns both the aztec node service (for lifecycle management) and the prover node (for test internals access).
721
+ */
792
722
  export function createAndSyncProverNode(
793
723
  proverNodePrivateKey: `0x${string}`,
794
- aztecNodeConfig: AztecNodeConfig,
795
- proverNodeConfig: Partial<ProverNodeConfig> & Pick<DataStoreConfig, 'dataDirectory'> & { dontStart?: boolean },
796
- aztecNode: AztecNode | undefined,
797
- prefilledPublicData: PublicDataTreeLeaf[] = [],
798
- proverNodeDeps: ProverNodeDeps = {},
799
- ) {
724
+ baseConfig: AztecNodeConfig,
725
+ configOverrides: Pick<AztecNodeConfig, 'dataDirectory'>,
726
+ deps: {
727
+ telemetry?: TelemetryClient;
728
+ dateProvider: DateProvider;
729
+ p2pClientDeps?: P2PClientDeps;
730
+ },
731
+ options: { prefilledPublicData: PublicDataTreeLeaf[]; dontStart?: boolean },
732
+ ): Promise<{ proverNode: AztecNodeService }> {
800
733
  return withLoggerBindings({ actor: 'prover-0' }, async () => {
801
- const aztecNodeTxProvider = aztecNode && {
802
- getTxByHash: aztecNode.getTxByHash.bind(aztecNode),
803
- getTxsByHash: aztecNode.getTxsByHash.bind(aztecNode),
804
- stop: () => Promise.resolve(),
805
- };
806
-
807
- const blobClient = await createBlobClientWithFileStores(aztecNodeConfig, createLogger('blob-client:prover-node'));
808
-
809
- const archiverConfig = { ...aztecNodeConfig, dataDirectory: proverNodeConfig.dataDirectory };
810
- const archiver = await createArchiver(
811
- archiverConfig,
812
- { blobClient, dateProvider: proverNodeDeps.dateProvider },
813
- { blockUntilSync: true },
814
- );
815
-
816
- const proverConfig: ProverNodeConfig = {
817
- ...aztecNodeConfig,
818
- txCollectionNodeRpcUrls: [],
819
- realProofs: false,
820
- proverAgentCount: 2,
821
- publisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
822
- proverNodeMaxPendingJobs: 10,
823
- proverNodeMaxParallelBlocksPerEpoch: 32,
824
- proverNodePollingIntervalMs: 200,
825
- txGatheringIntervalMs: 1000,
826
- txGatheringBatchSize: 10,
827
- txGatheringMaxParallelRequestsPerNode: 10,
828
- txGatheringTimeoutMs: 24_000,
829
- proverNodeFailedEpochStore: undefined,
830
- proverId: EthAddress.fromNumber(1),
831
- proverNodeEpochProvingDelayMs: undefined,
832
- ...proverNodeConfig,
833
- };
834
-
835
- const l1TxUtils = createDelayedL1TxUtils(
836
- aztecNodeConfig,
837
- proverNodePrivateKey,
838
- 'prover-node',
839
- proverNodeDeps.dateProvider,
734
+ const proverNode = await AztecNodeService.createAndSync(
735
+ {
736
+ ...baseConfig,
737
+ ...configOverrides,
738
+ p2pPort: 0,
739
+ enableProverNode: true,
740
+ disableValidator: true,
741
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKey)],
742
+ },
743
+ deps,
744
+ { ...options, dontStartProverNode: options.dontStart },
840
745
  );
841
746
 
842
- const proverNode = await createProverNode(
843
- proverConfig,
844
- { ...proverNodeDeps, aztecNodeTxProvider, archiver: archiver as Archiver, l1TxUtils },
845
- { prefilledPublicData },
846
- );
847
- getLogger().info(`Created and synced prover node`, { publisherAddress: l1TxUtils.client.account!.address });
848
- if (!proverNodeConfig.dontStart) {
849
- await proverNode.start();
747
+ if (!proverNode.getProverNode()) {
748
+ throw new Error('Prover node subsystem was not created despite enableProverNode being set');
850
749
  }
851
- return proverNode;
852
- });
853
- }
854
750
 
855
- function createDelayedL1TxUtils(
856
- aztecNodeConfig: AztecNodeConfig,
857
- privateKey: `0x${string}`,
858
- logName: string,
859
- dateProvider?: DateProvider,
860
- ) {
861
- const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, privateKey, foundry);
862
-
863
- const log = createLogger(logName);
864
- const l1TxUtils = createDelayedL1TxUtilsFromViemWallet(l1Client, log, dateProvider, aztecNodeConfig);
865
- l1TxUtils.enableDelayer(aztecNodeConfig.ethereumSlotDuration);
866
- return l1TxUtils;
751
+ getLogger().info(`Created and synced prover node`);
752
+ return { proverNode };
753
+ });
867
754
  }
868
755
 
869
756
  export type BalancesFn = ReturnType<typeof getBalancesFn>;
870
757
  export function getBalancesFn(
871
758
  symbol: string,
872
759
  method: ContractMethod,
873
- from: AztecAddress,
874
760
  logger: any,
875
761
  ): (...addresses: (AztecAddress | { address: AztecAddress })[]) => Promise<bigint[]> {
876
762
  const balances = async (...addressLikes: (AztecAddress | { address: AztecAddress })[]) => {
877
763
  const addresses = addressLikes.map(addressLike => ('address' in addressLike ? addressLike.address : addressLike));
878
- const b = await Promise.all(addresses.map(address => method(address).simulate({ from })));
764
+ const b = await Promise.all(
765
+ addresses.map(async address => (await method(address).simulate({ from: address })).result),
766
+ );
879
767
  const debugString = `${symbol} balances: ${addresses.map((address, i) => `${address}: ${b[i]}`).join(', ')}`;
880
768
  logger.verbose(debugString);
881
769
  return b;
@@ -993,7 +881,7 @@ export async function publicDeployAccounts(
993
881
 
994
882
  const batch = new BatchCall(wallet, calls);
995
883
 
996
- const txReceipt = await batch.send({ from: accountsToDeploy[0] });
884
+ const { receipt: txReceipt } = await batch.send({ from: accountsToDeploy[0] });
997
885
  if (waitUntilProven) {
998
886
  if (!node) {
999
887
  throw new Error('Need to provide an AztecNode to wait for proven.');
@@ -7,7 +7,6 @@ import { SecretValue } from '@aztec/foundation/config';
7
7
  import { withLoggerBindings } from '@aztec/foundation/log/server';
8
8
  import { bufferToHex } from '@aztec/foundation/string';
9
9
  import type { DateProvider } from '@aztec/foundation/timer';
10
- import type { ProverNodeConfig, ProverNodeDeps } from '@aztec/prover-node';
11
10
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
12
11
 
13
12
  import getPort from 'get-port';
@@ -83,9 +82,17 @@ export async function createNodes(
83
82
  return nodes;
84
83
  }
85
84
 
86
- /** Creates a P2P enabled instance of Aztec Node Service with a validator */
85
+ /** Extended config type for createNode with test-specific overrides. */
86
+ export type CreateNodeConfig = AztecNodeConfig & {
87
+ /** Whether to skip starting the sequencer. */
88
+ dontStartSequencer?: boolean;
89
+ /** Override the private key (instead of deriving from addressIndex). */
90
+ validatorPrivateKey?: `0x${string}`;
91
+ };
92
+
93
+ /** Creates a P2P enabled instance of Aztec Node Service with a validator. */
87
94
  export async function createNode(
88
- config: AztecNodeConfig & { dontStartSequencer?: boolean },
95
+ config: CreateNodeConfig,
89
96
  dateProvider: DateProvider,
90
97
  tcpPort: number,
91
98
  bootstrapNode: string | undefined,
@@ -123,7 +130,7 @@ export async function createNonValidatorNode(
123
130
  ...p2pConfig,
124
131
  disableValidator: true,
125
132
  validatorPrivateKeys: undefined,
126
- publisherPrivateKeys: [],
133
+ sequencerPublisherPrivateKeys: [],
127
134
  };
128
135
  const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
129
136
  return await AztecNodeService.createAndSync(config, { telemetry, dateProvider }, { prefilledPublicData });
@@ -135,31 +142,24 @@ export async function createProverNode(
135
142
  tcpPort: number,
136
143
  bootstrapNode: string | undefined,
137
144
  addressIndex: number,
138
- proverNodeDeps: ProverNodeDeps & Required<Pick<ProverNodeDeps, 'dateProvider'>>,
145
+ deps: { dateProvider: DateProvider },
139
146
  prefilledPublicData?: PublicDataTreeLeaf[],
140
147
  dataDirectory?: string,
141
148
  metricsPort?: number,
142
- ) {
149
+ ): Promise<{ proverNode: AztecNodeService }> {
143
150
  const actorIndex = proverCounter++;
144
151
  return await withLoggerBindings({ actor: `prover-${actorIndex}` }, async () => {
145
152
  const proverNodePrivateKey = getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex)!;
146
153
  const telemetry = await getEndToEndTestTelemetryClient(metricsPort);
147
154
 
148
- const proverConfig: Partial<ProverNodeConfig> = await createP2PConfig(
149
- config,
150
- bootstrapNode,
151
- tcpPort,
152
- dataDirectory,
153
- );
155
+ const p2pConfig = await createP2PConfig(config, bootstrapNode, tcpPort, dataDirectory);
154
156
 
155
- const aztecNodeRpcTxProvider = undefined;
156
157
  return await createAndSyncProverNode(
157
158
  bufferToHex(proverNodePrivateKey),
158
- config,
159
- { ...proverConfig, dataDirectory },
160
- aztecNodeRpcTxProvider,
161
- prefilledPublicData,
162
- { ...proverNodeDeps, telemetry },
159
+ { ...config, ...p2pConfig },
160
+ { dataDirectory },
161
+ { ...deps, telemetry },
162
+ { prefilledPublicData: prefilledPublicData ?? [] },
163
163
  );
164
164
  });
165
165
  }
@@ -187,26 +187,27 @@ export async function createP2PConfig(
187
187
  }
188
188
 
189
189
  export async function createValidatorConfig(
190
- config: AztecNodeConfig,
190
+ config: CreateNodeConfig,
191
191
  bootstrapNodeEnr?: string,
192
192
  port?: number,
193
193
  addressIndex: number | number[] = 1,
194
194
  dataDirectory?: string,
195
195
  ) {
196
196
  const addressIndices = Array.isArray(addressIndex) ? addressIndex : [addressIndex];
197
- if (addressIndices.length === 0) {
197
+ if (addressIndices.length === 0 && !config.validatorPrivateKey) {
198
198
  throw new Error('At least one address index must be provided to create a validator config');
199
199
  }
200
200
 
201
- const attesterPrivateKeys = addressIndices.map(index =>
202
- bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)!),
203
- );
201
+ // Use override private key if provided, otherwise derive from address indices
202
+ const attesterPrivateKeys = config.validatorPrivateKey
203
+ ? [config.validatorPrivateKey]
204
+ : addressIndices.map(index => bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)!));
204
205
  const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
205
206
  const nodeConfig: AztecNodeConfig = {
206
207
  ...config,
207
208
  ...p2pConfig,
208
209
  validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
209
- publisherPrivateKeys: [new SecretValue(attesterPrivateKeys[0])],
210
+ sequencerPublisherPrivateKeys: [new SecretValue(attesterPrivateKeys[0])],
210
211
  };
211
212
 
212
213
  return nodeConfig;
@@ -6,7 +6,9 @@ import { TokenContract } from '@aztec/noir-contracts.js/Token';
6
6
 
7
7
  export async function deployToken(wallet: Wallet, admin: AztecAddress, initialAdminBalance: bigint, logger: Logger) {
8
8
  logger.info(`Deploying Token contract...`);
9
- const { contract, instance } = await TokenContract.deploy(wallet, admin, 'TokenName', 'TokenSymbol', 18).send({
9
+ const {
10
+ receipt: { contract, instance },
11
+ } = await TokenContract.deploy(wallet, admin, 'TokenName', 'TokenSymbol', 18).send({
10
12
  from: admin,
11
13
  wait: { returnReceipt: true },
12
14
  });
@@ -25,8 +27,9 @@ export async function mintTokensToPrivate(
25
27
  minter: AztecAddress,
26
28
  recipient: AztecAddress,
27
29
  amount: bigint,
30
+ additionalScopes?: AztecAddress[],
28
31
  ) {
29
- await token.methods.mint_to_private(recipient, amount).send({ from: minter });
32
+ await token.methods.mint_to_private(recipient, amount).send({ from: minter, additionalScopes });
30
33
  }
31
34
 
32
35
  export async function expectTokenBalance(
@@ -38,7 +41,7 @@ export async function expectTokenBalance(
38
41
  ) {
39
42
  // Then check the balance
40
43
  const contractWithWallet = TokenContract.at(token.address, wallet);
41
- const balance = await contractWithWallet.methods.balance_of_private(owner).simulate({ from: owner });
44
+ const { result: balance } = await contractWithWallet.methods.balance_of_private(owner).simulate({ from: owner });
42
45
  logger.info(`Account ${owner} balance: ${balance}`);
43
46
  expect(balance).toBe(expectedBalance);
44
47
  }