@aztec/cli-wallet 0.82.2 → 0.82.3-nightly.20250403

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dest/bin/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Fr, computeSecretHash, fileURLToPath } from '@aztec/aztec.js';
1
+ import { Fr, computeSecretHash, createCompatibleClient, fileURLToPath } from '@aztec/aztec.js';
2
2
  import { LOCALHOST } from '@aztec/cli/cli-utils';
3
3
  import { createConsoleLogger, createLogger } from '@aztec/foundation/log';
4
4
  import { openStoreAt } from '@aztec/kv-store/lmdb-v2';
@@ -46,7 +46,7 @@ function injectInternalCommands(program, log, db) {
46
46
  const pxeWrapper = new PXEWrapper();
47
47
  const program = new Command('wallet');
48
48
  program.description('Aztec wallet').version(walletVersion).option('-d, --data-dir <string>', 'Storage directory for wallet data', WALLET_DATA_DIRECTORY).option('-p, --prover <string>', 'wasm|native|none', PXE_PROVER).addOption(new Option('--remote-pxe', 'Connect to an external PXE RPC server, instead of the local one').env('REMOTE_PXE').default(false).conflicts('rpc-url')).addOption(new Option('-n, --node-url <string>', 'URL of the Aztec node to connect to').env('AZTEC_NODE_URL').default(`http://${LOCALHOST}:8080`)).hook('preSubcommand', async (command)=>{
49
- const { dataDir, remotePxe, nodeUrl, prover } = command.optsWithGlobals();
49
+ const { dataDir, remotePxe, nodeUrl, prover, rpcUrl } = command.optsWithGlobals();
50
50
  if (!remotePxe) {
51
51
  debugLogger.info('Using local PXE service');
52
52
  const proverEnabled = prover !== 'none';
@@ -63,6 +63,20 @@ function injectInternalCommands(program, log, db) {
63
63
  await pxeWrapper.init(nodeUrl, join(dataDir, 'pxe'), overridePXEConfig);
64
64
  }
65
65
  await db.init(await openStoreAt(dataDir));
66
+ let protocolContractsRegistered;
67
+ try {
68
+ protocolContractsRegistered = !!await db.retrieveAlias('contracts:classRegisterer');
69
+ // eslint-disable-next-line no-empty
70
+ } catch {}
71
+ if (!protocolContractsRegistered) {
72
+ userLog('Registering protocol contract aliases...');
73
+ const client = pxeWrapper?.getPXE() ?? await createCompatibleClient(rpcUrl, debugLogger);
74
+ const { protocolContractAddresses } = await client.getPXEInfo();
75
+ for (const [name, address] of Object.entries(protocolContractAddresses)){
76
+ await db.storeAlias('contracts', name, Buffer.from(address.toString()), userLog);
77
+ await db.storeAlias('artifacts', address.toString(), Buffer.from(`${name.slice(0, 1).toUpperCase()}${name.slice(1)}`), userLog);
78
+ }
79
+ }
66
80
  });
67
81
  injectCommands(program, userLog, debugLogger, db, pxeWrapper);
68
82
  injectInternalCommands(program, userLog, db);
@@ -1 +1 @@
1
- {"version":3,"file":"create_account.d.ts","sourceRoot":"","sources":["../../src/cmds/create_account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,aAAa,CACjC,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,EACrB,kBAAkB,EAAE,OAAO,EAC3B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK;;;;;GAkGX"}
1
+ {"version":3,"file":"create_account.d.ts","sourceRoot":"","sources":["../../src/cmds/create_account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,aAAa,CACjC,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,OAAO,EACrB,kBAAkB,EAAE,OAAO,EAC3B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK;;;;;GA8GX"}
@@ -43,7 +43,22 @@ export async function createAccount(client, accountType, secretKey, publicKey, a
43
43
  ...await feeOpts.toDeployAccountOpts(wallet)
44
44
  };
45
45
  if (feeOpts.estimateOnly) {
46
- const gas = await account.estimateDeploymentGas(deployOpts);
46
+ /*
47
+ * This is usually handled by accountManager.deploy(), but we're accessing the lower
48
+ * level method to get the gas estimates. That means we have to replicate some of the logic here.
49
+ * In case we're deploying our own account, we need to hijack the payment method for the fee,
50
+ * wrapping it in the one that will make use of the freshly deployed account's
51
+ * entrypoint. For reference, see aztec.js/src/account_manager.ts:deploy()
52
+ */ const fee = !deployOpts?.deployWallet && deployOpts?.fee ? {
53
+ ...deployOpts.fee,
54
+ paymentMethod: await account.getSelfPaymentMethod(deployOpts.fee.paymentMethod)
55
+ } : deployOpts?.fee;
56
+ const deployMethod = await account.getDeployMethod(deployOpts.deployWallet);
57
+ const gas = await deployMethod.estimateGas({
58
+ ...deployOpts,
59
+ fee,
60
+ universalDeploy: true
61
+ });
47
62
  if (json) {
48
63
  out.fee = {
49
64
  gasLimits: {
@@ -1,6 +1,6 @@
1
- import { type AccountWalletWithSecretKey, Fr, type PXE } from '@aztec/aztec.js';
1
+ import { type AccountWalletWithSecretKey, Fr } from '@aztec/aztec.js';
2
2
  import type { LogFn, Logger } from '@aztec/foundation/log';
3
3
  import { PublicKeys } from '@aztec/stdlib/keys';
4
4
  import { type IFeeOpts } from '../utils/options/fees.js';
5
- export declare function deploy(client: PXE, wallet: AccountWalletWithSecretKey, artifactPath: string, json: boolean, publicKeys: PublicKeys | undefined, rawArgs: any[], salt: Fr | undefined, initializer: string | undefined, skipPublicDeployment: boolean, skipClassRegistration: boolean, skipInitialization: boolean | undefined, universalDeploy: boolean | undefined, wait: boolean, feeOpts: IFeeOpts, debugLogger: Logger, log: LogFn, logJson: (output: any) => void): Promise<import("@aztec/aztec.js").AztecAddress | undefined>;
5
+ export declare function deploy(wallet: AccountWalletWithSecretKey, artifactPath: string, json: boolean, publicKeys: PublicKeys | undefined, rawArgs: any[], salt: Fr | undefined, initializer: string | undefined, skipPublicDeployment: boolean, skipClassRegistration: boolean, skipInitialization: boolean | undefined, universalDeploy: boolean | undefined, wait: boolean, feeOpts: IFeeOpts, debugLogger: Logger, log: LogFn, logJson: (output: any) => void): Promise<import("@aztec/aztec.js").AztecAddress | undefined>;
6
6
  //# sourceMappingURL=deploy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAwC,EAAE,EAAE,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,MAAM,CAC1B,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,0BAA0B,EAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,GAAG,EAAE,EACd,IAAI,EAAE,EAAE,GAAG,SAAS,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,oBAAoB,EAAE,OAAO,EAC7B,qBAAqB,EAAE,OAAO,EAC9B,kBAAkB,EAAE,OAAO,GAAG,SAAS,EACvC,eAAe,EAAE,OAAO,GAAG,SAAS,EACpC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,+DAiF/B"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAwC,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE5G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,MAAM,CAC1B,MAAM,EAAE,0BAA0B,EAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,OAAO,EAAE,GAAG,EAAE,EACd,IAAI,EAAE,EAAE,GAAG,SAAS,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,oBAAoB,EAAE,OAAO,EAC7B,qBAAqB,EAAE,OAAO,EAC9B,kBAAkB,EAAE,OAAO,GAAG,SAAS,EACvC,eAAe,EAAE,OAAO,GAAG,SAAS,EACpC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,+DAkF/B"}
@@ -1,12 +1,13 @@
1
1
  import { ContractDeployer, Fr } from '@aztec/aztec.js';
2
2
  import { encodeArgs, getContractArtifact } from '@aztec/cli/utils';
3
- import { getInitializer } from '@aztec/stdlib/abi';
3
+ import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
4
4
  import { PublicKeys } from '@aztec/stdlib/keys';
5
5
  import { printGasEstimates } from '../utils/options/fees.js';
6
- export async function deploy(client, wallet, artifactPath, json, publicKeys, rawArgs, salt, initializer, skipPublicDeployment, skipClassRegistration, skipInitialization, universalDeploy, wait, feeOpts, debugLogger, log, logJson) {
6
+ export async function deploy(wallet, artifactPath, json, publicKeys, rawArgs, salt, initializer, skipPublicDeployment, skipClassRegistration, skipInitialization, universalDeploy, wait, feeOpts, debugLogger, log, logJson) {
7
7
  salt ??= Fr.random();
8
8
  const contractArtifact = await getContractArtifact(artifactPath, log);
9
- const constructorArtifact = getInitializer(contractArtifact, initializer);
9
+ const hasInitializer = getAllFunctionAbis(contractArtifact).some((fn)=>fn.isInitializer);
10
+ const constructorArtifact = hasInitializer ? getInitializer(contractArtifact, initializer) : undefined;
10
11
  // TODO(#12081): Add contractArtifact.noirVersion and check here (via Noir.lock)?
11
12
  const deployer = new ContractDeployer(contractArtifact, wallet, publicKeys ?? PublicKeys.default(), initializer);
12
13
  let args = [];
@@ -1 +1 @@
1
- {"version":3,"file":"deploy_account.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy_account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,iBAAiB,CAAC;AAE5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK;;;;GAgFX"}
1
+ {"version":3,"file":"deploy_account.d.ts","sourceRoot":"","sources":["../../src/cmds/deploy_account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,iBAAiB,CAAC;AAE5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,0BAA0B,CAAC;AAE5E,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,KAAK;;;;GA6FX"}
@@ -28,10 +28,26 @@ export async function deployAccount(account, wait, feeOpts, json, debugLogger, l
28
28
  let txReceipt;
29
29
  const deployOpts = {
30
30
  skipInitialization: false,
31
+ skipPublicDeployment: false,
31
32
  ...await feeOpts.toDeployAccountOpts(wallet)
32
33
  };
33
34
  if (feeOpts.estimateOnly) {
34
- const gas = await account.estimateDeploymentGas(deployOpts);
35
+ /*
36
+ * This is usually handled by accountManager.deploy(), but we're accessing the lower
37
+ * level method to get the gas estimates. That means we have to replicate some of the logic here.
38
+ * In case we're deploying our own account, we need to hijack the payment method for the fee,
39
+ * wrapping it in the one that will make use of the freshly deployed account's
40
+ * entrypoint. For reference, see aztec.js/src/account_manager.ts:deploy()
41
+ */ const fee = !deployOpts?.deployWallet && deployOpts?.fee ? {
42
+ ...deployOpts.fee,
43
+ paymentMethod: await account.getSelfPaymentMethod(deployOpts.fee.paymentMethod)
44
+ } : deployOpts?.fee;
45
+ const deployMethod = await account.getDeployMethod(deployOpts.deployWallet);
46
+ const gas = await deployMethod.estimateGas({
47
+ ...deployOpts,
48
+ fee,
49
+ universalDeploy: true
50
+ });
35
51
  if (json) {
36
52
  out.fee = {
37
53
  gasLimits: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cmds/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI3D,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AAGjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAuBxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,KAAK,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,QAAQ,EACb,UAAU,CAAC,EAAE,UAAU,WAmmBxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cmds/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI3D,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AAGjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAuBxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,KAAK,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,CAAC,EAAE,QAAQ,EACb,UAAU,CAAC,EAAE,UAAU,WAsoBxB"}
@@ -75,7 +75,7 @@ export function injectCommands(program, log, debugLogger, db, pxeWrapper) {
75
75
  const wallet = await account.getWallet();
76
76
  const artifactPath = await artifactPathPromise;
77
77
  debugLogger.info(`Using wallet with address ${wallet.getCompleteAddress().address.toString()}`);
78
- const address = await deploy(client, wallet, artifactPath, json, publicKey, args, salt, typeof init === 'string' ? init : undefined, !publicDeployment, !classRegistration, typeof init === 'string' ? false : init, universal, wait, await FeeOpts.fromCli(options, client, log, db), debugLogger, log, logJson(log));
78
+ const address = await deploy(wallet, artifactPath, json, publicKey, args, salt, typeof init === 'string' ? init : undefined, !publicDeployment, !classRegistration, typeof init === 'string' ? false : init, universal, wait, await FeeOpts.fromCli(options, client, log, db), debugLogger, log, logJson(log));
79
79
  if (db && address) {
80
80
  await db.storeContract(address, artifactPath, log, alias);
81
81
  }
@@ -210,15 +210,15 @@ export function injectCommands(program, log, debugLogger, db, pxeWrapper) {
210
210
  await db.storeSender(address, alias, log);
211
211
  }
212
212
  });
213
- program.command('register-contract').description("Registers a contract in this wallet's PXE").argument('[address]', 'The address of the contract to register', (address)=>aliasedAddressParser('accounts', address, db)).argument('[artifact]', ARTIFACT_DESCRIPTION, artifactPathParser).addOption(createArgsOption(true, db)).addOption(pxeOption).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)).addOption(createAliasOption('Alias for the contact. Used for easy reference in subsequent commands.', !db)).action(async (address, artifactPathPromise, _options, command)=>{
213
+ program.command('register-contract').description("Registers a contract in this wallet's PXE").argument('[address]', 'The address of the contract to register', (address)=>aliasedAddressParser('accounts', address, db)).argument('[artifact]', ARTIFACT_DESCRIPTION, artifactPathParser).option('--init <string>', 'The contract initializer function to call', 'constructor').option('-k, --public-key <string>', 'Optional encryption public key for this address. Set this value only if this contract is expected to receive private notes, which will be encrypted using this public key.', parsePublicKey).option('-s, --salt <hex string>', 'Optional deployment salt as a hex string for generating the deployment address.', parseFieldFromHexString).option('--deployer <string>', 'The address of the account that deployed the contract', (address)=>aliasedAddressParser('accounts', address, db)).addOption(createArgsOption(true, db)).addOption(pxeOption).addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)).addOption(createAliasOption('Alias for the contact. Used for easy reference in subsequent commands.', !db)).action(async (address, artifactPathPromise, _options, command)=>{
214
214
  const { registerContract } = await import('./register_contract.js');
215
- const { from: parsedFromAddress, rpcUrl, nodeUrl, secretKey, alias } = command.optsWithGlobals();
215
+ const { from: parsedFromAddress, rpcUrl, nodeUrl, secretKey, alias, init, publicKey, salt, deployer, args } = command.optsWithGlobals();
216
216
  const client = pxeWrapper?.getPXE() ?? await createCompatibleClient(rpcUrl, debugLogger);
217
217
  const node = pxeWrapper?.getNode() ?? createAztecNodeClient(nodeUrl);
218
218
  const account = await createOrRetrieveAccount(client, parsedFromAddress, db, secretKey);
219
219
  const wallet = await account.getWallet();
220
220
  const artifactPath = await artifactPathPromise;
221
- const instance = await registerContract(wallet, node, address, artifactPath, log);
221
+ const instance = await registerContract(wallet, node, address, artifactPath, log, init, publicKey, args, salt, deployer);
222
222
  if (db && alias) {
223
223
  await db.storeContract(instance.address, artifactPath, log, alias);
224
224
  }
@@ -1,4 +1,4 @@
1
- import type { AccountWalletWithSecretKey, AztecAddress, AztecNode } from '@aztec/aztec.js';
1
+ import { type AccountWalletWithSecretKey, type AztecAddress, type AztecNode, type Fr, PublicKeys } from '@aztec/aztec.js';
2
2
  import type { LogFn } from '@aztec/foundation/log';
3
- export declare function registerContract(wallet: AccountWalletWithSecretKey, node: AztecNode, address: AztecAddress, artifactPath: string, log: LogFn): Promise<import("@aztec/aztec.js").ContractInstanceWithAddress>;
3
+ export declare function registerContract(wallet: AccountWalletWithSecretKey, node: AztecNode, address: AztecAddress, artifactPath: string, log: LogFn, initializer?: string, publicKeys?: PublicKeys, rawArgs?: any[], salt?: Fr, deployer?: AztecAddress | undefined): Promise<import("@aztec/aztec.js").ContractInstanceWithAddress>;
4
4
  //# sourceMappingURL=register_contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register_contract.d.ts","sourceRoot":"","sources":["../../src/cmds/register_contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,0BAA0B,EAClC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,KAAK,kEAUX"}
1
+ {"version":3,"file":"register_contract.d.ts","sourceRoot":"","sources":["../../src/cmds/register_contract.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,EAAE,EACP,UAAU,EAEX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,0BAA0B,EAClC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,KAAK,EACV,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,UAAU,EACvB,OAAO,CAAC,EAAE,GAAG,EAAE,EACf,IAAI,CAAC,EAAE,EAAE,EACT,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,kEAsBpC"}
@@ -1,9 +1,23 @@
1
+ import { PublicKeys, getContractInstanceFromDeployParams } from '@aztec/aztec.js';
1
2
  import { getContractArtifact } from '@aztec/cli/cli-utils';
2
- export async function registerContract(wallet, node, address, artifactPath, log) {
3
+ import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
4
+ export async function registerContract(wallet, node, address, artifactPath, log, initializer, publicKeys, rawArgs, salt, deployer) {
3
5
  const contractArtifact = await getContractArtifact(artifactPath, log);
4
- const contractInstance = await node.getContract(address);
6
+ const hasInitializer = getAllFunctionAbis(contractArtifact).some((fn)=>fn.isInitializer);
7
+ const constructorArtifact = hasInitializer ? getInitializer(contractArtifact, initializer) : undefined;
8
+ let contractInstance = await node.getContract(address);
5
9
  if (!contractInstance) {
6
- throw new Error(`Contract not found at address: ${address}`);
10
+ log(`Contract not found in the node at ${address}. Computing instance locally...`);
11
+ contractInstance = await getContractInstanceFromDeployParams(contractArtifact, {
12
+ constructorArtifact,
13
+ publicKeys: publicKeys ?? PublicKeys.default(),
14
+ constructorArgs: rawArgs,
15
+ salt,
16
+ deployer
17
+ });
18
+ }
19
+ if (!contractInstance.address.equals(address)) {
20
+ throw new Error(`Contract address mismatch: expected ${address}, got ${contractInstance.address}`);
7
21
  }
8
22
  await wallet.registerContract({
9
23
  instance: contractInstance,
@@ -58,7 +58,7 @@ export declare class WalletDB {
58
58
  address: string | AztecAddress;
59
59
  secretKey: Fr;
60
60
  salt: Fr;
61
- type: "schnorr" | "ecdsasecp256r1ssh" | "ecdsasecp256k1";
61
+ type: "schnorr" | "ecdsasecp256r1" | "ecdsasecp256r1ssh" | "ecdsasecp256k1";
62
62
  }>;
63
63
  storeAlias(type: AliasType, key: string, value: Buffer, log: LogFn): Promise<void>;
64
64
  }
@@ -3,7 +3,7 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import type { PXE } from '@aztec/stdlib/interfaces/client';
5
5
  import type { WalletDB } from '../storage/wallet_db.js';
6
- export declare const AccountTypes: readonly ["schnorr", "ecdsasecp256r1ssh", "ecdsasecp256k1"];
6
+ export declare const AccountTypes: readonly ["schnorr", "ecdsasecp256r1", "ecdsasecp256r1ssh", "ecdsasecp256k1"];
7
7
  export type AccountType = (typeof AccountTypes)[number];
8
8
  export declare function createOrRetrieveAccount(pxe: PXE, address?: AztecAddress, db?: WalletDB, secretKey?: Fr, type?: AccountType, salt?: Fr, publicKey?: string | undefined): Promise<AccountManager>;
9
9
  //# sourceMappingURL=accounts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/utils/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAG3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,eAAO,MAAM,YAAY,6DAA8D,CAAC;AACxF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,YAAY,EACtB,EAAE,CAAC,EAAE,QAAQ,EACb,SAAS,CAAC,EAAE,EAAE,EACd,IAAI,GAAE,WAAuB,EAC7B,IAAI,CAAC,EAAE,EAAE,EACT,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,cAAc,CAAC,CAkDzB"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/utils/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAC;AAG3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,eAAO,MAAM,YAAY,+EAAgF,CAAC;AAC1G,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,YAAY,EACtB,EAAE,CAAC,EAAE,QAAQ,EACb,SAAS,CAAC,EAAE,EAAE,EACd,IAAI,GAAE,WAAuB,EAC7B,IAAI,CAAC,EAAE,EAAE,EACT,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,cAAc,CAAC,CAuDzB"}
@@ -4,6 +4,7 @@ import { deriveSigningKey } from '@aztec/stdlib/keys';
4
4
  import { extractECDSAPublicKeyFromBase64String } from './ecdsa.js';
5
5
  export const AccountTypes = [
6
6
  'schnorr',
7
+ 'ecdsasecp256r1',
7
8
  'ecdsasecp256r1ssh',
8
9
  'ecdsasecp256k1'
9
10
  ];
@@ -26,6 +27,12 @@ export async function createOrRetrieveAccount(pxe, address, db, secretKey, type
26
27
  account = getSchnorrAccount(pxe, secretKey, deriveSigningKey(secretKey), salt);
27
28
  break;
28
29
  }
30
+ case 'ecdsasecp256r1':
31
+ {
32
+ const { getEcdsaRAccount } = await import('@aztec/accounts/ecdsa');
33
+ account = getEcdsaRAccount(pxe, secretKey, deriveSigningKey(secretKey).toBuffer(), salt);
34
+ break;
35
+ }
29
36
  case 'ecdsasecp256r1ssh':
30
37
  {
31
38
  let publicSigningKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/cli-wallet",
3
- "version": "0.82.2",
3
+ "version": "0.82.3-nightly.20250403",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/cmds/index.js",
@@ -65,17 +65,17 @@
65
65
  ]
66
66
  },
67
67
  "dependencies": {
68
- "@aztec/accounts": "0.82.2",
69
- "@aztec/aztec.js": "0.82.2",
70
- "@aztec/cli": "0.82.2",
71
- "@aztec/entrypoints": "0.82.2",
72
- "@aztec/ethereum": "0.82.2",
73
- "@aztec/foundation": "0.82.2",
74
- "@aztec/kv-store": "0.82.2",
75
- "@aztec/noir-contracts.js": "0.82.2",
76
- "@aztec/noir-noirc_abi": "0.82.2",
77
- "@aztec/pxe": "0.82.2",
78
- "@aztec/stdlib": "0.82.2",
68
+ "@aztec/accounts": "0.82.3-nightly.20250403",
69
+ "@aztec/aztec.js": "0.82.3-nightly.20250403",
70
+ "@aztec/cli": "0.82.3-nightly.20250403",
71
+ "@aztec/entrypoints": "0.82.3-nightly.20250403",
72
+ "@aztec/ethereum": "0.82.3-nightly.20250403",
73
+ "@aztec/foundation": "0.82.3-nightly.20250403",
74
+ "@aztec/kv-store": "0.82.3-nightly.20250403",
75
+ "@aztec/noir-contracts.js": "0.82.3-nightly.20250403",
76
+ "@aztec/noir-noirc_abi": "0.82.3-nightly.20250403",
77
+ "@aztec/pxe": "0.82.3-nightly.20250403",
78
+ "@aztec/stdlib": "0.82.3-nightly.20250403",
79
79
  "@msgpack/msgpack": "^3.0.0-beta2",
80
80
  "commander": "^12.1.0",
81
81
  "inquirer": "^10.1.8",
package/src/bin/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Fr, computeSecretHash, fileURLToPath } from '@aztec/aztec.js';
1
+ import { Fr, computeSecretHash, createCompatibleClient, fileURLToPath } from '@aztec/aztec.js';
2
2
  import { LOCALHOST } from '@aztec/cli/cli-utils';
3
3
  import { type LogFn, createConsoleLogger, createLogger } from '@aztec/foundation/log';
4
4
  import { openStoreAt } from '@aztec/kv-store/lmdb-v2';
@@ -90,7 +90,7 @@ async function main() {
90
90
  .default(`http://${LOCALHOST}:8080`),
91
91
  )
92
92
  .hook('preSubcommand', async command => {
93
- const { dataDir, remotePxe, nodeUrl, prover } = command.optsWithGlobals();
93
+ const { dataDir, remotePxe, nodeUrl, prover, rpcUrl } = command.optsWithGlobals();
94
94
 
95
95
  if (!remotePxe) {
96
96
  debugLogger.info('Using local PXE service');
@@ -113,6 +113,25 @@ async function main() {
113
113
  await pxeWrapper.init(nodeUrl, join(dataDir, 'pxe'), overridePXEConfig);
114
114
  }
115
115
  await db.init(await openStoreAt(dataDir));
116
+ let protocolContractsRegistered;
117
+ try {
118
+ protocolContractsRegistered = !!(await db.retrieveAlias('contracts:classRegisterer'));
119
+ // eslint-disable-next-line no-empty
120
+ } catch {}
121
+ if (!protocolContractsRegistered) {
122
+ userLog('Registering protocol contract aliases...');
123
+ const client = pxeWrapper?.getPXE() ?? (await createCompatibleClient(rpcUrl, debugLogger));
124
+ const { protocolContractAddresses } = await client.getPXEInfo();
125
+ for (const [name, address] of Object.entries(protocolContractAddresses)) {
126
+ await db.storeAlias('contracts', name, Buffer.from(address.toString()), userLog);
127
+ await db.storeAlias(
128
+ 'artifacts',
129
+ address.toString(),
130
+ Buffer.from(`${name.slice(0, 1).toUpperCase()}${name.slice(1)}`),
131
+ userLog,
132
+ );
133
+ }
134
+ }
116
135
  });
117
136
 
118
137
  injectCommands(program, userLog, debugLogger, db, pxeWrapper);
@@ -72,7 +72,19 @@ export async function createAccount(
72
72
  ...(await feeOpts.toDeployAccountOpts(wallet)),
73
73
  };
74
74
  if (feeOpts.estimateOnly) {
75
- const gas = await account.estimateDeploymentGas(deployOpts);
75
+ /*
76
+ * This is usually handled by accountManager.deploy(), but we're accessing the lower
77
+ * level method to get the gas estimates. That means we have to replicate some of the logic here.
78
+ * In case we're deploying our own account, we need to hijack the payment method for the fee,
79
+ * wrapping it in the one that will make use of the freshly deployed account's
80
+ * entrypoint. For reference, see aztec.js/src/account_manager.ts:deploy()
81
+ */
82
+ const fee =
83
+ !deployOpts?.deployWallet && deployOpts?.fee
84
+ ? { ...deployOpts.fee, paymentMethod: await account.getSelfPaymentMethod(deployOpts.fee.paymentMethod) }
85
+ : deployOpts?.fee;
86
+ const deployMethod = await account.getDeployMethod(deployOpts.deployWallet);
87
+ const gas = await deployMethod.estimateGas({ ...deployOpts, fee, universalDeploy: true });
76
88
  if (json) {
77
89
  out.fee = {
78
90
  gasLimits: {
@@ -1,13 +1,12 @@
1
- import { type AccountWalletWithSecretKey, ContractDeployer, type DeployOptions, Fr, type PXE } from '@aztec/aztec.js';
1
+ import { type AccountWalletWithSecretKey, ContractDeployer, type DeployOptions, Fr } from '@aztec/aztec.js';
2
2
  import { encodeArgs, getContractArtifact } from '@aztec/cli/utils';
3
3
  import type { LogFn, Logger } from '@aztec/foundation/log';
4
- import { getInitializer } from '@aztec/stdlib/abi';
4
+ import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
5
5
  import { PublicKeys } from '@aztec/stdlib/keys';
6
6
 
7
7
  import { type IFeeOpts, printGasEstimates } from '../utils/options/fees.js';
8
8
 
9
9
  export async function deploy(
10
- client: PXE,
11
10
  wallet: AccountWalletWithSecretKey,
12
11
  artifactPath: string,
13
12
  json: boolean,
@@ -27,7 +26,8 @@ export async function deploy(
27
26
  ) {
28
27
  salt ??= Fr.random();
29
28
  const contractArtifact = await getContractArtifact(artifactPath, log);
30
- const constructorArtifact = getInitializer(contractArtifact, initializer);
29
+ const hasInitializer = getAllFunctionAbis(contractArtifact).some(fn => fn.isInitializer);
30
+ const constructorArtifact = hasInitializer ? getInitializer(contractArtifact, initializer) : undefined;
31
31
 
32
32
  // TODO(#12081): Add contractArtifact.noirVersion and check here (via Noir.lock)?
33
33
 
@@ -42,11 +42,24 @@ export async function deployAccount(
42
42
 
43
43
  const deployOpts: DeployAccountOptions = {
44
44
  skipInitialization: false,
45
+ skipPublicDeployment: false,
45
46
  ...(await feeOpts.toDeployAccountOpts(wallet)),
46
47
  };
47
48
 
48
49
  if (feeOpts.estimateOnly) {
49
- const gas = await account.estimateDeploymentGas(deployOpts);
50
+ /*
51
+ * This is usually handled by accountManager.deploy(), but we're accessing the lower
52
+ * level method to get the gas estimates. That means we have to replicate some of the logic here.
53
+ * In case we're deploying our own account, we need to hijack the payment method for the fee,
54
+ * wrapping it in the one that will make use of the freshly deployed account's
55
+ * entrypoint. For reference, see aztec.js/src/account_manager.ts:deploy()
56
+ */
57
+ const fee =
58
+ !deployOpts?.deployWallet && deployOpts?.fee
59
+ ? { ...deployOpts.fee, paymentMethod: await account.getSelfPaymentMethod(deployOpts.fee.paymentMethod) }
60
+ : deployOpts?.fee;
61
+ const deployMethod = await account.getDeployMethod(deployOpts.deployWallet);
62
+ const gas = await deployMethod.estimateGas({ ...deployOpts, fee, universalDeploy: true });
50
63
  if (json) {
51
64
  out.fee = {
52
65
  gasLimits: {
package/src/cmds/index.ts CHANGED
@@ -226,7 +226,6 @@ export function injectCommands(
226
226
  debugLogger.info(`Using wallet with address ${wallet.getCompleteAddress().address.toString()}`);
227
227
 
228
228
  const address = await deploy(
229
- client,
230
229
  wallet,
231
230
  artifactPath,
232
231
  json,
@@ -639,13 +638,38 @@ export function injectCommands(
639
638
  aliasedAddressParser('accounts', address, db),
640
639
  )
641
640
  .argument('[artifact]', ARTIFACT_DESCRIPTION, artifactPathParser)
641
+ .option('--init <string>', 'The contract initializer function to call', 'constructor')
642
+ .option(
643
+ '-k, --public-key <string>',
644
+ 'Optional encryption public key for this address. Set this value only if this contract is expected to receive private notes, which will be encrypted using this public key.',
645
+ parsePublicKey,
646
+ )
647
+ .option(
648
+ '-s, --salt <hex string>',
649
+ 'Optional deployment salt as a hex string for generating the deployment address.',
650
+ parseFieldFromHexString,
651
+ )
652
+ .option('--deployer <string>', 'The address of the account that deployed the contract', address =>
653
+ aliasedAddressParser('accounts', address, db),
654
+ )
642
655
  .addOption(createArgsOption(true, db))
643
656
  .addOption(pxeOption)
644
657
  .addOption(createAccountOption('Alias or address of the account to simulate from', !db, db))
645
658
  .addOption(createAliasOption('Alias for the contact. Used for easy reference in subsequent commands.', !db))
646
659
  .action(async (address, artifactPathPromise, _options, command) => {
647
660
  const { registerContract } = await import('./register_contract.js');
648
- const { from: parsedFromAddress, rpcUrl, nodeUrl, secretKey, alias } = command.optsWithGlobals();
661
+ const {
662
+ from: parsedFromAddress,
663
+ rpcUrl,
664
+ nodeUrl,
665
+ secretKey,
666
+ alias,
667
+ init,
668
+ publicKey,
669
+ salt,
670
+ deployer,
671
+ args,
672
+ } = command.optsWithGlobals();
649
673
  const client = pxeWrapper?.getPXE() ?? (await createCompatibleClient(rpcUrl, debugLogger));
650
674
  const node = pxeWrapper?.getNode() ?? createAztecNodeClient(nodeUrl);
651
675
  const account = await createOrRetrieveAccount(client, parsedFromAddress, db, secretKey);
@@ -653,7 +677,18 @@ export function injectCommands(
653
677
 
654
678
  const artifactPath = await artifactPathPromise;
655
679
 
656
- const instance = await registerContract(wallet, node, address, artifactPath, log);
680
+ const instance = await registerContract(
681
+ wallet,
682
+ node,
683
+ address,
684
+ artifactPath,
685
+ log,
686
+ init,
687
+ publicKey,
688
+ args,
689
+ salt,
690
+ deployer,
691
+ );
657
692
 
658
693
  if (db && alias) {
659
694
  await db.storeContract(instance.address, artifactPath, log, alias);
@@ -1,6 +1,14 @@
1
- import type { AccountWalletWithSecretKey, AztecAddress, AztecNode } from '@aztec/aztec.js';
1
+ import {
2
+ type AccountWalletWithSecretKey,
3
+ type AztecAddress,
4
+ type AztecNode,
5
+ type Fr,
6
+ PublicKeys,
7
+ getContractInstanceFromDeployParams,
8
+ } from '@aztec/aztec.js';
2
9
  import { getContractArtifact } from '@aztec/cli/cli-utils';
3
10
  import type { LogFn } from '@aztec/foundation/log';
11
+ import { getAllFunctionAbis, getInitializer } from '@aztec/stdlib/abi';
4
12
 
5
13
  export async function registerContract(
6
14
  wallet: AccountWalletWithSecretKey,
@@ -8,11 +16,28 @@ export async function registerContract(
8
16
  address: AztecAddress,
9
17
  artifactPath: string,
10
18
  log: LogFn,
19
+ initializer?: string,
20
+ publicKeys?: PublicKeys,
21
+ rawArgs?: any[],
22
+ salt?: Fr,
23
+ deployer?: AztecAddress | undefined,
11
24
  ) {
12
25
  const contractArtifact = await getContractArtifact(artifactPath, log);
13
- const contractInstance = await node.getContract(address);
26
+ const hasInitializer = getAllFunctionAbis(contractArtifact).some(fn => fn.isInitializer);
27
+ const constructorArtifact = hasInitializer ? getInitializer(contractArtifact, initializer) : undefined;
28
+ let contractInstance = await node.getContract(address);
14
29
  if (!contractInstance) {
15
- throw new Error(`Contract not found at address: ${address}`);
30
+ log(`Contract not found in the node at ${address}. Computing instance locally...`);
31
+ contractInstance = await getContractInstanceFromDeployParams(contractArtifact, {
32
+ constructorArtifact,
33
+ publicKeys: publicKeys ?? PublicKeys.default(),
34
+ constructorArgs: rawArgs,
35
+ salt,
36
+ deployer,
37
+ });
38
+ }
39
+ if (!contractInstance.address.equals(address)) {
40
+ throw new Error(`Contract address mismatch: expected ${address}, got ${contractInstance.address}`);
16
41
  }
17
42
  await wallet.registerContract({ instance: contractInstance, artifact: contractArtifact });
18
43
  log(`Contract registered: at ${contractInstance.address}`);
@@ -8,7 +8,7 @@ import { deriveSigningKey } from '@aztec/stdlib/keys';
8
8
  import type { WalletDB } from '../storage/wallet_db.js';
9
9
  import { extractECDSAPublicKeyFromBase64String } from './ecdsa.js';
10
10
 
11
- export const AccountTypes = ['schnorr', 'ecdsasecp256r1ssh', 'ecdsasecp256k1'] as const;
11
+ export const AccountTypes = ['schnorr', 'ecdsasecp256r1', 'ecdsasecp256r1ssh', 'ecdsasecp256k1'] as const;
12
12
  export type AccountType = (typeof AccountTypes)[number];
13
13
 
14
14
  export async function createOrRetrieveAccount(
@@ -42,6 +42,11 @@ export async function createOrRetrieveAccount(
42
42
  account = getSchnorrAccount(pxe, secretKey, deriveSigningKey(secretKey), salt);
43
43
  break;
44
44
  }
45
+ case 'ecdsasecp256r1': {
46
+ const { getEcdsaRAccount } = await import('@aztec/accounts/ecdsa');
47
+ account = getEcdsaRAccount(pxe, secretKey, deriveSigningKey(secretKey).toBuffer(), salt);
48
+ break;
49
+ }
45
50
  case 'ecdsasecp256r1ssh': {
46
51
  let publicSigningKey;
47
52
  if (db && address) {