@@ -121,6 +121,21 @@ var (
121121 WHERE block_num >= $1 AND block_num <= $2
122122 ORDER BY block_num ASC, block_pos ASC;
123123 ` , bridgeTableName )
124+
125+ // bridgeRestoreSQL is SQL query that moves rows back from bridge_archive to bridge table
126+ bridgeRestoreSQL = fmt .Sprintf (`
127+ INSERT INTO %s (
128+ block_num, block_pos, leaf_type, origin_network, origin_address,
129+ destination_network, destination_address, amount, metadata,
130+ tx_hash, block_timestamp, txn_sender, deposit_count
131+ )
132+ SELECT
133+ block_num, block_pos, leaf_type, origin_network, origin_address,
134+ destination_network, destination_address, amount, metadata,
135+ tx_hash, block_timestamp, txn_sender, deposit_count
136+ FROM bridge_archive
137+ WHERE deposit_count > $1 AND deposit_count <= $2
138+ ` , bridgeTableName )
124139)
125140
126141// Bridge is the representation of a bridge event
@@ -1172,11 +1187,46 @@ func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error {
11721187 }
11731188 }()
11741189
1190+ // ---------------------------------------------------------------------
1191+ // 1. Load affected BackwardLETs BEFORE deleting blocks, bridges and BackwardLET entries
1192+ // ---------------------------------------------------------------------
1193+ backwardLETsQuery := `
1194+ SELECT previous_deposit_count, new_deposit_count
1195+ FROM backward_let
1196+ WHERE block_num >= $1`
1197+ var backwardLETs []* BackwardLET
1198+ if err := meddler .QueryAll (tx , & backwardLETs , backwardLETsQuery , firstReorgedBlock ); err != nil {
1199+ return fmt .Errorf ("failed to retrieve the affected backward LETs: %w" , err )
1200+ }
1201+
1202+ // ---------------------------------------------------------------------
1203+ // 2. Restore bridge rows from archive for each interval
1204+ // ---------------------------------------------------------------------
1205+ for _ , backwardLET := range backwardLETs {
1206+ if backwardLET .PreviousDepositCount .Cmp (backwardLET .NewDepositCount ) <= 0 {
1207+ continue // malformed but safe to skip
1208+ }
1209+
1210+ if _ , err := tx .Exec (bridgeRestoreSQL , backwardLET .NewDepositCount , backwardLET .NewDepositCount ); err != nil {
1211+ return fmt .Errorf ("failed to restore bridges from bridge archive (range %d..%d): %w" ,
1212+ backwardLET .NewDepositCount , backwardLET .PreviousDepositCount , err )
1213+ }
1214+
1215+ // Remove restored rows from archive
1216+ _ , err := tx .Exec (`DELETE FROM bridge_archive
1217+ WHERE deposit_count > $1 AND deposit_count <= $2` , backwardLET .NewDepositCount , backwardLET .PreviousDepositCount )
1218+ if err != nil {
1219+ return fmt .Errorf ("failed to delete restored rows from archive (range %d..%d): %w" ,
1220+ backwardLET .NewDepositCount , backwardLET .PreviousDepositCount , err )
1221+ }
1222+ }
1223+
11751224 blocksRes , err := tx .Exec (`DELETE FROM block WHERE num >= $1;` , firstReorgedBlock )
11761225 if err != nil {
11771226 p .log .Errorf ("failed to delete blocks during reorg: %v" , err )
11781227 return err
11791228 }
1229+
11801230 rowsAffected , err := blocksRes .RowsAffected ()
11811231 if err != nil {
11821232 p .log .Errorf ("failed to get rows affected during reorg: %v" , err )
0 commit comments