@aztec/cli 0.16.9 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (219) hide show
  1. package/README.md +9 -15
  2. package/dest/cmds/contracts/index.js +12 -0
  3. package/dest/cmds/contracts/inspect_contract.js +37 -0
  4. package/dest/cmds/contracts/parse_parameter_struct.js +13 -0
  5. package/dest/cmds/devnet/bootstrap_network.js +193 -0
  6. package/dest/cmds/devnet/faucet.js +26 -0
  7. package/dest/cmds/devnet/index.js +12 -0
  8. package/dest/cmds/infrastructure/index.js +22 -0
  9. package/dest/cmds/infrastructure/sequencers.js +93 -0
  10. package/dest/cmds/infrastructure/setup_protocol_contract.js +31 -0
  11. package/dest/cmds/l1/advance_epoch.js +10 -0
  12. package/dest/cmds/l1/assume_proven_through.js +12 -0
  13. package/dest/cmds/l1/bridge_erc20.js +31 -0
  14. package/dest/cmds/l1/create_l1_account.js +15 -0
  15. package/dest/cmds/l1/deploy_l1_contracts.js +25 -0
  16. package/dest/cmds/l1/deploy_l1_verifier.js +54 -0
  17. package/dest/cmds/l1/get_l1_balance.js +33 -0
  18. package/dest/cmds/l1/index.js +127 -0
  19. package/dest/cmds/l1/prover_stats.js +145 -0
  20. package/dest/cmds/l1/update_l1_validators.js +186 -0
  21. package/dest/cmds/misc/compute_selector.js +5 -0
  22. package/dest/cmds/misc/example_contracts.js +6 -0
  23. package/dest/cmds/misc/generate_p2p_private_key.js +7 -0
  24. package/dest/cmds/misc/generate_secret_and_hash.js +11 -0
  25. package/dest/cmds/misc/generate_secret_key.js +6 -0
  26. package/dest/cmds/misc/index.js +36 -0
  27. package/dest/cmds/misc/setup_contracts.js +25 -0
  28. package/dest/cmds/misc/update/common.js +3 -0
  29. package/dest/cmds/misc/update/github.js +3 -0
  30. package/dest/cmds/misc/update/noir.js +45 -0
  31. package/dest/cmds/misc/update/npm.js +127 -0
  32. package/dest/cmds/misc/update/utils.js +38 -0
  33. package/dest/cmds/misc/update.js +52 -0
  34. package/dest/cmds/pxe/add_contract.js +27 -0
  35. package/dest/cmds/pxe/block_number.js +10 -0
  36. package/dest/cmds/pxe/get_account.js +10 -0
  37. package/dest/cmds/pxe/get_accounts.js +25 -0
  38. package/dest/cmds/pxe/get_block.js +9 -0
  39. package/dest/cmds/pxe/get_contract_data.js +31 -0
  40. package/dest/cmds/pxe/get_current_base_fee.js +7 -0
  41. package/dest/cmds/pxe/get_l1_to_l2_message_witness.js +11 -0
  42. package/dest/cmds/pxe/get_logs.js +51 -0
  43. package/dest/cmds/pxe/get_node_info.js +61 -0
  44. package/dest/cmds/pxe/get_pxe_info.js +11 -0
  45. package/dest/cmds/pxe/index.js +55 -0
  46. package/dest/utils/aztec.js +162 -0
  47. package/dest/utils/commands.js +303 -0
  48. package/dest/utils/encoding.js +110 -0
  49. package/dest/utils/github.js +3 -0
  50. package/dest/utils/index.js +4 -0
  51. package/dest/utils/inspect.js +177 -0
  52. package/package.json +70 -21
  53. package/src/cmds/contracts/index.ts +34 -0
  54. package/src/cmds/contracts/inspect_contract.ts +51 -0
  55. package/src/cmds/contracts/parse_parameter_struct.ts +27 -0
  56. package/src/cmds/devnet/bootstrap_network.ts +306 -0
  57. package/src/cmds/devnet/faucet.ts +33 -0
  58. package/src/cmds/devnet/index.ts +52 -0
  59. package/src/cmds/infrastructure/index.ts +54 -0
  60. package/src/cmds/infrastructure/sequencers.ts +100 -0
  61. package/src/cmds/infrastructure/setup_protocol_contract.ts +36 -0
  62. package/src/cmds/l1/advance_epoch.ts +12 -0
  63. package/src/cmds/l1/assume_proven_through.ts +25 -0
  64. package/src/cmds/l1/bridge_erc20.ts +53 -0
  65. package/src/cmds/l1/create_l1_account.ts +17 -0
  66. package/src/cmds/l1/deploy_l1_contracts.ts +55 -0
  67. package/src/cmds/l1/deploy_l1_verifier.ts +105 -0
  68. package/src/cmds/l1/get_l1_balance.ts +41 -0
  69. package/src/cmds/l1/index.ts +415 -0
  70. package/src/cmds/l1/prover_stats.ts +192 -0
  71. package/src/cmds/l1/update_l1_validators.ts +238 -0
  72. package/src/cmds/misc/compute_selector.ts +7 -0
  73. package/src/cmds/misc/example_contracts.ts +12 -0
  74. package/src/cmds/misc/generate_p2p_private_key.ts +10 -0
  75. package/src/cmds/misc/generate_secret_and_hash.ts +15 -0
  76. package/src/cmds/misc/generate_secret_key.ts +5 -0
  77. package/src/cmds/misc/index.ts +70 -0
  78. package/src/cmds/misc/setup_contracts.ts +38 -0
  79. package/src/cmds/misc/update/common.ts +16 -0
  80. package/src/cmds/misc/update/github.ts +3 -0
  81. package/src/cmds/misc/update/noir.ts +57 -0
  82. package/src/cmds/misc/update/npm.ts +154 -0
  83. package/src/cmds/misc/update/utils.ts +50 -0
  84. package/src/cmds/misc/update.ts +78 -0
  85. package/src/cmds/pxe/add_contract.ts +39 -0
  86. package/src/cmds/pxe/block_number.ts +9 -0
  87. package/src/cmds/pxe/get_account.ts +16 -0
  88. package/src/cmds/pxe/get_accounts.ts +35 -0
  89. package/src/cmds/pxe/get_block.ts +10 -0
  90. package/src/cmds/pxe/get_contract_data.ts +49 -0
  91. package/src/cmds/pxe/get_current_base_fee.ts +9 -0
  92. package/src/cmds/pxe/get_l1_to_l2_message_witness.ts +25 -0
  93. package/src/cmds/pxe/get_logs.ts +66 -0
  94. package/src/cmds/pxe/get_node_info.ts +71 -0
  95. package/src/cmds/pxe/get_pxe_info.ts +13 -0
  96. package/src/cmds/pxe/index.ts +170 -0
  97. package/src/utils/aztec.ts +218 -0
  98. package/src/utils/commands.ts +384 -0
  99. package/src/utils/encoding.ts +123 -0
  100. package/src/utils/github.ts +3 -0
  101. package/src/utils/index.ts +4 -0
  102. package/src/utils/inspect.ts +207 -0
  103. package/dest/bin/index.d.ts +0 -3
  104. package/dest/bin/index.d.ts.map +0 -1
  105. package/dest/bin/index.js +0 -18
  106. package/dest/client.d.ts +0 -17
  107. package/dest/client.d.ts.map +0 -1
  108. package/dest/client.js +0 -60
  109. package/dest/cmds/add_contract.d.ts +0 -7
  110. package/dest/cmds/add_contract.d.ts.map +0 -1
  111. package/dest/cmds/add_contract.js +0 -15
  112. package/dest/cmds/add_note.d.ts +0 -8
  113. package/dest/cmds/add_note.d.ts.map +0 -1
  114. package/dest/cmds/add_note.js +0 -13
  115. package/dest/cmds/block_number.d.ts +0 -6
  116. package/dest/cmds/block_number.d.ts.map +0 -1
  117. package/dest/cmds/block_number.js +0 -10
  118. package/dest/cmds/call.d.ts +0 -7
  119. package/dest/cmds/call.d.ts.map +0 -1
  120. package/dest/cmds/call.js +0 -18
  121. package/dest/cmds/check_deploy.d.ts +0 -7
  122. package/dest/cmds/check_deploy.d.ts.map +0 -1
  123. package/dest/cmds/check_deploy.js +0 -16
  124. package/dest/cmds/compute_selector.d.ts +0 -6
  125. package/dest/cmds/compute_selector.d.ts.map +0 -1
  126. package/dest/cmds/compute_selector.js +0 -9
  127. package/dest/cmds/create_account.d.ts +0 -7
  128. package/dest/cmds/create_account.d.ts.map +0 -1
  129. package/dest/cmds/create_account.js +0 -30
  130. package/dest/cmds/deploy.d.ts +0 -7
  131. package/dest/cmds/deploy.d.ts.map +0 -1
  132. package/dest/cmds/deploy.js +0 -58
  133. package/dest/cmds/deploy_l1_contracts.d.ts +0 -6
  134. package/dest/cmds/deploy_l1_contracts.d.ts.map +0 -1
  135. package/dest/cmds/deploy_l1_contracts.js +0 -15
  136. package/dest/cmds/example_contracts.d.ts +0 -6
  137. package/dest/cmds/example_contracts.d.ts.map +0 -1
  138. package/dest/cmds/example_contracts.js +0 -10
  139. package/dest/cmds/generate_p2p_private_key.d.ts +0 -6
  140. package/dest/cmds/generate_p2p_private_key.d.ts.map +0 -1
  141. package/dest/cmds/generate_p2p_private_key.js +0 -11
  142. package/dest/cmds/generate_private_key.d.ts +0 -6
  143. package/dest/cmds/generate_private_key.d.ts.map +0 -1
  144. package/dest/cmds/generate_private_key.js +0 -22
  145. package/dest/cmds/get_account.d.ts +0 -7
  146. package/dest/cmds/get_account.d.ts.map +0 -1
  147. package/dest/cmds/get_account.js +0 -15
  148. package/dest/cmds/get_accounts.d.ts +0 -6
  149. package/dest/cmds/get_accounts.d.ts.map +0 -1
  150. package/dest/cmds/get_accounts.js +0 -18
  151. package/dest/cmds/get_contract_data.d.ts +0 -7
  152. package/dest/cmds/get_contract_data.d.ts.map +0 -1
  153. package/dest/cmds/get_contract_data.js +0 -28
  154. package/dest/cmds/get_logs.d.ts +0 -7
  155. package/dest/cmds/get_logs.d.ts.map +0 -1
  156. package/dest/cmds/get_logs.js +0 -54
  157. package/dest/cmds/get_node_info.d.ts +0 -6
  158. package/dest/cmds/get_node_info.d.ts.map +0 -1
  159. package/dest/cmds/get_node_info.js +0 -15
  160. package/dest/cmds/get_recipient.d.ts +0 -7
  161. package/dest/cmds/get_recipient.d.ts.map +0 -1
  162. package/dest/cmds/get_recipient.js +0 -15
  163. package/dest/cmds/get_recipients.d.ts +0 -6
  164. package/dest/cmds/get_recipients.d.ts.map +0 -1
  165. package/dest/cmds/get_recipients.js +0 -18
  166. package/dest/cmds/get_tx_receipt.d.ts +0 -7
  167. package/dest/cmds/get_tx_receipt.d.ts.map +0 -1
  168. package/dest/cmds/get_tx_receipt.js +0 -16
  169. package/dest/cmds/inspect_contract.d.ts +0 -6
  170. package/dest/cmds/inspect_contract.d.ts.map +0 -1
  171. package/dest/cmds/inspect_contract.js +0 -19
  172. package/dest/cmds/parse_parameter_struct.d.ts +0 -6
  173. package/dest/cmds/parse_parameter_struct.d.ts.map +0 -1
  174. package/dest/cmds/parse_parameter_struct.js +0 -20
  175. package/dest/cmds/register_account.d.ts +0 -7
  176. package/dest/cmds/register_account.d.ts.map +0 -1
  177. package/dest/cmds/register_account.js +0 -13
  178. package/dest/cmds/register_recipient.d.ts +0 -7
  179. package/dest/cmds/register_recipient.d.ts.map +0 -1
  180. package/dest/cmds/register_recipient.js +0 -11
  181. package/dest/cmds/send.d.ts +0 -7
  182. package/dest/cmds/send.d.ts.map +0 -1
  183. package/dest/cmds/send.js +0 -26
  184. package/dest/cmds/unbox.d.ts +0 -6
  185. package/dest/cmds/unbox.d.ts.map +0 -1
  186. package/dest/cmds/unbox.js +0 -9
  187. package/dest/encoding.d.ts +0 -15
  188. package/dest/encoding.d.ts.map +0 -1
  189. package/dest/encoding.js +0 -114
  190. package/dest/github.d.ts +0 -4
  191. package/dest/github.d.ts.map +0 -1
  192. package/dest/github.js +0 -4
  193. package/dest/index.d.ts +0 -10
  194. package/dest/index.d.ts.map +0 -1
  195. package/dest/index.js +0 -321
  196. package/dest/parse_args.d.ts +0 -105
  197. package/dest/parse_args.d.ts.map +0 -1
  198. package/dest/parse_args.js +0 -233
  199. package/dest/test/mocks.d.ts +0 -3
  200. package/dest/test/mocks.d.ts.map +0 -1
  201. package/dest/test/mocks.js +0 -65
  202. package/dest/unbox.d.ts +0 -14
  203. package/dest/unbox.d.ts.map +0 -1
  204. package/dest/unbox.js +0 -276
  205. package/dest/update/common.d.ts +0 -17
  206. package/dest/update/common.d.ts.map +0 -1
  207. package/dest/update/common.js +0 -2
  208. package/dest/update/noir.d.ts +0 -10
  209. package/dest/update/noir.d.ts.map +0 -1
  210. package/dest/update/noir.js +0 -63
  211. package/dest/update/npm.d.ts +0 -34
  212. package/dest/update/npm.d.ts.map +0 -1
  213. package/dest/update/npm.js +0 -125
  214. package/dest/update/update.d.ts +0 -3
  215. package/dest/update/update.d.ts.map +0 -1
  216. package/dest/update/update.js +0 -58
  217. package/dest/utils.d.ts +0 -70
  218. package/dest/utils.d.ts.map +0 -1
  219. package/dest/utils.js +0 -168
