@aztec/end-to-end 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108
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.
- package/dest/bench/client_flows/benchmark.d.ts +4 -3
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +26 -15
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +111 -90
- package/dest/bench/client_flows/config.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +10 -30
- package/dest/bench/utils.d.ts +3 -12
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +17 -37
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +8 -8
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +42 -42
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +13 -10
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +35 -35
- package/dest/e2e_deploy_contract/deploy_test.d.ts +12 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +9 -18
- package/dest/e2e_epochs/epochs_test.d.ts +20 -12
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +36 -27
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +14 -11
- package/dest/e2e_fees/fees_test.d.ts +13 -9
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +39 -40
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -2
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +9 -8
- package/dest/e2e_multi_validator/utils.d.ts +2 -2
- package/dest/e2e_multi_validator/utils.d.ts.map +1 -1
- package/dest/e2e_multi_validator/utils.js +4 -10
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +7 -4
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +11 -12
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
- package/dest/e2e_p2p/inactivity_slash_test.js +136 -0
- package/dest/e2e_p2p/p2p_network.d.ts +238 -18
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +50 -25
- package/dest/e2e_p2p/shared.d.ts +16 -17
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +57 -56
- package/dest/e2e_token_contract/token_contract_test.d.ts +6 -5
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +14 -17
- package/dest/fixtures/e2e_prover_test.d.ts +13 -11
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +57 -66
- package/dest/fixtures/fixtures.d.ts +2 -3
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +2 -3
- package/dest/fixtures/get_acvm_config.d.ts +2 -2
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +2 -2
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +2 -2
- package/dest/fixtures/index.d.ts +1 -1
- package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/logging.d.ts +1 -1
- package/dest/fixtures/setup_p2p_test.d.ts +12 -11
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +50 -24
- package/dest/fixtures/snapshot_manager.d.ts +16 -15
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +84 -88
- package/dest/fixtures/token_utils.d.ts +10 -5
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +17 -18
- package/dest/fixtures/utils.d.ts +44 -47
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +128 -185
- package/dest/fixtures/web3signer.d.ts +5 -0
- package/dest/fixtures/web3signer.d.ts.map +1 -0
- package/dest/fixtures/web3signer.js +53 -0
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/quality_of_service/alert_checker.d.ts +2 -2
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +20 -23
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -16
- package/dest/shared/gas_portal_test_harness.d.ts +10 -17
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +11 -8
- package/dest/shared/index.d.ts +1 -1
- package/dest/shared/jest_setup.d.ts +1 -1
- package/dest/shared/jest_setup.js +1 -1
- package/dest/shared/submit-transactions.d.ts +6 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +8 -7
- package/dest/shared/uniswap_l1_l2.d.ts +13 -9
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +44 -58
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +4 -7
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +8 -5
- package/dest/simulators/token_simulator.d.ts +4 -2
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +22 -14
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +144 -86
- package/dest/spartan/tx_metrics.d.ts +39 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +95 -0
- package/dest/spartan/utils.d.ts +101 -16
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +414 -52
- package/package.json +43 -40
- package/src/bench/client_flows/benchmark.ts +8 -8
- package/src/bench/client_flows/client_flows_benchmark.ts +143 -115
- package/src/bench/client_flows/data_extractor.ts +9 -31
- package/src/bench/utils.ts +15 -39
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +46 -63
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +46 -55
- package/src/e2e_deploy_contract/deploy_test.ts +18 -36
- package/src/e2e_epochs/epochs_test.ts +59 -42
- package/src/e2e_fees/bridging_race.notest.ts +16 -11
- package/src/e2e_fees/fees_test.ts +48 -52
- package/src/e2e_l1_publisher/write_json.ts +12 -9
- package/src/e2e_multi_validator/utils.ts +5 -11
- package/src/e2e_nested_contract/nested_contract_test.ts +15 -13
- package/src/e2e_p2p/inactivity_slash_test.ts +179 -0
- package/src/e2e_p2p/p2p_network.ts +125 -89
- package/src/e2e_p2p/shared.ts +69 -60
- package/src/e2e_token_contract/token_contract_test.ts +17 -17
- package/src/fixtures/e2e_prover_test.ts +65 -105
- package/src/fixtures/fixtures.ts +2 -5
- package/src/fixtures/get_acvm_config.ts +2 -2
- package/src/fixtures/get_bb_config.ts +3 -2
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup_p2p_test.ts +79 -32
- package/src/fixtures/snapshot_manager.ts +120 -131
- package/src/fixtures/token_utils.ts +16 -24
- package/src/fixtures/utils.ts +175 -269
- package/src/fixtures/web3signer.ts +63 -0
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/guides/up_quick_start.sh +3 -11
- package/src/quality_of_service/alert_checker.ts +1 -1
- package/src/shared/cross_chain_test_harness.ts +23 -31
- package/src/shared/gas_portal_test_harness.ts +14 -21
- package/src/shared/jest_setup.ts +1 -1
- package/src/shared/submit-transactions.ts +12 -8
- package/src/shared/uniswap_l1_l2.ts +80 -88
- package/src/simulators/lending_simulator.ts +9 -6
- package/src/simulators/token_simulator.ts +5 -2
- package/src/spartan/DEVELOP.md +15 -3
- package/src/spartan/setup_test_wallets.ts +171 -127
- package/src/spartan/tx_metrics.ts +130 -0
- package/src/spartan/utils.ts +543 -45
- package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
- package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
- package/dest/fixtures/setup_l1_contracts.js +0 -17
- package/src/fixtures/setup_l1_contracts.ts +0 -26
|
@@ -1,36 +1,41 @@
|
|
|
1
1
|
import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
|
|
2
|
-
import {
|
|
2
|
+
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
3
3
|
import { AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node';
|
|
4
|
-
import {
|
|
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 {
|
|
8
|
-
import {
|
|
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 {
|
|
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,
|
|
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 {
|
|
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.
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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.
|
|
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 =
|
|
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
|
|
331
|
-
const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls,
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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 =
|
|
413
|
+
const pxeConfig = getPXEConfig();
|
|
424
414
|
pxeConfig.dataDirectory = statePath;
|
|
425
|
-
const
|
|
426
|
-
const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrls,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
470
|
-
*/ export async function publicDeployAccounts(
|
|
471
|
-
const
|
|
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
|
|
470
|
+
const alreadyRegistered = (await wallet.getContractClassMetadata(contractClass.id)).isContractClassPubliclyRegistered;
|
|
475
471
|
const calls = await Promise.all([
|
|
476
472
|
...!alreadyRegistered ? [
|
|
477
|
-
publishContractClass(
|
|
473
|
+
publishContractClass(wallet, SchnorrAccountContractArtifact)
|
|
478
474
|
] : [],
|
|
479
|
-
...instances.map((instance)=>publishInstance(
|
|
475
|
+
...instances.map((instance)=>publishInstance(wallet, instance))
|
|
480
476
|
]);
|
|
481
|
-
const batch = new BatchCall(
|
|
477
|
+
const batch = new BatchCall(wallet, calls);
|
|
482
478
|
const txReceipt = await batch.send({
|
|
483
|
-
from:
|
|
479
|
+
from: accountsToDeploy[0]
|
|
484
480
|
}).wait();
|
|
485
481
|
if (waitUntilProven) {
|
|
486
|
-
if (!
|
|
487
|
-
throw new Error('Need to provide
|
|
482
|
+
if (!node) {
|
|
483
|
+
throw new Error('Need to provide an AztecNode to wait for proven.');
|
|
488
484
|
} else {
|
|
489
|
-
await waitForProven(
|
|
485
|
+
await waitForProven(node, txReceipt);
|
|
490
486
|
}
|
|
491
487
|
}
|
|
492
488
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import {
|
|
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(
|
|
4
|
-
|
|
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(
|
|
7
|
-
//# sourceMappingURL=
|
|
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,
|
|
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
|
-
|
|
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(
|
|
7
|
-
from:
|
|
8
|
-
}).
|
|
5
|
+
const { contract, instance } = await TokenContract.deploy(wallet, admin, 'TokenName', 'TokenSymbol', 18).send({
|
|
6
|
+
from: admin
|
|
7
|
+
}).wait();
|
|
9
8
|
if (initialAdminBalance > 0n) {
|
|
10
|
-
|
|
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
|
|
12
|
+
return {
|
|
13
|
+
contract,
|
|
14
|
+
instance
|
|
15
|
+
};
|
|
15
16
|
}
|
|
16
|
-
export async function mintTokensToPrivate(token, minter,
|
|
17
|
-
|
|
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 =
|
|
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(
|
|
33
|
-
// We can only mint
|
|
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 =
|
|
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(
|
|
38
|
+
await new BatchCall(wallet, actions).send({
|
|
40
39
|
from: minter
|
|
41
40
|
}).wait();
|
|
42
41
|
}
|