@aztec/ethereum 0.0.1-commit.fce3e4f → 0.0.1-commit.ff7989d6c

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 (199) hide show
  1. package/dest/client.js +6 -2
  2. package/dest/config.d.ts +19 -68
  3. package/dest/config.d.ts.map +1 -1
  4. package/dest/config.js +55 -380
  5. package/dest/contracts/empire_base.d.ts +4 -1
  6. package/dest/contracts/empire_base.d.ts.map +1 -1
  7. package/dest/contracts/empire_slashing_proposer.d.ts +4 -1
  8. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  9. package/dest/contracts/empire_slashing_proposer.js +31 -15
  10. package/dest/contracts/fee_asset_handler.d.ts +6 -5
  11. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_handler.js +11 -9
  13. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  14. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  15. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  16. package/dest/contracts/governance.d.ts +3 -1
  17. package/dest/contracts/governance.d.ts.map +1 -1
  18. package/dest/contracts/governance.js +14 -4
  19. package/dest/contracts/governance_proposer.d.ts +4 -1
  20. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  21. package/dest/contracts/governance_proposer.js +404 -9
  22. package/dest/contracts/inbox.d.ts +24 -3
  23. package/dest/contracts/inbox.d.ts.map +1 -1
  24. package/dest/contracts/inbox.js +36 -1
  25. package/dest/contracts/index.d.ts +4 -1
  26. package/dest/contracts/index.d.ts.map +1 -1
  27. package/dest/contracts/index.js +3 -0
  28. package/dest/contracts/log.d.ts +13 -0
  29. package/dest/contracts/log.d.ts.map +1 -0
  30. package/dest/contracts/log.js +1 -0
  31. package/dest/contracts/multicall.d.ts +1 -1
  32. package/dest/contracts/multicall.d.ts.map +1 -1
  33. package/dest/contracts/multicall.js +2 -1
  34. package/dest/contracts/outbox.d.ts +41 -0
  35. package/dest/contracts/outbox.d.ts.map +1 -0
  36. package/dest/contracts/outbox.js +86 -0
  37. package/dest/contracts/rollup.d.ts +177 -96
  38. package/dest/contracts/rollup.d.ts.map +1 -1
  39. package/dest/contracts/rollup.js +707 -144
  40. package/dest/contracts/tally_slashing_proposer.d.ts +3 -2
  41. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  42. package/dest/contracts/tally_slashing_proposer.js +8 -1
  43. package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
  44. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  45. package/dest/deploy_aztec_l1_contracts.js +413 -0
  46. package/dest/deploy_l1_contract.d.ts +68 -0
  47. package/dest/deploy_l1_contract.d.ts.map +1 -0
  48. package/dest/deploy_l1_contract.js +312 -0
  49. package/dest/forwarder_proxy.d.ts +32 -0
  50. package/dest/forwarder_proxy.d.ts.map +1 -0
  51. package/dest/forwarder_proxy.js +93 -0
  52. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  53. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  54. package/dest/generated/l1-contracts-defaults.js +30 -0
  55. package/dest/l1_artifacts.d.ts +5975 -1575
  56. package/dest/l1_artifacts.d.ts.map +1 -1
  57. package/dest/l1_contract_addresses.d.ts +1 -1
  58. package/dest/l1_contract_addresses.d.ts.map +1 -1
  59. package/dest/l1_contract_addresses.js +3 -3
  60. package/dest/l1_reader.d.ts +3 -1
  61. package/dest/l1_reader.d.ts.map +1 -1
  62. package/dest/l1_reader.js +6 -0
  63. package/dest/l1_tx_utils/config.d.ts +9 -3
  64. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  65. package/dest/l1_tx_utils/config.js +31 -4
  66. package/dest/l1_tx_utils/constants.d.ts +8 -2
  67. package/dest/l1_tx_utils/constants.d.ts.map +1 -1
  68. package/dest/l1_tx_utils/constants.js +27 -2
  69. package/dest/l1_tx_utils/factory.d.ts +18 -10
  70. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  71. package/dest/l1_tx_utils/factory.js +17 -7
  72. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  73. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  74. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  75. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  76. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  77. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  78. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  79. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  80. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  81. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  82. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  83. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  84. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  85. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  86. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +42 -0
  87. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  88. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  89. package/dest/l1_tx_utils/index-blobs.js +2 -0
  90. package/dest/l1_tx_utils/index.d.ts +4 -1
  91. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  92. package/dest/l1_tx_utils/index.js +3 -0
  93. package/dest/l1_tx_utils/interfaces.d.ts +2 -2
  94. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
  95. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  96. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  97. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  98. package/dest/l1_tx_utils/l1_tx_utils.d.ts +15 -5
  99. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  100. package/dest/l1_tx_utils/l1_tx_utils.js +64 -17
  101. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +4 -15
  102. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  103. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +53 -160
  104. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  105. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  106. package/dest/{test → l1_tx_utils}/tx_delayer.js +65 -36
  107. package/dest/publisher_manager.d.ts +3 -2
  108. package/dest/publisher_manager.d.ts.map +1 -1
  109. package/dest/publisher_manager.js +2 -2
  110. package/dest/queries.d.ts +2 -2
  111. package/dest/queries.d.ts.map +1 -1
  112. package/dest/queries.js +12 -4
  113. package/dest/test/chain_monitor.d.ts +15 -13
  114. package/dest/test/chain_monitor.d.ts.map +1 -1
  115. package/dest/test/chain_monitor.js +7 -9
  116. package/dest/test/eth_cheat_codes.d.ts +13 -1
  117. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  118. package/dest/test/eth_cheat_codes.js +4 -2
  119. package/dest/test/index.d.ts +1 -3
  120. package/dest/test/index.d.ts.map +1 -1
  121. package/dest/test/index.js +0 -2
  122. package/dest/test/rollup_cheat_codes.d.ts +9 -6
  123. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  124. package/dest/test/rollup_cheat_codes.js +32 -6
  125. package/dest/test/start_anvil.d.ts +3 -1
  126. package/dest/test/start_anvil.d.ts.map +1 -1
  127. package/dest/test/start_anvil.js +1 -1
  128. package/dest/test/upgrade_utils.js +2 -2
  129. package/dest/types.d.ts +57 -2
  130. package/dest/types.d.ts.map +1 -1
  131. package/dest/utils.d.ts +16 -3
  132. package/dest/utils.d.ts.map +1 -1
  133. package/dest/utils.js +64 -0
  134. package/package.json +33 -14
  135. package/src/client.ts +2 -2
  136. package/src/config.ts +65 -459
  137. package/src/contracts/README.md +157 -0
  138. package/src/contracts/empire_base.ts +3 -1
  139. package/src/contracts/empire_slashing_proposer.ts +28 -28
  140. package/src/contracts/fee_asset_handler.ts +10 -7
  141. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  142. package/src/contracts/governance.ts +13 -4
  143. package/src/contracts/governance_proposer.ts +16 -2
  144. package/src/contracts/inbox.ts +55 -3
  145. package/src/contracts/index.ts +3 -0
  146. package/src/contracts/log.ts +13 -0
  147. package/src/contracts/multicall.ts +5 -2
  148. package/src/contracts/outbox.ts +98 -0
  149. package/src/contracts/rollup.ts +390 -118
  150. package/src/contracts/tally_slashing_proposer.ts +7 -1
  151. package/src/deploy_aztec_l1_contracts.ts +650 -0
  152. package/src/deploy_l1_contract.ts +362 -0
  153. package/src/forwarder_proxy.ts +108 -0
  154. package/src/generated/l1-contracts-defaults.ts +32 -0
  155. package/src/l1_contract_addresses.ts +22 -20
  156. package/src/l1_reader.ts +8 -0
  157. package/src/l1_tx_utils/config.ts +44 -6
  158. package/src/l1_tx_utils/constants.ts +13 -2
  159. package/src/l1_tx_utils/factory.ts +31 -31
  160. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  161. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  162. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  163. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  164. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +108 -0
  165. package/src/l1_tx_utils/index-blobs.ts +2 -0
  166. package/src/l1_tx_utils/index.ts +3 -0
  167. package/src/l1_tx_utils/interfaces.ts +1 -1
  168. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  169. package/src/l1_tx_utils/l1_tx_utils.ts +76 -21
  170. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +67 -206
  171. package/src/{test → l1_tx_utils}/tx_delayer.ts +82 -52
  172. package/src/publisher_manager.ts +4 -2
  173. package/src/queries.ts +11 -3
  174. package/src/test/chain_monitor.ts +18 -16
  175. package/src/test/eth_cheat_codes.ts +2 -2
  176. package/src/test/index.ts +0 -2
  177. package/src/test/rollup_cheat_codes.ts +32 -9
  178. package/src/test/start_anvil.ts +3 -1
  179. package/src/test/upgrade_utils.ts +2 -2
  180. package/src/types.ts +62 -0
  181. package/src/utils.ts +83 -1
  182. package/dest/deploy_l1_contracts.d.ts +0 -673
  183. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  184. package/dest/deploy_l1_contracts.js +0 -1491
  185. package/dest/index.d.ts +0 -18
  186. package/dest/index.d.ts.map +0 -1
  187. package/dest/index.js +0 -17
  188. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  189. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  190. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  191. package/dest/test/delayed_tx_utils.d.ts +0 -13
  192. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  193. package/dest/test/delayed_tx_utils.js +0 -28
  194. package/dest/test/tx_delayer.d.ts +0 -36
  195. package/dest/test/tx_delayer.d.ts.map +0 -1
  196. package/src/deploy_l1_contracts.ts +0 -1869
  197. package/src/index.ts +0 -17
  198. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  199. package/src/test/delayed_tx_utils.ts +0 -52
