@aztec/ethereum 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108

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 (226) hide show
  1. package/dest/account.d.ts +1 -1
  2. package/dest/chain.d.ts +1 -1
  3. package/dest/client.d.ts +2 -2
  4. package/dest/client.d.ts.map +1 -1
  5. package/dest/client.js +6 -2
  6. package/dest/config.d.ts +18 -46
  7. package/dest/config.d.ts.map +1 -1
  8. package/dest/config.js +40 -285
  9. package/dest/constants.d.ts +1 -1
  10. package/dest/contracts/empire_base.d.ts +8 -6
  11. package/dest/contracts/empire_base.d.ts.map +1 -1
  12. package/dest/contracts/empire_base.js +1 -1
  13. package/dest/contracts/empire_slashing_proposer.d.ts +8 -6
  14. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  15. package/dest/contracts/empire_slashing_proposer.js +18 -3
  16. package/dest/contracts/errors.d.ts +1 -1
  17. package/dest/contracts/errors.d.ts.map +1 -1
  18. package/dest/contracts/fee_asset_handler.d.ts +4 -4
  19. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  20. package/dest/contracts/fee_juice.d.ts +1 -1
  21. package/dest/contracts/fee_juice.d.ts.map +1 -1
  22. package/dest/contracts/governance.d.ts +16 -16
  23. package/dest/contracts/governance.d.ts.map +1 -1
  24. package/dest/contracts/governance.js +7 -3
  25. package/dest/contracts/governance_proposer.d.ts +7 -6
  26. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  27. package/dest/contracts/governance_proposer.js +400 -12
  28. package/dest/contracts/gse.d.ts +1 -1
  29. package/dest/contracts/gse.d.ts.map +1 -1
  30. package/dest/contracts/inbox.d.ts +7 -3
  31. package/dest/contracts/inbox.d.ts.map +1 -1
  32. package/dest/contracts/inbox.js +4 -0
  33. package/dest/contracts/index.d.ts +1 -1
  34. package/dest/contracts/multicall.d.ts +5 -7
  35. package/dest/contracts/multicall.d.ts.map +1 -1
  36. package/dest/contracts/multicall.js +6 -4
  37. package/dest/contracts/registry.d.ts +1 -1
  38. package/dest/contracts/registry.d.ts.map +1 -1
  39. package/dest/contracts/rollup.d.ts +169 -118
  40. package/dest/contracts/rollup.d.ts.map +1 -1
  41. package/dest/contracts/rollup.js +714 -243
  42. package/dest/contracts/slasher_contract.d.ts +11 -1
  43. package/dest/contracts/slasher_contract.d.ts.map +1 -1
  44. package/dest/contracts/slasher_contract.js +18 -0
  45. package/dest/contracts/tally_slashing_proposer.d.ts +15 -7
  46. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  47. package/dest/contracts/tally_slashing_proposer.js +15 -5
  48. package/dest/contracts/utils.d.ts +1 -1
  49. package/dest/deploy_aztec_l1_contracts.d.ts +247 -0
  50. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  51. package/dest/deploy_aztec_l1_contracts.js +336 -0
  52. package/dest/deploy_l1_contract.d.ts +68 -0
  53. package/dest/deploy_l1_contract.d.ts.map +1 -0
  54. package/dest/deploy_l1_contract.js +312 -0
  55. package/dest/eth-signer/eth-signer.d.ts +1 -1
  56. package/dest/eth-signer/index.d.ts +1 -1
  57. package/dest/forwarder_proxy.d.ts +32 -0
  58. package/dest/forwarder_proxy.d.ts.map +1 -0
  59. package/dest/forwarder_proxy.js +93 -0
  60. package/dest/l1_artifacts.d.ts +17733 -6280
  61. package/dest/l1_artifacts.d.ts.map +1 -1
  62. package/dest/l1_artifacts.js +10 -5
  63. package/dest/l1_contract_addresses.d.ts +8 -4
  64. package/dest/l1_contract_addresses.d.ts.map +1 -1
  65. package/dest/l1_contract_addresses.js +5 -4
  66. package/dest/l1_reader.d.ts +4 -2
  67. package/dest/l1_reader.d.ts.map +1 -1
  68. package/dest/l1_reader.js +7 -1
  69. package/dest/l1_tx_utils/config.d.ts +59 -0
  70. package/dest/l1_tx_utils/config.d.ts.map +1 -0
  71. package/dest/l1_tx_utils/config.js +96 -0
  72. package/dest/l1_tx_utils/constants.d.ts +12 -0
  73. package/dest/l1_tx_utils/constants.d.ts.map +1 -0
  74. package/dest/l1_tx_utils/constants.js +39 -0
  75. package/dest/l1_tx_utils/factory.d.ts +24 -0
  76. package/dest/l1_tx_utils/factory.d.ts.map +1 -0
  77. package/dest/l1_tx_utils/factory.js +12 -0
  78. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  79. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  80. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  81. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  82. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  83. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  84. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  85. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  86. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  87. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  88. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  89. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  90. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  91. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  92. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +48 -0
  93. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  94. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  95. package/dest/l1_tx_utils/index-blobs.js +2 -0
  96. package/dest/l1_tx_utils/index.d.ts +12 -0
  97. package/dest/l1_tx_utils/index.d.ts.map +1 -0
  98. package/dest/l1_tx_utils/index.js +12 -0
  99. package/dest/l1_tx_utils/interfaces.d.ts +76 -0
  100. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
  101. package/dest/l1_tx_utils/interfaces.js +4 -0
  102. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  103. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  104. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  105. package/dest/l1_tx_utils/l1_tx_utils.d.ts +94 -0
  106. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
  107. package/dest/l1_tx_utils/l1_tx_utils.js +623 -0
  108. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
  109. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
  110. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
  111. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +83 -0
  112. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
  113. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +323 -0
  114. package/dest/l1_tx_utils/signer.d.ts +4 -0
  115. package/dest/l1_tx_utils/signer.d.ts.map +1 -0
  116. package/dest/l1_tx_utils/signer.js +16 -0
  117. package/dest/l1_tx_utils/types.d.ts +67 -0
  118. package/dest/l1_tx_utils/types.d.ts.map +1 -0
  119. package/dest/l1_tx_utils/types.js +26 -0
  120. package/dest/l1_tx_utils/utils.d.ts +4 -0
  121. package/dest/l1_tx_utils/utils.d.ts.map +1 -0
  122. package/dest/l1_tx_utils/utils.js +14 -0
  123. package/dest/l1_types.d.ts +1 -1
  124. package/dest/publisher_manager.d.ts +8 -3
  125. package/dest/publisher_manager.d.ts.map +1 -1
  126. package/dest/publisher_manager.js +36 -8
  127. package/dest/queries.d.ts +1 -1
  128. package/dest/queries.d.ts.map +1 -1
  129. package/dest/queries.js +20 -14
  130. package/dest/test/chain_monitor.d.ts +29 -22
  131. package/dest/test/chain_monitor.d.ts.map +1 -1
  132. package/dest/test/chain_monitor.js +81 -38
  133. package/dest/test/delayed_tx_utils.d.ts +3 -3
  134. package/dest/test/delayed_tx_utils.d.ts.map +1 -1
  135. package/dest/test/delayed_tx_utils.js +2 -2
  136. package/dest/test/eth_cheat_codes.d.ts +36 -14
  137. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  138. package/dest/test/eth_cheat_codes.js +126 -31
  139. package/dest/test/eth_cheat_codes_with_state.d.ts +1 -1
  140. package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
  141. package/dest/test/index.d.ts +1 -1
  142. package/dest/test/rollup_cheat_codes.d.ts +23 -20
  143. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  144. package/dest/test/rollup_cheat_codes.js +82 -43
  145. package/dest/test/start_anvil.d.ts +4 -1
  146. package/dest/test/start_anvil.d.ts.map +1 -1
  147. package/dest/test/start_anvil.js +2 -1
  148. package/dest/test/tx_delayer.d.ts +1 -1
  149. package/dest/test/tx_delayer.d.ts.map +1 -1
  150. package/dest/test/tx_delayer.js +4 -3
  151. package/dest/test/upgrade_utils.d.ts +1 -1
  152. package/dest/test/upgrade_utils.d.ts.map +1 -1
  153. package/dest/test/upgrade_utils.js +3 -2
  154. package/dest/types.d.ts +57 -2
  155. package/dest/types.d.ts.map +1 -1
  156. package/dest/utils.d.ts +15 -3
  157. package/dest/utils.d.ts.map +1 -1
  158. package/dest/utils.js +28 -161
  159. package/dest/zkPassportVerifierAddress.d.ts +1 -1
  160. package/dest/zkPassportVerifierAddress.js +1 -1
  161. package/package.json +33 -14
  162. package/src/client.ts +3 -3
  163. package/src/config.ts +49 -358
  164. package/src/contracts/empire_base.ts +7 -6
  165. package/src/contracts/empire_slashing_proposer.ts +23 -8
  166. package/src/contracts/fee_asset_handler.ts +1 -1
  167. package/src/contracts/governance.ts +3 -3
  168. package/src/contracts/governance_proposer.ts +19 -9
  169. package/src/contracts/inbox.ts +7 -2
  170. package/src/contracts/multicall.ts +12 -10
  171. package/src/contracts/rollup.ts +374 -236
  172. package/src/contracts/slasher_contract.ts +22 -0
  173. package/src/contracts/tally_slashing_proposer.ts +21 -9
  174. package/src/deploy_aztec_l1_contracts.ts +557 -0
  175. package/src/deploy_l1_contract.ts +362 -0
  176. package/src/forwarder_proxy.ts +108 -0
  177. package/src/l1_artifacts.ts +14 -6
  178. package/src/l1_contract_addresses.ts +24 -20
  179. package/src/l1_reader.ts +10 -2
  180. package/src/l1_tx_utils/README.md +177 -0
  181. package/src/l1_tx_utils/config.ts +161 -0
  182. package/src/l1_tx_utils/constants.ts +29 -0
  183. package/src/l1_tx_utils/factory.ts +64 -0
  184. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  185. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  186. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  187. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  188. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +119 -0
  189. package/src/l1_tx_utils/index-blobs.ts +2 -0
  190. package/src/l1_tx_utils/index.ts +14 -0
  191. package/src/l1_tx_utils/interfaces.ts +86 -0
  192. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  193. package/src/l1_tx_utils/l1_tx_utils.ts +738 -0
  194. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
  195. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +419 -0
  196. package/src/l1_tx_utils/signer.ts +28 -0
  197. package/src/l1_tx_utils/types.ts +85 -0
  198. package/src/l1_tx_utils/utils.ts +16 -0
  199. package/src/publisher_manager.ts +51 -9
  200. package/src/queries.ts +24 -10
  201. package/src/test/chain_monitor.ts +102 -44
  202. package/src/test/delayed_tx_utils.ts +2 -2
  203. package/src/test/eth_cheat_codes.ts +150 -31
  204. package/src/test/rollup_cheat_codes.ts +95 -53
  205. package/src/test/start_anvil.ts +4 -0
  206. package/src/test/tx_delayer.ts +5 -3
  207. package/src/test/upgrade_utils.ts +3 -2
  208. package/src/types.ts +62 -0
  209. package/src/utils.ts +41 -184
  210. package/src/zkPassportVerifierAddress.ts +1 -1
  211. package/dest/deploy_l1_contracts.d.ts +0 -211
  212. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  213. package/dest/deploy_l1_contracts.js +0 -1267
  214. package/dest/index.d.ts +0 -18
  215. package/dest/index.d.ts.map +0 -1
  216. package/dest/index.js +0 -17
  217. package/dest/l1_tx_utils.d.ts +0 -250
  218. package/dest/l1_tx_utils.d.ts.map +0 -1
  219. package/dest/l1_tx_utils.js +0 -826
  220. package/dest/l1_tx_utils_with_blobs.d.ts +0 -19
  221. package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
  222. package/dest/l1_tx_utils_with_blobs.js +0 -85
  223. package/src/deploy_l1_contracts.ts +0 -1596
  224. package/src/index.ts +0 -17
  225. package/src/l1_tx_utils.ts +0 -1105
  226. package/src/l1_tx_utils_with_blobs.ts +0 -144
