@aztec/cli-wallet 0.0.1-commit.b655e406 → 0.0.1-commit.d1f2d6c

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.
Files changed (77) hide show
  1. package/README.md +2 -2
  2. package/dest/bin/index.d.ts +2 -1
  3. package/dest/bin/index.js +20 -10
  4. package/dest/cmds/authorize_action.d.ts +2 -2
  5. package/dest/cmds/authorize_action.d.ts.map +1 -1
  6. package/dest/cmds/authorize_action.js +5 -3
  7. package/dest/cmds/bridge_fee_juice.d.ts +2 -2
  8. package/dest/cmds/bridge_fee_juice.d.ts.map +1 -1
  9. package/dest/cmds/bridge_fee_juice.js +3 -2
  10. package/dest/cmds/check_tx.d.ts +1 -1
  11. package/dest/cmds/check_tx.js +8 -6
  12. package/dest/cmds/create_account.d.ts +4 -3
  13. package/dest/cmds/create_account.d.ts.map +1 -1
  14. package/dest/cmds/create_account.js +25 -19
  15. package/dest/cmds/create_authwit.d.ts +1 -1
  16. package/dest/cmds/create_authwit.js +1 -1
  17. package/dest/cmds/deploy.d.ts +1 -1
  18. package/dest/cmds/deploy.d.ts.map +1 -1
  19. package/dest/cmds/deploy.js +46 -23
  20. package/dest/cmds/deploy_account.d.ts +1 -1
  21. package/dest/cmds/deploy_account.d.ts.map +1 -1
  22. package/dest/cmds/deploy_account.js +24 -18
  23. package/dest/cmds/import_test_accounts.d.ts +1 -1
  24. package/dest/cmds/index.d.ts +1 -1
  25. package/dest/cmds/index.js +2 -2
  26. package/dest/cmds/profile.d.ts +1 -1
  27. package/dest/cmds/profile.js +1 -1
  28. package/dest/cmds/register_contract.d.ts +1 -1
  29. package/dest/cmds/register_sender.d.ts +1 -1
  30. package/dest/cmds/send.d.ts +2 -2
  31. package/dest/cmds/send.d.ts.map +1 -1
  32. package/dest/cmds/send.js +29 -17
  33. package/dest/cmds/simulate.d.ts +1 -1
  34. package/dest/cmds/simulate.d.ts.map +1 -1
  35. package/dest/cmds/simulate.js +4 -4
  36. package/dest/storage/wallet_db.d.ts +5 -5
  37. package/dest/storage/wallet_db.d.ts.map +1 -1
  38. package/dest/storage/wallet_db.js +1 -1
  39. package/dest/utils/authorizations.d.ts +1 -1
  40. package/dest/utils/cli_wallet_and_node_wrapper.d.ts +1 -1
  41. package/dest/utils/cli_wallet_and_node_wrapper.d.ts.map +1 -1
  42. package/dest/utils/constants.d.ts +4 -0
  43. package/dest/utils/constants.d.ts.map +1 -0
  44. package/dest/utils/constants.js +7 -0
  45. package/dest/utils/ecdsa.d.ts +1 -1
  46. package/dest/utils/options/fees.d.ts +3 -2
  47. package/dest/utils/options/fees.d.ts.map +1 -1
  48. package/dest/utils/options/fees.js +3 -3
  49. package/dest/utils/options/index.d.ts +1 -1
  50. package/dest/utils/options/options.d.ts +1 -1
  51. package/dest/utils/options/options.js +1 -1
  52. package/dest/utils/profiling.d.ts +1 -1
  53. package/dest/utils/profiling.d.ts.map +1 -1
  54. package/dest/utils/profiling.js +9 -1
  55. package/dest/utils/wallet.d.ts +9 -9
  56. package/dest/utils/wallet.d.ts.map +1 -1
  57. package/dest/utils/wallet.js +33 -22
  58. package/package.json +17 -14
  59. package/src/bin/index.ts +18 -12
  60. package/src/cmds/authorize_action.ts +2 -2
  61. package/src/cmds/bridge_fee_juice.ts +3 -2
  62. package/src/cmds/check_tx.ts +9 -11
  63. package/src/cmds/create_account.ts +26 -19
  64. package/src/cmds/create_authwit.ts +1 -1
  65. package/src/cmds/deploy.ts +41 -22
  66. package/src/cmds/deploy_account.ts +23 -17
  67. package/src/cmds/index.ts +3 -3
  68. package/src/cmds/profile.ts +1 -1
  69. package/src/cmds/send.ts +23 -11
  70. package/src/cmds/simulate.ts +4 -7
  71. package/src/storage/wallet_db.ts +2 -2
  72. package/src/utils/cli_wallet_and_node_wrapper.ts +1 -1
  73. package/src/utils/constants.ts +4 -0
  74. package/src/utils/options/fees.ts +5 -4
  75. package/src/utils/options/options.ts +1 -1
  76. package/src/utils/profiling.ts +15 -1
  77. package/src/utils/wallet.ts +40 -21
