@aztec/cli-wallet 5.0.0-private.20260319 → 5.0.0-rc.1
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.js +7 -7
- package/dest/cmds/create_account.d.ts +4 -3
- package/dest/cmds/create_account.d.ts.map +1 -1
- package/dest/cmds/create_account.js +30 -28
- 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 +22 -22
- 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 +1 -1
- package/dest/cmds/index.d.ts +1 -1
- package/dest/cmds/index.d.ts.map +1 -1
- package/dest/cmds/index.js +31 -15
- 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/storage/wallet_db.d.ts +7 -2
- package/dest/storage/wallet_db.d.ts.map +1 -1
- package/dest/storage/wallet_db.js +14 -0
- 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 +33 -9
- package/dest/utils/wallet.d.ts +19 -6
- package/dest/utils/wallet.d.ts.map +1 -1
- package/dest/utils/wallet.js +130 -63
- package/package.json +16 -15
- package/src/bin/index.ts +1 -1
- package/src/cmds/check_tx.ts +6 -5
- package/src/cmds/create_account.ts +31 -20
- package/src/cmds/deploy.ts +40 -35
- package/src/cmds/deploy_account.ts +22 -14
- package/src/cmds/get_fee_juice_balance.ts +37 -0
- package/src/cmds/import_test_accounts.ts +5 -1
- package/src/cmds/index.ts +59 -5
- package/src/cmds/send.ts +23 -18
- package/src/storage/wallet_db.ts +14 -0
- package/src/utils/constants.ts +7 -1
- package/src/utils/options/fees.ts +35 -9
- package/src/utils/wallet.ts +141 -72
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,
|
|
@@ -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,11 @@ 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
|
+
{ type: 'schnorr_initializerless', secretKey: secret, salt, alias, publicKey: undefined },
|
|
22
|
+
log,
|
|
23
|
+
);
|
|
20
24
|
|
|
21
25
|
if (json) {
|
|
22
26
|
out[alias] = {
|
package/src/cmds/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from '@aztec/cli/utils';
|
|
13
13
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
14
14
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
15
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
15
16
|
|
|
16
17
|
import { type Command, Option } from 'commander';
|
|
17
18
|
import inquirer from 'inquirer';
|
|
@@ -40,6 +41,17 @@ import {
|
|
|
40
41
|
integerArgParser,
|
|
41
42
|
} from '../utils/options/index.js';
|
|
42
43
|
|
|
44
|
+
function parseWaitForStatus(status: string): TxStatus {
|
|
45
|
+
switch (status) {
|
|
46
|
+
case 'proposed':
|
|
47
|
+
return TxStatus.PROPOSED;
|
|
48
|
+
case 'checkpointed':
|
|
49
|
+
return TxStatus.CHECKPOINTED;
|
|
50
|
+
default:
|
|
51
|
+
throw new Error(`Invalid wait-for-status: ${status}. Use 'proposed' or 'checkpointed'.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
43
55
|
// TODO: This function is only used in 1 place so we could just inline this
|
|
44
56
|
export function injectCommands(
|
|
45
57
|
program: Command,
|
|
@@ -90,6 +102,11 @@ export function injectCommands(
|
|
|
90
102
|
)
|
|
91
103
|
.addOption(createAliasOption('Alias for the account. Used for easy reference in subsequent commands.', !db))
|
|
92
104
|
.addOption(createTypeOption(true))
|
|
105
|
+
.option(
|
|
106
|
+
'-s, --salt <hex string>',
|
|
107
|
+
'Optional deployment salt as a hex string for generating the deployment address. Defaults to 0.',
|
|
108
|
+
parseFieldFromHexString,
|
|
109
|
+
)
|
|
93
110
|
.option(
|
|
94
111
|
'--register-only',
|
|
95
112
|
'Just register the account on the Wallet. Do not deploy or initialize the account contract.',
|
|
@@ -98,6 +115,7 @@ export function injectCommands(
|
|
|
98
115
|
// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
99
116
|
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
100
117
|
.option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction')
|
|
118
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
101
119
|
.addOption(createVerboseOption());
|
|
102
120
|
|
|
103
121
|
addOptions(createAccountCommand, CLIFeeArgs.getOptions()).action(async (_options, command) => {
|
|
@@ -107,7 +125,9 @@ export function injectCommands(
|
|
|
107
125
|
type,
|
|
108
126
|
from: parsedFromAddress,
|
|
109
127
|
secretKey,
|
|
128
|
+
salt,
|
|
110
129
|
wait,
|
|
130
|
+
waitForStatus: waitForStatusStr,
|
|
111
131
|
registerOnly,
|
|
112
132
|
skipInitialization,
|
|
113
133
|
publicDeploy,
|
|
@@ -137,6 +157,7 @@ export function injectCommands(
|
|
|
137
157
|
node,
|
|
138
158
|
type,
|
|
139
159
|
secretKey,
|
|
160
|
+
salt,
|
|
140
161
|
publicKey,
|
|
141
162
|
alias,
|
|
142
163
|
parsedFromAddress,
|
|
@@ -146,6 +167,7 @@ export function injectCommands(
|
|
|
146
167
|
registerClass,
|
|
147
168
|
wait,
|
|
148
169
|
CLIFeeArgs.parse(options, log, db),
|
|
170
|
+
parseWaitForStatus(waitForStatusStr),
|
|
149
171
|
json,
|
|
150
172
|
verbose,
|
|
151
173
|
debugLogger,
|
|
@@ -180,12 +202,22 @@ export function injectCommands(
|
|
|
180
202
|
'--skip-initialization',
|
|
181
203
|
'Skip initializing the account contract. Useful for publicly deploying an existing account.',
|
|
182
204
|
)
|
|
205
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
183
206
|
.addOption(createVerboseOption());
|
|
184
207
|
|
|
185
208
|
addOptions(deployAccountCommand, CLIFeeArgs.getOptions()).action(async (parsedAccount, _options, command) => {
|
|
186
209
|
const { deployAccount } = await import('./deploy_account.js');
|
|
187
210
|
const options = command.optsWithGlobals();
|
|
188
|
-
const {
|
|
211
|
+
const {
|
|
212
|
+
wait,
|
|
213
|
+
waitForStatus: waitForStatusStr,
|
|
214
|
+
from: parsedFromAddress,
|
|
215
|
+
json,
|
|
216
|
+
registerClass,
|
|
217
|
+
skipInitialization,
|
|
218
|
+
publicDeploy,
|
|
219
|
+
verbose,
|
|
220
|
+
} = options;
|
|
189
221
|
|
|
190
222
|
const { wallet, node } = walletAndNodeWrapper;
|
|
191
223
|
|
|
@@ -199,6 +231,7 @@ export function injectCommands(
|
|
|
199
231
|
publicDeploy,
|
|
200
232
|
skipInitialization,
|
|
201
233
|
CLIFeeArgs.parse(options, log, db),
|
|
234
|
+
parseWaitForStatus(waitForStatusStr),
|
|
202
235
|
json,
|
|
203
236
|
verbose,
|
|
204
237
|
debugLogger,
|
|
@@ -219,7 +252,7 @@ export function injectCommands(
|
|
|
219
252
|
)
|
|
220
253
|
.option(
|
|
221
254
|
'-s, --salt <hex string>',
|
|
222
|
-
'Optional deployment salt as a hex string for generating the deployment address.',
|
|
255
|
+
'Optional deployment salt as a hex string for generating the deployment address. Defaults to random.',
|
|
223
256
|
parseFieldFromHexString,
|
|
224
257
|
)
|
|
225
258
|
.option('--universal', 'Do not mix the sender address into the deployment.')
|
|
@@ -238,6 +271,7 @@ export function injectCommands(
|
|
|
238
271
|
'The amount of time in seconds to wait for the deployment to post to L2',
|
|
239
272
|
).conflicts('wait'),
|
|
240
273
|
)
|
|
274
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
241
275
|
.addOption(createVerboseOption());
|
|
242
276
|
|
|
243
277
|
addOptions(deployCommand, CLIFeeArgs.getOptions()).action(async (artifactPathPromise, _options, command) => {
|
|
@@ -249,6 +283,7 @@ export function injectCommands(
|
|
|
249
283
|
args,
|
|
250
284
|
salt,
|
|
251
285
|
wait,
|
|
286
|
+
waitForStatus: waitForStatusStr,
|
|
252
287
|
classRegistration,
|
|
253
288
|
init,
|
|
254
289
|
publicDeployment,
|
|
@@ -262,12 +297,12 @@ export function injectCommands(
|
|
|
262
297
|
const { wallet, node } = walletAndNodeWrapper;
|
|
263
298
|
const artifactPath = await artifactPathPromise;
|
|
264
299
|
|
|
265
|
-
debugLogger.info(`Using wallet with address ${parsedFromAddress
|
|
300
|
+
debugLogger.info(`Using wallet with address ${parsedFromAddress?.toString() ?? '<none>'}`);
|
|
266
301
|
|
|
267
302
|
const address = await deploy(
|
|
268
303
|
wallet,
|
|
269
304
|
node,
|
|
270
|
-
|
|
305
|
+
parsedFromAddress,
|
|
271
306
|
artifactPath,
|
|
272
307
|
json,
|
|
273
308
|
publicKey,
|
|
@@ -279,10 +314,12 @@ export function injectCommands(
|
|
|
279
314
|
typeof init === 'string' ? false : init,
|
|
280
315
|
wait,
|
|
281
316
|
CLIFeeArgs.parse(options, log, db),
|
|
282
|
-
|
|
317
|
+
parseWaitForStatus(waitForStatusStr),
|
|
283
318
|
verbose,
|
|
319
|
+
timeout,
|
|
284
320
|
debugLogger,
|
|
285
321
|
log,
|
|
322
|
+
universal,
|
|
286
323
|
);
|
|
287
324
|
if (db && address) {
|
|
288
325
|
await db.storeContract(address, artifactPath, log, alias);
|
|
@@ -308,6 +345,7 @@ export function injectCommands(
|
|
|
308
345
|
)
|
|
309
346
|
.addOption(createAccountOption('Alias or address of the account to send the transaction from', !db, db))
|
|
310
347
|
.option('--no-wait', 'Print transaction hash without waiting for it to be mined')
|
|
348
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
311
349
|
.addOption(createVerboseOption());
|
|
312
350
|
|
|
313
351
|
addOptions(sendCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command) => {
|
|
@@ -319,6 +357,7 @@ export function injectCommands(
|
|
|
319
357
|
contractAddress,
|
|
320
358
|
from: parsedFromAddress,
|
|
321
359
|
wait,
|
|
360
|
+
waitForStatus: waitForStatusStr,
|
|
322
361
|
alias,
|
|
323
362
|
authWitness: authWitnessArray,
|
|
324
363
|
verbose,
|
|
@@ -342,6 +381,7 @@ export function injectCommands(
|
|
|
342
381
|
alias,
|
|
343
382
|
CLIFeeArgs.parse(options, log, db),
|
|
344
383
|
authWitnesses,
|
|
384
|
+
parseWaitForStatus(waitForStatusStr),
|
|
345
385
|
verbose,
|
|
346
386
|
log,
|
|
347
387
|
);
|
|
@@ -492,6 +532,20 @@ export function injectCommands(
|
|
|
492
532
|
}
|
|
493
533
|
});
|
|
494
534
|
|
|
535
|
+
program
|
|
536
|
+
.command('get-fee-juice-balance')
|
|
537
|
+
.description('Checks the Fee Juice balance for a given address.')
|
|
538
|
+
.argument('<address>', 'Aztec address or alias to check balance for', address =>
|
|
539
|
+
aliasedAddressParser('accounts', address, db),
|
|
540
|
+
)
|
|
541
|
+
.option('--json', 'Emit output as json')
|
|
542
|
+
.option('--exact', 'Show exact balance with all 18 decimal places')
|
|
543
|
+
.action(async (address, options) => {
|
|
544
|
+
const { getFeeJuiceBalanceCmd } = await import('./get_fee_juice_balance.js');
|
|
545
|
+
const { json, exact } = options;
|
|
546
|
+
await getFeeJuiceBalanceCmd(walletAndNodeWrapper.node, address, json, exact, log);
|
|
547
|
+
});
|
|
548
|
+
|
|
495
549
|
program
|
|
496
550
|
.command('create-authwit')
|
|
497
551
|
.description(
|
package/src/cmds/send.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { AuthWitness } from '@aztec/aztec.js/authorization';
|
|
3
3
|
import { Contract, NO_WAIT, type SendInteractionOptions } from '@aztec/aztec.js/contracts';
|
|
4
|
-
import type
|
|
4
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
5
5
|
import { prepTx } from '@aztec/cli/utils';
|
|
6
6
|
import type { LogFn } from '@aztec/foundation/log';
|
|
7
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
7
8
|
|
|
8
9
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
9
10
|
import { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -22,6 +23,7 @@ export async function send(
|
|
|
22
23
|
cancellable: boolean,
|
|
23
24
|
feeOpts: CLIFeeArgs,
|
|
24
25
|
authWitnesses: AuthWitness[],
|
|
26
|
+
waitForStatus: TxStatus,
|
|
25
27
|
verbose: boolean,
|
|
26
28
|
log: LogFn,
|
|
27
29
|
) {
|
|
@@ -37,12 +39,13 @@ export async function send(
|
|
|
37
39
|
authWitnesses,
|
|
38
40
|
};
|
|
39
41
|
|
|
42
|
+
const localStart = performance.now();
|
|
40
43
|
const sim = await call.simulate({
|
|
41
44
|
...sendOptions,
|
|
42
|
-
|
|
45
|
+
includeMetadata: true,
|
|
43
46
|
});
|
|
44
|
-
//
|
|
45
|
-
const estimatedGas = sim.
|
|
47
|
+
// includeMetadata: true guarantees these fields are present
|
|
48
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed!);
|
|
46
49
|
const stats = sim.stats!;
|
|
47
50
|
|
|
48
51
|
if (feeOpts.estimateOnly) {
|
|
@@ -53,21 +56,29 @@ export async function send(
|
|
|
53
56
|
printProfileResult(stats!, log);
|
|
54
57
|
}
|
|
55
58
|
|
|
59
|
+
const { txHash } = await call.send({
|
|
60
|
+
...sendOptions,
|
|
61
|
+
fee: { ...sendOptions.fee, gasSettings: estimatedGas },
|
|
62
|
+
wait: NO_WAIT,
|
|
63
|
+
});
|
|
64
|
+
const localTimeMs = performance.now() - localStart;
|
|
65
|
+
|
|
66
|
+
log(`\nTransaction hash: ${txHash.toString()}`);
|
|
67
|
+
|
|
56
68
|
if (wait) {
|
|
57
69
|
try {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
wait: { timeout: DEFAULT_TX_TIMEOUT_S },
|
|
62
|
-
});
|
|
70
|
+
const nodeStart = performance.now();
|
|
71
|
+
const receipt = await waitForTx(node, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
72
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
63
73
|
|
|
64
|
-
const
|
|
65
|
-
log(
|
|
66
|
-
log('Transaction has been mined');
|
|
74
|
+
const statusLabel = waitForStatus === TxStatus.PROPOSED ? 'proposed' : 'checkpointed';
|
|
75
|
+
log(`Transaction has been ${statusLabel}`);
|
|
67
76
|
log(` Tx fee: ${receipt.transactionFee}`);
|
|
68
77
|
log(` Status: ${receipt.status}`);
|
|
69
78
|
log(` Block number: ${receipt.blockNumber}`);
|
|
70
79
|
log(` Block hash: ${receipt.blockHash?.toString()}`);
|
|
80
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
81
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
71
82
|
|
|
72
83
|
return {
|
|
73
84
|
txHash,
|
|
@@ -77,12 +88,6 @@ export async function send(
|
|
|
77
88
|
throw err;
|
|
78
89
|
}
|
|
79
90
|
} else {
|
|
80
|
-
const { txHash } = await call.send({
|
|
81
|
-
...sendOptions,
|
|
82
|
-
fee: { ...sendOptions.fee, gasSettings: estimatedGas },
|
|
83
|
-
wait: NO_WAIT,
|
|
84
|
-
});
|
|
85
|
-
log(`\nTransaction hash: ${txHash.toString()}`);
|
|
86
91
|
log('Transaction pending. Check status with check-tx');
|
|
87
92
|
return {
|
|
88
93
|
txHash,
|
package/src/storage/wallet_db.ts
CHANGED
|
@@ -70,6 +70,20 @@ export class WalletDB {
|
|
|
70
70
|
return { amount: BigInt(amountStr), secret: secretStr, leafIndex: BigInt(leafIndexStr) };
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
async peekBridgedFeeJuice(recipient: AztecAddress, log: LogFn) {
|
|
74
|
+
const stackPointer =
|
|
75
|
+
(await this.#bridgedFeeJuice.getAsync(`${recipient.toString()}:stackPointer`))?.readInt8() || 0;
|
|
76
|
+
const result = await this.#bridgedFeeJuice.getAsync(`${recipient.toString()}:${stackPointer}`);
|
|
77
|
+
if (!result) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`No stored fee juice available for recipient ${recipient.toString()}. Please provide claim amount and secret. Stack pointer ${stackPointer}`,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
const [amountStr, secretStr, leafIndexStr] = result.toString().split(':');
|
|
83
|
+
log(`Peeked ${amountStr} fee juice for recipient ${recipient.toString()}. Stack pointer ${stackPointer}`);
|
|
84
|
+
return { amount: BigInt(amountStr), secret: secretStr, leafIndex: BigInt(leafIndexStr) };
|
|
85
|
+
}
|
|
86
|
+
|
|
73
87
|
async storeAccount(
|
|
74
88
|
address: AztecAddress,
|
|
75
89
|
{
|
package/src/utils/constants.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
export const MIN_FEE_PADDING = 0.5;
|
|
2
2
|
|
|
3
|
-
export const AccountTypes = [
|
|
3
|
+
export const AccountTypes = [
|
|
4
|
+
'schnorr',
|
|
5
|
+
'schnorr_initializerless',
|
|
6
|
+
'ecdsasecp256r1',
|
|
7
|
+
'ecdsasecp256r1ssh',
|
|
8
|
+
'ecdsasecp256k1',
|
|
9
|
+
] as const;
|
|
4
10
|
export type AccountType = (typeof AccountTypes)[number];
|