@aztec/end-to-end 0.0.0-test.1 → 0.0.1-commit.b655e406

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 (166) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +61 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +73 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +311 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +106 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +99 -0
  13. package/dest/bench/utils.d.ts +10 -36
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +26 -66
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +20 -12
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +85 -57
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +18 -24
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +48 -69
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +14 -6
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +13 -19
  25. package/dest/e2e_epochs/epochs_test.d.ts +58 -17
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +224 -43
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +63 -0
  31. package/dest/e2e_fees/fees_test.d.ts +20 -9
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +98 -107
  34. package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +57 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +9 -6
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +22 -19
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +135 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +69 -22
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +180 -129
  49. package/dest/e2e_p2p/shared.d.ts +41 -5
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +163 -19
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +11 -5
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +50 -26
  55. package/dest/{e2e_prover → fixtures}/e2e_prover_test.d.ts +14 -9
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +95 -100
  58. package/dest/fixtures/fixtures.d.ts +5 -6
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +4 -3
  61. package/dest/fixtures/get_acvm_config.d.ts +1 -1
  62. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  63. package/dest/fixtures/get_acvm_config.js +2 -14
  64. package/dest/fixtures/get_bb_config.d.ts +1 -1
  65. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_bb_config.js +10 -17
  67. package/dest/fixtures/l1_to_l2_messaging.d.ts +8 -5
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  69. package/dest/fixtures/l1_to_l2_messaging.js +44 -18
  70. package/dest/fixtures/setup_l1_contracts.d.ts +3 -3
  71. package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
  72. package/dest/fixtures/setup_l1_contracts.js +4 -4
  73. package/dest/fixtures/setup_p2p_test.d.ts +14 -13
  74. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  75. package/dest/fixtures/setup_p2p_test.js +73 -21
  76. package/dest/fixtures/snapshot_manager.d.ts +15 -7
  77. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  78. package/dest/fixtures/snapshot_manager.js +147 -121
  79. package/dest/fixtures/token_utils.d.ts +6 -3
  80. package/dest/fixtures/token_utils.d.ts.map +1 -1
  81. package/dest/fixtures/token_utils.js +23 -10
  82. package/dest/fixtures/utils.d.ts +76 -37
  83. package/dest/fixtures/utils.d.ts.map +1 -1
  84. package/dest/fixtures/utils.js +464 -368
  85. package/dest/fixtures/web3signer.d.ts +5 -0
  86. package/dest/fixtures/web3signer.d.ts.map +1 -0
  87. package/dest/fixtures/web3signer.js +53 -0
  88. package/dest/quality_of_service/alert_checker.d.ts +1 -1
  89. package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
  90. package/dest/shared/cross_chain_test_harness.d.ts +41 -25
  91. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  92. package/dest/shared/cross_chain_test_harness.js +104 -50
  93. package/dest/shared/gas_portal_test_harness.d.ts +32 -24
  94. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  95. package/dest/shared/gas_portal_test_harness.js +50 -29
  96. package/dest/shared/jest_setup.js +1 -1
  97. package/dest/shared/submit-transactions.d.ts +5 -3
  98. package/dest/shared/submit-transactions.d.ts.map +1 -1
  99. package/dest/shared/submit-transactions.js +8 -7
  100. package/dest/shared/uniswap_l1_l2.d.ts +13 -11
  101. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  102. package/dest/shared/uniswap_l1_l2.js +138 -108
  103. package/dest/simulators/lending_simulator.d.ts +6 -6
  104. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  105. package/dest/simulators/lending_simulator.js +13 -16
  106. package/dest/simulators/token_simulator.d.ts +5 -2
  107. package/dest/simulators/token_simulator.d.ts.map +1 -1
  108. package/dest/simulators/token_simulator.js +16 -13
  109. package/dest/spartan/setup_test_wallets.d.ts +23 -10
  110. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  111. package/dest/spartan/setup_test_wallets.js +167 -58
  112. package/dest/spartan/utils.d.ts +106 -303
  113. package/dest/spartan/utils.d.ts.map +1 -1
  114. package/dest/spartan/utils.js +434 -130
  115. package/package.json +61 -56
  116. package/src/bench/client_flows/benchmark.ts +341 -0
  117. package/src/bench/client_flows/client_flows_benchmark.ts +402 -0
  118. package/src/bench/client_flows/config.ts +61 -0
  119. package/src/bench/client_flows/data_extractor.ts +111 -0
  120. package/src/bench/utils.ts +22 -76
  121. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
  122. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +63 -105
  123. package/src/e2e_deploy_contract/deploy_test.ts +23 -38
  124. package/src/e2e_epochs/epochs_test.ts +274 -54
  125. package/src/e2e_fees/bridging_race.notest.ts +80 -0
  126. package/src/e2e_fees/fees_test.ts +137 -136
  127. package/src/e2e_l1_publisher/write_json.ts +76 -0
  128. package/src/e2e_multi_validator/utils.ts +258 -0
  129. package/src/e2e_nested_contract/nested_contract_test.ts +27 -18
  130. package/src/e2e_p2p/inactivity_slash_test.ts +178 -0
  131. package/src/e2e_p2p/p2p_network.ts +272 -166
  132. package/src/e2e_p2p/shared.ts +244 -29
  133. package/src/e2e_token_contract/token_contract_test.ts +43 -39
  134. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  135. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +101 -145
  136. package/src/fixtures/fixtures.ts +4 -3
  137. package/src/fixtures/get_acvm_config.ts +3 -11
  138. package/src/fixtures/get_bb_config.ts +18 -13
  139. package/src/fixtures/l1_to_l2_messaging.ts +53 -23
  140. package/src/fixtures/setup_l1_contracts.ts +6 -7
  141. package/src/fixtures/setup_p2p_test.ts +112 -38
  142. package/src/fixtures/snapshot_manager.ts +187 -139
  143. package/src/fixtures/token_utils.ts +29 -12
  144. package/src/fixtures/utils.ts +552 -425
  145. package/src/fixtures/web3signer.ts +63 -0
  146. package/src/guides/up_quick_start.sh +6 -14
  147. package/src/quality_of_service/alert_checker.ts +1 -1
  148. package/src/shared/cross_chain_test_harness.ts +108 -79
  149. package/src/shared/gas_portal_test_harness.ts +58 -49
  150. package/src/shared/jest_setup.ts +1 -1
  151. package/src/shared/submit-transactions.ts +12 -8
  152. package/src/shared/uniswap_l1_l2.ts +173 -176
  153. package/src/simulators/lending_simulator.ts +12 -15
  154. package/src/simulators/token_simulator.ts +21 -13
  155. package/src/spartan/DEVELOP.md +121 -0
  156. package/src/spartan/setup_test_wallets.ts +215 -93
  157. package/src/spartan/utils.ts +490 -130
  158. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  159. package/dest/sample-dapp/connect.js +0 -12
  160. package/dest/sample-dapp/contracts.js +0 -10
  161. package/dest/sample-dapp/deploy.js +0 -35
  162. package/dest/sample-dapp/index.js +0 -98
  163. package/src/sample-dapp/connect.mjs +0 -16
  164. package/src/sample-dapp/contracts.mjs +0 -14
  165. package/src/sample-dapp/deploy.mjs +0 -40
  166. package/src/sample-dapp/index.mjs +0 -128