package/src/bin/index.ts CHANGED
@@ -1,7 +1,9 @@
1
+ #!/usr/bin/env node
1
2
  import { computeSecretHash } from '@aztec/aztec.js/crypto';
2
3
  import { Fr } from '@aztec/aztec.js/fields';
3
4
  import { createAztecNodeClient } from '@aztec/aztec.js/node';
4
5
  import { ProtocolContractAddress } from '@aztec/aztec.js/protocol';
6
+ import { BackendType, Barretenberg } from '@aztec/bb.js';
5
7
  import { LOCALHOST } from '@aztec/cli/cli-utils';
6
8
  import { type LogFn, createConsoleLogger, createLogger } from '@aztec/foundation/log';
7
9
  import { openStoreAt } from '@aztec/kv-store/lmdb-v2';
@@ -9,10 +11,8 @@ import type { PXEConfig } from '@aztec/pxe/config';
9
11
  import { getPackageVersion } from '@aztec/stdlib/update-checker';
10
12
 
11
13
  import { Argument, Command, Option } from 'commander';
12
- import { mkdirSync } from 'fs';
13
14
  import { homedir } from 'os';
14
- import { dirname, join, resolve } from 'path';
15
- import { fileURLToPath } from 'url';
15
+ import { join } from 'path';
16
16
 
17
17
  import { injectCommands } from '../cmds/index.js';
18
18
  import { Aliases, WalletDB } from '../storage/wallet_db.js';
@@ -95,22 +95,26 @@ async function main() {
95
95
  .default(`http://${LOCALHOST}:8080`),
96
96
  )