@@ -1,7 +1,11 @@
1
- import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
1
+ import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import { Buffer32 } from '@aztec/foundation/buffer';
3
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
4
  import { memoize } from '@aztec/foundation/decorators';
3
5
  import { EthAddress } from '@aztec/foundation/eth-address';
4
6
  import type { ViemSignature } from '@aztec/foundation/eth-signature';
7
+ import { makeBackoff, retry } from '@aztec/foundation/retry';
8
+ import { EscapeHatchAbi } from '@aztec/l1-artifacts/EscapeHatchAbi';
5
9
  import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
6
10
  import { RollupStorage } from '@aztec/l1-artifacts/RollupStorage';
7
11
 
@@ -19,7 +23,7 @@ import {
19
23
  } from 'viem';
20
24
 
21
25
  import { getPublicClient } from '../client.js';
22
- import type { DeployL1ContractsReturnType } from '../deploy_l1_contracts.js';
26
+ import type { DeployAztecL1ContractsReturnType } from '../deploy_aztec_l1_contracts.js';
23
27
  import type { L1ContractAddresses } from '../l1_contract_addresses.js';
24
28
  import type { L1ReaderConfig } from '../l1_reader.js';
25
29
  import type { L1TxRequest, L1TxUtils } from '../l1_tx_utils/index.js';
@@ -27,6 +31,7 @@ import type { ViemClient } from '../types.js';
27
31
  import { formatViemError } from '../utils.js';
28
32
  import { EmpireSlashingProposerContract } from './empire_slashing_proposer.js';
29
33
  import { GSEContract } from './gse.js';
34
+ import type { L1EventLog } from './log.js';
30
35
  import { SlasherContract } from './slasher_contract.js';
31
36
  import { TallySlashingProposerContract } from './tally_slashing_proposer.js';
32
37
  import { checkBlockTag } from './utils.js';
@@ -57,13 +62,16 @@ export type L1RollupContractAddresses = Pick<
57
62
  export type EpochProofPublicInputArgs = {
58
63
  previousArchive: `0x${string}`;
59
64
  endArchive: `0x${string}`;
65
+ outHash: `0x${string}`;
60
66
  proverId: `0x${string}`;
61
67
  };
62
68
 
