@aztec/cli-wallet 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928
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/bin/index.js +1 -1
- package/dest/cmds/check_tx.d.ts +1 -1
- package/dest/cmds/check_tx.d.ts.map +1 -1
- package/dest/cmds/check_tx.js +49 -21
- package/dest/cmds/create_account.d.ts +6 -3
- package/dest/cmds/create_account.d.ts.map +1 -1
- package/dest/cmds/create_account.js +48 -29
- package/dest/cmds/deploy.d.ts +5 -4
- package/dest/cmds/deploy.d.ts.map +1 -1
- package/dest/cmds/deploy.js +43 -40
- package/dest/cmds/deploy_account.d.ts +4 -3
- package/dest/cmds/deploy_account.d.ts.map +1 -1
- package/dest/cmds/deploy_account.js +23 -23
- package/dest/cmds/get_fee_juice_balance.d.ts +5 -0
- package/dest/cmds/get_fee_juice_balance.d.ts.map +1 -0
- package/dest/cmds/get_fee_juice_balance.js +27 -0
- package/dest/cmds/import_test_accounts.d.ts +1 -1
- package/dest/cmds/import_test_accounts.d.ts.map +1 -1
- package/dest/cmds/import_test_accounts.js +2 -1
- package/dest/cmds/index.d.ts +1 -1
- package/dest/cmds/index.d.ts.map +1 -1
- package/dest/cmds/index.js +36 -19
- package/dest/cmds/send.d.ts +4 -3
- package/dest/cmds/send.d.ts.map +1 -1
- package/dest/cmds/send.js +26 -28
- package/dest/cmds/simulate.d.ts +1 -1
- package/dest/cmds/simulate.d.ts.map +1 -1
- package/dest/cmds/simulate.js +2 -1
- package/dest/storage/wallet_db.d.ts +12 -4
- package/dest/storage/wallet_db.d.ts.map +1 -1
- package/dest/storage/wallet_db.js +29 -1
- package/dest/utils/constants.d.ts +2 -2
- package/dest/utils/constants.d.ts.map +1 -1
- package/dest/utils/constants.js +1 -0
- package/dest/utils/options/fees.d.ts +3 -2
- package/dest/utils/options/fees.d.ts.map +1 -1
- package/dest/utils/options/fees.js +36 -10
- package/dest/utils/options/options.d.ts +2 -2
- package/dest/utils/options/options.d.ts.map +1 -1
- package/dest/utils/options/options.js +5 -5
- package/dest/utils/wallet.d.ts +34 -10
- package/dest/utils/wallet.d.ts.map +1 -1
- package/dest/utils/wallet.js +174 -97
- package/package.json +16 -15
- package/src/bin/index.ts +1 -1
- package/src/cmds/check_tx.ts +57 -24
- package/src/cmds/create_account.ts +50 -29
- package/src/cmds/deploy.ts +40 -35
- package/src/cmds/deploy_account.ts +23 -15
- package/src/cmds/get_fee_juice_balance.ts +37 -0
- package/src/cmds/import_test_accounts.ts +12 -1
- package/src/cmds/index.ts +70 -14
- package/src/cmds/send.ts +23 -18
- package/src/cmds/simulate.ts +2 -1
- package/src/storage/wallet_db.ts +38 -2
- package/src/utils/constants.ts +7 -1
- package/src/utils/options/fees.ts +42 -10
- package/src/utils/options/options.ts +5 -5
- package/src/utils/wallet.ts +221 -134
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { deriveSecretKeyFromSigningKey } from '@aztec/accounts/utils';
|
|
2
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
3
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
4
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
|
-
import type
|
|
5
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
4
6
|
import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
|
|
5
7
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
6
8
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
7
10
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
8
|
-
import type
|
|
11
|
+
import { type TxHash, type TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
9
12
|
|
|
10
13
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
11
14
|
import type { AccountType } from '../utils/constants.js';
|
|
@@ -17,7 +20,8 @@ export async function createAccount(
|
|
|
17
20
|
wallet: CLIWallet,
|
|
18
21
|
aztecNode: AztecNode,
|
|
19
22
|
accountType: AccountType,
|
|
20
|
-
|
|
23
|
+
signingKey: GrumpkinScalar | undefined,
|
|
24
|
+
salt: Fr | undefined,
|
|
21
25
|
publicKey: string | undefined,
|
|
22
26
|
alias: string | undefined,
|
|
23
27
|
deployer: AztecAddress | undefined,
|
|
@@ -27,52 +31,63 @@ export async function createAccount(
|
|
|
27
31
|
registerClass: boolean,
|
|
28
32
|
wait: boolean,
|
|
29
33
|
feeOpts: CLIFeeArgs,
|
|
34
|
+
waitForStatus: TxStatus,
|
|
30
35
|
json: boolean,
|
|
31
36
|
verbose: boolean,
|
|
32
37
|
debugLogger: Logger,
|
|
33
38
|
log: LogFn,
|
|
34
39
|
) {
|
|
35
|
-
secretKey
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
secretKey
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
let secretKey: Fr;
|
|
41
|
+
if (accountType === 'ecdsasecp256r1ssh') {
|
|
42
|
+
// SSH accounts sign with a key held in the agent, and so we cannot derive their privacy secret key from it. Instead
|
|
43
|
+
// we pick a random value.
|
|
44
|
+
secretKey = Fr.random();
|
|
45
|
+
} else {
|
|
46
|
+
signingKey ??= GrumpkinScalar.random();
|
|
47
|
+
secretKey = await deriveSecretKeyFromSigningKey(signingKey);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const account = await wallet.createAccount(accountType, signingKey, secretKey, salt, publicKey);
|
|
51
|
+
const instanceSalt = account.getInstance().salt;
|
|
45
52
|
const { address, publicKeys, partialAddress } = await account.getCompleteAddress();
|
|
46
53
|
|
|
47
54
|
const out: Record<string, any> = {};
|
|
48
55
|
if (json) {
|
|
49
56
|
out.address = address;
|
|
50
57
|
out.publicKey = publicKeys;
|
|
58
|
+
if (signingKey) {
|
|
59
|
+
out.signingKey = signingKey;
|
|
60
|
+
}
|
|
51
61
|
if (secretKey) {
|
|
52
62
|
out.secretKey = secretKey;
|
|
53
63
|
}
|
|
54
64
|
out.partialAddress = partialAddress;
|
|
55
|
-
out.salt =
|
|
65
|
+
out.salt = instanceSalt;
|
|
56
66
|
out.initHash = account.getInstance().initializationHash;
|
|
57
67
|
} else {
|
|
58
68
|
log(`\nNew account:\n`);
|
|
59
69
|
log(`Address: ${address.toString()}`);
|
|
60
70
|
log(`Public key: ${publicKeys.toString()}`);
|
|
71
|
+
if (signingKey) {
|
|
72
|
+
log(`Signing key: ${signingKey.toString()}`);
|
|
73
|
+
}
|
|
61
74
|
if (secretKey) {
|
|
62
75
|
log(`Secret key: ${secretKey.toString()}`);
|
|
63
76
|
}
|
|
64
77
|
log(`Partial address: ${partialAddress.toString()}`);
|
|
65
|
-
log(`Salt: ${
|
|
78
|
+
log(`Salt: ${instanceSalt.toString()}`);
|
|
66
79
|
log(`Init hash: ${account.getInstance().initializationHash.toString()}`);
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
let txHash: TxHash | undefined;
|
|
70
83
|
let txReceipt: TxReceipt | undefined;
|
|
71
|
-
|
|
84
|
+
// Initializerless accounts have no deployment tx — creating one only registers it locally — so there is
|
|
85
|
+
// nothing to deploy on-chain.
|
|
86
|
+
if (!registerOnly && accountType !== 'schnorr_initializerless') {
|
|
72
87
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
|
|
73
88
|
|
|
74
89
|
const delegatedDeployment = deployer && !account.address.equals(deployer);
|
|
75
|
-
const from = delegatedDeployment ? deployer :
|
|
90
|
+
const from = delegatedDeployment ? deployer : NO_FROM;
|
|
76
91
|
|
|
77
92
|
const deployAccountOpts: DeployAccountOptions = {
|
|
78
93
|
skipClassPublication: !registerClass,
|
|
@@ -82,13 +97,14 @@ export async function createAccount(
|
|
|
82
97
|
fee: { paymentMethod, gasSettings },
|
|
83
98
|
};
|
|
84
99
|
|
|
100
|
+
const localStart = performance.now();
|
|
85
101
|
const deployMethod = await account.getDeployMethod();
|
|
86
102
|
const sim = await deployMethod.simulate({
|
|
87
103
|
...deployAccountOpts,
|
|
88
|
-
|
|
104
|
+
includeMetadata: true,
|
|
89
105
|
});
|
|
90
|
-
//
|
|
91
|
-
const estimatedGas = sim.
|
|
106
|
+
// includeMetadata: true guarantees these fields are present
|
|
107
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed!);
|
|
92
108
|
const stats = sim.stats!;
|
|
93
109
|
|
|
94
110
|
if (feeOpts.estimateOnly) {
|
|
@@ -121,19 +137,24 @@ export async function createAccount(
|
|
|
121
137
|
}
|
|
122
138
|
: undefined,
|
|
123
139
|
};
|
|
140
|
+
|
|
141
|
+
({ txHash } = await deployMethod.send({ ...sendOpts, wait: NO_WAIT }));
|
|
142
|
+
const localTimeMs = performance.now() - localStart;
|
|
143
|
+
|
|
124
144
|
if (wait) {
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
txReceipt = receipt;
|
|
130
|
-
txHash = receipt.txHash;
|
|
145
|
+
const nodeStart = performance.now();
|
|
146
|
+
txReceipt = await waitForTx(aztecNode, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
147
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
148
|
+
|
|
131
149
|
out.txReceipt = {
|
|
132
150
|
status: txReceipt.status,
|
|
133
151
|
transactionFee: txReceipt.transactionFee,
|
|
134
152
|
};
|
|
135
|
-
|
|
136
|
-
(
|
|
153
|
+
|
|
154
|
+
if (!json) {
|
|
155
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
156
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
157
|
+
}
|
|
137
158
|
}
|
|
138
159
|
debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
|
|
139
160
|
out.txHash = txHash;
|
|
@@ -151,5 +172,5 @@ export async function createAccount(
|
|
|
151
172
|
}
|
|
152
173
|
}
|
|
153
174
|
|
|
154
|
-
return { alias, address, secretKey, salt };
|
|
175
|
+
return { alias, address, signingKey, secretKey, salt: instanceSalt };
|
|
155
176
|
}
|
package/src/cmds/deploy.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
2
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import type { DeployOptions } from '@aztec/aztec.js/contracts';
|
|
3
4
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
4
5
|
import { ContractDeployer } from '@aztec/aztec.js/deployment';
|
|
5
6
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
6
|
-
import type
|
|
7
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
7
8
|
import { encodeArgs, getContractArtifact, prettyPrintJSON } from '@aztec/cli/utils';
|
|
8
9
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
9
10
|
import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
|
|
10
11
|
import { PublicKeys } from '@aztec/stdlib/keys';
|
|
12
|
+
import type { TxStatus } from '@aztec/stdlib/tx';
|
|
11
13
|
|
|
12
14
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
13
15
|
import { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -29,10 +31,12 @@ export async function deploy(
|
|
|
29
31
|
skipInitialization: boolean | undefined,
|
|
30
32
|
wait: boolean,
|
|
31
33
|
feeOpts: CLIFeeArgs,
|
|
34
|
+
waitForStatus: TxStatus,
|
|
32
35
|
verbose: boolean,
|
|
33
36
|
timeout: number = DEFAULT_TX_TIMEOUT_S,
|
|
34
37
|
debugLogger: Logger,
|
|
35
38
|
log: LogFn,
|
|
39
|
+
universal?: boolean,
|
|
36
40
|
) {
|
|
37
41
|
const out: Record<string, any> = {};
|
|
38
42
|
salt ??= Fr.random();
|
|
@@ -42,12 +46,7 @@ export async function deploy(
|
|
|
42
46
|
|
|
43
47
|
// TODO(#12081): Add contractArtifact.noirVersion and check here (via Noir.lock)?
|
|
44
48
|
|
|
45
|
-
const contractDeployer = new ContractDeployer(
|
|
46
|
-
contractArtifact,
|
|
47
|
-
wallet,
|
|
48
|
-
publicKeys ?? PublicKeys.default(),
|
|
49
|
-
initializer,
|
|
50
|
-
);
|
|
49
|
+
const contractDeployer = new ContractDeployer(contractArtifact, wallet, initializer);
|
|
51
50
|
|
|
52
51
|
let args = [];
|
|
53
52
|
if (rawArgs.length > 0) {
|
|
@@ -59,24 +58,27 @@ export async function deploy(
|
|
|
59
58
|
debugLogger.debug(`Encoded arguments: ${args.join(', ')}`);
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
const
|
|
61
|
+
const deployInteraction = contractDeployer.deploy(args, {
|
|
62
|
+
salt,
|
|
63
|
+
publicKeys: publicKeys ?? PublicKeys.default(),
|
|
64
|
+
...(universal ? { universalDeploy: true as const } : {}),
|
|
65
|
+
});
|
|
63
66
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, deployer);
|
|
64
67
|
const deployOpts: DeployOptions = {
|
|
65
68
|
fee: { gasSettings, paymentMethod },
|
|
66
|
-
from: deployer ??
|
|
67
|
-
contractAddressSalt: salt,
|
|
68
|
-
universalDeploy: !deployer,
|
|
69
|
+
from: deployer ?? NO_FROM,
|
|
69
70
|
skipClassPublication,
|
|
70
71
|
skipInitialization,
|
|
71
72
|
skipInstancePublication,
|
|
72
73
|
};
|
|
73
74
|
|
|
74
|
-
const
|
|
75
|
+
const localStart = performance.now();
|
|
76
|
+
const sim = await deployInteraction.simulate({
|
|
75
77
|
...deployOpts,
|
|
76
|
-
|
|
78
|
+
includeMetadata: true,
|
|
77
79
|
});
|
|
78
|
-
//
|
|
79
|
-
const estimatedGas = sim.
|
|
80
|
+
// includeMetadata: true guarantees these fields are present
|
|
81
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed!);
|
|
80
82
|
const stats = sim.stats!;
|
|
81
83
|
|
|
82
84
|
if (feeOpts.estimateOnly) {
|
|
@@ -97,48 +99,51 @@ export async function deploy(
|
|
|
97
99
|
printProfileResult(stats, log);
|
|
98
100
|
}
|
|
99
101
|
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
+
const instance = await deployInteraction.getInstance();
|
|
103
|
+
const address = instance.address;
|
|
104
|
+
const partialAddress = await deployInteraction.getPartialAddress();
|
|
105
|
+
|
|
106
|
+
const { txHash } = await deployInteraction.send({ ...deployOpts, wait: NO_WAIT });
|
|
107
|
+
const localTimeMs = performance.now() - localStart;
|
|
108
|
+
debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
|
|
109
|
+
out.hash = txHash;
|
|
102
110
|
|
|
103
111
|
if (wait) {
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
out.hash = txHash;
|
|
112
|
+
const nodeStart = performance.now();
|
|
113
|
+
const receipt = await waitForTx(node, txHash, { timeout, waitForStatus });
|
|
114
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
108
115
|
|
|
109
116
|
if (!json) {
|
|
110
|
-
log(`Contract deployed at ${address
|
|
111
|
-
log(`Contract partial address ${
|
|
117
|
+
log(`Contract deployed at ${address.toString()}`);
|
|
118
|
+
log(`Contract partial address ${partialAddress.toString()}`);
|
|
112
119
|
log(`Contract init hash ${instance.initializationHash.toString()}`);
|
|
113
120
|
log(`Deployment tx hash: ${txHash.toString()}`);
|
|
114
121
|
log(`Deployment salt: ${salt.toString()}`);
|
|
115
122
|
log(`Deployer: ${instance.deployer.toString()}`);
|
|
116
123
|
log(`Transaction fee: ${receipt.transactionFee?.toString()}`);
|
|
124
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
125
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
117
126
|
} else {
|
|
118
127
|
out.contract = {
|
|
119
|
-
address: address
|
|
120
|
-
partialAddress:
|
|
128
|
+
address: address.toString(),
|
|
129
|
+
partialAddress: partialAddress.toString(),
|
|
121
130
|
initializationHash: instance.initializationHash.toString(),
|
|
122
131
|
salt: salt.toString(),
|
|
123
132
|
transactionFee: receipt.transactionFee?.toString(),
|
|
124
133
|
};
|
|
125
134
|
}
|
|
126
135
|
} else {
|
|
127
|
-
const { txHash } = await deploy.send({ ...deployOpts, wait: NO_WAIT });
|
|
128
|
-
debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
|
|
129
|
-
out.hash = txHash;
|
|
130
|
-
|
|
131
136
|
if (!json) {
|
|
132
|
-
log(`Contract deployed at ${address
|
|
133
|
-
log(`Contract partial address ${
|
|
137
|
+
log(`Contract deployed at ${address.toString()}`);
|
|
138
|
+
log(`Contract partial address ${partialAddress.toString()}`);
|
|
134
139
|
log(`Contract init hash ${instance.initializationHash.toString()}`);
|
|
135
140
|
log(`Deployment tx hash: ${txHash.toString()}`);
|
|
136
141
|
log(`Deployment salt: ${salt.toString()}`);
|
|
137
142
|
log(`Deployer: ${instance.deployer.toString()}`);
|
|
138
143
|
} else {
|
|
139
144
|
out.contract = {
|
|
140
|
-
address: address
|
|
141
|
-
partialAddress:
|
|
145
|
+
address: address.toString(),
|
|
146
|
+
partialAddress: partialAddress.toString(),
|
|
142
147
|
initializationHash: instance.initializationHash.toString(),
|
|
143
148
|
salt: salt.toString(),
|
|
144
149
|
};
|
|
@@ -148,5 +153,5 @@ export async function deploy(
|
|
|
148
153
|
if (json) {
|
|
149
154
|
log(prettyPrintJSON(out));
|
|
150
155
|
}
|
|
151
|
-
return
|
|
156
|
+
return await deployInteraction.getAddress();
|
|
152
157
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
1
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
3
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
|
-
import type
|
|
4
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
4
5
|
import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
|
|
5
6
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
6
7
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
7
|
-
import type { TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
8
|
+
import type { TxHash, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
8
9
|
|
|
9
10
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
10
11
|
import type { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -21,6 +22,7 @@ export async function deployAccount(
|
|
|
21
22
|
publicDeploy: boolean,
|
|
22
23
|
skipInitialization: boolean,
|
|
23
24
|
feeOpts: CLIFeeArgs,
|
|
25
|
+
waitForStatus: TxStatus,
|
|
24
26
|
json: boolean,
|
|
25
27
|
verbose: boolean,
|
|
26
28
|
debugLogger: Logger,
|
|
@@ -28,7 +30,7 @@ export async function deployAccount(
|
|
|
28
30
|
) {
|
|
29
31
|
const out: Record<string, any> = {};
|
|
30
32
|
|
|
31
|
-
const account = await wallet.
|
|
33
|
+
const account = await wallet.retrieveAccount(address);
|
|
32
34
|
const { partialAddress, publicKeys } = await account.getCompleteAddress();
|
|
33
35
|
const { initializationHash, salt } = account.getInstance();
|
|
34
36
|
|
|
@@ -52,7 +54,7 @@ export async function deployAccount(
|
|
|
52
54
|
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
|
|
53
55
|
|
|
54
56
|
const delegatedDeployment = deployer && !account.address.equals(deployer);
|
|
55
|
-
const from = delegatedDeployment ? deployer :
|
|
57
|
+
const from = delegatedDeployment ? deployer : NO_FROM;
|
|
56
58
|
|
|
57
59
|
const deployAccountOpts: DeployAccountOptions = {
|
|
58
60
|
skipClassPublication: !registerClass,
|
|
@@ -62,13 +64,14 @@ export async function deployAccount(
|
|
|
62
64
|
fee: { paymentMethod, gasSettings },
|
|
63
65
|
};
|
|
64
66
|
|
|
67
|
+
const localStart = performance.now();
|
|
65
68
|
const deployMethod = await account.getDeployMethod();
|
|
66
69
|
const sim = await deployMethod.simulate({
|
|
67
70
|
...deployAccountOpts,
|
|
68
|
-
|
|
71
|
+
includeMetadata: true,
|
|
69
72
|
});
|
|
70
|
-
//
|
|
71
|
-
const estimatedGas = sim.
|
|
73
|
+
// includeMetadata: true guarantees these fields are present
|
|
74
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed!);
|
|
72
75
|
const stats = sim.stats!;
|
|
73
76
|
|
|
74
77
|
if (feeOpts.estimateOnly) {
|
|
@@ -101,19 +104,24 @@ export async function deployAccount(
|
|
|
101
104
|
}
|
|
102
105
|
: undefined,
|
|
103
106
|
};
|
|
107
|
+
|
|
108
|
+
({ txHash } = await deployMethod.send({ ...sendOpts, wait: NO_WAIT }));
|
|
109
|
+
const localTimeMs = performance.now() - localStart;
|
|
110
|
+
|
|
104
111
|
if (wait) {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
txReceipt = receipt;
|
|
110
|
-
txHash = receipt.txHash;
|
|
112
|
+
const nodeStart = performance.now();
|
|
113
|
+
txReceipt = await waitForTx(aztecNode, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
114
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
115
|
+
|
|
111
116
|
out.txReceipt = {
|
|
112
117
|
status: txReceipt.status,
|
|
113
118
|
transactionFee: txReceipt.transactionFee,
|
|
114
119
|
};
|
|
115
|
-
|
|
116
|
-
(
|
|
120
|
+
|
|
121
|
+
if (!json) {
|
|
122
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
123
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
124
|
+
}
|
|
117
125
|
}
|
|
118
126
|
debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
|
|
119
127
|
out.txHash = txHash;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
3
|
+
import { getFeeJuiceBalance } from '@aztec/aztec.js/utils';
|
|
4
|
+
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
5
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
6
|
+
|
|
7
|
+
const FEE_JUICE_DECIMALS = 18;
|
|
8
|
+
const FEE_JUICE_UNIT = 10n ** BigInt(FEE_JUICE_DECIMALS);
|
|
9
|
+
|
|
10
|
+
/** Formats a raw FeeJuice balance (18 decimals) for human-readable display. */
|
|
11
|
+
function formatFeeJuice(raw: bigint, exact: boolean): string {
|
|
12
|
+
const whole = raw / FEE_JUICE_UNIT;
|
|
13
|
+
const fractional = raw % FEE_JUICE_UNIT;
|
|
14
|
+
const fracStr = fractional.toString().padStart(FEE_JUICE_DECIMALS, '0');
|
|
15
|
+
if (exact) {
|
|
16
|
+
return `${whole}.${fracStr} FJ`;
|
|
17
|
+
}
|
|
18
|
+
if (fractional === 0n) {
|
|
19
|
+
return `${whole} FJ`;
|
|
20
|
+
}
|
|
21
|
+
return `${whole}.${fracStr.replace(/0+$/, '')} FJ`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function getFeeJuiceBalanceCmd(
|
|
25
|
+
node: AztecNode,
|
|
26
|
+
address: AztecAddress,
|
|
27
|
+
json: boolean,
|
|
28
|
+
exact: boolean,
|
|
29
|
+
log: LogFn,
|
|
30
|
+
) {
|
|
31
|
+
const balance = await getFeeJuiceBalance(address, node);
|
|
32
|
+
if (json) {
|
|
33
|
+
log(prettyPrintJSON({ address: address.toString(), balance: balance.toString() }));
|
|
34
|
+
} else {
|
|
35
|
+
log(`Fee Juice balance for ${address.toString()}: ${formatFeeJuice(balance, exact)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -16,7 +16,18 @@ export async function importTestAccounts(wallet: CLIWallet, db: WalletDB, json:
|
|
|
16
16
|
const secret = testAccounts[i].secret;
|
|
17
17
|
const salt = new Fr(account.salt);
|
|
18
18
|
const address = account.address;
|
|
19
|
-
await db.storeAccount(
|
|
19
|
+
await db.storeAccount(
|
|
20
|
+
address,
|
|
21
|
+
{
|
|
22
|
+
type: 'schnorr_initializerless',
|
|
23
|
+
signingKey: account.signingKey,
|
|
24
|
+
secretKey: secret,
|
|
25
|
+
salt,
|
|
26
|
+
alias,
|
|
27
|
+
publicKey: undefined,
|
|
28
|
+
},
|
|
29
|
+
log,
|
|
30
|
+
);
|
|
20
31
|
|
|
21
32
|
if (json) {
|
|
22
33
|
out[alias] = {
|