@@ -307,9 +307,35 @@ func TestDARetriever_ProcessBlobs_CrossDAHeightMatching(t *testing.T) {
307307 assert .Equal (t , uint64 (5 ), event .Data .Height ())
308308 assert .Equal (t , uint64 (102 ), event .DaHeight , "DaHeight should be the height where data was processed" )
309309
310- // Verify pending maps are cleared
310+ // Verify the header is consumed, while data remains available until the
311+ // candidate block is accepted by the syncer.
311312 require .NotContains (t , r .pendingHeaders , uint64 (5 ), "header should be removed from pending" )
312- require .NotContains (t , r .pendingData , uint64 (5 ), "data should be removed from pending" )
313+ require .Contains (t , r .pendingData , uint64 (5 ), "data should remain pending until accepted" )
314+
315+ r .removePendingData (5 )
316+ require .NotContains (t , r .pendingData , uint64 (5 ), "accepted data should be removed from pending" )
317+ }
318+
319+ func TestDARetriever_ProcessBlobs_KeepsDataForLaterHeaderAfterCandidateEvent (t * testing.T ) {
320+ expectedAddr , expectedPub , expectedSigner := buildSyncTestSigner (t )
321+ wrongAddr , wrongPub , wrongSigner := buildSyncTestSigner (t )
322+ gen := genesis.Genesis {ChainID : "tchain" , InitialHeight : 1 , StartTime : time .Now ().Add (- time .Second ), ProposerAddress : expectedAddr }
323+
324+ r := newTestDARetriever (t , nil , config .DefaultConfig (), gen )
325+
326+ dataBin , data := makeSignedDataBytes (t , gen .ChainID , 5 , expectedAddr , expectedPub , expectedSigner , 2 )
327+ wrongHeaderBin , wrongHeader := makeSignedHeaderBytes (t , gen .ChainID , 5 , wrongAddr , wrongPub , wrongSigner , nil , & data .Data , nil )
328+ correctHeaderBin , correctHeader := makeSignedHeaderBytes (t , gen .ChainID , 5 , expectedAddr , expectedPub , expectedSigner , nil , & data .Data , nil )
329+
330+ events := r .processBlobs (context .Background (), [][]byte {wrongHeaderBin , dataBin }, 100 )
331+ require .Len (t , events , 1 )
332+ require .Equal (t , wrongHeader .Hash ().String (), events [0 ].Header .Hash ().String ())
333+ require .Contains (t , r .pendingData , uint64 (5 ), "data should stay available until the candidate block is accepted" )
334+
335+ events = r .processBlobs (context .Background (), [][]byte {correctHeaderBin }, 101 )
336+ require .Len (t , events , 1 )
337+ require .Equal (t , correctHeader .Hash ().String (), events [0 ].Header .Hash ().String ())
338+ require .Equal (t , data .Data .DACommitment ().String (), events [0 ].Data .DACommitment ().String ())
313339}
314340
315341func TestDARetriever_ProcessBlobs_MultipleHeadersCrossDAHeightMatching (t * testing.T ) {
@@ -355,6 +381,8 @@ func TestDARetriever_ProcessBlobs_MultipleHeadersCrossDAHeightMatching(t *testin
355381 assert .Equal (t , uint64 (5 ), events2 [1 ].Header .Height ())
356382 assert .Equal (t , uint64 (5 ), events2 [1 ].Data .Height ())
357383 assert .Equal (t , uint64 (203 ), events2 [1 ].DaHeight )
384+ r .removePendingData (3 )
385+ r .removePendingData (5 )
358386
359387 // Verify header 4 is still pending (no matching data yet)
360388 require .Contains (t , r .pendingHeaders , uint64 (4 ), "header 4 should still be pending" )
@@ -369,6 +397,7 @@ func TestDARetriever_ProcessBlobs_MultipleHeadersCrossDAHeightMatching(t *testin
369397 assert .Equal (t , uint64 (4 ), events3 [0 ].Header .Height ())
370398 assert .Equal (t , uint64 (4 ), events3 [0 ].Data .Height ())
371399 assert .Equal (t , uint64 (205 ), events3 [0 ].DaHeight )
400+ r .removePendingData (4 )
372401
373402 // Verify all pending maps are now clear
374403 require .NotContains (t , r .pendingHeaders , uint64 (4 ), "header 4 should be removed from pending" )
0 commit comments