@aztec/ethereum 0.0.0-test.0 → 0.0.1-commit.0208eb9

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 (285) hide show
  1. package/dest/account.d.ts +2 -0
  2. package/dest/account.d.ts.map +1 -0
  3. package/dest/account.js +4 -0
  4. package/dest/chain.d.ts +1 -1
  5. package/dest/client.d.ts +6 -4
  6. package/dest/client.d.ts.map +1 -1
  7. package/dest/client.js +21 -3
  8. package/dest/config.d.ts +68 -23
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +145 -32
  11. package/dest/constants.d.ts +1 -1
  12. package/dest/contracts/empire_base.d.ts +25 -8
  13. package/dest/contracts/empire_base.d.ts.map +1 -1
  14. package/dest/contracts/empire_base.js +75 -2
  15. package/dest/contracts/empire_slashing_proposer.d.ts +67 -0
  16. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -0
  17. package/dest/contracts/empire_slashing_proposer.js +207 -0
  18. package/dest/contracts/errors.d.ts +7 -0
  19. package/dest/contracts/errors.d.ts.map +1 -0
  20. package/dest/contracts/errors.js +12 -0
  21. package/dest/contracts/fee_asset_handler.d.ts +20 -0
  22. package/dest/contracts/fee_asset_handler.d.ts.map +1 -0
  23. package/dest/contracts/fee_asset_handler.js +59 -0
  24. package/dest/contracts/fee_juice.d.ts +6 -7
  25. package/dest/contracts/fee_juice.d.ts.map +1 -1
  26. package/dest/contracts/fee_juice.js +27 -20
  27. package/dest/contracts/governance.d.ts +45 -32
  28. package/dest/contracts/governance.d.ts.map +1 -1
  29. package/dest/contracts/governance.js +98 -85
  30. package/dest/contracts/governance_proposer.d.ts +17 -13
  31. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  32. package/dest/contracts/governance_proposer.js +432 -26
  33. package/dest/contracts/gse.d.ts +32 -0
  34. package/dest/contracts/gse.d.ts.map +1 -0
  35. package/dest/contracts/gse.js +72 -0
  36. package/dest/contracts/inbox.d.ts +47 -0
  37. package/dest/contracts/inbox.d.ts.map +1 -0
  38. package/dest/contracts/inbox.js +80 -0
  39. package/dest/contracts/index.d.ts +11 -3
  40. package/dest/contracts/index.d.ts.map +1 -1
  41. package/dest/contracts/index.js +10 -2
  42. package/dest/contracts/log.d.ts +13 -0
  43. package/dest/contracts/log.d.ts.map +1 -0
  44. package/dest/contracts/log.js +1 -0
  45. package/dest/contracts/multicall.d.ts +21 -0
  46. package/dest/contracts/multicall.d.ts.map +1 -0
  47. package/dest/contracts/multicall.js +157 -0
  48. package/dest/contracts/outbox.d.ts +41 -0
  49. package/dest/contracts/outbox.d.ts.map +1 -0
  50. package/dest/contracts/outbox.js +86 -0
  51. package/dest/contracts/registry.d.ts +10 -5
  52. package/dest/contracts/registry.d.ts.map +1 -1
  53. package/dest/contracts/registry.js +44 -16
  54. package/dest/contracts/rollup.d.ts +297 -53
  55. package/dest/contracts/rollup.d.ts.map +1 -1
  56. package/dest/contracts/rollup.js +1127 -116
  57. package/dest/contracts/slasher_contract.d.ts +44 -0
  58. package/dest/contracts/slasher_contract.d.ts.map +1 -0
  59. package/dest/contracts/slasher_contract.js +75 -0
  60. package/dest/contracts/tally_slashing_proposer.d.ts +140 -0
  61. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -0
  62. package/dest/contracts/tally_slashing_proposer.js +320 -0
  63. package/dest/contracts/utils.d.ts +3 -0
  64. package/dest/contracts/utils.d.ts.map +1 -0
  65. package/dest/contracts/utils.js +11 -0
  66. package/dest/deploy_aztec_l1_contracts.d.ts +260 -0
  67. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  68. package/dest/deploy_aztec_l1_contracts.js +399 -0
  69. package/dest/deploy_l1_contract.d.ts +68 -0
  70. package/dest/deploy_l1_contract.d.ts.map +1 -0
  71. package/dest/deploy_l1_contract.js +312 -0
  72. package/dest/eth-signer/eth-signer.d.ts +21 -0
  73. package/dest/eth-signer/eth-signer.d.ts.map +1 -0
  74. package/dest/eth-signer/eth-signer.js +5 -0
  75. package/dest/eth-signer/index.d.ts +2 -0
  76. package/dest/eth-signer/index.d.ts.map +1 -0
  77. package/dest/eth-signer/index.js +1 -0
  78. package/dest/forwarder_proxy.d.ts +32 -0
  79. package/dest/forwarder_proxy.d.ts.map +1 -0
  80. package/dest/forwarder_proxy.js +93 -0
  81. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  82. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  83. package/dest/generated/l1-contracts-defaults.js +30 -0
  84. package/dest/l1_artifacts.d.ts +80735 -0
  85. package/dest/l1_artifacts.d.ts.map +1 -0
  86. package/dest/l1_artifacts.js +166 -0
  87. package/dest/l1_contract_addresses.d.ts +24 -4
  88. package/dest/l1_contract_addresses.d.ts.map +1 -1
  89. package/dest/l1_contract_addresses.js +25 -21
  90. package/dest/l1_reader.d.ts +4 -2
  91. package/dest/l1_reader.d.ts.map +1 -1
  92. package/dest/l1_reader.js +14 -8
  93. package/dest/l1_tx_utils/config.d.ts +59 -0
  94. package/dest/l1_tx_utils/config.d.ts.map +1 -0
  95. package/dest/l1_tx_utils/config.js +96 -0
  96. package/dest/l1_tx_utils/constants.d.ts +12 -0
  97. package/dest/l1_tx_utils/constants.d.ts.map +1 -0
  98. package/dest/l1_tx_utils/constants.js +39 -0
  99. package/dest/l1_tx_utils/factory.d.ts +24 -0
  100. package/dest/l1_tx_utils/factory.d.ts.map +1 -0
  101. package/dest/l1_tx_utils/factory.js +12 -0
  102. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  103. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  104. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  105. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  106. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  107. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  108. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  109. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  110. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  111. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  112. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  113. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  114. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  115. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  116. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +48 -0
  117. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  118. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  119. package/dest/l1_tx_utils/index-blobs.js +2 -0
  120. package/dest/l1_tx_utils/index.d.ts +12 -0
  121. package/dest/l1_tx_utils/index.d.ts.map +1 -0
  122. package/dest/l1_tx_utils/index.js +12 -0
  123. package/dest/l1_tx_utils/interfaces.d.ts +76 -0
  124. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
  125. package/dest/l1_tx_utils/interfaces.js +4 -0
  126. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  127. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  128. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  129. package/dest/l1_tx_utils/l1_tx_utils.d.ts +94 -0
  130. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
  131. package/dest/l1_tx_utils/l1_tx_utils.js +623 -0
  132. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
  133. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
  134. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
  135. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +83 -0
  136. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
  137. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +323 -0
  138. package/dest/l1_tx_utils/signer.d.ts +4 -0
  139. package/dest/l1_tx_utils/signer.d.ts.map +1 -0
  140. package/dest/l1_tx_utils/signer.js +16 -0
  141. package/dest/l1_tx_utils/types.d.ts +67 -0
  142. package/dest/l1_tx_utils/types.d.ts.map +1 -0
  143. package/dest/l1_tx_utils/types.js +26 -0
  144. package/dest/l1_tx_utils/utils.d.ts +4 -0
  145. package/dest/l1_tx_utils/utils.d.ts.map +1 -0
  146. package/dest/l1_tx_utils/utils.js +14 -0
  147. package/dest/l1_types.d.ts +6 -0
  148. package/dest/l1_types.d.ts.map +1 -0
  149. package/dest/l1_types.js +1 -0
  150. package/dest/publisher_manager.d.ts +16 -0
  151. package/dest/publisher_manager.d.ts.map +1 -0
  152. package/dest/publisher_manager.js +88 -0
  153. package/dest/queries.d.ts +5 -3
  154. package/dest/queries.d.ts.map +1 -1
  155. package/dest/queries.js +61 -12
  156. package/dest/test/chain_monitor.d.ts +75 -0
  157. package/dest/test/chain_monitor.d.ts.map +1 -0
  158. package/dest/test/chain_monitor.js +213 -0
  159. package/dest/test/delayed_tx_utils.d.ts +8 -3
  160. package/dest/test/delayed_tx_utils.d.ts.map +1 -1
  161. package/dest/test/delayed_tx_utils.js +13 -6
  162. package/dest/test/eth_cheat_codes.d.ts +229 -0
  163. package/dest/test/eth_cheat_codes.d.ts.map +1 -0
  164. package/dest/test/eth_cheat_codes.js +560 -0
  165. package/dest/test/eth_cheat_codes_with_state.d.ts +2 -2
  166. package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
  167. package/dest/test/eth_cheat_codes_with_state.js +1 -1
  168. package/dest/test/index.d.ts +4 -1
  169. package/dest/test/index.d.ts.map +1 -1
  170. package/dest/test/index.js +3 -0
  171. package/dest/test/rollup_cheat_codes.d.ts +90 -0
  172. package/dest/test/rollup_cheat_codes.d.ts.map +1 -0
  173. package/dest/test/rollup_cheat_codes.js +292 -0
  174. package/dest/test/start_anvil.d.ts +9 -1
  175. package/dest/test/start_anvil.d.ts.map +1 -1
  176. package/dest/test/start_anvil.js +16 -7
  177. package/dest/test/tx_delayer.d.ts +18 -7
  178. package/dest/test/tx_delayer.d.ts.map +1 -1
  179. package/dest/test/tx_delayer.js +97 -20
  180. package/dest/test/upgrade_utils.d.ts +6 -5
  181. package/dest/test/upgrade_utils.d.ts.map +1 -1
  182. package/dest/test/upgrade_utils.js +23 -16
  183. package/dest/types.d.ts +62 -8
  184. package/dest/types.d.ts.map +1 -1
  185. package/dest/types.js +3 -1
  186. package/dest/utils.d.ts +17 -3
  187. package/dest/utils.d.ts.map +1 -1
  188. package/dest/utils.js +107 -88
  189. package/dest/zkPassportVerifierAddress.d.ts +15 -0
  190. package/dest/zkPassportVerifierAddress.d.ts.map +1 -0
  191. package/dest/zkPassportVerifierAddress.js +11 -0
  192. package/package.json +51 -23
  193. package/src/account.ts +5 -0
  194. package/src/client.ts +43 -5
  195. package/src/config.ts +207 -41
  196. package/src/contracts/README.md +157 -0
  197. package/src/contracts/empire_base.ts +77 -7
  198. package/src/contracts/empire_slashing_proposer.ts +259 -0
  199. package/src/contracts/errors.ts +13 -0
  200. package/src/contracts/fee_asset_handler.ts +66 -0
  201. package/src/contracts/fee_juice.ts +29 -15
  202. package/src/contracts/governance.ts +90 -78
  203. package/src/contracts/governance_proposer.ts +75 -25
  204. package/src/contracts/gse.ts +88 -0
  205. package/src/contracts/inbox.ts +115 -0
  206. package/src/contracts/index.ts +10 -2
  207. package/src/contracts/log.ts +13 -0
  208. package/src/contracts/multicall.ts +158 -0
  209. package/src/contracts/outbox.ts +98 -0
  210. package/src/contracts/registry.ts +51 -26
  211. package/src/contracts/rollup.ts +879 -89
  212. package/src/contracts/slasher_contract.ts +89 -0
  213. package/src/contracts/tally_slashing_proposer.ts +322 -0
  214. package/src/contracts/utils.ts +14 -0
  215. package/src/deploy_aztec_l1_contracts.ts +623 -0
  216. package/src/deploy_l1_contract.ts +362 -0
  217. package/src/eth-signer/eth-signer.ts +25 -0
  218. package/src/eth-signer/index.ts +1 -0
  219. package/src/forwarder_proxy.ts +108 -0
  220. package/src/generated/l1-contracts-defaults.ts +32 -0
  221. package/src/l1_artifacts.ts +254 -0
  222. package/src/l1_contract_addresses.ts +49 -34
  223. package/src/l1_reader.ts +17 -9
  224. package/src/l1_tx_utils/README.md +177 -0
  225. package/src/l1_tx_utils/config.ts +161 -0
  226. package/src/l1_tx_utils/constants.ts +29 -0
  227. package/src/l1_tx_utils/factory.ts +64 -0
  228. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  229. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  230. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  231. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  232. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +119 -0
  233. package/src/l1_tx_utils/index-blobs.ts +2 -0
  234. package/src/l1_tx_utils/index.ts +14 -0
  235. package/src/l1_tx_utils/interfaces.ts +86 -0
  236. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  237. package/src/l1_tx_utils/l1_tx_utils.ts +738 -0
  238. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
  239. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +419 -0
  240. package/src/l1_tx_utils/signer.ts +28 -0
  241. package/src/l1_tx_utils/types.ts +85 -0
  242. package/src/l1_tx_utils/utils.ts +16 -0
  243. package/src/l1_types.ts +6 -0
  244. package/src/publisher_manager.ts +108 -0
  245. package/src/queries.ts +82 -16
  246. package/src/test/chain_monitor.ts +245 -0
  247. package/src/test/delayed_tx_utils.ts +34 -6
  248. package/src/test/eth_cheat_codes.ts +588 -0
  249. package/src/test/eth_cheat_codes_with_state.ts +1 -1
  250. package/src/test/index.ts +3 -0
  251. package/src/test/rollup_cheat_codes.ts +330 -0
  252. package/src/test/start_anvil.ts +24 -5
  253. package/src/test/tx_delayer.ts +130 -27
  254. package/src/test/upgrade_utils.ts +30 -21
  255. package/src/types.ts +71 -7
  256. package/src/utils.ts +133 -92
  257. package/src/zkPassportVerifierAddress.ts +15 -0
  258. package/dest/contracts/forwarder.d.ts +0 -24
  259. package/dest/contracts/forwarder.d.ts.map +0 -1
  260. package/dest/contracts/forwarder.js +0 -101
  261. package/dest/contracts/slashing_proposer.d.ts +0 -21
  262. package/dest/contracts/slashing_proposer.d.ts.map +0 -1
  263. package/dest/contracts/slashing_proposer.js +0 -47
  264. package/dest/deploy_l1_contracts.d.ts +0 -21210
  265. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  266. package/dest/deploy_l1_contracts.js +0 -687
  267. package/dest/eth_cheat_codes.d.ts +0 -147
  268. package/dest/eth_cheat_codes.d.ts.map +0 -1
  269. package/dest/eth_cheat_codes.js +0 -303
  270. package/dest/index.d.ts +0 -14
  271. package/dest/index.d.ts.map +0 -1
  272. package/dest/index.js +0 -13
  273. package/dest/l1_tx_utils.d.ts +0 -192
  274. package/dest/l1_tx_utils.d.ts.map +0 -1
  275. package/dest/l1_tx_utils.js +0 -641
  276. package/dest/l1_tx_utils_with_blobs.d.ts +0 -12
  277. package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
  278. package/dest/l1_tx_utils_with_blobs.js +0 -64
  279. package/src/contracts/forwarder.ts +0 -132
  280. package/src/contracts/slashing_proposer.ts +0 -51
  281. package/src/deploy_l1_contracts.ts +0 -948
  282. package/src/eth_cheat_codes.ts +0 -314
  283. package/src/index.ts +0 -13
  284. package/src/l1_tx_utils.ts +0 -847
  285. package/src/l1_tx_utils_with_blobs.ts +0 -86