@@ -1,31 +1,73 @@
1
+ import { pick } from '@aztec/foundation/collection';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
 
3
- import { L1TxUtils, TxUtilsState } from './l1_tx_utils.js';
4
+ import { L1TxUtils, TxUtilsState } from './l1_tx_utils/index.js';
4
5
 
5
- const sortOrder = [TxUtilsState.IDLE, TxUtilsState.MINED];
6
- const invalidStates = [TxUtilsState.SENT, TxUtilsState.SPEED_UP, TxUtilsState.CANCELLED, TxUtilsState.NOT_MINED]; // Cancelled and not mined are states that can be handled by a later iteration
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
+ ];
7
27
 
8
28
  export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
9
29
 
10
30
  export class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
11
- private log = createLogger('PublisherManager');
31
+ private log = createLogger('publisher:manager');
32
+ private config: { publisherAllowInvalidStates?: boolean };
12
33
 
13
- constructor(private publishers: UtilsType[]) {
34
+ constructor(
35
+ private publishers: UtilsType[],
36
+ config: { publisherAllowInvalidStates?: boolean },
37
+ ) {
14
38
  this.log.info(`PublisherManager initialized with ${publishers.length} publishers.`);
15
39
  this.publishers = publishers;
40
+ this.config = pick(config, 'publisherAllowInvalidStates');
41
+ }
42
+
43
+ /** Loads the state of all publishers and resumes monitoring any pending txs */
44
+ public async loadState(): Promise<void> {
45
+ await Promise.all(this.publishers.map(pub => pub.loadStateAndResumeMonitoring()));
16
46
  }
17
47
 
18
48
  // Finds and prioritises available publishers based on
19
49
  // 1. Validity as per the provided filter function
20
50
  // 2. Validity based on the state the publisher is in
21
- // 3. Priority based on state as defined bu sortOrder
51
+ // 3. Priority based on state as defined by sortOrder
22
52
  // 4. Then priority based on highest balance
23
53
  // 5. Then priority based on least recently used
24
54
  public async getAvailablePublisher(filter: PublisherFilter<UtilsType> = () => true): Promise<UtilsType> {
55
+ this.log.debug(`Getting available publisher`, {
56
+ publishers: this.publishers.map(p => ({
57
+ address: p.getSenderAddress(),
58
+ state: p.state,
59
+ lastMined: p.lastMinedAtBlockNumber,
60
+ })),
61
+ });
62
+
25
63
  // Extract the valid publishers
26
- const validPublishers = this.publishers.filter(
27
- (pub: UtilsType) => !invalidStates.includes(pub.state) && filter(pub),
28
- );
64
+ let validPublishers = this.publishers.filter((pub: UtilsType) => !busyStates.includes(pub.state) && filter(pub));
65
+
66
+ // If none found but we allow invalid (busy) states, try again including them
67
+ if (validPublishers.length === 0 && this.config.publisherAllowInvalidStates) {
68
+ this.log.warn(`No valid publishers found. Trying again including invalid states.`);
69
+ validPublishers = this.publishers.filter(pub => filter(pub));
70
+ }
29
71
 
30
72
  // Error if none found
31
73
  if (validPublishers.length === 0) {
package/src/queries.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
- import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
3
-
4
- import { getContract } from 'viem';
5
2
 
6
3
  import type { L1ContractsConfig } from './config.js';
7
4
  import { ReadOnlyGovernanceContract } from './contracts/governance.js';
8
5
  import { GovernanceProposerContract } from './contracts/governance_proposer.js';
6
+ import { InboxContract } from './contracts/inbox.js';
9
7
  import { RollupContract } from './contracts/rollup.js';
10
8
  import type { ViemPublicClient } from './types.js';
11
9
 
@@ -27,8 +25,9 @@ export async function getL1ContractsConfig(
27
25
  const rollupAddress = addresses.rollupAddress ?? (await governanceProposer.getRollupAddress());
28
26
  const rollup = new RollupContract(publicClient, rollupAddress.toString());
29
27
  const slasherProposer = await rollup.getSlashingProposer();
30
- const slasherAddress = await rollup.getSlasher();
31
- const slasher = getContract({ address: slasherAddress, abi: SlasherAbi, client: publicClient });
28
+ const slasher = await rollup.getSlasherContract();
29
+ const rollupAddresses = await rollup.getRollupAddresses();
30
+ const inboxContract = new InboxContract(publicClient, rollupAddresses.inboxAddress.toString());
32
31
 
33
32
  const [
34
33
  l1StartBlock,
@@ -37,8 +36,12 @@ export async function getL1ContractsConfig(
37
36
  aztecSlotDuration,
38
37
  aztecProofSubmissionEpochs,
39
38
  aztecTargetCommitteeSize,
39
+ lagInEpochsForValidatorSet,
40
+ lagInEpochsForRandao,
41
+ inboxLag,
40
42
  activationThreshold,
41
43
  ejectionThreshold,
44
+ localEjectionThreshold,
42
45
  governanceProposerQuorum,
43
46
  governanceProposerRoundSize,
44
47
  slashingQuorum,
@@ -48,6 +51,7 @@ export async function getL1ContractsConfig(
48
51
  slashingOffsetInRounds,
49
52
  slashingAmounts,
50
53
  slashingVetoer,
54
+ slashingDisableDuration,
51
55
  manaTarget,
52
56
  provingCostPerMana,
53
57
  rollupVersion,
@@ -60,8 +64,12 @@ export async function getL1ContractsConfig(
60
64
  rollup.getSlotDuration(),
61
65
  rollup.getProofSubmissionEpochs(),
62
66
  rollup.getTargetCommitteeSize(),
67
+ rollup.getLagInEpochsForValidatorSet(),
68
+ rollup.getLagInEpochsForRandao(),
69
+ inboxContract.getLag(),
63
70
  rollup.getActivationThreshold(),
64
71
  rollup.getEjectionThreshold(),
72
+ rollup.getLocalEjectionThreshold(),
65
73
  governanceProposer.getQuorumSize(),
66
74
  governanceProposer.getRoundSize(),
67
75
  slasherProposer?.getQuorumSize() ?? 0n,
@@ -70,7 +78,8 @@ export async function getL1ContractsConfig(
70
78
  slasherProposer?.getExecutionDelayInRounds() ?? 0n,
71
79
  slasherProposer?.type === 'tally' ? slasherProposer.getSlashOffsetInRounds() : 0n,
72
80
  slasherProposer?.type === 'tally' ? slasherProposer.getSlashingAmounts() : [0n, 0n, 0n],
73
- slasher.read.VETOER(),
81
+ slasher?.getVetoer() ?? EthAddress.ZERO,
82
+ slasher?.getSlashingDisableDuration() ?? 0,
74
83
  rollup.getManaTarget(),
75
84
  rollup.getProvingCostPerMana(),
76
85
  rollup.getVersion(),
@@ -85,19 +94,24 @@ export async function getL1ContractsConfig(
85
94
  aztecSlotDuration: Number(aztecSlotDuration),
86
95
  aztecProofSubmissionEpochs: Number(aztecProofSubmissionEpochs),
87
96
  aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
97
+ lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
98
+ lagInEpochsForRandao: Number(lagInEpochsForRandao),
99
+ inboxLag: Number(inboxLag),
88
100
  governanceProposerQuorum: Number(governanceProposerQuorum),
89
101
  governanceProposerRoundSize: Number(governanceProposerRoundSize),
90
102
  activationThreshold,
91
103
  ejectionThreshold,
104
+ localEjectionThreshold,
92
105
  slashingQuorum: Number(slashingQuorum),
93
- slashingRoundSizeInEpochs: Number(slashingRoundSize / aztecEpochDuration),
106
+ slashingRoundSizeInEpochs: Number(Number(slashingRoundSize) / aztecEpochDuration),
94
107
  slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
95
108
  slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
96
- slashingVetoer: EthAddress.fromString(slashingVetoer),
97
- manaTarget: manaTarget,
109
+ slashingVetoer,
110
+ slashingDisableDuration,
111
+ manaTarget,
98
112
  provingCostPerMana: provingCostPerMana,
99
113
  rollupVersion: Number(rollupVersion),
100
- genesisArchiveTreeRoot,
114
+ genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
101
115
  exitDelaySeconds: Number(exitDelay),
102
116
  slasherFlavor: slasherProposer?.type ?? 'tally',
103
117
  slashingOffsetInRounds: Number(slashingOffsetInRounds),
@@ -1,4 +1,6 @@
1
- import { InboxContract, type RollupContract } from '@aztec/ethereum/contracts';
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';
2
4
  import { EthAddress } from '@aztec/foundation/eth-address';
3
5
  import { createLogger } from '@aztec/foundation/log';
4
6
  import { promiseWithResolvers } from '@aztec/foundation/promise';
@@ -10,11 +12,13 @@ import type { ViemClient } from '../types.js';
10
12
 
11
13
  export type ChainMonitorEventMap = {
12
14
  'l1-block': [{ l1BlockNumber: number; timestamp: bigint }];
13
- 'l2-block': [{ l2BlockNumber: number; l1BlockNumber: number; timestamp: bigint }];
14
- 'l2-block-proven': [{ l2ProvenBlockNumber: number; 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 }];
15
19
  'l2-messages': [{ totalL2Messages: number; l1BlockNumber: number }];
16
- 'l2-epoch': [{ l2EpochNumber: number; timestamp: bigint; committee: EthAddress[] | undefined }];
17
- 'l2-slot': [{ l2SlotNumber: number; timestamp: bigint }];
20
+ 'l2-epoch': [{ l2EpochNumber: EpochNumber; timestamp: bigint; committee: EthAddress[] | undefined }];
21
+ 'l2-slot': [{ l2SlotNumber: SlotNumber; timestamp: bigint }];
18
22
  };
19
23
 
20
24
  /** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
@@ -27,20 +31,20 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
27
31
 
28
32
  /** Current L1 block number */
29
33
  public l1BlockNumber!: number;
30
- /** Current L2 block number */
31
- public l2BlockNumber!: number;
32
- /** Current L2 proven block number */
33
- public l2ProvenBlockNumber!: number;
34
- /** L1 timestamp for the current L2 block */
35
- public l2BlockTimestamp!: bigint;
36
- /** L1 timestamp for the proven L2 block */
37
- public l2ProvenBlockTimestamp!: bigint;
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;
38
42
  /** Total number of L2 messages pushed into the Inbox */
39
43
  public totalL2Messages: number = 0;
40
44
  /** Current L2 epoch number */
41
- public l2EpochNumber!: bigint;
45
+ public l2EpochNumber!: EpochNumber;
42
46
  /** Current L2 slot number */
43
- public l2SlotNumber!: bigint;
47
+ public l2SlotNumber!: SlotNumber;
44
48
 
45
49
  constructor(
46
50
  private readonly rollup: RollupContract,
@@ -102,30 +106,40 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
102
106
  }
103
107
  this.l1BlockNumber = newL1BlockNumber;
104
108
 
105
- const block = await this.l1Client.getBlock({ blockNumber: BigInt(newL1BlockNumber), includeTransactions: false });
106
- const timestamp = block.timestamp;
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;
107
116
  const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
108
117
 
109
118
  this.emit('l1-block', { l1BlockNumber: newL1BlockNumber, timestamp });
110
119
  let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
111
120
 
112
- const newL2BlockNumber = Number(await this.rollup.getBlockNumber());
113
- if (this.l2BlockNumber !== newL2BlockNumber) {
114
- const epochNumber = await this.rollup.getEpochNumber(BigInt(newL2BlockNumber));
115
- msg += ` with new L2 block ${newL2BlockNumber} for epoch ${epochNumber}`;
116
- this.l2BlockNumber = newL2BlockNumber;
117
- this.l2BlockTimestamp = timestamp;
118
- this.emit('l2-block', { l2BlockNumber: newL2BlockNumber, l1BlockNumber: newL1BlockNumber, timestamp });
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
+ });
119
133
  }
120
134
 
121
- const newL2ProvenBlockNumber = Number(await this.rollup.getProvenBlockNumber());
122
- if (this.l2ProvenBlockNumber !== newL2ProvenBlockNumber) {
123
- const epochNumber = await this.rollup.getEpochNumber(BigInt(newL2ProvenBlockNumber));
124
- msg += ` with proof up to L2 block ${newL2ProvenBlockNumber} for epoch ${epochNumber}`;
125
- this.l2ProvenBlockNumber = newL2ProvenBlockNumber;
126
- this.l2ProvenBlockTimestamp = timestamp;
127
- this.emit('l2-block-proven', {
128
- l2ProvenBlockNumber: newL2ProvenBlockNumber,
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,
129
143
  l1BlockNumber: newL1BlockNumber,
130
144
  timestamp,
131
145
  });
@@ -139,19 +153,17 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
139
153
  this.emit('l2-messages', { totalL2Messages: newTotalL2Messages, l1BlockNumber: newL1BlockNumber });
140
154
  }
141
155
 
142
- const [l2SlotNumber, l2Epoch] = await Promise.all([this.rollup.getSlotNumber(), this.rollup.getCurrentEpoch()]);
143
-
144
156
  let committee: EthAddress[] | undefined;
145
157
  if (l2Epoch !== this.l2EpochNumber) {
146
158
  this.l2EpochNumber = l2Epoch;
147
- committee = (await this.rollup.getCurrentEpochCommittee())?.map(addr => EthAddress.fromString(addr));
148
- this.emit('l2-epoch', { l2EpochNumber: Number(l2Epoch), timestamp, committee });
159
+ committee = await this.rollup.getCurrentEpochCommittee();
160
+ this.emit('l2-epoch', { l2EpochNumber: l2Epoch, timestamp, committee });
149
161
  msg += ` starting new epoch ${this.l2EpochNumber} `;
150
162
  }
151
163
 
152
164
  if (l2SlotNumber !== this.l2SlotNumber) {
153
165
  this.l2SlotNumber = l2SlotNumber;
154
- this.emit('l2-slot', { l2SlotNumber: Number(l2SlotNumber), timestamp });
166
+ this.emit('l2-slot', { l2SlotNumber, timestamp });
155
167
  }
156
168
 
157
169
  this.logger.info(msg, {
@@ -160,8 +172,8 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
160
172
  l1BlockNumber: this.l1BlockNumber,
161
173
  l2SlotNumber,
162
174
  l2Epoch,
163
- l2BlockNumber: this.l2BlockNumber,
164
- l2ProvenBlockNumber: this.l2ProvenBlockNumber,
175
+ checkpointNumber: this.checkpointNumber,
176
+ provenCheckpointNumber: this.provenCheckpointNumber,
165
177
  totalL2Messages: this.totalL2Messages,
166
178
  committee,
167
179
  });
@@ -169,14 +181,13 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
169
181
  return this;
170
182
  }
171
183
 
172
- public waitUntilL2Slot(slot: number | bigint): Promise<void> {
173
- const targetSlot = typeof slot === 'bigint' ? slot.valueOf() : slot;
174
- if (this.l2SlotNumber >= targetSlot) {
184
+ public waitUntilL2Slot(slot: SlotNumber): Promise<void> {
185
+ if (this.l2SlotNumber >= slot) {
175
186
  return Promise.resolve();
176
187
  }
177
188
  return new Promise(resolve => {
178
- const listener = (data: { l2SlotNumber: number; timestamp: bigint }) => {
179
- if (data.l2SlotNumber >= targetSlot) {
189
+ const listener = (data: { l2SlotNumber: SlotNumber; timestamp: bigint }) => {
190
+ if (data.l2SlotNumber >= slot) {
180
191
  this.off('l2-slot', listener);
181
192
  resolve();
182
193
  }
@@ -184,4 +195,51 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
184
195
  this.on('l2-slot', listener);
185
196
  });
186
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
+ }
187
245
  }
@@ -2,8 +2,8 @@ import { EthAddress } from '@aztec/foundation/eth-address';
2
2
  import { type Logger, createLogger } from '@aztec/foundation/log';
3
3
  import { DateProvider } from '@aztec/foundation/timer';
4
4
 
5
- import { type L1TxUtilsConfig, createViemSigner } from '../l1_tx_utils.js';
6
- import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
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
7
  import type { ExtendedViemWalletClient } from '../types.js';
8
8
  import { type Delayer, withDelayer } from './tx_delayer.js';
9
9