@aztec/cli 0.16.1 → 0.16.3

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 (114) hide show
  1. package/dest/bin/index.js +4 -3
  2. package/dest/cmds/add_contract.d.ts +7 -0
  3. package/dest/cmds/add_contract.d.ts.map +1 -0
  4. package/dest/cmds/add_contract.js +15 -0
  5. package/dest/cmds/add_note.d.ts +8 -0
  6. package/dest/cmds/add_note.d.ts.map +1 -0
  7. package/dest/cmds/add_note.js +13 -0
  8. package/dest/cmds/block_number.d.ts +6 -0
  9. package/dest/cmds/block_number.d.ts.map +1 -0
  10. package/dest/cmds/block_number.js +10 -0
  11. package/dest/cmds/call.d.ts +7 -0
  12. package/dest/cmds/call.d.ts.map +1 -0
  13. package/dest/cmds/call.js +18 -0
  14. package/dest/cmds/check_deploy.d.ts +7 -0
  15. package/dest/cmds/check_deploy.d.ts.map +1 -0
  16. package/dest/cmds/check_deploy.js +16 -0
  17. package/dest/cmds/compute_selector.d.ts +6 -0
  18. package/dest/cmds/compute_selector.d.ts.map +1 -0
  19. package/dest/cmds/compute_selector.js +9 -0
  20. package/dest/cmds/create_account.d.ts +7 -0
  21. package/dest/cmds/create_account.d.ts.map +1 -0
  22. package/dest/cmds/create_account.js +30 -0
  23. package/dest/cmds/deploy.d.ts +7 -0
  24. package/dest/cmds/deploy.d.ts.map +1 -0
  25. package/dest/cmds/deploy.js +58 -0
  26. package/dest/cmds/deploy_l1_contracts.d.ts +6 -0
  27. package/dest/cmds/deploy_l1_contracts.d.ts.map +1 -0
  28. package/dest/cmds/deploy_l1_contracts.js +15 -0
  29. package/dest/cmds/example_contracts.d.ts +6 -0
  30. package/dest/cmds/example_contracts.d.ts.map +1 -0
  31. package/dest/cmds/example_contracts.js +10 -0
  32. package/dest/cmds/generate_p2p_private_key.d.ts +6 -0
  33. package/dest/cmds/generate_p2p_private_key.d.ts.map +1 -0
  34. package/dest/cmds/generate_p2p_private_key.js +11 -0
  35. package/dest/cmds/generate_private_key.d.ts +6 -0
  36. package/dest/cmds/generate_private_key.d.ts.map +1 -0
  37. package/dest/cmds/generate_private_key.js +22 -0
  38. package/dest/cmds/get_account.d.ts +7 -0
  39. package/dest/cmds/get_account.d.ts.map +1 -0
  40. package/dest/cmds/get_account.js +15 -0
  41. package/dest/cmds/get_accounts.d.ts +6 -0
  42. package/dest/cmds/get_accounts.d.ts.map +1 -0
  43. package/dest/cmds/get_accounts.js +18 -0
  44. package/dest/cmds/get_contract_data.d.ts +7 -0
  45. package/dest/cmds/get_contract_data.d.ts.map +1 -0
  46. package/dest/cmds/get_contract_data.js +28 -0
  47. package/dest/cmds/get_logs.d.ts +7 -0
  48. package/dest/cmds/get_logs.d.ts.map +1 -0
  49. package/dest/cmds/get_logs.js +54 -0
  50. package/dest/cmds/get_node_info.d.ts +6 -0
  51. package/dest/cmds/get_node_info.d.ts.map +1 -0
  52. package/dest/cmds/get_node_info.js +15 -0
  53. package/dest/cmds/get_recipient.d.ts +7 -0
  54. package/dest/cmds/get_recipient.d.ts.map +1 -0
  55. package/dest/cmds/get_recipient.js +15 -0
  56. package/dest/cmds/get_recipients.d.ts +6 -0
  57. package/dest/cmds/get_recipients.d.ts.map +1 -0
  58. package/dest/cmds/get_recipients.js +18 -0
  59. package/dest/cmds/get_tx_receipt.d.ts +7 -0
  60. package/dest/cmds/get_tx_receipt.d.ts.map +1 -0
  61. package/dest/cmds/get_tx_receipt.js +16 -0
  62. package/dest/cmds/inspect_contract.d.ts +6 -0
  63. package/dest/cmds/inspect_contract.d.ts.map +1 -0
  64. package/dest/cmds/inspect_contract.js +19 -0
  65. package/dest/cmds/parse_parameter_struct.d.ts +6 -0
  66. package/dest/cmds/parse_parameter_struct.d.ts.map +1 -0
  67. package/dest/cmds/parse_parameter_struct.js +20 -0
  68. package/dest/cmds/register_account.d.ts +7 -0
  69. package/dest/cmds/register_account.d.ts.map +1 -0
  70. package/dest/cmds/register_account.js +13 -0
  71. package/dest/cmds/register_recipient.d.ts +7 -0
  72. package/dest/cmds/register_recipient.d.ts.map +1 -0
  73. package/dest/cmds/register_recipient.js +11 -0
  74. package/dest/cmds/send.d.ts +7 -0
  75. package/dest/cmds/send.d.ts.map +1 -0
  76. package/dest/cmds/send.js +26 -0
  77. package/dest/cmds/unbox.d.ts +6 -0
  78. package/dest/cmds/unbox.d.ts.map +1 -0
  79. package/dest/cmds/unbox.js +9 -0
  80. package/dest/index.d.ts.map +1 -1
  81. package/dest/index.js +65 -312
  82. package/dest/utils.d.ts +9 -5
  83. package/dest/utils.d.ts.map +1 -1
  84. package/dest/utils.js +14 -10
  85. package/package.json +8 -8
  86. package/src/bin/index.ts +4 -2
  87. package/src/cmds/add_contract.ts +27 -0
  88. package/src/cmds/add_note.ts +24 -0
  89. package/src/cmds/block_number.ts +12 -0
  90. package/src/cmds/call.ts +35 -0
  91. package/src/cmds/check_deploy.ts +17 -0
  92. package/src/cmds/compute_selector.ts +10 -0
  93. package/src/cmds/create_account.ts +39 -0
  94. package/src/cmds/deploy.ts +77 -0
  95. package/src/cmds/deploy_l1_contracts.ts +25 -0
  96. package/src/cmds/example_contracts.ts +12 -0
  97. package/src/cmds/generate_p2p_private_key.ts +13 -0
  98. package/src/cmds/generate_private_key.ts +23 -0
  99. package/src/cmds/get_account.ts +18 -0
  100. package/src/cmds/get_accounts.ts +19 -0
  101. package/src/cmds/get_contract_data.ts +39 -0
  102. package/src/cmds/get_logs.ts +71 -0
  103. package/src/cmds/get_node_info.ts +17 -0
  104. package/src/cmds/get_recipient.ts +18 -0
  105. package/src/cmds/get_recipients.ts +19 -0
  106. package/src/cmds/get_tx_receipt.ts +18 -0
  107. package/src/cmds/inspect_contract.ts +29 -0
  108. package/src/cmds/parse_parameter_struct.ts +30 -0
  109. package/src/cmds/register_account.ts +24 -0
  110. package/src/cmds/register_recipient.ts +21 -0
  111. package/src/cmds/send.ts +40 -0
  112. package/src/cmds/unbox.ts +11 -0
  113. package/src/index.ts +97 -358
  114. package/src/utils.ts +28 -22