@@ -0,0 +1,108 @@
1
+ import { pick } from '@aztec/foundation/collection';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
+
4
+ import { L1TxUtils, TxUtilsState } from './l1_tx_utils/index.js';
5
+
6
+ // Defines the order in which we prioritise publishers based on their state (first is better)
7
+ const sortOrder = [
8
+ // Always prefer sending from idle publishers
9
+ TxUtilsState.IDLE,
10
+ // Then from publishers that have sent a tx and it got mined
11
+ TxUtilsState.MINED,
12
+ // Then from publishers that have sent a tx but it's in-flight
13
+ TxUtilsState.SPEED_UP,
14
+ TxUtilsState.SENT,
15
+ // We leave cancelled and not-mined states for last, since these represent failures to mines and could be problematic
16
+ TxUtilsState.CANCELLED,
17
+ TxUtilsState.NOT_MINED,
18
+ ];
19
+
20
+ // Which states represent a busy publisher that we should avoid if possible
21
+ const busyStates: TxUtilsState[] = [
22
+ TxUtilsState.SENT,
23
+ TxUtilsState.SPEED_UP,
24
+ TxUtilsState.CANCELLED,
25
+ TxUtilsState.NOT_MINED,
26
+ ];
27
+
28
+ export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
29
+
30
+ export class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
31
+ private log: Logger;
32
+ private config: { publisherAllowInvalidStates?: boolean };
33
+
34
+ constructor(
35
+ private publishers: UtilsType[],
36
+ config: { publisherAllowInvalidStates?: boolean },
37
+ bindings?: LoggerBindings,
38
+ ) {
39
+ this.log = createLogger('publisher:manager', bindings);
40
+ this.log.info(`PublisherManager initialized with ${publishers.length} publishers.`);
41
+ this.publishers = publishers;
42
+ this.config = pick(config, 'publisherAllowInvalidStates');
43
+ }
44
+
45
+ /** Loads the state of all publishers and resumes monitoring any pending txs */
46
+ public async loadState(): Promise<void> {
47
+ await Promise.all(this.publishers.map(pub => pub.loadStateAndResumeMonitoring()));
48
+ }
49
+
50
+ // Finds and prioritises available publishers based on
51
+ // 1. Validity as per the provided filter function
52
+ // 2. Validity based on the state the publisher is in
53
+ // 3. Priority based on state as defined by sortOrder
54
+ // 4. Then priority based on highest balance
55
+ // 5. Then priority based on least recently used
56
+ public async getAvailablePublisher(filter: PublisherFilter<UtilsType> = () => true): Promise<UtilsType> {
57
+ this.log.debug(`Getting available publisher`, {
58
+ publishers: this.publishers.map(p => ({
59
+ address: p.getSenderAddress(),
60
+ state: p.state,
61
+ lastMined: p.lastMinedAtBlockNumber,
62
+ })),
63
+ });
64
+
65
+ // Extract the valid publishers
66
+ let validPublishers = this.publishers.filter((pub: UtilsType) => !busyStates.includes(pub.state) && filter(pub));
67
+
68
+ // If none found but we allow invalid (busy) states, try again including them
69
+ if (validPublishers.length === 0 && this.config.publisherAllowInvalidStates) {
70
+ this.log.warn(`No valid publishers found. Trying again including invalid states.`);
71
+ validPublishers = this.publishers.filter(pub => filter(pub));
72
+ }
73
+
74
+ // Error if none found
75
+ if (validPublishers.length === 0) {
76
+ throw new Error(`Failed to find an available publisher.`);
77
+ }
78
+
79
+ // Get the balances
80
+ const publishersWithBalance = await Promise.all(
81
+ validPublishers.map(async pub => {
82
+ return { balance: await pub.getSenderBalance(), publisher: pub };
83
+ }),
84
+ );
85
+
86
+ // Sort based on state, then balance, then time since last use
87
+ const sortedPublishers = publishersWithBalance.sort((a, b) => {
88
+ const stateComparison = sortOrder.indexOf(a.publisher.state) - sortOrder.indexOf(b.publisher.state);
89
+ if (stateComparison !== 0) {
90
+ return stateComparison;
91
+ }
92
+ const balanceComparison = Number(b.balance - a.balance);
93
+ if (balanceComparison !== 0) {
94
+ return balanceComparison;
95
+ }
96
+ const lastUsedComparison = Number(
97
+ (a.publisher.lastMinedAtBlockNumber ?? 0n) - (b.publisher.lastMinedAtBlockNumber ?? 0n),
98
+ );
99
+ return lastUsedComparison;
100
+ });
101
+
102
+ return sortedPublishers[0].publisher;
103
+ }
104
+
105
+ public interrupt() {
106
+ this.publishers.forEach(pub => pub.interrupt());
107
+ }
108
+ }
package/src/queries.ts CHANGED
@@ -1,7 +1,9 @@
1
- import type { EthAddress } from '@aztec/foundation/eth-address';
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
2
 