97
97
  .hook('preSubcommand', async command => {
98
+ // Skip initialization if user is just requesting help
99
+ if (command.args.includes('--help') || command.args.includes('-h')) {
100
+ return;
101
+ }
102
+
98
103
  const { dataDir, nodeUrl, prover } = command.optsWithGlobals();
99
104
 
100
105
  const proverEnabled = prover !== 'none';
101
106
 
102
- const bbBinaryPath =
103
- prover === 'native'
104
- ? (process.env.BB_BINARY_PATH ??
105
- resolve(dirname(fileURLToPath(import.meta.url)), '../../../../barretenberg/cpp/build/bin/bb'))
106
- : undefined;
107
- const bbWorkingDirectory = dataDir + '/bb';
108
- mkdirSync(bbWorkingDirectory, { recursive: true });
107
+ switch (prover) {
108
+ case 'native':
109
+ await Barretenberg.initSingleton({ backend: BackendType.NativeUnixSocket });
110
+ break;
111
+ case 'wasm':
112
+ await Barretenberg.initSingleton({ backend: BackendType.Wasm });
113
+ break;
114
+ }
109
115
 
110
116
  const overridePXEConfig: Partial<PXEConfig> = {
111
117
  proverEnabled,
112
- bbBinaryPath: prover === 'native' ? bbBinaryPath : undefined,
113
- bbWorkingDirectory: prover === 'native' ? bbWorkingDirectory : undefined,
114
118
  dataDirectory: join(dataDir, 'pxe'),
115
119
  };
116
120
 
@@ -142,6 +146,8 @@ async function main() {
142
146
  injectCommands(program, userLog, debugLogger, walletAndNodeWrapper, db);
143
147
  injectInternalCommands(program, userLog, db);
144
148
  await program.parseAsync(process.argv);
149
+
150
+ await Barretenberg.destroySingleton();
145
151
  }
146
152
 
147
153
  main().catch(err => {
@@ -30,7 +30,7 @@ export async function authorizeAction(
30
30
  );
31
31
  }
32
32
 
33
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
33
+ const contract = Contract.at(contractAddress, contractArtifact, wallet);
34
34
  const action = contract.methods[functionName](...functionArgs);
35
35
 
36
36
  const setAuthwitnessInteraction = await SetPublicAuthwitContractInteraction.create(
@@ -39,7 +39,7 @@ export async function authorizeAction(
39
39
  { caller, action },
40
40
  true,
41
41
  );
42
- const witness = await setAuthwitnessInteraction.send().wait({ timeout: DEFAULT_TX_TIMEOUT_S });
42
+ const witness = await setAuthwitnessInteraction.send({ wait: { timeout: DEFAULT_TX_TIMEOUT_S } });
43
43
 
44
44
  log(`Authorized action ${functionName} on contract ${contractAddress} for caller ${caller}`);
45
45
 
@@ -2,8 +2,9 @@ import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
2
2
  import type { AztecNode } from '@aztec/aztec.js/node';
3
3
  import { ProtocolContractAddress } from '@aztec/aztec.js/protocol';
4
4
  import { prettyPrintJSON } from '@aztec/cli/utils';
5
- import { createEthereumChain, createExtendedL1Client } from '@aztec/ethereum';
6
- import { Fr } from '@aztec/foundation/fields';
5
+ import { createEthereumChain } from '@aztec/ethereum/chain';
6
+ import { createExtendedL1Client } from '@aztec/ethereum/client';
7
+ import { Fr } from '@aztec/foundation/curves/bn254';
7
8
  import type { LogFn, Logger } from '@aztec/foundation/log';
8
9
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
9
10
  import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
@@ -6,7 +6,7 @@ import { ProtocolContractAddress } from '@aztec/aztec.js/protocol';
6
6
  import type { TxHash } from '@aztec/aztec.js/tx';
7
7
  import type { LogFn } from '@aztec/foundation/log';
8
8
  import { siloNullifier } from '@aztec/stdlib/hash';
9
- import { UniqueNote } from '@aztec/stdlib/note';
9
+ import { NoteDao } from '@aztec/stdlib/note';
10
10
 
11
11
  import type { CLIWallet } from '../utils/wallet.js';
12
12
 
@@ -32,7 +32,10 @@ async function inspectTx(wallet: CLIWallet, aztecNode: AztecNode, txHash: TxHash
32
32
  const [receipt, effectsInBlock] = await Promise.all([aztecNode.getTxReceipt(txHash), aztecNode.getTxEffect(txHash)]);
33
33
  // Base tx data
34
34
  log(`Tx ${txHash.toString()}`);
35
- log(` Status: ${receipt.status} ${effectsInBlock ? `(${effectsInBlock.data.revertCode.getDescription()})` : ''}`);
35
+ log(` Status: ${receipt.status}`);
36
+ if (receipt.executionResult) {
37
+ log(` Execution result: ${receipt.executionResult}`);
38
+ }
36
39
  if (receipt.error) {
37
40
  log(` Error: ${receipt.error}`);
38
41
  }
@@ -121,11 +124,10 @@ async function inspectTx(wallet: CLIWallet, aztecNode: AztecNode, txHash: TxHash
121
124
  }
122
125
  }
123
126
 
124
- function inspectNote(note: UniqueNote, artifactMap: ArtifactMap, log: LogFn, text = 'Note') {
127
+ function inspectNote(note: NoteDao, artifactMap: ArtifactMap, log: LogFn, text = 'Note') {
125
128
  const artifact = artifactMap[note.contractAddress.toString()];
126
129
  const contract = artifact?.name ?? note.contractAddress.toString();
127
130
  log(` ${text} at ${contract}`);
128
- log(` Recipient: ${toFriendlyAddress(note.recipient, artifactMap)}`);
129
131
  for (const field of note.note.items) {
130
132
  log(` ${field.toString()}`);
131
133
  }
@@ -165,15 +167,11 @@ async function getKnownArtifacts(wallet: CLIWallet): Promise<ArtifactMap> {
165
167
  const knownContractAddresses = await wallet.getContracts();
166
168
  const knownContracts = (
167
169
  await Promise.all(knownContractAddresses.map(contractAddress => wallet.getContractMetadata(contractAddress)))
168
- ).map(contractMetadata => contractMetadata.contractInstance);
170
+ ).map(contractMetadata => contractMetadata.instance);
169
171
  const classIds = [...new Set(knownContracts.map(contract => contract?.currentContractClassId))];
170
172
  const knownArtifacts = (
171
- await Promise.all(classIds.map(classId => (classId ? wallet.getContractClassMetadata(classId) : undefined)))
172
- ).map(contractClassMetadata =>
173
- contractClassMetadata
174
- ? { ...contractClassMetadata.artifact, classId: contractClassMetadata.contractClass?.id }
175
- : undefined,
176
- );
173
+ await Promise.all(classIds.map(classId => (classId ? wallet.getContractArtifact(classId) : undefined)))
174
+ ).map((artifact, index) => (artifact ? { ...artifact, classId: classIds[index] } : undefined));
177
175
  const map: Record<string, ContractArtifactWithClassId> = {};
178
176
  for (const instance of knownContracts) {
179
177
  if (instance) {
@@ -1,14 +1,17 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
2
3
  import type { AztecNode } from '@aztec/aztec.js/node';
3
4
  import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
4
5
  import { prettyPrintJSON } from '@aztec/cli/cli-utils';
5
- import { Fr } from '@aztec/foundation/fields';
6
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
7
  import type { LogFn, Logger } from '@aztec/foundation/log';
8
+ import type { TxHash, TxReceipt } from '@aztec/stdlib/tx';
7
9
 
8
10
  import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
11
+ import type { AccountType } from '../utils/constants.js';
9
12
  import { CLIFeeArgs } from '../utils/options/fees.js';
10
13
  import { printProfileResult } from '../utils/profiling.js';
11
- import { type AccountType, CLIWallet } from '../utils/wallet.js';
14
+ import { CLIWallet } from '../utils/wallet.js';
12
15
 
13
16
  export async function createAccount(
14
17
  wallet: CLIWallet,
@@ -63,8 +66,8 @@ export async function createAccount(
63
66
  log(`Init hash: ${account.getInstance().initializationHash.toString()}`);
64
67
  }
65
68
 
66
- let tx;
67
- let txReceipt;
69
+ let txHash: TxHash | undefined;
70
+ let txReceipt: TxReceipt | undefined;
68
71
  if (!registerOnly) {
69
72
  const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
70
73
 
@@ -99,7 +102,14 @@ export async function createAccount(
99
102
  };
100
103
  }
101
104
  } else {
102
- tx = deployMethod.send({
105
+ if (verbose) {
106
+ printProfileResult(stats, log);
107
+ }
108
+
109
+ if (!json) {
110
+ log(`\nWaiting for account contract deployment...`);
111
+ }
112
+ const result = await deployMethod.send({
103
113
  ...deployAccountOpts,
104
114
  fee: deployAccountOpts.fee
105
115
  ? {
@@ -107,32 +117,29 @@ export async function createAccount(
107
117
  gasSettings: estimatedGas,
108
118
  }
109
119
  : undefined,
120
+ wait: wait ? { timeout: DEFAULT_TX_TIMEOUT_S, returnReceipt: true } : NO_WAIT,
110
121
  });
111
- if (verbose) {
112
- printProfileResult(stats, log);
113
- }
114
-
115
- const txHash = await tx.getTxHash();
116
- debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
117
- out.txHash = txHash;
118
- if (wait) {
119
- if (!json) {
120
- log(`\nWaiting for account contract deployment...`);
121
- }
122
- txReceipt = await tx.wait({ timeout: DEFAULT_TX_TIMEOUT_S });
122
+ const isReceipt = (data: TxReceipt | TxHash): data is TxReceipt => 'txHash' in data;
123
+ if (isReceipt(result)) {
124
+ txReceipt = result;
125
+ txHash = result.txHash;
123
126
  out.txReceipt = {
124
127
  status: txReceipt.status,
125
128
  transactionFee: txReceipt.transactionFee,
126
129
  };
130
+ } else {
131
+ txHash = result;
127
132
  }
133
+ debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
134
+ out.txHash = txHash;
128
135
  }
129
136
  }
130
137
 
131
138
  if (json) {
132
139
  log(prettyPrintJSON(out));
133
140
  } else {
134
- if (tx) {
135
- log(`Deploy tx hash: ${(await tx.getTxHash()).toString()}`);
141
+ if (txHash) {
142
+ log(`Deploy tx hash: ${txHash.toString()}`);
136
143
  }
137
144
  if (txReceipt) {
138
145
  log(`Deploy tx fee: ${txReceipt.transactionFee}`);
@@ -28,7 +28,7 @@ export async function createAuthwit(
28
28
  );
29
29
  }
30
30
 
31
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
31
+ const contract = Contract.at(contractAddress, contractArtifact, wallet);
32
32
  const call = await contract.methods[functionName](...functionArgs).getFunctionCall();
33
33
 
34
34
  const witness = await wallet.createAuthWit(from, { caller, call });
@@ -1,5 +1,6 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import type { DeployOptions } from '@aztec/aztec.js/contracts';
3
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
3
4
  import { ContractDeployer } from '@aztec/aztec.js/deployment';
4
5
  import { Fr } from '@aztec/aztec.js/fields';
5
6
  import type { AztecNode } from '@aztec/aztec.js/node';
@@ -89,37 +90,55 @@ export async function deploy(
89
90
  };
90
91
  }
91
92
  } else {
92
- const tx = deploy.send(deployOpts);
93
93
  if (verbose) {
94
94
  printProfileResult(stats, log);
95
95
  }
96
96
 
97
- const txHash = await tx.getTxHash();
98
- debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
99
- out.hash = txHash;
100
97
  const { address, partialAddress } = deploy;
101
98
  const instance = await deploy.getInstance();
102
- if (!json) {
103
- log(`Contract deployed at ${address?.toString()}`);
104
- log(`Contract partial address ${(await partialAddress)?.toString()}`);
105
- log(`Contract init hash ${instance.initializationHash.toString()}`);
106
- log(`Deployment tx hash: ${txHash.toString()}`);
107
- log(`Deployment salt: ${salt.toString()}`);
108
- log(`Deployer: ${instance.deployer.toString()}`);
109
- } else {
110
- out.contract = {
111
- address: address?.toString(),
112
- partialAddress: (await partialAddress)?.toString(),
113
- initializationHash: instance.initializationHash.toString(),
114
- salt: salt.toString(),
115
- };
116
- }
99
+
117
100
  if (wait) {
118
- const deployed = await tx.wait({ timeout });
101
+ const receipt = await deploy.send({ ...deployOpts, wait: { timeout, returnReceipt: true } });
102
+ const txHash = receipt.txHash;
103
+ debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
104
+ out.hash = txHash;
105
+
106
+ if (!json) {
107
+ log(`Contract deployed at ${address?.toString()}`);
108
+ log(`Contract partial address ${(await partialAddress)?.toString()}`);
109
+ log(`Contract init hash ${instance.initializationHash.toString()}`);
110
+ log(`Deployment tx hash: ${txHash.toString()}`);
111
+ log(`Deployment salt: ${salt.toString()}`);
112
+ log(`Deployer: ${instance.deployer.toString()}`);
113
+ log(`Transaction fee: ${receipt.transactionFee?.toString()}`);
114
+ } else {
115
+ out.contract = {
116
+ address: address?.toString(),
117
+ partialAddress: (await partialAddress)?.toString(),
118
+ initializationHash: instance.initializationHash.toString(),
119
+ salt: salt.toString(),
120
+ transactionFee: receipt.transactionFee?.toString(),
121
+ };
122
+ }
123
+ } else {
124
+ const txHash = await deploy.send({ ...deployOpts, wait: NO_WAIT });
125
+ debugLogger.debug(`Deploy tx sent with hash ${txHash.toString()}`);
126
+ out.hash = txHash;
127
+
119
128
  if (!json) {
120
- log(`Transaction fee: ${deployed.transactionFee?.toString()}`);
129
+ log(`Contract deployed at ${address?.toString()}`);
130
+ log(`Contract partial address ${(await partialAddress)?.toString()}`);
131
+ log(`Contract init hash ${instance.initializationHash.toString()}`);
132
+ log(`Deployment tx hash: ${txHash.toString()}`);
133
+ log(`Deployment salt: ${salt.toString()}`);
134
+ log(`Deployer: ${instance.deployer.toString()}`);
121
135
  } else {
122
- out.contract.transactionFee = deployed.transactionFee?.toString();
136
+ out.contract = {
137
+ address: address?.toString(),
138
+ partialAddress: (await partialAddress)?.toString(),
139
+ initializationHash: instance.initializationHash.toString(),
140
+ salt: salt.toString(),
141
+ };
123
142
  }
124
143
  }
125
144
  }
@@ -1,8 +1,10 @@
1
1
  import { AztecAddress } from '@aztec/aztec.js/addresses';
2
+ import { NO_WAIT } from '@aztec/aztec.js/contracts';
2
3
  import type { AztecNode } from '@aztec/aztec.js/node';
3
4
  import type { DeployAccountOptions } from '@aztec/aztec.js/wallet';
4
5
  import { prettyPrintJSON } from '@aztec/cli/cli-utils';
5
6
  import type { LogFn, Logger } from '@aztec/foundation/log';
7
+ import type { TxHash, TxReceipt } from '@aztec/stdlib/tx';
6
8
 
7
9
  import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
8
10
  import type { CLIFeeArgs } from '../utils/options/fees.js';
@@ -45,8 +47,8 @@ export async function deployAccount(
45
47
  log(`Init hash: ${initializationHash.toString()}`);
46
48
  }
47
49
 
48
- let tx;
49
- let txReceipt;
50
+ let txHash: TxHash | undefined;
51
+ let txReceipt: TxReceipt | undefined;
50
52
  const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(aztecNode, wallet, address);
51
53
 
52
54
  const delegatedDeployment = deployer && !account.address.equals(deployer);
@@ -80,7 +82,14 @@ export async function deployAccount(
80
82
  };
81
83
  }
82
84
  } else {
83
- tx = deployMethod.send({
85
+ if (verbose) {
86
+ printProfileResult(stats, log);
87
+ }
88
+
89
+ if (!json) {
90
+ log(`\nWaiting for account contract deployment...`);
91
+ }
92
+ const result = await deployMethod.send({
84
93
  ...deployAccountOpts,
85
94
  fee: deployAccountOpts.fee
86
95
  ? {
@@ -88,31 +97,28 @@ export async function deployAccount(
88
97
  gasSettings: estimatedGas,
89
98
  }
90
99
  : undefined,
100
+ wait: wait ? { timeout: DEFAULT_TX_TIMEOUT_S, returnReceipt: true } : NO_WAIT,
91
101
  });
92
- if (verbose) {
93
- printProfileResult(stats, log);
94
- }
95
-
96
- const txHash = await tx.getTxHash();
97
- debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
98
- out.txHash = txHash;
99
- if (wait) {
100
- if (!json) {
101
- log(`\nWaiting for account contract deployment...`);
102
- }
103
- txReceipt = await tx.wait({ timeout: DEFAULT_TX_TIMEOUT_S });
102
+ const isReceipt = (data: TxReceipt | TxHash): data is TxReceipt => 'txHash' in data;
103
+ if (isReceipt(result)) {
104
+ txReceipt = result;
105
+ txHash = result.txHash;
104
106
  out.txReceipt = {
105
107
  status: txReceipt.status,
106
108
  transactionFee: txReceipt.transactionFee,
107
109
  };
110
+ } else {
111
+ txHash = result;
108
112
  }
113
+ debugLogger.debug(`Account contract tx sent with hash ${txHash.toString()}`);
114
+ out.txHash = txHash;
109
115
  }
110
116
 
111
117
  if (json) {
112
118
  log(prettyPrintJSON(out));
113
119
  } else {
114
- if (tx) {
115
- log(`Deploy tx hash: ${(await tx.getTxHash()).toString()}`);
120
+ if (txHash) {
121
+ log(`Deploy tx hash: ${txHash.toString()}`);
116
122
  }
117
123
  if (txReceipt) {
118
124
  log(`Deploy tx fee: ${txReceipt.transactionFee}`);
package/src/cmds/index.ts CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  parseFieldFromHexString,
11
11
  parsePublicKey,
12
12
  } from '@aztec/cli/utils';
13
- import { randomBytes } from '@aztec/foundation/crypto';
13
+ import { randomBytes } from '@aztec/foundation/crypto/random';
14
14
  import type { LogFn, Logger } from '@aztec/foundation/log';
15
15
 
16
16
  import { type Command, Option } from 'commander';
@@ -18,6 +18,7 @@ import inquirer from 'inquirer';
18
18
 
19
19
  import type { WalletDB } from '../storage/wallet_db.js';
20
20
  import type { CliWalletAndNodeWrapper } from '../utils/cli_wallet_and_node_wrapper.js';
21
+ import type { AccountType } from '../utils/constants.js';
21
22
  import {
22
23
  ARTIFACT_DESCRIPTION,
23
24
  CLIFeeArgs,
@@ -38,7 +39,6 @@ import {
38
39
  createVerboseOption,
39
40
  integerArgParser,
40
41
  } from '../utils/options/index.js';
41
- import type { AccountType } from '../utils/wallet.js';
42
42
 
43
43
  // TODO: This function is only used in 1 place so we could just inline this
44
44
  export function injectCommands(
@@ -346,7 +346,7 @@ export function injectCommands(
346
346
  log,
347
347
  );
348
348
  if (db && sentTx) {
349
- const txAlias = alias ? alias : `${functionName}-${randomBytes(16).toString()}`;
349
+ const txAlias = alias ? alias : `${functionName}-${randomBytes(16).toString('hex')}`;
350
350
  await db.storeTx(sentTx, log, txAlias);
351
351
  }
352
352
  });
@@ -28,7 +28,7 @@ export async function profile(
28
28
  ) {
29
29
  const { functionArgs, contractArtifact } = await prepTx(contractArtifactPath, functionName, functionArgsIn, log);
30
30
 
31
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
31
+ const contract = Contract.at(contractAddress, contractArtifact, wallet);
32
32
  const call = contract.methods[functionName](...functionArgs);
33
33
 
34
34
  const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, from);
package/src/cmds/send.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { AztecAddress } from '@aztec/aztec.js/addresses';
2
2
  import { AuthWitness } from '@aztec/aztec.js/authorization';
3
- import { Contract, type SendInteractionOptions } from '@aztec/aztec.js/contracts';
3
+ import { Contract, NO_WAIT, type SendInteractionOptions } from '@aztec/aztec.js/contracts';
4
4
  import type { AztecNode } from '@aztec/aztec.js/node';
5
5
  import { prepTx } from '@aztec/cli/utils';
6
6
  import type { LogFn } from '@aztec/foundation/log';
@@ -27,7 +27,7 @@ export async function send(
27
27
  ) {
28
28
  const { functionArgs, contractArtifact } = await prepTx(contractArtifactPath, functionName, functionArgsIn, log);
29
29
 
30
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
30
+ const contract = Contract.at(contractAddress, contractArtifact, wallet);
31
31
  const call = contract.methods[functionName](...functionArgs);
32
32
 
33
33
  const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, from);
@@ -46,31 +46,43 @@ export async function send(
46
46
  return;
47
47
  }
48
48
 
49
- const tx = call.send({ ...sendOptions, fee: { ...sendOptions.fee, gasSettings: estimatedGas } });
50
49
  if (verbose) {
51
50
  printProfileResult(stats!, log);
52
51
  }
53
52
 
54
- const txHash = await tx.getTxHash();
55
- log(`\nTransaction hash: ${txHash.toString()}`);
56
53
  if (wait) {
57
54
  try {
58
- await tx.wait({ timeout: DEFAULT_TX_TIMEOUT_S });
55
+ const receipt = await call.send({
56
+ ...sendOptions,
57
+ fee: { ...sendOptions.fee, gasSettings: estimatedGas },
58
+ wait: { timeout: DEFAULT_TX_TIMEOUT_S },
59
+ });
59
60
 
61
+ const txHash = receipt.txHash;
62
+ log(`\nTransaction hash: ${txHash.toString()}`);
60
63
  log('Transaction has been mined');
61
-
62
- const receipt = await tx.getReceipt();
63
64
  log(` Tx fee: ${receipt.transactionFee}`);
64
65
  log(` Status: ${receipt.status}`);
65
66
  log(` Block number: ${receipt.blockNumber}`);
66
67
  log(` Block hash: ${receipt.blockHash?.toString()}`);
68
+
69
+ return {
70
+ txHash,
71
+ };
67
72
  } catch (err: any) {
68
73
  log(`Transaction failed\n ${err.message}`);
74
+ throw err;
69
75
  }
70
76
  } else {
77
+ const txHash = await call.send({
78
+ ...sendOptions,
79
+ fee: { ...sendOptions.fee, gasSettings: estimatedGas },
80
+ wait: NO_WAIT,
81
+ });
82
+ log(`\nTransaction hash: ${txHash.toString()}`);
71
83
  log('Transaction pending. Check status with check-tx');
84
+ return {
85
+ txHash,
86
+ };
72
87
  }
73
- return {
74
- txHash,
75
- };
76
88
  }
@@ -27,7 +27,7 @@ export async function simulate(
27
27
  ) {
28
28
  const { functionArgs, contractArtifact } = await prepTx(contractArtifactPath, functionName, functionArgsIn, log);
29
29
 
30
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
30
+ const contract = Contract.at(contractAddress, contractArtifact, wallet);
31
31
  const call = contract.methods[functionName](...functionArgs);
32
32
  const { paymentMethod, gasSettings } = await feeOpts.toUserFeeOptions(node, wallet, from);
33
33
  const simulationResult = await call.simulate({
@@ -41,14 +41,11 @@ export async function simulate(
41
41
  simulationResult.offchainEffects!,
42
42
  async (address: AztecAddress) => {
43
43
  const metadata = await wallet.getContractMetadata(address);
44
- if (!metadata.contractInstance) {
44
+ if (!metadata.instance) {
45
45
  return undefined;
46
46
  }
47
- const classMetadata = await wallet.getContractClassMetadata(
48
- metadata.contractInstance.currentContractClassId,
49
- true,
50
- );
51
- return classMetadata.artifact;
47
+ const artifact = await wallet.getContractArtifact(metadata.instance.currentContractClassId);
48
+ return artifact;
52
49
  },
53
50
  log,
54
51
  );
@@ -1,12 +1,12 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { LogFn } from '@aztec/foundation/log';
3
3
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
4
4
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
5
5
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
6
6
  import type { TxHash } from '@aztec/stdlib/tx';
7
7
 
8
+ import type { AccountType } from '../utils/constants.js';
8
9
  import { extractECDSAPublicKeyFromBase64String } from '../utils/ecdsa.js';
9
- import type { AccountType } from '../utils/wallet.js';
10
10
 
11
11
  export const Aliases = ['accounts', 'contracts', 'artifacts', 'secrets', 'transactions', 'authwits'] as const;
12
12
  export type AliasType = (typeof Aliases)[number];
@@ -21,7 +21,7 @@ export class CliWalletAndNodeWrapper {
21
21
  return this._wallet;
22
22
  }
23
23
 
24
- get node() {
24
+ get node(): AztecNode {
25
25
  if (!this._node) {
26
26
  throw new Error('Node not initialized while it should have been initialized in preSubcommand');
27
27
  }
@@ -0,0 +1,4 @@
1
+ export const MIN_FEE_PADDING = 0.5;
2
+
3
+ export const AccountTypes = ['schnorr', 'ecdsasecp256r1', 'ecdsasecp256r1ssh', 'ecdsasecp256k1'] as const;
4
+ export type AccountType = (typeof AccountTypes)[number];
@@ -1,16 +1,17 @@
1
1
  import type { FeePaymentMethod } from '@aztec/aztec.js/fee';
2
2
  import type { AztecNode } from '@aztec/aztec.js/node';
3
- import type { FeeOptions, Wallet } from '@aztec/aztec.js/wallet';
4
- import { Fr } from '@aztec/foundation/fields';
3
+ import type { Wallet } from '@aztec/aztec.js/wallet';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import type { LogFn } from '@aztec/foundation/log';
6
6
  import type { FieldsOf } from '@aztec/foundation/types';
7
7
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
8
8
  import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas';
9
+ import type { FeeOptions } from '@aztec/wallet-sdk/base-wallet';
9
10
 
10
11
  import { Option } from 'commander';
11
12
 
12
13
  import type { WalletDB } from '../../storage/wallet_db.js';
13
- import { BASE_FEE_PADDING } from '../wallet.js';
14
+ import { MIN_FEE_PADDING } from '../constants.js';
14
15
  import { aliasedAddressParser } from './options.js';
15
16
 
16
17
  export type RawCliFeeArgs = {
@@ -249,7 +250,7 @@ export class CLIFeeArgs {
249
250
  ) {}
250
251
 
251
252
  async toUserFeeOptions(node: AztecNode, wallet: Wallet, from: AztecAddress): Promise<ParsedFeeOptions> {
252
- const maxFeesPerGas = (await node.getCurrentBaseFees()).mul(1 + BASE_FEE_PADDING);
253
+ const maxFeesPerGas = (await node.getCurrentMinFees()).mul(1 + MIN_FEE_PADDING);
253
254
  const gasSettings = GasSettings.default({ ...this.gasSettings, maxFeesPerGas });
254
255
  const paymentMethod = await this.paymentMethod(wallet, from, gasSettings);
255
256
  return {
@@ -7,7 +7,7 @@ import { Option } from 'commander';
7
7
  import { readdir, stat } from 'fs/promises';
8
8
 
9
9
  import type { AliasType, WalletDB } from '../../storage/wallet_db.js';
10
- import { AccountTypes } from '../wallet.js';
10
+ import { AccountTypes } from '../constants.js';
11
11
 
12
12
  const TARGET_DIR = 'target';
13
13
 
@@ -95,7 +95,7 @@ export function printProfileResult(
95
95
 
96
96
  if (stats.nodeRPCCalls) {
97
97
  log(format('\nRPC calls:\n'));
98
- for (const [method, { times }] of Object.entries(stats.nodeRPCCalls)) {
98
+ for (const [method, { times }] of Object.entries(stats.nodeRPCCalls.perMethod)) {
99
99
  const calls = times.length;
100
100
  const total = times.reduce((acc, time) => acc + time, 0);
101
101
  const avg = total / calls;
@@ -112,6 +112,20 @@ export function printProfileResult(
112
112
  ),
113
113
  );
114
114
  }
115
+
116
+ const { roundTrips } = stats.nodeRPCCalls;
117
+ log(format('\nRound trips (actual blocking waits):\n'));
118
+ log(format('Round trips:'.padEnd(25), `${roundTrips.roundTrips}`.padStart(COLUMN_MAX_WIDTH)));
119
+ log(
120
+ format(
121
+ 'Total blocking time:'.padEnd(25),
122
+ `${roundTrips.totalBlockingTime.toFixed(2)}ms`.padStart(COLUMN_MAX_WIDTH),
123
+ ),
124
+ );
125
+ if (roundTrips.roundTrips > 0) {
126
+ const avgRoundTrip = roundTrips.totalBlockingTime / roundTrips.roundTrips;
127
+ log(format('Avg round trip:'.padEnd(25), `${avgRoundTrip.toFixed(2)}ms`.padStart(COLUMN_MAX_WIDTH)));
128
+ }
115
129
  }
116
130
 
117
131
  log(format('\nSync time:'.padEnd(25), `${timings.sync?.toFixed(2)}ms`.padStart(16)));