package/dest/index.js CHANGED
@@ -1,23 +1,10 @@
1
- import { Contract, ContractDeployer, EthAddress, Fr, GrumpkinScalar, Note, generatePublicKey, getSchnorrAccount, isContractDeployed, } from '@aztec/aztec.js';
2
- import { FunctionSelector, decodeFunctionSignature, decodeFunctionSignatureWithParameterNames, } from '@aztec/foundation/abi';
3
- import { JsonStringify } from '@aztec/foundation/json-rpc';
4
- import { sleep } from '@aztec/foundation/sleep';
1
+ import { initAztecJs } from '@aztec/aztec.js/init';
5
2
  import { fileURLToPath } from '@aztec/foundation/url';
6
- import { compileNoir, generateNoirInterface, generateTypescriptInterface } from '@aztec/noir-compiler/cli';
7
- import { CompleteAddress, ExtendedNote } from '@aztec/types';
8
- import { createSecp256k1PeerId } from '@libp2p/peer-id-factory';
3
+ import { addNoirCompilerCommanderActions } from '@aztec/noir-compiler/cli';
9
4
  import { Command, Option } from 'commander';
10
5
  import { readFileSync } from 'fs';
11
6
  import { dirname, resolve } from 'path';
12
- import { format } from 'util';
13
- import { mnemonicToAccount } from 'viem/accounts';
14
- import { createCompatibleClient } from './client.js';
15
- import { encodeArgs, parseStructString } from './encoding.js';
16
- import { GITHUB_TAG_PREFIX } from './github.js';
17
- import { unboxContract } from './unbox.js';
18
- import { update } from './update/update.js';
19
- import { deployAztecContracts, getContractArtifact, getExampleContractArtifacts, getFunctionArtifact, getTxSender, parseAztecAddress, parseEthereumAddress, parseField, parseFields, parseOptionalAztecAddress, parseOptionalInteger, parseOptionalLogId, parseOptionalSelector, parseOptionalTxHash, parsePartialAddress, parsePrivateKey, parsePublicKey, parseSaltFromHexString, parseTxHash, prepTx, } from './utils.js';
20
- const accountCreationSalt = Fr.ZERO;
7
+ import { parseAztecAddress, parseEthereumAddress, parseField, parseOptionalAztecAddress, parseOptionalInteger, parseOptionalLogId, parseOptionalSelector, parseOptionalTxHash, parsePartialAddress, parsePrivateKey, parsePublicKey, parseSaltFromHexString, parseTxHash, } from './utils.js';
21
8
  const { ETHEREUM_HOST = 'http://localhost:8545', PRIVATE_KEY, API_KEY } = process.env;