3
- import type { L1ContractsConfig } from './config.js';
4
- import { GovernanceContract } from './contracts/governance.js';
3
+ import { DefaultL1ContractsConfig, type L1ContractsConfig } from './config.js';
4
+ import { ReadOnlyGovernanceContract } from './contracts/governance.js';
5
+ import { GovernanceProposerContract } from './contracts/governance_proposer.js';
6
+ import { InboxContract } from './contracts/inbox.js';
5
7
  import { RollupContract } from './contracts/rollup.js';
6
8
  import type { ViemPublicClient } from './types.js';
7
9
 
@@ -9,50 +11,114 @@ import type { ViemPublicClient } from './types.js';
9
11
  export async function getL1ContractsConfig(
10
12
  publicClient: ViemPublicClient,
11
13
  addresses: { governanceAddress: EthAddress; rollupAddress?: EthAddress },
12
- ): Promise<Omit<L1ContractsConfig, 'ethereumSlotDuration'> & { l1StartBlock: bigint; l1GenesisTime: bigint }> {
13
- const governance = new GovernanceContract(addresses.governanceAddress.toString(), publicClient, undefined);
14
- const governanceProposer = await governance.getProposer();
15
- const rollupAddress = addresses.rollupAddress ?? (await governance.getGovernanceAddresses()).rollupAddress;
14
+ ): Promise<
15
+ Omit<L1ContractsConfig, 'ethereumSlotDuration'> & {
16
+ l1StartBlock: bigint;
17
+ l1GenesisTime: bigint;
18
+ rollupVersion: number;
19
+ genesisArchiveTreeRoot: `0x${string}`;
20
+ }
21
+ > {
22
+ const governance = new ReadOnlyGovernanceContract(addresses.governanceAddress.toString(), publicClient);
23
+ const governanceProposerAddress = await governance.getGovernanceProposerAddress();
24
+ const governanceProposer = new GovernanceProposerContract(publicClient, governanceProposerAddress.toString());
25
+ const rollupAddress = addresses.rollupAddress ?? (await governanceProposer.getRollupAddress());
16
26
  const rollup = new RollupContract(publicClient, rollupAddress.toString());
17
27
  const slasherProposer = await rollup.getSlashingProposer();
28
+ const slasher = await rollup.getSlasherContract();
29
+ const rollupAddresses = await rollup.getRollupAddresses();
30
+ const inboxContract = new InboxContract(publicClient, rollupAddresses.inboxAddress.toString());
18
31
 
19
32
  const [
20
33
  l1StartBlock,
21
34
  l1GenesisTime,
22
35
  aztecEpochDuration,
23
- aztecProofSubmissionWindow,
24
36
  aztecSlotDuration,
37
+ aztecProofSubmissionEpochs,
25
38
  aztecTargetCommitteeSize,
26
- minimumStake,
39
+ lagInEpochsForValidatorSet,
40
+ lagInEpochsForRandao,
41
+ inboxLag,
42
+ activationThreshold,
43
+ ejectionThreshold,
44
+ localEjectionThreshold,
27
45
  governanceProposerQuorum,
28
46
  governanceProposerRoundSize,
29
47
  slashingQuorum,
30
48
  slashingRoundSize,
49
+ slashingLifetimeInRounds,
50
+ slashingExecutionDelayInRounds,
51
+ slashingOffsetInRounds,
52
+ slashingAmounts,
53
+ slashingVetoer,
54
+ slashingDisableDuration,
55
+ manaTarget,
56
+ provingCostPerMana,
57
+ rollupVersion,
58
+ genesisArchiveTreeRoot,
59
+ exitDelay,
31
60
  ] = await Promise.all([
32
61
  rollup.getL1StartBlock(),
33
62
  rollup.getL1GenesisTime(),
34
63
  rollup.getEpochDuration(),
35
- rollup.getProofSubmissionWindow(),
36
64
  rollup.getSlotDuration(),
65
+ rollup.getProofSubmissionEpochs(),
37
66
  rollup.getTargetCommitteeSize(),
38
- rollup.getMinimumStake(),
67
+ rollup.getLagInEpochsForValidatorSet(),
68
+ rollup.getLagInEpochsForRandao(),
69
+ inboxContract.getLag(),
70
+ rollup.getActivationThreshold(),
71
+ rollup.getEjectionThreshold(),
72
+ rollup.getLocalEjectionThreshold(),
39
73
  governanceProposer.getQuorumSize(),
40
74
  governanceProposer.getRoundSize(),
41
- slasherProposer.getQuorumSize(),
42
- slasherProposer.getRoundSize(),
75
+ slasherProposer?.getQuorumSize() ?? 0n,
76
+ slasherProposer?.getRoundSize() ?? 0n,
77
+ slasherProposer?.getLifetimeInRounds() ?? 0n,
78
+ slasherProposer?.getExecutionDelayInRounds() ?? 0n,
79
+ slasherProposer?.type === 'tally' ? slasherProposer.getSlashOffsetInRounds() : 0n,
80
+ slasherProposer?.type === 'tally' ? slasherProposer.getSlashingAmounts() : [0n, 0n, 0n],
81
+ slasher?.getVetoer() ?? EthAddress.ZERO,
82
+ slasher?.getSlashingDisableDuration() ?? 0,
83
+ rollup.getManaTarget(),
84
+ rollup.getProvingCostPerMana(),
85
+ rollup.getVersion(),
86
+ rollup.getGenesisArchiveTreeRoot(),
87
+ rollup.getExitDelay(),
43
88
  ] as const);
44
89
 
45
90
  return {
46
91
  l1StartBlock,
47
92
  l1GenesisTime,
48
93
  aztecEpochDuration: Number(aztecEpochDuration),
49
- aztecProofSubmissionWindow: Number(aztecProofSubmissionWindow),
50
94
  aztecSlotDuration: Number(aztecSlotDuration),
95
+ aztecProofSubmissionEpochs: Number(aztecProofSubmissionEpochs),
51
96
  aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
97
+ lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
98
+ lagInEpochsForRandao: Number(lagInEpochsForRandao),
99
+ inboxLag: Number(inboxLag),
52
100
  governanceProposerQuorum: Number(governanceProposerQuorum),
53
101
  governanceProposerRoundSize: Number(governanceProposerRoundSize),
54
- minimumStake,
102
+ governanceVotingDuration: DefaultL1ContractsConfig.governanceVotingDuration,
103
+ activationThreshold,
104
+ ejectionThreshold,
105
+ localEjectionThreshold,
55
106
  slashingQuorum: Number(slashingQuorum),
56
- slashingRoundSize: Number(slashingRoundSize),
107
+ slashingRoundSizeInEpochs: Number(Number(slashingRoundSize) / aztecEpochDuration),
108
+ slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
109
+ slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
110
+ slashingVetoer,
111
+ slashingDisableDuration,
112
+ manaTarget,
113
+ provingCostPerMana: provingCostPerMana,
114
+ rollupVersion: Number(rollupVersion),
115
+ genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
116
+ exitDelaySeconds: Number(exitDelay),
117
+ slasherFlavor: slasherProposer?.type ?? 'tally',
118
+ slashingOffsetInRounds: Number(slashingOffsetInRounds),
119
+ slashAmountSmall: slashingAmounts[0],
120
+ slashAmountMedium: slashingAmounts[1],
121
+ slashAmountLarge: slashingAmounts[2],
122
+ initialEthPerFeeAsset: DefaultL1ContractsConfig.initialEthPerFeeAsset,
57
123
  };
58
124
  }
