@aztec-labs/cli 6.0.0-nightly.20260829

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 (227) hide show
  1. package/README.md +23 -0
  2. package/dest/cmds/aztec_node/block_number.d.ts +3 -0
  3. package/dest/cmds/aztec_node/block_number.d.ts.map +1 -0
  4. package/dest/cmds/aztec_node/block_number.js +10 -0
  5. package/dest/cmds/aztec_node/get_block.d.ts +3 -0
  6. package/dest/cmds/aztec_node/get_block.d.ts.map +1 -0
  7. package/dest/cmds/aztec_node/get_block.js +10 -0
  8. package/dest/cmds/aztec_node/get_current_min_fee.d.ts +3 -0
  9. package/dest/cmds/aztec_node/get_current_min_fee.d.ts.map +1 -0
  10. package/dest/cmds/aztec_node/get_current_min_fee.js +7 -0
  11. package/dest/cmds/aztec_node/get_l1_to_l2_message_witness.d.ts +5 -0
  12. package/dest/cmds/aztec_node/get_l1_to_l2_message_witness.d.ts.map +1 -0
  13. package/dest/cmds/aztec_node/get_l1_to_l2_message_witness.js +12 -0
  14. package/dest/cmds/aztec_node/get_logs.d.ts +33 -0
  15. package/dest/cmds/aztec_node/get_logs.d.ts.map +1 -0
  16. package/dest/cmds/aztec_node/get_logs.js +61 -0
  17. package/dest/cmds/aztec_node/get_node_info.d.ts +3 -0
  18. package/dest/cmds/aztec_node/get_node_info.d.ts.map +1 -0
  19. package/dest/cmds/aztec_node/get_node_info.js +58 -0
  20. package/dest/cmds/aztec_node/index.d.ts +4 -0
  21. package/dest/cmds/aztec_node/index.d.ts.map +1 -0
  22. package/dest/cmds/aztec_node/index.js +38 -0
  23. package/dest/cmds/infrastructure/index.d.ts +4 -0
  24. package/dest/cmds/infrastructure/index.d.ts.map +1 -0
  25. package/dest/cmds/infrastructure/index.js +22 -0
  26. package/dest/cmds/infrastructure/sequencers.d.ts +12 -0
  27. package/dest/cmds/infrastructure/sequencers.d.ts.map +1 -0
  28. package/dest/cmds/infrastructure/sequencers.js +113 -0
  29. package/dest/cmds/infrastructure/setup_l2_contract.d.ts +3 -0
  30. package/dest/cmds/infrastructure/setup_l2_contract.d.ts.map +1 -0
  31. package/dest/cmds/infrastructure/setup_l2_contract.js +35 -0
  32. package/dest/cmds/l1/advance_epoch.d.ts +3 -0
  33. package/dest/cmds/l1/advance_epoch.d.ts.map +1 -0
  34. package/dest/cmds/l1/advance_epoch.js +12 -0
  35. package/dest/cmds/l1/assume_proven_through.d.ts +4 -0
  36. package/dest/cmds/l1/assume_proven_through.d.ts.map +1 -0
  37. package/dest/cmds/l1/assume_proven_through.js +12 -0
  38. package/dest/cmds/l1/compute_genesis_values.d.ts +4 -0
  39. package/dest/cmds/l1/compute_genesis_values.d.ts.map +1 -0
  40. package/dest/cmds/l1/compute_genesis_values.js +17 -0
  41. package/dest/cmds/l1/create_l1_account.d.ts +3 -0
  42. package/dest/cmds/l1/create_l1_account.d.ts.map +1 -0
  43. package/dest/cmds/l1/create_l1_account.js +15 -0
  44. package/dest/cmds/l1/deploy_l1_contracts_cmd.d.ts +4 -0
  45. package/dest/cmds/l1/deploy_l1_contracts_cmd.d.ts.map +1 -0
  46. package/dest/cmds/l1/deploy_l1_contracts_cmd.js +80 -0
  47. package/dest/cmds/l1/deploy_new_rollup.d.ts +5 -0
  48. package/dest/cmds/l1/deploy_new_rollup.d.ts.map +1 -0
  49. package/dest/cmds/l1/deploy_new_rollup.js +26 -0
  50. package/dest/cmds/l1/get_l1_addresses.d.ts +4 -0
  51. package/dest/cmds/l1/get_l1_addresses.d.ts.map +1 -0
  52. package/dest/cmds/l1/get_l1_addresses.js +21 -0
  53. package/dest/cmds/l1/get_l1_balance.d.ts +4 -0
  54. package/dest/cmds/l1/get_l1_balance.d.ts.map +1 -0
  55. package/dest/cmds/l1/get_l1_balance.js +35 -0
  56. package/dest/cmds/l1/governance_utils.d.ts +50 -0
  57. package/dest/cmds/l1/governance_utils.d.ts.map +1 -0
  58. package/dest/cmds/l1/governance_utils.js +87 -0
  59. package/dest/cmds/l1/index.d.ts +4 -0
  60. package/dest/cmds/l1/index.d.ts.map +1 -0
  61. package/dest/cmds/l1/index.js +201 -0
  62. package/dest/cmds/l1/prover_stats.d.ts +14 -0
  63. package/dest/cmds/l1/prover_stats.d.ts.map +1 -0
  64. package/dest/cmds/l1/prover_stats.js +147 -0
  65. package/dest/cmds/l1/trigger_seed_snapshot.d.ts +6 -0
  66. package/dest/cmds/l1/trigger_seed_snapshot.d.ts.map +1 -0
  67. package/dest/cmds/l1/trigger_seed_snapshot.js +20 -0
  68. package/dest/cmds/l1/update_l1_validators.d.ts +45 -0
  69. package/dest/cmds/l1/update_l1_validators.d.ts.map +1 -0
  70. package/dest/cmds/l1/update_l1_validators.js +280 -0
  71. package/dest/cmds/misc/generate_bootnode_enr.d.ts +3 -0
  72. package/dest/cmds/misc/generate_bootnode_enr.d.ts.map +1 -0
  73. package/dest/cmds/misc/generate_bootnode_enr.js +5 -0
  74. package/dest/cmds/misc/generate_p2p_private_key.d.ts +3 -0
  75. package/dest/cmds/misc/generate_p2p_private_key.d.ts.map +1 -0
  76. package/dest/cmds/misc/generate_p2p_private_key.js +7 -0
  77. package/dest/cmds/misc/generate_secret_key.d.ts +5 -0
  78. package/dest/cmds/misc/generate_secret_key.d.ts.map +1 -0
  79. package/dest/cmds/misc/generate_secret_key.js +6 -0
  80. package/dest/cmds/misc/index.d.ts +4 -0
  81. package/dest/cmds/misc/index.d.ts.map +1 -0
  82. package/dest/cmds/misc/index.js +32 -0
  83. package/dest/cmds/misc/update/common.d.ts +17 -0
  84. package/dest/cmds/misc/update/common.d.ts.map +1 -0
  85. package/dest/cmds/misc/update/common.js +3 -0
  86. package/dest/cmds/misc/update/github.d.ts +3 -0
  87. package/dest/cmds/misc/update/github.d.ts.map +1 -0
  88. package/dest/cmds/misc/update/github.js +2 -0
  89. package/dest/cmds/misc/update/noir.d.ts +10 -0
  90. package/dest/cmds/misc/update/noir.d.ts.map +1 -0
  91. package/dest/cmds/misc/update/noir.js +45 -0
  92. package/dest/cmds/misc/update/npm.d.ts +34 -0
  93. package/dest/cmds/misc/update/npm.d.ts.map +1 -0
  94. package/dest/cmds/misc/update/npm.js +123 -0
  95. package/dest/cmds/misc/update/utils.d.ts +14 -0
  96. package/dest/cmds/misc/update/utils.d.ts.map +1 -0
  97. package/dest/cmds/misc/update/utils.js +38 -0
  98. package/dest/cmds/misc/update.d.ts +3 -0
  99. package/dest/cmds/misc/update.d.ts.map +1 -0
  100. package/dest/cmds/misc/update.js +51 -0
  101. package/dest/cmds/validator_keys/add.d.ts +5 -0
  102. package/dest/cmds/validator_keys/add.d.ts.map +1 -0
  103. package/dest/cmds/validator_keys/add.js +83 -0
  104. package/dest/cmds/validator_keys/eth_json_v3_worker.d.ts +2 -0
  105. package/dest/cmds/validator_keys/eth_json_v3_worker.d.ts.map +1 -0
  106. package/dest/cmds/validator_keys/eth_json_v3_worker.js +27 -0
  107. package/dest/cmds/validator_keys/generate_bls_keypair.d.ts +12 -0
  108. package/dest/cmds/validator_keys/generate_bls_keypair.d.ts.map +1 -0
  109. package/dest/cmds/validator_keys/generate_bls_keypair.js +27 -0
  110. package/dest/cmds/validator_keys/index.d.ts +4 -0
  111. package/dest/cmds/validator_keys/index.d.ts.map +1 -0
  112. package/dest/cmds/validator_keys/index.js +33 -0
  113. package/dest/cmds/validator_keys/new.d.ts +35 -0
  114. package/dest/cmds/validator_keys/new.d.ts.map +1 -0
  115. package/dest/cmds/validator_keys/new.js +220 -0
  116. package/dest/cmds/validator_keys/set_funding_account.d.ts +14 -0
  117. package/dest/cmds/validator_keys/set_funding_account.d.ts.map +1 -0
  118. package/dest/cmds/validator_keys/set_funding_account.js +37 -0
  119. package/dest/cmds/validator_keys/shared.d.ts +81 -0
  120. package/dest/cmds/validator_keys/shared.d.ts.map +1 -0
  121. package/dest/cmds/validator_keys/shared.js +352 -0
  122. package/dest/cmds/validator_keys/staker.d.ts +38 -0
  123. package/dest/cmds/validator_keys/staker.d.ts.map +1 -0
  124. package/dest/cmds/validator_keys/staker.js +210 -0
  125. package/dest/cmds/validator_keys/utils.d.ts +35 -0
  126. package/dest/cmds/validator_keys/utils.d.ts.map +1 -0
  127. package/dest/cmds/validator_keys/utils.js +86 -0
  128. package/dest/config/cached_fetch.d.ts +27 -0
  129. package/dest/config/cached_fetch.d.ts.map +1 -0
  130. package/dest/config/cached_fetch.js +132 -0
  131. package/dest/config/chain_l2_config.d.ts +19 -0
  132. package/dest/config/chain_l2_config.d.ts.map +1 -0
  133. package/dest/config/chain_l2_config.js +60 -0
  134. package/dest/config/enrich_env.d.ts +4 -0
  135. package/dest/config/enrich_env.d.ts.map +1 -0
  136. package/dest/config/enrich_env.js +12 -0
  137. package/dest/config/generated/networks.d.ts +236 -0
  138. package/dest/config/generated/networks.d.ts.map +1 -0
  139. package/dest/config/generated/networks.js +237 -0
  140. package/dest/config/get_l1_config.d.ts +9 -0
  141. package/dest/config/get_l1_config.d.ts.map +1 -0
  142. package/dest/config/get_l1_config.js +24 -0
  143. package/dest/config/index.d.ts +5 -0
  144. package/dest/config/index.d.ts.map +1 -0
  145. package/dest/config/index.js +4 -0
  146. package/dest/config/network_config.d.ts +22 -0
  147. package/dest/config/network_config.d.ts.map +1 -0
  148. package/dest/config/network_config.js +119 -0
  149. package/dest/utils/aztec.d.ts +56 -0
  150. package/dest/utils/aztec.d.ts.map +1 -0
  151. package/dest/utils/aztec.js +161 -0
  152. package/dest/utils/commands.d.ts +161 -0
  153. package/dest/utils/commands.d.ts.map +1 -0
  154. package/dest/utils/commands.js +341 -0
  155. package/dest/utils/encoding.d.ts +15 -0
  156. package/dest/utils/encoding.d.ts.map +1 -0
  157. package/dest/utils/encoding.js +103 -0
  158. package/dest/utils/github.d.ts +3 -0
  159. package/dest/utils/github.d.ts.map +1 -0
  160. package/dest/utils/github.js +2 -0
  161. package/dest/utils/index.d.ts +6 -0
  162. package/dest/utils/index.d.ts.map +1 -0
  163. package/dest/utils/index.js +5 -0
  164. package/dest/utils/inspect.d.ts +11 -0
  165. package/dest/utils/inspect.d.ts.map +1 -0
  166. package/dest/utils/inspect.js +90 -0
  167. package/dest/utils/setup_contracts.d.ts +3 -0
  168. package/dest/utils/setup_contracts.d.ts.map +1 -0
  169. package/dest/utils/setup_contracts.js +16 -0
  170. package/package.json +141 -0
  171. package/public_include_metric_prefixes.json +1 -0
  172. package/src/cmds/aztec_node/block_number.ts +9 -0
  173. package/src/cmds/aztec_node/get_block.ts +11 -0
  174. package/src/cmds/aztec_node/get_current_min_fee.ts +9 -0
  175. package/src/cmds/aztec_node/get_l1_to_l2_message_witness.ts +27 -0
  176. package/src/cmds/aztec_node/get_logs.ts +100 -0
  177. package/src/cmds/aztec_node/get_node_info.ts +61 -0
  178. package/src/cmds/aztec_node/index.ts +91 -0
  179. package/src/cmds/infrastructure/index.ts +51 -0
  180. package/src/cmds/infrastructure/sequencers.ts +122 -0
  181. package/src/cmds/infrastructure/setup_l2_contract.ts +40 -0
  182. package/src/cmds/l1/advance_epoch.ts +14 -0
  183. package/src/cmds/l1/assume_proven_through.ts +20 -0
  184. package/src/cmds/l1/compute_genesis_values.ts +29 -0
  185. package/src/cmds/l1/create_l1_account.ts +16 -0
  186. package/src/cmds/l1/deploy_l1_contracts_cmd.ts +105 -0
  187. package/src/cmds/l1/deploy_new_rollup.ts +65 -0
  188. package/src/cmds/l1/get_l1_addresses.ts +31 -0
  189. package/src/cmds/l1/get_l1_balance.ts +44 -0
  190. package/src/cmds/l1/governance_utils.ts +183 -0
  191. package/src/cmds/l1/index.ts +499 -0
  192. package/src/cmds/l1/prover_stats.ts +213 -0
  193. package/src/cmds/l1/trigger_seed_snapshot.ts +32 -0
  194. package/src/cmds/l1/update_l1_validators.ts +358 -0
  195. package/src/cmds/misc/generate_bootnode_enr.ts +13 -0
  196. package/src/cmds/misc/generate_p2p_private_key.ts +9 -0
  197. package/src/cmds/misc/generate_secret_key.ts +5 -0
  198. package/src/cmds/misc/index.ts +67 -0
  199. package/src/cmds/misc/update/common.ts +16 -0
  200. package/src/cmds/misc/update/github.ts +2 -0
  201. package/src/cmds/misc/update/noir.ts +56 -0
  202. package/src/cmds/misc/update/npm.ts +148 -0
  203. package/src/cmds/misc/update/utils.ts +49 -0
  204. package/src/cmds/misc/update.ts +71 -0
  205. package/src/cmds/validator_keys/add.ts +122 -0
  206. package/src/cmds/validator_keys/eth_json_v3_worker.ts +30 -0
  207. package/src/cmds/validator_keys/generate_bls_keypair.ts +33 -0
  208. package/src/cmds/validator_keys/index.ts +181 -0
  209. package/src/cmds/validator_keys/new.ts +326 -0
  210. package/src/cmds/validator_keys/set_funding_account.ts +54 -0
  211. package/src/cmds/validator_keys/shared.ts +414 -0
  212. package/src/cmds/validator_keys/staker.ts +300 -0
  213. package/src/cmds/validator_keys/utils.ts +124 -0
  214. package/src/config/cached_fetch.ts +154 -0
  215. package/src/config/chain_l2_config.ts +71 -0
  216. package/src/config/enrich_env.ts +15 -0
  217. package/src/config/generated/networks.ts +241 -0
  218. package/src/config/get_l1_config.ts +31 -0
  219. package/src/config/index.ts +4 -0
  220. package/src/config/network_config.ts +150 -0
  221. package/src/utils/aztec.ts +203 -0
  222. package/src/utils/commands.ts +434 -0
  223. package/src/utils/encoding.ts +117 -0
  224. package/src/utils/github.ts +2 -0
  225. package/src/utils/index.ts +5 -0
  226. package/src/utils/inspect.ts +111 -0
  227. package/src/utils/setup_contracts.ts +19 -0