22
9
  /**
23
10
  * Returns commander program that defines the CLI.
@@ -29,6 +16,7 @@ export function getProgram(log, debugLogger) {
29
16
  const program = new Command();
30
17
  const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json');
31
18
  const cliVersion = JSON.parse(readFileSync(packageJsonPath).toString()).version;
19
+ const logJson = (obj) => log(JSON.stringify(obj, null, 2));
32
20
  program.name('aztec-cli').description('CLI for interacting with Aztec.').version(cliVersion);
33
21
  const pxeOption = new Option('-u, --rpc-url <string>', 'URL of the PXE')
34
22
  .env('PXE_URL')
@@ -38,6 +26,7 @@ export function getProgram(log, debugLogger) {
38
26
  .env('PRIVATE_KEY')
39
27
  .argParser(parsePrivateKey)
40
28
  .makeOptionMandatory(mandatory);
29
+ program.hook('preAction', initAztecJs);
41
30
  program
42
31
  .command('deploy-l1-contracts')
43
32
  .description('Deploys all necessary Ethereum contracts for Aztec.')
@@ -46,45 +35,25 @@ export function getProgram(log, debugLogger) {
46
35
  .requiredOption('-p, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
47
36
  .option('-m, --mnemonic <string>', 'The mnemonic to use in deployment', 'test test test test test test test test test test test junk')
48
37
  .action(async (options) => {
49
- const { l1ContractAddresses } = await deployAztecContracts(options.rpcUrl, options.apiKey ?? '', options.privateKey, options.mnemonic, debugLogger);
50
- log('\n');
51
- log(`Rollup Address: ${l1ContractAddresses.rollupAddress.toString()}`);
52
- log(`Registry Address: ${l1ContractAddresses.registryAddress.toString()}`);
53
- log(`L1 -> L2 Inbox Address: ${l1ContractAddresses.inboxAddress.toString()}`);
54
- log(`L2 -> L1 Outbox address: ${l1ContractAddresses.outboxAddress.toString()}`);
55
- log(`Contract Deployment Emitter Address: ${l1ContractAddresses.contractDeploymentEmitterAddress.toString()}`);
56
- log('\n');
38
+ const { deployL1Contracts } = await import('./cmds/deploy_l1_contracts.js');
39
+ await deployL1Contracts(options.rpcUrl, options.apiKey ?? '', options.privateKey, options.mnemonic, log, debugLogger);
57
40
  });
58
41
  program
59
42
  .command('generate-private-key')
60
43
  .summary('Generates an encryption private key.')
61
44
  .description('Generates a private key which fits into the scalar field used by Grumpkin curve, can be used as an encryption private key.')
62
45
  .option('-m, --mnemonic', 'An optional mnemonic string used for the private key generation. If not provided, random private key will be generated.')
63
- .action(options => {
64
- let privKey;
65
- let publicKey;
66
- if (options.mnemonic) {
67
- const acc = mnemonicToAccount(options.mnemonic);
68
- // TODO(#2052): This reduction is not secure enough. TACKLE THIS ISSUE BEFORE MAINNET.
69
- const key = GrumpkinScalar.fromBufferReduce(Buffer.from(acc.getHdKey().privateKey));
70
- publicKey = generatePublicKey(key);
71
- }
72
- else {
73
- const key = GrumpkinScalar.random();
74
- privKey = key.toString();
75
- publicKey = generatePublicKey(key);
76
- }
77
- log(`\nPrivate Key: ${privKey}\nPublic Key: ${publicKey.toString()}\n`);
46
+ .action(async (options) => {
47
+ const { generatePrivateKey } = await import('./cmds/generate_private_key.js');
48
+ generatePrivateKey(options.mnemonic, log);
78
49
  });
79
50
  program
80
51
  .command('generate-p2p-private-key')
81
52
  .summary('Generates a LibP2P peer private key.')
82
53
  .description('Generates a private key that can be used for running a node on a LibP2P network.')
83
54
  .action(async () => {
84
- const peerId = await createSecp256k1PeerId();
85
- const exportedPeerId = Buffer.from(peerId.privateKey).toString('hex');
86
- log(`Private key: ${exportedPeerId}`);
87
- log(`Peer Id: ${peerId}`);
55
+ const { generateP2PPrivateKey } = await import('./cmds/generate_p2p_private_key.js');
56
+ await generateP2PPrivateKey(log);
88
57
  });
89
58
  program
90
59
  .command('create-account')
@@ -96,27 +65,8 @@ export function getProgram(log, debugLogger) {
96
65
  // https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
97
66
  .option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction')
98
67
  .action(async ({ rpcUrl, privateKey, wait }) => {
99
- const client = await createCompatibleClient(rpcUrl, debugLogger);
100
- const actualPrivateKey = privateKey ?? GrumpkinScalar.random();
101
- const account = getSchnorrAccount(client, actualPrivateKey, actualPrivateKey, accountCreationSalt);
102
- const { address, publicKey, partialAddress } = account.getCompleteAddress();
103
- const tx = await account.deploy();
104
- const txHash = await tx.getTxHash();
105
- debugLogger(`Account contract tx sent with hash ${txHash}`);
106
- if (wait) {
107
- log(`\nWaiting for account contract deployment...`);
108
- await tx.wait();
109
- }
110
- else {
111
- log(`\nAccount deployment transaction hash: ${txHash}\n`);
112
- }
113
- log(`\nNew account:\n`);
114
- log(`Address: ${address.toString()}`);
115
- log(`Public key: ${publicKey.toString()}`);
116
- if (!privateKey) {
117
- log(`Private key: ${actualPrivateKey.toString()}`);
118
- }
119
- log(`Partial address: ${partialAddress.toString()}`);
68
+ const { createAccount } = await import('./cmds/create_account.js');
69
+ await createAccount(rpcUrl, privateKey, wait, debugLogger, log);
120
70
  });
121
71
  program
122
72
  .command('register-account')
@@ -126,12 +76,8 @@ export function getProgram(log, debugLogger) {
126
76
  .requiredOption('-pa, --partial-address <partialAddress>', 'The partially computed address of the account contract.', parsePartialAddress)
127
77
  .addOption(pxeOption)
128
78
  .action(async ({ rpcUrl, privateKey, partialAddress }) => {
129
- const client = await createCompatibleClient(rpcUrl, debugLogger);
130
- const { address, publicKey } = await client.registerAccount(privateKey, partialAddress);
131
- log(`\nRegistered account:\n`);
132
- log(`Address: ${address.toString()}`);
133
- log(`Public key: ${publicKey.toString()}`);
134
- log(`Partial address: ${partialAddress.toString()}`);
79
+ const { registerAccount } = await import('./cmds/register_account.js');
80
+ await registerAccount(rpcUrl, privateKey, partialAddress, debugLogger, log);
135
81
  });
136
82
  program
137
83
  .command('deploy')
@@ -142,41 +88,13 @@ export function getProgram(log, debugLogger) {
142
88
  .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)
143
89
  .option('-p, --portal-address <hex string>', 'Optional L1 portal address to link the contract to.', parseEthereumAddress)
144
90
  .option('-s, --salt <hex string>', 'Optional deployment salt as a hex string for generating the deployment address.', parseSaltFromHexString)
91
+ .option('--json', 'Emit output as json')
145
92
  // `options.wait` is default true. Passing `--no-wait` will set it to false.
146
93
  // https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
147
94
  .option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction')
148
- .action(async (artifactPath, { rpcUrl, publicKey, args: rawArgs, portalAddress, salt, wait }) => {
149
- const contractArtifact = await getContractArtifact(artifactPath, log);
150
- const constructorArtifact = contractArtifact.functions.find(({ name }) => name === 'constructor');
151
- const client = await createCompatibleClient(rpcUrl, debugLogger);
152
- const nodeInfo = await client.getNodeInfo();
153
- const expectedAztecNrVersion = `${GITHUB_TAG_PREFIX}-v${nodeInfo.sandboxVersion}`;
154
- if (contractArtifact.aztecNrVersion && contractArtifact.aztecNrVersion !== expectedAztecNrVersion) {
155
- log(`\nWarning: Contract was compiled with a different version of Aztec.nr: ${contractArtifact.aztecNrVersion}. Consider updating Aztec.nr to ${expectedAztecNrVersion}\n`);
156
- }
157
- const deployer = new ContractDeployer(contractArtifact, client, publicKey);
158
- const constructor = getFunctionArtifact(contractArtifact, 'constructor');
159
- if (!constructor) {
160
- throw new Error(`Constructor not found in contract ABI`);
161
- }
162
- debugLogger(`Input arguments: ${rawArgs.map((x) => `"${x}"`).join(', ')}`);
163
- const args = encodeArgs(rawArgs, constructorArtifact.parameters);
164
- debugLogger(`Encoded arguments: ${args.join(', ')}`);
165
- const deploy = deployer.deploy(...args);
166
- await deploy.create({ contractAddressSalt: salt, portalContract: portalAddress });
167
- const tx = deploy.send({ contractAddressSalt: salt, portalContract: portalAddress });
168
- const txHash = await tx.getTxHash();
169
- debugLogger(`Deploy tx sent with hash ${txHash}`);
170
- if (wait) {
171
- const deployed = await tx.wait();
172
- log(`\nContract deployed at ${deployed.contract.completeAddress.address.toString()}\n`);
173
- log(`Contract partial address ${deployed.contract.completeAddress.partialAddress.toString()}\n`);
174
- }
175
- else {
176
- log(`\nContract Address: ${deploy.completeAddress?.address.toString() ?? 'N/A'}`);
177
- log(`Contract Partial Address: ${deploy.completeAddress?.partialAddress.toString() ?? 'N/A'}`);
178
- log(`Deployment transaction hash: ${txHash}\n`);
179
- }
95
+ .action(async (artifactPath, { json, rpcUrl, publicKey, args: rawArgs, portalAddress, salt, wait }) => {
96
+ const { deploy } = await import('./cmds/deploy.js');
97
+ await deploy(artifactPath, json, rpcUrl, publicKey, rawArgs, portalAddress, salt, wait, debugLogger, log, logJson);
180
98
  });
181
99
  program
182
100
  .command('check-deploy')
@@ -184,15 +102,8 @@ export function getProgram(log, debugLogger) {
184
102
  .requiredOption('-ca, --contract-address <address>', 'An Aztec address to check if contract has been deployed to.', parseAztecAddress)
185
103
  .addOption(pxeOption)
186
104
  .action(async (options) => {
187
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
188
- const address = options.contractAddress;
189
- const isDeployed = await isContractDeployed(client, address);
190
- if (isDeployed) {
191
- log(`\nContract found at ${address.toString()}\n`);
192
- }
193
- else {
194
- log(`\nNo contract found at ${address.toString()}\n`);
195
- }
105
+ const { checkDeploy } = await import('./cmds/check_deploy.js');
106
+ await checkDeploy(options.rpcUrl, options.contractAddress, debugLogger, log);
196
107
  });
197
108
  program
198
109
  .command('add-contract')
@@ -204,13 +115,8 @@ export function getProgram(log, debugLogger) {
204
115
  .option('--portal-address <address>', 'Optional address to a portal contract on L1', parseEthereumAddress)
205
116
  .addOption(pxeOption)
206
117
  .action(async (options) => {
207
- const artifact = await getContractArtifact(options.contractArtifact, log);
208
- const contractAddress = options.contractAddress;
209
- const completeAddress = new CompleteAddress(contractAddress, options.publicKey ?? Fr.ZERO, options.partialAddress);
210
- const portalContract = options.portalContract ?? EthAddress.ZERO;
211
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
212
- await client.addContracts([{ artifact, completeAddress, portalContract }]);
213
- log(`\nContract added to PXE at ${contractAddress.toString()}\n`);
118
+ const { addContract } = await import('./cmds/add_contract.js');
119
+ await addContract(options.rpcUrl, options.contractArtifact, options.contractAddress, options.partialAddress, options.publicKey, options.portalContract, debugLogger, log);
214
120
  });
215
121
  program
216
122
  .command('get-tx-receipt')
@@ -218,14 +124,8 @@ export function getProgram(log, debugLogger) {
218
124
  .argument('<txHash>', 'A transaction hash to get the receipt for.', parseTxHash)
219
125
  .addOption(pxeOption)
220
126
  .action(async (txHash, options) => {
221
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
222
- const receipt = await client.getTxReceipt(txHash);
223
- if (!receipt) {
224
- log(`No receipt found for transaction hash ${txHash.toString()}`);
225
- }
226
- else {
227
- log(`\nTransaction receipt: \n${JsonStringify(receipt, true)}\n`);
228
- }
127
+ const { getTxReceipt } = await import('./cmds/get_tx_receipt.js');
128
+ await getTxReceipt(options.rpcUrl, txHash, debugLogger, log);
229
129
  });
230
130
  program
231
131
  .command('get-contract-data')
@@ -234,27 +134,8 @@ export function getProgram(log, debugLogger) {
234
134
  .addOption(pxeOption)
235
135
  .option('-b, --include-bytecode <boolean>', "Include the contract's public function bytecode, if any.", false)
236
136
  .action(async (contractAddress, options) => {
237
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
238
- const contractDataWithOrWithoutBytecode = options.includeBytecode
239
- ? await client.getExtendedContractData(contractAddress)
240
- : await client.getContractData(contractAddress);
241
- if (!contractDataWithOrWithoutBytecode) {
242
- log(`No contract data found at ${contractAddress}`);
243
- return;
244
- }
245
- let contractData;
246
- if ('contractData' in contractDataWithOrWithoutBytecode) {
247
- contractData = contractDataWithOrWithoutBytecode.contractData;
248
- }
249
- else {
250
- contractData = contractDataWithOrWithoutBytecode;
251
- }
252
- log(`\nContract Data: \nAddress: ${contractData.contractAddress.toString()}`);
253
- log(`Portal: ${contractData.portalContractAddress.toString()}`);
254
- if ('bytecode' in contractDataWithOrWithoutBytecode) {
255
- log(`Bytecode: ${contractDataWithOrWithoutBytecode.bytecode}`);
256
- }
257
- log('\n');
137
+ const { getContractData } = await import('./cmds/get_contract_data.js');
138
+ await getContractData(options.rpcUrl, contractAddress, options.includeBytecode, debugLogger, log);
258
139
  });
259
140
  program
260
141
  .command('get-logs')
@@ -268,52 +149,8 @@ export function getProgram(log, debugLogger) {
268
149
  .addOption(pxeOption)
269
150
  .option('--follow', 'If set, will keep polling for new logs until interrupted.')
270
151
  .action(async ({ txHash, fromBlock, toBlock, afterLog, contractAddress, selector, rpcUrl, follow }) => {
271
- const pxe = await createCompatibleClient(rpcUrl, debugLogger);
272
- if (follow) {
273
- if (txHash) {
274
- throw Error('Cannot use --follow with --tx-hash');
275
- }
276
- if (toBlock) {
277
- throw Error('Cannot use --follow with --to-block');
278
- }
279
- }
280
- const filter = { txHash, fromBlock, toBlock, afterLog, contractAddress, selector };
281
- const fetchLogs = async () => {
282
- const response = await pxe.getUnencryptedLogs(filter);
283
- const logs = response.logs;
284
- if (!logs.length) {
285
- const filterOptions = Object.entries(filter)
286
- .filter(([, value]) => value !== undefined)
287
- .map(([key, value]) => `${key}: ${value}`)
288
- .join(', ');
289
- if (!follow) {
290
- log(`No logs found for filter: {${filterOptions}}`);
291
- }
292
- }
293
- else {
294
- if (!follow && !filter.afterLog) {
295
- log('Logs found: \n');
296
- }
297
- logs.forEach(unencryptedLog => log(unencryptedLog.toHumanReadable()));
298
- // Set the continuation parameter for the following requests
299
- filter.afterLog = logs[logs.length - 1].id;
300
- }
301
- return response.maxLogsHit;
302
- };
303
- if (follow) {
304
- log('Fetching logs...');
305
- while (true) {
306
- const maxLogsHit = await fetchLogs();
307
- if (!maxLogsHit) {
308
- await sleep(1000);
309
- }
310
- }
311
- }
312
- else {
313
- while (await fetchLogs()) {
314
- // Keep fetching logs until we reach the end.
315
- }
316
- }
152
+ const { getLogs } = await import('./cmds/get_logs.js');
153
+ await getLogs(txHash, fromBlock, toBlock, afterLog, contractAddress, selector, rpcUrl, follow, debugLogger, log);
317
154
  });
318
155
  program
319
156
  .command('register-recipient')
@@ -323,26 +160,16 @@ export function getProgram(log, debugLogger) {
323
160
  .requiredOption('-pa, --partial-address <partialAddress>', 'The partially computed address of the account contract.', parsePartialAddress)
324
161
  .addOption(pxeOption)
325
162
  .action(async ({ address, publicKey, partialAddress, rpcUrl }) => {
326
- const client = await createCompatibleClient(rpcUrl, debugLogger);
327
- await client.registerRecipient(CompleteAddress.create(address, publicKey, partialAddress));
328
- log(`\nRegistered details for account with address: ${address}\n`);
163
+ const { registerRecipient } = await import('./cmds/register_recipient.js');
164
+ await registerRecipient(address, publicKey, partialAddress, rpcUrl, debugLogger, log);
329
165
  });
330
166
  program
331
167
  .command('get-accounts')
332
168
  .description('Gets all the Aztec accounts stored in the PXE.')
333
169
  .addOption(pxeOption)
334
170
  .action(async (options) => {
335
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
336
- const accounts = await client.getRegisteredAccounts();
337
- if (!accounts.length) {
338
- log('No accounts found.');
339
- }
340
- else {
341
- log(`Accounts found: \n`);
342
- for (const account of accounts) {
343
- log(account.toReadableString());
344
- }
345
- }
171
+ const { getAccounts } = await import('./cmds/get_accounts.js');
172
+ await getAccounts(options.rpcUrl, debugLogger, log);
346
173
  });
347
174
  program
348
175
  .command('get-account')
@@ -350,31 +177,16 @@ export function getProgram(log, debugLogger) {
350
177
  .argument('<address>', 'The Aztec address to get account for', parseAztecAddress)
351
178
  .addOption(pxeOption)
352
179
  .action(async (address, options) => {
353
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
354
- const account = await client.getRegisteredAccount(address);
355
- if (!account) {
356
- log(`Unknown account ${address.toString()}`);
357
- }
358
- else {
359
- log(account.toReadableString());
360
- }
180
+ const { getAccount } = await import('./cmds/get_account.js');
181
+ await getAccount(address, options.rpcUrl, debugLogger, log);
361
182
  });
362
183
  program
363
184
  .command('get-recipients')
364
185
  .description('Gets all the recipients stored in the PXE.')
365
186
  .addOption(pxeOption)
366
187
  .action(async (options) => {
367
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
368
- const recipients = await client.getRecipients();
369
- if (!recipients.length) {
370
- log('No recipients found.');
371
- }
372
- else {
373
- log(`Recipients found: \n`);
374
- for (const recipient of recipients) {
375
- log(recipient.toReadableString());
376
- }
377
- }
188
+ const { getRecipients } = await import('./cmds/get_recipients.js');
189
+ await getRecipients(options.rpcUrl, debugLogger, log);
378
190
  });
379
191
  program
380
192
  .command('get-recipient')
@@ -382,14 +194,8 @@ export function getProgram(log, debugLogger) {
382
194
  .argument('<address>', 'The Aztec address to get recipient for', parseAztecAddress)
383
195
  .addOption(pxeOption)
384
196
  .action(async (address, options) => {
385
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
386
- const recipient = await client.getRecipient(address);
387
- if (!recipient) {
388
- log(`Unknown recipient ${address.toString()}`);
389
- }
390
- else {
391
- log(recipient.toReadableString());
392
- }
197
+ const { getRecipient } = await import('./cmds/get_recipient.js');
198
+ await getRecipient(address, options.rpcUrl, debugLogger, log);
393
199
  });
394
200
  program
395
201
  .command('send')
@@ -402,24 +208,8 @@ export function getProgram(log, debugLogger) {
402
208
  .addOption(pxeOption)
403
209
  .option('--no-wait', 'Print transaction hash without waiting for it to be mined')
404
210
  .action(async (functionName, options) => {
405
- const { functionArgs, contractArtifact } = await prepTx(options.contractArtifact, functionName, options.args, log);
406
- const { contractAddress, privateKey } = options;
407
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
408
- const wallet = await getSchnorrAccount(client, privateKey, privateKey, accountCreationSalt).getWallet();
409
- const contract = await Contract.at(contractAddress, contractArtifact, wallet);
410
- const tx = contract.methods[functionName](...functionArgs).send();
411
- log(`\nTransaction hash: ${(await tx.getTxHash()).toString()}`);
412
- if (options.wait) {
413
- await tx.wait();
414
- log('Transaction has been mined');
415
- const receipt = await tx.getReceipt();
416
- log(`Status: ${receipt.status}\n`);
417
- log(`Block number: ${receipt.blockNumber}`);
418
- log(`Block hash: ${receipt.blockHash?.toString('hex')}`);
419
- }
420
- else {
421
- log('Transaction pending. Check status with get-tx-receipt');
422
- }
211
+ const { send } = await import('./cmds/send.js');
212
+ await send(functionName, options.args, options.contractArtifact, options.contractAddress, options.privateKey, options.rpcUrl, !options.noWait, debugLogger, log);
423
213
  });
424
214
  program
425
215
  .command('call')
@@ -431,15 +221,8 @@ export function getProgram(log, debugLogger) {
431
221
  .option('-f, --from <string>', 'Aztec address of the caller. If empty, will use the first account from RPC.')
432
222
  .addOption(pxeOption)
433
223
  .action(async (functionName, options) => {
434
- const { functionArgs, contractArtifact } = await prepTx(options.contractArtifact, functionName, options.args, log);
435
- const fnArtifact = getFunctionArtifact(contractArtifact, functionName);
436
- if (fnArtifact.parameters.length !== options.args.length) {
437
- throw Error(`Invalid number of args passed. Expected ${fnArtifact.parameters.length}; Received: ${options.args.length}`);
438
- }
439
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
440
- const from = await getTxSender(client, options.from);
441
- const result = await client.viewTx(functionName, functionArgs, options.contractAddress, from);
442
- log(format('\nView result: ', result, '\n'));
224
+ const { call } = await import('./cmds/call.js');
225
+ await call(functionName, options.args, options.contractArtifact, options.contractAddress, options.from, options.rpcUrl, debugLogger, log);
443
226
  });
444
227
  program
445
228
  .command('add-note')
@@ -451,10 +234,8 @@ export function getProgram(log, debugLogger) {
451
234
  .requiredOption('-n, --note [note...]', 'The members of a Note serialized as hex strings.', [])
452
235
  .addOption(pxeOption)
453
236
  .action(async (address, contractAddress, storageSlot, txHash, options) => {
454
- const note = new Note(parseFields(options.note));
455
- const extendedNote = new ExtendedNote(note, address, contractAddress, storageSlot, txHash);
456
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
457
- await client.addNote(extendedNote);
237
+ const { addNote } = await import('./cmds/add_note.js');
238
+ await addNote(address, contractAddress, storageSlot, txHash, options.note, options.rpcUrl, debugLogger);
458
239
  });
459
240
  // Helper for users to decode hex strings into structs if needed.
460
241
  program
@@ -464,34 +245,23 @@ export function getProgram(log, debugLogger) {
464
245
  .requiredOption('-c, --contract-artifact <fileLocation>', "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts")
465
246
  .requiredOption('-p, --parameter <parameterName>', 'The name of the struct parameter to decode into')
466
247
  .action(async (encodedString, options) => {
467
- const contractArtifact = await getContractArtifact(options.contractArtifact, log);
468
- const parameterAbitype = contractArtifact.functions
469
- .map(({ parameters }) => parameters)
470
- .flat()
471
- .find(({ name, type }) => name === options.parameter && type.kind === 'struct');
472
- if (!parameterAbitype) {
473
- log(`No struct parameter found with name ${options.parameter}`);
474
- return;
475
- }
476
- const data = parseStructString(encodedString, parameterAbitype.type);
477
- log(`\nStruct Data: \n${JsonStringify(data, true)}\n`);
248
+ const { parseParameterStruct } = await import('./cmds/parse_parameter_struct.js');
249
+ await parseParameterStruct(encodedString, options.contractArtifact, options.parameter, log);
478
250
  });
479
251
  program
480
252
  .command('block-number')
481
253
  .description('Gets the current Aztec L2 block number.')
482
254
  .addOption(pxeOption)
483
255
  .action(async (options) => {
484
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
485
- const num = await client.getBlockNumber();
486
- log(`${num}\n`);
256
+ const { blockNumber } = await import('./cmds/block_number.js');
257
+ await blockNumber(options.rpcUrl, debugLogger, log);
487
258
  });
488
259
  program
489
260
  .command('example-contracts')
490
261
  .description('Lists the example contracts available to deploy from @aztec/noir-contracts')
491
262
  .action(async () => {
492
- const abisList = await getExampleContractArtifacts();
493
- const names = Object.keys(abisList);
494
- names.forEach(name => log(name));
263
+ const { exampleContracts } = await import('./cmds/example_contracts.js');
264
+ await exampleContracts(log);
495
265
  });
496
266
  program
497
267
  .command('unbox')
@@ -499,47 +269,32 @@ export function getProgram(log, debugLogger) {
499
269
  .argument('<contractName>', 'Name of the contract to unbox, e.g. "PrivateToken"')
500
270
  .argument('[localDirectory]', 'Local directory to unbox source folder to (relative or absolute), optional - defaults to `<contractName>/`')
501
271
  .action(async (contractName, localDirectory) => {
502
- const unboxTo = localDirectory ? localDirectory : contractName;
503
- await unboxContract(contractName, unboxTo, cliVersion, log);
272
+ const { unbox } = await import('./cmds/unbox.js');
273
+ await unbox(contractName, localDirectory, cliVersion, log);
504
274
  });
505
275
  program
506
276
  .command('get-node-info')
507
277
  .description('Gets the information of an aztec node at a URL.')
508
278
  .addOption(pxeOption)
509
279
  .action(async (options) => {
510
- const client = await createCompatibleClient(options.rpcUrl, debugLogger);
511
- const info = await client.getNodeInfo();
512
- log(`\nNode Info:\n`);
513
- log(`Sandbox Version: ${info.sandboxVersion}\n`);
514
- log(`Compatible Nargo Version: ${info.compatibleNargoVersion}\n`);
515
- log(`Chain Id: ${info.chainId}\n`);
516
- log(`Protocol Version: ${info.protocolVersion}\n`);
517
- log(`Rollup Address: ${info.l1ContractAddresses.rollupAddress.toString()}`);
280
+ const { getNodeInfo } = await import('./cmds/get_node_info.js');
281
+ await getNodeInfo(options.rpcUrl, debugLogger, log);
518
282
  });
519
283
  program
520
284
  .command('inspect-contract')
521
285
  .description('Shows list of external callable functions for a contract')
522
286
  .argument('<contractArtifactFile>', `A compiled Noir contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts`)
523
287
  .action(async (contractArtifactFile) => {
524
- const contractArtifact = await getContractArtifact(contractArtifactFile, debugLogger);
525
- const contractFns = contractArtifact.functions.filter(f => !f.isInternal && f.name !== 'compute_note_hash_and_nullifier');
526
- if (contractFns.length === 0) {
527
- log(`No external functions found for contract ${contractArtifact.name}`);
528
- }
529
- for (const fn of contractFns) {
530
- const signatureWithParameterNames = decodeFunctionSignatureWithParameterNames(fn.name, fn.parameters);
531
- const signature = decodeFunctionSignature(fn.name, fn.parameters);
532
- const selector = FunctionSelector.fromSignature(signature);
533
- log(`${fn.functionType} ${signatureWithParameterNames} \n\tfunction signature: ${signature}\n\tselector: ${selector}`);
534
- }
288
+ const { inspectContract } = await import('./cmds/inspect_contract.js');
289
+ await inspectContract(contractArtifactFile, debugLogger, log);
535
290
  });
536
291
  program
537
292
  .command('compute-selector')
538
293
  .description('Given a function signature, it computes a selector')
539
294
  .argument('<functionSignature>', 'Function signature to compute selector for e.g. foo(Field)')
540
- .action((functionSignature) => {
541
- const selector = FunctionSelector.fromSignature(functionSignature);
542
- log(`${selector}`);
295
+ .action(async (functionSignature) => {
296
+ const { computeSelector } = await import('./cmds/compute_selector.js');
297
+ computeSelector(functionSignature, log);
543
298
  });
544
299
  program
545
300
  .command('update')
@@ -549,12 +304,10 @@ export function getProgram(log, debugLogger) {
549
304
  .option('--sandbox-version <semver>', 'The sandbox version to update to. Defaults to latest', 'latest')
550
305
  .addOption(pxeOption)
551
306
  .action(async (projectPath, options) => {
552
- const { contract } = options;
553
- await update(projectPath, contract, options.rpcUrl, options.sandboxVersion, log, debugLogger);
307
+ const { update } = await import('./update/update.js');
308
+ await update(projectPath, options.contract, options.rpcUrl, options.sandboxVersion, log, debugLogger);
554
309
  });
555
- compileNoir(program, 'compile', log);
556
- generateTypescriptInterface(program, 'generate-typescript', log);
557
- generateNoirInterface(program, 'generate-noir-interface', log);
310
+ addNoirCompilerCommanderActions(program, log);
558
311
  return program;
559
312
  }
560
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLEVBQUUsRUFDRixjQUFjLEVBQ2QsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEdBQ25CLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGdCQUFnQixFQUVoQix1QkFBdUIsRUFDdkIseUNBQXlDLEdBQzFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxlQUFlLEVBQWdCLFlBQVksRUFBYSxNQUFNLGNBQWMsQ0FBQztBQUV0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFp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
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixXQUFXLEdBQ1osTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxFQUFFLGFBQWEsR0FBRyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUV0Rjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBVSxFQUFFLFdBQXdCO0lBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFOUIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDNUYsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMs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