@@ -0,0 +1,245 @@
1
+ import type { RollupContract } from '@aztec/ethereum/contracts';
2
+ import { InboxContract } from '@aztec/ethereum/contracts';
3
+ import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
4
+ import { EthAddress } from '@aztec/foundation/eth-address';
5
+ import { createLogger } from '@aztec/foundation/log';
6
+ import { promiseWithResolvers } from '@aztec/foundation/promise';
7
+ import { DateProvider } from '@aztec/foundation/timer';
8
+
9
+ import { EventEmitter } from 'events';
10
+
11
+ import type { ViemClient } from '../types.js';
12
+
13
+ export type ChainMonitorEventMap = {
14
+ 'l1-block': [{ l1BlockNumber: number; timestamp: bigint }];
15
+ checkpoint: [
16
+ { checkpointNumber: CheckpointNumber; l1BlockNumber: number; l2SlotNumber: SlotNumber; timestamp: bigint },
17
+ ];
18
+ 'checkpoint-proven': [{ provenCheckpointNumber: CheckpointNumber; l1BlockNumber: number; timestamp: bigint }];
19
+ 'l2-messages': [{ totalL2Messages: number; l1BlockNumber: number }];
20
+ 'l2-epoch': [{ l2EpochNumber: EpochNumber; timestamp: bigint; committee: EthAddress[] | undefined }];
21
+ 'l2-slot': [{ l2SlotNumber: SlotNumber; timestamp: bigint }];
22
+ };
23
+
24
+ /** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
25
+ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
26
+ private readonly l1Client: ViemClient;
27
+ private inbox: InboxContract | undefined;
28
+ private handle: NodeJS.Timeout | undefined;
29
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
30
+ private running: Set<Promise<void>> = new Set();
31
+
32
+ /** Current L1 block number */
33
+ public l1BlockNumber!: number;
34
+ /** Current checkpoint number */
35
+ public checkpointNumber!: CheckpointNumber;
36
+ /** Current proven checkpoint number */
37
+ public provenCheckpointNumber!: CheckpointNumber;
38
+ /** L1 timestamp for the current checkpoint */
39
+ public checkpointTimestamp!: bigint;
40
+ /** L1 timestamp for the proven checkpoint */
41
+ public provenCheckpointTimestamp!: bigint;
42
+ /** Total number of L2 messages pushed into the Inbox */
43
+ public totalL2Messages: number = 0;
44
+ /** Current L2 epoch number */
45
+ public l2EpochNumber!: EpochNumber;
46
+ /** Current L2 slot number */
47
+ public l2SlotNumber!: SlotNumber;
48
+
49
+ constructor(
50
+ private readonly rollup: RollupContract,
51
+ private readonly dateProvider: DateProvider = new DateProvider(),
52
+ private readonly logger = createLogger('aztecjs:utils:chain_monitor'),
53
+ private readonly intervalMs = 200,
54
+ ) {
55
+ super();
56
+ this.l1Client = rollup.client;
57
+ }
58
+
59
+ start() {
60
+ if (this.handle) {
61
+ throw new Error('Chain monitor already started');
62
+ }
63
+ this.handle = setInterval(this.safeRun.bind(this), this.intervalMs);
64
+ return this;
65
+ }
66
+
67
+ async stop() {
68
+ try {
69
+ this.removeAllListeners();
70
+ if (this.handle) {
71
+ clearInterval(this.handle!);
72
+ this.handle = undefined;
73
+ }
74
+ await Promise.allSettled([...this.running]);
75
+ } catch (err) {
76
+ this.logger.error('Error stopping chain monitor', err);
77
+ }
78
+ }
79
+
80
+ private async getInbox() {
81
+ if (!this.inbox) {
82
+ const { inboxAddress } = await this.rollup.getRollupAddresses();
83
+ this.inbox = new InboxContract(this.l1Client, inboxAddress);
84
+ }
85
+ return this.inbox;
86
+ }
87
+
88
+ protected safeRun() {
89
+ const running = promiseWithResolvers<void>();
90
+ this.running.add(running.promise);
91
+
92
+ void this.run()
93
+ .catch(error => {
94
+ this.logger.error('Error in chain monitor loop', error);
95
+ })
96
+ .finally(() => {
97
+ running.resolve();
98
+ this.running.delete(running.promise);
99
+ });
100
+ }
101
+
102
+ async run(force = false) {
103
+ const newL1BlockNumber = Number(await this.l1Client.getBlockNumber({ cacheTime: 0 }));
104
+ if (!force && this.l1BlockNumber === newL1BlockNumber) {
105
+ return this;
106
+ }
107
+ this.l1BlockNumber = newL1BlockNumber;
108
+
109
+ const [l2SlotNumber, l2Epoch, l1block] = await Promise.all([
110
+ this.rollup.getSlotNumber(),
111
+ this.rollup.getCurrentEpoch(),
112
+ this.l1Client.getBlock({ blockNumber: BigInt(newL1BlockNumber), includeTransactions: false }),
113
+ ]);
114
+
115
+ const timestamp = l1block.timestamp;
116
+ const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
117
+
118
+ this.emit('l1-block', { l1BlockNumber: newL1BlockNumber, timestamp });
119
+ let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
120
+
121
+ const newCheckpointNumber = await this.rollup.getCheckpointNumber();
122
+ if (this.checkpointNumber !== newCheckpointNumber) {
123
+ const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newCheckpointNumber);
124
+ msg += ` with new checkpoint ${newCheckpointNumber} for epoch ${epochNumber}`;
125
+ this.checkpointNumber = newCheckpointNumber;
126
+ this.checkpointTimestamp = timestamp;
127
+ this.emit('checkpoint', {
128
+ checkpointNumber: newCheckpointNumber,
129
+ l1BlockNumber: newL1BlockNumber,
130
+ l2SlotNumber,
131
+ timestamp,
132
+ });
133
+ }
134
+
135
+ const newProvenCheckpointNumber = await this.rollup.getProvenCheckpointNumber();
136
+ if (this.provenCheckpointNumber !== newProvenCheckpointNumber) {
137
+ const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newProvenCheckpointNumber);
138
+ msg += ` with proof up to checkpoint ${newProvenCheckpointNumber} for epoch ${epochNumber}`;
139
+ this.provenCheckpointNumber = newProvenCheckpointNumber;
140
+ this.provenCheckpointTimestamp = timestamp;
141
+ this.emit('checkpoint-proven', {
142
+ provenCheckpointNumber: newProvenCheckpointNumber,
143
+ l1BlockNumber: newL1BlockNumber,
144
+ timestamp,
145
+ });
146
+ }
147
+
148
+ const inbox = await this.getInbox();
149
+ const newTotalL2Messages = await inbox.getState().then(s => Number(s.totalMessagesInserted));
150
+ if (this.totalL2Messages !== newTotalL2Messages) {
151
+ msg += ` with ${newTotalL2Messages - this.totalL2Messages} new L2 messages (total ${newTotalL2Messages})`;
152
+ this.totalL2Messages = newTotalL2Messages;
153
+ this.emit('l2-messages', { totalL2Messages: newTotalL2Messages, l1BlockNumber: newL1BlockNumber });
154
+ }
155
+
156
+ let committee: EthAddress[] | undefined;
157
+ if (l2Epoch !== this.l2EpochNumber) {
158
+ this.l2EpochNumber = l2Epoch;
159
+ committee = await this.rollup.getCurrentEpochCommittee();
160
+ this.emit('l2-epoch', { l2EpochNumber: l2Epoch, timestamp, committee });
161
+ msg += ` starting new epoch ${this.l2EpochNumber} `;
162
+ }
163
+
164
+ if (l2SlotNumber !== this.l2SlotNumber) {
165
+ this.l2SlotNumber = l2SlotNumber;
166
+ this.emit('l2-slot', { l2SlotNumber, timestamp });
167
+ }
168
+
169
+ this.logger.info(msg, {
170
+ currentTimestamp: this.dateProvider.nowInSeconds(),
171
+ l1Timestamp: timestamp,
172
+ l1BlockNumber: this.l1BlockNumber,
173
+ l2SlotNumber,
174
+ l2Epoch,
175
+ checkpointNumber: this.checkpointNumber,
176
+ provenCheckpointNumber: this.provenCheckpointNumber,
177
+ totalL2Messages: this.totalL2Messages,
178
+ committee,
179
+ });
180
+
181
+ return this;
182
+ }
183
+
184
+ public waitUntilL2Slot(slot: SlotNumber): Promise<void> {
185
+ if (this.l2SlotNumber >= slot) {
186
+ return Promise.resolve();
187
+ }
188
+ return new Promise(resolve => {
189
+ const listener = (data: { l2SlotNumber: SlotNumber; timestamp: bigint }) => {
190
+ if (data.l2SlotNumber >= slot) {
191
+ this.off('l2-slot', listener);
192
+ resolve();
193
+ }
194
+ };
195
+ this.on('l2-slot', listener);
196
+ });
197
+ }
198
+
199
+ public waitUntilL1Block(block: number | bigint): Promise<void> {
200
+ const targetBlock = typeof block === 'bigint' ? block.valueOf() : block;
201
+ if (this.l1BlockNumber >= targetBlock) {
202
+ return Promise.resolve();
203
+ }
204
+ return new Promise(resolve => {
205
+ const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
206
+ if (data.l1BlockNumber >= targetBlock) {
207
+ this.off('l1-block', listener);
208
+ resolve();
209
+ }
210
+ };
211
+ this.on('l1-block', listener);
212
+ });
213
+ }
214
+
215
+ public waitUntilL1Timestamp(timestamp: number | bigint): Promise<void> {
216
+ const targetTimestamp = typeof timestamp === 'bigint' ? timestamp.valueOf() : timestamp;
217
+ if (this.l1BlockNumber >= targetTimestamp) {
218
+ return Promise.resolve();
219
+ }
220
+ return new Promise(resolve => {
221
+ const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
222
+ if (data.timestamp >= targetTimestamp) {
223
+ this.off('l1-block', listener);
224
+ resolve();
225
+ }
226
+ };
227
+ this.on('l1-block', listener);
228
+ });
229
+ }
230
+
231
+ public waitUntilCheckpoint(checkpointNumber: CheckpointNumber): Promise<void> {
232
+ if (this.checkpointNumber >= checkpointNumber) {
233
+ return Promise.resolve();
234
+ }
235
+ return new Promise(resolve => {
236
+ const listener = (data: { checkpointNumber: CheckpointNumber; timestamp: bigint }) => {
237
+ if (data.checkpointNumber >= checkpointNumber) {
238
+ this.off('checkpoint', listener);
239
+ resolve();
240
+ }
241
+ };
242
+ this.on('checkpoint', listener);
243
+ });
244
+ }
245
+ }
@@ -1,24 +1,52 @@
1
- import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { type Logger, createLogger } from '@aztec/foundation/log';
3
+ import { DateProvider } from '@aztec/foundation/timer';
4
+
5
+ import { type L1TxUtilsConfig, createViemSigner } from '../l1_tx_utils/index.js';
6
+ import { L1TxUtilsWithBlobs } from '../l1_tx_utils/l1_tx_utils_with_blobs.js';
7
+ import type { ExtendedViemWalletClient } from '../types.js';
2
8
  import { type Delayer, withDelayer } from './tx_delayer.js';
