@aztec/cli 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.77.0-testnet-ignition.21

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 (191) hide show
  1. package/README.md +1 -1
  2. package/dest/cmds/contracts/index.d.ts +4 -0
  3. package/dest/cmds/contracts/index.d.ts.map +1 -0
  4. package/dest/cmds/contracts/inspect_contract.d.ts +3 -0
  5. package/dest/cmds/contracts/inspect_contract.d.ts.map +1 -0
  6. package/dest/cmds/contracts/inspect_contract.js +3 -3
  7. package/dest/cmds/contracts/parse_parameter_struct.d.ts +3 -0
  8. package/dest/cmds/contracts/parse_parameter_struct.d.ts.map +1 -0
  9. package/dest/cmds/devnet/bootstrap_network.d.ts +3 -0
  10. package/dest/cmds/devnet/bootstrap_network.d.ts.map +1 -0
  11. package/dest/cmds/devnet/bootstrap_network.js +13 -10
  12. package/dest/cmds/devnet/faucet.d.ts +4 -0
  13. package/dest/cmds/devnet/faucet.d.ts.map +1 -0
  14. package/dest/cmds/devnet/index.d.ts +4 -0
  15. package/dest/cmds/devnet/index.d.ts.map +1 -0
  16. package/dest/cmds/devnet/index.js +5 -3
  17. package/dest/cmds/infrastructure/index.d.ts +4 -0
  18. package/dest/cmds/infrastructure/index.d.ts.map +1 -0
  19. package/dest/cmds/infrastructure/index.js +8 -6
  20. package/dest/cmds/infrastructure/sequencers.d.ts +13 -0
  21. package/dest/cmds/infrastructure/sequencers.d.ts.map +1 -0
  22. package/dest/cmds/infrastructure/sequencers.js +5 -5
  23. package/dest/cmds/infrastructure/setup_l2_contract.d.ts +3 -0
  24. package/dest/cmds/infrastructure/setup_l2_contract.d.ts.map +1 -0
  25. package/dest/cmds/infrastructure/setup_l2_contract.js +43 -0
  26. package/dest/cmds/l1/advance_epoch.d.ts +3 -0
  27. package/dest/cmds/l1/advance_epoch.d.ts.map +1 -0
  28. package/dest/cmds/l1/advance_epoch.js +3 -3
  29. package/dest/cmds/l1/assume_proven_through.d.ts +3 -0
  30. package/dest/cmds/l1/assume_proven_through.d.ts.map +1 -0
  31. package/dest/cmds/l1/assume_proven_through.js +8 -8
  32. package/dest/cmds/l1/bridge_erc20.d.ts +4 -0
  33. package/dest/cmds/l1/bridge_erc20.d.ts.map +1 -0
  34. package/dest/cmds/l1/bridge_erc20.js +3 -3
  35. package/dest/cmds/l1/create_l1_account.d.ts +3 -0
  36. package/dest/cmds/l1/create_l1_account.d.ts.map +1 -0
  37. package/dest/cmds/l1/deploy_l1_contracts.d.ts +4 -0
  38. package/dest/cmds/l1/deploy_l1_contracts.d.ts.map +1 -0
  39. package/dest/cmds/l1/deploy_l1_contracts.js +7 -3
  40. package/dest/cmds/l1/deploy_l1_verifier.d.ts +5 -0
  41. package/dest/cmds/l1/deploy_l1_verifier.d.ts.map +1 -0
  42. package/dest/cmds/l1/deploy_l1_verifier.js +4 -4
  43. package/dest/cmds/l1/deploy_new_rollup.d.ts +4 -0
  44. package/dest/cmds/l1/deploy_new_rollup.d.ts.map +1 -0
  45. package/dest/cmds/l1/deploy_new_rollup.js +19 -0
  46. package/dest/cmds/l1/get_l1_addresses.d.ts +4 -0
  47. package/dest/cmds/l1/get_l1_addresses.d.ts.map +1 -0
  48. package/dest/cmds/l1/get_l1_addresses.js +18 -0
  49. package/dest/cmds/l1/get_l1_balance.d.ts +4 -0
  50. package/dest/cmds/l1/get_l1_balance.d.ts.map +1 -0
  51. package/dest/cmds/l1/get_l1_balance.js +4 -4
  52. package/dest/cmds/l1/governance_utils.d.ts +50 -0
  53. package/dest/cmds/l1/governance_utils.d.ts.map +1 -0
  54. package/dest/cmds/l1/governance_utils.js +85 -0
  55. package/dest/cmds/l1/index.d.ts +4 -0
  56. package/dest/cmds/l1/index.d.ts.map +1 -0
  57. package/dest/cmds/l1/index.js +108 -27
  58. package/dest/cmds/l1/prover_stats.d.ts +14 -0
  59. package/dest/cmds/l1/prover_stats.d.ts.map +1 -0
  60. package/dest/cmds/l1/prover_stats.js +6 -6
  61. package/dest/cmds/l1/update_l1_validators.d.ts +30 -0
  62. package/dest/cmds/l1/update_l1_validators.d.ts.map +1 -0
  63. package/dest/cmds/l1/update_l1_validators.js +22 -22
  64. package/dest/cmds/misc/compute_selector.d.ts +3 -0
  65. package/dest/cmds/misc/compute_selector.d.ts.map +1 -0
  66. package/dest/cmds/misc/compute_selector.js +1 -1
  67. package/dest/cmds/misc/example_contracts.d.ts +3 -0
  68. package/dest/cmds/misc/example_contracts.d.ts.map +1 -0
  69. package/dest/cmds/misc/generate_bootnode_enr.d.ts +3 -0
  70. package/dest/cmds/misc/generate_bootnode_enr.d.ts.map +1 -0
  71. package/dest/cmds/misc/generate_bootnode_enr.js +5 -0
  72. package/dest/cmds/misc/generate_p2p_private_key.d.ts +3 -0
  73. package/dest/cmds/misc/generate_p2p_private_key.d.ts.map +1 -0
  74. package/dest/cmds/misc/generate_secret_and_hash.d.ts +3 -0
  75. package/dest/cmds/misc/generate_secret_and_hash.d.ts.map +1 -0
  76. package/dest/cmds/misc/generate_secret_key.d.ts +5 -0
  77. package/dest/cmds/misc/generate_secret_key.d.ts.map +1 -0
  78. package/dest/cmds/misc/index.d.ts +4 -0
  79. package/dest/cmds/misc/index.d.ts.map +1 -0
  80. package/dest/cmds/misc/index.js +9 -1
  81. package/dest/cmds/misc/setup_contracts.d.ts +7 -0
  82. package/dest/cmds/misc/setup_contracts.d.ts.map +1 -0
  83. package/dest/cmds/misc/setup_contracts.js +5 -3
  84. package/dest/cmds/misc/update/common.d.ts +17 -0
  85. package/dest/cmds/misc/update/common.d.ts.map +1 -0
  86. package/dest/cmds/misc/update/github.d.ts +4 -0
  87. package/dest/cmds/misc/update/github.d.ts.map +1 -0
  88. package/dest/cmds/misc/update/noir.d.ts +10 -0
  89. package/dest/cmds/misc/update/noir.d.ts.map +1 -0
  90. package/dest/cmds/misc/update/npm.d.ts +34 -0
  91. package/dest/cmds/misc/update/npm.d.ts.map +1 -0
  92. package/dest/cmds/misc/update/utils.d.ts +14 -0
  93. package/dest/cmds/misc/update/utils.d.ts.map +1 -0
  94. package/dest/cmds/misc/update.d.ts +3 -0
  95. package/dest/cmds/misc/update.d.ts.map +1 -0
  96. package/dest/cmds/pxe/add_contract.d.ts +5 -0
  97. package/dest/cmds/pxe/add_contract.d.ts.map +1 -0
  98. package/dest/cmds/pxe/add_contract.js +6 -4
  99. package/dest/cmds/pxe/block_number.d.ts +3 -0
  100. package/dest/cmds/pxe/block_number.d.ts.map +1 -0
  101. package/dest/cmds/pxe/get_account.d.ts +4 -0
  102. package/dest/cmds/pxe/get_account.d.ts.map +1 -0
  103. package/dest/cmds/pxe/get_accounts.d.ts +3 -0
  104. package/dest/cmds/pxe/get_accounts.d.ts.map +1 -0
  105. package/dest/cmds/pxe/get_block.d.ts +3 -0
  106. package/dest/cmds/pxe/get_block.d.ts.map +1 -0
  107. package/dest/cmds/pxe/get_contract_data.d.ts +4 -0
  108. package/dest/cmds/pxe/get_contract_data.d.ts.map +1 -0
  109. package/dest/cmds/pxe/get_contract_data.js +1 -1
  110. package/dest/cmds/pxe/get_current_base_fee.d.ts +3 -0
  111. package/dest/cmds/pxe/get_current_base_fee.d.ts.map +1 -0
  112. package/dest/cmds/pxe/get_l1_to_l2_message_witness.d.ts +4 -0
  113. package/dest/cmds/pxe/get_l1_to_l2_message_witness.d.ts.map +1 -0
  114. package/dest/cmds/pxe/get_logs.d.ts +4 -0
  115. package/dest/cmds/pxe/get_logs.d.ts.map +1 -0
  116. package/dest/cmds/pxe/get_node_info.d.ts +3 -0
  117. package/dest/cmds/pxe/get_node_info.d.ts.map +1 -0
  118. package/dest/cmds/pxe/get_node_info.js +2 -2
  119. package/dest/cmds/pxe/get_pxe_info.d.ts +3 -0
  120. package/dest/cmds/pxe/get_pxe_info.d.ts.map +1 -0
  121. package/dest/cmds/pxe/index.d.ts +4 -0
  122. package/dest/cmds/pxe/index.d.ts.map +1 -0
  123. package/dest/cmds/pxe/index.js +1 -1
  124. package/dest/utils/aztec.d.ts +68 -0
  125. package/dest/utils/aztec.d.ts.map +1 -0
  126. package/dest/utils/aztec.js +34 -23
  127. package/dest/utils/commands.d.ts +143 -0
  128. package/dest/utils/commands.d.ts.map +1 -0
  129. package/dest/utils/commands.js +2 -2
  130. package/dest/utils/encoding.d.ts +15 -0
  131. package/dest/utils/encoding.d.ts.map +1 -0
  132. package/dest/utils/encoding.js +6 -13
  133. package/dest/utils/github.d.ts +4 -0
  134. package/dest/utils/github.d.ts.map +1 -0
  135. package/dest/utils/index.d.ts +5 -0
  136. package/dest/utils/index.d.ts.map +1 -0
  137. package/dest/utils/inspect.d.ts +17 -0
  138. package/dest/utils/inspect.d.ts.map +1 -0
  139. package/dest/utils/inspect.js +4 -4
  140. package/package.json +21 -20
  141. package/src/cmds/contracts/index.ts +2 -2
  142. package/src/cmds/contracts/inspect_contract.ts +5 -5
  143. package/src/cmds/contracts/parse_parameter_struct.ts +2 -2
  144. package/src/cmds/devnet/bootstrap_network.ts +24 -12
  145. package/src/cmds/devnet/faucet.ts +2 -2
  146. package/src/cmds/devnet/index.ts +16 -8
  147. package/src/cmds/infrastructure/index.ts +12 -11
  148. package/src/cmds/infrastructure/sequencers.ts +10 -7
  149. package/src/cmds/infrastructure/setup_l2_contract.ts +47 -0
  150. package/src/cmds/l1/advance_epoch.ts +4 -4
  151. package/src/cmds/l1/assume_proven_through.ts +8 -14
  152. package/src/cmds/l1/bridge_erc20.ts +5 -6
  153. package/src/cmds/l1/create_l1_account.ts +1 -1
  154. package/src/cmds/l1/deploy_l1_contracts.ts +13 -5
  155. package/src/cmds/l1/deploy_l1_verifier.ts +7 -7
  156. package/src/cmds/l1/deploy_new_rollup.ts +58 -0
  157. package/src/cmds/l1/get_l1_addresses.ts +30 -0
  158. package/src/cmds/l1/get_l1_balance.ts +9 -6
  159. package/src/cmds/l1/governance_utils.ts +187 -0
  160. package/src/cmds/l1/index.ts +238 -97
  161. package/src/cmds/l1/prover_stats.ts +21 -11
  162. package/src/cmds/l1/update_l1_validators.ts +25 -25
  163. package/src/cmds/misc/compute_selector.ts +2 -2
  164. package/src/cmds/misc/example_contracts.ts +1 -1
  165. package/src/cmds/misc/generate_bootnode_enr.ts +12 -0
  166. package/src/cmds/misc/generate_p2p_private_key.ts +1 -1
  167. package/src/cmds/misc/generate_secret_and_hash.ts +1 -1
  168. package/src/cmds/misc/index.ts +25 -3
  169. package/src/cmds/misc/setup_contracts.ts +6 -4
  170. package/src/cmds/misc/update/noir.ts +2 -2
  171. package/src/cmds/misc/update/npm.ts +2 -2
  172. package/src/cmds/misc/update/utils.ts +1 -1
  173. package/src/cmds/misc/update.ts +2 -2
  174. package/src/cmds/pxe/add_contract.ts +7 -5
  175. package/src/cmds/pxe/block_number.ts +1 -1
  176. package/src/cmds/pxe/get_account.ts +2 -2
  177. package/src/cmds/pxe/get_accounts.ts +1 -1
  178. package/src/cmds/pxe/get_block.ts +1 -1
  179. package/src/cmds/pxe/get_contract_data.ts +5 -3
  180. package/src/cmds/pxe/get_current_base_fee.ts +1 -1
  181. package/src/cmds/pxe/get_l1_to_l2_message_witness.ts +1 -1
  182. package/src/cmds/pxe/get_logs.ts +2 -2
  183. package/src/cmds/pxe/get_node_info.ts +3 -3
  184. package/src/cmds/pxe/get_pxe_info.ts +1 -1
  185. package/src/cmds/pxe/index.ts +3 -3
  186. package/src/utils/aztec.ts +74 -44
  187. package/src/utils/commands.ts +4 -4
  188. package/src/utils/encoding.ts +7 -13
  189. package/src/utils/inspect.ts +8 -7
  190. package/dest/cmds/infrastructure/setup_protocol_contract.js +0 -31
  191. package/src/cmds/infrastructure/setup_protocol_contract.ts +0 -36