@@ -0,0 +1,55 @@
1
+ import { getL1ContractsConfigEnvVars } from '@aztec/ethereum';
2
+ import { type EthAddress } from '@aztec/foundation/eth-address';
3
+ import { type LogFn, type Logger } from '@aztec/foundation/log';
4
+
5
+ import { deployAztecContracts } from '../../utils/aztec.js';
6
+
7
+ export async function deployL1Contracts(
8
+ rpcUrl: string,
9
+ chainId: number,
10
+ privateKey: string | undefined,
11
+ mnemonic: string,
12
+ mnemonicIndex: number,
13
+ salt: number | undefined,
14
+ json: boolean,
15
+ initialValidators: EthAddress[],
16
+ log: LogFn,
17
+ debugLogger: Logger,
18
+ ) {
19
+ const config = getL1ContractsConfigEnvVars();
20
+
21
+ const { l1ContractAddresses } = await deployAztecContracts(
22
+ rpcUrl,
23
+ chainId,
24
+ privateKey,
25
+ mnemonic,
26
+ mnemonicIndex,
27
+ salt,
28
+ initialValidators,
29
+ config,
30
+ debugLogger,
31
+ );
32
+
33
+ if (json) {
34
+ log(
35
+ JSON.stringify(
36
+ Object.fromEntries(Object.entries(l1ContractAddresses).map(([k, v]) => [k, v.toString()])),
37
+ null,
38
+ 2,
39
+ ),
40
+ );
41
+ } else {
42
+ log(`Rollup Address: ${l1ContractAddresses.rollupAddress.toString()}`);
43
+ log(`Registry Address: ${l1ContractAddresses.registryAddress.toString()}`);
44
+ log(`L1 -> L2 Inbox Address: ${l1ContractAddresses.inboxAddress.toString()}`);
45
+ log(`L2 -> L1 Outbox Address: ${l1ContractAddresses.outboxAddress.toString()}`);
46
+ log(`Fee Juice Address: ${l1ContractAddresses.feeJuiceAddress.toString()}`);
47
+ log(`Staking Asset Address: ${l1ContractAddresses.stakingAssetAddress.toString()}`);
48
+ log(`Fee Juice Portal Address: ${l1ContractAddresses.feeJuicePortalAddress.toString()}`);
49
+ log(`CoinIssuer Address: ${l1ContractAddresses.coinIssuerAddress.toString()}`);
50
+ log(`RewardDistributor Address: ${l1ContractAddresses.rewardDistributorAddress.toString()}`);
51
+ log(`GovernanceProposer Address: ${l1ContractAddresses.governanceProposerAddress.toString()}`);
52
+ log(`Governance Address: ${l1ContractAddresses.governanceAddress.toString()}`);
53
+ log(`SlashFactory Address: ${l1ContractAddresses.slashFactoryAddress.toString()}`);
54
+ }
55
+ }
@@ -0,0 +1,105 @@
1
+ import { createCompatibleClient } from '@aztec/aztec.js';
2
+ import { createEthereumChain, createL1Clients, deployL1Contract } from '@aztec/ethereum';
3
+ import { type LogFn, type Logger } from '@aztec/foundation/log';
4
+ import { HonkVerifierAbi, HonkVerifierBytecode } from '@aztec/l1-artifacts';
5
+
6
+ import { InvalidOptionArgumentError } from 'commander';
7
+ import { type Hex, getContract } from 'viem';
8
+
9
+ export async function deployUltraHonkVerifier(
10
+ rollupAddress: Hex | undefined,
11
+ ethRpcUrl: string,
12
+ l1ChainId: string,
13
+ privateKey: string | undefined,
14
+ mnemonic: string,
15
+ pxeRpcUrl: string,
16
+ bbBinaryPath: string,
17
+ bbWorkingDirectory: string,
18
+ log: LogFn,
19
+ debugLogger: Logger,
20
+ ) {
21
+ if (!bbBinaryPath || !bbWorkingDirectory) {
22
+ throw new InvalidOptionArgumentError('Missing path to bb binary and working directory');
23
+ }
24
+
25
+ const { publicClient, walletClient } = createL1Clients(
26
+ ethRpcUrl,
27
+ privateKey ?? mnemonic,
28
+ createEthereumChain(ethRpcUrl, l1ChainId).chainInfo,
29
+ );
30
+
31
+ if (!rollupAddress && pxeRpcUrl) {
32
+ const pxe = await createCompatibleClient(pxeRpcUrl, debugLogger);
33
+ const { l1ContractAddresses } = await pxe.getNodeInfo();
34
+ rollupAddress = l1ContractAddresses.rollupAddress.toString();
35
+ }
36
+
37
+ if (!rollupAddress) {
38
+ throw new InvalidOptionArgumentError('Missing rollup address');
39
+ }
40
+
41
+ const { RollupAbi } = await import('@aztec/l1-artifacts');
42
+
43
+ const rollup = getContract({
44
+ abi: RollupAbi,
45
+ address: rollupAddress,
46
+ client: walletClient,
47
+ });
48
+
49
+ const { address: verifierAddress } = await deployL1Contract(
50
+ walletClient,
51
+ publicClient,
52
+ HonkVerifierAbi,
53
+ HonkVerifierBytecode,
54
+ );
55
+ log(`Deployed honk verifier at ${verifierAddress}`);
56
+
57
+ await rollup.write.setEpochVerifier([verifierAddress.toString()]);
58
+
59
+ log(`Rollup accepts only real proofs now`);
60
+ }
61
+
62
+ export async function deployMockVerifier(
63
+ rollupAddress: Hex | undefined,
64
+ ethRpcUrl: string,
65
+ l1ChainId: string,
66
+ privateKey: string | undefined,
67
+ mnemonic: string,
68
+ pxeRpcUrl: string,
69
+ log: LogFn,
70
+ debugLogger: Logger,
71
+ ) {
72
+ const { publicClient, walletClient } = createL1Clients(
73
+ ethRpcUrl,
74
+ privateKey ?? mnemonic,
75
+ createEthereumChain(ethRpcUrl, l1ChainId).chainInfo,
76
+ );
77
+ const { MockVerifierAbi, MockVerifierBytecode, RollupAbi } = await import('@aztec/l1-artifacts');
78
+
79
+ const { address: mockVerifierAddress } = await deployL1Contract(
80
+ walletClient,
81
+ publicClient,
82
+ MockVerifierAbi,
83
+ MockVerifierBytecode,
84
+ );
85
+ log(`Deployed MockVerifier at ${mockVerifierAddress.toString()}`);
86
+
87
+ if (!rollupAddress && pxeRpcUrl) {
88
+ const pxe = await createCompatibleClient(pxeRpcUrl, debugLogger);
89
+ const { l1ContractAddresses } = await pxe.getNodeInfo();
90
+ rollupAddress = l1ContractAddresses.rollupAddress.toString();
91
+ }
92
+
93
+ if (!rollupAddress) {
94
+ throw new InvalidOptionArgumentError('Missing rollup address');
95
+ }
96
+
97
+ const rollup = getContract({
98
+ abi: RollupAbi,
99
+ address: rollupAddress,
100
+ client: walletClient,
101
+ });
102
+
103
+ await rollup.write.setEpochVerifier([mockVerifierAddress.toString()]);
104
+ log(`Rollup accepts only fake proofs now`);
105
+ }
@@ -0,0 +1,41 @@
1
+ import { type EthAddress } from '@aztec/circuits.js';
2
+ import { createEthereumChain } from '@aztec/ethereum';
3
+ import { type LogFn } from '@aztec/foundation/log';
4
+ import { TestERC20Abi } from '@aztec/l1-artifacts';
5
+
6
+ import { createPublicClient, getContract, http } from 'viem';
7
+
8
+ import { prettyPrintJSON } from '../../utils/commands.js';
9
+
10
+ export async function getL1Balance(
11
+ who: EthAddress,
12
+ token: EthAddress | undefined,
13
+ l1RpcUrl: string,
14
+ chainId: number,
15
+ json: boolean,
16
+ log: LogFn,
17
+ ) {
18
+ const chain = createEthereumChain(l1RpcUrl, chainId);
19
+ const publicClient = createPublicClient({ chain: chain.chainInfo, transport: http(chain.rpcUrl) });
20
+
21
+ let balance = 0n;
22
+ if (token) {
23
+ const gasL1 = getContract({
24
+ address: token.toString(),
25
+ abi: TestERC20Abi,
26
+ client: publicClient,
27
+ });
28
+
29
+ balance = await gasL1.read.balanceOf([who.toString()]);
30
+ } else {
31
+ balance = await publicClient.getBalance({
32
+ address: who.toString(),
33
+ });
34
+ }
35
+
36
+ if (json) {
37
+ log(prettyPrintJSON({ balance }));
38
+ } else {
39
+ log(`L1 balance of ${who.toString()} is ${balance.toString()}`);
40
+ }
41
+ }
@@ -0,0 +1,415 @@
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { type LogFn, type Logger } from '@aztec/foundation/log';
3
+
4
+ import { type Command, Option } from 'commander';
5
+
6
+ import {
7
+ ETHEREUM_HOST,
8
+ PRIVATE_KEY,
9
+ l1ChainIdOption,
10
+ makePxeOption,
11
+ parseAztecAddress,
12
+ parseBigint,
13
+ parseEthereumAddress,
14
+ pxeOption,
15
+ } from '../../utils/commands.js';
16
+
17
+ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger) {
18
+ const { BB_BINARY_PATH, BB_WORKING_DIRECTORY } = process.env;
19
+
20
+ program
21
+ .command('deploy-l1-contracts')
22
+ .description('Deploys all necessary Ethereum contracts for Aztec.')
23
+ .requiredOption(
24
+ '-u, --rpc-url <string>',
25
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
26
+ ETHEREUM_HOST,
27
+ )
28
+ .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
29
+ .option('--validators <string>', 'Comma separated list of validators')
30
+ .option(
31
+ '-m, --mnemonic <string>',
32
+ 'The mnemonic to use in deployment',
33
+ 'test test test test test test test test test test test junk',
34
+ )
35
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use in deployment', arg => parseInt(arg), 0)
36
+ .addOption(l1ChainIdOption)
37
+ .option('--salt <number>', 'The optional salt to use in deployment', arg => parseInt(arg))
38
+ .option('--json', 'Output the contract addresses in JSON format')
39
+ .action(async options => {
40
+ const { deployL1Contracts } = await import('./deploy_l1_contracts.js');
41
+
42
+ const initialValidators =
43
+ options.validators?.split(',').map((validator: string) => EthAddress.fromString(validator)) || [];
44
+ await deployL1Contracts(
45
+ options.rpcUrl,
46
+ options.l1ChainId,
47
+ options.privateKey,
48
+ options.mnemonic,
49
+ options.mnemonicIndex,
50
+ options.salt,
51
+ options.json,
52
+ initialValidators,
53
+ log,
54
+ debugLogger,
55
+ );
56
+ });
57
+
58
+ program
59
+ .command('generate-l1-account')
60
+ .description('Generates a new private key for an account on L1.')
61
+ .option('--json', 'Output the private key in JSON format')
62
+ .action(async () => {
63
+ const { generateL1Account } = await import('./update_l1_validators.js');
64
+ const account = generateL1Account();
65
+ log(JSON.stringify(account, null, 2));
66
+ });
67
+
68
+ program
69
+ .command('add-l1-validator')
70
+ .description('Adds a validator to the L1 rollup contract.')
71
+ .requiredOption(
72
+ '-u, --rpc-url <string>',
73
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
74
+ ETHEREUM_HOST,
75
+ )
76
+ .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
77
+ .option(
78
+ '-m, --mnemonic <string>',
79
+ 'The mnemonic to use in deployment',
80
+ 'test test test test test test test test test test test junk',
81
+ )
82
+ .addOption(l1ChainIdOption)
83
+ .option('--validator <address>', 'ethereum address of the validator', parseEthereumAddress)
84
+ .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
85
+ .option('--withdrawer <address>', 'ethereum address of the withdrawer', parseEthereumAddress)
86
+ .action(async options => {
87
+ const { addL1Validator } = await import('./update_l1_validators.js');
88
+ await addL1Validator({
89
+ rpcUrl: options.rpcUrl,
90
+ chainId: options.l1ChainId,
91
+ privateKey: options.privateKey,
92
+ mnemonic: options.mnemonic,
93
+ validatorAddress: options.validator,
94
+ rollupAddress: options.rollup,
95
+ withdrawerAddress: options.withdrawer,
96
+ log,
97
+ debugLogger,
98
+ });
99
+ });
100
+
101
+ program
102
+ .command('remove-l1-validator')
103
+ .description('Removes a validator to the L1 rollup contract.')
104
+ .requiredOption(
105
+ '-u, --rpc-url <string>',
106
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
107
+ ETHEREUM_HOST,
108
+ )
109
+ .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
110
+ .option(
111
+ '-m, --mnemonic <string>',
112
+ 'The mnemonic to use in deployment',
113
+ 'test test test test test test test test test test test junk',
114
+ )
115
+ .addOption(l1ChainIdOption)
116
+ .option('--validator <address>', 'ethereum address of the validator', parseEthereumAddress)
117
+ .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
118
+ .action(async options => {
119
+ const { removeL1Validator } = await import('./update_l1_validators.js');
120
+ await removeL1Validator({
121
+ rpcUrl: options.rpcUrl,
122
+ chainId: options.l1ChainId,
123
+ privateKey: options.privateKey,
124
+ mnemonic: options.mnemonic,
125
+ validatorAddress: options.validator,
126
+ rollupAddress: options.rollup,
127
+ log,
128
+ debugLogger,
129
+ });
130
+ });
131
+
132
+ program
133
+ .command('fast-forward-epochs')
134
+ .description('Fast forwards the epoch of the L1 rollup contract.')
135
+ .requiredOption(
136
+ '-u, --rpc-url <string>',
137
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
138
+ ETHEREUM_HOST,
139
+ )
140
+ .addOption(l1ChainIdOption)
141
+ .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
142
+ .option('--count <number>', 'The number of epochs to fast forward', arg => BigInt(parseInt(arg)), 1n)
143
+ .action(async options => {
144
+ const { fastForwardEpochs } = await import('./update_l1_validators.js');
145
+ await fastForwardEpochs({
146
+ rpcUrl: options.rpcUrl,
147
+ chainId: options.l1ChainId,
148
+ rollupAddress: options.rollup,
149
+ numEpochs: options.count,
150
+ log,
151
+ debugLogger,
152
+ });
153
+ });
154
+
155
+ program
156
+ .command('debug-rollup')
157
+ .description('Debugs the rollup contract.')
158
+ .requiredOption(
159
+ '-u, --rpc-url <string>',
160
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
161
+ ETHEREUM_HOST,
162
+ )
163
+ .addOption(l1ChainIdOption)
164
+ .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
165
+ .action(async options => {
166
+ const { debugRollup } = await import('./update_l1_validators.js');
167
+ await debugRollup({
168
+ rpcUrl: options.rpcUrl,
169
+ chainId: options.l1ChainId,
170
+ privateKey: options.privateKey,
171
+ mnemonic: options.mnemonic,
172
+ rollupAddress: options.rollup,
173
+ log,
174
+ debugLogger,
175
+ });
176
+ });
177
+
178
+ program
179
+ .command('prune-rollup')
180
+ .description('Prunes the pending chain on the rollup contract.')
181
+ .requiredOption(
182
+ '-u, --rpc-url <string>',
183
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
184
+ ETHEREUM_HOST,
185
+ )
186
+ .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
187
+ .option(
188
+ '-m, --mnemonic <string>',
189
+ 'The mnemonic to use in deployment',
190
+ 'test test test test test test test test test test test junk',
191
+ )
192
+ .addOption(l1ChainIdOption)
193
+ .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
194
+ .action(async options => {
195
+ const { pruneRollup } = await import('./update_l1_validators.js');
196
+ await pruneRollup({
197
+ rpcUrl: options.rpcUrl,
198
+ chainId: options.l1ChainId,
199
+ privateKey: options.privateKey,
200
+ mnemonic: options.mnemonic,
201
+ rollupAddress: options.rollup,
202
+ log,
203
+ debugLogger,
204
+ });
205
+ });
206
+
207
+ program
208
+ .command('deploy-l1-verifier')
209
+ .description('Deploys the rollup verifier contract')
210
+ .requiredOption(
211
+ '--l1-rpc-url <string>',
212
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
213
+ ETHEREUM_HOST,
214
+ )
215
+ .addOption(
216
+ new Option('--l1-chain-id <string>', 'The chain id of the L1 network')
217
+ .env('L1_CHAIN_ID')
218
+ .default('31337')
219
+ .makeOptionMandatory(true),
220
+ )
221
+ .addOption(makePxeOption(false).conflicts('rollup-address'))
222
+ .addOption(
223
+ new Option('--rollup-address <string>', 'The address of the rollup contract')
224
+ .env('ROLLUP_CONTRACT_ADDRESS')
225
+ .argParser(parseEthereumAddress)
226
+ .conflicts('rpc-url'),
227
+ )
228
+ .option('--l1-private-key <string>', 'The L1 private key to use for deployment', PRIVATE_KEY)
229
+ .option(
230
+ '-m, --mnemonic <string>',
231
+ 'The mnemonic to use in deployment',
232
+ 'test test test test test test test test test test test junk',
233
+ )
234
+ .requiredOption('--verifier <verifier>', 'Either mock or real', 'real')
235
+ .option('--bb <path>', 'Path to bb binary', BB_BINARY_PATH)
236
+ .option('--bb-working-dir <path>', 'Path to bb working directory', BB_WORKING_DIRECTORY)
237
+ .action(async options => {
238
+ const { deployMockVerifier, deployUltraHonkVerifier } = await import('./deploy_l1_verifier.js');
239
+ if (options.verifier === 'mock') {
240
+ await deployMockVerifier(
241
+ options.rollupAddress?.toString(),
242
+ options.l1RpcUrl,
243
+ options.l1ChainId,
244
+ options.l1PrivateKey,
245
+ options.mnemonic,
246
+ options.rpcUrl,
247
+ log,
248
+ debugLogger,
249
+ );
250
+ } else {
251
+ await deployUltraHonkVerifier(
252
+ options.rollupAddress?.toString(),
253
+ options.l1RpcUrl,
254
+ options.l1ChainId,
255
+ options.l1PrivateKey,
256
+ options.mnemonic,
257
+ options.rpcUrl,
258
+ options.bb,
259
+ options.bbWorkingDir,
260
+ log,
261
+ debugLogger,
262
+ );
263
+ }
264
+ });
265
+
266
+ program
267
+ .command('bridge-erc20')
268
+ .description('Bridges ERC20 tokens to L2.')
269
+ .argument('<amount>', 'The amount of Fee Juice to mint and bridge.', parseBigint)
270
+ .argument('<recipient>', 'Aztec address of the recipient.', parseAztecAddress)
271
+ .requiredOption(
272
+ '--l1-rpc-url <string>',
273
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
274
+ ETHEREUM_HOST,
275
+ )
276
+ .option(
277
+ '-m, --mnemonic <string>',
278
+ 'The mnemonic to use for deriving the Ethereum address that will mint and bridge',
279
+ 'test test test test test test test test test test test junk',
280
+ )
281
+ .option('--mint', 'Mint the tokens on L1', false)
282
+ .option('--private', 'If the bridge should use the private flow', false)
283
+ .addOption(l1ChainIdOption)
284
+ .requiredOption('-t, --token <string>', 'The address of the token to bridge', parseEthereumAddress)
285
+ .requiredOption('-p, --portal <string>', 'The address of the portal contract', parseEthereumAddress)
286
+ .option('--l1-private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
287
+ .option('--json', 'Output the claim in JSON format')
288
+ .action(async (amount, recipient, options) => {
289
+ const { bridgeERC20 } = await import('./bridge_erc20.js');
290
+ await bridgeERC20(
291
+ amount,
292
+ recipient,
293
+ options.l1RpcUrl,
294
+ options.l1ChainId,
295
+ options.l1PrivateKey,
296
+ options.mnemonic,
297
+ options.token,
298
+ options.portal,
299
+ options.private,
300
+ options.mint,
301
+ options.json,
302
+ log,
303
+ debugLogger,
304
+ );
305
+ });
306
+
307
+ program
308
+ .command('create-l1-account')
309
+ .option('--json', 'Output the account in JSON format')
310
+ .action(async options => {
311
+ const { createL1Account } = await import('./create_l1_account.js');
312
+ createL1Account(options.json, log);
313
+ });
314
+
315
+ program
316
+ .command('get-l1-balance')
317
+ .description('Gets the balance of an ERC token in L1 for the given Ethereum address.')
318
+ .argument('<who>', 'Ethereum address to check.', parseEthereumAddress)
319
+ .requiredOption(
320
+ '--l1-rpc-url <string>',
321
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
322
+ ETHEREUM_HOST,
323
+ )
324
+ .option('-t, --token <string>', 'The address of the token to check the balance of', parseEthereumAddress)
325
+ .addOption(l1ChainIdOption)
326
+ .option('--json', 'Output the balance in JSON format')
327
+ .action(async (who, options) => {
328
+ const { getL1Balance } = await import('./get_l1_balance.js');
329
+ await getL1Balance(who, options.token, options.l1RpcUrl, options.l1ChainId, options.json, log);
330
+ });
331
+
332
+ program
333
+ .command('set-proven-through', { hidden: true })
334
+ .description(
335
+ 'Instructs the L1 rollup contract to assume all blocks until the given number are automatically proven.',
336
+ )
337
+ .argument('[blockNumber]', 'The target block number, defaults to the latest pending block number.', parseBigint)
338
+ .requiredOption(
339
+ '--l1-rpc-url <string>',
340
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
341
+ ETHEREUM_HOST,
342
+ )
343
+ .addOption(pxeOption)
344
+ .option(
345
+ '-m, --mnemonic <string>',
346
+ 'The mnemonic to use for deriving the Ethereum address that will mint and bridge',
347
+ 'test test test test test test test test test test test junk',
348
+ )
349
+ .addOption(l1ChainIdOption)
350
+ .option('--l1-private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
351
+ .action(async (blockNumber, options) => {
352
+ const { assumeProvenThrough } = await import('./assume_proven_through.js');
353
+ await assumeProvenThrough(
354
+ blockNumber,
355
+ options.l1RpcUrl,
356
+ options.rpcUrl,
357
+ options.l1ChainId,
358
+ options.l1PrivateKey,
359
+ options.mnemonic,
360
+ log,
361
+ );
362
+ });
363
+
364
+ program
365
+ .command('advance-epoch')
366
+ .description('Use L1 cheat codes to warp time until the next epoch.')
367
+ .requiredOption(
368
+ '--l1-rpc-url <string>',
369
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
370
+ ETHEREUM_HOST,
371
+ )
372
+ .addOption(pxeOption)
373
+ .action(async options => {
374
+ const { advanceEpoch } = await import('./advance_epoch.js');
375
+ await advanceEpoch(options.l1RpcUrl, options.rpcUrl, log);
376
+ });
377
+
378
+ program
379
+ .command('prover-stats', { hidden: true })
380
+ .requiredOption(
381
+ '--l1-rpc-url <string>',
382
+ 'Url of the ethereum host. Chain identifiers localhost and testnet can be used',
383
+ ETHEREUM_HOST,
384
+ )
385
+ .addOption(l1ChainIdOption)
386
+ .option('--start-block <number>', 'The L1 block number to start from', parseBigint, 1n)
387
+ .option('--end-block <number>', 'The last L1 block number to query', parseBigint)
388
+ .option('--batch-size <number>', 'The number of blocks to query in each batch', parseBigint, 100n)
389
+ .option('--proving-timeout <number>', 'Cutoff for proving time to consider a block', parseBigint)
390
+ .option('--l1-rollup-address <string>', 'Address of the rollup contract (required if node URL is not set)')
391
+ .option(
392
+ '--node-url <string>',
393
+ 'JSON RPC URL of an Aztec node to retrieve the rollup contract address (required if L1 rollup address is not set)',
394
+ )
395
+ .option('--raw-logs', 'Output raw logs instead of aggregated stats')
396
+ .action(async options => {
397
+ const { proverStats } = await import('./prover_stats.js');
398
+ const { l1RpcUrl, chainId, l1RollupAddress, startBlock, endBlock, batchSize, nodeUrl, provingTimeout, rawLogs } =
399
+ options;
400
+ await proverStats({
401
+ l1RpcUrl,
402
+ chainId,
403
+ l1RollupAddress,
404
+ startBlock,
405
+ endBlock,
406
+ batchSize,
407
+ nodeUrl,
408
+ provingTimeout,
409
+ rawLogs,
410
+ log,
411
+ });
412
+ });
413
+
414
+ return program;
415
+ }