From be671db05f1c698c4ad9e4e404b1e1a3eeb26cb9 Mon Sep 17 00:00:00 2001 From: bitromortac Date: Tue, 12 May 2026 10:51:42 +0200 Subject: [PATCH] chanevents: add short-chan-id store lookup Add GetChannelByShortChanID, the inverse of AddChannel. The forwarding-ability analyzer receives scids from lnd's forwarding history and must map them back to the chanevents store's internal channel id to query events. --- chanevents/store.go | 24 ++++++++++++++++++++++++ chanevents/store_test.go | 14 ++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/chanevents/store.go b/chanevents/store.go index 0cbe442..b454a33 100644 --- a/chanevents/store.go +++ b/chanevents/store.go @@ -192,6 +192,30 @@ func (s *Store) GetChannel(ctx context.Context, channelPoint string) (*Channel, }, nil } +// GetChannelByShortChanID retrieves a channel by its short channel ID, +// returning ErrUnknownChannel if no row matches. +func (s *Store) GetChannelByShortChanID(ctx context.Context, + shortChannelID uint64) (*Channel, error) { + + dbChannel, err := s.db.GetChannelByShortChanID( + ctx, scidToInt64(shortChannelID), + ) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, ErrUnknownChannel + } + + return nil, err + } + + return &Channel{ + ID: dbChannel.ID, + ChannelPoint: dbChannel.ChannelPoint, + ShortChannelID: int64ToSCID(dbChannel.ShortChannelID), + PeerID: dbChannel.PeerID, + }, nil +} + // AddChannelEvent adds a new channel event. func (s *Store) AddChannelEvent(ctx context.Context, event *ChannelEvent) error { diff --git a/chanevents/store_test.go b/chanevents/store_test.go index b2cbae6..232de48 100644 --- a/chanevents/store_test.go +++ b/chanevents/store_test.go @@ -93,6 +93,20 @@ func TestStore(t *testing.T) { require.Equal(t, testShortChanID1, dbChannel.ShortChannelID) require.Equal(t, peerID, dbChannel.PeerID) + // Look up the same channel by its scid; the analyzer relies on this + // inverse of AddChannel. + dbChannel, err = store.GetChannelByShortChanID(ctx, testShortChanID1) + require.NoError(t, err) + require.Equal(t, channelID, dbChannel.ID) + require.Equal(t, testChanPoint1, dbChannel.ChannelPoint) + require.Equal(t, testShortChanID1, dbChannel.ShortChannelID) + require.Equal(t, peerID, dbChannel.PeerID) + + // An unknown scid surfaces the typed sentinel, not raw sql.ErrNoRows. + dbChannel, err = store.GetChannelByShortChanID(ctx, 9999) + require.ErrorIs(t, err, ErrUnknownChannel) + require.Nil(t, dbChannel) + // Add a second channel for the same peer. channel2ID, err := store.AddChannel( ctx, testChanPoint2, testShortChanID2, peerID,