@@ -1,10 +1,10 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
- import { type LogFn, type Logger } from '@aztec/foundation/log';
2
+ import type { LogFn, Logger } from '@aztec/foundation/log';
3
3
 
4
4
  import { type Command, Option } from 'commander';
5
5
 
6
6
  import {
7
- ETHEREUM_HOST,
7
+ ETHEREUM_HOSTS,
8
8
  PRIVATE_KEY,
9
9
  l1ChainIdOption,
10
10
  makePxeOption,
@@ -14,17 +14,22 @@ import {
14
14
  pxeOption,
15
15
  } from '../../utils/commands.js';
16
16
 
17
+ const l1RpcUrlsOption = new Option(
18
+ '--l1-rpc-urls <string>',
19
+ 'List of Ethereum host URLs. Chain identifiers localhost and testnet can be used (comma separated)',
20
+ )
21
+ .env('ETHEREUM_HOSTS')
22
+ .default([ETHEREUM_HOSTS])
23
+ .makeOptionMandatory(true)
24
+ .argParser((arg: string) => arg.split(',').map(url => url.trim()));
25
+
17
26
  export function injectCommands(program: Command, log: LogFn, debugLogger: Logger) {
18
27
  const { BB_BINARY_PATH, BB_WORKING_DIRECTORY } = process.env;
19
28
 
20
29
  program
21
30
  .command('deploy-l1-contracts')
22
31
  .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
- )
32
+ .addOption(l1RpcUrlsOption)
28
33
  .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
29
34
  .option('--validators <string>', 'Comma separated list of validators')
30
35
  .option(
@@ -36,18 +41,20 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
36
41
  .addOption(l1ChainIdOption)
37
42
  .option('--salt <number>', 'The optional salt to use in deployment', arg => parseInt(arg))
38
43
  .option('--json', 'Output the contract addresses in JSON format')
44
+ .option('--test-accounts', 'Populate genesis state with initial fee juice for test accounts')
39
45
  .action(async options => {
40
46
  const { deployL1Contracts } = await import('./deploy_l1_contracts.js');
41
47
 
42
48
  const initialValidators =
43
49
  options.validators?.split(',').map((validator: string) => EthAddress.fromString(validator)) || [];
44
50
  await deployL1Contracts(
45
- options.rpcUrl,
51
+ options.l1RpcUrls,
46
52
  options.l1ChainId,
47
53
  options.privateKey,
48
54
  options.mnemonic,
49
55
  options.mnemonicIndex,
50
56
  options.salt,
57
+ options.testAccounts,
51
58
  options.json,
52
59
  initialValidators,
53
60
  log,
@@ -55,6 +62,204 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
55
62
  );
56
63
  });
57
64
 
65
+ program
66
+ .command('deploy-new-rollup')
67
+ .description('Deploys a new rollup contract and a payload to upgrade the registry with it.')
68
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
69
+ .addOption(l1RpcUrlsOption)
70
+ .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
71
+ .option('--validators <string>', 'Comma separated list of validators')
72
+ .option(
73
+ '-m, --mnemonic <string>',
74
+ 'The mnemonic to use in deployment',
75
+ 'test test test test test test test test test test test junk',
76
+ )
77
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use in deployment', arg => parseInt(arg), 0)
78
+ .addOption(l1ChainIdOption)
79
+ .option('--salt <number>', 'The optional salt to use in deployment', arg => parseInt(arg))
80
+ .option('--json', 'Output the contract addresses in JSON format')
81
+ .option('--test-accounts', 'Populate genesis state with initial fee juice for test accounts')
82
+ .action(async options => {
83
+ const { deployNewRollup } = await import('./deploy_new_rollup.js');
84
+
85
+ const initialValidators =
86
+ options.validators?.split(',').map((validator: string) => EthAddress.fromString(validator)) || [];
87
+ await deployNewRollup(
88
+ options.registryAddress,
89
+ options.l1RpcUrls,
90
+ options.l1ChainId,
91
+ options.privateKey,
92
+ options.mnemonic,
93
+ options.mnemonicIndex,
94
+ options.salt,
95
+ options.testAccounts,
96
+ options.json,
97
+ initialValidators,
98
+ log,
99
+ debugLogger,
100
+ );
101
+ });
102
+
103
+ program
104
+ .command('deposit-governance-tokens')
105
+ .description('Deposits governance tokens to the governance contract.')
106
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
107
+ .requiredOption('--recipient <string>', 'The recipient of the tokens', parseEthereumAddress)
108
+ .requiredOption('-a, --amount <string>', 'The amount of tokens to deposit', parseBigint)
109
+ .option('--mint', 'Mint the tokens on L1', false)
110
+ .addOption(l1RpcUrlsOption)
111
+ .addOption(l1ChainIdOption)
112
+ .option('-p, --private-key <string>', 'The private key to use to deposit', PRIVATE_KEY)
113
+ .option(
114
+ '-m, --mnemonic <string>',
115
+ 'The mnemonic to use to deposit',
116
+ 'test test test test test test test test test test test junk',
117
+ )
118
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use to deposit', arg => parseInt(arg), 0)
119
+ .action(async options => {
120
+ const { depositGovernanceTokens } = await import('./governance_utils.js');
121
+ await depositGovernanceTokens({
122
+ registryAddress: options.registryAddress.toString(),
123
+ recipient: options.recipient.toString(),
124
+ amount: options.amount,
125
+ mint: options.mint,
126
+ rpcUrls: options.l1RpcUrls,
127
+ chainId: options.l1ChainId,
128
+ privateKey: options.privateKey,
129
+ mnemonic: options.mnemonic,
130
+ mnemonicIndex: options.mnemonicIndex,
131
+ debugLogger,
132
+ });
133
+ });
134
+
135
+ program
136
+ .command('propose-with-lock')
137
+ .description('Makes a proposal to governance with a lock')
138
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
139
+ .requiredOption('-p, --payload-address <string>', 'The address of the payload contract', parseEthereumAddress)
140
+ .addOption(l1RpcUrlsOption)
141
+ .addOption(l1ChainIdOption)
142
+ .option('-pk, --private-key <string>', 'The private key to use to propose', PRIVATE_KEY)
143
+ .option(
144
+ '-m, --mnemonic <string>',
145
+ 'The mnemonic to use to propose',
146
+ 'test test test test test test test test test test test junk',
147
+ )
148
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use to propose', arg => parseInt(arg), 0)
149
+ .option('--json', 'Output the proposal ID in JSON format')
150
+ .action(async options => {
151
+ const { proposeWithLock } = await import('./governance_utils.js');
152
+ await proposeWithLock({
153
+ payloadAddress: options.payloadAddress.toString(),
154
+ registryAddress: options.registryAddress.toString(),
155
+ rpcUrls: options.l1RpcUrls,
156
+ chainId: options.l1ChainId,
157
+ privateKey: options.privateKey,
158
+ mnemonic: options.mnemonic,
159
+ mnemonicIndex: options.mnemonicIndex,
160
+ debugLogger: debugLogger,
161
+ json: options.json,
162
+ log,
163
+ });
164
+ });
165
+
166
+ program
167
+ .command('vote-on-governance-proposal')
168
+ .description('Votes on a governance proposal.')
169
+ .requiredOption('-p, --proposal-id <string>', 'The ID of the proposal', parseBigint)
170
+ .option('-a, --vote-amount <string>', 'The amount of tokens to vote', parseBigint)
171
+ .requiredOption(
172
+ '--in-favor <boolean>',
173
+ 'Whether to vote in favor of the proposal. Use "yea" for true, any other value for false.',
174
+ arg => arg === 'yea' || arg === 'true' || arg === '1' || arg === 'yes',
175
+ )
176
+ .requiredOption('--wait <boolean>', 'Whether to wait until the proposal is active', arg => arg === 'true')
177
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
178
+ .addOption(l1RpcUrlsOption)
179
+ .addOption(l1ChainIdOption)
180
+ .option('-pk, --private-key <string>', 'The private key to use to vote', PRIVATE_KEY)
181
+ .option(
182
+ '-m, --mnemonic <string>',
183
+ 'The mnemonic to use to vote',
184
+ 'test test test test test test test test test test test junk',
185
+ )
186
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use to vote', arg => parseInt(arg), 0)
187
+ .action(async options => {
188
+ const { voteOnGovernanceProposal } = await import('./governance_utils.js');
189
+ await voteOnGovernanceProposal({
190
+ proposalId: options.proposalId,
191
+ voteAmount: options.voteAmount,
192
+ inFavor: options.inFavor,
193
+ waitTilActive: options.wait,
194
+ registryAddress: options.registryAddress.toString(),
195
+ rpcUrls: options.l1RpcUrls,
196
+ chainId: options.l1ChainId,
197
+ privateKey: options.privateKey,
198
+ mnemonic: options.mnemonic,
199
+ mnemonicIndex: options.mnemonicIndex,
200
+ debugLogger,
201
+ });
202
+ });
203
+
204
+ program
205
+ .command('execute-governance-proposal')
206
+ .description('Executes a governance proposal.')
207
+ .requiredOption('-p, --proposal-id <string>', 'The ID of the proposal', parseBigint)
208
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
209
+ .requiredOption('--wait <boolean>', 'Whether to wait until the proposal is executable', arg => arg === 'true')
210
+ .addOption(l1RpcUrlsOption)
211
+ .addOption(l1ChainIdOption)
212
+ .option('-pk, --private-key <string>', 'The private key to use to vote', PRIVATE_KEY)
213
+ .option(
214
+ '-m, --mnemonic <string>',
215
+ 'The mnemonic to use to vote',
216
+ 'test test test test test test test test test test test junk',
217
+ )
218
+ .option('-i, --mnemonic-index <number>', 'The index of the mnemonic to use to vote', arg => parseInt(arg), 0)
219
+ .action(async options => {
220
+ const { executeGovernanceProposal } = await import('./governance_utils.js');
221
+ await executeGovernanceProposal({
222
+ proposalId: options.proposalId,
223
+ registryAddress: options.registryAddress.toString(),
224
+ waitTilExecutable: options.wait,
225
+ rpcUrls: options.l1RpcUrls,
226
+ chainId: options.l1ChainId,
227
+ privateKey: options.privateKey,
228
+ mnemonic: options.mnemonic,
229
+ mnemonicIndex: options.mnemonicIndex,
230
+ debugLogger,
231
+ });
232
+ });
233
+
234
+ program
235
+ .command('get-l1-addresses')
236
+ .description('Gets the addresses of the L1 contracts.')
237
+ .requiredOption('-r, --registry-address <string>', 'The address of the registry contract', parseEthereumAddress)
238
+ .addOption(l1RpcUrlsOption)
239
+ .requiredOption('-v, --rollup-version <number>', 'The version of the rollup', arg => {
240
+ if (arg === 'canonical' || arg === 'latest' || arg === '') {
241
+ return 'canonical';
242
+ }
243
+ const version = parseInt(arg);
244
+ if (isNaN(version)) {
245
+ throw new Error('Invalid rollup version');
246
+ }
247
+ return version;
248
+ })
249
+ .addOption(l1ChainIdOption)
250
+ .option('--json', 'Output the addresses in JSON format')
251
+ .action(async options => {
252
+ const { getL1Addresses } = await import('./get_l1_addresses.js');
253
+ await getL1Addresses(
254
+ options.registryAddress,
255
+ options.rollupVersion,
256
+ options.l1RpcUrls,
257
+ options.l1ChainId,
258
+ options.json,
259
+ log,
260
+ );
261
+ });
262
+
58
263
  program
59
264
  .command('generate-l1-account')
60
265
  .description('Generates a new private key for an account on L1.')
@@ -68,11 +273,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
68
273
  program
69
274
  .command('add-l1-validator')
70
275
  .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
- )
276
+ .addOption(l1RpcUrlsOption)
76
277
  .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
77
278
  .option(
78
279
  '-m, --mnemonic <string>',
@@ -86,7 +287,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
86
287
  .action(async options => {
87
288
  const { addL1Validator } = await import('./update_l1_validators.js');
88
289
  await addL1Validator({
89
- rpcUrl: options.rpcUrl,
290
+ rpcUrls: options.l1RpcUrls,
90
291
  chainId: options.l1ChainId,
91
292
  privateKey: options.privateKey,
92
293
  mnemonic: options.mnemonic,
@@ -101,11 +302,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
101
302
  program
102
303
  .command('remove-l1-validator')
103
304
  .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
- )
305
+ .addOption(l1RpcUrlsOption)
109
306
  .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
110
307
  .option(
111
308
  '-m, --mnemonic <string>',
@@ -118,7 +315,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
118
315
  .action(async options => {
119
316
  const { removeL1Validator } = await import('./update_l1_validators.js');
120
317
  await removeL1Validator({
121
- rpcUrl: options.rpcUrl,
318
+ rpcUrls: options.l1RpcUrls,
122
319
  chainId: options.l1ChainId,
123
320
  privateKey: options.privateKey,
124
321
  mnemonic: options.mnemonic,
@@ -132,18 +329,14 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
132
329
  program
133
330
  .command('fast-forward-epochs')
134
331
  .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
- )
332
+ .addOption(l1RpcUrlsOption)
140
333
  .addOption(l1ChainIdOption)
141
334
  .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
142
335
  .option('--count <number>', 'The number of epochs to fast forward', arg => BigInt(parseInt(arg)), 1n)
143
336
  .action(async options => {
144
337
  const { fastForwardEpochs } = await import('./update_l1_validators.js');
145
338
  await fastForwardEpochs({
146
- rpcUrl: options.rpcUrl,
339
+ rpcUrls: options.l1RpcUrls,
147
340
  chainId: options.l1ChainId,
148
341
  rollupAddress: options.rollup,
149
342
  numEpochs: options.count,
@@ -155,17 +348,13 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
155
348
  program
156
349
  .command('debug-rollup')
157
350
  .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
- )
351
+ .addOption(l1RpcUrlsOption)
163
352
  .addOption(l1ChainIdOption)
164
353
  .option('--rollup <address>', 'ethereum address of the rollup contract', parseEthereumAddress)
165
354
  .action(async options => {
166
355
  const { debugRollup } = await import('./update_l1_validators.js');
167
356
  await debugRollup({
168
- rpcUrl: options.rpcUrl,
357
+ rpcUrls: options.l1RpcUrls,
169
358
  chainId: options.l1ChainId,
170
359
  privateKey: options.privateKey,
171
360
  mnemonic: options.mnemonic,
@@ -178,11 +367,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
178
367
  program
179
368
  .command('prune-rollup')
180
369
  .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
- )
370
+ .addOption(l1RpcUrlsOption)
186
371
  .option('-pk, --private-key <string>', 'The private key to use for deployment', PRIVATE_KEY)
187
372
  .option(
188
373
  '-m, --mnemonic <string>',
@@ -194,7 +379,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
194
379
  .action(async options => {
195
380
  const { pruneRollup } = await import('./update_l1_validators.js');
196
381
  await pruneRollup({
197
- rpcUrl: options.rpcUrl,
382
+ rpcUrls: options.rpcUrls,
198
383
  chainId: options.l1ChainId,
199
384
  privateKey: options.privateKey,
200
385
  mnemonic: options.mnemonic,
@@ -207,17 +392,8 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
207
392
  program
208
393
  .command('deploy-l1-verifier')
209
394
  .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
- )
395
+ .addOption(l1RpcUrlsOption)
396
+ .addOption(l1ChainIdOption)
221
397
  .addOption(makePxeOption(false).conflicts('rollup-address'))
222
398
  .addOption(
223
399
  new Option('--rollup-address <string>', 'The address of the rollup contract')
@@ -239,7 +415,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
239
415
  if (options.verifier === 'mock') {
240
416
  await deployMockVerifier(
241
417
  options.rollupAddress?.toString(),
242
- options.l1RpcUrl,
418
+ options.l1RpcUrls,
243
419
  options.l1ChainId,
244
420
  options.l1PrivateKey,
245
421
  options.mnemonic,
@@ -250,7 +426,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
250
426
  } else {
251
427
  await deployUltraHonkVerifier(
252
428
  options.rollupAddress?.toString(),
253
- options.l1RpcUrl,
429
+ options.l1RpcUrls,
254
430
  options.l1ChainId,
255
431
  options.l1PrivateKey,
256
432
  options.mnemonic,
@@ -268,11 +444,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
268
444
  .description('Bridges ERC20 tokens to L2.')
269
445
  .argument('<amount>', 'The amount of Fee Juice to mint and bridge.', parseBigint)
270
446
  .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
- )
447
+ .addOption(l1RpcUrlsOption)
276
448
  .option(
277
449
  '-m, --mnemonic <string>',
278
450
  'The mnemonic to use for deriving the Ethereum address that will mint and bridge',
@@ -290,7 +462,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
290
462
  await bridgeERC20(
291
463
  amount,
292
464
  recipient,
293
- options.l1RpcUrl,
465
+ options.l1RpcUrls,
294
466
  options.l1ChainId,
295
467
  options.l1PrivateKey,
296
468
  options.mnemonic,
@@ -316,17 +488,13 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
316
488
  .command('get-l1-balance')
317
489
  .description('Gets the balance of an ERC token in L1 for the given Ethereum address.')
318
490
  .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
- )
491
+ .addOption(l1RpcUrlsOption)
324
492
  .option('-t, --token <string>', 'The address of the token to check the balance of', parseEthereumAddress)
325
493
  .addOption(l1ChainIdOption)
326
494
  .option('--json', 'Output the balance in JSON format')
327
495
  .action(async (who, options) => {
328
496
  const { getL1Balance } = await import('./get_l1_balance.js');
329
- await getL1Balance(who, options.token, options.l1RpcUrl, options.l1ChainId, options.json, log);
497
+ await getL1Balance(who, options.token, options.l1RpcUrls, options.l1ChainId, options.json, log);
330
498
  });
331
499
 
332
500
  program
@@ -335,53 +503,26 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
335
503
  'Instructs the L1 rollup contract to assume all blocks until the given number are automatically proven.',
336
504
  )
337
505
  .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
- )
506
+ .addOption(l1RpcUrlsOption)
343
507
  .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
508
  .action(async (blockNumber, options) => {
352
509
  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
- );
510
+ await assumeProvenThrough(blockNumber, options.l1RpcUrls, options.rpcUrl, log);
362
511
  });
363
512
 
364
513
  program
365
514
  .command('advance-epoch')
366
515
  .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
- )
516
+ .addOption(l1RpcUrlsOption)
372
517
  .addOption(pxeOption)
373
518
  .action(async options => {
374
519
  const { advanceEpoch } = await import('./advance_epoch.js');
375
- await advanceEpoch(options.l1RpcUrl, options.rpcUrl, log);
520
+ await advanceEpoch(options.l1RpcUrls, options.rpcUrl, log);
376
521
  });
377
522
 
378
523
  program
379
524
  .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
- )
525
+ .addOption(l1RpcUrlsOption)
385
526
  .addOption(l1ChainIdOption)
386
527
  .option('--start-block <number>', 'The L1 block number to start from', parseBigint, 1n)
387
528
  .option('--end-block <number>', 'The last L1 block number to query', parseBigint)
@@ -395,10 +536,10 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger
395
536
  .option('--raw-logs', 'Output raw logs instead of aggregated stats')
396
537
  .action(async options => {
397
538
  const { proverStats } = await import('./prover_stats.js');
398
- const { l1RpcUrl, chainId, l1RollupAddress, startBlock, endBlock, batchSize, nodeUrl, provingTimeout, rawLogs } =
539
+ const { l1RpcUrls, chainId, l1RollupAddress, startBlock, endBlock, batchSize, nodeUrl, provingTimeout, rawLogs } =
399
540
  options;
400
541
  await proverStats({
401
- l1RpcUrl,
542
+ l1RpcUrls,
402
543
  chainId,
403
544
  l1RollupAddress,
404
545
  startBlock,
@@ -1,17 +1,17 @@
1
1
  import { retrieveL2ProofVerifiedEvents } from '@aztec/archiver';
2
- import { createAztecNodeClient } from '@aztec/circuit-types';
3
- import { EthAddress } from '@aztec/circuits.js';
4
- import { createEthereumChain } from '@aztec/ethereum';
2
+ import { type ViemPublicClient, createEthereumChain } from '@aztec/ethereum';
5
3
  import { compactArray, mapValues, unique } from '@aztec/foundation/collection';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
6
5
  import { type LogFn, type Logger, createLogger } from '@aztec/foundation/log';
7
6
  import { RollupAbi } from '@aztec/l1-artifacts';
7
+ import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
8
8
 
9
9
  import chunk from 'lodash.chunk';
10
10
  import groupBy from 'lodash.groupby';
11
- import { type PublicClient, createPublicClient, getAbiItem, getAddress, http } from 'viem';
11
+ import { createPublicClient, fallback, getAbiItem, getAddress, http } from 'viem';
12
12
 
13
13
  export async function proverStats(opts: {
14
- l1RpcUrl: string;
14
+ l1RpcUrls: string[];
15
15
  chainId: number;
16
16
  l1RollupAddress: string | undefined;
17
17
  nodeUrl: string | undefined;
@@ -23,8 +23,18 @@ export async function proverStats(opts: {
23
23
  rawLogs: boolean;
24
24
  }) {
25
25
  const debugLog = createLogger('cli:prover_stats');
26
- const { startBlock, chainId, l1RpcUrl, l1RollupAddress, batchSize, nodeUrl, provingTimeout, endBlock, rawLogs, log } =
27
- opts;
26
+ const {
27
+ startBlock,
28
+ chainId,
29
+ l1RpcUrls,
30
+ l1RollupAddress,
31
+ batchSize,
32
+ nodeUrl,
33
+ provingTimeout,
34
+ endBlock,
35
+ rawLogs,
36
+ log,
37
+ } = opts;
28
38
  if (!l1RollupAddress && !nodeUrl) {
29
39
  throw new Error('Either L1 rollup address or node URL must be set');
30
40
  }
@@ -35,8 +45,8 @@ export async function proverStats(opts: {
35
45
  .getL1ContractAddresses()
36
46
  .then(a => a.rollupAddress);
37
47
 
38
- const chain = createEthereumChain(l1RpcUrl, chainId).chainInfo;
39
- const publicClient = createPublicClient({ chain, transport: http(l1RpcUrl) });
48
+ const chain = createEthereumChain(l1RpcUrls, chainId).chainInfo;
49
+ const publicClient = createPublicClient({ chain, transport: fallback(l1RpcUrls.map(url => http(url))) });
40
50
  const lastBlockNum = endBlock ?? (await publicClient.getBlockNumber());
41
51
  debugLog.verbose(`Querying events on rollup at ${rollup.toString()} from ${startBlock} up to ${lastBlockNum}`);
42
52
 
@@ -146,7 +156,7 @@ async function getL2ProofVerifiedEvents(
146
156
  lastBlockNum: bigint,
147
157
  batchSize: bigint,
148
158
  debugLog: Logger,
149
- publicClient: PublicClient,
159
+ publicClient: ViemPublicClient,
150
160
  rollup: EthAddress,
151
161
  ) {
152
162
  let blockNum = startBlock;
@@ -166,7 +176,7 @@ async function getL2BlockEvents(
166
176
  lastBlockNum: bigint,
167
177
  batchSize: bigint,
168
178
  debugLog: Logger,
169
- publicClient: PublicClient,
179
+ publicClient: ViemPublicClient,
170
180
  rollup: EthAddress,
171
181
  ) {
172
182
  let blockNum = startBlock;