@@ -23,6 +23,7 @@ const (
23
23
finalizeBatchEventName = "FinalizeBatch"
24
24
nextUnfinalizedQueueIndex = "nextUnfinalizedQueueIndex"
25
25
lastFinalizedBatchIndex = "lastFinalizedBatchIndex"
26
+ finalizedStateRoots = "finalizedStateRoots"
26
27
27
28
defaultRollupEventsFetchBlockRange = 100
28
29
)
@@ -72,7 +73,7 @@ func NewReader(ctx context.Context, config Config, l1Client Client) (*Reader, er
72
73
return & reader , nil
73
74
}
74
75
75
- func (r * Reader ) FinalizedL1MessageQueueIndex (blockNumber uint64 ) (uint64 , error ) {
76
+ func (r * Reader ) NextUnfinalizedL1MessageQueueIndex (blockNumber uint64 ) (uint64 , error ) {
76
77
data , err := r .l1MessageQueueABI .Pack (nextUnfinalizedQueueIndex )
77
78
if err != nil {
78
79
return 0 , fmt .Errorf ("failed to pack %s: %w" , nextUnfinalizedQueueIndex , err )
@@ -92,11 +93,7 @@ func (r *Reader) FinalizedL1MessageQueueIndex(blockNumber uint64) (uint64, error
92
93
}
93
94
94
95
next := parsedResult .Uint64 ()
95
- if next == 0 {
96
- return 0 , nil
97
- }
98
-
99
- return next - 1 , nil
96
+ return next , nil
100
97
}
101
98
102
99
func (r * Reader ) LatestFinalizedBatchIndex (blockNumber uint64 ) (uint64 , error ) {
@@ -121,6 +118,28 @@ func (r *Reader) LatestFinalizedBatchIndex(blockNumber uint64) (uint64, error) {
121
118
return parsedResult .Uint64 (), nil
122
119
}
123
120
121
+ func (r * Reader ) GetFinalizedStateRootByBatchIndex (blockNumber uint64 , batchIndex uint64 ) (common.Hash , error ) {
122
+ data , err := r .scrollChainABI .Pack (finalizedStateRoots , big .NewInt (int64 (batchIndex )))
123
+ if err != nil {
124
+ return common.Hash {}, fmt .Errorf ("failed to pack %s: %w" , finalizedStateRoots , err )
125
+ }
126
+
127
+ result , err := r .client .CallContract (r .ctx , ethereum.CallMsg {
128
+ To : & r .config .ScrollChainAddress ,
129
+ Data : data ,
130
+ }, new (big.Int ).SetUint64 (blockNumber ))
131
+ if err != nil {
132
+ return common.Hash {}, fmt .Errorf ("failed to call %s: %w" , finalizedStateRoots , err )
133
+ }
134
+
135
+ var parsedResult common.Hash
136
+ if err = r .scrollChainABI .UnpackIntoInterface (& parsedResult , finalizedStateRoots , result ); err != nil {
137
+ return common.Hash {}, fmt .Errorf ("failed to unpack result: %w" , err )
138
+ }
139
+
140
+ return parsedResult , nil
141
+ }
142
+
124
143
// GetLatestFinalizedBlockNumber fetches the block number of the latest finalized block from the L1 chain.
125
144
func (r * Reader ) GetLatestFinalizedBlockNumber () (uint64 , error ) {
126
145
header , err := r .client .HeaderByNumber (r .ctx , big .NewInt (int64 (rpc .FinalizedBlockNumber )))
0 commit comments