3
9
 
4
10
  export class DelayedTxUtils extends L1TxUtilsWithBlobs {
5
11
  public delayer: Delayer | undefined;
6
12
 
7
- public static fromL1TxUtils(l1TxUtils: L1TxUtilsWithBlobs, ethereumSlotDuration: number) {
8
- const { client, delayer } = withDelayer(l1TxUtils.walletClient, {
13
+ public static fromL1TxUtils(
14
+ l1TxUtils: L1TxUtilsWithBlobs,
15
+ ethereumSlotDuration: number,
16
+ wallet: ExtendedViemWalletClient,
17
+ ) {
18
+ const { client, delayer } = withDelayer(wallet, l1TxUtils.dateProvider, {
9
19
  ethereumSlotDuration,
10
20
  });
11
21
  const casted = l1TxUtils as unknown as DelayedTxUtils;
12
22
  casted.delayer = delayer;
13
- casted.walletClient = client;
23
+ casted.client = client;
14
24
  return casted;
15
25
  }
16
26
 
17
27
  public enableDelayer(ethereumSlotDuration: number) {
18
- const { client, delayer } = withDelayer(this.walletClient, {
28
+ const { client, delayer } = withDelayer(this.client, this.dateProvider, {
19
29
  ethereumSlotDuration,
20
30
  });
21
31
  this.delayer = delayer;
22
- this.walletClient = client;
32
+ this.client = client;
23
33
  }
24
34
  }
35
+
36
+ export function createDelayedL1TxUtilsFromViemWallet(
37
+ client: ExtendedViemWalletClient,
38
+ logger: Logger = createLogger('L1TxUtils'),
39
+ dateProvider: DateProvider = new DateProvider(),
40
+ config?: Partial<L1TxUtilsConfig>,
41
+ debugMaxGasLimit: boolean = false,
42
+ ) {
43
+ return new DelayedTxUtils(
44
+ client,
45
+ EthAddress.fromString(client.account.address),
46
+ createViemSigner(client),
47
+ logger,
48
+ dateProvider,
49
+ config,
50
+ debugMaxGasLimit,
51
+ );
52
+ }