@@ -0,0 +1,122 @@
1
+ import { RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts';
2
+
3
+ import { Fr } from '@aztec-labs/aztec.js/fields';
4
+ import { createAztecNodeClient } from '@aztec-labs/aztec.js/node';
5
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
6
+ import { getL1ContractsConfigEnvVars } from '@aztec-labs/ethereum/config';
7
+ import { GSEContract, RollupContract } from '@aztec-labs/ethereum/contracts';
8
+ import type { LogFn } from '@aztec-labs/foundation/log';
9
+ import { createPublicClient, createWalletClient, fallback, getContract, http } from 'viem';
10
+ import { mnemonicToAccount } from 'viem/accounts';
11
+
12
+ export async function sequencers(opts: {
13
+ command: 'list' | 'add' | 'remove' | 'who-next' | 'flush';
14
+ who?: string;
15
+ mnemonic?: string;
16
+ bn254SecretKey?: bigint;
17
+ nodeUrl: string;
18
+ l1RpcUrls: string[];
19
+ chainId: number;
20
+ log: LogFn;
21
+ }) {
22
+ const { command, who: maybeWho, mnemonic, bn254SecretKey, nodeUrl, l1RpcUrls, chainId, log } = opts;
23
+ const client = createAztecNodeClient(nodeUrl);
24
+ const { l1ContractAddresses } = await client.getNodeInfo();
25
+
26
+ const chain = createEthereumChain(l1RpcUrls, chainId);
27
+ const publicClient = createPublicClient({
28
+ chain: chain.chainInfo,
29
+ transport: fallback(l1RpcUrls.map(url => http(url, { batch: false }))),
30
+ });
31
+
32
+ const walletClient = mnemonic
33
+ ? createWalletClient({
34
+ account: mnemonicToAccount(mnemonic),
35
+ chain: chain.chainInfo,
36
+ transport: fallback(l1RpcUrls.map(url => http(url, { batch: false }))),
37
+ })
38
+ : undefined;
39
+
40
+ const rollup = new RollupContract(publicClient, l1ContractAddresses.rollupAddress);
41
+
42
+ const writeableRollup = walletClient
43
+ ? getContract({
44
+ address: l1ContractAddresses.rollupAddress.toString(),
45
+ abi: RollupAbi,
46
+ client: walletClient,
47
+ })
48
+ : undefined;
49
+
50
+ const who = (maybeWho as `0x{string}`) ?? walletClient?.account.address.toString();
51
+
52
+ if (command === 'list') {
53
+ const sequencers = await rollup.getAttesters();
54
+ if (sequencers.length === 0) {
55
+ log(`No sequencers registered on rollup`);
56
+ } else {
57
+ log(`Registered sequencers on rollup:`);
58
+ for (const sequencer of sequencers) {
59
+ log(' ' + sequencer.toString());
60
+ }
61
+ }
62
+ } else if (command === 'add') {
63
+ if (!who || !writeableRollup || !walletClient) {
64
+ throw new Error(`Missing sequencer address`);
65
+ }
66
+
67
+ log(`Adding ${who} as sequencer`);
68
+
69
+ const stakingAssetAddress = await rollup.getStakingAsset();
70
+ const stakingAsset = getContract({
71
+ address: stakingAssetAddress.toString(),
72
+ abi: TestERC20Abi,
73
+ client: walletClient,
74
+ });
75
+
76
+ const config = getL1ContractsConfigEnvVars();
77
+
78
+ const bn254SecretKeyFieldElement = bn254SecretKey ? new Fr(bn254SecretKey) : Fr.random();
79
+ const gseAddress = await rollup.getGSE();
80
+ const gseContract = new GSEContract(publicClient, gseAddress);
81
+ const registrationTuple = await gseContract.makeRegistrationTuple(bn254SecretKeyFieldElement.toBigInt());
82
+
83
+ await Promise.all(
84
+ [
85
+ await stakingAsset.write.mint([walletClient.account.address, config.activationThreshold], {} as any),
86
+ await stakingAsset.write.approve([rollup.address, config.activationThreshold], {} as any),
87
+ ].map(txHash => publicClient.waitForTransactionReceipt({ hash: txHash })),
88
+ );
89
+
90
+ const hash = await writeableRollup.write.deposit([
91
+ who,
92
+ who,
93
+ registrationTuple.publicKeyInG1,
94
+ registrationTuple.publicKeyInG2,
95
+ registrationTuple.proofOfPossession,
96
+ true,
97
+ ]);
98
+ await publicClient.waitForTransactionReceipt({ hash });
99
+ log(`Added in tx ${hash}`);
100
+ } else if (command === 'flush') {
101
+ if (!writeableRollup) {
102
+ throw new Error(`Missing sequencer address`);
103
+ }
104
+ log(`Flushing staking entry queue`);
105
+ const hash = await writeableRollup.write.flushEntryQueue();
106
+ await publicClient.waitForTransactionReceipt({ hash });
107
+ log(`Flushed staking entry queue in tx ${hash}`);
108
+ } else if (command === 'remove') {
109
+ if (!who || !writeableRollup) {
110
+ throw new Error(`Missing sequencer address`);
111
+ }
112
+ log(`Removing ${who} as sequencer`);
113
+ const hash = await writeableRollup.write.initiateWithdraw([who, who]);
114
+ await publicClient.waitForTransactionReceipt({ hash });
115
+ log(`Removed in tx ${hash}`);
116
+ } else if (command === 'who-next') {
117
+ const next = await rollup.getCurrentProposer();
118
+ log(`Sequencer expected to build is ${next}`);
119
+ } else {
120
+ throw new Error(`Unknown command ${command}`);
121
+ }
122
+ }
@@ -0,0 +1,40 @@
1
+ import { getInitialTestAccountsData } from '@aztec-labs/accounts/testing';
2
+ import { AztecAddress } from '@aztec-labs/aztec.js/addresses';
3
+ import type { WaitOpts } from '@aztec-labs/aztec.js/contracts';
4
+ import { createAztecNodeClient } from '@aztec-labs/aztec.js/node';
5
+ import { TxStatus } from '@aztec-labs/aztec.js/tx';
6
+ import { AccountManager } from '@aztec-labs/aztec.js/wallet';
7
+ import { jsonStringify } from '@aztec-labs/foundation/json-rpc';
8
+ import type { LogFn } from '@aztec-labs/foundation/log';
9
+ import { ProtocolContractAddress } from '@aztec-labs/protocol-contracts';
10
+ import { EmbeddedWallet } from '@aztec-labs/wallets/embedded';
11
+ import { createFundedInitializerlessAccounts } from '@aztec-labs/wallets/testing';
12
+
13
+ export async function setupL2Contracts(nodeUrl: string, testAccounts: boolean, json: boolean, log: LogFn) {
14
+ const waitOpts: WaitOpts = {
15
+ timeout: 180,
16
+ interval: 1,
17
+ // The embedded wallet defaults to PROPOSED, which can be dropped if its proposed block is pruned
18
+ // before the checkpoint lands. Wait for the checkpoint so serial setup is reliable.
19
+ waitForStatus: TxStatus.CHECKPOINTED,
20
+ };
21
+ log('setupL2Contracts: Wait options' + jsonStringify(waitOpts));
22
+ log('setupL2Contracts: Creating PXE client...');
23
+ const node = createAztecNodeClient(nodeUrl);
24
+ const wallet = await EmbeddedWallet.create(node);
25
+
26
+ let accountManagers: AccountManager[] = [];
27
+ if (testAccounts) {
28
+ log('setupL2Contracts: Creating test accounts...');
29
+ const initialAccountsData = await getInitialTestAccountsData();
30
+ accountManagers = await createFundedInitializerlessAccounts(wallet, initialAccountsData);
31
+ }
32
+
33
+ if (json) {
34
+ const toPrint: Record<string, AztecAddress> = { ...ProtocolContractAddress };
35
+ accountManagers.forEach((a, i) => {
36
+ toPrint[`testAccount${i}`] = a.address;
37
+ });
38
+ log(JSON.stringify(toPrint, null, 2));
39
+ }
40
+ }
@@ -0,0 +1,14 @@
1
+ import { createAztecNodeClient } from '@aztec-labs/aztec.js/node';
2
+ import { RollupCheatCodes } from '@aztec-labs/ethereum/test';
3
+ import type { LogFn } from '@aztec-labs/foundation/log';
4
+ import { DateProvider } from '@aztec-labs/foundation/timer';
5
+
6
+ export async function advanceEpoch(l1RpcUrls: string[], nodeUrl: string, log: LogFn) {
7
+ const aztecNode = createAztecNodeClient(nodeUrl);
8
+ const rollupAddress = await aztecNode.getNodeInfo().then(i => i.l1ContractAddresses.rollupAddress);
9
+
10
+ const cheat = RollupCheatCodes.create(l1RpcUrls, { rollupAddress }, new DateProvider());
11
+
12
+ await cheat.advanceToNextEpoch();
13
+ log(`Warped time to advance to next epoch`);
14
+ }
@@ -0,0 +1,20 @@
1
+ import { createAztecNodeClient } from '@aztec-labs/aztec.js/node';
2
+ import { RollupCheatCodes } from '@aztec-labs/ethereum/test';
3
+ import { CheckpointNumber } from '@aztec-labs/foundation/branded-types';
4
+ import type { LogFn } from '@aztec-labs/foundation/log';
5
+ import { DateProvider } from '@aztec-labs/foundation/timer';
6
+
7
+ export async function assumeProvenThrough(
8
+ checkpointOrLatest: CheckpointNumber | undefined,
9
+ l1RpcUrls: string[],
10
+ nodeUrl: string,
11
+ log: LogFn,
12
+ ) {
13
+ const aztecNode = createAztecNodeClient(nodeUrl);
14
+ const rollupAddress = await aztecNode.getNodeInfo().then(i => i.l1ContractAddresses.rollupAddress);
15
+
16
+ const rollupCheatCodes = RollupCheatCodes.create(l1RpcUrls, { rollupAddress }, new DateProvider());
17
+
18
+ await rollupCheatCodes.markAsProven(checkpointOrLatest);
19
+ log(`Assumed proven through checkpoint ${checkpointOrLatest ?? 'latest'}`);
20
+ }
@@ -0,0 +1,29 @@
1
+ import { getInitialTestAccountsData } from '@aztec-labs/accounts/testing';
2
+ import type { LogFn } from '@aztec-labs/foundation/log';
3
+ import { protocolContractsHash } from '@aztec-labs/protocol-contracts';
4
+ import { getGenesisValues } from '@aztec-labs/world-state/testing';
5
+
6
+ import { getSponsoredFPCAddress } from '../../utils/setup_contracts.js';
7
+
8
+ /** Computes and prints genesis values needed for L1 contract deployment. */
9
+ export async function computeGenesisValuesCmd(testAccounts: boolean, sponsoredFPC: boolean, log: LogFn) {
10
+ const initialAccounts = testAccounts ? await getInitialTestAccountsData() : [];
11
+ const sponsoredFPCAddresses = sponsoredFPC ? await getSponsoredFPCAddress() : [];
12
+ const initialFundedAccounts = initialAccounts.map(a => a.address).concat(sponsoredFPCAddresses);
13
+ const { genesisArchiveRoot } = await getGenesisValues(initialFundedAccounts);
14
+
15
+ const { getVKTreeRoot } = await import('@aztec-labs/noir-protocol-circuits-types/vk-tree');
16
+ const vkTreeRoot = getVKTreeRoot();
17
+
18
+ log(
19
+ JSON.stringify(
20
+ {
21
+ vkTreeRoot: vkTreeRoot.toString(),
22
+ protocolContractsHash: protocolContractsHash.toString(),
23
+ genesisArchiveRoot: genesisArchiveRoot.toString(),
24
+ },
25
+ null,
26
+ 2,
27
+ ),
28
+ );
29
+ }
@@ -0,0 +1,16 @@
1
+ import type { LogFn } from '@aztec-labs/foundation/log';
2
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
3
+
4
+ import { prettyPrintJSON } from '../../utils/commands.js';
5
+
6
+ export function createL1Account(json: boolean, log: LogFn) {
7
+ const privateKey = generatePrivateKey();
8
+ const account = privateKeyToAccount(privateKey);
9
+
10
+ if (json) {
11
+ log(prettyPrintJSON({ privateKey, address: account.address }));
12
+ } else {
13
+ log(`Private Key: ${privateKey}`);
14
+ log(`Address: ${account.address}`);
15
+ }
16
+ }
@@ -0,0 +1,105 @@
1
+ import { getInitialTestAccountsData } from '@aztec-labs/accounts/testing';
2
+ import type { EthAddress } from '@aztec-labs/aztec.js/addresses';
3
+ import { Fr } from '@aztec-labs/aztec.js/fields';
4
+ import { getL1ContractsConfigEnvVars } from '@aztec-labs/ethereum/config';
5
+ import { type Operator, deployAztecL1Contracts } from '@aztec-labs/ethereum/deploy-aztec-l1-contracts';
6
+ import { SecretValue } from '@aztec-labs/foundation/config';
7
+ import type { LogFn, Logger } from '@aztec-labs/foundation/log';
8
+ import { protocolContractsHash } from '@aztec-labs/protocol-contracts';
9
+ import { getGenesisValues } from '@aztec-labs/world-state/testing';
10
+ import { mnemonicToAccount } from 'viem/accounts';
11
+
12
+ import { addLeadingHex } from '../../utils/aztec.js';
13
+ import { getSponsoredFPCAddress } from '../../utils/setup_contracts.js';
14
+
15
+ export async function deployL1ContractsCmd(
16
+ rpcUrls: string[],
17
+ chainId: number,
18
+ privateKey: string | undefined,
19
+ mnemonic: string,
20
+ mnemonicIndex: number,
21
+ testAccounts: boolean,
22
+ sponsoredFPC: boolean,
23
+ json: boolean,
24
+ initialValidators: EthAddress[],
25
+ realVerifier: boolean,
26
+ existingToken: EthAddress | undefined,
27
+ log: LogFn,
28
+ debugLogger: Logger,
29
+ ) {
30
+ const config = getL1ContractsConfigEnvVars();
31
+
32
+ // Compute initial accounts for genesis (test accounts + sponsored FPC)
33
+ const initialAccounts = testAccounts ? await getInitialTestAccountsData() : [];
34
+ const sponsoredFPCAddress = sponsoredFPC ? await getSponsoredFPCAddress() : [];
35
+ const initialFundedAccounts = initialAccounts.map(a => a.address).concat(sponsoredFPCAddress);
36
+ const { genesisArchiveRoot, fundingNeeded } = await getGenesisValues(initialFundedAccounts);
37
+
38
+ // Get the VK tree root
39
+ const { getVKTreeRoot } = await import('@aztec-labs/noir-protocol-circuits-types/vk-tree');
40
+ const vkTreeRoot = getVKTreeRoot();
41
+
42
+ // Get private key (from direct input or mnemonic)
43
+ let deployerPrivateKey: `0x${string}`;
44
+ if (privateKey) {
45
+ deployerPrivateKey = addLeadingHex(privateKey);
46
+ } else {
47
+ const account = mnemonicToAccount(mnemonic!, { addressIndex: mnemonicIndex });
48
+ deployerPrivateKey = `0x${Buffer.from(account.getHdKey().privateKey!).toString('hex')}`;
49
+ }
50
+
51
+ // Prepare validator operators with bn254 keys
52
+ const initialValidatorOperators: Operator[] = initialValidators.map(a => ({
53
+ attester: a,
54
+ withdrawer: a,
55
+ bn254SecretKey: new SecretValue(Fr.random().toBigInt()),
56
+ }));
57
+
58
+ debugLogger.info('Deploying L1 contracts via Forge...');
59
+
60
+ // Deploy using l1-contracts Forge scripts
61
+ const { l1ContractAddresses, rollupVersion } = await deployAztecL1Contracts(rpcUrls[0], deployerPrivateKey, chainId, {
62
+ // Initial validators to add during deployment
63
+ initialValidators: initialValidatorOperators,
64
+ // Genesis config
65
+ vkTreeRoot,
66
+ protocolContractsHash,
67
+ genesisArchiveRoot,
68
+ // Deployment options
69
+ realVerifier,
70
+ ...config,
71
+ feeJuicePortalInitialBalance: fundingNeeded,
72
+ existingTokenAddress: existingToken,
73
+ });
74
+
75
+ debugLogger.info('Forge deployment complete', { rollupVersion });
76
+
77
+ if (json) {
78
+ log(
79
+ JSON.stringify(
80
+ Object.fromEntries(Object.entries(l1ContractAddresses).map(([k, v]) => [k, v?.toString() ?? 'Not deployed'])),
81
+ null,
82
+ 2,
83
+ ),
84
+ );
85
+ } else {
86
+ log(`Rollup Address: ${l1ContractAddresses.rollupAddress.toString()}`);
87
+ log(`Registry Address: ${l1ContractAddresses.registryAddress.toString()}`);
88
+ log(`GSE Address: ${l1ContractAddresses.gseAddress?.toString()}`);
89
+ log(`L1 -> L2 Inbox Address: ${l1ContractAddresses.inboxAddress.toString()}`);
90
+ log(`L2 -> L1 Outbox Address: ${l1ContractAddresses.outboxAddress.toString()}`);
91
+ log(`Fee Juice Address: ${l1ContractAddresses.feeJuiceAddress.toString()}`);
92
+ log(`Staking Asset Address: ${l1ContractAddresses.stakingAssetAddress.toString()}`);
93
+ log(`Fee Juice Portal Address: ${l1ContractAddresses.feeJuicePortalAddress.toString()}`);
94
+ log(`CoinIssuer Address: ${l1ContractAddresses.coinIssuerAddress.toString()}`);
95
+ log(`RewardDistributor Address: ${l1ContractAddresses.rewardDistributorAddress.toString()}`);
96
+ log(`GovernanceProposer Address: ${l1ContractAddresses.governanceProposerAddress.toString()}`);
97
+ log(`Governance Address: ${l1ContractAddresses.governanceAddress.toString()}`);
98
+ log(`FeeAssetHandler Address: ${l1ContractAddresses.feeAssetHandlerAddress?.toString()}`);
99
+ log(`StakingAssetHandler Address: ${l1ContractAddresses.stakingAssetHandlerAddress?.toString()}`);
100
+ log(`ZK Passport Verifier Address: ${l1ContractAddresses.zkPassportVerifierAddress?.toString()}`);
101
+ log(`Initial funded accounts: ${initialFundedAccounts.map(a => a.toString()).join(', ')}`);
102
+ log(`Initial validators: ${initialValidators.map(a => a.toString()).join(', ')}`);
103
+ log(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
104
+ }
105
+ }
@@ -0,0 +1,65 @@
1
+ import { getInitialTestAccountsData } from '@aztec-labs/accounts/testing';
2
+ import { getL1ContractsConfigEnvVars } from '@aztec-labs/ethereum/config';
3
+ import type { Operator } from '@aztec-labs/ethereum/deploy-aztec-l1-contracts';
4
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
5
+ import type { LogFn } from '@aztec-labs/foundation/log';
6
+ import { getGenesisValues } from '@aztec-labs/world-state/testing';
7
+
8
+ import { deployNewRollupContracts } from '../../utils/aztec.js';
9
+ import { getSponsoredFPCAddress } from '../../utils/setup_contracts.js';
10
+
11
+ export async function deployNewRollup(
12
+ registryAddress: EthAddress,
13
+ rpcUrls: string[],
14
+ chainId: number,
15
+ privateKey: string | undefined,
16
+ mnemonic: string,
17
+ mnemonicIndex: number,
18
+ testAccounts: boolean,
19
+ sponsoredFPC: boolean,
20
+ json: boolean,
21
+ initialValidators: Operator[],
22
+ realVerifier: boolean,
23
+ log: LogFn,
24
+ ) {
25
+ const config = getL1ContractsConfigEnvVars();
26
+
27
+ const initialAccounts = testAccounts ? await getInitialTestAccountsData() : [];
28
+ const sponsoredFPCAddress = sponsoredFPC ? await getSponsoredFPCAddress() : [];
29
+ const initialFundedAccounts = initialAccounts.map(a => a.address).concat(sponsoredFPCAddress);
30
+ const { genesisArchiveRoot, fundingNeeded } = await getGenesisValues(initialFundedAccounts);
31
+
32
+ const { rollup } = await deployNewRollupContracts(
33
+ registryAddress,
34
+ rpcUrls,
35
+ privateKey,
36
+ chainId,
37
+ mnemonic,
38
+ mnemonicIndex,
39
+ initialValidators,
40
+ genesisArchiveRoot,
41
+ fundingNeeded,
42
+ config,
43
+ realVerifier,
44
+ );
45
+
46
+ if (json) {
47
+ log(
48
+ JSON.stringify(
49
+ {
50
+ rollupAddress: rollup.address,
51
+ initialFundedAccounts: initialFundedAccounts.map(a => a.toString()),
52
+ initialValidators: initialValidators.map(a => a.attester.toString()),
53
+ genesisArchiveRoot: genesisArchiveRoot.toString(),
54
+ },
55
+ null,
56
+ 2,
57
+ ),
58
+ );
59
+ } else {
60
+ log(`Rollup Address: ${rollup.address}`);
61
+ log(`Initial funded accounts: ${initialFundedAccounts.map(a => a.toString()).join(', ')}`);
62
+ log(`Initial validators: ${initialValidators.map(a => a.attester.toString()).join(', ')}`);
63
+ log(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
64
+ }
65
+ }
@@ -0,0 +1,31 @@
1
+ import { EthAddress } from '@aztec-labs/aztec.js/addresses';
2
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
3
+ import { RegistryContract } from '@aztec-labs/ethereum/contracts';
4
+ import type { ViemPublicClient } from '@aztec-labs/ethereum/types';
5
+ import type { LogFn } from '@aztec-labs/foundation/log';
6
+ import { createPublicClient, fallback, http } from 'viem';
7
+
8
+ export async function getL1Addresses(
9
+ registryAddress: EthAddress,
10
+ rollupVersion: number | bigint | 'canonical',
11
+ rpcUrls: string[],
12
+ chainId: number,
13
+ json: boolean,
14
+ log: LogFn,
15
+ ) {
16
+ const chain = createEthereumChain(rpcUrls, chainId);
17
+ const publicClient: ViemPublicClient = createPublicClient({
18
+ chain: chain.chainInfo,
19
+ transport: fallback(rpcUrls.map(url => http(url, { batch: false }))),
20
+ pollingInterval: 100,
21
+ });
22
+ const addresses = await RegistryContract.collectAddresses(publicClient, registryAddress.toString(), rollupVersion);
23
+
24
+ if (json) {
25
+ log(JSON.stringify(addresses, null, 2));
26
+ } else {
27
+ for (const [key, value] of Object.entries(addresses)) {
28
+ log(`${key}: ${value.toString()}`);
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,44 @@
1
+ import { TestERC20Abi } from '@aztec/l1-artifacts';
2
+
3
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
4
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
5
+ import type { LogFn } from '@aztec-labs/foundation/log';
6
+ import { createPublicClient, fallback, 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
+ l1RpcUrls: string[],
14
+ chainId: number,
15
+ json: boolean,
16
+ log: LogFn,
17
+ ) {
18
+ const chain = createEthereumChain(l1RpcUrls, chainId);
19
+ const publicClient = createPublicClient({
20
+ chain: chain.chainInfo,
21
+ transport: fallback(l1RpcUrls.map(url => http(url, { batch: false }))),
22
+ });
23
+
24
+ let balance = 0n;
25
+ if (token) {
26
+ const gasL1 = getContract({
27
+ address: token.toString(),
28
+ abi: TestERC20Abi,
29
+ client: publicClient,
30
+ });
31
+
32
+ balance = await gasL1.read.balanceOf([who.toString()]);
33
+ } else {
34
+ balance = await publicClient.getBalance({
35
+ address: who.toString(),
36
+ });
37
+ }
38
+
39
+ if (json) {
40
+ log(prettyPrintJSON({ balance }));
41
+ } else {
42
+ log(`L1 balance of ${who.toString()} is ${balance.toString()}`);
43
+ }
44
+ }
@@ -0,0 +1,183 @@
1
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
2
+ import { createExtendedL1Client } from '@aztec-labs/ethereum/client';
3
+ import { FeeJuiceContract, GovernanceContract, ProposalState, RegistryContract } from '@aztec-labs/ethereum/contracts';
4
+ import type { LogFn, Logger } from '@aztec-labs/foundation/log';
5
+
6
+ export async function depositGovernanceTokens({
7
+ registryAddress,
8
+ rpcUrls,
9
+ chainId,
10
+ privateKey,
11
+ mnemonic,
12
+ mnemonicIndex,
13
+ recipient,
14
+ amount,
15
+ debugLogger,
16
+ mint,
17
+ }: {
18
+ registryAddress: `0x${string}`;
19
+ rpcUrls: string[];
20
+ chainId: number;
21
+ privateKey: string | undefined;
22
+ mnemonic: string;
23
+ mnemonicIndex: number;
24
+ recipient: `0x${string}`;
25
+ amount: bigint;
26
+ debugLogger: Logger;
27
+ mint: boolean;
28
+ }) {
29
+ debugLogger.info(`Depositing ${amount} governance tokens to ${recipient}`);
30
+ const chain = createEthereumChain(rpcUrls, chainId);
31
+ const extendedClient = createExtendedL1Client(
32
+ rpcUrls,
33
+ privateKey ?? mnemonic,
34
+ chain.chainInfo,
35
+ undefined,
36
+ mnemonicIndex,
37
+ );
38
+
39
+ const addresses = await RegistryContract.collectAddresses(extendedClient, registryAddress, 'canonical');
40
+ const governanceAddress = addresses.governanceAddress.toString();
41
+ const tokenAddress = addresses.stakingAssetAddress.toString();
42
+
43
+ const feeJuice = new FeeJuiceContract(tokenAddress, extendedClient);
44
+ const governance = new GovernanceContract(governanceAddress, extendedClient);
45
+ if (mint) {
46
+ await feeJuice.mint(recipient, amount);
47
+ debugLogger.info(`Minted ${amount} tokens to ${recipient}`);
48
+ }
49
+
50
+ await feeJuice.approve(governanceAddress, amount);
51
+ debugLogger.info(`Approved ${amount} tokens for governance`);
52
+
53
+ await governance.deposit(recipient, amount);
54
+ debugLogger.info(`Deposited ${amount} tokens to ${recipient}`);
55
+ }
56
+
57
+ export async function proposeWithLock({
58
+ payloadAddress,
59
+ registryAddress,
60
+ rpcUrls,
61
+ chainId,
62
+ privateKey,
63
+ mnemonic,
64
+ mnemonicIndex,
65
+ json,
66
+ debugLogger,
67
+ log,
68
+ }: {
69
+ payloadAddress: `0x${string}`;
70
+ registryAddress: `0x${string}`;
71
+ rpcUrls: string[];
72
+ chainId: number;
73
+ privateKey: string | undefined;
74
+ mnemonic: string;
75
+ mnemonicIndex: number;
76
+ debugLogger: Logger;
77
+ log: LogFn;
78
+ json: boolean;
79
+ }) {
80
+ debugLogger.info(`Proposing with lock from ${payloadAddress} to ${registryAddress}`);
81
+ const chain = createEthereumChain(rpcUrls, chainId);
82
+ const client = createExtendedL1Client(rpcUrls, privateKey ?? mnemonic, chain.chainInfo, undefined, mnemonicIndex);
83
+
84
+ const addresses = await RegistryContract.collectAddresses(client, registryAddress, 'canonical');
85
+ const governanceAddress = addresses.governanceAddress.toString();
86
+
87
+ const governance = new GovernanceContract(governanceAddress, client);
88
+
89
+ const proposalId = await governance.proposeWithLock({
90
+ payloadAddress,
91
+ withdrawAddress: client.account.address,
92
+ });
93
+ if (json) {
94
+ log(JSON.stringify({ proposalId: Number(proposalId) }, null, 2));
95
+ } else {
96
+ log(`Proposed with lock`);
97
+ log(`Proposal ID: ${proposalId}`);
98
+ }
99
+ }
100
+
101
+ export async function voteOnGovernanceProposal({
102
+ proposalId,
103
+ voteAmount,
104
+ inFavor,
105
+ waitTilActive,
106
+ registryAddress,
107
+ rpcUrls,
108
+ chainId,
109
+ privateKey,
110
+ mnemonic,
111
+ mnemonicIndex,
112
+ debugLogger,
113
+ }: {
114
+ proposalId: bigint;
115
+ voteAmount: bigint | undefined;
116
+ inFavor: boolean;
117
+ waitTilActive: boolean;
118
+ registryAddress: `0x${string}`;
119
+ rpcUrls: string[];
120
+ chainId: number;
121
+ privateKey: string | undefined;
122
+ mnemonic: string;
123
+ mnemonicIndex: number;
124
+ debugLogger: Logger;
125
+ }) {
126
+ debugLogger.info(
127
+ `Voting on proposal ${proposalId} with ${voteAmount ? voteAmount : 'all'} tokens in favor: ${inFavor}`,
128
+ );
129
+ const chain = createEthereumChain(rpcUrls, chainId);
130
+ const client = createExtendedL1Client(rpcUrls, privateKey ?? mnemonic, chain.chainInfo, undefined, mnemonicIndex);
131
+
132
+ const addresses = await RegistryContract.collectAddresses(client, registryAddress, 'canonical');
133
+ const governanceAddress = addresses.governanceAddress.toString();
134
+
135
+ const governance = new GovernanceContract(governanceAddress, client);
136
+ const state = await governance.getProposalState(proposalId);
137
+ if (state !== ProposalState.Active && !waitTilActive) {
138
+ debugLogger.warn(`Proposal is not active, but waitTilActive is false. Not voting.`);
139
+ return;
140
+ }
141
+
142
+ await governance.awaitProposalActive({ proposalId, logger: debugLogger });
143
+ await governance.vote({ proposalId, voteAmount, inFavor, retries: 10, logger: debugLogger });
144
+ }
145
+
146
+ export async function executeGovernanceProposal({
147
+ proposalId,
148
+ waitTilExecutable,
149
+ registryAddress,
150
+ rpcUrls,
151
+ chainId,
152
+ privateKey,
153
+ mnemonic,
154
+ mnemonicIndex,
155
+ debugLogger,
156
+ }: {
157
+ proposalId: bigint;
158
+ waitTilExecutable: boolean;
159
+ registryAddress: `0x${string}`;
160
+ rpcUrls: string[];
161
+ chainId: number;
162
+ privateKey: string | undefined;
163
+ mnemonic: string;
164
+ mnemonicIndex: number;
165
+ debugLogger: Logger;
166
+ }) {
167
+ debugLogger.info(`Executing proposal ${proposalId}`);
168
+ const chain = createEthereumChain(rpcUrls, chainId);
169
+ const client = createExtendedL1Client(rpcUrls, privateKey ?? mnemonic, chain.chainInfo, undefined, mnemonicIndex);
170
+
171
+ const addresses = await RegistryContract.collectAddresses(client, registryAddress, 'canonical');
172
+ const governanceAddress = addresses.governanceAddress.toString();
173
+
174
+ const governance = new GovernanceContract(governanceAddress, client);
175
+ const state = await governance.getProposalState(proposalId);
176
+ if (state !== ProposalState.Executable && !waitTilExecutable) {
177
+ debugLogger.warn(`Proposal is not executable, but waitTilExecutable is false. Not executing.`);
178
+ return;
179
+ }
180
+
181
+ await governance.awaitProposalExecutable({ proposalId, logger: debugLogger });
182
+ await governance.executeProposal({ proposalId, retries: 10, logger: debugLogger });
183
+ }