@aztec/cli-wallet 5.0.0-nightly.20260705 → 5.0.0-nightly.20260707
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/cmds/create_account.d.ts +4 -2
- package/dest/cmds/create_account.d.ts.map +1 -1
- package/dest/cmds/create_account.js +20 -3
- package/dest/cmds/deploy_account.js +1 -1
- 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 -0
- package/dest/cmds/index.d.ts +1 -1
- package/dest/cmds/index.d.ts.map +1 -1
- package/dest/cmds/index.js +8 -7
- package/dest/storage/wallet_db.d.ts +6 -3
- package/dest/storage/wallet_db.d.ts.map +1 -1
- package/dest/storage/wallet_db.js +15 -1
- 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 +14 -3
- package/dest/utils/wallet.d.ts.map +1 -1
- package/dest/utils/wallet.js +60 -54
- package/package.json +15 -15
- package/src/cmds/create_account.ts +21 -11
- package/src/cmds/deploy_account.ts +1 -1
- package/src/cmds/import_test_accounts.ts +8 -1
- package/src/cmds/index.ts +11 -9
- package/src/storage/wallet_db.ts +24 -2
- package/src/utils/options/options.ts +5 -5
- package/src/utils/wallet.ts +90 -71
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { type AztecNode } from '@aztec/aztec.js/node';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
4
5
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
5
6
|
import { TxStatus } from '@aztec/stdlib/tx';
|
|
6
7
|
import type { AccountType } from '../utils/constants.js';
|
|
7
8
|
import { CLIFeeArgs } from '../utils/options/fees.js';
|
|
8
9
|
import { CLIWallet } from '../utils/wallet.js';
|
|
9
|
-
export declare function createAccount(wallet: CLIWallet, aztecNode: AztecNode, accountType: AccountType,
|
|
10
|
+
export declare function createAccount(wallet: CLIWallet, aztecNode: AztecNode, accountType: AccountType, signingKey: GrumpkinScalar | undefined, salt: Fr | undefined, publicKey: string | undefined, alias: string | undefined, deployer: AztecAddress | undefined, registerOnly: boolean, skipInitialization: boolean, publicDeploy: boolean, registerClass: boolean, wait: boolean, feeOpts: CLIFeeArgs, waitForStatus: TxStatus, json: boolean, verbose: boolean, debugLogger: Logger, log: LogFn): Promise<{
|
|
10
11
|
alias: string | undefined;
|
|
11
12
|
address: AztecAddress;
|
|
13
|
+
signingKey: import("@aztec/foundation/curves/bn254").Fq | undefined;
|
|
12
14
|
secretKey: Fr;
|
|
13
15
|
salt: Fr;
|
|
14
16
|
}>;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX2FjY291bnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2NyZWF0ZV9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWEsTUFBTSxzQkFBc0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQStCLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3pFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFL0Msd0JBQXNCLGFBQWEsQ0FDakMsTUFBTSxFQUFFLFNBQVMsRUFDakIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsV0FBVyxFQUFFLFdBQVcsRUFDeEIsVUFBVSxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQ3RDLElBQUksRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUNwQixTQUFTLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDN0IsS0FBSyxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQ3pCLFFBQVEsRUFBRSxZQUFZLEdBQUcsU0FBUyxFQUNsQyxZQUFZLEVBQUUsT0FBTyxFQUNyQixrQkFBa0IsRUFBRSxPQUFPLEVBQzNCLFlBQVksRUFBRSxPQUFPLEVBQ3JCLGFBQWEsRUFBRSxPQUFPLEVBQ3RCLElBQUksRUFBRSxPQUFPLEVBQ2IsT0FBTyxFQUFFLFVBQVUsRUFDbkIsYUFBYSxFQUFFLFFBQVEsRUFDdkIsSUFBSSxFQUFFLE9BQU8sRUFDYixPQUFPLEVBQUUsT0FBTyxFQUNoQixXQUFXLEVBQUUsTUFBTSxFQUNuQixHQUFHLEVBQUUsS0FBSzs7Ozs7O0dBMElYIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create_account.d.ts","sourceRoot":"","sources":["../../src/cmds/create_account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create_account.d.ts","sourceRoot":"","sources":["../../src/cmds/create_account.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAA+B,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,cAAc,GAAG,SAAS,EACtC,IAAI,EAAE,EAAE,GAAG,SAAS,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,YAAY,EAAE,OAAO,EACrB,kBAAkB,EAAE,OAAO,EAC3B,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,UAAU,EACnB,aAAa,EAAE,QAAQ,EACvB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK;;;;;;GA0IX"}
|
|
@@ -1,19 +1,32 @@
|
|
|
1
|
+
import { deriveSecretKeyFromSigningKey } from '@aztec/accounts/utils';
|
|
1
2
|
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
2
3
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
4
|
import { waitForTx } from '@aztec/aztec.js/node';
|
|
4
5
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
5
6
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
6
8
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
7
9
|
import { printProfileResult } from '../utils/profiling.js';
|
|
8
|
-
export async function createAccount(wallet, aztecNode, accountType,
|
|
9
|
-
secretKey
|
|
10
|
-
|
|
10
|
+
export async function createAccount(wallet, aztecNode, accountType, signingKey, salt, publicKey, alias, deployer, registerOnly, skipInitialization, publicDeploy, registerClass, wait, feeOpts, waitForStatus, json, verbose, debugLogger, log) {
|
|
11
|
+
let secretKey;
|
|
12
|
+
if (accountType === 'ecdsasecp256r1ssh') {
|
|
13
|
+
// SSH accounts sign with a key held in the agent, and so we cannot derive their privacy secret key from it. Instead
|
|
14
|
+
// we pick a random value.
|
|
15
|
+
secretKey = Fr.random();
|
|
16
|
+
} else {
|
|
17
|
+
signingKey ??= GrumpkinScalar.random();
|
|
18
|
+
secretKey = await deriveSecretKeyFromSigningKey(signingKey);
|
|
19
|
+
}
|
|
20
|
+
const account = await wallet.createAccount(accountType, signingKey, secretKey, salt, publicKey);
|
|
11
21
|
const instanceSalt = account.getInstance().salt;
|
|
12
22
|
const { address, publicKeys, partialAddress } = await account.getCompleteAddress();
|
|
13
23
|
const out = {};
|
|
14
24
|
if (json) {
|
|
15
25
|
out.address = address;
|
|
16
26
|
out.publicKey = publicKeys;
|
|
27
|
+
if (signingKey) {
|
|
28
|
+
out.signingKey = signingKey;
|
|
29
|
+
}
|
|
17
30
|
if (secretKey) {
|
|
18
31
|
out.secretKey = secretKey;
|
|
19
32
|
}
|
|
@@ -24,6 +37,9 @@ export async function createAccount(wallet, aztecNode, accountType, secretKey, s
|
|
|
24
37
|
log(`\nNew account:\n`);
|
|
25
38
|
log(`Address: ${address.toString()}`);
|
|
26
39
|
log(`Public key: ${publicKeys.toString()}`);
|
|
40
|
+
if (signingKey) {
|
|
41
|
+
log(`Signing key: ${signingKey.toString()}`);
|
|
42
|
+
}
|
|
27
43
|
if (secretKey) {
|
|
28
44
|
log(`Secret key: ${secretKey.toString()}`);
|
|
29
45
|
}
|
|
@@ -123,6 +139,7 @@ export async function createAccount(wallet, aztecNode, accountType, secretKey, s
|
|
|
123
139
|
return {
|
|
124
140
|
alias,
|
|
125
141
|
address,
|
|
142
|
+
signingKey,
|
|
126
143
|
secretKey,
|
|
127
144
|
salt: instanceSalt
|
|
128
145
|
};
|
|
@@ -6,7 +6,7 @@ import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
|
6
6
|
import { printProfileResult } from '../utils/profiling.js';
|
|
7
7
|
export async function deployAccount(wallet, aztecNode, address, wait, deployer, registerClass, publicDeploy, skipInitialization, feeOpts, waitForStatus, json, verbose, debugLogger, log) {
|
|
8
8
|
const out = {};
|
|
9
|
-
const account = await wallet.
|
|
9
|
+
const account = await wallet.retrieveAccount(address);
|
|
10
10
|
const { partialAddress, publicKeys } = await account.getCompleteAddress();
|
|
11
11
|
const { initializationHash, salt } = account.getInstance();
|
|
12
12
|
if (json) {
|
|
@@ -2,4 +2,4 @@ import type { LogFn } from '@aztec/foundation/log';
|
|
|
2
2
|
import type { WalletDB } from '../storage/wallet_db.js';
|
|
3
3
|
import type { CLIWallet } from '../utils/wallet.js';
|
|
4
4
|
export declare function importTestAccounts(wallet: CLIWallet, db: WalletDB, json: boolean, log: LogFn): Promise<void>;
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0X3Rlc3RfYWNjb3VudHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2ltcG9ydF90ZXN0X2FjY291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkE2Q2xHIn0=
|
|
@@ -1 +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,uBAAuB,CAAC;AAEnD,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,
|
|
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,uBAAuB,CAAC;AAEnD,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"}
|
package/dest/cmds/index.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import { type Command } from 'commander';
|
|
|
3
3
|
import type { WalletDB } from '../storage/wallet_db.js';
|
|
4
4
|
import type { CliWalletAndNodeWrapper } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
5
5
|
export declare function injectCommands(program: Command, log: LogFn, debugLogger: Logger, walletAndNodeWrapper: CliWalletAndNodeWrapper, db: WalletDB): Command;
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWFBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUczRCxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQVUsTUFBTSxXQUFXLENBQUM7QUFHakQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1DdkYsd0JBQWdCLGNBQWMsQ0FDNUIsT0FBTyxFQUFFLE9BQU8sRUFDaEIsR0FBRyxFQUFFLEtBQUssRUFDVixXQUFXLEVBQUUsTUFBTSxFQUNuQixvQkFBb0IsRUFBRSx1QkFBdUIsRUFDN0MsRUFBRSxFQUFFLFFBQVEsV0FncUJiIn0=
|
package/dest/cmds/index.d.ts.map
CHANGED
|
@@ -1 +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,uBAAuB,CAAC;AAG3D,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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cmds/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG3D,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"}
|
package/dest/cmds/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { getIdentities } from '@aztec/accounts/utils';
|
|
2
2
|
import { TxHash } from '@aztec/aztec.js/tx';
|
|
3
|
-
import { ETHEREUM_HOSTS, PRIVATE_KEY, addOptions,
|
|
3
|
+
import { ETHEREUM_HOSTS, PRIVATE_KEY, addOptions, createSigningKeyOption, l1ChainIdOption, parseBigint, parseFieldFromHexString, parsePublicKey } from '@aztec/cli/utils';
|
|
4
4
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
5
5
|
import { TxStatus } from '@aztec/stdlib/tx';
|
|
6
6
|
import { Option } from 'commander';
|
|
7
7
|
import inquirer from 'inquirer';
|
|
8
|
-
import { ARTIFACT_DESCRIPTION, CLIFeeArgs, aliasedAddressParser,
|
|
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
9
|
function parseWaitForStatus(status) {
|
|
10
10
|
switch(status){
|
|
11
11
|
case 'proposed':
|
|
@@ -24,13 +24,13 @@ export function injectCommands(program, log, debugLogger, walletAndNodeWrapper,
|
|
|
24
24
|
const { importTestAccounts } = await import('./import_test_accounts.js');
|
|
25
25
|
await importTestAccounts(wallet, db, json, log);
|
|
26
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(
|
|
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
28
|
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
29
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
30
|
addOptions(createAccountCommand, CLIFeeArgs.getOptions()).action(async (_options, command)=>{
|
|
31
31
|
const { createAccount } = await import('./create_account.js');
|
|
32
32
|
const options = command.optsWithGlobals();
|
|
33
|
-
const { type, from: parsedFromAddress,
|
|
33
|
+
const { type, from: parsedFromAddress, signingKey, salt, wait, waitForStatus: waitForStatusStr, registerOnly, skipInitialization, publicDeploy, registerClass, alias, json, verbose } = options;
|
|
34
34
|
let { publicKey } = options;
|
|
35
35
|
if (type === 'ecdsasecp256r1ssh' && !publicKey) {
|
|
36
36
|
const identities = await getIdentities();
|
|
@@ -45,11 +45,12 @@ export function injectCommands(program, log, debugLogger, walletAndNodeWrapper,
|
|
|
45
45
|
publicKey = answers.identity.split(' ')[1];
|
|
46
46
|
}
|
|
47
47
|
const { wallet, node } = walletAndNodeWrapper;
|
|
48
|
-
const accountCreationResult = await createAccount(wallet, node, type,
|
|
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
49
|
if (db) {
|
|
50
|
-
const { address, alias, secretKey, salt } = accountCreationResult;
|
|
50
|
+
const { address, alias, signingKey, secretKey, salt } = accountCreationResult;
|
|
51
51
|
await db.storeAccount(address, {
|
|
52
52
|
type,
|
|
53
|
+
signingKey,
|
|
53
54
|
secretKey,
|
|
54
55
|
salt,
|
|
55
56
|
alias,
|
|
@@ -97,7 +98,7 @@ export function injectCommands(program, log, debugLogger, walletAndNodeWrapper,
|
|
|
97
98
|
await db.storeTx(sentTx, log, txAlias);
|
|
98
99
|
}
|
|
99
100
|
});
|
|
100
|
-
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(
|
|
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());
|
|
101
102
|
addOptions(simulateCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command)=>{
|
|
102
103
|
const { simulate } = await import('./simulate.js');
|
|
103
104
|
const options = command.optsWithGlobals();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
2
3
|
import type { LogFn } from '@aztec/foundation/log';
|
|
3
4
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
5
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
@@ -25,9 +26,10 @@ export declare class WalletDB {
|
|
|
25
26
|
secret: string;
|
|
26
27
|
leafIndex: bigint;
|
|
27
28
|
}>;
|
|
28
|
-
storeAccount(address: AztecAddress, { type, secretKey, salt, alias, publicKey }: {
|
|
29
|
+
storeAccount(address: AztecAddress, { type, signingKey, secretKey, salt, alias, publicKey }: {
|
|
29
30
|
type: AccountType;
|
|
30
|
-
|
|
31
|
+
signingKey?: GrumpkinScalar;
|
|
32
|
+
secretKey?: Fr;
|
|
31
33
|
salt: Fr;
|
|
32
34
|
alias: string | undefined;
|
|
33
35
|
publicKey: string | undefined;
|
|
@@ -49,10 +51,11 @@ export declare class WalletDB {
|
|
|
49
51
|
retrieveAccountMetadata(aliasOrAddress: AztecAddress | string, metadataKey: string): Promise<Buffer<ArrayBufferLike>>;
|
|
50
52
|
retrieveAccount(address: AztecAddress | string): Promise<{
|
|
51
53
|
address: string | AztecAddress;
|
|
54
|
+
signingKey: import("@aztec/foundation/curves/bn254").Fq | undefined;
|
|
52
55
|
secretKey: Fr;
|
|
53
56
|
salt: Fr;
|
|
54
57
|
type: "ecdsasecp256k1" | "ecdsasecp256r1" | "ecdsasecp256r1ssh" | "schnorr" | "schnorr_initializerless";
|
|
55
58
|
}>;
|
|
56
59
|
storeAlias(type: AliasType, key: string, value: Buffer, log: LogFn): Promise<void>;
|
|
57
60
|
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0X2RiLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS93YWxsZXRfZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd6RCxlQUFPLE1BQU0sT0FBTyx3RkFBeUYsQ0FBQztBQUM5RyxNQUFNLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVqRCxxQkFBYSxRQUFROztJQU1uQixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBVztJQUVsQyxPQUFPLENBQUMsVUFBVSxDQUE2QjtJQUUvQyxNQUFNLENBQUMsV0FBVyxhQU1qQjtJQUVLLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLGlCQU9sQztZQUVhLGlCQUFpQjtJQUl6QixtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLGlCQVkzRztJQUVLLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUs7Ozs7T0FZM0Q7SUFFSyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxLQUFLOzs7O09BWTVEO0lBRUssWUFBWSxDQUNoQixPQUFPLEVBQUUsWUFBWSxFQUNyQixFQUNFLElBQUksRUFDSixVQUFVLEVBQ1YsU0FBUyxFQUNULElBQUksRUFDSixLQUFLLEVBQ0wsU0FBUyxFQUNWLEVBQUU7UUFDRCxJQUFJLEVBQUUsV0FBVyxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQztRQUM1QixTQUFTLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDZixJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ1QsS0FBSyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDMUIsU0FBUyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7S0FDL0IsRUFDRCxHQUFHLEVBQUUsS0FBSyxpQkErQlg7SUFFSyxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLGlCQUtqRTtJQUVLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLGlCQVkxRjtJQUVLLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLGlCQVN0RTtJQUVLLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLGlCQVN2RTtJQUVELGdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLFVBTTNCO0lBRU0sc0JBQXNCLENBQUMsR0FBRyxFQUFFLE1BQU0sVUFZeEM7SUFFSyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sbUJBVzlCO0lBRUssV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7OztTQVdqQztJQUVLLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxZQUFZLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBR3RHO0lBRUssdUJBQXVCLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBT3ZGO0lBRUssZUFBZSxDQUFDLE9BQU8sRUFBRSxZQUFZLEdBQUcsTUFBTTs7Ozs7O09BWW5EO0lBRUssVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLGlCQU12RTtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_db.d.ts","sourceRoot":"","sources":["../../src/storage/wallet_db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,eAAO,MAAM,OAAO,wFAAyF,CAAC;AAC9G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,qBAAa,QAAQ;;IAMnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAW;IAElC,OAAO,CAAC,UAAU,CAA6B;IAE/C,MAAM,CAAC,WAAW,aAMjB;IAEK,IAAI,CAAC,KAAK,EAAE,iBAAiB,iBAOlC;YAEa,iBAAiB;IAIzB,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,iBAY3G;IAEK,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK;;;;OAY3D;IAEK,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK;;;;OAY5D;IAEK,YAAY,CAChB,OAAO,EAAE,YAAY,EACrB,EACE,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,KAAK,EACL,SAAS,EACV,EAAE;
|
|
1
|
+
{"version":3,"file":"wallet_db.d.ts","sourceRoot":"","sources":["../../src/storage/wallet_db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
2
3
|
import { extractECDSAPublicKeyFromBase64String } from '../utils/ecdsa.js';
|
|
3
4
|
export const Aliases = [
|
|
4
5
|
'accounts',
|
|
@@ -76,7 +77,13 @@ export class WalletDB {
|
|
|
76
77
|
leafIndex: BigInt(leafIndexStr)
|
|
77
78
|
};
|
|
78
79
|
}
|
|
79
|
-
async storeAccount(address, { type, secretKey, salt, alias, publicKey }, log) {
|
|
80
|
+
async storeAccount(address, { type, signingKey, secretKey, salt, alias, publicKey }, log) {
|
|
81
|
+
// Even though the privacy secret key is sometimes derived from the signing key, we store it in the database
|
|
82
|
+
// regardless as that is not always the case. Local-key accounts also store their signing key, while external-key
|
|
83
|
+
// accounts such as SSH store only the privacy secret.
|
|
84
|
+
if (!secretKey) {
|
|
85
|
+
throw new Error('Cannot store account without a secret key');
|
|
86
|
+
}
|
|
80
87
|
let publicSigningKey;
|
|
81
88
|
if (type === 'ecdsasecp256r1ssh' && publicKey) {
|
|
82
89
|
publicSigningKey = extractECDSAPublicKeyFromBase64String(publicKey);
|
|
@@ -87,6 +94,9 @@ export class WalletDB {
|
|
|
87
94
|
}
|
|
88
95
|
await this.#accounts.set(`${address.toString()}:type`, Buffer.from(type));
|
|
89
96
|
await this.#accounts.set(`${address.toString()}:sk`, secretKey.toBuffer());
|
|
97
|
+
if (signingKey) {
|
|
98
|
+
await this.#accounts.set(`${address.toString()}:signing`, signingKey.toBuffer());
|
|
99
|
+
}
|
|
90
100
|
await this.#accounts.set(`${address.toString()}:salt`, salt.toBuffer());
|
|
91
101
|
if (publicSigningKey) {
|
|
92
102
|
await this.#accounts.set(`${address.toString()}:publicSigningKey`, publicSigningKey);
|
|
@@ -198,11 +208,15 @@ export class WalletDB {
|
|
|
198
208
|
if (!secretKeyBuffer) {
|
|
199
209
|
throw new Error(`Could not find ${address}:sk. Account "${address.toString}" does not exist on this wallet.`);
|
|
200
210
|
}
|
|
211
|
+
const signingKeyBuffer = await this.#accounts.getAsync(`${address.toString()}:signing`);
|
|
201
212
|
const secretKey = Fr.fromBuffer(secretKeyBuffer);
|
|
213
|
+
// External-key accounts (e.g. SSH) store no signing key.
|
|
214
|
+
const signingKey = signingKeyBuffer ? GrumpkinScalar.fromBuffer(signingKeyBuffer) : undefined;
|
|
202
215
|
const salt = Fr.fromBuffer(await this.#accounts.getAsync(`${address.toString()}:salt`));
|
|
203
216
|
const type = (await this.#accounts.getAsync(`${address.toString()}:type`)).toString('utf8');
|
|
204
217
|
return {
|
|
205
218
|
address,
|
|
219
|
+
signingKey,
|
|
206
220
|
secretKey,
|
|
207
221
|
salt,
|
|
208
222
|
type
|
|
@@ -8,7 +8,7 @@ export declare function integerArgParser(value: string, argName: string, min?: n
|
|
|
8
8
|
export declare function aliasedTxHashParser(txHash: string, db?: WalletDB): TxHash;
|
|
9
9
|
export declare function aliasedAuthWitParser(witnesses: string, db?: WalletDB): AuthWitness[];
|
|
10
10
|
export declare function aliasedAddressParser(defaultPrefix: AliasType, address: string, db?: WalletDB): AztecAddress;
|
|
11
|
-
export declare function
|
|
11
|
+
export declare function aliasedSigningKeyParser(sk: string, db?: WalletDB): import("@aztec/foundation/schemas").Fq;
|
|
12
12
|
export declare function createAliasOption(description: string, hide: boolean): Option;
|
|
13
13
|
export declare function createAccountOption(description: string, hide: boolean, db?: WalletDB): Option;
|
|
14
14
|
export declare function createAuthwitnessOption(description: string, hide: boolean, db?: WalletDB): Option;
|
|
@@ -21,4 +21,4 @@ export declare function artifactPathParser(filePath: string, db?: WalletDB): Pro
|
|
|
21
21
|
export declare function artifactPathFromPromiseOrAlias(artifactPathPromise: Promise<string>, contractAddress: AztecAddress, db?: WalletDB): Promise<string>;
|
|
22
22
|
export declare function createArtifactOption(db?: WalletDB): Option;
|
|
23
23
|
export declare function cleanupAuthWitnesses(authWitnesses: AuthWitness[] | undefined): AuthWitness[];
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL29wdGlvbnMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHbkMsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBS3RFLGVBQU8sTUFBTSxvQkFBb0Isd0tBQ3NJLENBQUM7QUFFeEssd0JBQWdCLGdCQUFnQixDQUM5QixLQUFLLEVBQUUsTUFBTSxFQUNiLE9BQU8sRUFBRSxNQUFNLEVBQ2YsR0FBRyxTQUEwQixFQUM3QixHQUFHLFNBQTBCLFVBVTlCO0FBRUQsd0JBQWdCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxHQUFHLE1BQU0sQ0FRekU7QUFFRCx3QkFBZ0Isb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLGlCQVlwRTtBQUVELHdCQUFnQixvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxnQkFRNUY7QUFFRCx3QkFBZ0IsdUJBQXVCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLDBDQVFoRTtBQUVELHdCQUFnQixpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLFVBRW5FO0FBRUQsd0JBQWdCLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXBGO0FBRUQsd0JBQWdCLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXhGO0FBRUQsd0JBQWdCLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLFVBTWxEO0FBRUQsd0JBQWdCLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxVQVFyRTtBQUVELHdCQUFnQiwyQkFBMkIsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXhEO0FBRUQsd0JBQWdCLGtDQUFrQyxXQUtqRDtBQUVELHdCQUFnQixtQkFBbUIsV0FLbEM7QUFFRCx3QkFBZ0Isa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLG1CQWFqRTtBQUVELHdCQUFzQiw4QkFBOEIsQ0FDbEQsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNwQyxlQUFlLEVBQUUsWUFBWSxFQUM3QixFQUFFLENBQUMsRUFBRSxRQUFRLG1CQVdkO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsVUFJakQ7QUE2QkQsd0JBQWdCLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxTQUFTLEdBQUcsV0FBVyxFQUFFLENBRTVGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/utils/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAKtE,eAAO,MAAM,oBAAoB,wKACsI,CAAC;AAExK,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,SAA0B,EAC7B,GAAG,SAA0B,UAU9B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,iBAYpE;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,gBAQ5F;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/utils/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAKtE,eAAO,MAAM,oBAAoB,wKACsI,CAAC;AAExK,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,SAA0B,EAC7B,GAAG,SAA0B,UAU9B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,iBAYpE;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,gBAQ5F;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,0CAQhE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,UAEnE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,UAIpF;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,UAIxF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,UAMlD;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,UAQrE;AAED,wBAAgB,2BAA2B,CAAC,EAAE,CAAC,EAAE,QAAQ,UAIxD;AAED,wBAAgB,kCAAkC,WAKjD;AAED,wBAAgB,mBAAmB,WAKlC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,mBAajE;AAED,wBAAsB,8BAA8B,CAClD,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,EACpC,eAAe,EAAE,YAAY,EAC7B,EAAE,CAAC,EAAE,QAAQ,mBAWd;AAED,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,UAIjD;AA6BD,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,WAAW,EAAE,CAE5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseAztecAddress,
|
|
1
|
+
import { parseAztecAddress, parseSigningKey, parseTxHash } from '@aztec/cli/utils';
|
|
2
2
|
import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
3
3
|
import { Option } from 'commander';
|
|
4
4
|
import { readdir, stat } from 'fs/promises';
|
|
@@ -45,13 +45,13 @@ export function aliasedAddressParser(defaultPrefix, address, db) {
|
|
|
45
45
|
return parseAztecAddress(rawAddress);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
export function
|
|
48
|
+
export function aliasedSigningKeyParser(sk, db) {
|
|
49
49
|
if (sk.startsWith('0x')) {
|
|
50
|
-
return
|
|
50
|
+
return parseSigningKey(sk);
|
|
51
51
|
} else {
|
|
52
|
-
const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':
|
|
52
|
+
const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':signing') ? sk : `${sk}:signing`}`;
|
|
53
53
|
const rawSk = db ? db.tryRetrieveAlias(prefixed) : sk;
|
|
54
|
-
return
|
|
54
|
+
return parseSigningKey(rawSk);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
export function createAliasOption(description, hide) {
|
package/dest/utils/wallet.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { AztecNode } from '@aztec/aztec.js/node';
|
|
|
4
4
|
import { AccountManager, type Aliased } from '@aztec/aztec.js/wallet';
|
|
5
5
|
import { TxSimulationResultWithAppOffset } from '@aztec/aztec.js/wallet';
|
|
6
6
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
7
8
|
import type { LogFn } from '@aztec/foundation/log';
|
|
8
9
|
import type { NotesFilter } from '@aztec/pxe/client/lazy';
|
|
9
10
|
import type { PXEConfig } from '@aztec/pxe/config';
|
|
@@ -38,8 +39,18 @@ export declare class CLIWallet extends BaseWallet {
|
|
|
38
39
|
private createCancellationTxExecutionRequest;
|
|
39
40
|
proveCancellationTx(from: AztecAddress, txNonce: Fr, increasedFee: InteractionFeeOptions): Promise<TxProvingResult>;
|
|
40
41
|
getAccountFromAddress(address: AztecAddress): Promise<Account>;
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Creates an account from freshly supplied keys. SSH accounts sign with a key held in the agent (resolved from
|
|
44
|
+
* `publicKey`), every other type is rooted on `signingKey`, with `secretKey` as its privacy secret.
|
|
45
|
+
*/
|
|
46
|
+
createAccount(type: AccountType, signingKey: GrumpkinScalar | undefined, secretKey: Fr | undefined, salt?: Fr, publicKey?: string): Promise<AccountManager>;
|
|
47
|
+
/**
|
|
48
|
+
* Retrieves a previously stored account by address, loading its keys, type and salt from the wallet database.
|
|
49
|
+
*/
|
|
50
|
+
retrieveAccount(address: AztecAddress): Promise<AccountManager>;
|
|
51
|
+
private buildAccount;
|
|
52
|
+
private resolveSshPublicSigningKey;
|
|
53
|
+
private materializeAccount;
|
|
43
54
|
private getFakeAccountDataFor;
|
|
44
55
|
/**
|
|
45
56
|
* Uses a stub account for kernelless simulation, bypassing real account authorization.
|
|
@@ -50,4 +61,4 @@ export declare class CLIWallet extends BaseWallet {
|
|
|
50
61
|
getNotes(filter: NotesFilter): Promise<NoteDao[]>;
|
|
51
62
|
getContractArtifact(id: Fr): Promise<import("@aztec/stdlib/abi").ContractArtifact | undefined>;
|
|
52
63
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBaUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RixPQUFPLEVBRUwsS0FBSyxxQkFBcUIsRUFFM0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssRUFBMkMsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakcsT0FBTyxFQUFFLGdCQUFnQixFQUEwQixNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyw0QkFBNEIsRUFBZ0IsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1sRCxxQkFBYSxTQUFVLFNBQVEsVUFBVTtJQVNyQyxPQUFPLENBQUMsT0FBTztJQUNmLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFUYixPQUFPLENBQUMsWUFBWSxDQUE4QjtJQUdsRCxPQUFPLENBQUMsWUFBWSxDQUE4QjtJQUVsRCxZQUNFLEdBQUcsRUFBRSxHQUFHLEVBQ1IsSUFBSSxFQUFFLFNBQVMsRUFDUCxPQUFPLEVBQUUsS0FBSyxFQUNkLEVBQUUsQ0FBQyxzQkFBVSxFQUl0QjtJQUVELE9BQWEsTUFBTSxDQUNqQixJQUFJLEVBQUUsU0FBUyxFQUNmLEdBQUcsRUFBRSxLQUFLLEVBQ1YsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUNiLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBT3BCO1lBRWEsb0JBQW9CO1lBVXBCLGVBQWU7SUFlZCxXQUFXLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBUTdEO0lBRUQ7Ozs7T0FJRztJQUNHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztRQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQTtLQUFFLENBQUMsQ0FHN0Y7WUFFYSxvQ0FBb0M7SUE0QjVDLG1CQUFtQixDQUN2QixJQUFJLEVBQUUsWUFBWSxFQUNsQixPQUFPLEVBQUUsRUFBRSxFQUNYLFlBQVksRUFBRSxxQkFBcUIsR0FDbEMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUcxQjtJQUVjLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxZQUFZLG9CQWF6RDtJQUVEOzs7T0FHRztJQUNHLGFBQWEsQ0FDakIsSUFBSSxFQUFFLFdBQVcsRUFDakIsVUFBVSxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQ3RDLFNBQVMsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUN6QixJQUFJLEdBQUUsRUFBWSxFQUNsQixTQUFTLENBQUMsRUFBRSxNQUFNLEdBQ2pCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FJekI7SUFFRDs7T0FFRztJQUNHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FjcEU7WUFFYSxZQUFZO1lBcUNaLDBCQUEwQjtZQWMxQixrQkFBa0I7WUErQmxCLHFCQUFxQjtJQXNCbkM7OztPQUdHO0lBQ0gsVUFBeUIscUJBQXFCLENBQzVDLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxJQUFJLEVBQUUsNEJBQTRCLEdBQ2pDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQTJDMUM7SUFJRCxZQUFZLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBRXRDO0lBSUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBRWhEO0lBSUQsbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUscUVBRXpCO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAiC,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAGzE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"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"}
|
package/dest/utils/wallet.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts/ecdsa';
|
|
1
|
+
import { EcdsaKAccountContract, EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts/ecdsa';
|
|
2
2
|
import { StubEcdsaAccountContractArtifact, createStubEcdsaAccount } from '@aztec/accounts/ecdsa/stub';
|
|
3
3
|
import { SchnorrAccountContract, SchnorrInitializerlessAccountContract } from '@aztec/accounts/schnorr';
|
|
4
4
|
import { StubSchnorrAccountContractArtifact, createStubSchnorrAccount } from '@aztec/accounts/schnorr/stub';
|
|
@@ -12,7 +12,6 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
12
12
|
import { createPXE, getPXEConfig } from '@aztec/pxe/server';
|
|
13
13
|
import { getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
|
-
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
16
15
|
import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx';
|
|
17
16
|
import { BaseWallet, getGasLimits } from '@aztec/wallet-sdk/base-wallet';
|
|
18
17
|
import { extractECDSAPublicKeyFromBase64String } from './ecdsa.js';
|
|
@@ -104,7 +103,7 @@ export class CLIWallet extends BaseWallet {
|
|
|
104
103
|
if (this.accountCache.has(address.toString())) {
|
|
105
104
|
return this.accountCache.get(address.toString());
|
|
106
105
|
} else {
|
|
107
|
-
const accountManager = await this.
|
|
106
|
+
const accountManager = await this.retrieveAccount(address);
|
|
108
107
|
account = await accountManager.getAccount();
|
|
109
108
|
}
|
|
110
109
|
if (!account) {
|
|
@@ -112,7 +111,64 @@ export class CLIWallet extends BaseWallet {
|
|
|
112
111
|
}
|
|
113
112
|
return account;
|
|
114
113
|
}
|
|
115
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Creates an account from freshly supplied keys. SSH accounts sign with a key held in the agent (resolved from
|
|
116
|
+
* `publicKey`), every other type is rooted on `signingKey`, with `secretKey` as its privacy secret.
|
|
117
|
+
*/ async createAccount(type, signingKey, secretKey, salt = Fr.ZERO, publicKey) {
|
|
118
|
+
const publicSigningKey = type === 'ecdsasecp256r1ssh' ? await this.resolveSshPublicSigningKey(publicKey) : undefined;
|
|
119
|
+
return this.buildAccount(type, salt, signingKey, secretKey, publicSigningKey);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Retrieves a previously stored account by address, loading its keys, type and salt from the wallet database.
|
|
123
|
+
*/ async retrieveAccount(address) {
|
|
124
|
+
if (!this.db) {
|
|
125
|
+
throw new Error('Cannot retrieve an account without a wallet database');
|
|
126
|
+
}
|
|
127
|
+
const { type, signingKey, secretKey, salt } = await this.db.retrieveAccount(address);
|
|
128
|
+
if (type !== 'ecdsasecp256r1ssh' && !signingKey) {
|
|
129
|
+
throw new Error(`Account ${address} has no stored signing key: it was created with an older version of aztec-wallet and is ` + `incompatible with this one. Create a new account to continue.`);
|
|
130
|
+
}
|
|
131
|
+
const publicSigningKey = type === 'ecdsasecp256r1ssh' ? await this.db.retrieveAccountMetadata(address, 'publicSigningKey') : undefined;
|
|
132
|
+
return this.buildAccount(type, salt, signingKey, secretKey, publicSigningKey);
|
|
133
|
+
}
|
|
134
|
+
async buildAccount(type, salt, signingKey, secretKey, publicSigningKey) {
|
|
135
|
+
switch(type){
|
|
136
|
+
case 'schnorr':
|
|
137
|
+
case 'schnorr_initializerless':
|
|
138
|
+
case 'ecdsasecp256r1':
|
|
139
|
+
case 'ecdsasecp256k1':
|
|
140
|
+
{
|
|
141
|
+
if (!signingKey || !secretKey) {
|
|
142
|
+
throw new Error('Cannot build account without signing key and secret key');
|
|
143
|
+
}
|
|
144
|
+
const contract = type === 'schnorr' ? new SchnorrAccountContract(signingKey) : type === 'schnorr_initializerless' ? new SchnorrInitializerlessAccountContract(signingKey) : type === 'ecdsasecp256r1' ? new EcdsaRAccountContract(signingKey.toBuffer()) : new EcdsaKAccountContract(signingKey.toBuffer());
|
|
145
|
+
return await this.materializeAccount(secretKey, salt, contract);
|
|
146
|
+
}
|
|
147
|
+
case 'ecdsasecp256r1ssh':
|
|
148
|
+
{
|
|
149
|
+
if (!secretKey || !publicSigningKey) {
|
|
150
|
+
throw new Error('Cannot build SSH account without secret key and public signing key');
|
|
151
|
+
}
|
|
152
|
+
return await this.materializeAccount(secretKey, salt, new EcdsaRSSHAccountContract(publicSigningKey));
|
|
153
|
+
}
|
|
154
|
+
default:
|
|
155
|
+
{
|
|
156
|
+
throw new Error(`Unsupported account type: ${type}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async resolveSshPublicSigningKey(publicKey) {
|
|
161
|
+
if (!publicKey) {
|
|
162
|
+
throw new Error('Public key must be provided for ECDSA SSH account');
|
|
163
|
+
}
|
|
164
|
+
const identities = await getIdentities();
|
|
165
|
+
const foundIdentity = identities.find((identity)=>identity.type === 'ecdsa-sha2-nistp256' && identity.publicKey === publicKey);
|
|
166
|
+
if (!foundIdentity) {
|
|
167
|
+
throw new Error(`Identity for public key ${publicKey} not found in the SSH agent`);
|
|
168
|
+
}
|
|
169
|
+
return extractECDSAPublicKeyFromBase64String(foundIdentity.publicKey);
|
|
170
|
+
}
|
|
171
|
+
async materializeAccount(secret, salt, contract) {
|
|
116
172
|
const accountManager = await AccountManager.create(this, secret, contract, {
|
|
117
173
|
salt
|
|
118
174
|
});
|
|
@@ -139,56 +195,6 @@ export class CLIWallet extends BaseWallet {
|
|
|
139
195
|
}
|
|
140
196
|
return accountManager;
|
|
141
197
|
}
|
|
142
|
-
async createOrRetrieveAccount(address, secretKey, type = 'schnorr', salt, publicKey) {
|
|
143
|
-
let account;
|
|
144
|
-
salt ??= Fr.ZERO;
|
|
145
|
-
if (this.db && address) {
|
|
146
|
-
({ type, secretKey, salt } = await this.db.retrieveAccount(address));
|
|
147
|
-
}
|
|
148
|
-
if (!secretKey) {
|
|
149
|
-
throw new Error('Cannot retrieve/create wallet without secret key');
|
|
150
|
-
}
|
|
151
|
-
switch(type){
|
|
152
|
-
case 'schnorr':
|
|
153
|
-
{
|
|
154
|
-
account = await this.createAccount(secretKey, salt, new SchnorrAccountContract(deriveSigningKey(secretKey)));
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
case 'schnorr_initializerless':
|
|
158
|
-
{
|
|
159
|
-
account = await this.createAccount(secretKey, salt, new SchnorrInitializerlessAccountContract(deriveSigningKey(secretKey)));
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
case 'ecdsasecp256r1':
|
|
163
|
-
{
|
|
164
|
-
account = await this.createAccount(secretKey, salt, new EcdsaRAccountContract(deriveSigningKey(secretKey).toBuffer()));
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
case 'ecdsasecp256r1ssh':
|
|
168
|
-
{
|
|
169
|
-
let publicSigningKey;
|
|
170
|
-
if (this.db && address) {
|
|
171
|
-
publicSigningKey = await this.db.retrieveAccountMetadata(address, 'publicSigningKey');
|
|
172
|
-
} else if (publicKey) {
|
|
173
|
-
const identities = await getIdentities();
|
|
174
|
-
const foundIdentity = identities.find((identity)=>identity.type === 'ecdsa-sha2-nistp256' && identity.publicKey === publicKey);
|
|
175
|
-
if (!foundIdentity) {
|
|
176
|
-
throw new Error(`Identity for public key ${publicKey} not found in the SSH agent`);
|
|
177
|
-
}
|
|
178
|
-
publicSigningKey = extractECDSAPublicKeyFromBase64String(foundIdentity.publicKey);
|
|
179
|
-
} else {
|
|
180
|
-
throw new Error('Public key must be provided for ECDSA SSH account');
|
|
181
|
-
}
|
|
182
|
-
account = await this.createAccount(secretKey, salt, new EcdsaRSSHAccountContract(publicSigningKey));
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
default:
|
|
186
|
-
{
|
|
187
|
-
throw new Error(`Unsupported account type: ${type}`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return account;
|
|
191
|
-
}
|
|
192
198
|
/**
|
|
193
199
|
* Creates a stub account that impersonates the given address, allowing kernelless simulations
|
|
194
200
|
* to bypass the account's authorization mechanisms via contract overrides.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/cli-wallet",
|
|
3
|
-
"version": "5.0.0-nightly.
|
|
3
|
+
"version": "5.0.0-nightly.20260707",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/cmds/index.js",
|
|
@@ -67,20 +67,20 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/accounts": "5.0.0-nightly.
|
|
71
|
-
"@aztec/aztec.js": "5.0.0-nightly.
|
|
72
|
-
"@aztec/bb.js": "5.0.0-nightly.
|
|
73
|
-
"@aztec/cli": "5.0.0-nightly.
|
|
74
|
-
"@aztec/entrypoints": "5.0.0-nightly.
|
|
75
|
-
"@aztec/ethereum": "5.0.0-nightly.
|
|
76
|
-
"@aztec/foundation": "5.0.0-nightly.
|
|
77
|
-
"@aztec/kv-store": "5.0.0-nightly.
|
|
78
|
-
"@aztec/noir-contracts.js": "5.0.0-nightly.
|
|
79
|
-
"@aztec/noir-noirc_abi": "5.0.0-nightly.
|
|
80
|
-
"@aztec/pxe": "5.0.0-nightly.
|
|
81
|
-
"@aztec/standard-contracts": "5.0.0-nightly.
|
|
82
|
-
"@aztec/stdlib": "5.0.0-nightly.
|
|
83
|
-
"@aztec/wallet-sdk": "5.0.0-nightly.
|
|
70
|
+
"@aztec/accounts": "5.0.0-nightly.20260707",
|
|
71
|
+
"@aztec/aztec.js": "5.0.0-nightly.20260707",
|
|
72
|
+
"@aztec/bb.js": "5.0.0-nightly.20260707",
|
|
73
|
+
"@aztec/cli": "5.0.0-nightly.20260707",
|
|
74
|
+
"@aztec/entrypoints": "5.0.0-nightly.20260707",
|
|
75
|
+
"@aztec/ethereum": "5.0.0-nightly.20260707",
|
|
76
|
+
"@aztec/foundation": "5.0.0-nightly.20260707",
|
|
77
|
+
"@aztec/kv-store": "5.0.0-nightly.20260707",
|
|
78
|
+
"@aztec/noir-contracts.js": "5.0.0-nightly.20260707",
|
|
79
|
+
"@aztec/noir-noirc_abi": "5.0.0-nightly.20260707",
|
|
80
|
+
"@aztec/pxe": "5.0.0-nightly.20260707",
|
|
81
|
+
"@aztec/standard-contracts": "5.0.0-nightly.20260707",
|
|
82
|
+
"@aztec/stdlib": "5.0.0-nightly.20260707",
|
|
83
|
+
"@aztec/wallet-sdk": "5.0.0-nightly.20260707",
|
|
84
84
|
"commander": "^12.1.0",
|
|
85
85
|
"inquirer": "^10.1.8",
|
|
86
86
|
"source-map-support": "^0.5.21",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deriveSecretKeyFromSigningKey } from '@aztec/accounts/utils';
|
|
1
2
|
import { NO_FROM } from '@aztec/aztec.js/account';
|
|
2
3
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
4
|
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
@@ -5,6 +6,7 @@ import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
|
5
6
|
import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
|
|
6
7
|
import { prettyPrintJSON } from '@aztec/cli/cli-utils';
|
|
7
8
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
8
10
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
9
11
|
import { type TxHash, type TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
10
12
|
|
|
@@ -18,7 +20,7 @@ export async function createAccount(
|
|
|
18
20
|
wallet: CLIWallet,
|
|
19
21
|
aztecNode: AztecNode,
|
|
20
22
|
accountType: AccountType,
|
|
21
|
-
|
|
23
|
+
signingKey: GrumpkinScalar | undefined,
|
|
22
24
|
salt: Fr | undefined,
|
|
23
25
|
publicKey: string | undefined,
|
|
24
26
|
alias: string | undefined,
|
|
@@ -35,15 +37,17 @@ export async function createAccount(
|
|
|
35
37
|
debugLogger: Logger,
|
|
36
38
|
log: LogFn,
|
|
37
39
|
) {
|
|
38
|
-
secretKey
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
secretKey
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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);
|
|
47
51
|
const instanceSalt = account.getInstance().salt;
|
|
48
52
|
const { address, publicKeys, partialAddress } = await account.getCompleteAddress();
|
|
49
53
|
|
|
@@ -51,6 +55,9 @@ export async function createAccount(
|
|
|
51
55
|
if (json) {
|
|
52
56
|
out.address = address;
|
|
53
57
|
out.publicKey = publicKeys;
|
|
58
|
+
if (signingKey) {
|
|
59
|
+
out.signingKey = signingKey;
|
|
60
|
+
}
|
|
54
61
|
if (secretKey) {
|
|
55
62
|
out.secretKey = secretKey;
|
|
56
63
|
}
|
|
@@ -61,6 +68,9 @@ export async function createAccount(
|
|
|
61
68
|
log(`\nNew account:\n`);
|
|
62
69
|
log(`Address: ${address.toString()}`);
|
|
63
70
|
log(`Public key: ${publicKeys.toString()}`);
|
|
71
|
+
if (signingKey) {
|
|
72
|
+
log(`Signing key: ${signingKey.toString()}`);
|
|
73
|
+
}
|
|
64
74
|
if (secretKey) {
|
|
65
75
|
log(`Secret key: ${secretKey.toString()}`);
|
|
66
76
|
}
|
|
@@ -162,5 +172,5 @@ export async function createAccount(
|
|
|
162
172
|
}
|
|
163
173
|
}
|
|
164
174
|
|
|
165
|
-
return { alias, address, secretKey, salt: instanceSalt };
|
|
175
|
+
return { alias, address, signingKey, secretKey, salt: instanceSalt };
|
|
166
176
|
}
|
|
@@ -30,7 +30,7 @@ export async function deployAccount(
|
|
|
30
30
|
) {
|
|
31
31
|
const out: Record<string, any> = {};
|
|
32
32
|
|
|
33
|
-
const account = await wallet.
|
|
33
|
+
const account = await wallet.retrieveAccount(address);
|
|
34
34
|
const { partialAddress, publicKeys } = await account.getCompleteAddress();
|
|
35
35
|
const { initializationHash, salt } = account.getInstance();
|
|
36
36
|
|
|
@@ -18,7 +18,14 @@ export async function importTestAccounts(wallet: CLIWallet, db: WalletDB, json:
|
|
|
18
18
|
const address = account.address;
|
|
19
19
|
await db.storeAccount(
|
|
20
20
|
address,
|
|
21
|
-
{
|
|
21
|
+
{
|
|
22
|
+
type: 'schnorr_initializerless',
|
|
23
|
+
signingKey: account.signingKey,
|
|
24
|
+
secretKey: secret,
|
|
25
|
+
salt,
|
|
26
|
+
alias,
|
|
27
|
+
publicKey: undefined,
|
|
28
|
+
},
|
|
22
29
|
log,
|
|
23
30
|
);
|
|
24
31
|
|
package/src/cmds/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ETHEREUM_HOSTS,
|
|
5
5
|
PRIVATE_KEY,
|
|
6
6
|
addOptions,
|
|
7
|
-
|
|
7
|
+
createSigningKeyOption,
|
|
8
8
|
l1ChainIdOption,
|
|
9
9
|
parseBigint,
|
|
10
10
|
parseFieldFromHexString,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
ARTIFACT_DESCRIPTION,
|
|
25
25
|
CLIFeeArgs,
|
|
26
26
|
aliasedAddressParser,
|
|
27
|
-
|
|
27
|
+
aliasedSigningKeyParser,
|
|
28
28
|
aliasedTxHashParser,
|
|
29
29
|
artifactPathFromPromiseOrAlias,
|
|
30
30
|
artifactPathParser,
|
|
@@ -96,8 +96,8 @@ export function injectCommands(
|
|
|
96
96
|
'Public key that identifies a private signing key stored outside of the wallet. Used for ECDSA SSH accounts over the secp256r1 curve.',
|
|
97
97
|
)
|
|
98
98
|
.addOption(
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
createSigningKeyOption('Signing key for account. Uses random by default.', false, sk =>
|
|
100
|
+
aliasedSigningKeyParser(sk, db),
|
|
101
101
|
).conflicts('public-key'),
|
|
102
102
|
)
|
|
103
103
|
.addOption(createAliasOption('Alias for the account. Used for easy reference in subsequent commands.', !db))
|
|
@@ -124,7 +124,7 @@ export function injectCommands(
|
|
|
124
124
|
const {
|
|
125
125
|
type,
|
|
126
126
|
from: parsedFromAddress,
|
|
127
|
-
|
|
127
|
+
signingKey,
|
|
128
128
|
salt,
|
|
129
129
|
wait,
|
|
130
130
|
waitForStatus: waitForStatusStr,
|
|
@@ -156,7 +156,7 @@ export function injectCommands(
|
|
|
156
156
|
wallet,
|
|
157
157
|
node,
|
|
158
158
|
type,
|
|
159
|
-
|
|
159
|
+
signingKey,
|
|
160
160
|
salt,
|
|
161
161
|
publicKey,
|
|
162
162
|
alias,
|
|
@@ -174,8 +174,8 @@ export function injectCommands(
|
|
|
174
174
|
log,
|
|
175
175
|
);
|
|
176
176
|
if (db) {
|
|
177
|
-
const { address, alias, secretKey, salt } = accountCreationResult;
|
|
178
|
-
await db.storeAccount(address, { type, secretKey, salt, alias, publicKey }, log);
|
|
177
|
+
const { address, alias, signingKey, secretKey, salt } = accountCreationResult;
|
|
178
|
+
await db.storeAccount(address, { type, signingKey, secretKey, salt, alias, publicKey }, log);
|
|
179
179
|
}
|
|
180
180
|
});
|
|
181
181
|
|
|
@@ -399,7 +399,9 @@ export function injectCommands(
|
|
|
399
399
|
.addOption(createContractAddressOption(db))
|
|
400
400
|
.addOption(createArtifactOption(db))
|
|
401
401
|
.addOption(
|
|
402
|
-
|
|
402
|
+
createSigningKeyOption("The sender's signing key", !db, sk => aliasedSigningKeyParser(sk, db)).conflicts(
|
|
403
|
+
'account',
|
|
404
|
+
),
|
|
403
405
|
)
|
|
404
406
|
.addOption(createAuthwitnessOption('Authorization witness to use for the simulation', !db, db))
|
|
405
407
|
.addOption(createAccountOption('Alias or address of the account to simulate from', !db, db))
|
package/src/storage/wallet_db.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
2
3
|
import type { LogFn } from '@aztec/foundation/log';
|
|
3
4
|
import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
|
|
4
5
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
@@ -88,13 +89,28 @@ export class WalletDB {
|
|
|
88
89
|
address: AztecAddress,
|
|
89
90
|
{
|
|
90
91
|
type,
|
|
92
|
+
signingKey,
|
|
91
93
|
secretKey,
|
|
92
94
|
salt,
|
|
93
95
|
alias,
|
|
94
96
|
publicKey,
|
|
95
|
-
}: {
|
|
97
|
+
}: {
|
|
98
|
+
type: AccountType;
|
|
99
|
+
signingKey?: GrumpkinScalar;
|
|
100
|
+
secretKey?: Fr;
|
|
101
|
+
salt: Fr;
|
|
102
|
+
alias: string | undefined;
|
|
103
|
+
publicKey: string | undefined;
|
|
104
|
+
},
|
|
96
105
|
log: LogFn,
|
|
97
106
|
) {
|
|
107
|
+
// Even though the privacy secret key is sometimes derived from the signing key, we store it in the database
|
|
108
|
+
// regardless as that is not always the case. Local-key accounts also store their signing key, while external-key
|
|
109
|
+
// accounts such as SSH store only the privacy secret.
|
|
110
|
+
if (!secretKey) {
|
|
111
|
+
throw new Error('Cannot store account without a secret key');
|
|
112
|
+
}
|
|
113
|
+
|
|
98
114
|
let publicSigningKey: Buffer | undefined;
|
|
99
115
|
if (type === 'ecdsasecp256r1ssh' && publicKey) {
|
|
100
116
|
publicSigningKey = extractECDSAPublicKeyFromBase64String(publicKey);
|
|
@@ -106,6 +122,9 @@ export class WalletDB {
|
|
|
106
122
|
}
|
|
107
123
|
await this.#accounts.set(`${address.toString()}:type`, Buffer.from(type));
|
|
108
124
|
await this.#accounts.set(`${address.toString()}:sk`, secretKey.toBuffer());
|
|
125
|
+
if (signingKey) {
|
|
126
|
+
await this.#accounts.set(`${address.toString()}:signing`, signingKey.toBuffer());
|
|
127
|
+
}
|
|
109
128
|
await this.#accounts.set(`${address.toString()}:salt`, salt.toBuffer());
|
|
110
129
|
if (publicSigningKey) {
|
|
111
130
|
await this.#accounts.set(`${address.toString()}:publicSigningKey`, publicSigningKey);
|
|
@@ -226,10 +245,13 @@ export class WalletDB {
|
|
|
226
245
|
if (!secretKeyBuffer) {
|
|
227
246
|
throw new Error(`Could not find ${address}:sk. Account "${address.toString}" does not exist on this wallet.`);
|
|
228
247
|
}
|
|
248
|
+
const signingKeyBuffer = await this.#accounts.getAsync(`${address.toString()}:signing`);
|
|
229
249
|
const secretKey = Fr.fromBuffer(secretKeyBuffer);
|
|
250
|
+
// External-key accounts (e.g. SSH) store no signing key.
|
|
251
|
+
const signingKey = signingKeyBuffer ? GrumpkinScalar.fromBuffer(signingKeyBuffer) : undefined;
|
|
230
252
|
const salt = Fr.fromBuffer((await this.#accounts.getAsync(`${address.toString()}:salt`))!);
|
|
231
253
|
const type = (await this.#accounts.getAsync(`${address.toString()}:type`))!.toString('utf8') as AccountType;
|
|
232
|
-
return { address, secretKey, salt, type };
|
|
254
|
+
return { address, signingKey, secretKey, salt, type };
|
|
233
255
|
}
|
|
234
256
|
|
|
235
257
|
async storeAlias(type: AliasType, key: string, value: Buffer, log: LogFn) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TxHash } from '@aztec/aztec.js/tx';
|
|
2
|
-
import { parseAztecAddress,
|
|
2
|
+
import { parseAztecAddress, parseSigningKey, parseTxHash } from '@aztec/cli/utils';
|
|
3
3
|
import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
4
4
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
5
|
|
|
@@ -64,13 +64,13 @@ export function aliasedAddressParser(defaultPrefix: AliasType, address: string,
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export function
|
|
67
|
+
export function aliasedSigningKeyParser(sk: string, db?: WalletDB) {
|
|
68
68
|
if (sk.startsWith('0x')) {
|
|
69
|
-
return
|
|
69
|
+
return parseSigningKey(sk);
|
|
70
70
|
} else {
|
|
71
|
-
const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':
|
|
71
|
+
const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':signing') ? sk : `${sk}:signing`}`;
|
|
72
72
|
const rawSk = db ? db.tryRetrieveAlias(prefixed) : sk;
|
|
73
|
-
return
|
|
73
|
+
return parseSigningKey(rawSk);
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
package/src/utils/wallet.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts/ecdsa';
|
|
1
|
+
import { EcdsaKAccountContract, EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts/ecdsa';
|
|
2
2
|
import { StubEcdsaAccountContractArtifact, createStubEcdsaAccount } from '@aztec/accounts/ecdsa/stub';
|
|
3
3
|
import { SchnorrAccountContract, SchnorrInitializerlessAccountContract } from '@aztec/accounts/schnorr';
|
|
4
4
|
import { StubSchnorrAccountContractArtifact, createStubSchnorrAccount } from '@aztec/accounts/schnorr/stub';
|
|
@@ -15,6 +15,7 @@ import { TxSimulationResultWithAppOffset } from '@aztec/aztec.js/wallet';
|
|
|
15
15
|
import type { DefaultAccountEntrypointOptions } from '@aztec/entrypoints/account';
|
|
16
16
|
import { DefaultEntrypoint } from '@aztec/entrypoints/default';
|
|
17
17
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
18
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
18
19
|
import type { LogFn } from '@aztec/foundation/log';
|
|
19
20
|
import type { NotesFilter } from '@aztec/pxe/client/lazy';
|
|
20
21
|
import type { PXEConfig } from '@aztec/pxe/config';
|
|
@@ -23,7 +24,6 @@ import { createPXE, getPXEConfig } from '@aztec/pxe/server';
|
|
|
23
24
|
import { getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
|
|
24
25
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
25
26
|
import type { Gas, GasUsed } from '@aztec/stdlib/gas';
|
|
26
|
-
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
27
27
|
import { NoteDao } from '@aztec/stdlib/note';
|
|
28
28
|
import type { SimulationOverrides, TxExecutionRequest, TxProvingResult } from '@aztec/stdlib/tx';
|
|
29
29
|
import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx';
|
|
@@ -153,7 +153,7 @@ export class CLIWallet extends BaseWallet {
|
|
|
153
153
|
if (this.accountCache.has(address.toString())) {
|
|
154
154
|
return this.accountCache.get(address.toString())!;
|
|
155
155
|
} else {
|
|
156
|
-
const accountManager = await this.
|
|
156
|
+
const accountManager = await this.retrieveAccount(address);
|
|
157
157
|
account = await accountManager.getAccount();
|
|
158
158
|
}
|
|
159
159
|
|
|
@@ -163,7 +163,93 @@ export class CLIWallet extends BaseWallet {
|
|
|
163
163
|
return account;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Creates an account from freshly supplied keys. SSH accounts sign with a key held in the agent (resolved from
|
|
168
|
+
* `publicKey`), every other type is rooted on `signingKey`, with `secretKey` as its privacy secret.
|
|
169
|
+
*/
|
|
170
|
+
async createAccount(
|
|
171
|
+
type: AccountType,
|
|
172
|
+
signingKey: GrumpkinScalar | undefined,
|
|
173
|
+
secretKey: Fr | undefined,
|
|
174
|
+
salt: Fr = Fr.ZERO,
|
|
175
|
+
publicKey?: string,
|
|
176
|
+
): Promise<AccountManager> {
|
|
177
|
+
const publicSigningKey =
|
|
178
|
+
type === 'ecdsasecp256r1ssh' ? await this.resolveSshPublicSigningKey(publicKey) : undefined;
|
|
179
|
+
return this.buildAccount(type, salt, signingKey, secretKey, publicSigningKey);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Retrieves a previously stored account by address, loading its keys, type and salt from the wallet database.
|
|
184
|
+
*/
|
|
185
|
+
async retrieveAccount(address: AztecAddress): Promise<AccountManager> {
|
|
186
|
+
if (!this.db) {
|
|
187
|
+
throw new Error('Cannot retrieve an account without a wallet database');
|
|
188
|
+
}
|
|
189
|
+
const { type, signingKey, secretKey, salt } = await this.db.retrieveAccount(address);
|
|
190
|
+
if (type !== 'ecdsasecp256r1ssh' && !signingKey) {
|
|
191
|
+
throw new Error(
|
|
192
|
+
`Account ${address} has no stored signing key: it was created with an older version of aztec-wallet and is ` +
|
|
193
|
+
`incompatible with this one. Create a new account to continue.`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
const publicSigningKey =
|
|
197
|
+
type === 'ecdsasecp256r1ssh' ? await this.db.retrieveAccountMetadata(address, 'publicSigningKey') : undefined;
|
|
198
|
+
return this.buildAccount(type, salt, signingKey, secretKey, publicSigningKey);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private async buildAccount(
|
|
202
|
+
type: AccountType,
|
|
203
|
+
salt: Fr,
|
|
204
|
+
signingKey: GrumpkinScalar | undefined,
|
|
205
|
+
secretKey: Fr | undefined,
|
|
206
|
+
publicSigningKey: Buffer | undefined,
|
|
207
|
+
): Promise<AccountManager> {
|
|
208
|
+
switch (type) {
|
|
209
|
+
case 'schnorr':
|
|
210
|
+
case 'schnorr_initializerless':
|
|
211
|
+
case 'ecdsasecp256r1':
|
|
212
|
+
case 'ecdsasecp256k1': {
|
|
213
|
+
if (!signingKey || !secretKey) {
|
|
214
|
+
throw new Error('Cannot build account without signing key and secret key');
|
|
215
|
+
}
|
|
216
|
+
const contract =
|
|
217
|
+
type === 'schnorr'
|
|
218
|
+
? new SchnorrAccountContract(signingKey)
|
|
219
|
+
: type === 'schnorr_initializerless'
|
|
220
|
+
? new SchnorrInitializerlessAccountContract(signingKey)
|
|
221
|
+
: type === 'ecdsasecp256r1'
|
|
222
|
+
? new EcdsaRAccountContract(signingKey.toBuffer())
|
|
223
|
+
: new EcdsaKAccountContract(signingKey.toBuffer());
|
|
224
|
+
return await this.materializeAccount(secretKey, salt, contract);
|
|
225
|
+
}
|
|
226
|
+
case 'ecdsasecp256r1ssh': {
|
|
227
|
+
if (!secretKey || !publicSigningKey) {
|
|
228
|
+
throw new Error('Cannot build SSH account without secret key and public signing key');
|
|
229
|
+
}
|
|
230
|
+
return await this.materializeAccount(secretKey, salt, new EcdsaRSSHAccountContract(publicSigningKey));
|
|
231
|
+
}
|
|
232
|
+
default: {
|
|
233
|
+
throw new Error(`Unsupported account type: ${type}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
private async resolveSshPublicSigningKey(publicKey: string | undefined): Promise<Buffer> {
|
|
239
|
+
if (!publicKey) {
|
|
240
|
+
throw new Error('Public key must be provided for ECDSA SSH account');
|
|
241
|
+
}
|
|
242
|
+
const identities = await getIdentities();
|
|
243
|
+
const foundIdentity = identities.find(
|
|
244
|
+
identity => identity.type === 'ecdsa-sha2-nistp256' && identity.publicKey === publicKey,
|
|
245
|
+
);
|
|
246
|
+
if (!foundIdentity) {
|
|
247
|
+
throw new Error(`Identity for public key ${publicKey} not found in the SSH agent`);
|
|
248
|
+
}
|
|
249
|
+
return extractECDSAPublicKeyFromBase64String(foundIdentity.publicKey);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
private async materializeAccount(secret: Fr, salt: Fr, contract: AccountContract): Promise<AccountManager> {
|
|
167
253
|
const accountManager = await AccountManager.create(this, secret, contract, { salt });
|
|
168
254
|
|
|
169
255
|
const instance = accountManager.getInstance();
|
|
@@ -188,73 +274,6 @@ export class CLIWallet extends BaseWallet {
|
|
|
188
274
|
return accountManager;
|
|
189
275
|
}
|
|
190
276
|
|
|
191
|
-
async createOrRetrieveAccount(
|
|
192
|
-
address?: AztecAddress,
|
|
193
|
-
secretKey?: Fr,
|
|
194
|
-
type: AccountType = 'schnorr',
|
|
195
|
-
salt?: Fr,
|
|
196
|
-
publicKey?: string,
|
|
197
|
-
): Promise<AccountManager> {
|
|
198
|
-
let account;
|
|
199
|
-
|
|
200
|
-
salt ??= Fr.ZERO;
|
|
201
|
-
|
|
202
|
-
if (this.db && address) {
|
|
203
|
-
({ type, secretKey, salt } = await this.db.retrieveAccount(address));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
if (!secretKey) {
|
|
207
|
-
throw new Error('Cannot retrieve/create wallet without secret key');
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
switch (type) {
|
|
211
|
-
case 'schnorr': {
|
|
212
|
-
account = await this.createAccount(secretKey, salt, new SchnorrAccountContract(deriveSigningKey(secretKey)));
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
case 'schnorr_initializerless': {
|
|
216
|
-
account = await this.createAccount(
|
|
217
|
-
secretKey,
|
|
218
|
-
salt,
|
|
219
|
-
new SchnorrInitializerlessAccountContract(deriveSigningKey(secretKey)),
|
|
220
|
-
);
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
case 'ecdsasecp256r1': {
|
|
224
|
-
account = await this.createAccount(
|
|
225
|
-
secretKey,
|
|
226
|
-
salt,
|
|
227
|
-
new EcdsaRAccountContract(deriveSigningKey(secretKey).toBuffer()),
|
|
228
|
-
);
|
|
229
|
-
break;
|
|
230
|
-
}
|
|
231
|
-
case 'ecdsasecp256r1ssh': {
|
|
232
|
-
let publicSigningKey;
|
|
233
|
-
if (this.db && address) {
|
|
234
|
-
publicSigningKey = await this.db.retrieveAccountMetadata(address, 'publicSigningKey');
|
|
235
|
-
} else if (publicKey) {
|
|
236
|
-
const identities = await getIdentities();
|
|
237
|
-
const foundIdentity = identities.find(
|
|
238
|
-
identity => identity.type === 'ecdsa-sha2-nistp256' && identity.publicKey === publicKey,
|
|
239
|
-
);
|
|
240
|
-
if (!foundIdentity) {
|
|
241
|
-
throw new Error(`Identity for public key ${publicKey} not found in the SSH agent`);
|
|
242
|
-
}
|
|
243
|
-
publicSigningKey = extractECDSAPublicKeyFromBase64String(foundIdentity.publicKey);
|
|
244
|
-
} else {
|
|
245
|
-
throw new Error('Public key must be provided for ECDSA SSH account');
|
|
246
|
-
}
|
|
247
|
-
account = await this.createAccount(secretKey, salt, new EcdsaRSSHAccountContract(publicSigningKey));
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
default: {
|
|
251
|
-
throw new Error(`Unsupported account type: ${type}`);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return account;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
277
|
/**
|
|
259
278
|
* Creates a stub account that impersonates the given address, allowing kernelless simulations
|
|
260
279
|
* to bypass the account's authorization mechanisms via contract overrides.
|