@@ -142,7 +142,7 @@ func extractMessagesImpl(
142142 if err != nil {
143143 return nil , nil , nil , nil , err
144144 }
145- // Update the delayed message accumulator in the MEL state.
145+ // Extract batch posting reports from delayed messages
146146 batchPostingReports := make ([]* mel.DelayedInboxMessage , 0 )
147147 for _ , delayed := range delayedMessages {
148148 // If this message is a batch posting report, we save it for later
@@ -151,16 +151,6 @@ func extractMessagesImpl(
151151 if delayed .Message .Header .Kind == arbostypes .L1MessageType_BatchPostingReport || delayed .Message .Header .Kind == arbostypes .L1MessageType_Initialize { // Let's consider the init message as a batch posting report, since it is seen as a batch as well, we can later ignore filling its batchGasCost anyway
152152 batchPostingReports = append (batchPostingReports , delayed )
153153 }
154- if err = state .AccumulateDelayedMessage (delayed ); err != nil {
155- return nil , nil , nil , nil , err
156- }
157- state .DelayedMessagesSeen += 1
158- }
159- if len (delayedMessages ) > 0 {
160- // Only need to calculate partials once, after all the delayed messages are `seen`
161- if err := state .GenerateDelayedMessagesSeenMerklePartialsAndRoot (); err != nil {
162- return nil , nil , nil , nil , err
163- }
164154 }
165155
166156 // Batch posting reports are included in the same transaction as a batch, so there should
@@ -175,6 +165,7 @@ func extractMessagesImpl(
175165
176166 var batchMetas []* mel.BatchMetadata
177167 var messages []* arbostypes.MessageWithMetadata
168+ var serializedBatches [][]byte
178169 for i , batch := range batches {
179170 batchTx := batchTxs [i ]
180171 serialized , err := serialize (
@@ -209,7 +200,26 @@ func extractMessagesImpl(
209200 } else if ! (inputState .DelayedMessagesSeen == 0 && i == 0 && delayedMessages [i ] == batchPostReport ) {
210201 return nil , nil , nil , nil , errors .New ("encountered initialize message that is not the first delayed message and the first batch " )
211202 }
203+ serializedBatches = append (serializedBatches , serialized )
204+ }
212205
206+ // Update the delayed message accumulator in the MEL state.
207+ for _ , delayed := range delayedMessages {
208+ if err = state .AccumulateDelayedMessage (delayed ); err != nil {
209+ return nil , nil , nil , nil , err
210+ }
211+ state .DelayedMessagesSeen += 1
212+ }
213+ if len (delayedMessages ) > 0 {
214+ // Only need to calculate partials once, after all the delayed messages are `seen`
215+ if err := state .GenerateDelayedMessagesSeenMerklePartialsAndRoot (); err != nil {
216+ return nil , nil , nil , nil , err
217+ }
218+ }
219+
220+ // Extract L2 messages from batches
221+ for i , batch := range batches {
222+ serialized := serializedBatches [i ]
213223 rawSequencerMsg , err := parseSequencerMessage (
214224 ctx ,
215225 batch .SequenceNumber ,
0 commit comments