@aztec/end-to-end 0.0.0-test.1 → 0.0.1-commit.24de95ac
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 +61 -0
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
- package/dest/bench/client_flows/benchmark.js +261 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +73 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
- package/dest/bench/client_flows/client_flows_benchmark.js +311 -0
- package/dest/bench/client_flows/config.d.ts +14 -0
- package/dest/bench/client_flows/config.d.ts.map +1 -0
- package/dest/bench/client_flows/config.js +106 -0
- package/dest/bench/client_flows/data_extractor.d.ts +2 -0
- package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
- package/dest/bench/client_flows/data_extractor.js +99 -0
- package/dest/bench/utils.d.ts +10 -36
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +26 -66
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +20 -12
- 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 +85 -57
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +18 -24
- 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 +48 -69
- package/dest/e2e_deploy_contract/deploy_test.d.ts +14 -6
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +13 -19
- package/dest/e2e_epochs/epochs_test.d.ts +58 -17
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +224 -43
- package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
- package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
- package/dest/e2e_fees/bridging_race.notest.js +63 -0
- package/dest/e2e_fees/fees_test.d.ts +20 -9
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +98 -107
- package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
- package/dest/e2e_l1_publisher/write_json.js +57 -0
- package/dest/e2e_multi_validator/utils.d.ts +12 -0
- package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
- package/dest/e2e_multi_validator/utils.js +214 -0
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +9 -6
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +22 -19
- 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 +135 -0
- package/dest/e2e_p2p/p2p_network.d.ts +69 -22
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +180 -129
- package/dest/e2e_p2p/shared.d.ts +41 -5
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +163 -19
- package/dest/e2e_token_contract/token_contract_test.d.ts +11 -5
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +50 -26
- package/dest/{e2e_prover → fixtures}/e2e_prover_test.d.ts +14 -9
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
- package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +95 -100
- package/dest/fixtures/fixtures.d.ts +5 -6
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +4 -3
- package/dest/fixtures/get_acvm_config.d.ts +1 -1
- package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
- package/dest/fixtures/get_acvm_config.js +2 -14
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/get_bb_config.js +10 -17
- package/dest/fixtures/l1_to_l2_messaging.d.ts +8 -5
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +44 -18
- package/dest/fixtures/setup_l1_contracts.d.ts +3 -3
- package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
- package/dest/fixtures/setup_l1_contracts.js +4 -4
- package/dest/fixtures/setup_p2p_test.d.ts +14 -13
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +73 -21
- package/dest/fixtures/snapshot_manager.d.ts +15 -7
- package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
- package/dest/fixtures/snapshot_manager.js +147 -121
- package/dest/fixtures/token_utils.d.ts +6 -3
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +23 -10
- package/dest/fixtures/utils.d.ts +76 -37
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +464 -368
- 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/quality_of_service/alert_checker.d.ts +1 -1
- package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts +41 -25
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +104 -50
- package/dest/shared/gas_portal_test_harness.d.ts +32 -24
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +50 -29
- package/dest/shared/jest_setup.js +1 -1
- package/dest/shared/submit-transactions.d.ts +5 -3
- 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 -11
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +138 -108
- package/dest/simulators/lending_simulator.d.ts +6 -6
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +13 -16
- package/dest/simulators/token_simulator.d.ts +5 -2
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +16 -13
- package/dest/spartan/setup_test_wallets.d.ts +23 -10
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +167 -58
- package/dest/spartan/utils.d.ts +106 -303
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +434 -130
- package/package.json +61 -56
- package/src/bench/client_flows/benchmark.ts +341 -0
- package/src/bench/client_flows/client_flows_benchmark.ts +402 -0
- package/src/bench/client_flows/config.ts +61 -0
- package/src/bench/client_flows/data_extractor.ts +111 -0
- package/src/bench/utils.ts +22 -76
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +63 -105
- package/src/e2e_deploy_contract/deploy_test.ts +23 -38
- package/src/e2e_epochs/epochs_test.ts +274 -54
- package/src/e2e_fees/bridging_race.notest.ts +80 -0
- package/src/e2e_fees/fees_test.ts +137 -136
- package/src/e2e_l1_publisher/write_json.ts +76 -0
- package/src/e2e_multi_validator/utils.ts +258 -0
- package/src/e2e_nested_contract/nested_contract_test.ts +27 -18
- package/src/e2e_p2p/inactivity_slash_test.ts +178 -0
- package/src/e2e_p2p/p2p_network.ts +272 -166
- package/src/e2e_p2p/shared.ts +244 -29
- package/src/e2e_token_contract/token_contract_test.ts +43 -39
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +101 -145
- package/src/fixtures/fixtures.ts +4 -3
- package/src/fixtures/get_acvm_config.ts +3 -11
- package/src/fixtures/get_bb_config.ts +18 -13
- package/src/fixtures/l1_to_l2_messaging.ts +53 -23
- package/src/fixtures/setup_l1_contracts.ts +6 -7
- package/src/fixtures/setup_p2p_test.ts +112 -38
- package/src/fixtures/snapshot_manager.ts +187 -139
- package/src/fixtures/token_utils.ts +29 -12
- package/src/fixtures/utils.ts +552 -425
- package/src/fixtures/web3signer.ts +63 -0
- package/src/guides/up_quick_start.sh +6 -14
- package/src/quality_of_service/alert_checker.ts +1 -1
- package/src/shared/cross_chain_test_harness.ts +108 -79
- package/src/shared/gas_portal_test_harness.ts +58 -49
- package/src/shared/jest_setup.ts +1 -1
- package/src/shared/submit-transactions.ts +12 -8
- package/src/shared/uniswap_l1_l2.ts +173 -176
- package/src/simulators/lending_simulator.ts +12 -15
- package/src/simulators/token_simulator.ts +21 -13
- package/src/spartan/DEVELOP.md +121 -0
- package/src/spartan/setup_test_wallets.ts +215 -93
- package/src/spartan/utils.ts +490 -130
- package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
- package/dest/sample-dapp/connect.js +0 -12
- package/dest/sample-dapp/contracts.js +0 -10
- package/dest/sample-dapp/deploy.js +0 -35
- package/dest/sample-dapp/index.js +0 -98
- package/src/sample-dapp/connect.mjs +0 -16
- package/src/sample-dapp/contracts.mjs +0 -14
- package/src/sample-dapp/deploy.mjs +0 -40
- package/src/sample-dapp/index.mjs +0 -128
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
// Convenience struct to hold an account's address and secret that can easily be passed around.
|
|
2
|
-
import { AztecAddress
|
|
2
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
4
|
+
import { CheatCodes } from '@aztec/aztec/testing';
|
|
5
|
+
import type { RollupContract } from '@aztec/ethereum';
|
|
3
6
|
import { pedersenHash } from '@aztec/foundation/crypto';
|
|
4
7
|
import type { TestDateProvider } from '@aztec/foundation/timer';
|
|
5
|
-
import type { RollupAbi } from '@aztec/l1-artifacts';
|
|
6
8
|
import type { LendingContract } from '@aztec/noir-contracts.js/Lending';
|
|
7
9
|
|
|
8
|
-
import type { Account, GetContractReturnType, HttpTransport, WalletClient } from 'viem';
|
|
9
|
-
import type * as chains from 'viem/chains';
|
|
10
|
-
|
|
11
10
|
import type { TokenSimulator } from './token_simulator.js';
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -83,7 +82,7 @@ export class LendingSimulator {
|
|
|
83
82
|
private rate: bigint,
|
|
84
83
|
private ethereumSlotDuration: number,
|
|
85
84
|
/** the rollup contract */
|
|
86
|
-
public rollup:
|
|
85
|
+
public rollup: RollupContract,
|
|
87
86
|
/** the lending contract */
|
|
88
87
|
public lendingContract: LendingContract,
|
|
89
88
|
/** the collateral asset used in the lending contract */
|
|
@@ -94,10 +93,8 @@ export class LendingSimulator {
|
|
|
94
93
|
|
|
95
94
|
async prepare() {
|
|
96
95
|
this.accumulator = BASE;
|
|
97
|
-
const slot = await this.rollup.
|
|
98
|
-
|
|
99
|
-
]);
|
|
100
|
-
this.time = Number(await this.rollup.read.getTimestampForSlot([slot]));
|
|
96
|
+
const slot = await this.rollup.getSlotAt(BigInt(await this.cc.eth.timestamp()) + BigInt(this.ethereumSlotDuration));
|
|
97
|
+
this.time = Number(await this.rollup.getTimestampForSlot(slot));
|
|
101
98
|
}
|
|
102
99
|
|
|
103
100
|
async progressSlots(diff: number, dateProvider?: TestDateProvider) {
|
|
@@ -105,8 +102,8 @@ export class LendingSimulator {
|
|
|
105
102
|
return;
|
|
106
103
|
}
|
|
107
104
|
|
|
108
|
-
const slot = await this.rollup.
|
|
109
|
-
const ts = Number(await this.rollup.
|
|
105
|
+
const slot = await this.rollup.getSlotAt(BigInt(await this.cc.eth.timestamp()));
|
|
106
|
+
const ts = Number(await this.rollup.getTimestampForSlot(slot + BigInt(diff)));
|
|
110
107
|
const timeDiff = ts - this.time;
|
|
111
108
|
this.time = ts;
|
|
112
109
|
|
|
@@ -115,7 +112,7 @@ export class LendingSimulator {
|
|
|
115
112
|
if (dateProvider) {
|
|
116
113
|
dateProvider.setTime(this.time * 1000);
|
|
117
114
|
}
|
|
118
|
-
await this.cc.rollup.markAsProven(await this.rollup.
|
|
115
|
+
await this.cc.rollup.markAsProven(await this.rollup.getBlockNumber());
|
|
119
116
|
this.accumulator = muldivDown(this.accumulator, computeMultiplier(this.rate, BigInt(timeDiff)), BASE);
|
|
120
117
|
}
|
|
121
118
|
|
|
@@ -187,14 +184,14 @@ export class LendingSimulator {
|
|
|
187
184
|
|
|
188
185
|
expect(this.borrowed).toEqual(this.stableCoin.totalSupply - this.mintedOutside);
|
|
189
186
|
|
|
190
|
-
const asset = await this.lendingContract.methods.get_asset(0).simulate();
|
|
187
|
+
const asset = await this.lendingContract.methods.get_asset(0).simulate({ from: this.account.address });
|
|
191
188
|
|
|
192
189
|
const interestAccumulator = asset['interest_accumulator'];
|
|
193
190
|
expect(interestAccumulator).toEqual(this.accumulator);
|
|
194
191
|
expect(asset['last_updated_ts']).toEqual(BigInt(this.time));
|
|
195
192
|
|
|
196
193
|
for (const key of [this.account.address, AztecAddress.fromField(await this.account.key())]) {
|
|
197
|
-
const privatePos = await this.lendingContract.methods.get_position(key).simulate();
|
|
194
|
+
const privatePos = await this.lendingContract.methods.get_position(key).simulate({ from: this.account.address });
|
|
198
195
|
expect(new Fr(privatePos['collateral'])).toEqual(this.collateral[key.toString()] ?? Fr.ZERO);
|
|
199
196
|
expect(new Fr(privatePos['static_debt'])).toEqual(this.staticDebt[key.toString()] ?? Fr.ZERO);
|
|
200
197
|
expect(privatePos['debt']).toEqual(
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import { BatchCall } from '@aztec/aztec.js/contracts';
|
|
3
|
+
import type { Logger } from '@aztec/aztec.js/log';
|
|
4
|
+
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
3
5
|
import type { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
4
6
|
|
|
5
7
|
import chunk from 'lodash.chunk';
|
|
@@ -14,6 +16,7 @@ export class TokenSimulator {
|
|
|
14
16
|
constructor(
|
|
15
17
|
protected token: TokenContract,
|
|
16
18
|
protected defaultWallet: Wallet,
|
|
19
|
+
protected defaultAddress: AztecAddress,
|
|
17
20
|
protected logger: Logger,
|
|
18
21
|
protected accounts: AztecAddress[],
|
|
19
22
|
) {}
|
|
@@ -97,13 +100,15 @@ export class TokenSimulator {
|
|
|
97
100
|
|
|
98
101
|
async checkPublic() {
|
|
99
102
|
// public calls
|
|
100
|
-
const calls = [
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
const calls = [
|
|
104
|
+
this.token.methods.total_supply(),
|
|
105
|
+
...this.accounts.map(address => this.token.methods.balance_of_public(address)),
|
|
106
|
+
];
|
|
104
107
|
|
|
105
108
|
const results = (
|
|
106
|
-
await Promise.all(
|
|
109
|
+
await Promise.all(
|
|
110
|
+
chunk(calls, 5).map(batch => new BatchCall(this.defaultWallet, batch).simulate({ from: this.defaultAddress })),
|
|
111
|
+
)
|
|
107
112
|
).flat();
|
|
108
113
|
expect(results[0]).toEqual(this.totalSupply);
|
|
109
114
|
|
|
@@ -126,12 +131,13 @@ export class TokenSimulator {
|
|
|
126
131
|
}
|
|
127
132
|
}
|
|
128
133
|
|
|
129
|
-
const defaultCalls =
|
|
130
|
-
for (const address of defaultLookups) {
|
|
131
|
-
defaultCalls.push(await this.token.methods.balance_of_private(address).request());
|
|
132
|
-
}
|
|
134
|
+
const defaultCalls = defaultLookups.map(address => this.token.methods.balance_of_private(address));
|
|
133
135
|
const results = (
|
|
134
|
-
await Promise.all(
|
|
136
|
+
await Promise.all(
|
|
137
|
+
chunk(defaultCalls, 4).map(batch =>
|
|
138
|
+
new BatchCall(this.defaultWallet, batch).simulate({ from: this.defaultAddress }),
|
|
139
|
+
),
|
|
140
|
+
)
|
|
135
141
|
).flat();
|
|
136
142
|
for (let i = 0; i < defaultLookups.length; i++) {
|
|
137
143
|
expect(results[i]).toEqual(this.balanceOfPrivate(defaultLookups[i]));
|
|
@@ -143,7 +149,9 @@ export class TokenSimulator {
|
|
|
143
149
|
const wallet = this.lookupProvider.get(address.toString());
|
|
144
150
|
const asset = wallet ? this.token.withWallet(wallet) : this.token;
|
|
145
151
|
|
|
146
|
-
const actualPrivateBalance = await asset.methods
|
|
152
|
+
const actualPrivateBalance = await asset.methods
|
|
153
|
+
.balance_of_private({ address })
|
|
154
|
+
.simulate({ from: this.defaultAddress });
|
|
147
155
|
expect(actualPrivateBalance).toEqual(this.balanceOfPrivate(address));
|
|
148
156
|
}
|
|
149
157
|
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
The flow is as follows:
|
|
2
|
+
|
|
3
|
+
1. Install/start KIND locally
|
|
4
|
+
2. Bootstrap (to build an aztec image)
|
|
5
|
+
3. Load image into kind
|
|
6
|
+
4. Deploy networks
|
|
7
|
+
5. Run tests in `yarn-project/end-to-end/src/spartan`
|
|
8
|
+
|
|
9
|
+
# Setup KIND
|
|
10
|
+
|
|
11
|
+
KIND is a kubernetes cluster that runs locally out of docker containers.
|
|
12
|
+
|
|
13
|
+
You can just
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
spartan/bootstrap.sh kind
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
You only need to do that once. If you do it again, it will destroy the cluster and recreate it (which you almost never need to do).
|
|
20
|
+
|
|
21
|
+
Now you’ll likely want some visibility into your cluster. You can
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
spartan/scripts/create_k8s_dashboard.sh
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
And after ~30 seconds or so you can
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
spartan/scripts/forward_k8s_dashboard.sh
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
That will run a port forward to your port `8443` . If you’re running in a remote environment (e.g. the mainframe), you’ll need to subsequently forward that back to your local machine. Cursor/VSCode have built in port forwarding (cmd/ctrl shift P, “forward”)
|
|
34
|
+
|
|
35
|
+
Open the forwarded page, and copy/paste the token that was generated when you forwarded the dashboard.
|
|
36
|
+
|
|
37
|
+
# Build an aztecprotocol:aztec image
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
./bootstrap.sh
|
|
41
|
+
export AZTEC_DOCKER_IMAGE="aztecprotocol/aztec:$(docker images "aztecprotocol/aztec" --format json | \
|
|
42
|
+
jq -r 'select(.Tag != "latest") | .Tag' | \
|
|
43
|
+
head -1)"
|
|
44
|
+
kind load docker-image $AZTEC_DOCKER_IMAGE
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
If you just changed typescript, you can (after the initial bootstrap)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
./yarn-project/bootstrap.sh
|
|
51
|
+
./release-image/bootstrap.sh
|
|
52
|
+
export AZTEC_DOCKER_IMAGE="aztecprotocol/aztec:$(docker images "aztecprotocol/aztec" --format json | \
|
|
53
|
+
jq -r 'select(.Tag != "latest") | .Tag' | \
|
|
54
|
+
head -1)"
|
|
55
|
+
kind load docker-image $AZTEC_DOCKER_IMAGE
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The export is important there. The `AZTEC_DOCKER_IMAGE` env var is used as both:
|
|
59
|
+
|
|
60
|
+
- the container that runs the rollup contract deployment
|
|
61
|
+
- the containers for the aztec infrastructure (validators, provers, etc)
|
|
62
|
+
|
|
63
|
+
# Deploy Metrics
|
|
64
|
+
```bash
|
|
65
|
+
./spartan/bootstrap.sh metrics-kind
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
# Deploy stuff
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
./spartan/bootstrap.sh network_deploy scenario.local
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
That will take 1-3 minutes. But at the end you should have everything you need.
|
|
75
|
+
|
|
76
|
+
You can (`k` is just an alias over `kubectl`)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
❯ k get pods -n scenario
|
|
80
|
+
NAME READY STATUS RESTARTS AGE
|
|
81
|
+
deploy-rollup-contracts-2025-08-31-1511-w2dlb 0/1 Completed 0 2m34s
|
|
82
|
+
scenario-eth-beacon-0 1/1 Running 0 39m
|
|
83
|
+
scenario-eth-execution-0 1/1 Running 0 39m
|
|
84
|
+
scenario-eth-validator-0 1/1 Running 0 39m
|
|
85
|
+
scenario-p2p-bootstrap-node-5cbf9658b9-6vd9b 1/1 Running 0 20m
|
|
86
|
+
scenario-prover-agent-59bd96899d-46k5s 1/1 Running 0 116s
|
|
87
|
+
scenario-prover-agent-59bd96899d-vzvkd 1/1 Running 0 116s
|
|
88
|
+
scenario-prover-broker-0 1/1 Running 0 116s
|
|
89
|
+
scenario-prover-node-0 1/1 Running 0 116s
|
|
90
|
+
scenario-rpc-aztec-node-0 1/1 Running 0 116s
|
|
91
|
+
scenario-validator-0 1/1 Running 0 116s
|
|
92
|
+
scenario-validator-1 1/1 Running 0 116s
|
|
93
|
+
scenario-validator-2 1/1 Running 0 116s
|
|
94
|
+
scenario-validator-3 1/1 Running 0 116s
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For example, you can forward back the ethereum node with
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
k port-forward -n scenario services/eth-devnet-eth-execution 8545:8545
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
And then do whatever you like with it.
|
|
104
|
+
|
|
105
|
+
# Run tests
|
|
106
|
+
|
|
107
|
+
With the cluster running, you can now easily run tests.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# run one
|
|
111
|
+
./spartan/bootstrap.sh single_test scenario.local spartan/smoke.test.ts
|
|
112
|
+
|
|
113
|
+
# run all (serially)
|
|
114
|
+
./spartan/bootstrap.sh network_tests scenario.local
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Right now, I recommend running the smoke test first, always, as it waits for the committee to exist.
|
|
118
|
+
|
|
119
|
+
# Teardown
|
|
120
|
+
|
|
121
|
+
You can just `k delete namespace scenario`. That will destroy everything in your kind cluster. To destroy the associated terraform state that was stored locally, just `./spartan/terraform/purge_local_state.sh`.
|
|
@@ -1,27 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type PXE,
|
|
11
|
-
createAztecNodeClient,
|
|
12
|
-
createCompatibleClient,
|
|
13
|
-
retryUntil,
|
|
14
|
-
} from '@aztec/aztec.js';
|
|
15
|
-
import { createEthereumChain, createL1Clients } from '@aztec/ethereum';
|
|
1
|
+
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
4
|
+
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
5
|
+
import { type FeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
6
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
7
|
+
import { type AztecNode, createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
8
|
+
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
9
|
+
import { createEthereumChain, createExtendedL1Client } from '@aztec/ethereum';
|
|
16
10
|
import type { Logger } from '@aztec/foundation/log';
|
|
11
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
17
12
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
13
|
+
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
14
|
+
import { TestWallet, proveInteraction, registerInitialSandboxAccountsInWallet } from '@aztec/test-wallet/server';
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
17
|
+
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
18
|
+
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
19
|
+
|
|
20
|
+
export interface TestAccounts {
|
|
21
|
+
aztecNode: AztecNode;
|
|
22
|
+
wallet: TestWallet;
|
|
23
|
+
accounts: AztecAddress[];
|
|
24
|
+
tokenContract: TokenContract;
|
|
25
|
+
tokenAdminAddress: AztecAddress;
|
|
23
26
|
tokenName: string;
|
|
24
|
-
|
|
27
|
+
recipientAddress: AztecAddress;
|
|
25
28
|
tokenAddress: AztecAddress;
|
|
26
29
|
}
|
|
27
30
|
|
|
@@ -29,121 +32,206 @@ const TOKEN_NAME = 'USDC';
|
|
|
29
32
|
const TOKEN_SYMBOL = 'USD';
|
|
30
33
|
const TOKEN_DECIMALS = 18n;
|
|
31
34
|
|
|
32
|
-
export async function
|
|
33
|
-
|
|
35
|
+
export async function setupTestAccountsWithTokens(
|
|
36
|
+
nodeUrl: string,
|
|
37
|
+
mintAmount: bigint,
|
|
38
|
+
logger: Logger,
|
|
39
|
+
): Promise<TestAccounts> {
|
|
40
|
+
const ACCOUNT_COUNT = 1; // TODO fix this to allow for 16 wallets again
|
|
41
|
+
|
|
42
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
43
|
+
const wallet = await TestWallet.create(aztecNode);
|
|
44
|
+
|
|
45
|
+
const [recipientAccount, ...accounts] = (await registerInitialSandboxAccountsInWallet(wallet)).slice(
|
|
46
|
+
0,
|
|
47
|
+
ACCOUNT_COUNT + 1,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const tokenAdmin = accounts[0];
|
|
51
|
+
const tokenAddress = await deployTokenAndMint(wallet, accounts, tokenAdmin, mintAmount, undefined, logger);
|
|
52
|
+
const tokenContract = await TokenContract.at(tokenAddress, wallet);
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
aztecNode,
|
|
56
|
+
accounts,
|
|
57
|
+
wallet,
|
|
58
|
+
tokenAdminAddress: tokenAdmin,
|
|
59
|
+
tokenName: TOKEN_NAME,
|
|
60
|
+
tokenAddress,
|
|
61
|
+
tokenContract,
|
|
62
|
+
recipientAddress: recipientAccount,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function deploySponsoredTestAccounts(
|
|
67
|
+
wallet: TestWallet,
|
|
68
|
+
aztecNode: AztecNode,
|
|
34
69
|
mintAmount: bigint,
|
|
35
70
|
logger: Logger,
|
|
36
|
-
|
|
37
|
-
|
|
71
|
+
numberOfFundedWallets = 1,
|
|
72
|
+
): Promise<TestAccounts> {
|
|
73
|
+
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
74
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
75
|
+
const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
38
76
|
|
|
39
|
-
|
|
77
|
+
await registerSponsoredFPC(wallet);
|
|
40
78
|
|
|
41
|
-
const
|
|
79
|
+
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
80
|
+
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
81
|
+
await recipientDeployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 });
|
|
82
|
+
await Promise.all(
|
|
83
|
+
fundedAccounts.map(async a => {
|
|
84
|
+
const deployMethod = await a.getDeployMethod();
|
|
85
|
+
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait({ timeout: 2400 }); // increase timeout on purpose in order to account for two empty epochs
|
|
86
|
+
logger.info(`Account deployed at ${a.address}`);
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
42
89
|
|
|
43
|
-
const tokenAdmin =
|
|
44
|
-
const tokenAddress = await deployTokenAndMint(
|
|
45
|
-
|
|
90
|
+
const tokenAdmin = fundedAccounts[0];
|
|
91
|
+
const tokenAddress = await deployTokenAndMint(
|
|
92
|
+
wallet,
|
|
93
|
+
fundedAccounts.map(acc => acc.address),
|
|
94
|
+
tokenAdmin.address,
|
|
95
|
+
mintAmount,
|
|
96
|
+
new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()),
|
|
97
|
+
logger,
|
|
98
|
+
);
|
|
99
|
+
const tokenContract = await TokenContract.at(tokenAddress, wallet);
|
|
46
100
|
|
|
47
|
-
return {
|
|
101
|
+
return {
|
|
102
|
+
aztecNode,
|
|
103
|
+
wallet,
|
|
104
|
+
accounts: fundedAccounts.map(acc => acc.address),
|
|
105
|
+
tokenAdminAddress: tokenAdmin.address,
|
|
106
|
+
tokenName: TOKEN_NAME,
|
|
107
|
+
tokenAddress,
|
|
108
|
+
tokenContract,
|
|
109
|
+
recipientAddress: recipientAccount.address,
|
|
110
|
+
};
|
|
48
111
|
}
|
|
49
112
|
|
|
50
|
-
export async function
|
|
51
|
-
pxeUrl: string,
|
|
113
|
+
export async function deployTestAccountsWithTokens(
|
|
52
114
|
nodeUrl: string,
|
|
53
|
-
|
|
115
|
+
l1RpcUrls: string[],
|
|
54
116
|
mnemonicOrPrivateKey: string,
|
|
55
117
|
mintAmount: bigint,
|
|
56
118
|
logger: Logger,
|
|
57
119
|
numberOfFundedWallets = 1,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
const node = createAztecNodeClient(nodeUrl);
|
|
120
|
+
): Promise<TestAccounts> {
|
|
121
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
122
|
+
const wallet = await TestWallet.create(aztecNode);
|
|
62
123
|
|
|
63
124
|
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
recipient.secret,
|
|
67
|
-
recipient.signingKey,
|
|
68
|
-
recipient.salt,
|
|
69
|
-
);
|
|
70
|
-
const fundedAccounts = await Promise.all(funded.map(a => getSchnorrAccount(pxe, a.secret, a.signingKey, a.salt)));
|
|
125
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
126
|
+
const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
71
127
|
|
|
72
128
|
const claims = await Promise.all(
|
|
73
|
-
fundedAccounts.map(a =>
|
|
74
|
-
bridgeL1FeeJuice(l1RpcUrl, mnemonicOrPrivateKey, pxe, a.getAddress(), initialFeeJuice, logger),
|
|
75
|
-
),
|
|
129
|
+
fundedAccounts.map(a => bridgeL1FeeJuice(l1RpcUrls, mnemonicOrPrivateKey, aztecNode, a.address, undefined, logger)),
|
|
76
130
|
);
|
|
77
131
|
|
|
78
|
-
// Progress by
|
|
79
|
-
await advanceL2Block(
|
|
80
|
-
await advanceL2Block(
|
|
132
|
+
// Progress by 3 L2 blocks so that the l1ToL2Message added above will be available to use on L2.
|
|
133
|
+
await advanceL2Block(aztecNode);
|
|
134
|
+
await advanceL2Block(aztecNode);
|
|
135
|
+
await advanceL2Block(aztecNode);
|
|
81
136
|
|
|
82
|
-
|
|
137
|
+
await Promise.all(
|
|
83
138
|
fundedAccounts.map(async (a, i) => {
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
await
|
|
87
|
-
logger.info(`Account deployed at ${a.
|
|
88
|
-
return wallet;
|
|
139
|
+
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
140
|
+
const deployMethod = await a.getDeployMethod();
|
|
141
|
+
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } }).wait();
|
|
142
|
+
logger.info(`Account deployed at ${a.address}`);
|
|
89
143
|
}),
|
|
90
144
|
);
|
|
91
145
|
|
|
92
|
-
const tokenAdmin =
|
|
93
|
-
const tokenAddress = await deployTokenAndMint(
|
|
94
|
-
|
|
146
|
+
const tokenAdmin = fundedAccounts[0];
|
|
147
|
+
const tokenAddress = await deployTokenAndMint(
|
|
148
|
+
wallet,
|
|
149
|
+
fundedAccounts.map(acc => acc.address),
|
|
150
|
+
tokenAdmin.address,
|
|
151
|
+
mintAmount,
|
|
152
|
+
undefined,
|
|
153
|
+
logger,
|
|
154
|
+
);
|
|
155
|
+
const tokenContract = await TokenContract.at(tokenAddress, wallet);
|
|
95
156
|
|
|
96
|
-
return {
|
|
157
|
+
return {
|
|
158
|
+
aztecNode,
|
|
159
|
+
wallet,
|
|
160
|
+
accounts: fundedAccounts.map(acc => acc.address),
|
|
161
|
+
tokenAdminAddress: tokenAdmin.address,
|
|
162
|
+
tokenName: TOKEN_NAME,
|
|
163
|
+
tokenAddress,
|
|
164
|
+
tokenContract,
|
|
165
|
+
recipientAddress: recipientAccount.address,
|
|
166
|
+
};
|
|
97
167
|
}
|
|
98
168
|
|
|
99
169
|
async function bridgeL1FeeJuice(
|
|
100
|
-
|
|
170
|
+
l1RpcUrls: string[],
|
|
101
171
|
mnemonicOrPrivateKey: string,
|
|
102
|
-
|
|
172
|
+
aztecNode: AztecNode,
|
|
103
173
|
recipient: AztecAddress,
|
|
104
|
-
amount: bigint,
|
|
174
|
+
amount: bigint | undefined,
|
|
105
175
|
log: Logger,
|
|
106
176
|
) {
|
|
107
|
-
const { l1ChainId } = await
|
|
108
|
-
const chain = createEthereumChain(
|
|
109
|
-
const
|
|
177
|
+
const { l1ChainId } = await aztecNode.getNodeInfo();
|
|
178
|
+
const chain = createEthereumChain(l1RpcUrls, l1ChainId);
|
|
179
|
+
const l1Client = createExtendedL1Client(chain.rpcUrls, mnemonicOrPrivateKey, chain.chainInfo);
|
|
110
180
|
|
|
111
|
-
const portal = await L1FeeJuicePortalManager.new(
|
|
181
|
+
const portal = await L1FeeJuicePortalManager.new(aztecNode, l1Client, log);
|
|
112
182
|
const claim = await portal.bridgeTokensPublic(recipient, amount, true /* mint */);
|
|
113
183
|
|
|
114
|
-
const isSynced = async () =>
|
|
184
|
+
const isSynced = async () =>
|
|
185
|
+
(await aztecNode.getL1ToL2MessageBlock(Fr.fromHexString(claim.messageHash))) !== undefined;
|
|
115
186
|
await retryUntil(isSynced, `message ${claim.messageHash} sync`, 24, 0.5);
|
|
116
187
|
|
|
117
188
|
log.info(`Created a claim for ${amount} L1 fee juice to ${recipient}.`, claim);
|
|
118
189
|
return claim;
|
|
119
190
|
}
|
|
120
191
|
|
|
121
|
-
async function advanceL2Block(
|
|
122
|
-
const initialBlockNumber = await
|
|
123
|
-
|
|
124
|
-
|
|
192
|
+
async function advanceL2Block(aztecNode: AztecNode, nodeAdmin?: AztecNodeAdmin) {
|
|
193
|
+
const initialBlockNumber = await aztecNode.getBlockNumber();
|
|
194
|
+
|
|
195
|
+
let minTxsPerBlock = undefined;
|
|
196
|
+
if (nodeAdmin) {
|
|
197
|
+
({ minTxsPerBlock } = await nodeAdmin.getConfig());
|
|
198
|
+
await nodeAdmin.setConfig({ minTxsPerBlock: 0 }); // Set to 0 to ensure we can advance the block
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
await retryUntil(async () => (await aztecNode.getBlockNumber()) >= initialBlockNumber + 1);
|
|
202
|
+
|
|
203
|
+
if (nodeAdmin && minTxsPerBlock !== undefined) {
|
|
204
|
+
await nodeAdmin.setConfig({ minTxsPerBlock });
|
|
205
|
+
}
|
|
125
206
|
}
|
|
126
207
|
|
|
127
208
|
async function deployTokenAndMint(
|
|
128
|
-
|
|
209
|
+
wallet: Wallet,
|
|
210
|
+
accounts: AztecAddress[],
|
|
129
211
|
admin: AztecAddress,
|
|
130
212
|
mintAmount: bigint,
|
|
213
|
+
paymentMethod: FeePaymentMethod | undefined,
|
|
131
214
|
logger: Logger,
|
|
132
215
|
) {
|
|
133
216
|
logger.verbose(`Deploying TokenContract...`);
|
|
134
|
-
const tokenContract = await TokenContract.deploy(
|
|
135
|
-
.send(
|
|
217
|
+
const tokenContract = await TokenContract.deploy(wallet, admin, TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
|
|
218
|
+
.send({
|
|
219
|
+
from: admin,
|
|
220
|
+
fee: {
|
|
221
|
+
paymentMethod,
|
|
222
|
+
},
|
|
223
|
+
})
|
|
136
224
|
.deployed({ timeout: 600 });
|
|
137
225
|
|
|
138
226
|
const tokenAddress = tokenContract.address;
|
|
139
227
|
|
|
140
|
-
logger.verbose(`Minting ${mintAmount} public assets to the ${
|
|
228
|
+
logger.verbose(`Minting ${mintAmount} public assets to the ${accounts.length} accounts...`);
|
|
141
229
|
|
|
142
230
|
await Promise.all(
|
|
143
|
-
|
|
144
|
-
(await TokenContract.at(tokenAddress,
|
|
145
|
-
.mint_to_public(
|
|
146
|
-
.send()
|
|
231
|
+
accounts.map(async acc =>
|
|
232
|
+
(await TokenContract.at(tokenAddress, wallet)).methods
|
|
233
|
+
.mint_to_public(acc, mintAmount)
|
|
234
|
+
.send({ from: admin, fee: { paymentMethod } })
|
|
147
235
|
.wait({ timeout: 600 }),
|
|
148
236
|
),
|
|
149
237
|
);
|
|
@@ -154,31 +242,65 @@ async function deployTokenAndMint(
|
|
|
154
242
|
}
|
|
155
243
|
|
|
156
244
|
export async function performTransfers({
|
|
157
|
-
|
|
245
|
+
wallet,
|
|
246
|
+
testAccounts,
|
|
158
247
|
rounds,
|
|
159
248
|
transferAmount,
|
|
160
249
|
logger,
|
|
250
|
+
feePaymentMethod,
|
|
161
251
|
}: {
|
|
162
|
-
|
|
252
|
+
wallet: TestWallet;
|
|
253
|
+
testAccounts: TestAccounts;
|
|
163
254
|
rounds: number;
|
|
164
255
|
transferAmount: bigint;
|
|
165
256
|
logger: Logger;
|
|
257
|
+
feePaymentMethod?: FeePaymentMethod;
|
|
166
258
|
}) {
|
|
167
|
-
const recipient =
|
|
168
|
-
|
|
259
|
+
const recipient = testAccounts.recipientAddress;
|
|
260
|
+
// Default to sponsored fee payment if no fee method is provided
|
|
261
|
+
const defaultFeePaymentMethod = feePaymentMethod || new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
169
262
|
for (let i = 0; i < rounds; i++) {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
263
|
+
const txs = testAccounts.accounts.map(async acc => {
|
|
264
|
+
const token = await TokenContract.at(testAccounts.tokenAddress, testAccounts.wallet);
|
|
265
|
+
return proveInteraction(wallet, token.methods.transfer_in_public(acc, recipient, transferAmount, 0), {
|
|
266
|
+
from: acc,
|
|
267
|
+
fee: {
|
|
268
|
+
paymentMethod: defaultFeePaymentMethod,
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
});
|
|
177
272
|
|
|
178
|
-
const
|
|
273
|
+
const provenTxs = await Promise.all(txs);
|
|
179
274
|
|
|
180
|
-
await Promise.all(
|
|
275
|
+
await Promise.all(provenTxs.map(t => t.send().wait({ timeout: 600 })));
|
|
181
276
|
|
|
182
277
|
logger.info(`Completed round ${i + 1} / ${rounds}`);
|
|
183
278
|
}
|
|
184
279
|
}
|
|
280
|
+
|
|
281
|
+
export async function createWalletAndAztecNodeClient(
|
|
282
|
+
nodeUrl: string,
|
|
283
|
+
proverEnabled: boolean,
|
|
284
|
+
logger: Logger,
|
|
285
|
+
): Promise<{ wallet: TestWallet; aztecNode: AztecNode; cleanup: () => Promise<void> }> {
|
|
286
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
287
|
+
const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
|
|
288
|
+
const pxeConfig = {
|
|
289
|
+
dataDirectory: undefined,
|
|
290
|
+
dataStoreMapSizeKb: 1024 * 1024,
|
|
291
|
+
...bbConfig,
|
|
292
|
+
...acvmConfig,
|
|
293
|
+
proverEnabled,
|
|
294
|
+
};
|
|
295
|
+
const wallet = await TestWallet.create(aztecNode, pxeConfig);
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
wallet,
|
|
299
|
+
aztecNode,
|
|
300
|
+
async cleanup() {
|
|
301
|
+
await wallet.stop();
|
|
302
|
+
await bbConfig?.cleanup();
|
|
303
|
+
await acvmConfig?.cleanup();
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|