@aztec/end-to-end 4.0.0-nightly.20250907 → 4.0.0-nightly.20260107

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