@@ -1,18 +1,25 @@
1
1
  import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
- import { deployFundedSchnorrAccounts, generateSchnorrAccounts } from '@aztec/accounts/testing';
2
+ import { generateSchnorrAccounts } from '@aztec/accounts/testing';
3
3
  import { AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
4
- import { AnvilTestWatcher, BatchCall, CheatCodes, getContractClassFromArtifact } from '@aztec/aztec.js';
5
- import { deployInstance, registerContractClass } from '@aztec/aztec.js/deployment';
4
+ import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
5
+ import { getContractClassFromArtifact } from '@aztec/aztec.js/contracts';
6
+ import { BatchCall, waitForProven } from '@aztec/aztec.js/contracts';
7
+ import { publishContractClass, publishInstance } from '@aztec/aztec.js/deployment';
8
+ import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
6
9
  import { createBlobSinkServer } from '@aztec/blob-sink/server';
7
- import { createL1Clients, getL1ContractsConfigEnvVars, l1Artifacts } from '@aztec/ethereum';
10
+ import { createExtendedL1Client, deployMulticall3, getL1ContractsConfigEnvVars } from '@aztec/ethereum';
8
11
  import { EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test';
9
12
  import { asyncMap } from '@aztec/foundation/async-map';
13
+ import { SecretValue } from '@aztec/foundation/config';
10
14
  import { randomBytes } from '@aztec/foundation/crypto';
15
+ import { tryRmDir } from '@aztec/foundation/fs';
11
16
  import { createLogger } from '@aztec/foundation/log';
12
17
  import { resolver, reviver } from '@aztec/foundation/serialize';
13
18
  import { TestDateProvider } from '@aztec/foundation/timer';
14
- import { createPXEService, getPXEServiceConfig } from '@aztec/pxe/server';
19
+ import { getPXEConfig } from '@aztec/pxe/server';
20
+ import { tryStop } from '@aztec/stdlib/interfaces/server';
15
21
  import { getConfigEnvVars as getTelemetryConfig, initTelemetryClient } from '@aztec/telemetry-client';
22
+ import { TestWallet } from '@aztec/test-wallet/server';
16
23
  import { getGenesisValues } from '@aztec/world-state/testing';
17
24
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
18
25
  import { copySync, removeSync } from 'fs-extra/esm';
@@ -20,13 +27,13 @@ import fs from 'fs/promises';
20
27
  import getPort from 'get-port';
21
28
  import { tmpdir } from 'os';
22
29
  import path, { join } from 'path';
23
- import { getContract } from 'viem';
24
30
  import { mnemonicToAccount } from 'viem/accounts';
25
- import { MNEMONIC, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
31
+ import { foundry } from 'viem/chains';
32
+ import { MNEMONIC, TEST_MAX_TX_POOL_SIZE, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
26
33
  import { getACVMConfig } from './get_acvm_config.js';
27
34
  import { getBBConfig } from './get_bb_config.js';
28
35
  import { setupL1Contracts } from './setup_l1_contracts.js';
29
- import { createAndSyncProverNode, getLogger, getPrivateKeyFromIndex } from './utils.js';
36
+ import { createAndSyncProverNode, getLogger, getPrivateKeyFromIndex, getSponsoredFPCAddress } from './utils.js';
30
37
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
31
38
  export function createSnapshotManager(testName, dataPath, config = {}, deployL1ContractsArgs = {
32
39
  initialValidators: []
@@ -114,7 +121,7 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
114
121
  // Execute the restoration function.
115
122
  await restore(snapshotData, context);
116
123
  // Save the snapshot data.
117
- const ethCheatCodes = new EthCheatCodesWithState(context.aztecNodeConfig.l1RpcUrls);
124
+ const ethCheatCodes = new EthCheatCodesWithState(context.aztecNodeConfig.l1RpcUrls, context.dateProvider);
118
125
  const anvilStateFile = `${this.livePath}/anvil.dat`;
119
126
  await ethCheatCodes.dumpChainState(anvilStateFile);
120
127
  writeFileSync(`${this.livePath}/${name}.json`, JSON.stringify(snapshotData || {}, resolver));
@@ -176,28 +183,19 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
176
183
  if (!context) {
177
184
  return;
178
185
  }
186
+ const logger = getLogger();
179
187
  try {
180
- getLogger().info('Tearing down subsystems');
181
- await context.proverNode?.stop();
182
- await context.aztecNode.stop();
188
+ logger.info('Tearing down subsystems');
189
+ await tryStop(context.proverNode);
190
+ await tryStop(context.aztecNode);
183
191
  await context.acvmConfig?.cleanup();
184
192
  await context.bbConfig?.cleanup();
185
- await context.anvil.stop();
186
- await context.watcher.stop();
187
- await context.blobSink.stop();
188
- if (context.directoryToCleanup) {
189
- try {
190
- await fs.rm(context.directoryToCleanup, {
191
- recursive: true,
192
- force: true,
193
- maxRetries: 3
194
- });
195
- } catch (err) {
196
- getLogger().warn(`Failed to delete tmp directory ${context.directoryToCleanup}: ${err}`);
197
- }
198
- }
193
+ await tryStop(context.anvil);
194
+ await tryStop(context.watcher);
195
+ await tryStop(context.blobSink);
196
+ await tryRmDir(context.directoryToCleanup, logger);
199
197
  } catch (err) {
200
- getLogger().error('Error during teardown', err);
198
+ logger.error('Error during teardown', err);
201
199
  }
202
200
  }
203
201
  /**
@@ -209,6 +207,9 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
209
207
  }) {
210
208
  logger.verbose(`Initializing state...`);
211
209
  const blobSinkPort = await getPort();
210
+ // Default to no slashing
211
+ opts.slasherFlavor ??= 'none';
212
+ deployL1ContractsArgs.slasherFlavor ??= opts.slasherFlavor;
212
213
  // Fetch the AztecNode config.
213
214
  // TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing.
214
215
  const aztecNodeConfig = {
@@ -216,6 +217,15 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
216
217
  ...opts
217
218
  };
218
219
  aztecNodeConfig.peerCheckIntervalMS = TEST_PEER_CHECK_INTERVAL_MS;
220
+ aztecNodeConfig.maxTxPoolSize = opts.maxTxPoolSize ?? TEST_MAX_TX_POOL_SIZE;
221
+ // Only enable proving if specifically requested.
222
+ aztecNodeConfig.realProofs = !!opts.realProofs;
223
+ // Only enforce the time table if requested
224
+ aztecNodeConfig.enforceTimeTable = !!opts.enforceTimeTable;
225
+ // Only set the target committee size if it is explicitly set
226
+ aztecNodeConfig.aztecTargetCommitteeSize = opts.aztecTargetCommitteeSize ?? 0;
227
+ aztecNodeConfig.listenAddress = '127.0.0.1';
228
+ deployL1ContractsArgs.aztecTargetCommitteeSize ??= aztecNodeConfig.aztecTargetCommitteeSize;
219
229
  // Create a temp directory for all ephemeral state and cleanup afterwards
220
230
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
221
231
  await fs.mkdir(directoryToCleanup, {
@@ -226,16 +236,25 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
226
236
  } else {
227
237
  aztecNodeConfig.dataDirectory = statePath;
228
238
  }
229
- aztecNodeConfig.blobSinkUrl = `http://localhost:${blobSinkPort}`;
230
- // Setup blob sink service
231
- const blobSink = await createBlobSinkServer({
232
- port: blobSinkPort,
233
- dataStoreConfig: {
234
- dataDirectory: aztecNodeConfig.dataDirectory,
235
- dataStoreMapSizeKB: aztecNodeConfig.dataStoreMapSizeKB
236
- }
239
+ aztecNodeConfig.blobSinkUrl = `http://127.0.0.1:${blobSinkPort}`;
240
+ const hdAccount = mnemonicToAccount(MNEMONIC, {
241
+ addressIndex: 0
237
242
  });
238
- await blobSink.start();
243
+ const publisherPrivKeyRaw = hdAccount.getHdKey().privateKey;
244
+ const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
245
+ const l1Client = createExtendedL1Client([
246
+ aztecNodeConfig.l1RpcUrls[0]
247
+ ], hdAccount, foundry);
248
+ const validatorPrivKey = getPrivateKeyFromIndex(0);
249
+ const proverNodePrivateKey = getPrivateKeyFromIndex(0);
250
+ aztecNodeConfig.publisherPrivateKeys = [
251
+ new SecretValue(`0x${publisherPrivKey.toString('hex')}`)
252
+ ];
253
+ aztecNodeConfig.validatorPrivateKeys = new SecretValue([
254
+ `0x${validatorPrivKey.toString('hex')}`
255
+ ]);
256
+ aztecNodeConfig.coinbase = opts.coinbase ?? EthAddress.fromString(`${hdAccount.address}`);
257
+ logger.info(`Setting up environment with config`, aztecNodeConfig);
239
258
  // Start anvil. We go via a wrapper script to ensure if the parent dies, anvil dies.
240
259
  logger.verbose('Starting anvil...');
241
260
  const res = await startAnvil({
@@ -245,57 +264,30 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
245
264
  aztecNodeConfig.l1RpcUrls = [
246
265
  res.rpcUrl
247
266
  ];
267
+ const dateProvider = new TestDateProvider();
268
+ const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls, dateProvider);
248
269
  // Deploy our L1 contracts.
249
270
  logger.verbose('Deploying L1 contracts...');
250
- const hdAccount = mnemonicToAccount(MNEMONIC, {
251
- accountIndex: 0
252
- });
253
- const publisherPrivKeyRaw = hdAccount.getHdKey().privateKey;
254
- const publisherPrivKey = publisherPrivKeyRaw === null ? null : Buffer.from(publisherPrivKeyRaw);
255
- const validatorPrivKey = getPrivateKeyFromIndex(0);
256
- const proverNodePrivateKey = getPrivateKeyFromIndex(0);
257
- aztecNodeConfig.publisherPrivateKey = `0x${publisherPrivKey.toString('hex')}`;
258
- aztecNodeConfig.validatorPrivateKey = `0x${validatorPrivKey.toString('hex')}`;
259
- const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls);
260
271
  if (opts.l1StartTime) {
261
- await ethCheatCodes.warp(opts.l1StartTime);
272
+ await ethCheatCodes.warp(opts.l1StartTime, {
273
+ resetBlockInterval: true
274
+ });
262
275
  }
263
276
  const initialFundedAccounts = await generateSchnorrAccounts(numberOfInitialFundedAccounts);
264
- const { genesisArchiveRoot, genesisBlockHash, prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address), opts.initialAccountFeeJuice);
277
+ const sponsoredFPCAddress = await getSponsoredFPCAddress();
278
+ const { genesisArchiveRoot, prefilledPublicData, fundingNeeded } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address).concat(sponsoredFPCAddress), opts.initialAccountFeeJuice);
279
+ await deployMulticall3(l1Client, logger);
265
280
  const deployL1ContractsValues = await setupL1Contracts(aztecNodeConfig.l1RpcUrls[0], hdAccount, logger, {
266
281
  ...getL1ContractsConfigEnvVars(),
267
282
  genesisArchiveRoot,
268
- genesisBlockHash,
283
+ feeJuicePortalInitialBalance: fundingNeeded,
269
284
  salt: opts.salt,
270
285
  ...deployL1ContractsArgs,
271
286
  initialValidators: opts.initialValidators
272
287
  });
273
288
  aztecNodeConfig.l1Contracts = deployL1ContractsValues.l1ContractAddresses;
274
- aztecNodeConfig.l1PublishRetryIntervalMS = 100;
275
- if (opts.fundRewardDistributor) {
276
- // Mints block rewards for 10000 blocks to the rewardDistributor contract
277
- const rewardDistributor = getContract({
278
- address: deployL1ContractsValues.l1ContractAddresses.rewardDistributorAddress.toString(),
279
- abi: l1Artifacts.rewardDistributor.contractAbi,
280
- client: deployL1ContractsValues.publicClient
281
- });
282
- const blockReward = await rewardDistributor.read.BLOCK_REWARD();
283
- const mintAmount = 10_000n * blockReward;
284
- const feeJuice = getContract({
285
- address: deployL1ContractsValues.l1ContractAddresses.feeJuiceAddress.toString(),
286
- abi: l1Artifacts.feeAsset.contractAbi,
287
- client: deployL1ContractsValues.walletClient
288
- });
289
- const rewardDistributorMintTxHash = await feeJuice.write.mint([
290
- rewardDistributor.address,
291
- mintAmount
292
- ], {});
293
- await deployL1ContractsValues.publicClient.waitForTransactionReceipt({
294
- hash: rewardDistributorMintTxHash
295
- });
296
- logger.info(`Funding rewardDistributor in ${rewardDistributorMintTxHash}`);
297
- }
298
- const watcher = new AnvilTestWatcher(new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.publicClient);
289
+ aztecNodeConfig.rollupVersion = deployL1ContractsValues.rollupVersion;
290
+ const watcher = new AnvilTestWatcher(new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls, dateProvider), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.l1Client, dateProvider);
299
291
  await watcher.start();
300
292
  const acvmConfig = await getACVMConfig(logger);
301
293
  if (acvmConfig) {
@@ -308,8 +300,17 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
308
300
  aztecNodeConfig.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
309
301
  }
310
302
  const telemetry = getEndToEndTestTelemetryClient(opts.metricsPort);
311
- logger.verbose('Creating and synching an aztec node...');
312
- const dateProvider = new TestDateProvider();
303
+ // Setup blob sink service
304
+ const blobSink = await createBlobSinkServer({
305
+ l1ChainId: aztecNodeConfig.l1ChainId,
306
+ l1RpcUrls: aztecNodeConfig.l1RpcUrls,
307
+ l1Contracts: aztecNodeConfig.l1Contracts,
308
+ port: blobSinkPort,
309
+ dataDirectory: aztecNodeConfig.dataDirectory,
310
+ dataStoreMapSizeKb: aztecNodeConfig.dataStoreMapSizeKb
311
+ }, telemetry);
312
+ await blobSink.start();
313
+ logger.info('Creating and synching an aztec node...');
313
314
  const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, {
314
315
  telemetry,
315
316
  dateProvider
@@ -318,14 +319,20 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
318
319
  });
319
320
  let proverNode = undefined;
320
321
  if (opts.startProverNode) {
321
- logger.verbose('Creating and syncing a simulated prover node...');
322
- proverNode = await createAndSyncProverNode(`0x${proverNodePrivateKey.toString('hex')}`, aztecNodeConfig, aztecNode, path.join(directoryToCleanup, randomBytes(8).toString('hex')), prefilledPublicData);
322
+ logger.verbose('Creating and syncing a simulated prover node with p2p disabled...');
323
+ proverNode = await createAndSyncProverNode(`0x${proverNodePrivateKey.toString('hex')}`, aztecNodeConfig, {
324
+ ...aztecNodeConfig.proverNodeConfig,
325
+ dataDirectory: path.join(directoryToCleanup, randomBytes(8).toString('hex')),
326
+ p2pEnabled: false
327
+ }, aztecNode, prefilledPublicData);
323
328
  }
324
329
  logger.verbose('Creating pxe...');
325
- const pxeConfig = getPXEServiceConfig();
330
+ const pxeConfig = getPXEConfig();
326
331
  pxeConfig.dataDirectory = statePath ?? path.join(directoryToCleanup, randomBytes(8).toString('hex'));
327
- const pxe = await createPXEService(aztecNode, pxeConfig);
328
- const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, pxe);
332
+ // Only enable proving if specifically requested.
333
+ pxeConfig.proverEnabled = !!opts.realProofs;
334
+ const wallet = await TestWallet.create(aztecNode, pxeConfig);
335
+ const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, aztecNode, dateProvider);
329
336
  if (statePath) {
330
337
  writeFileSync(`${statePath}/aztec_node_config.json`, JSON.stringify(aztecNodeConfig, resolver));
331
338
  writeFileSync(`${statePath}/accounts.json`, JSON.stringify(initialFundedAccounts, resolver));
@@ -334,7 +341,8 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
334
341
  aztecNodeConfig,
335
342
  anvil,
336
343
  aztecNode,
337
- pxe,
344
+ wallet,
345
+ sequencer: aztecNode.getSequencer(),
338
346
  acvmConfig,
339
347
  bbConfig,
340
348
  deployL1ContractsValues,
@@ -361,16 +369,9 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
361
369
  const aztecNodeConfig = JSON.parse(readFileSync(`${statePath}/aztec_node_config.json`, 'utf-8'), reviver);
362
370
  aztecNodeConfig.dataDirectory = statePath;
363
371
  aztecNodeConfig.blobSinkUrl = `http://127.0.0.1:${blobSinkPort}`;
372
+ aztecNodeConfig.listenAddress = '127.0.0.1';
364
373
  const initialFundedAccounts = JSON.parse(readFileSync(`${statePath}/accounts.json`, 'utf-8'), reviver) || [];
365
374
  const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map((a)=>a.address));
366
- const blobSink = await createBlobSinkServer({
367
- port: blobSinkPort,
368
- dataStoreConfig: {
369
- dataDirectory: statePath,
370
- dataStoreMapSizeKB: aztecNodeConfig.dataStoreMapSizeKB
371
- }
372
- });
373
- await blobSink.start();
374
375
  // Start anvil. We go via a wrapper script to ensure if the parent dies, anvil dies.
375
376
  const { anvil, rpcUrl } = await startAnvil();
376
377
  aztecNodeConfig.l1RpcUrls = [
@@ -378,7 +379,8 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
378
379
  ];
379
380
  // Load anvil state.
380
381
  const anvilStateFile = `${statePath}/anvil.dat`;
381
- const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls);
382
+ const dateProvider = new TestDateProvider();
383
+ const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls, dateProvider);
382
384
  await ethCheatCodes.loadChainState(anvilStateFile);
383
385
  // TODO: Encapsulate this in a NativeAcvm impl.
384
386
  const acvmConfig = await getACVMConfig(logger);
@@ -392,12 +394,20 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
392
394
  aztecNodeConfig.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
393
395
  }
394
396
  logger.verbose('Creating ETH clients...');
395
- const { publicClient, walletClient } = createL1Clients(aztecNodeConfig.l1RpcUrls, mnemonicToAccount(MNEMONIC));
396
- const watcher = new AnvilTestWatcher(new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrls), aztecNodeConfig.l1Contracts.rollupAddress, publicClient);
397
+ const l1Client = createExtendedL1Client(aztecNodeConfig.l1RpcUrls, mnemonicToAccount(MNEMONIC));
398
+ const watcher = new AnvilTestWatcher(ethCheatCodes, aztecNodeConfig.l1Contracts.rollupAddress, l1Client, dateProvider);
397
399
  await watcher.start();
398
- logger.verbose('Creating aztec node...');
399
400
  const telemetry = initTelemetryClient(getTelemetryConfig());
400
- const dateProvider = new TestDateProvider();
401
+ const blobSink = await createBlobSinkServer({
402
+ l1ChainId: aztecNodeConfig.l1ChainId,
403
+ l1RpcUrls: aztecNodeConfig.l1RpcUrls,
404
+ l1Contracts: aztecNodeConfig.l1Contracts,
405
+ port: blobSinkPort,
406
+ dataDirectory: statePath,
407
+ dataStoreMapSizeKb: aztecNodeConfig.dataStoreMapSizeKb
408
+ }, telemetry);
409
+ await blobSink.start();
410
+ logger.verbose('Creating aztec node...');
401
411
  const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, {
402
412
  telemetry,
403
413
  dateProvider
@@ -409,25 +419,30 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
409
419
  logger.verbose('Creating and syncing a simulated prover node...');
410
420
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
411
421
  const proverNodePrivateKeyHex = `0x${proverNodePrivateKey.toString('hex')}`;
412
- proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, aztecNodeConfig, aztecNode, path.join(directoryToCleanup, randomBytes(8).toString('hex')), prefilledPublicData);
422
+ proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, aztecNodeConfig, {
423
+ ...aztecNodeConfig.proverNodeConfig,
424
+ dataDirectory: path.join(directoryToCleanup, randomBytes(8).toString('hex')),
425
+ p2pEnabled: false
426
+ }, aztecNode, prefilledPublicData);
413
427
  }
414
428
  logger.verbose('Creating pxe...');
415
- const pxeConfig = getPXEServiceConfig();
429
+ const pxeConfig = getPXEConfig();
416
430
  pxeConfig.dataDirectory = statePath;
417
- const pxe = await createPXEService(aztecNode, pxeConfig);
418
- const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, pxe);
431
+ const wallet = await TestWallet.create(aztecNode, pxeConfig);
432
+ const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls, aztecNode, dateProvider);
419
433
  return {
420
434
  aztecNodeConfig,
421
435
  anvil,
422
436
  aztecNode,
423
- pxe,
437
+ wallet,
438
+ sequencer: aztecNode.getSequencer(),
424
439
  acvmConfig,
425
440
  bbConfig,
426
441
  proverNode,
427
442
  deployL1ContractsValues: {
428
- walletClient,
429
- publicClient,
430
- l1ContractAddresses: aztecNodeConfig.l1Contracts
443
+ l1Client,
444
+ l1ContractAddresses: aztecNodeConfig.l1Contracts,
445
+ rollupVersion: aztecNodeConfig.rollupVersion
431
446
  },
432
447
  watcher,
433
448
  cheatCodes,
@@ -440,15 +455,21 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
440
455
  /**
441
456
  * Snapshot 'apply' helper function to add accounts.
442
457
  * The 'restore' function is not provided, as it must be a closure within the test context to capture the results.
443
- */ export const deployAccounts = (numberOfAccounts, logger, waitUntilProven = false)=>async ({ pxe, initialFundedAccounts })=>{
458
+ */ export const deployAccounts = (numberOfAccounts, logger)=>async ({ wallet, initialFundedAccounts })=>{
444
459
  if (initialFundedAccounts.length < numberOfAccounts) {
445
460
  throw new Error(`Cannot deploy more than ${initialFundedAccounts.length} initial accounts.`);
446
461
  }
447
462
  logger.verbose('Deploying accounts funded with fee juice...');
448
463
  const deployedAccounts = initialFundedAccounts.slice(0, numberOfAccounts);
449
- await deployFundedSchnorrAccounts(pxe, deployedAccounts, {
450
- proven: waitUntilProven
451
- });
464
+ // Serial due to https://github.com/AztecProtocol/aztec-packages/issues/12045
465
+ for(let i = 0; i < deployedAccounts.length; i++){
466
+ const accountManager = await wallet.createSchnorrAccount(deployedAccounts[i].secret, deployedAccounts[i].salt, deployedAccounts[i].signingKey);
467
+ const deployMethod = await accountManager.getDeployMethod();
468
+ await deployMethod.send({
469
+ from: AztecAddress.ZERO,
470
+ skipClassPublication: i !== 0
471
+ }).wait();
472
+ }
452
473
  return {
453
474
  deployedAccounts
454
475
  };
@@ -458,22 +479,27 @@ export function createSnapshotManager(testName, dataPath, config = {}, deployL1C
458
479
  * Use this when you need to make a public call to an account contract, such as for requesting a public authwit.
459
480
  * @param sender - Wallet to send the deployment tx.
460
481
  * @param accountsToDeploy - Which accounts to publicly deploy.
461
- */ export async function publicDeployAccounts(sender, accountsToDeploy, waitUntilProven = false) {
462
- const accountAddressesToDeploy = accountsToDeploy.map((a)=>'address' in a ? a.address : a);
463
- const instances = (await Promise.all(accountAddressesToDeploy.map((account)=>sender.getContractMetadata(account)))).map((metadata)=>metadata.contractInstance);
482
+ * @param waitUntilProven - Whether to wait for the tx to be proven.
483
+ * @param node - AztecNode used to wait for proven tx.
484
+ */ export async function publicDeployAccounts(wallet, accountsToDeploy, waitUntilProven = false, node) {
485
+ const instances = (await Promise.all(accountsToDeploy.map((account)=>wallet.getContractMetadata(account)))).map((metadata)=>metadata.contractInstance);
464
486
  const contractClass = await getContractClassFromArtifact(SchnorrAccountContractArtifact);
465
- const alreadyRegistered = (await sender.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
466
- const fns = await Promise.all([
487
+ const alreadyRegistered = (await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
488
+ const calls = await Promise.all([
467
489
  ...!alreadyRegistered ? [
468
- registerContractClass(sender, SchnorrAccountContractArtifact)
490
+ publishContractClass(wallet, SchnorrAccountContractArtifact)
469
491
  ] : [],
470
- ...instances.map((instance)=>deployInstance(sender, instance))
492
+ ...instances.map((instance)=>publishInstance(wallet, instance))
471
493
  ]);
472
- const calls = await Promise.all(fns.map((fn)=>fn.request()));
473
- const capsules = fns.map((fn)=>fn.getCapsules()).flat();
474
- const batch = new BatchCall(sender, calls);
475
- batch.addCapsules(capsules);
476
- await batch.send().wait({
477
- proven: waitUntilProven
478
- });
494
+ const batch = new BatchCall(wallet, calls);
495
+ const txReceipt = await batch.send({
496
+ from: accountsToDeploy[0]
497
+ }).wait();
498
+ if (waitUntilProven) {
499
+ if (!node) {
500
+ throw new Error('Need to provide an AztecNode to wait for proven.');
501
+ } else {
502
+ await waitForProven(node, txReceipt);
503
+ }
504
+ }
479
505
  }
@@ -1,6 +1,9 @@
1
- import type { AztecAddress, Logger, Wallet } from '@aztec/aztec.js';
1
+ import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import type { Logger } from '@aztec/aztec.js/log';
3
+ import type { Wallet } from '@aztec/aztec.js/wallet';
2
4
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
3
- export declare function deployToken(adminWallet: Wallet, initialAdminBalance: bigint, logger: Logger): Promise<TokenContract>;
4
- export declare function mintTokensToPrivate(token: TokenContract, minterWallet: Wallet, recipient: AztecAddress, amount: bigint): Promise<void>;
5
+ export declare function deployToken(wallet: Wallet, admin: AztecAddress, initialAdminBalance: bigint, logger: Logger): Promise<TokenContract>;
6
+ export declare function mintTokensToPrivate(token: TokenContract, minter: AztecAddress, recipient: AztecAddress, amount: bigint): Promise<void>;
5
7
  export declare function expectTokenBalance(wallet: Wallet, token: TokenContract, owner: AztecAddress, expectedBalance: bigint, logger: Logger): Promise<void>;
8
+ export declare function mintNotes(wallet: Wallet, minter: AztecAddress, recipient: AztecAddress, asset: TokenContract, noteAmounts: bigint[]): Promise<bigint>;
6
9
  //# sourceMappingURL=token_utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token_utils.d.ts","sourceRoot":"","sources":["../../src/fixtures/token_utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,0BAcjG;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,MAAM,iBAKf;AAGD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,iBAOf"}
1
+ {"version":3,"file":"token_utils.d.ts","sourceRoot":"","sources":["../../src/fixtures/token_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,0BAajH;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,MAAM,iBAGf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,iBAOf;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -1,21 +1,21 @@
1
- // docs:start:token_utils
1
+ import { BatchCall } from '@aztec/aztec.js/contracts';
2
2
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
3
- export async function deployToken(adminWallet, initialAdminBalance, logger) {
3
+ export async function deployToken(wallet, admin, initialAdminBalance, logger) {
4
4
  logger.info(`Deploying Token contract...`);
5
- const contract = await TokenContract.deploy(adminWallet, adminWallet.getAddress(), 'TokenName', 'TokenSymbol', 18).send().deployed();
5
+ const contract = await TokenContract.deploy(wallet, admin, 'TokenName', 'TokenSymbol', 18).send({
6
+ from: admin
7
+ }).deployed();
6
8
  if (initialAdminBalance > 0n) {
7
- // Minter is minting to herself so contract as minter is the same as contract as recipient
8
- await mintTokensToPrivate(contract, adminWallet, adminWallet.getAddress(), initialAdminBalance);
9
+ await mintTokensToPrivate(contract, admin, admin, initialAdminBalance);
9
10
  }
10
11
  logger.info('L2 contract deployed');
11
12
  return contract;
12
13
  }
13
- export async function mintTokensToPrivate(token, minterWallet, recipient, amount) {
14
- const tokenAsMinter = await TokenContract.at(token.address, minterWallet);
15
- const from = minterWallet.getAddress(); // we are setting from to minter here because we need a sender to calculate the tag
16
- await tokenAsMinter.methods.mint_to_private(from, recipient, amount).send().wait();
14
+ export async function mintTokensToPrivate(token, minter, recipient, amount) {
15
+ await token.methods.mint_to_private(recipient, amount).send({
16
+ from: minter
17
+ }).wait();
17
18
  }
18
- // docs:end:token_utils
19
19
  export async function expectTokenBalance(wallet, token, owner, expectedBalance, logger) {
20
20
  // Then check the balance
21
21
  const contractWithWallet = await TokenContract.at(token.address, wallet);
@@ -25,3 +25,16 @@ export async function expectTokenBalance(wallet, token, owner, expectedBalance,
25
25
  logger.info(`Account ${owner} balance: ${balance}`);
26
26
  expect(balance).toBe(expectedBalance);
27
27
  }
28
+ export async function mintNotes(wallet, minter, recipient, asset, noteAmounts) {
29
+ // We can only mint 5 notes at a time, since that's the maximum number of calls our entrypoints allow
30
+ // TODO(#13024): mint as many notes as possible in a single tx
31
+ const notesPerIteration = 5;
32
+ for(let mintedNotes = 0; mintedNotes < noteAmounts.length; mintedNotes += notesPerIteration){
33
+ const toMint = noteAmounts.slice(mintedNotes, mintedNotes + notesPerIteration);
34
+ const actions = toMint.map((amt)=>asset.methods.mint_to_private(recipient, amt));
35
+ await new BatchCall(wallet, actions).send({
36
+ from: minter
37
+ }).wait();
38
+ }
39
+ return noteAmounts.reduce((prev, curr)=>prev + curr, 0n);
40
+ }