63
69
  export type ViemHeader = {
64
70
  lastArchiveRoot: `0x${string}`;
65
71
  blockHeadersHash: `0x${string}`;
66
- contentCommitment: ViemContentCommitment;
72
+ blobsHash: `0x${string}`;
73
+ inHash: `0x${string}`;
74
+ outHash: `0x${string}`;
67
75
  slotNumber: bigint;
68
76
  timestamp: bigint;
69
77
  coinbase: `0x${string}`;
@@ -72,12 +80,6 @@ export type ViemHeader = {
72
80
  totalManaUsed: bigint;
73
81
  };
74
82
 
75
- export type ViemContentCommitment = {
76
- blobsHash: `0x${string}`;
77
- inHash: `0x${string}`;
78
- outHash: `0x${string}`;
79
- };
80
-
81
83
  export type ViemGasFees = {
82
84
  feePerDaGas: bigint;
83
85
  feePerL2Gas: bigint;
@@ -89,10 +91,125 @@ export enum SlashingProposerType {
89
91
  Empire = 2,
90
92
  }
91
93
 
94
+ /**
95
+ * Status of a validator/attester in the staking system.
96
+ * Matches the Status enum in StakingLib.sol
97
+ */
98
+ export enum AttesterStatus {
99
+ NONE = 0,
100
+ VALIDATING = 1,
101
+ ZOMBIE = 2,
102
+ EXITING = 3,
103
+ }
104
+
105
+ /**
106
+ * Fee header data for a checkpoint
107
+ */
108
+ export type FeeHeader = {
109
+ excessMana: bigint;
110
+ manaUsed: bigint;
111
+ ethPerFeeAsset: bigint;
112
+ congestionCost: bigint;
113
+ proverCost: bigint;
114
+ };
115
+
116
+ /**
117
+ * Checkpoint log data returned from the rollup contract
118
+ */
119
+ export type CheckpointLog = {
120
+ archive: Fr;
121
+ headerHash: Buffer32;
122
+ blobCommitmentsHash: Buffer32;
123
+ attestationsHash: Buffer32;
124
+ payloadDigest: Buffer32;
125
+ slotNumber: SlotNumber;
126
+ feeHeader: FeeHeader;
127
+ };
128
+
129
+ /**
130
+ * L1 fee data (base fee and blob fee)
131
+ */
132
+ export type L1FeeData = {
133
+ baseFee: bigint;
134
+ blobFee: bigint;
135
+ };
136
+
137
+ /**
138
+ * Reward configuration for the rollup
139
+ */
140
+ export type RewardConfig = {
141
+ rewardDistributor: EthAddress;
142
+ sequencerBps: bigint;
143
+ booster: EthAddress;
144
+ checkpointReward: bigint;
145
+ };
146
+
147
+ /**
148
+ * Exit information for a validator
149
+ */
150
+ export type Exit = {
151
+ withdrawalId: bigint;
152
+ amount: bigint;
153
+ exitableAt: bigint;
154
+ recipientOrWithdrawer: EthAddress;
155
+ isRecipient: boolean;
156
+ exists: boolean;
157
+ };
158
+
159
+ /**
160
+ * Attester configuration including public key and withdrawer
161
+ */
162
+ export type AttesterConfig = {
163
+ publicKey: {
164
+ x: bigint;
165
+ y: bigint;
166
+ };
167
+ withdrawer: EthAddress;
168
+ };
169
+
170
+ /**
171
+ * Complete view of an attester's state
172
+ */
173
+ export type AttesterView = {
174
+ status: AttesterStatus;
175
+ effectiveBalance: bigint;
176
+ exit: Exit;
177
+ config: AttesterConfig;
178
+ };
179
+
180
+ /**
181
+ * Return for a status call
182
+ */
183
+ export type RollupStatusResponse = {
184
+ provenCheckpointNumber: CheckpointNumber;
185
+ provenArchive: Fr;
186
+ pendingCheckpointNumber: CheckpointNumber;
187
+ pendingArchive: Fr;
188
+ archiveOfMyCheckpoint: Fr;
189
+ };
190
+
191
+ /** Arguments for the CheckpointProposed event. */
192
+ export type CheckpointProposedArgs = {
193
+ checkpointNumber: CheckpointNumber;
194
+ archive: Fr;
195
+ versionedBlobHashes: Buffer[];
196
+ /** Hash of attestations. Undefined for older events (backwards compatibility). */
197
+ attestationsHash?: Buffer32;
198
+ /** Digest of the payload. Undefined for older events (backwards compatibility). */
199
+ payloadDigest?: Buffer32;
200
+ };
201
+
202
+ /** Log type for CheckpointProposed events. */
203
+ export type CheckpointProposedLog = L1EventLog<CheckpointProposedArgs>;
204
+
92
205
  export class RollupContract {
93
206
  private readonly rollup: GetContractReturnType<typeof RollupAbi, ViemClient>;
94
207
 
95
208
  private static cachedStfStorageSlot: Hex | undefined;
209
+ private cachedEscapeHatch?: {
210
+ address: EthAddress;
211
+ contract: GetContractReturnType<typeof EscapeHatchAbi, ViemClient>;
212
+ };
96
213
 
97
214
  static get checkBlobStorageSlot(): bigint {
98
215
  const asString = RollupStorage.find(storage => storage.label === 'checkBlob')?.slot;
@@ -106,7 +223,7 @@ export class RollupContract {
106
223
  return (RollupContract.cachedStfStorageSlot ??= keccak256(Buffer.from('aztec.stf.storage', 'utf-8')));
107
224
  }
108
225
 
109
- static getFromL1ContractsValues(deployL1ContractsValues: DeployL1ContractsReturnType) {
226
+ static getFromL1ContractsValues(deployL1ContractsValues: DeployAztecL1ContractsReturnType) {
110
227
  const {
111
228
  l1Client,
112
229
  l1ContractAddresses: { rollupAddress },
@@ -130,8 +247,8 @@ export class RollupContract {
130
247
  this.rollup = getContract({ address, abi: RollupAbi, client });
131
248
  }
132
249
 
133
- getGSE() {
134
- return this.rollup.read.getGSE();
250
+ async getGSE(): Promise<EthAddress> {
251
+ return EthAddress.fromString(await this.rollup.read.getGSE());
135
252
  }
136
253
 
137
254
  public get address() {
@@ -173,23 +290,23 @@ export class RollupContract {
173
290
  }
174
291
 
175
292
  @memoize
176
- getL1StartBlock() {
293
+ getL1StartBlock(): Promise<bigint> {
177
294
  return this.rollup.read.L1_BLOCK_AT_GENESIS();
178
295
  }
179
296
 
180
297
  @memoize
181
- getL1GenesisTime() {
298
+ getL1GenesisTime(): Promise<bigint> {
182
299
  return this.rollup.read.getGenesisTime();
183
300
  }
184
301
 
185
302
  @memoize
186
- getProofSubmissionEpochs() {
187
- return this.rollup.read.getProofSubmissionEpochs();
303
+ async getProofSubmissionEpochs(): Promise<number> {
304
+ return Number(await this.rollup.read.getProofSubmissionEpochs());
188
305
  }
189
306
 
190
307
  @memoize
191
- getEpochDuration() {
192
- return this.rollup.read.getEpochDuration();
308
+ async getEpochDuration(): Promise<number> {
309
+ return Number(await this.rollup.read.getEpochDuration());
193
310
  }
194
311
 
195
312
  @memoize
@@ -198,68 +315,68 @@ export class RollupContract {
198
315
  }
199
316
 
200
317
  @memoize
201
- getTargetCommitteeSize() {
202
- return this.rollup.read.getTargetCommitteeSize();
318
+ async getTargetCommitteeSize(): Promise<number> {
319
+ return Number(await this.rollup.read.getTargetCommitteeSize());
203
320
  }
204
321
 
205
322
  @memoize
206
- getEjectionThreshold() {
323
+ getEjectionThreshold(): Promise<bigint> {
207
324
  return this.rollup.read.getEjectionThreshold();
208
325
  }
209
326
 
210
327
  @memoize
211
- getLocalEjectionThreshold() {
328
+ getLocalEjectionThreshold(): Promise<bigint> {
212
329
  return this.rollup.read.getLocalEjectionThreshold();
213
330
  }
214
331
 
215
332
  @memoize
216
- getLagInEpochsForValidatorSet() {
217
- return this.rollup.read.getLagInEpochsForValidatorSet();
333
+ async getLagInEpochsForValidatorSet(): Promise<number> {
334
+ return Number(await this.rollup.read.getLagInEpochsForValidatorSet());
218
335
  }
219
336
 
220
337
  @memoize
221
- getLagInEpochsForRandao() {
222
- return this.rollup.read.getLagInEpochsForRandao();
338
+ async getLagInEpochsForRandao(): Promise<number> {
339
+ return Number(await this.rollup.read.getLagInEpochsForRandao());
223
340
  }
224
341
 
225
342
  @memoize
226
- getActivationThreshold() {
343
+ getActivationThreshold(): Promise<bigint> {
227
344
  return this.rollup.read.getActivationThreshold();
228
345
  }
229
346
 
230
347
  @memoize
231
- getExitDelay() {
232
- return this.rollup.read.getExitDelay();
348
+ async getExitDelay(): Promise<number> {
349
+ return Number(await this.rollup.read.getExitDelay());
233
350
  }
234
351
 
235
352
  @memoize
236
- getManaTarget() {
353
+ getManaTarget(): Promise<bigint> {
237
354
  return this.rollup.read.getManaTarget();
238
355
  }
239
356
 
240
357
  @memoize
241
- getProvingCostPerMana() {
358
+ getProvingCostPerMana(): Promise<bigint> {
242
359
  return this.rollup.read.getProvingCostPerManaInEth();
243
360
  }
244
361
 
245
362
  @memoize
246
- getProvingCostPerManaInFeeAsset() {
363
+ getProvingCostPerManaInFeeAsset(): Promise<bigint> {
247
364
  return this.rollup.read.getProvingCostPerManaInFeeAsset();
248
365
  }
249
366
 
250
367
  @memoize
251
- getManaLimit() {
368
+ getManaLimit(): Promise<bigint> {
252
369
  return this.rollup.read.getManaLimit();
253
370
  }
254
371
 
255
372
  @memoize
256
- getVersion() {
373
+ getVersion(): Promise<bigint> {
257
374
  return this.rollup.read.getVersion();
258
375
  }
259
376
 
260
377
  @memoize
261
- async getGenesisArchiveTreeRoot(): Promise<`0x${string}`> {
262
- return await this.rollup.read.archiveAt([0n]);
378
+ async getGenesisArchiveTreeRoot(): Promise<Fr> {
379
+ return Fr.fromString(await this.rollup.read.archiveAt([0n]));
263
380
  }
264
381
 
265
382
  /**
@@ -274,44 +391,100 @@ export class RollupContract {
274
391
  slotDuration: number;
275
392
  epochDuration: number;
276
393
  proofSubmissionEpochs: number;
394
+ targetCommitteeSize: number;
277
395
  }> {
278
- const [l1StartBlock, l1GenesisTime, slotDuration, epochDuration, proofSubmissionEpochs] = await Promise.all([
279
- this.getL1StartBlock(),
280
- this.getL1GenesisTime(),
281
- this.getSlotDuration(),
282
- this.getEpochDuration(),
283
- this.getProofSubmissionEpochs(),
284
- ]);
396
+ const [l1StartBlock, l1GenesisTime, slotDuration, epochDuration, proofSubmissionEpochs, targetCommitteeSize] =
397
+ await Promise.all([
398
+ this.getL1StartBlock(),
399
+ this.getL1GenesisTime(),
400
+ this.getSlotDuration(),
401
+ this.getEpochDuration(),
402
+ this.getProofSubmissionEpochs(),
403
+ this.getTargetCommitteeSize(),
404
+ ]);
285
405
  return {
286
406
  l1StartBlock,
287
407
  l1GenesisTime,
288
408
  slotDuration,
289
409
  epochDuration: Number(epochDuration),
290
410
  proofSubmissionEpochs: Number(proofSubmissionEpochs),
411
+ targetCommitteeSize,
291
412
  };
292
413
  }
293
414
 
294
- getSlasherAddress() {
295
- return this.rollup.read.getSlasher();
415
+ async getSlasherAddress(): Promise<EthAddress> {
416
+ return EthAddress.fromString(await this.rollup.read.getSlasher());
417
+ }
418
+
419
+ /**
420
+ * Returns the configured escape hatch contract address, or zero if disabled.
421
+ */
422
+ async getEscapeHatchAddress(): Promise<EthAddress> {
423
+ return EthAddress.fromString(await this.rollup.read.getEscapeHatch());
424
+ }
425
+
426
+ private async getEscapeHatchContract(): Promise<
427
+ GetContractReturnType<typeof EscapeHatchAbi, ViemClient> | undefined
428
+ > {
429
+ const escapeHatchAddress = await this.getEscapeHatchAddress();
430
+ if (escapeHatchAddress.isZero()) {
431
+ return undefined;
432
+ }
433
+
434
+ // Cache the viem contract wrapper since it will be used frequently.
435
+ if (!this.cachedEscapeHatch || !this.cachedEscapeHatch.address.equals(escapeHatchAddress)) {
436
+ this.cachedEscapeHatch = {
437
+ address: escapeHatchAddress,
438
+ contract: getContract({
439
+ address: escapeHatchAddress.toString(),
440
+ abi: EscapeHatchAbi,
441
+ client: this.client,
442
+ }),
443
+ };
444
+ }
445
+
446
+ return this.cachedEscapeHatch.contract;
447
+ }
448
+
449
+ /**
450
+ * Returns whether the escape hatch is open for the given epoch.
451
+ * If escape hatch is not configured, returns false.
452
+ *
453
+ * This function is intentionally defensive: any failure to query the escape hatch
454
+ * (RPC issues, transient errors, etc.) is treated as "closed" to avoid callers
455
+ * needing to sprinkle try/catch everywhere.
456
+ */
457
+ async isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean> {
458
+ try {
459
+ const escapeHatch = await this.getEscapeHatchContract();
460
+ if (!escapeHatch) {
461
+ return false;
462
+ }
463
+
464
+ const [isOpen] = await escapeHatch.read.isHatchOpen([BigInt(epoch)]);
465
+ return isOpen;
466
+ } catch {
467
+ return false;
468
+ }
296
469
  }
297
470
 
298
471
  /**
299
472
  * Returns a SlasherContract instance for interacting with the slasher contract.
300
473
  */
301
474
  async getSlasherContract(): Promise<SlasherContract | undefined> {
302
- const slasherAddress = EthAddress.fromString(await this.getSlasherAddress());
475
+ const slasherAddress = await this.getSlasherAddress();
303
476
  if (slasherAddress.isZero()) {
304
477
  return undefined;
305
478
  }
306
479
  return new SlasherContract(this.client, slasherAddress);
307
480
  }
308
481
 
309
- getOwner() {
310
- return this.rollup.read.owner();
482
+ async getOwner(): Promise<EthAddress> {
483
+ return EthAddress.fromString(await this.rollup.read.owner());
311
484
  }
312
485
 
313
- getActiveAttesterCount() {
314
- return this.rollup.read.getActiveAttesterCount();
486
+ async getActiveAttesterCount(): Promise<number> {
487
+ return Number(await this.rollup.read.getActiveAttesterCount());
315
488
  }
316
489
 
317
490
  public async getSlashingProposerAddress() {
@@ -322,31 +495,35 @@ export class RollupContract {
322
495
  return await slasher.getProposer();
323
496
  }
324
497
 
325
- getCheckpointReward() {
498
+ getCheckpointReward(): Promise<bigint> {
326
499
  return this.rollup.read.getCheckpointReward();
327
500
  }
328
501
 
329
- getCheckpointNumber() {
330
- return this.rollup.read.getPendingCheckpointNumber();
502
+ async getCheckpointNumber(): Promise<CheckpointNumber> {
503
+ return CheckpointNumber.fromBigInt(await this.rollup.read.getPendingCheckpointNumber());
331
504
  }
332
505
 
333
- getProvenCheckpointNumber() {
334
- return this.rollup.read.getProvenCheckpointNumber();
506
+ async getProvenCheckpointNumber(): Promise<CheckpointNumber> {
507
+ return CheckpointNumber.fromBigInt(await this.rollup.read.getProvenCheckpointNumber());
335
508
  }
336
509
 
337
510
  async getSlotNumber(): Promise<SlotNumber> {
338
511
  return SlotNumber.fromBigInt(await this.rollup.read.getCurrentSlot());
339
512
  }
340
513
 
341
- getL1FeesAt(timestamp: bigint) {
342
- return this.rollup.read.getL1FeesAt([timestamp]);
514
+ async getL1FeesAt(timestamp: bigint): Promise<L1FeeData> {
515
+ const result = await this.rollup.read.getL1FeesAt([timestamp]);
516
+ return {
517
+ baseFee: result.baseFee,
518
+ blobFee: result.blobFee,
519
+ };
343
520
  }
344
521
 
345
- getFeeAssetPerEth() {
346
- return this.rollup.read.getFeeAssetPerEth();
522
+ getEthPerFeeAsset(): Promise<bigint> {
523
+ return this.rollup.read.getEthPerFeeAsset();
347
524
  }
348
525
 
349
- async getCommitteeAt(timestamp: bigint): Promise<readonly `0x${string}`[] | undefined> {
526
+ async getCommitteeAt(timestamp: bigint): Promise<EthAddress[] | undefined> {
350
527
  const { result } = await this.client
351
528
  .simulateContract({
352
529
  address: this.address,
@@ -361,22 +538,22 @@ export class RollupContract {
361
538
  throw e;
362
539
  });
363
540
 
364
- return result;
541
+ return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
365
542
  }
366
543
 
367
- getSampleSeedAt(timestamp: bigint) {
368
- return this.rollup.read.getSampleSeedAt([timestamp]);
544
+ async getSampleSeedAt(timestamp: bigint): Promise<Buffer32> {
545
+ return Buffer32.fromBigInt(await this.rollup.read.getSampleSeedAt([timestamp]));
369
546
  }
370
547
 
371
- getCurrentSampleSeed() {
372
- return this.rollup.read.getCurrentSampleSeed();
548
+ async getCurrentSampleSeed(): Promise<Buffer32> {
549
+ return Buffer32.fromBigInt(await this.rollup.read.getCurrentSampleSeed());
373
550
  }
374
551
 
375
552
  async getCurrentEpoch(): Promise<EpochNumber> {
376
553
  return EpochNumber.fromBigInt(await this.rollup.read.getCurrentEpoch());
377
554
  }
378
555
 
379
- async getCurrentEpochCommittee(): Promise<readonly `0x${string}`[] | undefined> {
556
+ async getCurrentEpochCommittee(): Promise<EthAddress[] | undefined> {
380
557
  const { result } = await this.client
381
558
  .simulateContract({
382
559
  address: this.address,
@@ -391,10 +568,10 @@ export class RollupContract {
391
568
  throw e;
392
569
  });
393
570
 
394
- return result;
571
+ return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
395
572
  }
396
573
 
397
- async getCurrentProposer() {
574
+ async getCurrentProposer(): Promise<EthAddress> {
398
575
  const { result } = await this.client.simulateContract({
399
576
  address: this.address,
400
577
  abi: RollupAbi,
@@ -402,10 +579,10 @@ export class RollupContract {
402
579
  args: [],
403
580
  });
404
581
 
405
- return result;
582
+ return EthAddress.fromString(result);
406
583
  }
407
584
 
408
- async getProposerAt(timestamp: bigint) {
585
+ async getProposerAt(timestamp: bigint): Promise<EthAddress> {
409
586
  const { result } = await this.client.simulateContract({
410
587
  address: this.address,
411
588
  abi: RollupAbi,
@@ -413,27 +590,61 @@ export class RollupContract {
413
590
  args: [timestamp],
414
591
  });
415
592
 
416
- return result;
593
+ return EthAddress.fromString(result);
417
594
  }
418
595
 
419
- getCheckpoint(checkpointNumber: bigint | number) {
420
- return this.rollup.read.getCheckpoint([BigInt(checkpointNumber)]);
596
+ async getCheckpoint(checkpointNumber: CheckpointNumber): Promise<CheckpointLog> {
597
+ const result = await this.rollup.read.getCheckpoint([BigInt(checkpointNumber)]);
598
+ return {
599
+ archive: Fr.fromString(result.archive),
600
+ headerHash: Buffer32.fromString(result.headerHash),
601
+ blobCommitmentsHash: Buffer32.fromString(result.blobCommitmentsHash),
602
+ attestationsHash: Buffer32.fromString(result.attestationsHash),
603
+ payloadDigest: Buffer32.fromString(result.payloadDigest),
604
+ slotNumber: SlotNumber.fromBigInt(result.slotNumber),
605
+ feeHeader: {
606
+ excessMana: result.feeHeader.excessMana,
607
+ manaUsed: result.feeHeader.manaUsed,
608
+ ethPerFeeAsset: result.feeHeader.ethPerFeeAsset,
609
+ congestionCost: result.feeHeader.congestionCost,
610
+ proverCost: result.feeHeader.proverCost,
611
+ },
612
+ };
421
613
  }
422
614
 
423
- getTips() {
424
- return this.rollup.read.getTips();
615
+ /** Returns the pending checkpoint from the rollup contract */
616
+ getPendingCheckpoint() {
617
+ // We retry because of race conditions during prunes: we may get a pending checkpoint number which is immediately
618
+ // reorged out due to a prune happening, causing the subsequent getCheckpoint call to fail. So we try again in that case.
619
+ return retry(
620
+ async () => {
621
+ const pendingCheckpointNumber = await this.getCheckpointNumber();
622
+ const pendingCheckpoint = await this.getCheckpoint(pendingCheckpointNumber);
623
+ return pendingCheckpoint;
624
+ },
625
+ 'getting pending checkpoint',
626
+ makeBackoff([0.5, 0.5, 0.5]),
627
+ );
425
628
  }
426
629
 
427
- getTimestampForSlot(slot: SlotNumber) {
630
+ async getTips(): Promise<{ pending: CheckpointNumber; proven: CheckpointNumber }> {
631
+ const { pending, proven } = await this.rollup.read.getTips();
632
+ return {
633
+ pending: CheckpointNumber.fromBigInt(pending),
634
+ proven: CheckpointNumber.fromBigInt(proven),
635
+ };
636
+ }
637
+
638
+ getTimestampForSlot(slot: SlotNumber): Promise<bigint> {
428
639
  return this.rollup.read.getTimestampForSlot([BigInt(slot)]);
429
640
  }
430
641
 
431
- getEntryQueueLength() {
432
- return this.rollup.read.getEntryQueueLength();
642
+ async getEntryQueueLength(): Promise<number> {
643
+ return Number(await this.rollup.read.getEntryQueueLength());
433
644
  }
434
645
 
435
- getAvailableValidatorFlushes() {
436
- return this.rollup.read.getAvailableValidatorFlushes();
646
+ async getAvailableValidatorFlushes(): Promise<number> {
647
+ return Number(await this.rollup.read.getAvailableValidatorFlushes());
437
648
  }
438
649
 
439
650
  async getNextFlushableEpoch(): Promise<EpochNumber> {
@@ -444,7 +655,7 @@ export class RollupContract {
444
655
  return EpochNumber.fromBigInt(await this.rollup.read.getCurrentEpoch());
445
656
  }
446
657
 
447
- async getEpochNumberForCheckpoint(checkpointNumber: bigint): Promise<EpochNumber> {
658
+ async getEpochNumberForCheckpoint(checkpointNumber: CheckpointNumber): Promise<EpochNumber> {
448
659
  return EpochNumber.fromBigInt(await this.rollup.read.getEpochForCheckpoint([BigInt(checkpointNumber)]));
449
660
  }
450
661
 
@@ -489,10 +700,11 @@ export class RollupContract {
489
700
  return EpochNumber.fromBigInt(await this.rollup.read.getEpochAtSlot([BigInt(slotNumber)]));
490
701
  }
491
702
 
492
- getEpochProofPublicInputs(
703
+ async getEpochProofPublicInputs(
493
704
  args: readonly [bigint, bigint, EpochProofPublicInputArgs, readonly `0x${string}`[], `0x${string}`],
494
- ) {
495
- return this.rollup.read.getEpochProofPublicInputs(args);
705
+ ): Promise<Fr[]> {
706
+ const result = await this.rollup.read.getEpochProofPublicInputs(args);
707
+ return result.map(Fr.fromString);
496
708
  }
497
709
 
498
710
  public async validateHeader(
@@ -537,8 +749,8 @@ export class RollupContract {
537
749
  archive: Buffer,
538
750
  account: `0x${string}` | Account,
539
751
  slotDuration: number,
540
- opts: { forcePendingCheckpointNumber?: number } = {},
541
- ): Promise<{ slot: SlotNumber; checkpointNumber: bigint; timeOfNextL1Slot: bigint }> {
752
+ opts: { forcePendingCheckpointNumber?: CheckpointNumber } = {},
753
+ ): Promise<{ slot: SlotNumber; checkpointNumber: CheckpointNumber; timeOfNextL1Slot: bigint }> {
542
754
  const latestBlock = await this.client.getBlock();
543
755
  const timeOfNextL1Slot = latestBlock.timestamp + BigInt(slotDuration);
544
756
  const who = typeof account === 'string' ? account : account.address;
@@ -555,7 +767,11 @@ export class RollupContract {
555
767
  stateOverride: await this.makePendingCheckpointNumberOverride(opts.forcePendingCheckpointNumber),
556
768
  });
557
769
 
558
- return { slot: SlotNumber.fromBigInt(slot), checkpointNumber, timeOfNextL1Slot };
770
+ return {
771
+ slot: SlotNumber.fromBigInt(slot),
772
+ checkpointNumber: CheckpointNumber.fromBigInt(checkpointNumber),
773
+ timeOfNextL1Slot,
774
+ };
559
775
  } catch (err: unknown) {
560
776
  throw formatViemError(err);
561
777
  }
@@ -567,7 +783,7 @@ export class RollupContract {
567
783
  * stored in the same slot. If the argument is undefined, it returns an empty override.
568
784
  */
569
785
  public async makePendingCheckpointNumberOverride(
570
- forcePendingCheckpointNumber: number | undefined,
786
+ forcePendingCheckpointNumber: CheckpointNumber | undefined,
571
787
  ): Promise<StateOverride> {
572
788
  if (forcePendingCheckpointNumber === undefined) {
573
789
  return [];
@@ -586,13 +802,14 @@ export class RollupContract {
586
802
 
587
803
  /** Creates a request to Rollup#invalidateBadAttestation to be simulated or sent */
588
804
  public buildInvalidateBadAttestationRequest(
589
- checkpointNumber: number,
805
+ checkpointNumber: CheckpointNumber,
590
806
  attestationsAndSigners: ViemCommitteeAttestations,
591
807
  committee: EthAddress[],
592
808
  invalidIndex: number,
593
809
  ): L1TxRequest {
594
810
  return {
595
811
  to: this.address,
812
+ abi: RollupAbi,
596
813
  data: encodeFunctionData({
597
814
  abi: RollupAbi,
598
815
  functionName: 'invalidateBadAttestation',
@@ -608,12 +825,13 @@ export class RollupContract {
608
825
 
609
826
  /** Creates a request to Rollup#invalidateInsufficientAttestations to be simulated or sent */
610
827
  public buildInvalidateInsufficientAttestationsRequest(
611
- checkpointNumber: number,
828
+ checkpointNumber: CheckpointNumber,
612
829
  attestationsAndSigners: ViemCommitteeAttestations,
613
830
  committee: EthAddress[],
614
831
  ): L1TxRequest {
615
832
  return {
616
833
  to: this.address,
834
+ abi: RollupAbi,
617
835
  data: encodeFunctionData({
618
836
  abi: RollupAbi,
619
837
  functionName: 'invalidateInsufficientAttestations',
@@ -630,90 +848,124 @@ export class RollupContract {
630
848
  return this.rollup.read.getHasSubmitted([BigInt(epochNumber), BigInt(numberOfCheckpointsInEpoch), prover]);
631
849
  }
632
850
 
633
- getManaBaseFeeAt(timestamp: bigint, inFeeAsset: boolean) {
634
- return this.rollup.read.getManaBaseFeeAt([timestamp, inFeeAsset]);
851
+ getManaMinFeeAt(timestamp: bigint, inFeeAsset: boolean): Promise<bigint> {
852
+ return this.rollup.read.getManaMinFeeAt([timestamp, inFeeAsset]);
635
853
  }
636
854
 
637
855
  async getSlotAt(timestamp: bigint): Promise<SlotNumber> {
638
856
  return SlotNumber.fromBigInt(await this.rollup.read.getSlotAt([timestamp]));
639
857
  }
640
858
 
641
- async status(checkpointNumber: bigint, options?: { blockNumber?: bigint }) {
859
+ async status(checkpointNumber: CheckpointNumber, options?: { blockNumber?: bigint }): Promise<RollupStatusResponse> {
642
860
  await checkBlockTag(options?.blockNumber, this.client);
643
- return this.rollup.read.status([checkpointNumber], options);
861
+ const result = await this.rollup.read.status([BigInt(checkpointNumber)], options);
862
+ return {
863
+ provenCheckpointNumber: CheckpointNumber.fromBigInt(result[0]),
864
+ provenArchive: Fr.fromString(result[1]),
865
+ pendingCheckpointNumber: CheckpointNumber.fromBigInt(result[2]),
866
+ pendingArchive: Fr.fromString(result[3]),
867
+ archiveOfMyCheckpoint: Fr.fromString(result[4]),
868
+ };
644
869
  }
645
870
 
646
- async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }) {
871
+ async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }): Promise<boolean> {
647
872
  await checkBlockTag(options?.blockNumber, this.client);
648
873
  return this.rollup.read.canPruneAtTime([timestamp], options);
649
874
  }
650
875
 
651
- archive() {
652
- return this.rollup.read.archive();
876
+ async archive(): Promise<Fr> {
877
+ return Fr.fromString(await this.rollup.read.archive());
653
878
  }
654
879
 
655
- archiveAt(checkpointNumber: bigint) {
656
- return this.rollup.read.archiveAt([checkpointNumber]);
880
+ async archiveAt(checkpointNumber: CheckpointNumber): Promise<Fr> {
881
+ return Fr.fromString(await this.rollup.read.archiveAt([BigInt(checkpointNumber)]));
657
882
  }
658
883
 
659
- getSequencerRewards(address: Hex | EthAddress) {
884
+ getSequencerRewards(address: Hex | EthAddress): Promise<bigint> {
660
885
  if (address instanceof EthAddress) {
661
886
  address = address.toString();
662
887
  }
663
888
  return this.rollup.read.getSequencerRewards([address]);
664
889
  }
665
890
 
666
- getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress) {
891
+ getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress): Promise<bigint> {
667
892
  if (prover instanceof EthAddress) {
668
893
  prover = prover.toString();
669
894
  }
670
895
  return this.rollup.read.getSpecificProverRewardsForEpoch([epoch, prover]);
671
896
  }
672
897
 
673
- async getAttesters() {
898
+ async getAttesters(): Promise<EthAddress[]> {
674
899
  const attesterSize = await this.getActiveAttesterCount();
675
900
  const gse = new GSEContract(this.client, await this.getGSE());
676
901
  const ts = (await this.client.getBlock()).timestamp;
677
902
 
678
- const indices = Array.from({ length: Number(attesterSize) }, (_, i) => BigInt(i));
903
+ const indices = Array.from({ length: attesterSize }, (_, i) => BigInt(i));
679
904
  const chunks = chunk(indices, 1000);
680
905
 
681
- return (await Promise.all(chunks.map(chunk => gse.getAttestersFromIndicesAtTime(this.address, ts, chunk)))).flat();
906
+ const results = await Promise.all(chunks.map(chunk => gse.getAttestersFromIndicesAtTime(this.address, ts, chunk)));
907
+ return results.flat().map(addr => EthAddress.fromString(addr));
682
908
  }
683
909
 
684
- getAttesterView(address: Hex | EthAddress) {
910
+ async getAttesterView(address: Hex | EthAddress): Promise<AttesterView> {
685
911
  if (address instanceof EthAddress) {
686
912
  address = address.toString();
687
913
  }
688
- return this.rollup.read.getAttesterView([address]);
914
+ const result = await this.rollup.read.getAttesterView([address]);
915
+ return {
916
+ status: result.status as AttesterStatus,
917
+ effectiveBalance: result.effectiveBalance,
918
+ exit: {
919
+ withdrawalId: result.exit.withdrawalId,
920
+ amount: result.exit.amount,
921
+ exitableAt: result.exit.exitableAt,
922
+ recipientOrWithdrawer: EthAddress.fromString(result.exit.recipientOrWithdrawer),
923
+ isRecipient: result.exit.isRecipient,
924
+ exists: result.exit.exists,
925
+ },
926
+ config: {
927
+ publicKey: {
928
+ x: result.config.publicKey.x,
929
+ y: result.config.publicKey.y,
930
+ },
931
+ withdrawer: EthAddress.fromString(result.config.withdrawer),
932
+ },
933
+ };
689
934
  }
690
935
 
691
- getStatus(address: Hex | EthAddress) {
936
+ async getStatus(address: Hex | EthAddress): Promise<AttesterStatus> {
692
937
  if (address instanceof EthAddress) {
693
938
  address = address.toString();
694
939
  }
695
- return this.rollup.read.getStatus([address]);
940
+ return (await this.rollup.read.getStatus([address])) as AttesterStatus;
696
941
  }
697
942
 
698
- getBlobCommitmentsHash(checkpointNumber: bigint) {
699
- return this.rollup.read.getBlobCommitmentsHash([checkpointNumber]);
943
+ async getBlobCommitmentsHash(checkpointNumber: CheckpointNumber): Promise<Buffer32> {
944
+ return Buffer32.fromString(await this.rollup.read.getBlobCommitmentsHash([BigInt(checkpointNumber)]));
700
945
  }
701
946
 
702
- getCurrentBlobCommitmentsHash() {
703
- return this.rollup.read.getCurrentBlobCommitmentsHash();
947
+ async getCurrentBlobCommitmentsHash(): Promise<Buffer32> {
948
+ return Buffer32.fromString(await this.rollup.read.getCurrentBlobCommitmentsHash());
704
949
  }
705
950
 
706
- getStakingAsset() {
707
- return this.rollup.read.getStakingAsset();
951
+ async getStakingAsset(): Promise<EthAddress> {
952
+ return EthAddress.fromString(await this.rollup.read.getStakingAsset());
708
953
  }
709
954
 
710
- getRewardConfig() {
711
- return this.rollup.read.getRewardConfig();
955
+ async getRewardConfig(): Promise<RewardConfig> {
956
+ const result = await this.rollup.read.getRewardConfig();
957
+ return {
958
+ rewardDistributor: EthAddress.fromString(result.rewardDistributor),
959
+ sequencerBps: BigInt(result.sequencerBps),
960
+ booster: EthAddress.fromString(result.booster),
961
+ checkpointReward: result.checkpointReward,
962
+ };
712
963
  }
713
964
 
714
965
  setupEpoch(l1TxUtils: L1TxUtils) {
715
966
  return l1TxUtils.sendAndMonitorTransaction({
716
967
  to: this.address,
968
+ abi: RollupAbi,
717
969
  data: encodeFunctionData({
718
970
  abi: RollupAbi,
719
971
  functionName: 'setupEpoch',
@@ -725,6 +977,7 @@ export class RollupContract {
725
977
  vote(l1TxUtils: L1TxUtils, proposalId: bigint) {
726
978
  return l1TxUtils.sendAndMonitorTransaction({
727
979
  to: this.address,
980
+ abi: RollupAbi,
728
981
  data: encodeFunctionData({
729
982
  abi: RollupAbi,
730
983
  functionName: 'vote',
@@ -752,7 +1005,7 @@ export class RollupContract {
752
1005
  }
753
1006
 
754
1007
  public listenToCheckpointInvalidated(
755
- callback: (args: { checkpointNumber: bigint }) => unknown,
1008
+ callback: (args: { checkpointNumber: CheckpointNumber }) => unknown,
756
1009
  ): WatchContractEventReturnType {
757
1010
  return this.rollup.watchEvent.CheckpointInvalidated(
758
1011
  {},
@@ -761,7 +1014,7 @@ export class RollupContract {
761
1014
  for (const log of logs) {
762
1015
  const args = log.args;
763
1016
  if (args.checkpointNumber !== undefined) {
764
- callback({ checkpointNumber: args.checkpointNumber });
1017
+ callback({ checkpointNumber: CheckpointNumber.fromBigInt(args.checkpointNumber) });
765
1018
  }
766
1019
  }
767
1020
  },
@@ -793,4 +1046,23 @@ export class RollupContract {
793
1046
  },
794
1047
  );
795
1048
  }
1049
+
1050
+ /** Fetches CheckpointProposed events within the given block range. */
1051
+ async getCheckpointProposedEvents(fromBlock: bigint, toBlock: bigint): Promise<CheckpointProposedLog[]> {
1052
+ const logs = await this.rollup.getEvents.CheckpointProposed({}, { fromBlock, toBlock });
1053
+ return logs
1054
+ .filter(log => log.blockNumber! >= fromBlock && log.blockNumber! <= toBlock)
1055
+ .map(log => ({
1056
+ l1BlockNumber: log.blockNumber!,
1057
+ l1BlockHash: Buffer32.fromString(log.blockHash!),
1058
+ l1TransactionHash: log.transactionHash!,
1059
+ args: {
1060
+ checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber!),
1061
+ archive: Fr.fromString(log.args.archive!),
1062
+ versionedBlobHashes: log.args.versionedBlobHashes!.map(h => Buffer.from(h.slice(2), 'hex')),
1063
+ attestationsHash: log.args.attestationsHash ? Buffer32.fromString(log.args.attestationsHash) : undefined,
1064
+ payloadDigest: log.args.payloadDigest ? Buffer32.fromString(log.args.payloadDigest) : undefined,
1065
+ },
1066
+ }));
1067
+ }
796
1068
  }