diff --git a/pkg/indexer/indexer.go b/pkg/indexer/indexer.go index fce2c8ca..4bb5750b 100644 --- a/pkg/indexer/indexer.go +++ b/pkg/indexer/indexer.go @@ -304,7 +304,8 @@ func indexLogs( zap.Uint64("blockNumber", reorgCheckAt), ) - if !bytes.Equal(storedBlockHash, onchainBlock.Hash().Bytes()) { + if storedBlockHash != nil && + !bytes.Equal(storedBlockHash, onchainBlock.Hash().Bytes()) { logger.Warn("blockchain reorg detected", zap.Uint64("storedBlockNumber", storedBlockNumber), zap.String("storedBlockHash", hex.EncodeToString(storedBlockHash)), diff --git a/pkg/indexer/reorgHandler.go b/pkg/indexer/reorgHandler.go index 2bc1be38..e1c424e4 100644 --- a/pkg/indexer/reorgHandler.go +++ b/pkg/indexer/reorgHandler.go @@ -72,6 +72,26 @@ func (r *ReorgHandler) FindReorgPoint(detectedAt uint64) (uint64, []byte, error) } oldestBlock := storedBlocks[0] + + if oldestBlock.BlockHash == nil { + startAtZero, err := r.client.BlockByNumber( + r.ctx, + big.NewInt(0), + ) + if err != nil { + return 0, nil, fmt.Errorf("%w %d: %v", ErrGetBlock, oldestBlock.BlockNumber, err) + } + + if err := r.queries.UpdateBlocksCanonicalityInRange(r.ctx, queries.UpdateBlocksCanonicalityInRangeParams{ + StartBlockNumber: 0, + EndBlockNumber: detectedAt, + }); err != nil { + return 0, nil, fmt.Errorf("failed to update block range canonicality: %w", err) + } + + return 0, startAtZero.Hash().Bytes(), nil + } + chainBlock, err := r.client.BlockByNumber(r.ctx, big.NewInt(int64(oldestBlock.BlockNumber))) if err != nil { return 0, nil, fmt.Errorf("%w %d: %v", ErrGetBlock, oldestBlock.BlockNumber, err)