@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,14 @@
1
+ import { type LogFn } from '@aztec-labs/foundation/log';
2
+ export declare function proverStats(opts: {
3
+ l1RpcUrls: string[];
4
+ chainId: number;
5
+ l1RollupAddress: string | undefined;
6
+ nodeUrl: string | undefined;
7
+ log: LogFn;
8
+ startBlock: bigint;
9
+ endBlock: bigint | undefined;
10
+ batchSize: bigint;
11
+ provingTimeout: bigint | undefined;
12
+ rawLogs: boolean;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyX3N0YXRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY21kcy9sMS9wcm92ZXJfc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLEtBQUssS0FBSyxFQUE2QixNQUFNLDRCQUE0QixDQUFDO0FBTW5GLHdCQUFzQixXQUFXLENBQUMsSUFBSSxFQUFFO0lBQ3RDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLGVBQWUsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzVCLEdBQUcsRUFBRSxLQUFLLENBQUM7SUFDWCxVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFFBQVEsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsY0FBYyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkMsT0FBTyxFQUFFLE9BQU8sQ0FBQztDQUNsQixpQkEwSUEifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prover_stats.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/prover_stats.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,KAAK,EAA6B,MAAM,4BAA4B,CAAC;AAMnF,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,KAAK,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB,iBA0IA"}
@@ -0,0 +1,147 @@
1
+ import { RollupAbi } from '@aztec/l1-artifacts';
2
+ import { retrieveL2ProofVerifiedEvents } from '@aztec-labs/archiver';
3
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
4
+ import { compactArray, mapValues, unique } from '@aztec-labs/foundation/collection';
5
+ import { EthAddress } from '@aztec-labs/foundation/eth-address';
6
+ import { createLogger } from '@aztec-labs/foundation/log';
7
+ import { createAztecNodeClient } from '@aztec-labs/stdlib/interfaces/client';
8
+ import chunk from 'lodash.chunk';
9
+ import groupBy from 'lodash.groupby';
10
+ import { createPublicClient, fallback, getAbiItem, getAddress, http } from 'viem';
11
+ export async function proverStats(opts) {
12
+ const debugLog = createLogger('cli:prover_stats');
13
+ const { startBlock, chainId, l1RpcUrls, l1RollupAddress, batchSize, nodeUrl, provingTimeout, endBlock, rawLogs, log } = opts;
14
+ if (!l1RollupAddress && !nodeUrl) {
15
+ throw new Error('Either L1 rollup address or node URL must be set');
16
+ }
17
+ const rollup = l1RollupAddress ? EthAddress.fromString(l1RollupAddress) : await createAztecNodeClient(nodeUrl).getL1ContractAddresses().then((a)=>a.rollupAddress);
18
+ const chain = createEthereumChain(l1RpcUrls, chainId).chainInfo;
19
+ const publicClient = createPublicClient({
20
+ chain,
21
+ transport: fallback(l1RpcUrls.map((url)=>http(url, {
22
+ batch: false
23
+ })))
24
+ });
25
+ const lastBlockNum = endBlock ?? await publicClient.getBlockNumber();
26
+ debugLog.verbose(`Querying events on rollup at ${rollup.toString()} from ${startBlock} up to ${lastBlockNum}`);
27
+ // Get all events for L2 proof submissions
28
+ const events = await getL2ProofVerifiedEvents(startBlock, lastBlockNum, batchSize, debugLog, publicClient, rollup);
29
+ // If we only care for raw logs, output them
30
+ if (rawLogs && !provingTimeout) {
31
+ log(`l1_block_number, checkpoint_number, prover_id, tx_hash`);
32
+ for (const event of events){
33
+ const { l1BlockNumber, checkpointNumber, proverId, txHash } = event;
34
+ log(`${l1BlockNumber}, ${checkpointNumber}, ${proverId}, ${txHash}`);
35
+ }
36
+ return;
37
+ }
38
+ // If we don't have a proving timeout, we can just count the number of unique checkpoints per prover
39
+ if (!provingTimeout) {
40
+ const stats = groupBy(events, 'proverId');
41
+ log(`prover_id, total_checkpoints_proven`);
42
+ for(const proverId in stats){
43
+ const uniqueCheckpoints = new Set(stats[proverId].map((e)=>e.checkpointNumber));
44
+ log(`${proverId}, ${uniqueCheckpoints.size}`);
45
+ }
46
+ return;
47
+ }
48
+ // But if we do, fetch the events for each checkpoint submitted, so we can look up their timestamp
49
+ const checkpointEvents = await getCheckpointProposedEvents(startBlock, lastBlockNum, batchSize, debugLog, publicClient, rollup);
50
+ debugLog.verbose(`First checkpoint within range is ${checkpointEvents[0]?.args.checkpointNumber} at L1 block ${checkpointEvents[0]?.blockNumber}`);
51
+ // Get the timestamps for every block on every log, both for proof and block submissions
52
+ const l1BlockNumbers = unique([
53
+ ...events.map((e)=>e.l1BlockNumber),
54
+ ...checkpointEvents.map((e)=>e.blockNumber)
55
+ ]);
56
+ const l1BlockTimestamps = {};
57
+ for (const l1Batch of chunk(l1BlockNumbers, Number(batchSize))){
58
+ const blocks = await Promise.all(l1Batch.map((blockNumber)=>publicClient.getBlock({
59
+ includeTransactions: false,
60
+ blockNumber
61
+ })));
62
+ debugLog.verbose(`Queried ${blocks.length} L1 blocks between ${l1Batch[0]} and ${l1Batch[l1Batch.length - 1]}`);
63
+ for (const block of blocks){
64
+ l1BlockTimestamps[block.number.toString()] = block.timestamp;
65
+ }
66
+ }
67
+ // Map from checkpoint number to the l1 block in which it was submitted
68
+ const checkpointSubmissions = {};
69
+ for (const checkpointEvent of checkpointEvents){
70
+ checkpointSubmissions[checkpointEvent.args.checkpointNumber.toString()] = checkpointEvent.blockNumber;
71
+ }
72
+ // If we want raw logs, output them
73
+ if (rawLogs) {
74
+ log(`l1_block_number, checkpoint_number, checkpoint_submission_timestamp, proof_timestamp, prover_id, tx_hash`);
75
+ for (const event of events){
76
+ const { l1BlockNumber, checkpointNumber, proverId, txHash } = event;
77
+ const uploadedBlockNumber = checkpointSubmissions[checkpointNumber.toString()];
78
+ if (!uploadedBlockNumber) {
79
+ continue;
80
+ }
81
+ const uploadedTimestamp = l1BlockTimestamps[uploadedBlockNumber.toString()];
82
+ const provenTimestamp = l1BlockTimestamps[l1BlockNumber.toString()];
83
+ log(`${l1BlockNumber}, ${checkpointNumber}, ${uploadedTimestamp}, ${provenTimestamp}, ${proverId}, ${txHash}`);
84
+ }
85
+ return;
86
+ }
87
+ // Or calculate stats per prover
88
+ const stats = mapValues(groupBy(events, 'proverId'), (checkpoints, proverId)=>compactArray(checkpoints.map((e)=>{
89
+ const provenTimestamp = l1BlockTimestamps[e.l1BlockNumber.toString()];
90
+ const uploadedBlockNumber = checkpointSubmissions[e.checkpointNumber.toString()];
91
+ if (!uploadedBlockNumber) {
92
+ debugLog.verbose(`Skipping ${proverId}'s proof for checkpoint ${e.checkpointNumber} as it was before the start block`);
93
+ return undefined;
94
+ }
95
+ const uploadedTimestamp = l1BlockTimestamps[uploadedBlockNumber.toString()];
96
+ const provingTime = provenTimestamp - uploadedTimestamp;
97
+ debugLog.debug(`prover=${e.proverId} checkpointNumber=${e.checkpointNumber} uploaded=${uploadedTimestamp} proven=${provenTimestamp} time=${provingTime}`);
98
+ return {
99
+ provenTimestamp,
100
+ uploadedTimestamp,
101
+ provingTime,
102
+ ...e
103
+ };
104
+ })));
105
+ log(`prover_id, blocks_proven_within_timeout, total_blocks_proven, avg_proving_time`);
106
+ for(const proverId in stats){
107
+ const blocks = stats[proverId];
108
+ const withinTimeout = blocks.filter((b)=>b.provingTime <= provingTimeout);
109
+ const uniqueBlocksWithinTimeout = new Set(withinTimeout.map((e)=>e.checkpointNumber));
110
+ const uniqueBlocks = new Set(blocks.map((e)=>e.checkpointNumber));
111
+ const avgProvingTime = blocks.length === 0 ? 0 : Math.ceil(Number(blocks.reduce((acc, b)=>acc + b.provingTime, 0n)) / blocks.length);
112
+ log(`${proverId}, ${uniqueBlocksWithinTimeout.size}, ${uniqueBlocks.size}, ${avgProvingTime}`);
113
+ }
114
+ return;
115
+ }
116
+ async function getL2ProofVerifiedEvents(startBlock, lastBlockNum, batchSize, debugLog, publicClient, rollup) {
117
+ let blockNum = startBlock;
118
+ const events = [];
119
+ while(blockNum <= lastBlockNum){
120
+ const end = blockNum + batchSize > lastBlockNum + 1n ? lastBlockNum + 1n : blockNum + batchSize;
121
+ const newEvents = await retrieveL2ProofVerifiedEvents(publicClient, rollup, blockNum, end);
122
+ events.push(...newEvents);
123
+ debugLog.verbose(`Got ${newEvents.length} events querying l2 proof verified from block ${blockNum} to ${end}`);
124
+ blockNum += batchSize;
125
+ }
126
+ return events;
127
+ }
128
+ async function getCheckpointProposedEvents(startBlock, lastBlockNum, batchSize, debugLog, publicClient, rollup) {
129
+ let blockNum = startBlock;
130
+ const events = [];
131
+ while(blockNum <= lastBlockNum){
132
+ const end = blockNum + batchSize > lastBlockNum + 1n ? lastBlockNum + 1n : blockNum + batchSize;
133
+ const newEvents = await publicClient.getLogs({
134
+ address: getAddress(rollup.toString()),
135
+ event: getAbiItem({
136
+ abi: RollupAbi,
137
+ name: 'CheckpointProposed'
138
+ }),
139
+ fromBlock: blockNum,
140
+ toBlock: end
141
+ });
142
+ events.push(...newEvents);
143
+ debugLog.verbose(`Got ${newEvents.length} events querying checkpoints submitted from block ${blockNum} to ${end}`);
144
+ blockNum += batchSize;
145
+ }
146
+ return events;
147
+ }
@@ -0,0 +1,6 @@
1
+ import type { LogFn } from '@aztec-labs/foundation/log';
2
+ import type { RollupCommandArgs } from './update_l1_validators.js';
3
+ export declare function triggerSeedSnapshot({ rpcUrls, chainId, privateKey, mnemonic, rollupAddress, log }: RollupCommandArgs & {
4
+ log: LogFn;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcl9zZWVkX3NuYXBzaG90LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY21kcy9sMS90cmlnZ2VyX3NlZWRfc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHeEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSx3QkFBc0IsbUJBQW1CLENBQUMsRUFDeEMsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGFBQWEsRUFDYixHQUFHLEVBQ0osRUFBRSxpQkFBaUIsR0FBRztJQUFFLEdBQUcsRUFBRSxLQUFLLENBQUE7Q0FBRSxpQkFlcEMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger_seed_snapshot.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/trigger_seed_snapshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,wBAAsB,mBAAmB,CAAC,EACxC,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,aAAa,EACb,GAAG,EACJ,EAAE,iBAAiB,GAAG;IAAE,GAAG,EAAE,KAAK,CAAA;CAAE,iBAepC"}
@@ -0,0 +1,20 @@
1
+ import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
2
+ import { createEthereumChain } from '@aztec-labs/ethereum/chain';
3
+ import { createExtendedL1Client } from '@aztec-labs/ethereum/client';
4
+ import { getContract } from 'viem';
5
+ export async function triggerSeedSnapshot({ rpcUrls, chainId, privateKey, mnemonic, rollupAddress, log }) {
6
+ const chain = createEthereumChain(rpcUrls, chainId);
7
+ const client = createExtendedL1Client(rpcUrls, privateKey ?? mnemonic, chain.chainInfo);
8
+ const rollup = getContract({
9
+ address: rollupAddress.toString(),
10
+ abi: RollupAbi,
11
+ client
12
+ });
13
+ log('Triggering seed snapshot for next epoch');
14
+ const txHash = await rollup.write.checkpointRandao();
15
+ log(`Sent! | Seed snapshot setup for next epoch | tx hash: ${txHash}`);
16
+ const receipt = await client.waitForTransactionReceipt({
17
+ hash: txHash
18
+ });
19
+ log(`Done! | Seed snapshot setup for next epoch | tx hash: ${txHash} | status: ${receipt.status}`);
20
+ }
@@ -0,0 +1,45 @@
1
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
2
+ import type { LogFn, Logger } from '@aztec-labs/foundation/log';
3
+ export interface RollupCommandArgs {
4
+ rpcUrls: string[];
5
+ chainId: number;
6
+ privateKey?: string;
7
+ mnemonic?: string;
8
+ rollupAddress: EthAddress;
9
+ withdrawerAddress?: EthAddress;
10
+ }
11
+ export interface StakingAssetHandlerCommandArgs {
12
+ rpcUrls: string[];
13
+ chainId: number;
14
+ privateKey?: string;
15
+ mnemonic?: string;
16
+ stakingAssetHandlerAddress: EthAddress;
17
+ }
18
+ export interface LoggerArgs {
19
+ log: LogFn;
20
+ debugLogger: Logger;
21
+ }
22
+ export declare function generateL1Account(): {
23
+ privateKey: `0x${string}`;
24
+ address: `0x${string}`;
25
+ };
26
+ export declare function addL1Validator({ rpcUrls, chainId, privateKey, mnemonic, attesterAddress, withdrawerAddress, stakingAssetHandlerAddress, proofParams, blsSecretKey, log, debugLogger }: StakingAssetHandlerCommandArgs & LoggerArgs & {
27
+ blsSecretKey: bigint;
28
+ attesterAddress: EthAddress;
29
+ withdrawerAddress: EthAddress;
30
+ proofParams: Buffer;
31
+ }): Promise<void>;
32
+ export declare function addL1ValidatorViaRollup({ rpcUrls, chainId, privateKey, mnemonic, attesterAddress, withdrawerAddress, blsSecretKey, moveWithLatestRollup, rollupAddress, log, debugLogger }: RollupCommandArgs & LoggerArgs & {
33
+ blsSecretKey: bigint;
34
+ attesterAddress: EthAddress;
35
+ moveWithLatestRollup: boolean;
36
+ }): Promise<void>;
37
+ export declare function removeL1Validator({ rpcUrls, chainId, privateKey, mnemonic, validatorAddress, rollupAddress, log, debugLogger }: RollupCommandArgs & LoggerArgs & {
38
+ validatorAddress: EthAddress;
39
+ }): Promise<void>;
40
+ export declare function pruneRollup({ rpcUrls, chainId, privateKey, mnemonic, rollupAddress, log, debugLogger }: RollupCommandArgs & LoggerArgs): Promise<void>;
41
+ export declare function fastForwardEpochs({ rpcUrls, chainId, rollupAddress, numEpochs, log, debugLogger }: RollupCommandArgs & LoggerArgs & {
42
+ numEpochs: bigint;
43
+ }): Promise<void>;
44
+ export declare function debugRollup({ rpcUrls, chainId, rollupAddress, log }: RollupCommandArgs & LoggerArgs): Promise<void>;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlX2wxX3ZhbGlkYXRvcnMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbWRzL2wxL3VwZGF0ZV9sMV92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU1oRSxNQUFNLFdBQVcsaUJBQWlCO0lBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNwQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbEIsYUFBYSxFQUFFLFVBQVUsQ0FBQztJQUMxQixpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQztDQUNoQztBQUVELE1BQU0sV0FBVyw4QkFBOEI7SUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDaEIsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQiwwQkFBMEIsRUFBRSxVQUFVLENBQUM7Q0FDeEM7QUFFRCxNQUFNLFdBQVcsVUFBVTtJQUN6QixHQUFHLEVBQUUsS0FBSyxDQUFDO0lBQ1gsV0FBVyxFQUFFLE1BQU0sQ0FBQztDQUNyQjtBQUVELHdCQUFnQixpQkFBaUI7OztFQU9oQztBQUVELHdCQUFzQixjQUFjLENBQUMsRUFDbkMsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLFdBQVcsRUFDWCxZQUFZLEVBQ1osR0FBRyxFQUNILFdBQVcsRUFDWixFQUFFLDhCQUE4QixHQUMvQixVQUFVLEdBQUc7SUFDWCxZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLGVBQWUsRUFBRSxVQUFVLENBQUM7SUFDNUIsaUJBQWlCLEVBQUUsVUFBVSxDQUFDO0lBQzlCLFdBQVcsRUFBRSxNQUFNLENBQUM7Q0FDckIsaUJBd0ZGO0FBRUQsd0JBQXNCLHVCQUF1QixDQUFDLEVBQzVDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsVUFBVSxFQUNWLFFBQVEsRUFDUixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLEdBQUcsRUFDSCxXQUFXLEVBQ1osRUFBRSxpQkFBaUIsR0FDbEIsVUFBVSxHQUFHO0lBQ1gsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQixlQUFlLEVBQUUsVUFBVSxDQUFDO0lBQzVCLG9CQUFvQixFQUFFLE9BQU8sQ0FBQztDQUMvQixpQkF1REY7QUFFRCx3QkFBc0IsaUJBQWlCLENBQUMsRUFDdEMsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsRUFDWixFQUFFLGlCQUFpQixHQUFHLFVBQVUsR0FBRztJQUFFLGdCQUFnQixFQUFFLFVBQVUsQ0FBQTtDQUFFLGlCQWlCbkU7QUFFRCx3QkFBc0IsV0FBVyxDQUFDLEVBQ2hDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsVUFBVSxFQUNWLFFBQVEsRUFDUixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsRUFDWixFQUFFLGlCQUFpQixHQUFHLFVBQVUsaUJBZ0JoQztBQUVELHdCQUFzQixpQkFBaUIsQ0FBQyxFQUN0QyxPQUFPLEVBQ1AsT0FBTyxFQUNQLGFBQWEsRUFDYixTQUFTLEVBQ1QsR0FBRyxFQUNILFdBQVcsRUFDWixFQUFFLGlCQUFpQixHQUFHLFVBQVUsR0FBRztJQUFFLFNBQVMsRUFBRSxNQUFNLENBQUE7Q0FBRSxpQkF5QnhEO0FBRUQsd0JBQXNCLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixHQUFHLFVBQVUsaUJBd0J6RyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_l1_validators.d.ts","sourceRoot":"","sources":["../../../src/cmds/l1/update_l1_validators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAMhE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,UAAU,CAAC;IAC1B,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B,EAAE,UAAU,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,KAAK,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB;;;EAOhC;AAED,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,EACX,YAAY,EACZ,GAAG,EACH,WAAW,EACZ,EAAE,8BAA8B,GAC/B,UAAU,GAAG;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,UAAU,CAAC;IAC5B,iBAAiB,EAAE,UAAU,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,iBAwFF;AAED,wBAAsB,uBAAuB,CAAC,EAC5C,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,GAAG,EACH,WAAW,EACZ,EAAE,iBAAiB,GAClB,UAAU,GAAG;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,UAAU,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,iBAuDF;AAED,wBAAsB,iBAAiB,CAAC,EACtC,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,GAAG,EACH,WAAW,EACZ,EAAE,iBAAiB,GAAG,UAAU,GAAG;IAAE,gBAAgB,EAAE,UAAU,CAAA;CAAE,iBAiBnE;AAED,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAQ,EACR,aAAa,EACb,GAAG,EACH,WAAW,EACZ,EAAE,iBAAiB,GAAG,UAAU,iBAgBhC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,OAAO,EACP,OAAO,EACP,aAAa,EACb,SAAS,EACT,GAAG,EACH,WAAW,EACZ,EAAE,iBAAiB,GAAG,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAyBxD;AAED,wBAAsB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,iBAAiB,GAAG,UAAU,iBAwBzG"}
@@ -0,0 +1,280 @@
1
+ import { RollupAbi, StakingAssetHandlerAbi, TestERC20Abi } from '@aztec/l1-artifacts';
2
+ import { createEthereumChain, isAnvilTestChain } from '@aztec-labs/ethereum/chain';
3
+ import { createExtendedL1Client, getPublicClient } from '@aztec-labs/ethereum/client';
4
+ import { getL1ContractsConfigEnvVars } from '@aztec-labs/ethereum/config';
5
+ import { GSEContract, RollupContract } from '@aztec-labs/ethereum/contracts';
6
+ import { createL1TxUtils } from '@aztec-labs/ethereum/l1-tx-utils';
7
+ import { EthCheatCodes } from '@aztec-labs/ethereum/test';
8
+ import { DateProvider } from '@aztec-labs/foundation/timer';
9
+ import { ZkPassportProofParams } from '@aztec-labs/stdlib/zkpassport';
10
+ import { encodeFunctionData, formatEther, getContract, maxUint256 } from 'viem';
11
+ import { generatePrivateKey, mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
12
+ export function generateL1Account() {
13
+ const privateKey = generatePrivateKey();
14
+ const account = privateKeyToAccount(privateKey);
15
+ return {
16
+ privateKey,
17
+ address: account.address
18
+ };
19
+ }
20
+ export async function addL1Validator({ rpcUrls, chainId, privateKey, mnemonic, attesterAddress, withdrawerAddress, stakingAssetHandlerAddress, proofParams, blsSecretKey, log, debugLogger }) {
21
+ const dualLog = makeDualLog(log, debugLogger);
22
+ const account = getAccount(privateKey, mnemonic);
23
+ const chain = createEthereumChain(rpcUrls, chainId);
24
+ const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
25
+ const stakingAssetHandler = getContract({
26
+ address: stakingAssetHandlerAddress.toString(),
27
+ abi: StakingAssetHandlerAbi,
28
+ client: l1Client
29
+ });
30
+ const rollupAddress = await stakingAssetHandler.read.getRollup();
31
+ dualLog(`Adding validator ${attesterAddress} to rollup ${rollupAddress.toString()}`);
32
+ const rollup = getContract({
33
+ address: rollupAddress,
34
+ abi: RollupAbi,
35
+ client: l1Client
36
+ });
37
+ const gseAddress = await rollup.read.getGSE();
38
+ const gse = new GSEContract(l1Client, gseAddress);
39
+ const registrationTuple = await gse.makeRegistrationTuple(blsSecretKey);
40
+ const l1TxUtils = createL1TxUtils(l1Client, {
41
+ logger: debugLogger
42
+ });
43
+ const proofParamsObj = ZkPassportProofParams.fromBuffer(proofParams);
44
+ // Step 1: Claim STK tokens from the faucet
45
+ dualLog(`Claiming STK tokens from faucet`);
46
+ const { receipt: claimReceipt } = await l1TxUtils.sendAndMonitorTransaction({
47
+ to: stakingAssetHandlerAddress.toString(),
48
+ data: encodeFunctionData({
49
+ abi: StakingAssetHandlerAbi,
50
+ functionName: 'claim',
51
+ args: [
52
+ proofParamsObj.toViem()
53
+ ]
54
+ }),
55
+ abi: StakingAssetHandlerAbi
56
+ });
57
+ dualLog(`Claim transaction hash: ${claimReceipt.transactionHash}`);
58
+ await l1Client.waitForTransactionReceipt({
59
+ hash: claimReceipt.transactionHash
60
+ });
61
+ // Step 2: Approve the rollup to spend STK tokens
62
+ const stakingAssetAddress = await stakingAssetHandler.read.STAKING_ASSET();
63
+ dualLog(`Approving rollup to spend STK tokens`);
64
+ const { receipt: approveReceipt } = await l1TxUtils.sendAndMonitorTransaction({
65
+ to: stakingAssetAddress,
66
+ data: encodeFunctionData({
67
+ abi: TestERC20Abi,
68
+ functionName: 'approve',
69
+ args: [
70
+ rollupAddress,
71
+ maxUint256
72
+ ]
73
+ }),
74
+ abi: TestERC20Abi
75
+ });
76
+ await l1Client.waitForTransactionReceipt({
77
+ hash: approveReceipt.transactionHash
78
+ });
79
+ // Step 3: Deposit into the rollup to register as a validator
80
+ dualLog(`Depositing into rollup to register validator`);
81
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
82
+ to: rollupAddress,
83
+ data: encodeFunctionData({
84
+ abi: RollupAbi,
85
+ functionName: 'deposit',
86
+ args: [
87
+ attesterAddress.toString(),
88
+ withdrawerAddress.toString(),
89
+ registrationTuple.publicKeyInG1,
90
+ registrationTuple.publicKeyInG2,
91
+ registrationTuple.proofOfPossession,
92
+ false
93
+ ]
94
+ }),
95
+ abi: RollupAbi
96
+ });
97
+ dualLog(`Deposit transaction hash: ${receipt.transactionHash}`);
98
+ await l1Client.waitForTransactionReceipt({
99
+ hash: receipt.transactionHash
100
+ });
101
+ if (isAnvilTestChain(chainId)) {
102
+ dualLog(`Funding validator on L1`);
103
+ const cheatCodes = new EthCheatCodes(rpcUrls, new DateProvider(), debugLogger);
104
+ await cheatCodes.setBalance(attesterAddress, 10n ** 20n);
105
+ } else {
106
+ const balance = await l1Client.getBalance({
107
+ address: attesterAddress.toString()
108
+ });
109
+ dualLog(`Validator balance: ${formatEther(balance)} ETH`);
110
+ if (balance === 0n) {
111
+ dualLog(`WARNING: Proposer has no balance. Remember to fund it!`);
112
+ }
113
+ }
114
+ }
115
+ export async function addL1ValidatorViaRollup({ rpcUrls, chainId, privateKey, mnemonic, attesterAddress, withdrawerAddress, blsSecretKey, moveWithLatestRollup, rollupAddress, log, debugLogger }) {
116
+ const dualLog = makeDualLog(log, debugLogger);
117
+ const account = getAccount(privateKey, mnemonic);
118
+ const chain = createEthereumChain(rpcUrls, chainId);
119
+ const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
120
+ dualLog(`Adding validator ${attesterAddress} to rollup ${rollupAddress.toString()} via direct deposit`);
121
+ if (!withdrawerAddress) {
122
+ throw new Error(`Withdrawer address required`);
123
+ }
124
+ const rollup = getContract({
125
+ address: rollupAddress.toString(),
126
+ abi: RollupAbi,
127
+ client: l1Client
128
+ });
129
+ const gseAddress = await rollup.read.getGSE();
130
+ const gse = new GSEContract(l1Client, gseAddress);
131
+ const registrationTuple = await gse.makeRegistrationTuple(blsSecretKey);
132
+ const l1TxUtils = createL1TxUtils(l1Client, {
133
+ logger: debugLogger
134
+ });
135
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
136
+ to: rollupAddress.toString(),
137
+ data: encodeFunctionData({
138
+ abi: RollupAbi,
139
+ functionName: 'deposit',
140
+ args: [
141
+ attesterAddress.toString(),
142
+ withdrawerAddress.toString(),
143
+ registrationTuple.publicKeyInG1,
144
+ registrationTuple.publicKeyInG2,
145
+ registrationTuple.proofOfPossession,
146
+ moveWithLatestRollup
147
+ ]
148
+ }),
149
+ abi: StakingAssetHandlerAbi
150
+ });
151
+ dualLog(`Transaction hash: ${receipt.transactionHash}`);
152
+ await l1Client.waitForTransactionReceipt({
153
+ hash: receipt.transactionHash
154
+ });
155
+ if (isAnvilTestChain(chainId)) {
156
+ dualLog(`Funding validator on L1`);
157
+ const cheatCodes = new EthCheatCodes(rpcUrls, new DateProvider(), debugLogger);
158
+ await cheatCodes.setBalance(attesterAddress, 10n ** 20n);
159
+ } else {
160
+ const balance = await l1Client.getBalance({
161
+ address: attesterAddress.toString()
162
+ });
163
+ dualLog(`Validator balance: ${formatEther(balance)} ETH`);
164
+ if (balance === 0n) {
165
+ dualLog(`WARNING: Proposer has no balance. Remember to fund it!`);
166
+ }
167
+ }
168
+ }
169
+ export async function removeL1Validator({ rpcUrls, chainId, privateKey, mnemonic, validatorAddress, rollupAddress, log, debugLogger }) {
170
+ const dualLog = makeDualLog(log, debugLogger);
171
+ const account = getAccount(privateKey, mnemonic);
172
+ const chain = createEthereumChain(rpcUrls, chainId);
173
+ const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
174
+ const l1TxUtils = createL1TxUtils(l1Client, {
175
+ logger: debugLogger
176
+ });
177
+ dualLog(`Removing validator ${validatorAddress.toString()} from rollup ${rollupAddress.toString()}`);
178
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
179
+ to: rollupAddress.toString(),
180
+ data: encodeFunctionData({
181
+ abi: RollupAbi,
182
+ functionName: 'initiateWithdraw',
183
+ args: [
184
+ validatorAddress.toString(),
185
+ validatorAddress.toString()
186
+ ]
187
+ })
188
+ });
189
+ dualLog(`Transaction hash: ${receipt.transactionHash}`);
190
+ }
191
+ export async function pruneRollup({ rpcUrls, chainId, privateKey, mnemonic, rollupAddress, log, debugLogger }) {
192
+ const dualLog = makeDualLog(log, debugLogger);
193
+ const account = getAccount(privateKey, mnemonic);
194
+ const chain = createEthereumChain(rpcUrls, chainId);
195
+ const l1Client = createExtendedL1Client(rpcUrls, account, chain.chainInfo);
196
+ const l1TxUtils = createL1TxUtils(l1Client, {
197
+ logger: debugLogger
198
+ });
199
+ dualLog(`Trying prune`);
200
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
201
+ to: rollupAddress.toString(),
202
+ data: encodeFunctionData({
203
+ abi: RollupAbi,
204
+ functionName: 'prune'
205
+ })
206
+ });
207
+ dualLog(`Transaction hash: ${receipt.transactionHash}`);
208
+ }
209
+ export async function fastForwardEpochs({ rpcUrls, chainId, rollupAddress, numEpochs, log, debugLogger }) {
210
+ const dualLog = makeDualLog(log, debugLogger);
211
+ const publicClient = getPublicClient({
212
+ l1RpcUrls: rpcUrls,
213
+ l1ChainId: chainId
214
+ });
215
+ const rollup = getContract({
216
+ address: rollupAddress.toString(),
217
+ abi: RollupAbi,
218
+ client: publicClient
219
+ });
220
+ const cheatCodes = new EthCheatCodes(rpcUrls, new DateProvider(), debugLogger);
221
+ const currentSlot = await rollup.read.getCurrentSlot();
222
+ const l2SlotsInEpoch = await rollup.read.getEpochDuration();
223
+ const timestamp = await rollup.read.getTimestampForSlot([
224
+ currentSlot + l2SlotsInEpoch * numEpochs
225
+ ]);
226
+ dualLog(`Fast forwarding ${numEpochs} epochs to ${timestamp}`);
227
+ try {
228
+ await cheatCodes.warp(Number(timestamp), {
229
+ resetBlockInterval: true
230
+ });
231
+ dualLog(`Fast forwarded ${numEpochs} epochs to ${timestamp}`);
232
+ } catch (error) {
233
+ if (error instanceof Error && error.message.includes("is lower than or equal to previous block's timestamp")) {
234
+ dualLog(`Someone else fast forwarded the chain to a point after/equal to the target time`);
235
+ } else {
236
+ // Re-throw other errors
237
+ throw error;
238
+ }
239
+ }
240
+ }
241
+ export async function debugRollup({ rpcUrls, chainId, rollupAddress, log }) {
242
+ const config = getL1ContractsConfigEnvVars();
243
+ const publicClient = getPublicClient({
244
+ l1RpcUrls: rpcUrls,
245
+ l1ChainId: chainId
246
+ });
247
+ const rollup = new RollupContract(publicClient, rollupAddress);
248
+ const pendingNum = await rollup.getCheckpointNumber();
249
+ log(`Pending block num: ${pendingNum}`);
250
+ const provenNum = await rollup.getProvenCheckpointNumber();
251
+ log(`Proven block num: ${provenNum}`);
252
+ const validators = await rollup.getAttesters();
253
+ log(`Validators: ${validators.map((v)=>v.toString()).join(', ')}`);
254
+ const committee = await rollup.getCurrentEpochCommittee();
255
+ log(`Committee: ${committee?.map((v)=>v.toString()).join(', ')}`);
256
+ const archive = await rollup.archive();
257
+ log(`Archive: ${archive}`);
258
+ const epochNum = await rollup.getCurrentEpochNumber();
259
+ log(`Current epoch: ${epochNum}`);
260
+ const slot = await rollup.getSlotNumber();
261
+ log(`Current slot: ${slot}`);
262
+ const proposerDuringPrevL1Block = await rollup.getCurrentProposer();
263
+ log(`Proposer during previous L1 block: ${proposerDuringPrevL1Block}`);
264
+ const nextBlockTS = BigInt((await publicClient.getBlock()).timestamp + BigInt(config.ethereumSlotDuration));
265
+ const proposer = await rollup.getProposerAt(nextBlockTS);
266
+ log(`Proposer NOW: ${proposer.toString()}`);
267
+ }
268
+ function makeDualLog(log, debugLogger) {
269
+ return (msg)=>{
270
+ log(msg);
271
+ debugLogger.info(msg);
272
+ };
273
+ }
274
+ function getAccount(privateKey, mnemonic) {
275
+ if (!privateKey && !mnemonic) {
276
+ throw new Error('Either privateKey or mnemonic must be provided to create a wallet client');
277
+ }
278
+ const account = !privateKey ? mnemonicToAccount(mnemonic) : privateKeyToAccount(`${privateKey.startsWith('0x') ? '' : '0x'}${privateKey}`);
279
+ return account;
280
+ }
@@ -0,0 +1,3 @@
1
+ import type { LogFn } from '@aztec-labs/foundation/log';
2
+ export declare function generateEncodedBootnodeENR(privateKey: string, p2pIp: string, p2pPort: number, l1ChainId: number, log: LogFn): Promise<void>;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVfYm9vdG5vZGVfZW5yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY21kcy9taXNjL2dlbmVyYXRlX2Jvb3Rub2RlX2Vuci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCx3QkFBc0IsMEJBQTBCLENBQzlDLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLEtBQUssRUFBRSxNQUFNLEVBQ2IsT0FBTyxFQUFFLE1BQU0sRUFDZixTQUFTLEVBQUUsTUFBTSxFQUNqQixHQUFHLEVBQUUsS0FBSyxpQkFJWCJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_bootnode_enr.d.ts","sourceRoot":"","sources":["../../../src/cmds/misc/generate_bootnode_enr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGxD,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,KAAK,iBAIX"}
@@ -0,0 +1,5 @@
1
+ import { createBootnodeENRandPeerId } from '@aztec-labs/p2p/enr';
2
+ export async function generateEncodedBootnodeENR(privateKey, p2pIp, p2pPort, l1ChainId, log) {
3
+ const { enr } = await createBootnodeENRandPeerId(privateKey, p2pIp, p2pPort, l1ChainId);
4
+ log(`ENR: ${enr.encodeTxt()}`);
5
+ }
@@ -0,0 +1,3 @@
1
+ import type { LogFn } from '@aztec-labs/foundation/log';
2
+ export declare function generateP2PPrivateKey(log: LogFn): Promise<void>;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVfcDJwX3ByaXZhdGVfa2V5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY21kcy9taXNjL2dlbmVyYXRlX3AycF9wcml2YXRlX2tleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4RCx3QkFBc0IscUJBQXFCLENBQUMsR0FBRyxFQUFFLEtBQUssaUJBS3JEIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_p2p_private_key.d.ts","sourceRoot":"","sources":["../../../src/cmds/misc/generate_p2p_private_key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGxD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,KAAK,iBAKrD"}
@@ -0,0 +1,7 @@
1
+ import { createSecp256k1PeerId } from '@libp2p/peer-id-factory';
2
+ export async function generateP2PPrivateKey(log) {
3
+ const peerId = await createSecp256k1PeerId();
4
+ const exportedPeerId = Buffer.from(peerId.privateKey).toString('hex');
5
+ log(`Private key: ${exportedPeerId}`);
6
+ log(`Peer Id: ${peerId}`);
7
+ }
@@ -0,0 +1,5 @@
1
+ import { Fr } from '@aztec-labs/aztec.js/fields';
2
+ export declare function generateSecretKey(): {
3
+ secretKey: Fr;
4
+ };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVfc2VjcmV0X2tleS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NtZHMvbWlzYy9nZW5lcmF0ZV9zZWNyZXRfa2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRCx3QkFBZ0IsaUJBQWlCOztFQUVoQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_secret_key.d.ts","sourceRoot":"","sources":["../../../src/cmds/misc/generate_secret_key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAEjD,wBAAgB,iBAAiB;;EAEhC"}
@@ -0,0 +1,6 @@
1
+ import { Fr } from '@aztec-labs/aztec.js/fields';
2
+ export function generateSecretKey() {
3
+ return {
4
+ secretKey: Fr.random()
5
+ };
6
+ }
@@ -0,0 +1,4 @@
1
+ import type { LogFn } from '@aztec-labs/foundation/log';
2
+ import type { Command } from 'commander';
3
+ export declare function injectCommands(program: Command, log: LogFn): Command;
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbWRzL21pc2MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXpDLHdCQUFnQixjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxXQTZEMUQifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cmds/misc/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,WA6D1D"}
@@ -0,0 +1,32 @@
1
+ import { l1ChainIdOption, prettyPrintJSON } from '../../utils/commands.js';
2
+ export function injectCommands(program, log) {
3
+ program.command('generate-keys').summary('Generates encryption and signing private keys.').description('Generates and encryption and signing private key pair.').option('--json', 'Output the keys in JSON format').action(async ({ json })=>{
4
+ const { generateSecretKey } = await import('./generate_secret_key.js');
5
+ const { secretKey } = generateSecretKey();
6
+ if (json) {
7
+ log(prettyPrintJSON({
8
+ secretKey: secretKey.toString()
9
+ }));
10
+ } else {
11
+ log(`Secret Key: ${secretKey}`);
12
+ }
13
+ });
14
+ program.command('generate-p2p-private-key').summary('Generates a LibP2P peer private key.').description('Generates a private key that can be used for running a node on a LibP2P network.').action(async ()=>{
15
+ const { generateP2PPrivateKey } = await import('./generate_p2p_private_key.js');
16
+ await generateP2PPrivateKey(log);
17
+ });
18
+ program.command('generate-bootnode-enr').summary('Generates the encoded ENR record for a bootnode.').description('Generates the encoded ENR record for a bootnode.').argument('<privateKey>', 'The peer id private key of the bootnode').argument('<p2pIp>', 'The bootnode P2P IP address').argument('<p2pPort>', 'The bootnode P2P port').addOption(l1ChainIdOption).action(async (privateKey, p2pIp, p2pPort, options)=>{
19
+ const { generateEncodedBootnodeENR } = await import('./generate_bootnode_enr.js');
20
+ await generateEncodedBootnodeENR(privateKey, p2pIp, p2pPort, options.l1ChainId, log);
21
+ });
22
+ program.command('decode-enr').summary('Decodes an ENR record').description('Decodes and ENR record').argument('<enr>', 'The encoded ENR string').action(async (enr)=>{
23
+ const { printENR } = await import('@aztec-labs/p2p/enr');
24
+ await printENR(enr, log);
25
+ });
26
+ program.command('update').description('Updates Nodejs and Noir dependencies').argument('[projectPath]', 'Path to the project directory', process.cwd()).option('--contract [paths...]', 'Paths to contracts to update dependencies', []).option('--aztec-version <semver>', 'The version to update Aztec packages to. Defaults to latest', 'latest').action(async (projectPath, options)=>{
27
+ const { updateProject } = await import('./update.js');
28
+ const { contract, aztecVersion } = options;
29
+ await updateProject(projectPath, contract, aztecVersion, log);
30
+ });
31
+ return program;
32
+ }