@aztec/cli-wallet 5.0.0-nightly.20260706 → 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.
@@ -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, secretKey: Fr | 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
+ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX2FjY291bnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2NyZWF0ZV9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWEsTUFBTSxzQkFBc0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBK0IsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHekUsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyx3QkFBc0IsYUFBYSxDQUNqQyxNQUFNLEVBQUUsU0FBUyxFQUNqQixTQUFTLEVBQUUsU0FBUyxFQUNwQixXQUFXLEVBQUUsV0FBVyxFQUN4QixTQUFTLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFDekIsSUFBSSxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQ3BCLFNBQVMsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM3QixLQUFLLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDekIsUUFBUSxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQ2xDLFlBQVksRUFBRSxPQUFPLEVBQ3JCLGtCQUFrQixFQUFFLE9BQU8sRUFDM0IsWUFBWSxFQUFFLE9BQU8sRUFDckIsYUFBYSxFQUFFLE9BQU8sRUFDdEIsSUFBSSxFQUFFLE9BQU8sRUFDYixPQUFPLEVBQUUsVUFBVSxFQUNuQixhQUFhLEVBQUUsUUFBUSxFQUN2QixJQUFJLEVBQUUsT0FBTyxFQUNiLE9BQU8sRUFBRSxPQUFPLEVBQ2hCLFdBQVcsRUFBRSxNQUFNLEVBQ25CLEdBQUcsRUFBRSxLQUFLOzs7OztHQWtJWCJ9
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":"AACA,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,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,SAAS,EAAE,EAAE,GAAG,SAAS,EACzB,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;;;;;GAkIX"}
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, secretKey, salt, publicKey, alias, deployer, registerOnly, skipInitialization, publicDeploy, registerClass, wait, feeOpts, waitForStatus, json, verbose, debugLogger, log) {
9
- secretKey ??= Fr.random();
10
- const account = await wallet.createOrRetrieveAccount(undefined /* address, we don't have it yet */ , secretKey, accountType, salt, publicKey);
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.createOrRetrieveAccount(address);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0X3Rlc3RfYWNjb3VudHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2ltcG9ydF90ZXN0X2FjY291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkFzQ2xHIn0=
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,iBAsClG"}
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"}
@@ -11,6 +11,7 @@ export async function importTestAccounts(wallet, db, json, log) {
11
11
  const address = account.address;
12
12
  await db.storeAccount(address, {
13
13
  type: 'schnorr_initializerless',
14
+ signingKey: account.signingKey,
14
15
  secretKey: secret,
15
16
  salt,
16
17
  alias,
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWFBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUczRCxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQVUsTUFBTSxXQUFXLENBQUM7QUFHakQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1DdkYsd0JBQWdCLGNBQWMsQ0FDNUIsT0FBTyxFQUFFLE9BQU8sRUFDaEIsR0FBRyxFQUFFLEtBQUssRUFDVixXQUFXLEVBQUUsTUFBTSxFQUNuQixvQkFBb0IsRUFBRSx1QkFBdUIsRUFDN0MsRUFBRSxFQUFFLFFBQVEsV0E4cEJiIn0=
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbWRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWFBLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUczRCxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQVUsTUFBTSxXQUFXLENBQUM7QUFHakQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1DdkYsd0JBQWdCLGNBQWMsQ0FDNUIsT0FBTyxFQUFFLE9BQU8sRUFDaEIsR0FBRyxFQUFFLEtBQUssRUFDVixXQUFXLEVBQUUsTUFBTSxFQUNuQixvQkFBb0IsRUFBRSx1QkFBdUIsRUFDN0MsRUFBRSxFQUFFLFFBQVEsV0FncUJiIn0=
@@ -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,WA8pBb"}
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"}
@@ -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, createSecretKeyOption, l1ChainIdOption, parseBigint, parseFieldFromHexString, parsePublicKey } from '@aztec/cli/utils';
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, aliasedSecretKeyParser, aliasedTxHashParser, artifactPathFromPromiseOrAlias, artifactPathParser, cleanupAuthWitnesses, createAccountOption, createAliasOption, createArgsOption, createArtifactOption, createAuthwitnessOption, createContractAddressOption, createDebugExecutionStepsDirOption, createTypeOption, createVerboseOption, integerArgParser } from '../utils/options/index.js';
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(createSecretKeyOption('Secret key for account. Uses random by default.', false, (sk)=>aliasedSecretKeyParser(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.
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, secretKey, salt, wait, waitForStatus: waitForStatusStr, registerOnly, skipInitialization, publicDeploy, registerClass, alias, json, verbose } = options;
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, secretKey, salt, publicKey, alias, parsedFromAddress, registerOnly, skipInitialization, publicDeploy, registerClass, wait, CLIFeeArgs.parse(options, log, db), parseWaitForStatus(waitForStatusStr), json, verbose, debugLogger, log);
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(createSecretKeyOption("The sender's secret key", !db, (sk)=>aliasedSecretKeyParser(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
+ 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
- secretKey: Fr;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0X2RiLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS93YWxsZXRfZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3pELGVBQU8sTUFBTSxPQUFPLHdGQUF5RixDQUFDO0FBQzlHLE1BQU0sTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRWpELHFCQUFhLFFBQVE7O0lBTW5CLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFXO0lBRWxDLE9BQU8sQ0FBQyxVQUFVLENBQTZCO0lBRS9DLE1BQU0sQ0FBQyxXQUFXLGFBTWpCO0lBRUssSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsaUJBT2xDO1lBRWEsaUJBQWlCO0lBSXpCLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssaUJBWTNHO0lBRUssa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsS0FBSzs7OztPQVkzRDtJQUVLLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUs7Ozs7T0FZNUQ7SUFFSyxZQUFZLENBQ2hCLE9BQU8sRUFBRSxZQUFZLEVBQ3JCLEVBQ0UsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osS0FBSyxFQUNMLFNBQVMsRUFDVixFQUFFO1FBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQztRQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQTtLQUFFLEVBQzNHLEdBQUcsRUFBRSxLQUFLLGlCQXFCWDtJQUVLLFdBQVcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssaUJBS2pFO0lBRUssYUFBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0saUJBWTFGO0lBRUssZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0saUJBU3RFO0lBRUssT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0saUJBU3ZFO0lBRUQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sVUFNM0I7SUFFTSxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxVQVl4QztJQUVLLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxtQkFXOUI7SUFFSyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUzs7O1NBV2pDO0lBRUssb0JBQW9CLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFHdEc7SUFFSyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsWUFBWSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FPdkY7SUFFSyxlQUFlLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRyxNQUFNOzs7OztPQVNuRDtJQUVLLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxpQkFNdkU7Q0FDRiJ9
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;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,EAAE,CAAC;QAAC,IAAI,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,EAC3G,GAAG,EAAE,KAAK,iBAqBX;IAEK,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,iBAKjE;IAEK,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,iBAY1F;IAEK,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,iBAStE;IAEK,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,iBASvE;IAED,gBAAgB,CAAC,GAAG,EAAE,MAAM,UAM3B;IAEM,sBAAsB,CAAC,GAAG,EAAE,MAAM,UAYxC;IAEK,aAAa,CAAC,GAAG,EAAE,MAAM,mBAW9B;IAEK,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS;;;SAWjC;IAEK,oBAAoB,CAAC,cAAc,EAAE,YAAY,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAGtG;IAEK,uBAAuB,CAAC,cAAc,EAAE,YAAY,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,oCAOvF;IAEK,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;;;;;OASnD;IAEK,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,iBAMvE;CACF"}
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 aliasedSecretKeyParser(sk: string, db?: WalletDB): import("@aztec/foundation/schemas").Fr;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL29wdGlvbnMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHbkMsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBS3RFLGVBQU8sTUFBTSxvQkFBb0Isd0tBQ3NJLENBQUM7QUFFeEssd0JBQWdCLGdCQUFnQixDQUM5QixLQUFLLEVBQUUsTUFBTSxFQUNiLE9BQU8sRUFBRSxNQUFNLEVBQ2YsR0FBRyxTQUEwQixFQUM3QixHQUFHLFNBQTBCLFVBVTlCO0FBRUQsd0JBQWdCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxHQUFHLE1BQU0sQ0FRekU7QUFFRCx3QkFBZ0Isb0JBQW9CLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLGlCQVlwRTtBQUVELHdCQUFnQixvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxnQkFRNUY7QUFFRCx3QkFBZ0Isc0JBQXNCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLDBDQVEvRDtBQUVELHdCQUFnQixpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLFVBRW5FO0FBRUQsd0JBQWdCLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXBGO0FBRUQsd0JBQWdCLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXhGO0FBRUQsd0JBQWdCLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLFVBTWxEO0FBRUQsd0JBQWdCLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxVQVFyRTtBQUVELHdCQUFnQiwyQkFBMkIsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLFVBSXhEO0FBRUQsd0JBQWdCLGtDQUFrQyxXQUtqRDtBQUVELHdCQUFnQixtQkFBbUIsV0FLbEM7QUFFRCx3QkFBZ0Isa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLG1CQWFqRTtBQUVELHdCQUFzQiw4QkFBOEIsQ0FDbEQsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNwQyxlQUFlLEVBQUUsWUFBWSxFQUM3QixFQUFFLENBQUMsRUFBRSxRQUFRLG1CQVdkO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsVUFJakQ7QUE2QkQsd0JBQWdCLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxTQUFTLEdBQUcsV0FBVyxFQUFFLENBRTVGIn0=
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,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,0CAQ/D;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
+ {"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, parseSecretKey, parseTxHash } from '@aztec/cli/utils';
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 aliasedSecretKeyParser(sk, db) {
48
+ export function aliasedSigningKeyParser(sk, db) {
49
49
  if (sk.startsWith('0x')) {
50
- return parseSecretKey(sk);
50
+ return parseSigningKey(sk);
51
51
  } else {
52
- const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':sk') ? sk : `${sk}:sk`}`;
52
+ const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':signing') ? sk : `${sk}:signing`}`;
53
53
  const rawSk = db ? db.tryRetrieveAlias(prefixed) : sk;
54
- return parseSecretKey(rawSk);
54
+ return parseSigningKey(rawSk);
55
55
  }
56
56
  }
57
57
  export function createAliasOption(description, hide) {
@@ -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
- private createAccount;
42
- createOrRetrieveAccount(address?: AztecAddress, secretKey?: Fr, type?: AccountType, salt?: Fr, publicKey?: string): Promise<AccountManager>;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBaUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RixPQUFPLEVBRUwsS0FBSyxxQkFBcUIsRUFFM0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUEyQyxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLDRCQUE0QixFQUFnQixNQUFNLCtCQUErQixDQUFDO0FBRTVHLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTWxELHFCQUFhLFNBQVUsU0FBUSxVQUFVO0lBU3JDLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQVRiLE9BQU8sQ0FBQyxZQUFZLENBQThCO0lBR2xELE9BQU8sQ0FBQyxZQUFZLENBQThCO0lBRWxELFlBQ0UsR0FBRyxFQUFFLEdBQUcsRUFDUixJQUFJLEVBQUUsU0FBUyxFQUNQLE9BQU8sRUFBRSxLQUFLLEVBQ2QsRUFBRSxDQUFDLHNCQUFVLEVBSXRCO0lBRUQsT0FBYSxNQUFNLENBQ2pCLElBQUksRUFBRSxTQUFTLEVBQ2YsR0FBRyxFQUFFLEtBQUssRUFDVixFQUFFLENBQUMsRUFBRSxRQUFRLEVBQ2IsaUJBQWlCLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQ3JDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FPcEI7WUFFYSxvQkFBb0I7WUFVcEIsZUFBZTtJQWVkLFdBQVcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FRN0Q7SUFFRDs7OztPQUlHO0lBQ0csaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDO1FBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFBO0tBQUUsQ0FBQyxDQUc3RjtZQUVhLG9DQUFvQztJQTRCNUMsbUJBQW1CLENBQ3ZCLElBQUksRUFBRSxZQUFZLEVBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQ1gsWUFBWSxFQUFFLHFCQUFxQixHQUNsQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBRzFCO0lBRWMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFlBQVksb0JBYXpEO1lBRWEsYUFBYTtJQXlCckIsdUJBQXVCLENBQzNCLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFDdEIsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUNkLElBQUksR0FBRSxXQUF1QixFQUM3QixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQ1QsU0FBUyxDQUFDLEVBQUUsTUFBTSxHQUNqQixPQUFPLENBQUMsY0FBYyxDQUFDLENBMkR6QjtZQVFhLHFCQUFxQjtJQXNCbkM7OztPQUdHO0lBQ0gsVUFBeUIscUJBQXFCLENBQzVDLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxJQUFJLEVBQUUsNEJBQTRCLEdBQ2pDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQTJDMUM7SUFJRCxZQUFZLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBRXRDO0lBSUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBRWhEO0lBSUQsbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUscUVBRXpCO0NBQ0YifQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBaUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RixPQUFPLEVBRUwsS0FBSyxxQkFBcUIsRUFFM0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssRUFBMkMsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakcsT0FBTyxFQUFFLGdCQUFnQixFQUEwQixNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyw0QkFBNEIsRUFBZ0IsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1sRCxxQkFBYSxTQUFVLFNBQVEsVUFBVTtJQVNyQyxPQUFPLENBQUMsT0FBTztJQUNmLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFUYixPQUFPLENBQUMsWUFBWSxDQUE4QjtJQUdsRCxPQUFPLENBQUMsWUFBWSxDQUE4QjtJQUVsRCxZQUNFLEdBQUcsRUFBRSxHQUFHLEVBQ1IsSUFBSSxFQUFFLFNBQVMsRUFDUCxPQUFPLEVBQUUsS0FBSyxFQUNkLEVBQUUsQ0FBQyxzQkFBVSxFQUl0QjtJQUVELE9BQWEsTUFBTSxDQUNqQixJQUFJLEVBQUUsU0FBUyxFQUNmLEdBQUcsRUFBRSxLQUFLLEVBQ1YsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUNiLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBT3BCO1lBRWEsb0JBQW9CO1lBVXBCLGVBQWU7SUFlZCxXQUFXLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBUTdEO0lBRUQ7Ozs7T0FJRztJQUNHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztRQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQTtLQUFFLENBQUMsQ0FHN0Y7WUFFYSxvQ0FBb0M7SUE0QjVDLG1CQUFtQixDQUN2QixJQUFJLEVBQUUsWUFBWSxFQUNsQixPQUFPLEVBQUUsRUFBRSxFQUNYLFlBQVksRUFBRSxxQkFBcUIsR0FDbEMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUcxQjtJQUVjLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxZQUFZLG9CQWF6RDtJQUVEOzs7T0FHRztJQUNHLGFBQWEsQ0FDakIsSUFBSSxFQUFFLFdBQVcsRUFDakIsVUFBVSxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQ3RDLFNBQVMsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUN6QixJQUFJLEdBQUUsRUFBWSxFQUNsQixTQUFTLENBQUMsRUFBRSxNQUFNLEdBQ2pCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FJekI7SUFFRDs7T0FFRztJQUNHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FjcEU7WUFFYSxZQUFZO1lBcUNaLDBCQUEwQjtZQWMxQixrQkFBa0I7WUErQmxCLHFCQUFxQjtJQXNCbkM7OztPQUdHO0lBQ0gsVUFBeUIscUJBQXFCLENBQzVDLGdCQUFnQixFQUFFLGdCQUFnQixFQUNsQyxJQUFJLEVBQUUsNEJBQTRCLEdBQ2pDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQTJDMUM7SUFJRCxZQUFZLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLENBRXRDO0lBSUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBRWhEO0lBSUQsbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUscUVBRXpCO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/utils/wallet.ts"],"names":[],"mappings":"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"}
@@ -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.createOrRetrieveAccount(address);
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
- async createAccount(secret, salt, contract) {
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.20260706",
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.20260706",
71
- "@aztec/aztec.js": "5.0.0-nightly.20260706",
72
- "@aztec/bb.js": "5.0.0-nightly.20260706",
73
- "@aztec/cli": "5.0.0-nightly.20260706",
74
- "@aztec/entrypoints": "5.0.0-nightly.20260706",
75
- "@aztec/ethereum": "5.0.0-nightly.20260706",
76
- "@aztec/foundation": "5.0.0-nightly.20260706",
77
- "@aztec/kv-store": "5.0.0-nightly.20260706",
78
- "@aztec/noir-contracts.js": "5.0.0-nightly.20260706",
79
- "@aztec/noir-noirc_abi": "5.0.0-nightly.20260706",
80
- "@aztec/pxe": "5.0.0-nightly.20260706",
81
- "@aztec/standard-contracts": "5.0.0-nightly.20260706",
82
- "@aztec/stdlib": "5.0.0-nightly.20260706",
83
- "@aztec/wallet-sdk": "5.0.0-nightly.20260706",
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
- secretKey: Fr | undefined,
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 ??= Fr.random();
39
-
40
- const account = await wallet.createOrRetrieveAccount(
41
- undefined /* address, we don't have it yet */,
42
- secretKey,
43
- accountType,
44
- salt,
45
- publicKey,
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.createOrRetrieveAccount(address);
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
- { type: 'schnorr_initializerless', secretKey: secret, salt, alias, publicKey: undefined },
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
- createSecretKeyOption,
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
- aliasedSecretKeyParser,
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
- createSecretKeyOption('Secret key for account. Uses random by default.', false, sk =>
100
- aliasedSecretKeyParser(sk, db),
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
- secretKey,
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
- secretKey,
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
- createSecretKeyOption("The sender's secret key", !db, sk => aliasedSecretKeyParser(sk, db)).conflicts('account'),
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))
@@ -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
- }: { type: AccountType; secretKey: Fr; salt: Fr; alias: string | undefined; publicKey: string | undefined },
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, parseSecretKey, parseTxHash } from '@aztec/cli/utils';
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 aliasedSecretKeyParser(sk: string, db?: WalletDB) {
67
+ export function aliasedSigningKeyParser(sk: string, db?: WalletDB) {
68
68
  if (sk.startsWith('0x')) {
69
- return parseSecretKey(sk);
69
+ return parseSigningKey(sk);
70
70
  } else {
71
- const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':sk') ? sk : `${sk}:sk`}`;
71
+ const prefixed = `${sk.startsWith('accounts') ? '' : 'accounts'}:${sk.endsWith(':signing') ? sk : `${sk}:signing`}`;
72
72
  const rawSk = db ? db.tryRetrieveAlias(prefixed) : sk;
73
- return parseSecretKey(rawSk);
73
+ return parseSigningKey(rawSk);
74
74
  }
75
75
  }
76
76
 
@@ -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.createOrRetrieveAccount(address);
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
- private async createAccount(secret: Fr, salt: Fr, contract: AccountContract): Promise<AccountManager> {
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.