@aztec/end-to-end 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.77.0-testnet-ignition.17
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/README.md +2 -0
- package/dest/bench/utils.d.ts +70 -0
- package/dest/bench/utils.d.ts.map +1 -0
- package/dest/bench/utils.js +24 -8
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +46 -0
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -0
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +17 -17
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +47 -0
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -0
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +27 -16
- package/dest/e2e_deploy_contract/deploy_test.d.ts +28 -0
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -0
- package/dest/e2e_deploy_contract/deploy_test.js +4 -7
- package/dest/e2e_epochs/epochs_test.d.ts +51 -0
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -0
- package/dest/e2e_epochs/epochs_test.js +155 -0
- package/dest/e2e_fees/fees_test.d.ts +73 -0
- package/dest/e2e_fees/fees_test.d.ts.map +1 -0
- package/dest/e2e_fees/fees_test.js +75 -32
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +26 -0
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -0
- package/dest/e2e_nested_contract/nested_contract_test.js +14 -12
- package/dest/e2e_p2p/p2p_network.d.ts +61 -0
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -0
- package/dest/e2e_p2p/p2p_network.js +54 -30
- package/dest/e2e_p2p/shared.d.ts +10 -0
- package/dest/e2e_p2p/shared.d.ts.map +1 -0
- package/dest/e2e_p2p/shared.js +7 -8
- package/dest/e2e_prover/e2e_prover_test.d.ts +56 -0
- package/dest/e2e_prover/e2e_prover_test.d.ts.map +1 -0
- package/dest/e2e_prover/e2e_prover_test.js +20 -24
- package/dest/e2e_token_contract/token_contract_test.d.ts +29 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -0
- package/dest/e2e_token_contract/token_contract_test.js +4 -7
- package/dest/fixtures/fixtures.d.ts +17 -0
- package/dest/fixtures/fixtures.d.ts.map +1 -0
- package/dest/fixtures/fixtures.js +2 -2
- package/dest/fixtures/get_acvm_config.d.ts +8 -0
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -0
- package/dest/fixtures/get_acvm_config.js +10 -5
- package/dest/fixtures/get_bb_config.d.ts +6 -0
- package/dest/fixtures/get_bb_config.d.ts.map +1 -0
- package/dest/fixtures/get_bb_config.js +9 -4
- package/dest/fixtures/index.d.ts +6 -0
- package/dest/fixtures/index.d.ts.map +1 -0
- package/dest/fixtures/l1_to_l2_messaging.d.ts +13 -0
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -0
- package/dest/fixtures/l1_to_l2_messaging.js +1 -1
- package/dest/fixtures/logging.d.ts +8 -0
- package/dest/fixtures/logging.d.ts.map +1 -0
- package/dest/fixtures/setup_l1_contracts.d.ts +6 -0
- package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -0
- package/dest/fixtures/setup_l1_contracts.js +6 -4
- package/dest/fixtures/setup_p2p_test.d.ts +22 -0
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -0
- package/dest/fixtures/setup_p2p_test.js +5 -3
- package/dest/fixtures/snapshot_manager.d.ts +87 -0
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -0
- package/dest/fixtures/snapshot_manager.js +67 -74
- package/dest/fixtures/token_utils.d.ts +6 -0
- package/dest/fixtures/token_utils.d.ts.map +1 -0
- package/dest/fixtures/token_utils.js +1 -1
- package/dest/fixtures/utils.d.ts +155 -0
- package/dest/fixtures/utils.d.ts.map +1 -0
- package/dest/fixtures/utils.js +97 -71
- package/dest/fixtures/with_telemetry_utils.d.ts +3 -0
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -0
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/quality_of_service/alert_checker.d.ts +41 -0
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -0
- package/dest/quality_of_service/alert_checker.js +4 -1
- package/dest/sample-dapp/index.js +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +124 -0
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -0
- package/dest/shared/cross_chain_test_harness.js +6 -17
- package/dest/shared/gas_portal_test_harness.d.ts +80 -0
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -0
- package/dest/shared/gas_portal_test_harness.js +11 -4
- package/dest/shared/index.d.ts +2 -0
- package/dest/shared/index.d.ts.map +1 -0
- package/dest/shared/index.js +0 -1
- package/dest/shared/jest_setup.d.ts +2 -0
- package/dest/shared/jest_setup.d.ts.map +1 -0
- package/dest/shared/submit-transactions.d.ts +4 -0
- package/dest/shared/submit-transactions.d.ts.map +1 -0
- package/dest/shared/submit-transactions.js +9 -17
- package/dest/shared/uniswap_l1_l2.d.ts +25 -0
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -0
- package/dest/shared/uniswap_l1_l2.js +5 -10
- package/dest/simulators/index.d.ts +3 -0
- package/dest/simulators/index.d.ts.map +1 -0
- package/dest/simulators/lending_simulator.d.ts +69 -0
- package/dest/simulators/lending_simulator.d.ts.map +1 -0
- package/dest/simulators/lending_simulator.js +1 -3
- package/dest/simulators/token_simulator.d.ts +29 -0
- package/dest/simulators/token_simulator.d.ts.map +1 -0
- package/dest/spartan/setup_test_wallets.d.ts +20 -0
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -0
- package/dest/spartan/setup_test_wallets.js +72 -38
- package/dest/spartan/utils.d.ts +485 -0
- package/dest/spartan/utils.d.ts.map +1 -0
- package/dest/spartan/utils.js +110 -2
- package/package.json +35 -40
- package/src/bench/utils.ts +30 -13
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +40 -30
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +34 -18
- package/src/e2e_deploy_contract/deploy_test.ts +6 -11
- package/src/e2e_epochs/epochs_test.ts +217 -0
- package/src/e2e_fees/fees_test.ts +84 -38
- package/src/e2e_nested_contract/nested_contract_test.ts +14 -16
- package/src/e2e_p2p/p2p_network.ts +67 -47
- package/src/e2e_p2p/shared.ts +16 -10
- package/src/e2e_prover/e2e_prover_test.ts +56 -37
- package/src/e2e_token_contract/token_contract_test.ts +10 -11
- package/src/fixtures/fixtures.ts +2 -2
- package/src/fixtures/get_acvm_config.ts +7 -3
- package/src/fixtures/get_bb_config.ts +6 -2
- package/src/fixtures/l1_to_l2_messaging.ts +6 -13
- package/src/fixtures/setup_l1_contracts.ts +8 -7
- package/src/fixtures/setup_p2p_test.ts +8 -6
- package/src/fixtures/snapshot_manager.ts +72 -79
- package/src/fixtures/token_utils.ts +2 -2
- package/src/fixtures/utils.ts +135 -97
- package/src/guides/up_quick_start.sh +10 -5
- package/src/quality_of_service/alert_checker.ts +6 -2
- package/src/sample-dapp/index.mjs +1 -1
- package/src/shared/cross_chain_test_harness.ts +17 -35
- package/src/shared/gas_portal_test_harness.ts +21 -11
- package/src/shared/index.ts +0 -1
- package/src/shared/submit-transactions.ts +16 -20
- package/src/shared/uniswap_l1_l2.ts +35 -26
- package/src/simulators/lending_simulator.ts +5 -6
- package/src/simulators/token_simulator.ts +1 -1
- package/src/spartan/setup_test_wallets.ts +111 -37
- package/src/spartan/utils.ts +88 -3
- package/dest/shared/browser.js +0 -163
- package/src/shared/browser.ts +0 -272
package/dest/spartan/utils.js
CHANGED
|
@@ -6,11 +6,27 @@ import { z } from 'zod';
|
|
|
6
6
|
import { AlertChecker } from '../quality_of_service/alert_checker.js';
|
|
7
7
|
const execAsync = promisify(exec);
|
|
8
8
|
const logger = createLogger('e2e:k8s-utils');
|
|
9
|
+
const ethereumHostsSchema = z.string().refine((str)=>str.split(',').every((url)=>{
|
|
10
|
+
try {
|
|
11
|
+
new URL(url.trim());
|
|
12
|
+
return true;
|
|
13
|
+
} catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}), 'ETHEREUM_HOSTS must be a comma-separated list of valid URLs');
|
|
9
17
|
const k8sLocalConfigSchema = z.object({
|
|
18
|
+
ETHEREUM_SLOT_DURATION: z.coerce.number().min(1, 'ETHEREUM_SLOT_DURATION env variable must be set'),
|
|
19
|
+
AZTEC_SLOT_DURATION: z.coerce.number().min(1, 'AZTEC_SLOT_DURATION env variable must be set'),
|
|
20
|
+
AZTEC_EPOCH_DURATION: z.coerce.number().min(1, 'AZTEC_EPOCH_DURATION env variable must be set'),
|
|
21
|
+
AZTEC_PROOF_SUBMISSION_WINDOW: z.coerce.number().min(1, 'AZTEC_PROOF_SUBMISSION_WINDOW env variable must be set'),
|
|
10
22
|
INSTANCE_NAME: z.string().min(1, 'INSTANCE_NAME env variable must be set'),
|
|
11
23
|
NAMESPACE: z.string().min(1, 'NAMESPACE env variable must be set'),
|
|
12
24
|
HOST_NODE_PORT: z.coerce.number().min(1, 'HOST_NODE_PORT env variable must be set'),
|
|
13
25
|
CONTAINER_NODE_PORT: z.coerce.number().default(8080),
|
|
26
|
+
HOST_SEQUENCER_PORT: z.coerce.number().min(1, 'HOST_SEQUENCER_PORT env variable must be set'),
|
|
27
|
+
CONTAINER_SEQUENCER_PORT: z.coerce.number().default(8080),
|
|
28
|
+
HOST_PROVER_NODE_PORT: z.coerce.number().min(1, 'HOST_PROVER_NODE_PORT env variable must be set'),
|
|
29
|
+
CONTAINER_PROVER_NODE_PORT: z.coerce.number().default(8080),
|
|
14
30
|
HOST_PXE_PORT: z.coerce.number().min(1, 'HOST_PXE_PORT env variable must be set'),
|
|
15
31
|
CONTAINER_PXE_PORT: z.coerce.number().default(8080),
|
|
16
32
|
HOST_ETHEREUM_PORT: z.coerce.number().min(1, 'HOST_ETHEREUM_PORT env variable must be set'),
|
|
@@ -20,6 +36,9 @@ const k8sLocalConfigSchema = z.object({
|
|
|
20
36
|
GRAFANA_PASSWORD: z.string().optional(),
|
|
21
37
|
METRICS_API_PATH: z.string().default('/api/datasources/proxy/uid/spartan-metrics-prometheus/api/v1'),
|
|
22
38
|
SPARTAN_DIR: z.string().min(1, 'SPARTAN_DIR env variable must be set'),
|
|
39
|
+
ETHEREUM_HOSTS: ethereumHostsSchema.optional(),
|
|
40
|
+
L1_ACCOUNT_MNEMONIC: z.string().default('test test test test test test test test test test test junk'),
|
|
41
|
+
SEPOLIA_RUN: z.string().default('false'),
|
|
23
42
|
K8S: z.literal('local')
|
|
24
43
|
});
|
|
25
44
|
const k8sGCloudConfigSchema = k8sLocalConfigSchema.extend({
|
|
@@ -30,7 +49,7 @@ const k8sGCloudConfigSchema = k8sLocalConfigSchema.extend({
|
|
|
30
49
|
const directConfigSchema = z.object({
|
|
31
50
|
PXE_URL: z.string().url('PXE_URL must be a valid URL'),
|
|
32
51
|
NODE_URL: z.string().url('NODE_URL must be a valid URL'),
|
|
33
|
-
|
|
52
|
+
ETHEREUM_HOSTS: ethereumHostsSchema,
|
|
34
53
|
K8S: z.literal('false')
|
|
35
54
|
});
|
|
36
55
|
const envSchema = z.discriminatedUnion('K8S', [
|
|
@@ -86,7 +105,7 @@ export async function startPortForward({ resource, namespace, containerPort, hos
|
|
|
86
105
|
if (str.includes('Starting port forward')) {
|
|
87
106
|
logger.info(str);
|
|
88
107
|
} else {
|
|
89
|
-
logger.
|
|
108
|
+
logger.silent(str);
|
|
90
109
|
}
|
|
91
110
|
});
|
|
92
111
|
process.stderr?.on('data', (data)=>{
|
|
@@ -196,6 +215,26 @@ export function applyProverFailure({ namespace, spartanDir, durationSeconds, log
|
|
|
196
215
|
logger
|
|
197
216
|
});
|
|
198
217
|
}
|
|
218
|
+
export function applyProverKill({ namespace, spartanDir, logger }) {
|
|
219
|
+
return installChaosMeshChart({
|
|
220
|
+
instanceName: 'prover-kill',
|
|
221
|
+
targetNamespace: namespace,
|
|
222
|
+
valuesFile: 'prover-kill.yaml',
|
|
223
|
+
helmChartDir: getChartDir(spartanDir, 'aztec-chaos-scenarios'),
|
|
224
|
+
clean: true,
|
|
225
|
+
logger
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
export function applyProverBrokerKill({ namespace, spartanDir, logger }) {
|
|
229
|
+
return installChaosMeshChart({
|
|
230
|
+
instanceName: 'prover-broker-kill',
|
|
231
|
+
targetNamespace: namespace,
|
|
232
|
+
valuesFile: 'prover-broker-kill.yaml',
|
|
233
|
+
helmChartDir: getChartDir(spartanDir, 'aztec-chaos-scenarios'),
|
|
234
|
+
clean: true,
|
|
235
|
+
logger
|
|
236
|
+
});
|
|
237
|
+
}
|
|
199
238
|
export function applyBootNodeFailure({ namespace, spartanDir, durationSeconds, logger }) {
|
|
200
239
|
return installChaosMeshChart({
|
|
201
240
|
instanceName: 'boot-node-failure',
|
|
@@ -317,3 +356,72 @@ export async function updateSequencersConfig(env, config) {
|
|
|
317
356
|
await updateSequencerConfig(env.NODE_URL, config);
|
|
318
357
|
}
|
|
319
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* Rolls the Aztec pods in the given namespace.
|
|
361
|
+
* @param namespace - The namespace to roll the Aztec pods in.
|
|
362
|
+
* @dev - IMPORTANT: This function DOES NOT delete the underlying PVCs.
|
|
363
|
+
* This means that the pods will be restarted with the same persistent storage.
|
|
364
|
+
* This is useful for testing, but you should be aware of the implications.
|
|
365
|
+
*/ export async function rollAztecPods(namespace) {
|
|
366
|
+
await deleteResourceByLabel({
|
|
367
|
+
resource: 'pods',
|
|
368
|
+
namespace: namespace,
|
|
369
|
+
label: 'app=boot-node'
|
|
370
|
+
});
|
|
371
|
+
await deleteResourceByLabel({
|
|
372
|
+
resource: 'pods',
|
|
373
|
+
namespace: namespace,
|
|
374
|
+
label: 'app=prover-node'
|
|
375
|
+
});
|
|
376
|
+
await deleteResourceByLabel({
|
|
377
|
+
resource: 'pods',
|
|
378
|
+
namespace: namespace,
|
|
379
|
+
label: 'app=prover-broker'
|
|
380
|
+
});
|
|
381
|
+
await deleteResourceByLabel({
|
|
382
|
+
resource: 'pods',
|
|
383
|
+
namespace: namespace,
|
|
384
|
+
label: 'app=prover-agent'
|
|
385
|
+
});
|
|
386
|
+
await deleteResourceByLabel({
|
|
387
|
+
resource: 'pods',
|
|
388
|
+
namespace: namespace,
|
|
389
|
+
label: 'app=validator'
|
|
390
|
+
});
|
|
391
|
+
await deleteResourceByLabel({
|
|
392
|
+
resource: 'pods',
|
|
393
|
+
namespace: namespace,
|
|
394
|
+
label: 'app=pxe'
|
|
395
|
+
});
|
|
396
|
+
await sleep(10 * 1000);
|
|
397
|
+
await waitForResourceByLabel({
|
|
398
|
+
resource: 'pods',
|
|
399
|
+
namespace: namespace,
|
|
400
|
+
label: 'app=boot-node'
|
|
401
|
+
});
|
|
402
|
+
await waitForResourceByLabel({
|
|
403
|
+
resource: 'pods',
|
|
404
|
+
namespace: namespace,
|
|
405
|
+
label: 'app=prover-node'
|
|
406
|
+
});
|
|
407
|
+
await waitForResourceByLabel({
|
|
408
|
+
resource: 'pods',
|
|
409
|
+
namespace: namespace,
|
|
410
|
+
label: 'app=prover-broker'
|
|
411
|
+
});
|
|
412
|
+
await waitForResourceByLabel({
|
|
413
|
+
resource: 'pods',
|
|
414
|
+
namespace: namespace,
|
|
415
|
+
label: 'app=prover-agent'
|
|
416
|
+
});
|
|
417
|
+
await waitForResourceByLabel({
|
|
418
|
+
resource: 'pods',
|
|
419
|
+
namespace: namespace,
|
|
420
|
+
label: 'app=validator'
|
|
421
|
+
});
|
|
422
|
+
await waitForResourceByLabel({
|
|
423
|
+
resource: 'pods',
|
|
424
|
+
namespace: namespace,
|
|
425
|
+
label: 'app=pxe'
|
|
426
|
+
});
|
|
427
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/end-to-end",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.77.0-testnet-ignition.17",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"inherits": [
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
"./package.local.json"
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "yarn clean && tsc -b
|
|
12
|
-
"build:e2e": "yarn clean && tsc -b",
|
|
11
|
+
"build": "yarn clean && tsc -b",
|
|
13
12
|
"build:dev": "tsc -b --watch",
|
|
14
13
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
15
14
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
@@ -27,36 +26,36 @@
|
|
|
27
26
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|
|
30
|
-
"@aztec/accounts": "0.
|
|
31
|
-
"@aztec/archiver": "0.
|
|
32
|
-
"@aztec/aztec
|
|
33
|
-
"@aztec/aztec
|
|
34
|
-
"@aztec/
|
|
35
|
-
"@aztec/
|
|
36
|
-
"@aztec/blob-
|
|
37
|
-
"@aztec/
|
|
38
|
-
"@aztec/
|
|
39
|
-
"@aztec/
|
|
40
|
-
"@aztec/entrypoints": "0.
|
|
41
|
-
"@aztec/epoch-cache": "0.
|
|
42
|
-
"@aztec/ethereum": "0.
|
|
43
|
-
"@aztec/foundation": "0.
|
|
44
|
-
"@aztec/kv-store": "0.
|
|
45
|
-
"@aztec/l1-artifacts": "0.
|
|
46
|
-
"@aztec/merkle-tree": "0.
|
|
47
|
-
"@aztec/noir-contracts.js": "0.
|
|
48
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
49
|
-
"@aztec/p2p": "0.
|
|
50
|
-
"@aztec/protocol-contracts": "0.
|
|
51
|
-
"@aztec/prover-client": "0.
|
|
52
|
-
"@aztec/prover-node": "0.
|
|
53
|
-
"@aztec/pxe": "0.
|
|
54
|
-
"@aztec/sequencer-client": "0.
|
|
55
|
-
"@aztec/simulator": "0.
|
|
56
|
-
"@aztec/
|
|
57
|
-
"@aztec/
|
|
58
|
-
"@aztec/validator-client": "0.
|
|
59
|
-
"@aztec/world-state": "0.
|
|
29
|
+
"@aztec/accounts": "0.77.0-testnet-ignition.17",
|
|
30
|
+
"@aztec/archiver": "0.77.0-testnet-ignition.17",
|
|
31
|
+
"@aztec/aztec": "0.77.0-testnet-ignition.17",
|
|
32
|
+
"@aztec/aztec-node": "0.77.0-testnet-ignition.17",
|
|
33
|
+
"@aztec/aztec.js": "0.77.0-testnet-ignition.17",
|
|
34
|
+
"@aztec/bb-prover": "0.77.0-testnet-ignition.17",
|
|
35
|
+
"@aztec/blob-lib": "0.77.0-testnet-ignition.17",
|
|
36
|
+
"@aztec/blob-sink": "0.77.0-testnet-ignition.17",
|
|
37
|
+
"@aztec/bot": "0.77.0-testnet-ignition.17",
|
|
38
|
+
"@aztec/constants": "0.77.0-testnet-ignition.17",
|
|
39
|
+
"@aztec/entrypoints": "0.77.0-testnet-ignition.17",
|
|
40
|
+
"@aztec/epoch-cache": "0.77.0-testnet-ignition.17",
|
|
41
|
+
"@aztec/ethereum": "0.77.0-testnet-ignition.17",
|
|
42
|
+
"@aztec/foundation": "0.77.0-testnet-ignition.17",
|
|
43
|
+
"@aztec/kv-store": "0.77.0-testnet-ignition.17",
|
|
44
|
+
"@aztec/l1-artifacts": "0.77.0-testnet-ignition.17",
|
|
45
|
+
"@aztec/merkle-tree": "0.77.0-testnet-ignition.17",
|
|
46
|
+
"@aztec/noir-contracts.js": "0.77.0-testnet-ignition.17",
|
|
47
|
+
"@aztec/noir-protocol-circuits-types": "0.77.0-testnet-ignition.17",
|
|
48
|
+
"@aztec/p2p": "0.77.0-testnet-ignition.17",
|
|
49
|
+
"@aztec/protocol-contracts": "0.77.0-testnet-ignition.17",
|
|
50
|
+
"@aztec/prover-client": "0.77.0-testnet-ignition.17",
|
|
51
|
+
"@aztec/prover-node": "0.77.0-testnet-ignition.17",
|
|
52
|
+
"@aztec/pxe": "0.77.0-testnet-ignition.17",
|
|
53
|
+
"@aztec/sequencer-client": "0.77.0-testnet-ignition.17",
|
|
54
|
+
"@aztec/simulator": "0.77.0-testnet-ignition.17",
|
|
55
|
+
"@aztec/stdlib": "0.77.0-testnet-ignition.17",
|
|
56
|
+
"@aztec/telemetry-client": "0.77.0-testnet-ignition.17",
|
|
57
|
+
"@aztec/validator-client": "0.77.0-testnet-ignition.17",
|
|
58
|
+
"@aztec/world-state": "0.77.0-testnet-ignition.17",
|
|
60
59
|
"@iarna/toml": "^2.2.5",
|
|
61
60
|
"@jest/globals": "^29.5.0",
|
|
62
61
|
"@noble/curves": "^1.0.0",
|
|
@@ -85,6 +84,7 @@
|
|
|
85
84
|
"lodash.chunk": "^4.2.0",
|
|
86
85
|
"lodash.compact": "^3.0.1",
|
|
87
86
|
"lodash.every": "^4.6.0",
|
|
87
|
+
"lodash.omit": "^4.5.0",
|
|
88
88
|
"memdown": "^6.1.1",
|
|
89
89
|
"process": "^0.11.10",
|
|
90
90
|
"stream-browserify": "^3.0.0",
|
|
@@ -145,19 +145,14 @@
|
|
|
145
145
|
]
|
|
146
146
|
},
|
|
147
147
|
"reporters": [
|
|
148
|
-
|
|
149
|
-
"summary",
|
|
150
|
-
{
|
|
151
|
-
"summaryThreshold": 0
|
|
152
|
-
}
|
|
153
|
-
]
|
|
148
|
+
"default"
|
|
154
149
|
],
|
|
155
150
|
"moduleNameMapper": {
|
|
156
151
|
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
157
152
|
},
|
|
158
153
|
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
159
154
|
"rootDir": "./src",
|
|
160
|
-
"testTimeout":
|
|
155
|
+
"testTimeout": 120000,
|
|
161
156
|
"setupFiles": [
|
|
162
157
|
"../../foundation/src/jest/setup.mjs"
|
|
163
158
|
]
|
package/src/bench/utils.ts
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AztecNodeService } from '@aztec/aztec-node';
|
|
2
2
|
import { type AztecNode, BatchCall, INITIAL_L2_BLOCK_NUM, type SentTx, type WaitOpts } from '@aztec/aztec.js';
|
|
3
3
|
import { mean, stdDev, timesParallel } from '@aztec/foundation/collection';
|
|
4
4
|
import { randomInt } from '@aztec/foundation/crypto';
|
|
5
5
|
import { BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking';
|
|
6
6
|
import { type PXEService, type PXEServiceConfig, createPXEService } from '@aztec/pxe';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
type BenchmarkDataPoint,
|
|
10
|
-
type BenchmarkMetricsType,
|
|
11
|
-
type BenchmarkTelemetryClient,
|
|
12
|
-
} from '@aztec/telemetry-client/bench';
|
|
7
|
+
import type { MetricsType } from '@aztec/telemetry-client';
|
|
8
|
+
import type { BenchmarkDataPoint, BenchmarkMetricsType, BenchmarkTelemetryClient } from '@aztec/telemetry-client/bench';
|
|
13
9
|
|
|
14
10
|
import { writeFileSync } from 'fs';
|
|
15
11
|
import { mkdirpSync } from 'fs-extra';
|
|
@@ -127,15 +123,27 @@ export function getFolderSize(path: string): number {
|
|
|
127
123
|
* @param index - Index of the call within a block.
|
|
128
124
|
* @param context - End to end context.
|
|
129
125
|
* @param contract - Benchmarking contract.
|
|
126
|
+
* @param heavyPublicCompute - Whether the transactions include heavy public compute (like a big sha256).
|
|
130
127
|
* @returns A BatchCall instance.
|
|
131
128
|
*/
|
|
132
|
-
export async function makeCall(
|
|
129
|
+
export async function makeCall(
|
|
130
|
+
index: number,
|
|
131
|
+
context: EndToEndContext,
|
|
132
|
+
contract: BenchmarkingContract,
|
|
133
|
+
heavyPublicCompute: boolean,
|
|
134
|
+
) {
|
|
133
135
|
const owner = context.wallet.getAddress();
|
|
134
136
|
const sender = owner;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
if (heavyPublicCompute) {
|
|
138
|
+
return new BatchCall(context.wallet, [
|
|
139
|
+
await contract.methods.sha256_hash_2048(randomBytesAsBigInts(2048)).request(),
|
|
140
|
+
]);
|
|
141
|
+
} else {
|
|
142
|
+
return new BatchCall(context.wallet, [
|
|
143
|
+
await contract.methods.create_note(owner, sender, index + 1).request(),
|
|
144
|
+
await contract.methods.increment_balance(owner, index + 1).request(),
|
|
145
|
+
]);
|
|
146
|
+
}
|
|
139
147
|
}
|
|
140
148
|
|
|
141
149
|
/**
|
|
@@ -144,14 +152,16 @@ export async function makeCall(index: number, context: EndToEndContext, contract
|
|
|
144
152
|
* @param txCount - How many txs to send
|
|
145
153
|
* @param context - End to end context.
|
|
146
154
|
* @param contract - Target contract.
|
|
155
|
+
* @param heavyPublicCompute - Whether the transactions include heavy public compute (like a big sha256).
|
|
147
156
|
* @returns Array of sent txs.
|
|
148
157
|
*/
|
|
149
158
|
export async function sendTxs(
|
|
150
159
|
txCount: number,
|
|
151
160
|
context: EndToEndContext,
|
|
152
161
|
contract: BenchmarkingContract,
|
|
162
|
+
heavyPublicCompute: boolean = false,
|
|
153
163
|
): Promise<SentTx[]> {
|
|
154
|
-
const calls = await timesParallel(txCount, index => makeCall(index, context, contract));
|
|
164
|
+
const calls = await timesParallel(txCount, index => makeCall(index, context, contract, heavyPublicCompute));
|
|
155
165
|
context.logger.info(`Creating ${txCount} txs`);
|
|
156
166
|
const provenTxs = await Promise.all(calls.map(call => call.prove({ skipPublicSimulation: true })));
|
|
157
167
|
context.logger.info(`Sending ${txCount} txs`);
|
|
@@ -177,14 +187,21 @@ export async function createNewPXE(
|
|
|
177
187
|
startingBlock: number = INITIAL_L2_BLOCK_NUM,
|
|
178
188
|
): Promise<PXEService> {
|
|
179
189
|
const l1Contracts = await node.getL1ContractAddresses();
|
|
190
|
+
const { l1ChainId, protocolVersion } = await node.getNodeInfo();
|
|
180
191
|
const pxeConfig = {
|
|
181
192
|
l2StartingBlock: startingBlock,
|
|
182
193
|
l2BlockPollingIntervalMS: 100,
|
|
183
194
|
dataDirectory: undefined,
|
|
184
195
|
dataStoreMapSizeKB: 1024 * 1024,
|
|
185
196
|
l1Contracts,
|
|
197
|
+
l1ChainId,
|
|
198
|
+
version: protocolVersion,
|
|
186
199
|
} as PXEServiceConfig;
|
|
187
200
|
const pxe = await createPXEService(node, pxeConfig);
|
|
188
201
|
await pxe.registerContract(contract);
|
|
189
202
|
return pxe;
|
|
190
203
|
}
|
|
204
|
+
|
|
205
|
+
function randomBytesAsBigInts(length: number): bigint[] {
|
|
206
|
+
return [...Array(length)].map(_ => BigInt(Math.floor(Math.random() * 255)));
|
|
207
|
+
}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getSchnorrWallet } from '@aztec/accounts/schnorr';
|
|
2
2
|
import {
|
|
3
3
|
type AccountWallet,
|
|
4
4
|
type CompleteAddress,
|
|
5
|
-
ExtendedNote,
|
|
6
5
|
Fr,
|
|
7
6
|
type Logger,
|
|
8
|
-
Note,
|
|
9
7
|
type TxHash,
|
|
10
8
|
computeSecretHash,
|
|
11
9
|
createLogger,
|
|
12
10
|
} from '@aztec/aztec.js';
|
|
11
|
+
import { MAX_NOTE_HASHES_PER_TX } from '@aztec/constants';
|
|
13
12
|
import { DocsExampleContract } from '@aztec/noir-contracts.js/DocsExample';
|
|
14
|
-
import {
|
|
13
|
+
import type { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
15
14
|
import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist';
|
|
16
15
|
|
|
17
16
|
import { jest } from '@jest/globals';
|
|
@@ -19,8 +18,8 @@ import { jest } from '@jest/globals';
|
|
|
19
18
|
import {
|
|
20
19
|
type ISnapshotManager,
|
|
21
20
|
type SubsystemsContext,
|
|
22
|
-
addAccounts,
|
|
23
21
|
createSnapshotManager,
|
|
22
|
+
deployAccounts,
|
|
24
23
|
publicDeployAccounts,
|
|
25
24
|
} from '../fixtures/snapshot_manager.js';
|
|
26
25
|
import { TokenSimulator } from '../simulators/token_simulator.js';
|
|
@@ -91,18 +90,17 @@ export class BlacklistTokenContractTest {
|
|
|
91
90
|
// Adding a timeout of 2 minutes in here such that it is propagated to the underlying tests
|
|
92
91
|
jest.setTimeout(120_000);
|
|
93
92
|
|
|
94
|
-
await this.snapshotManager.snapshot(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
});
|
|
93
|
+
await this.snapshotManager.snapshot(
|
|
94
|
+
'3_accounts',
|
|
95
|
+
deployAccounts(3, this.logger),
|
|
96
|
+
async ({ deployedAccounts }, { pxe }) => {
|
|
97
|
+
this.wallets = await Promise.all(deployedAccounts.map(a => getSchnorrWallet(pxe, a.address, a.signingKey)));
|
|
98
|
+
this.admin = this.wallets[0];
|
|
99
|
+
this.other = this.wallets[1];
|
|
100
|
+
this.blacklisted = this.wallets[2];
|
|
101
|
+
this.accounts = this.wallets.map(w => w.getCompleteAddress());
|
|
102
|
+
},
|
|
103
|
+
);
|
|
106
104
|
|
|
107
105
|
await this.snapshotManager.snapshot(
|
|
108
106
|
'e2e_blacklist_token_contract',
|
|
@@ -160,24 +158,36 @@ export class BlacklistTokenContractTest {
|
|
|
160
158
|
await this.snapshotManager.teardown();
|
|
161
159
|
}
|
|
162
160
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
161
|
+
#toBoundedVec(arr: Fr[], maxLen: number) {
|
|
162
|
+
return { len: arr.length, storage: arr.concat(new Array(maxLen - arr.length).fill(new Fr(0))) };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async addPendingShieldNoteToPXE(
|
|
166
|
+
contract: TokenBlacklistContract,
|
|
167
|
+
wallet: AccountWallet,
|
|
168
|
+
amount: bigint,
|
|
169
|
+
secretHash: Fr,
|
|
170
|
+
txHash: TxHash,
|
|
171
|
+
) {
|
|
172
|
+
const txEffects = await wallet.getTxEffect(txHash);
|
|
173
|
+
await contract.methods
|
|
174
|
+
.deliver_transparent_note(
|
|
175
|
+
contract.address,
|
|
176
|
+
amount,
|
|
177
|
+
secretHash,
|
|
178
|
+
txHash.hash,
|
|
179
|
+
this.#toBoundedVec(txEffects!.data.noteHashes, MAX_NOTE_HASHES_PER_TX),
|
|
180
|
+
txEffects!.data.nullifiers[0],
|
|
181
|
+
wallet.getAddress(),
|
|
182
|
+
)
|
|
183
|
+
.simulate();
|
|
174
184
|
}
|
|
175
185
|
|
|
176
186
|
async applyMintSnapshot() {
|
|
177
187
|
await this.snapshotManager.snapshot(
|
|
178
188
|
'mint',
|
|
179
189
|
async () => {
|
|
180
|
-
const { asset, accounts } = this;
|
|
190
|
+
const { asset, accounts, wallets } = this;
|
|
181
191
|
const amount = 10000n;
|
|
182
192
|
|
|
183
193
|
const adminMinterRole = new Role().withAdmin().withMinter();
|
|
@@ -208,7 +218,7 @@ export class BlacklistTokenContractTest {
|
|
|
208
218
|
const secretHash = await computeSecretHash(secret);
|
|
209
219
|
const receipt = await asset.methods.mint_private(amount, secretHash).send().wait();
|
|
210
220
|
|
|
211
|
-
await this.addPendingShieldNoteToPXE(0, amount, secretHash, receipt.txHash);
|
|
221
|
+
await this.addPendingShieldNoteToPXE(asset, wallets[0], amount, secretHash, receipt.txHash);
|
|
212
222
|
const txClaim = asset.methods.redeem_shield(accounts[0].address, amount, secret).send();
|
|
213
223
|
await txClaim.wait({ debug: true });
|
|
214
224
|
this.logger.verbose(`Minting complete.`);
|
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { getSchnorrWallet } from '@aztec/accounts/schnorr';
|
|
2
|
+
import type { AztecNodeConfig } from '@aztec/aztec-node';
|
|
3
3
|
import {
|
|
4
4
|
type AccountWallet,
|
|
5
5
|
AztecAddress,
|
|
6
6
|
type AztecNode,
|
|
7
|
+
CheatCodes,
|
|
7
8
|
type CompleteAddress,
|
|
8
9
|
EthAddress,
|
|
9
10
|
type Logger,
|
|
10
11
|
type PXE,
|
|
11
12
|
createLogger,
|
|
12
13
|
} from '@aztec/aztec.js';
|
|
13
|
-
import { createL1Clients } from '@aztec/ethereum';
|
|
14
|
-
import { InboxAbi, OutboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
14
|
+
import { type ViemPublicClient, createL1Clients, deployL1Contract } from '@aztec/ethereum';
|
|
15
|
+
import { InboxAbi, OutboxAbi, RollupAbi, TestERC20Abi, TestERC20Bytecode } from '@aztec/l1-artifacts';
|
|
15
16
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
16
17
|
import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge';
|
|
17
18
|
|
|
18
|
-
import {
|
|
19
|
+
import { getContract } from 'viem';
|
|
19
20
|
|
|
20
21
|
import { MNEMONIC } from '../fixtures/fixtures.js';
|
|
21
22
|
import {
|
|
22
23
|
type ISnapshotManager,
|
|
23
24
|
type SubsystemsContext,
|
|
24
|
-
addAccounts,
|
|
25
25
|
createSnapshotManager,
|
|
26
|
+
deployAccounts,
|
|
26
27
|
publicDeployAccounts,
|
|
27
28
|
} from '../fixtures/snapshot_manager.js';
|
|
28
29
|
import { CrossChainTestHarness } from '../shared/cross_chain_test_harness.js';
|
|
@@ -38,7 +39,7 @@ export class CrossChainMessagingTest {
|
|
|
38
39
|
pxe!: PXE;
|
|
39
40
|
aztecNodeConfig!: AztecNodeConfig;
|
|
40
41
|
|
|
41
|
-
publicClient!:
|
|
42
|
+
publicClient!: ViemPublicClient | undefined;
|
|
42
43
|
|
|
43
44
|
user1Wallet!: AccountWallet;
|
|
44
45
|
user2Wallet!: AccountWallet;
|
|
@@ -51,6 +52,7 @@ export class CrossChainMessagingTest {
|
|
|
51
52
|
rollup!: any; // GetContractReturnType<typeof RollupAbi> | undefined;
|
|
52
53
|
inbox!: any; // GetContractReturnType<typeof InboxAbi> | undefined;
|
|
53
54
|
outbox!: any; // GetContractReturnType<typeof OutboxAbi> | undefined;
|
|
55
|
+
cheatcodes!: CheatCodes;
|
|
54
56
|
|
|
55
57
|
constructor(testName: string) {
|
|
56
58
|
this.logger = createLogger(`e2e:e2e_cross_chain_messaging:${testName}`);
|
|
@@ -58,7 +60,7 @@ export class CrossChainMessagingTest {
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
async assumeProven() {
|
|
61
|
-
await this.rollup.
|
|
63
|
+
await this.cheatcodes.rollup.markAsProven(await this.rollup.read.getPendingBlockNumber());
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
async setup() {
|
|
@@ -66,6 +68,7 @@ export class CrossChainMessagingTest {
|
|
|
66
68
|
this.aztecNode = aztecNode;
|
|
67
69
|
this.pxe = pxe;
|
|
68
70
|
this.aztecNodeConfig = aztecNodeConfig;
|
|
71
|
+
this.cheatcodes = await CheatCodes.create(this.aztecNodeConfig.l1RpcUrls, this.pxe);
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
snapshot = <T>(
|
|
@@ -84,14 +87,9 @@ export class CrossChainMessagingTest {
|
|
|
84
87
|
|
|
85
88
|
await this.snapshotManager.snapshot(
|
|
86
89
|
'3_accounts',
|
|
87
|
-
|
|
88
|
-
async ({
|
|
89
|
-
this.wallets = await Promise.all(
|
|
90
|
-
accountKeys.map(async ak => {
|
|
91
|
-
const account = await getSchnorrAccount(pxe, ak[0], ak[1], 1);
|
|
92
|
-
return account.getWallet();
|
|
93
|
-
}),
|
|
94
|
-
);
|
|
90
|
+
deployAccounts(3, this.logger),
|
|
91
|
+
async ({ deployedAccounts }, { pxe, aztecNodeConfig, aztecNode, deployL1ContractsValues }) => {
|
|
92
|
+
this.wallets = await Promise.all(deployedAccounts.map(a => getSchnorrWallet(pxe, a.address, a.signingKey)));
|
|
95
93
|
this.accounts = this.wallets.map(w => w.getCompleteAddress());
|
|
96
94
|
this.wallets.forEach((w, i) => this.logger.verbose(`Wallet ${i} address: ${w.getAddress()}`));
|
|
97
95
|
|
|
@@ -118,7 +116,24 @@ export class CrossChainMessagingTest {
|
|
|
118
116
|
this.logger.verbose(`Public deploy accounts...`);
|
|
119
117
|
await publicDeployAccounts(this.wallets[0], this.accounts.slice(0, 3));
|
|
120
118
|
|
|
121
|
-
const { publicClient, walletClient } = createL1Clients(this.aztecNodeConfig.
|
|
119
|
+
const { publicClient, walletClient } = createL1Clients(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
|
|
120
|
+
|
|
121
|
+
const underlyingERC20Address = await deployL1Contract(
|
|
122
|
+
walletClient,
|
|
123
|
+
publicClient,
|
|
124
|
+
TestERC20Abi,
|
|
125
|
+
TestERC20Bytecode,
|
|
126
|
+
['Underlying', 'UND', walletClient.account.address],
|
|
127
|
+
).then(({ address }) => address);
|
|
128
|
+
|
|
129
|
+
const underlyingERC20 = getContract({
|
|
130
|
+
address: underlyingERC20Address!.toString(),
|
|
131
|
+
abi: TestERC20Abi,
|
|
132
|
+
client: walletClient,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// allow anyone to mint
|
|
136
|
+
await underlyingERC20.write.setFreeForAll([true], {} as any);
|
|
122
137
|
|
|
123
138
|
this.logger.verbose(`Setting up cross chain harness...`);
|
|
124
139
|
this.crossChainTestHarness = await CrossChainTestHarness.new(
|
|
@@ -128,6 +143,7 @@ export class CrossChainMessagingTest {
|
|
|
128
143
|
walletClient,
|
|
129
144
|
this.wallets[0],
|
|
130
145
|
this.logger,
|
|
146
|
+
underlyingERC20Address,
|
|
131
147
|
);
|
|
132
148
|
|
|
133
149
|
this.logger.verbose(`L2 token deployed to: ${this.crossChainTestHarness.l2Token.address}`);
|
|
@@ -143,7 +159,7 @@ export class CrossChainMessagingTest {
|
|
|
143
159
|
this.ownerAddress = AztecAddress.fromString(crossChainContext.ownerAddress.toString());
|
|
144
160
|
const tokenPortalAddress = EthAddress.fromString(crossChainContext.tokenPortal.toString());
|
|
145
161
|
|
|
146
|
-
const { publicClient, walletClient } = createL1Clients(this.aztecNodeConfig.
|
|
162
|
+
const { publicClient, walletClient } = createL1Clients(this.aztecNodeConfig.l1RpcUrls, MNEMONIC);
|
|
147
163
|
|
|
148
164
|
const inbox = getContract({
|
|
149
165
|
address: this.aztecNodeConfig.l1Contracts.inboxAddress.toString(),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getSchnorrWallet } from '@aztec/accounts/schnorr';
|
|
2
2
|
import {
|
|
3
3
|
type AccountWallet,
|
|
4
4
|
type AztecAddress,
|
|
@@ -13,9 +13,9 @@ import {
|
|
|
13
13
|
createLogger,
|
|
14
14
|
getContractInstanceFromDeployParams,
|
|
15
15
|
} from '@aztec/aztec.js';
|
|
16
|
-
import {
|
|
16
|
+
import type { StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest';
|
|
17
17
|
|
|
18
|
-
import { type ISnapshotManager,
|
|
18
|
+
import { type ISnapshotManager, createSnapshotManager, deployAccounts } from '../fixtures/snapshot_manager.js';
|
|
19
19
|
|
|
20
20
|
const { E2E_DATA_PATH: dataPath } = process.env;
|
|
21
21
|
|
|
@@ -47,14 +47,9 @@ export class DeployTest {
|
|
|
47
47
|
private async applyInitialAccountSnapshot() {
|
|
48
48
|
await this.snapshotManager.snapshot(
|
|
49
49
|
'initial_account',
|
|
50
|
-
|
|
51
|
-
async ({
|
|
52
|
-
this.wallets = await Promise.all(
|
|
53
|
-
accountKeys.map(async ak => {
|
|
54
|
-
const account = await getSchnorrAccount(pxe, ak[0], ak[1], 1);
|
|
55
|
-
return account.getWallet();
|
|
56
|
-
}),
|
|
57
|
-
);
|
|
50
|
+
deployAccounts(1, this.logger),
|
|
51
|
+
async ({ deployedAccounts }, { pxe }) => {
|
|
52
|
+
this.wallets = await Promise.all(deployedAccounts.map(a => getSchnorrWallet(pxe, a.address, a.signingKey)));
|
|
58
53
|
this.wallets.forEach((w, i) => this.logger.verbose(`Wallet ${i} address: ${w.getAddress()}`));
|
|
59
54
|
this.wallet = this.wallets[0];
|
|
60
55
|
},
|