@aztec-labs/cli-wallet 6.0.0-nightly.20260829
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 +32 -0
- package/dest/bin/index.d.ts +3 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +96 -0
- package/dest/cmds/authorize_action.d.ts +5 -0
- package/dest/cmds/authorize_action.d.ts.map +1 -0
- package/dest/cmds/authorize_action.js +23 -0
- package/dest/cmds/bridge_fee_juice.d.ts +6 -0
- package/dest/cmds/bridge_fee_juice.d.ts.map +1 -0
- package/dest/cmds/bridge_fee_juice.js +54 -0
- package/dest/cmds/check_tx.d.ts +6 -0
- package/dest/cmds/check_tx.d.ts.map +1 -0
- package/dest/cmds/check_tx.js +181 -0
- package/dest/cmds/create_account.d.ts +17 -0
- package/dest/cmds/create_account.d.ts.map +1 -0
- package/dest/cmds/create_account.js +146 -0
- package/dest/cmds/create_authwit.d.ts +5 -0
- package/dest/cmds/create_authwit.d.ts.map +1 -0
- package/dest/cmds/create_authwit.js +16 -0
- package/dest/cmds/deploy.d.ts +10 -0
- package/dest/cmds/deploy.d.ts.map +1 -0
- package/dest/cmds/deploy.js +129 -0
- package/dest/cmds/deploy_account.d.ts +8 -0
- package/dest/cmds/deploy_account.d.ts.map +1 -0
- package/dest/cmds/deploy_account.js +111 -0
- 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 +5 -0
- package/dest/cmds/import_test_accounts.d.ts.map +1 -0
- package/dest/cmds/import_test_accounts.js +40 -0
- package/dest/cmds/index.d.ts +6 -0
- package/dest/cmds/index.d.ts.map +1 -0
- package/dest/cmds/index.js +208 -0
- package/dest/cmds/profile.d.ts +8 -0
- package/dest/cmds/profile.d.ts.map +1 -0
- package/dest/cmds/profile.js +28 -0
- package/dest/cmds/register_contract.d.ts +8 -0
- package/dest/cmds/register_contract.d.ts.map +1 -0
- package/dest/cmds/register_contract.js +27 -0
- package/dest/cmds/register_sender.d.ts +5 -0
- package/dest/cmds/register_sender.d.ts.map +1 -0
- package/dest/cmds/register_sender.js +4 -0
- package/dest/cmds/send.d.ts +11 -0
- package/dest/cmds/send.d.ts.map +1 -0
- package/dest/cmds/send.js +73 -0
- package/dest/cmds/simulate.d.ts +8 -0
- package/dest/cmds/simulate.d.ts.map +1 -0
- package/dest/cmds/simulate.js +33 -0
- package/dest/storage/wallet_db.d.ts +61 -0
- package/dest/storage/wallet_db.d.ts.map +1 -0
- package/dest/storage/wallet_db.js +231 -0
- package/dest/utils/authorizations.d.ts +6 -0
- package/dest/utils/authorizations.d.ts.map +1 -0
- package/dest/utils/authorizations.js +28 -0
- package/dest/utils/cli_wallet_and_node_wrapper.d.ts +12 -0
- package/dest/utils/cli_wallet_and_node_wrapper.d.ts.map +1 -0
- package/dest/utils/cli_wallet_and_node_wrapper.js +25 -0
- package/dest/utils/constants.d.ts +4 -0
- package/dest/utils/constants.d.ts.map +1 -0
- package/dest/utils/constants.js +8 -0
- package/dest/utils/ecdsa.d.ts +2 -0
- package/dest/utils/ecdsa.d.ts.map +1 -0
- package/dest/utils/ecdsa.js +13 -0
- package/dest/utils/options/fees.d.ts +36 -0
- package/dest/utils/options/fees.d.ts.map +1 -0
- package/dest/utils/options/fees.js +250 -0
- package/dest/utils/options/index.d.ts +3 -0
- package/dest/utils/options/index.d.ts.map +1 -0
- package/dest/utils/options/index.js +2 -0
- package/dest/utils/options/options.d.ts +24 -0
- package/dest/utils/options/options.d.ts.map +1 -0
- package/dest/utils/options/options.js +134 -0
- package/dest/utils/profiling.d.ts +5 -0
- package/dest/utils/profiling.d.ts.map +1 -0
- package/dest/utils/profiling.js +68 -0
- package/dest/utils/wallet.d.ts +64 -0
- package/dest/utils/wallet.d.ts.map +1 -0
- package/dest/utils/wallet.js +285 -0
- package/dest/utils/well_known_contracts.d.ts +8 -0
- package/dest/utils/well_known_contracts.d.ts.map +1 -0
- package/dest/utils/well_known_contracts.js +38 -0
- package/package.json +108 -0
- package/src/bin/index.ts +141 -0
- package/src/cmds/authorize_action.ts +47 -0
- package/src/cmds/bridge_fee_juice.ts +92 -0
- package/src/cmds/check_tx.ts +220 -0
- package/src/cmds/create_account.ts +176 -0
- package/src/cmds/create_authwit.ts +39 -0
- package/src/cmds/deploy.ts +157 -0
- package/src/cmds/deploy_account.ts +140 -0
- package/src/cmds/get_fee_juice_balance.ts +37 -0
- package/src/cmds/import_test_accounts.ts +54 -0
- package/src/cmds/index.ts +732 -0
- package/src/cmds/profile.ts +47 -0
- package/src/cmds/register_contract.ts +43 -0
- package/src/cmds/register_sender.ts +8 -0
- package/src/cmds/send.ts +96 -0
- package/src/cmds/simulate.ts +55 -0
- package/src/storage/wallet_db.ts +264 -0
- package/src/utils/authorizations.ts +50 -0
- package/src/utils/cli_wallet_and_node_wrapper.ts +35 -0
- package/src/utils/constants.ts +10 -0
- package/src/utils/ecdsa.ts +15 -0
- package/src/utils/options/fees.ts +325 -0
- package/src/utils/options/index.ts +2 -0
- package/src/utils/options/options.ts +196 -0
- package/src/utils/profiling.ts +171 -0
- package/src/utils/wallet.ts +377 -0
- package/src/utils/well_known_contracts.ts +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAInE,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACjD,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,2BAA2B,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAsB,MAAM,CAC1B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,GAAG,EAAE,EACd,IAAI,EAAE,EAAE,GAAG,SAAS,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,uBAAuB,EAAE,OAAO,EAChC,oBAAoB,EAAE,OAAO,EAC7B,kBAAkB,EAAE,OAAO,GAAG,SAAS,EACvC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,QAAQ,EACvB,OAAO,EAAE,OAAO,EAChB,OAAO,oBAA+B,EACtC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK,EACV,SAAS,CAAC,EAAE,OAAO,yBAsHpB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec-labs/aztec.js/account';
|
|
2
|
+
import { NO_WAIT } from '@aztec-labs/aztec.js/contracts';
|
|
3
|
+
import { ContractDeployer } from '@aztec-labs/aztec.js/deployment';
|
|
4
|
+
import { Fr } from '@aztec-labs/aztec.js/fields';
|
|
5
|
+
import { waitForTx } from '@aztec-labs/aztec.js/node';
|
|
6
|
+
import { encodeArgs, getContractArtifact, prettyPrintJSON } from '@aztec-labs/cli/utils';
|
|
7
|
+
import { getAllFunctionAbis, getInitializer } from '@aztec-labs/stdlib/abi';
|
|
8
|
+
import { PublicKeys } from '@aztec-labs/stdlib/keys';
|
|
9
|
+
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
10
|
+
import { printProfileResult } from '../utils/profiling.js';
|
|
11
|
+
export async function deploy(wallet, node, deployer, artifactPath, json, publicKeys, rawArgs, salt, initializer, skipInstancePublication, skipClassPublication, skipInitialization, wait, feeOpts, waitForStatus, verbose, timeout = DEFAULT_TX_TIMEOUT_S, debugLogger, log, universal) {
|
|
12
|
+
const out = {};
|
|
13
|
+
salt ??= Fr.random();
|
|
14
|
+
const contractArtifact = await getContractArtifact(artifactPath, log);
|
|
15
|
+
const hasInitializer = getAllFunctionAbis(contractArtifact).some((fn)=>fn.isInitializer);
|
|
16
|
+
const constructorArtifact = hasInitializer ? getInitializer(contractArtifact, initializer) : undefined;
|
|
17
|
+
// TODO(#12081): Add contractArtifact.noirVersion and check here (via Noir.lock)?
|
|
18
|
+
const contractDeployer = new ContractDeployer(contractArtifact, wallet, initializer);
|
|
19
|
+
let args = [];
|
|
20
|
+
if (rawArgs.length > 0) {
|
|
21
|
+
if (!constructorArtifact) {
|
|
22
|
+
throw new Error(`Cannot process constructor arguments as no constructor was found`);
|
|
23
|
+
}
|
|
24
|
+
debugLogger.debug(`Input arguments: ${rawArgs.map((x)=>`"${x}"`).join(', ')}`);
|
|
25
|
+
args = encodeArgs(rawArgs, constructorArtifact.parameters);
|
|
26
|
+
debugLogger.debug(`Encoded arguments: ${args.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
const deployInteraction = contractDeployer.deploy(args, {
|
|
29
|
+
salt,
|
|
30
|
+
publicKeys: publicKeys ?? PublicKeys.default(),
|
|
31
|
+
...universal ? {
|
|
32
|
+
universalDeploy: true
|
|
33
|
+
} : {}
|
|
34
|
+
});
|
|
35
|
+
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, deployer);
|
|
36
|
+
const deployOpts = {
|
|
37
|
+
fee: {
|
|
38
|
+
gasSettings,
|
|
39
|
+
paymentMethod
|
|
40
|
+
},
|
|
41
|
+
from: deployer ?? NO_FROM,
|
|
42
|
+
skipClassPublication,
|
|
43
|
+
skipInitialization,
|
|
44
|
+
skipInstancePublication
|
|
45
|
+
};
|
|
46
|
+
const localStart = performance.now();
|
|
47
|
+
const sim = await deployInteraction.simulate({
|
|
48
|
+
...deployOpts,
|
|
49
|
+
includeMetadata: true
|
|
50
|
+
});
|
|
51
|
+
// includeMetadata: true guarantees these fields are present
|
|
52
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed);
|
|
53
|
+
const stats = sim.stats;
|
|
54
|
+
if (feeOpts.estimateOnly) {
|
|
55
|
+
if (json) {
|
|
56
|
+
out.fee = {
|
|
57
|
+
gasLimits: {
|
|
58
|
+
da: estimatedGas.gasLimits.daGas,
|
|
59
|
+
l2: estimatedGas.gasLimits.l2Gas
|
|
60
|
+
},
|
|
61
|
+
teardownGasLimits: {
|
|
62
|
+
da: estimatedGas.teardownGasLimits.daGas,
|
|
63
|
+
l2: estimatedGas.teardownGasLimits
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
if (verbose) {
|
|
69
|
+
printProfileResult(stats, log);
|
|
70
|
+
}
|
|
71
|
+
const instance = await deployInteraction.getInstance();
|
|
72
|
+
const address = instance.address;
|
|
73
|
+
const partialAddress = await deployInteraction.getPartialAddress();
|
|
74
|
+
const { txHash } = await deployInteraction.send({
|
|
75
|
+
...deployOpts,
|
|
76
|
+
wait: NO_WAIT
|
|
77
|
+
});
|
|
78
|
+
const localTimeMs = performance.now() - localStart;
|
|
79
|
+
debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
|
|
80
|
+
out.hash = txHash;
|
|
81
|
+
if (wait) {
|
|
82
|
+
const nodeStart = performance.now();
|
|
83
|
+
const receipt = await waitForTx(node, txHash, {
|
|
84
|
+
timeout,
|
|
85
|
+
waitForStatus
|
|
86
|
+
});
|
|
87
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
88
|
+
if (!json) {
|
|
89
|
+
log(`Contract deployed at ${address.toString()}`);
|
|
90
|
+
log(`Contract partial address ${partialAddress.toString()}`);
|
|
91
|
+
log(`Contract init hash ${instance.initializationHash.toString()}`);
|
|
92
|
+
log(`Deployment tx hash: ${txHash.toString()}`);
|
|
93
|
+
log(`Deployment salt: ${salt.toString()}`);
|
|
94
|
+
log(`Deployer: ${instance.deployer.toString()}`);
|
|
95
|
+
log(`Transaction fee: ${receipt.transactionFee?.toString()}`);
|
|
96
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
97
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
98
|
+
} else {
|
|
99
|
+
out.contract = {
|
|
100
|
+
address: address.toString(),
|
|
101
|
+
partialAddress: partialAddress.toString(),
|
|
102
|
+
initializationHash: instance.initializationHash.toString(),
|
|
103
|
+
salt: salt.toString(),
|
|
104
|
+
transactionFee: receipt.transactionFee?.toString()
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
if (!json) {
|
|
109
|
+
log(`Contract deployed at ${address.toString()}`);
|
|
110
|
+
log(`Contract partial address ${partialAddress.toString()}`);
|
|
111
|
+
log(`Contract init hash ${instance.initializationHash.toString()}`);
|
|
112
|
+
log(`Deployment tx hash: ${txHash.toString()}`);
|
|
113
|
+
log(`Deployment salt: ${salt.toString()}`);
|
|
114
|
+
log(`Deployer: ${instance.deployer.toString()}`);
|
|
115
|
+
} else {
|
|
116
|
+
out.contract = {
|
|
117
|
+
address: address.toString(),
|
|
118
|
+
partialAddress: partialAddress.toString(),
|
|
119
|
+
initializationHash: instance.initializationHash.toString(),
|
|
120
|
+
salt: salt.toString()
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (json) {
|
|
126
|
+
log(prettyPrintJSON(out));
|
|
127
|
+
}
|
|
128
|
+
return await deployInteraction.getAddress();
|
|
129
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AztecAddress } from '@aztec-labs/aztec.js/addresses';
|
|
2
|
+
import { type AztecNode } from '@aztec-labs/aztec.js/node';
|
|
3
|
+
import type { LogFn, Logger } from '@aztec-labs/foundation/log';
|
|
4
|
+
import type { TxStatus } from '@aztec-labs/stdlib/tx';
|
|
5
|
+
import type { CLIFeeArgs } from '../utils/options/fees.js';
|
|
6
|
+
import type { CLIWallet } from '../utils/wallet.js';
|
|
7
|
+
export declare function deployAccount(wallet: CLIWallet, aztecNode: AztecNode, address: AztecAddress, wait: boolean, deployer: AztecAddress | undefined, registerClass: boolean, publicDeploy: boolean, skipInitialization: boolean, feeOpts: CLIFeeArgs, waitForStatus: TxStatus, json: boolean, verbose: boolean, debugLogger: Logger, log: LogFn): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95X2FjY291bnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2RlcGxveV9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU5RCxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUd0RSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3pFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELHdCQUFzQixhQUFhLENBQ2pDLE1BQU0sRUFBRSxTQUFTLEVBQ2pCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQ3JCLElBQUksRUFBRSxPQUFPLEVBQ2IsUUFBUSxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQ2xDLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLFlBQVksRUFBRSxPQUFPLEVBQ3JCLGtCQUFrQixFQUFFLE9BQU8sRUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFDbkIsYUFBYSxFQUFFLFFBQVEsRUFDdkIsSUFBSSxFQUFFLE9BQU8sRUFDYixPQUFPLEVBQUUsT0FBTyxFQUNoQixXQUFXLEVBQUUsTUFBTSxFQUNuQixHQUFHLEVBQUUsS0FBSyxpQkErR1gifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy_account.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy_account.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,2BAA2B,CAAC;AAGtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAqB,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,aAAa,EAAE,OAAO,EACtB,YAAY,EAAE,OAAO,EACrB,kBAAkB,EAAE,OAAO,EAC3B,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,QAAQ,EACvB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK,iBA+GX"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { NO_FROM } from '@aztec-labs/aztec.js/account';
|
|
2
|
+
import { NO_WAIT } from '@aztec-labs/aztec.js/contracts';
|
|
3
|
+
import { waitForTx } from '@aztec-labs/aztec.js/node';
|
|
4
|
+
import { prettyPrintJSON } from '@aztec-labs/cli/cli-utils';
|
|
5
|
+
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
6
|
+
import { printProfileResult } from '../utils/profiling.js';
|
|
7
|
+
export async function deployAccount(wallet, aztecNode, address, wait, deployer, registerClass, publicDeploy, skipInitialization, feeOpts, waitForStatus, json, verbose, debugLogger, log) {
|
|
8
|
+
const out = {};
|
|
9
|
+
const account = await wallet.retrieveAccount(address);
|
|
10
|
+
const { partialAddress, publicKeys } = await account.getCompleteAddress();
|
|
11
|
+
const { initializationHash, salt } = account.getInstance();
|
|
12
|
+
if (json) {
|
|
13
|
+
out.address = address;
|
|
14
|
+
out.partialAddress = partialAddress;
|
|
15
|
+
out.salt = salt;
|
|
16
|
+
out.initHash = initializationHash;
|
|
17
|
+
out.deployer = deployer;
|
|
18
|
+
} else {
|
|
19
|
+
log(`\nNew account:\n`);
|
|
20
|
+
log(`Address: ${address.toString()}`);
|
|
21
|
+
log(`Public key: ${publicKeys.toString()}`);
|
|
22
|
+
log(`Partial address: ${partialAddress.toString()}`);
|
|
23
|
+
log(`Salt: ${salt.toString()}`);
|
|
24
|
+
log(`Init hash: ${initializationHash.toString()}`);
|
|
25
|
+
}
|
|
26
|
+
let txHash;
|
|
27
|
+
let txReceipt;
|
|
28
|
+
const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
|
|
29
|
+
const delegatedDeployment = deployer && !account.address.equals(deployer);
|
|
30
|
+
const from = delegatedDeployment ? deployer : NO_FROM;
|
|
31
|
+
const deployAccountOpts = {
|
|
32
|
+
skipClassPublication: !registerClass,
|
|
33
|
+
skipInstancePublication: !publicDeploy,
|
|
34
|
+
skipInitialization,
|
|
35
|
+
from,
|
|
36
|
+
fee: {
|
|
37
|
+
paymentMethod,
|
|
38
|
+
gasSettings
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const localStart = performance.now();
|
|
42
|
+
const deployMethod = await account.getDeployMethod();
|
|
43
|
+
const sim = await deployMethod.simulate({
|
|
44
|
+
...deployAccountOpts,
|
|
45
|
+
includeMetadata: true
|
|
46
|
+
});
|
|
47
|
+
// includeMetadata: true guarantees these fields are present
|
|
48
|
+
const estimatedGas = await wallet.estimateGasLimits(sim.gasUsed);
|
|
49
|
+
const stats = sim.stats;
|
|
50
|
+
if (feeOpts.estimateOnly) {
|
|
51
|
+
if (json) {
|
|
52
|
+
out.fee = {
|
|
53
|
+
gasLimits: {
|
|
54
|
+
da: estimatedGas.gasLimits.daGas,
|
|
55
|
+
l2: estimatedGas.gasLimits.l2Gas
|
|
56
|
+
},
|
|
57
|
+
teardownGasLimits: {
|
|
58
|
+
da: estimatedGas.teardownGasLimits.daGas,
|
|
59
|
+
l2: estimatedGas.teardownGasLimits
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
if (verbose) {
|
|
65
|
+
printProfileResult(stats, log);
|
|
66
|
+
}
|
|
67
|
+
if (!json) {
|
|
68
|
+
log(`\nWaiting for account contract deployment...`);
|
|
69
|
+
}
|
|
70
|
+
const sendOpts = {
|
|
71
|
+
...deployAccountOpts,
|
|
72
|
+
fee: deployAccountOpts.fee ? {
|
|
73
|
+
...deployAccountOpts.fee,
|
|
74
|
+
gasSettings: estimatedGas
|
|
75
|
+
} : undefined
|
|
76
|
+
};
|
|
77
|
+
({ txHash } = await deployMethod.send({
|
|
78
|
+
...sendOpts,
|
|
79
|
+
wait: NO_WAIT
|
|
80
|
+
}));
|
|
81
|
+
const localTimeMs = performance.now() - localStart;
|
|
82
|
+
if (wait) {
|
|
83
|
+
const nodeStart = performance.now();
|
|
84
|
+
txReceipt = await waitForTx(aztecNode, txHash, {
|
|
85
|
+
timeout: DEFAULT_TX_TIMEOUT_S,
|
|
86
|
+
waitForStatus
|
|
87
|
+
});
|
|
88
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
89
|
+
out.txReceipt = {
|
|
90
|
+
status: txReceipt.status,
|
|
91
|
+
transactionFee: txReceipt.transactionFee
|
|
92
|
+
};
|
|
93
|
+
if (!json) {
|
|
94
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
95
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
|
|
99
|
+
out.txHash = txHash;
|
|
100
|
+
}
|
|
101
|
+
if (json) {
|
|
102
|
+
log(prettyPrintJSON(out));
|
|
103
|
+
} else {
|
|
104
|
+
if (txHash) {
|
|
105
|
+
log(`Deploy tx hash: ${txHash.toString()}`);
|
|
106
|
+
}
|
|
107
|
+
if (txReceipt) {
|
|
108
|
+
log(`Deploy tx fee: ${txReceipt.transactionFee}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec-labs/aztec.js/addresses';
|
|
2
|
+
import type { AztecNode } from '@aztec-labs/aztec.js/node';
|
|
3
|
+
import type { LogFn } from '@aztec-labs/foundation/log';
|
|
4
|
+
export declare function getFeeJuiceBalanceCmd(node: AztecNode, address: AztecAddress, json: boolean, exact: boolean, log: LogFn): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0X2ZlZV9qdWljZV9iYWxhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY21kcy9nZXRfZmVlX2p1aWNlX2JhbGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHM0QsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFtQnhELHdCQUFzQixxQkFBcUIsQ0FDekMsSUFBSSxFQUFFLFNBQVMsRUFDZixPQUFPLEVBQUUsWUFBWSxFQUNyQixJQUFJLEVBQUUsT0FBTyxFQUNiLEtBQUssRUFBRSxPQUFPLEVBQ2QsR0FBRyxFQUFFLEtBQUssaUJBUVgifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_fee_juice_balance.d.ts","sourceRoot":"","sources":["../../src/cmds/get_fee_juice_balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAmBxD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,KAAK,iBAQX"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { getFeeJuiceBalance } from '@aztec-labs/aztec.js/utils';
|
|
2
|
+
import { prettyPrintJSON } from '@aztec-labs/cli/cli-utils';
|
|
3
|
+
const FEE_JUICE_DECIMALS = 18;
|
|
4
|
+
const FEE_JUICE_UNIT = 10n ** BigInt(FEE_JUICE_DECIMALS);
|
|
5
|
+
/** Formats a raw FeeJuice balance (18 decimals) for human-readable display. */ function formatFeeJuice(raw, exact) {
|
|
6
|
+
const whole = raw / FEE_JUICE_UNIT;
|
|
7
|
+
const fractional = raw % FEE_JUICE_UNIT;
|
|
8
|
+
const fracStr = fractional.toString().padStart(FEE_JUICE_DECIMALS, '0');
|
|
9
|
+
if (exact) {
|
|
10
|
+
return `${whole}.${fracStr} FJ`;
|
|
11
|
+
}
|
|
12
|
+
if (fractional === 0n) {
|
|
13
|
+
return `${whole} FJ`;
|
|
14
|
+
}
|
|
15
|
+
return `${whole}.${fracStr.replace(/0+$/, '')} FJ`;
|
|
16
|
+
}
|
|
17
|
+
export async function getFeeJuiceBalanceCmd(node, address, json, exact, log) {
|
|
18
|
+
const balance = await getFeeJuiceBalance(address, node);
|
|
19
|
+
if (json) {
|
|
20
|
+
log(prettyPrintJSON({
|
|
21
|
+
address: address.toString(),
|
|
22
|
+
balance: balance.toString()
|
|
23
|
+
}));
|
|
24
|
+
} else {
|
|
25
|
+
log(`Fee Juice balance for ${address.toString()}: ${formatFeeJuice(balance, exact)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LogFn } from '@aztec-labs/foundation/log';
|
|
2
|
+
import type { WalletDB } from '../storage/wallet_db.js';
|
|
3
|
+
import type { CLIWallet } from '../utils/wallet.js';
|
|
4
|
+
export declare function importTestAccounts(wallet: CLIWallet, db: WalletDB, json: boolean, log: LogFn): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0X3Rlc3RfYWNjb3VudHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2ltcG9ydF90ZXN0X2FjY291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkE2Q2xHIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import_test_accounts.d.ts","sourceRoot":"","sources":["../../src/cmds/import_test_accounts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,iBA6ClG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getInitialTestAccountsData } from '@aztec-labs/accounts/testing';
|
|
2
|
+
import { Fr } from '@aztec-labs/aztec.js/fields';
|
|
3
|
+
import { prettyPrintJSON } from '@aztec-labs/cli/cli-utils';
|
|
4
|
+
export async function importTestAccounts(wallet, db, json, log) {
|
|
5
|
+
const testAccounts = await getInitialTestAccountsData();
|
|
6
|
+
const out = {};
|
|
7
|
+
await Promise.all(testAccounts.map(async (account, i)=>{
|
|
8
|
+
const alias = `test${i}`;
|
|
9
|
+
const secret = testAccounts[i].secret;
|
|
10
|
+
const salt = new Fr(account.salt);
|
|
11
|
+
const address = account.address;
|
|
12
|
+
await db.storeAccount(address, {
|
|
13
|
+
type: 'schnorr_initializerless',
|
|
14
|
+
signingKey: account.signingKey,
|
|
15
|
+
secretKey: secret,
|
|
16
|
+
salt,
|
|
17
|
+
alias,
|
|
18
|
+
publicKey: undefined
|
|
19
|
+
}, log);
|
|
20
|
+
if (json) {
|
|
21
|
+
out[alias] = {
|
|
22
|
+
alias,
|
|
23
|
+
address,
|
|
24
|
+
secret,
|
|
25
|
+
salt
|
|
26
|
+
};
|
|
27
|
+
} else {
|
|
28
|
+
log(`\nTest account:`);
|
|
29
|
+
log(`Alias: ${alias}`);
|
|
30
|
+
log(`Address: ${address}`);
|
|
31
|
+
log(`Secret key: ${secret}`);
|
|
32
|
+
log(`Salt: ${salt}`);
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
if (json) {
|
|
36
|
+
log(prettyPrintJSON(out));
|
|
37
|
+
} else {
|
|
38
|
+
log(`\n${testAccounts.length} test accounts imported to wallet db.\n`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LogFn, Logger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { type Command } from 'commander';
|
|
3
|
+
import type { WalletDB } from '../storage/wallet_db.js';
|
|
4
|
+
import type { CliWalletAndNodeWrapper } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
5
|
+
export declare function injectCommands(program: Command, log: LogFn, debugLogger: Logger, walletAndNodeWrapper: CliWalletAndNodeWrapper, db: WalletDB): Command;
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWFBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQVUsTUFBTSxXQUFXLENBQUM7QUFHakQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1DdkYsd0JBQWdCLGNBQWMsQ0FDNUIsT0FBTyxFQUFFLE9BQU8sRUFDaEIsR0FBRyxFQUFFLEtBQUssRUFDVixXQUFXLEVBQUUsTUFBTSxFQUNuQixvQkFBb0IsRUFBRSx1QkFBdUIsRUFDN0MsRUFBRSxFQUFFLFFBQVEsV0FncUJiIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cmds/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AAGjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAmCvF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,KAAK,EACV,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,uBAAuB,EAC7C,EAAE,EAAE,QAAQ,WAgqBb"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { getIdentities } from '@aztec-labs/accounts/utils';
|
|
2
|
+
import { TxHash } from '@aztec-labs/aztec.js/tx';
|
|
3
|
+
import { ETHEREUM_HOSTS, PRIVATE_KEY, addOptions, createSigningKeyOption, l1ChainIdOption, parseBigint, parseFieldFromHexString, parsePublicKey } from '@aztec-labs/cli/utils';
|
|
4
|
+
import { randomBytes } from '@aztec-labs/foundation/crypto/random';
|
|
5
|
+
import { TxStatus } from '@aztec-labs/stdlib/tx';
|
|
6
|
+
import { Option } from 'commander';
|
|
7
|
+
import inquirer from 'inquirer';
|
|
8
|
+
import { ARTIFACT_DESCRIPTION, CLIFeeArgs, aliasedAddressParser, aliasedSigningKeyParser, aliasedTxHashParser, artifactPathFromPromiseOrAlias, artifactPathParser, cleanupAuthWitnesses, createAccountOption, createAliasOption, createArgsOption, createArtifactOption, createAuthwitnessOption, createContractAddressOption, createDebugExecutionStepsDirOption, createTypeOption, createVerboseOption, integerArgParser } from '../utils/options/index.js';
|
|
9
|
+
function parseWaitForStatus(status) {
|
|
10
|
+
switch(status){
|
|
11
|
+
case 'proposed':
|
|
12
|
+
return TxStatus.PROPOSED;
|
|
13
|
+
case 'checkpointed':
|
|
14
|
+
return TxStatus.CHECKPOINTED;
|
|
15
|
+
default:
|
|
16
|
+
throw new Error(`Invalid wait-for-status: ${status}. Use 'proposed' or 'checkpointed'.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// TODO: This function is only used in 1 place so we could just inline this
|
|
20
|
+
export function injectCommands(program, log, debugLogger, walletAndNodeWrapper, db) {
|
|
21
|
+
program.command('import-test-accounts').description('Import test accounts from pxe.').option('--json', 'Emit output as json').action(async (options)=>{
|
|
22
|
+
const { json } = options;
|
|
23
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
24
|
+
const { importTestAccounts } = await import('./import_test_accounts.js');
|
|
25
|
+
await importTestAccounts(wallet, db, json, log);
|
|
26
|
+
});
|
|
27
|
+
const createAccountCommand = program.command('create-account').description('Creates an aztec account that can be used for sending transactions. Registers the account on the PXE and deploys an account contract. Uses a Schnorr account which uses an immutable key for authentication.').summary('Creates an aztec account that can be used for sending transactions.').addOption(createAccountOption('Alias or address of the account performing the deployment', !db, db)).option('--skip-initialization', 'Skip initializing the account contract. Useful for publicly deploying an existing account.').option('--public-deploy', 'Publishes the account contract instance (and the class, if needed). Needed if the contract contains public functions.').option('--register-class', 'Register the contract class (useful for when the contract class has not been deployed yet).').option('-p, --public-key <string>', 'Public key that identifies a private signing key stored outside of the wallet. Used for ECDSA SSH accounts over the secp256r1 curve.').addOption(createSigningKeyOption('Signing key for account. Uses random by default.', false, (sk)=>aliasedSigningKeyParser(sk, db)).conflicts('public-key')).addOption(createAliasOption('Alias for the account. Used for easy reference in subsequent commands.', !db)).addOption(createTypeOption(true)).option('-s, --salt <hex string>', 'Optional deployment salt as a hex string for generating the deployment address. Defaults to 0.', parseFieldFromHexString).option('--register-only', 'Just register the account on the Wallet. Do not deploy or initialize the account contract.').option('--json', 'Emit output as json')// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
28
|
+
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
29
|
+
.option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction').option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed').addOption(createVerboseOption());
|
|
30
|
+
addOptions(createAccountCommand, CLIFeeArgs.getOptions()).action(async (_options, command)=>{
|
|
31
|
+
const { createAccount } = await import('./create_account.js');
|
|
32
|
+
const options = command.optsWithGlobals();
|
|
33
|
+
const { type, from: parsedFromAddress, signingKey, salt, wait, waitForStatus: waitForStatusStr, registerOnly, skipInitialization, publicDeploy, registerClass, alias, json, verbose } = options;
|
|
34
|
+
let { publicKey } = options;
|
|
35
|
+
if (type === 'ecdsasecp256r1ssh' && !publicKey) {
|
|
36
|
+
const identities = await getIdentities();
|
|
37
|
+
const answers = await inquirer.prompt([
|
|
38
|
+
{
|
|
39
|
+
type: 'list',
|
|
40
|
+
name: 'identity',
|
|
41
|
+
message: 'What public key to use?',
|
|
42
|
+
choices: identities.map((key)=>`${key.type} ${key.publicKey} ${key.comment}`)
|
|
43
|
+
}
|
|
44
|
+
]);
|
|
45
|
+
publicKey = answers.identity.split(' ')[1];
|
|
46
|
+
}
|
|
47
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
48
|
+
const accountCreationResult = await createAccount(wallet, node, type, signingKey, salt, publicKey, alias, parsedFromAddress, registerOnly, skipInitialization, publicDeploy, registerClass, wait, CLIFeeArgs.parse(options, log, db), parseWaitForStatus(waitForStatusStr), json, verbose, debugLogger, log);
|
|
49
|
+
if (db) {
|
|
50
|
+
const { address, alias, signingKey, secretKey, salt } = accountCreationResult;
|
|
51
|
+
await db.storeAccount(address, {
|
|
52
|
+
type,
|
|
53
|
+
signingKey,
|
|
54
|
+
secretKey,
|
|
55
|
+
salt,
|
|
56
|
+
alias,
|
|
57
|
+
publicKey
|
|
58
|
+
}, log);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const deployAccountCommand = program.command('deploy-account').description('Deploys an already registered aztec account that can be used for sending transactions.').argument('<address>', 'The address of the contract to register', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createAccountOption('Alias or address of the account performing the deployment', !db, db)).option('--json', 'Emit output as json')// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
62
|
+
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
63
|
+
.option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction').option('--register-class', 'Register the contract class (useful for when the contract class has not been deployed yet).').option('--public-deploy', 'Publishes the account contract instance (and the class, if needed). Needed if the contract contains public functions.').option('--skip-initialization', 'Skip initializing the account contract. Useful for publicly deploying an existing account.').option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed').addOption(createVerboseOption());
|
|
64
|
+
addOptions(deployAccountCommand, CLIFeeArgs.getOptions()).action(async (parsedAccount, _options, command)=>{
|
|
65
|
+
const { deployAccount } = await import('./deploy_account.js');
|
|
66
|
+
const options = command.optsWithGlobals();
|
|
67
|
+
const { wait, waitForStatus: waitForStatusStr, from: parsedFromAddress, json, registerClass, skipInitialization, publicDeploy, verbose } = options;
|
|
68
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
69
|
+
await deployAccount(wallet, node, parsedAccount, wait, parsedFromAddress, registerClass, publicDeploy, skipInitialization, CLIFeeArgs.parse(options, log, db), parseWaitForStatus(waitForStatusStr), json, verbose, debugLogger, log);
|
|
70
|
+
});
|
|
71
|
+
const deployCommand = program.command('deploy').description('Deploys a compiled Aztec.nr contract to Aztec.').argument('[artifact]', ARTIFACT_DESCRIPTION, artifactPathParser).option('--init <string>', 'The contract initializer function to call', 'constructor').option('--no-init', 'Leave the contract uninitialized').option('-k, --public-key <string>', 'Optional encryption public key for this address. Set this value only if this contract is expected to receive private notes, which will be encrypted using this public key.', parsePublicKey).option('-s, --salt <hex string>', 'Optional deployment salt as a hex string for generating the deployment address. Defaults to random.', parseFieldFromHexString).option('--universal', 'Do not mix the sender address into the deployment.').addOption(createArgsOption(true, db)).addOption(createAccountOption('Alias or address of the account to deploy from', !db, db)).addOption(createAliasOption('Alias for the contract. Used for easy reference subsequent commands.', !db)).option('--json', 'Emit output as json')// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
72
|
+
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
73
|
+
.option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction').option('--no-class-registration', "Don't register this contract class").option('--no-public-deployment', "Don't emit this contract's public bytecode").addOption(new Option('--timeout <number>', 'The amount of time in seconds to wait for the deployment to post to L2').conflicts('wait')).option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed').addOption(createVerboseOption());
|
|
74
|
+
addOptions(deployCommand, CLIFeeArgs.getOptions()).action(async (artifactPathPromise, _options, command)=>{
|
|
75
|
+
const { deploy } = await import('./deploy.js');
|
|
76
|
+
const options = command.optsWithGlobals();
|
|
77
|
+
const { json, publicKey, args, salt, wait, waitForStatus: waitForStatusStr, classRegistration, init, publicDeployment, universal, from: parsedFromAddress, alias, timeout, verbose } = options;
|
|
78
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
79
|
+
const artifactPath = await artifactPathPromise;
|
|
80
|
+
debugLogger.info(`Using wallet with address ${parsedFromAddress?.toString() ?? '<none>'}`);
|
|
81
|
+
const address = await deploy(wallet, node, parsedFromAddress, artifactPath, json, publicKey, args, salt, typeof init === 'string' ? init : undefined, !publicDeployment, !classRegistration, typeof init === 'string' ? false : init, wait, CLIFeeArgs.parse(options, log, db), parseWaitForStatus(waitForStatusStr), verbose, timeout, debugLogger, log, universal);
|
|
82
|
+
if (db && address) {
|
|
83
|
+
await db.storeContract(address, artifactPath, log, alias);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const sendCommand = program.command('send').description('Calls a function on an Aztec contract.').argument('<functionName>', 'Name of function to execute').addOption(createArgsOption(false, db)).addOption(createArtifactOption(db)).addOption(createContractAddressOption(db)).addOption(createAliasOption('Alias for the transaction hash. Used for easy reference in subsequent commands.', !db)).addOption(createAuthwitnessOption('Authorization witness to use for the transaction. If using multiple, pass a comma separated string', !db, db)).addOption(createAccountOption('Alias or address of the account to send the transaction from', !db, db)).option('--no-wait', 'Print transaction hash without waiting for it to be mined').option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed').addOption(createVerboseOption());
|
|
87
|
+
addOptions(sendCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command)=>{
|
|
88
|
+
const { send } = await import('./send.js');
|
|
89
|
+
const options = command.optsWithGlobals();
|
|
90
|
+
const { args, contractArtifact: artifactPathPromise, contractAddress, from: parsedFromAddress, wait, waitForStatus: waitForStatusStr, alias, authWitness: authWitnessArray, verbose } = options;
|
|
91
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
92
|
+
const artifactPath = await artifactPathFromPromiseOrAlias(artifactPathPromise, contractAddress, db);
|
|
93
|
+
debugLogger.info(`Using wallet with address ${parsedFromAddress.toString()}`);
|
|
94
|
+
const authWitnesses = cleanupAuthWitnesses(authWitnessArray);
|
|
95
|
+
const sentTx = await send(wallet, node, parsedFromAddress, functionName, args, artifactPath, contractAddress, wait, alias, CLIFeeArgs.parse(options, log, db), authWitnesses, parseWaitForStatus(waitForStatusStr), verbose, log);
|
|
96
|
+
if (db && sentTx) {
|
|
97
|
+
const txAlias = alias ? alias : `${functionName}-${randomBytes(16).toString('hex')}`;
|
|
98
|
+
await db.storeTx(sentTx, log, txAlias);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const simulateCommand = program.command('simulate').description('Simulates the execution of a function on an Aztec contract.').argument('<functionName>', 'Name of function to simulate').addOption(createArgsOption(false, db)).addOption(createContractAddressOption(db)).addOption(createArtifactOption(db)).addOption(createSigningKeyOption("The sender's signing key", !db, (sk)=>aliasedSigningKeyParser(sk, db)).conflicts('account')).addOption(createAuthwitnessOption('Authorization witness to use for the simulation', !db, db)).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)).addOption(createVerboseOption());
|
|
102
|
+
addOptions(simulateCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command)=>{
|
|
103
|
+
const { simulate } = await import('./simulate.js');
|
|
104
|
+
const options = command.optsWithGlobals();
|
|
105
|
+
const { args, contractArtifact: artifactPathPromise, contractAddress, from: parsedFromAddress, verbose, authWitness } = options;
|
|
106
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
107
|
+
const artifactPath = await artifactPathFromPromiseOrAlias(artifactPathPromise, contractAddress, db);
|
|
108
|
+
const authWitnesses = cleanupAuthWitnesses(authWitness);
|
|
109
|
+
await simulate(wallet, node, parsedFromAddress, functionName, args, artifactPath, contractAddress, CLIFeeArgs.parse(options, log, db), authWitnesses, verbose, log);
|
|
110
|
+
});
|
|
111
|
+
const profileCommand = program.command('profile').description('Profiles a private function by counting the unconditional operations in its execution steps').argument('<functionName>', 'Name of function to simulate').addOption(createArgsOption(false, db)).addOption(createContractAddressOption(db)).addOption(createArtifactOption(db)).addOption(createDebugExecutionStepsDirOption()).addOption(createAuthwitnessOption('Authorization witness to use for the simulation', !db, db)).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db));
|
|
112
|
+
addOptions(profileCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command)=>{
|
|
113
|
+
const { profile } = await import('./profile.js');
|
|
114
|
+
const options = command.optsWithGlobals();
|
|
115
|
+
const { args, contractArtifact: artifactPathPromise, contractAddress, from: parsedFromAddress, debugExecutionStepsDir, authWitness } = options;
|
|
116
|
+
const { wallet, node } = walletAndNodeWrapper;
|
|
117
|
+
const artifactPath = await artifactPathFromPromiseOrAlias(artifactPathPromise, contractAddress, db);
|
|
118
|
+
const authWitnesses = cleanupAuthWitnesses(authWitness);
|
|
119
|
+
await profile(wallet, node, parsedFromAddress, functionName, args, artifactPath, contractAddress, debugExecutionStepsDir, CLIFeeArgs.parse(options, log, db), authWitnesses, log);
|
|
120
|
+
});
|
|
121
|
+
program.command('bridge-fee-juice').description('Mints L1 Fee Juice and pushes them to L2.').argument('<amount>', 'The amount of Fee Juice to mint and bridge.', parseBigint).argument('<recipient>', 'Aztec address of the recipient.', (address)=>aliasedAddressParser('accounts', address, db)).requiredOption('--l1-rpc-urls <string>', 'List of Ethereum host URLs. Chain identifiers localhost and testnet can be used (comma separated)', (arg)=>arg.split(','), [
|
|
122
|
+
ETHEREUM_HOSTS
|
|
123
|
+
]).option('-m, --mnemonic <string>', 'The mnemonic to use for deriving the Ethereum address that will mint and bridge', 'test test test test test test test test test test test junk').option('--mint', 'Mint the tokens on L1', false).option('--l1-private-key <string>', 'The private key to the eth account bridging', PRIVATE_KEY).addOption(l1ChainIdOption).option('--json', 'Output the claim in JSON format')// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
124
|
+
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
125
|
+
.option('--no-wait', 'Wait for the bridged funds to be available in L2, polling every 60 seconds').addOption(new Option('--interval <number>', 'The polling interval in seconds for the bridged funds').default('60').conflicts('wait')).action(async (amount, recipient, options)=>{
|
|
126
|
+
const { bridgeL1FeeJuice } = await import('./bridge_fee_juice.js');
|
|
127
|
+
const { l1ChainId, l1RpcUrls, l1PrivateKey, mnemonic, mint, json, wait, interval: intervalS } = options;
|
|
128
|
+
const [secret, messageLeafIndex] = await bridgeL1FeeJuice(amount, recipient, walletAndNodeWrapper.node, l1RpcUrls, l1ChainId, l1PrivateKey, mnemonic, mint, json, wait, intervalS * 1000, log, debugLogger);
|
|
129
|
+
if (db) {
|
|
130
|
+
await db.pushBridgedFeeJuice(recipient, secret, amount, messageLeafIndex, log);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
program.command('get-fee-juice-balance').description('Checks the Fee Juice balance for a given address.').argument('<address>', 'Aztec address or alias to check balance for', (address)=>aliasedAddressParser('accounts', address, db)).option('--json', 'Emit output as json').option('--exact', 'Show exact balance with all 18 decimal places').action(async (address, options)=>{
|
|
134
|
+
const { getFeeJuiceBalanceCmd } = await import('./get_fee_juice_balance.js');
|
|
135
|
+
const { json, exact } = options;
|
|
136
|
+
await getFeeJuiceBalanceCmd(walletAndNodeWrapper.node, address, json, exact, log);
|
|
137
|
+
});
|
|
138
|
+
program.command('create-authwit').description('Creates an authorization witness that can be privately sent to a caller so they can perform an action on behalf of the provided account').argument('<functionName>', 'Name of function to authorize').argument('<caller>', 'Account to be authorized to perform the action', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createArgsOption(false, db)).addOption(createContractAddressOption(db)).addOption(createArtifactOption(db)).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)).addOption(createAliasOption('Alias for the authorization witness. Used for easy reference in subsequent commands.', !db)).action(async (functionName, caller, _options, command)=>{
|
|
139
|
+
const { createAuthwit } = await import('./create_authwit.js');
|
|
140
|
+
const options = command.optsWithGlobals();
|
|
141
|
+
const { args, contractArtifact: artifactPathPromise, contractAddress, from: parsedFromAddress, alias } = options;
|
|
142
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
143
|
+
const artifactPath = await artifactPathFromPromiseOrAlias(artifactPathPromise, contractAddress, db);
|
|
144
|
+
const witness = await createAuthwit(wallet, parsedFromAddress, functionName, caller, args, artifactPath, contractAddress, log);
|
|
145
|
+
if (db) {
|
|
146
|
+
await db.storeAuthwitness(witness, log, alias);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
program.command('authorize-action').description('Authorizes a public call on the caller, so they can perform an action on behalf of the provided account').argument('<functionName>', 'Name of function to authorize').argument('<caller>', 'Account to be authorized to perform the action', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createArgsOption(false, db)).addOption(createContractAddressOption(db)).addOption(createArtifactOption(db)).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)).action(async (functionName, caller, _options, command)=>{
|
|
150
|
+
const { authorizeAction } = await import('./authorize_action.js');
|
|
151
|
+
const options = command.optsWithGlobals();
|
|
152
|
+
const { args, contractArtifact: artifactPathPromise, contractAddress, from: parsedFromAddress } = options;
|
|
153
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
154
|
+
const artifactPath = await artifactPathFromPromiseOrAlias(artifactPathPromise, contractAddress, db);
|
|
155
|
+
await authorizeAction(wallet, parsedFromAddress, functionName, caller, args, artifactPath, contractAddress, log);
|
|
156
|
+
});
|
|
157
|
+
program.command('get-tx').description('Gets the status of the recent txs, or a detailed view if a specific transaction hash is provided').argument('[txHash]', 'A transaction hash to get the receipt for.', (txHash)=>aliasedTxHashParser(txHash, db)).option('-p, --page <number>', 'The page number to display', (value)=>integerArgParser(value, '--page', 1), 1).option('-s, --page-size <number>', 'The number of transactions to display per page', (value)=>integerArgParser(value, '--page-size', 1), 10).action(async (txHash, options)=>{
|
|
158
|
+
const { checkTx } = await import('./check_tx.js');
|
|
159
|
+
const { pageSize } = options;
|
|
160
|
+
let { page } = options;
|
|
161
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
162
|
+
const node = walletAndNodeWrapper.node;
|
|
163
|
+
if (txHash) {
|
|
164
|
+
await checkTx(wallet, node, txHash, false, log);
|
|
165
|
+
} else if (db) {
|
|
166
|
+
const aliases = await db.listAliases('transactions');
|
|
167
|
+
const totalPages = Math.ceil(aliases.length / pageSize);
|
|
168
|
+
page = Math.min(page - 1, totalPages - 1);
|
|
169
|
+
const dataRows = await Promise.all(aliases.slice(page * pageSize, pageSize * (1 + page)).map(async ({ key, value })=>({
|
|
170
|
+
alias: key,
|
|
171
|
+
txHash: value,
|
|
172
|
+
status: await checkTx(wallet, node, TxHash.fromString(value), true, log)
|
|
173
|
+
})));
|
|
174
|
+
log(`Recent transactions:`);
|
|
175
|
+
log('');
|
|
176
|
+
log(`${'Alias'.padEnd(32, ' ')} | ${'TxHash'.padEnd(64, ' ')} | ${'Cancellable'.padEnd(12, ' ')} | Status`);
|
|
177
|
+
log(''.padEnd(32 + 64 + 20, '-'));
|
|
178
|
+
for (const { alias, txHash, status } of dataRows){
|
|
179
|
+
log(`${alias.padEnd(32, ' ')} | ${txHash} | ${status}`);
|
|
180
|
+
log(''.padEnd(32 + 64 + 20, '-'));
|
|
181
|
+
}
|
|
182
|
+
log(`Displaying ${Math.min(pageSize, aliases.length)} rows, page ${page + 1}/${totalPages}`);
|
|
183
|
+
} else {
|
|
184
|
+
log('Recent transactions are not available, please provide a specific transaction hash');
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
program.command('register-sender').description("Registers a sender's address in the wallet, so the note synching process will look for notes sent by them").argument('[address]', 'The address of the sender to register', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createAliasOption('Alias for the sender. Used for easy reference in subsequent commands.', !db)).action(async (address, options)=>{
|
|
188
|
+
const { registerSender } = await import('./register_sender.js');
|
|
189
|
+
const { alias } = options;
|
|
190
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
191
|
+
await registerSender(wallet, address, log);
|
|
192
|
+
if (db && alias) {
|
|
193
|
+
await db.storeSender(address, alias, log);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
program.command('register-contract').description("Registers a contract in this wallet's PXE").argument('[address]', 'The address of the contract to register', (address)=>aliasedAddressParser('accounts', address, db)).argument('[artifact]', ARTIFACT_DESCRIPTION, artifactPathParser).option('--init <string>', 'The contract initializer function to call', 'constructor').option('-k, --public-key <string>', 'Optional encryption public key for this address. Set this value only if this contract is expected to receive private notes, which will be encrypted using this public key.', parsePublicKey).option('-s, --salt <hex string>', 'Optional deployment salt as a hex string for generating the deployment address.', parseFieldFromHexString).option('--deployer <string>', 'The address of the account that deployed the contract', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createArgsOption(true, db)).addOption(createAliasOption('Alias for the contact. Used for easy reference in subsequent commands.', !db)).action(async (address, artifactPathPromise, _options, command)=>{
|
|
197
|
+
const { registerContract } = await import('./register_contract.js');
|
|
198
|
+
const { alias, init, publicKey, salt, deployer, args } = command.optsWithGlobals();
|
|
199
|
+
const wallet = walletAndNodeWrapper.wallet;
|
|
200
|
+
const node = walletAndNodeWrapper.node;
|
|
201
|
+
const artifactPath = await artifactPathPromise;
|
|
202
|
+
const instance = await registerContract(wallet, node, address, artifactPath, log, init, publicKey, args, salt, deployer);
|
|
203
|
+
if (db && alias) {
|
|
204
|
+
await db.storeContract(instance.address, artifactPath, log, alias);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return program;
|
|
208
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec-labs/aztec.js/addresses';
|
|
2
|
+
import { AuthWitness } from '@aztec-labs/aztec.js/authorization';
|
|
3
|
+
import type { AztecNode } from '@aztec-labs/aztec.js/node';
|
|
4
|
+
import type { LogFn } from '@aztec-labs/foundation/log';
|
|
5
|
+
import type { CLIFeeArgs } from '../utils/options/fees.js';
|
|
6
|
+
import type { CLIWallet } from '../utils/wallet.js';
|
|
7
|
+
export declare function profile(wallet: CLIWallet, node: AztecNode, from: AztecAddress, functionName: string, functionArgsIn: any[], contractArtifactPath: string, contractAddress: AztecAddress, debugOutputPath: string | undefined, feeOpts: CLIFeeArgs, authWitnesses: AuthWitness[], log: LogFn): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NtZHMvcHJvZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFakUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFLeEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsd0JBQXNCLE9BQU8sQ0FDM0IsTUFBTSxFQUFFLFNBQVMsRUFDakIsSUFBSSxFQUFFLFNBQVMsRUFDZixJQUFJLEVBQUUsWUFBWSxFQUNsQixZQUFZLEVBQUUsTUFBTSxFQUNwQixjQUFjLEVBQUUsR0FBRyxFQUFFLEVBQ3JCLG9CQUFvQixFQUFFLE1BQU0sRUFDNUIsZUFBZSxFQUFFLFlBQVksRUFDN0IsZUFBZSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQ25DLE9BQU8sRUFBRSxVQUFVLEVBQ25CLGFBQWEsRUFBRSxXQUFXLEVBQUUsRUFDNUIsR0FBRyxFQUFFLEtBQUssaUJBcUJYIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/cmds/profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAKxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAsB,OAAO,CAC3B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,GAAG,EAAE,EACrB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,YAAY,EAC7B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,WAAW,EAAE,EAC5B,GAAG,EAAE,KAAK,iBAqBX"}
|