diff --git a/interceptor/intercept_handler.go b/interceptor/intercept_handler.go index c387dfaa..67010771 100644 --- a/interceptor/intercept_handler.go +++ b/interceptor/intercept_handler.go @@ -11,6 +11,7 @@ import ( "github.com/breez/lspd/chain" "github.com/breez/lspd/common" "github.com/breez/lspd/config" + "github.com/breez/lspd/history" "github.com/breez/lspd/lightning" "github.com/breez/lspd/lsps0" "github.com/breez/lspd/notifications" @@ -20,9 +21,11 @@ import ( ) type Interceptor struct { + nodeid []byte client lightning.Client config *config.NodeConfig store InterceptStore + historyStore history.Store openingService common.OpeningService feeEstimator chain.FeeEstimator feeStrategy chain.FeeStrategy @@ -34,15 +37,19 @@ func NewInterceptHandler( client lightning.Client, config *config.NodeConfig, store InterceptStore, + historyStore history.Store, openingService common.OpeningService, feeEstimator chain.FeeEstimator, feeStrategy chain.FeeStrategy, notificationService *notifications.NotificationService, ) *Interceptor { + nodeid, _ := hex.DecodeString(config.NodePubkey) return &Interceptor{ + nodeid: nodeid, client: client, config: config, store: store, + historyStore: historyStore, openingService: openingService, feeEstimator: feeEstimator, feeStrategy: feeStrategy, @@ -238,6 +245,19 @@ func (i *Interceptor) Intercept(req common.InterceptRequest) common.InterceptRes scid = chanResult.ConfirmedScid } + err = i.historyStore.UpdateChannels(context.TODO(), []*history.ChannelUpdate{{ + NodeID: i.nodeid, + PeerId: destination, + AliasScid: chanResult.AliasScid, + ConfirmedScid: chanResult.ConfirmedScid, + ChannelPoint: channelPoint, + LastUpdate: time.Now(), + }}) + if err != nil { + // Don't break here, this is not critical. + log.Printf("paymentHash: %s, failed to insert newly opened channel in history store. %v", reqPaymentHashStr, channelPoint.String()) + } + useLegacyOnionBlob := slices.Contains(i.config.LegacyOnionTokens, token) return common.InterceptResult{ Action: common.INTERCEPT_RESUME_WITH_ONION, diff --git a/lsps2/intercept_handler.go b/lsps2/intercept_handler.go index d4c49d26..8c16a280 100644 --- a/lsps2/intercept_handler.go +++ b/lsps2/intercept_handler.go @@ -10,12 +10,14 @@ import ( "github.com/breez/lspd/chain" "github.com/breez/lspd/common" + "github.com/breez/lspd/history" "github.com/breez/lspd/lightning" "github.com/breez/lspd/lsps0" "github.com/btcsuite/btcd/wire" ) type InterceptorConfig struct { + NodeId []byte AdditionalChannelCapacitySat uint64 MinConfs *uint32 TargetConf uint32 @@ -29,6 +31,7 @@ type InterceptorConfig struct { type Interceptor struct { store Lsps2Store + historyStore history.Store openingService common.OpeningService client lightning.Client feeEstimator chain.FeeEstimator @@ -43,6 +46,7 @@ type Interceptor struct { func NewInterceptHandler( store Lsps2Store, + historyStore history.Store, openingService common.OpeningService, client lightning.Client, feeEstimator chain.FeeEstimator, @@ -54,6 +58,7 @@ func NewInterceptHandler( return &Interceptor{ store: store, + historyStore: historyStore, openingService: openingService, client: client, feeEstimator: feeEstimator, @@ -534,6 +539,19 @@ func (i *Interceptor) ensureChannelOpen(payment *paymentState) { scid = chanResult.ConfirmedScid } + err := i.historyStore.UpdateChannels(context.TODO(), []*history.ChannelUpdate{{ + NodeID: i.config.NodeId, + PeerId: destination, + AliasScid: chanResult.AliasScid, + ConfirmedScid: chanResult.ConfirmedScid, + ChannelPoint: payment.registration.ChannelPoint, + LastUpdate: time.Now(), + }}) + if err != nil { + // Don't break here, this is not critical. + log.Printf("failed to insert newly opened channel in history store. %v", payment.registration.ChannelPoint.String()) + } + i.paymentChanOpened <- &paymentChanOpenedEvent{ paymentId: payment.id, scid: *scid, diff --git a/lsps2/intercept_test.go b/lsps2/intercept_test.go index eff682ff..b745aae2 100644 --- a/lsps2/intercept_test.go +++ b/lsps2/intercept_test.go @@ -150,7 +150,7 @@ func setupInterceptor( openingService = defaultopeningService() } - i := NewInterceptHandler(store, openingService, client, f, config) + i := NewInterceptHandler(store, &mockHistoryStore{}, openingService, client, f, config) go i.Start(ctx) return i } diff --git a/lsps2/mocks.go b/lsps2/mocks.go index 2f16e49a..62d57912 100644 --- a/lsps2/mocks.go +++ b/lsps2/mocks.go @@ -9,6 +9,7 @@ import ( "github.com/GoWebProd/uuid7" "github.com/breez/lspd/chain" "github.com/breez/lspd/common" + "github.com/breez/lspd/history" "github.com/breez/lspd/lightning" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/wire" @@ -96,6 +97,12 @@ func (s *mockLsps2Store) RemoveUnusedExpired(ctx context.Context, before time.Ti return nil } +type mockHistoryStore struct{} + +func (s *mockHistoryStore) UpdateChannels(ctx context.Context, updates []*history.ChannelUpdate) error { + return nil +} + type mockLightningClient struct { openResponses []*wire.OutPoint openRequests []*lightning.OpenChannelRequest diff --git a/main.go b/main.go index 39640207..3538966a 100644 --- a/main.go +++ b/main.go @@ -128,7 +128,7 @@ func main() { } client.StartListeners() - interceptor := interceptor.NewInterceptHandler(client, node.NodeConfig, interceptStore, openingService, feeEstimator, feeStrategy, notificationService) + interceptor := interceptor.NewInterceptHandler(client, node.NodeConfig, interceptStore, historyStore, openingService, feeEstimator, feeStrategy, notificationService) htlcInterceptor, err = lnd.NewLndHtlcInterceptor(node.NodeConfig, client, interceptor) if err != nil { log.Fatalf("failed to initialize LND interceptor: %v", err) @@ -141,8 +141,9 @@ func main() { log.Fatalf("failed to initialize CLN client: %v", err) } - legacyHandler := interceptor.NewInterceptHandler(client, node.NodeConfig, interceptStore, openingService, feeEstimator, feeStrategy, notificationService) - lsps2Handler := lsps2.NewInterceptHandler(lsps2Store, openingService, client, feeEstimator, &lsps2.InterceptorConfig{ + legacyHandler := interceptor.NewInterceptHandler(client, node.NodeConfig, interceptStore, historyStore, openingService, feeEstimator, feeStrategy, notificationService) + lsps2Handler := lsps2.NewInterceptHandler(lsps2Store, historyStore, openingService, client, feeEstimator, &lsps2.InterceptorConfig{ + NodeId: node.NodeId, AdditionalChannelCapacitySat: uint64(node.NodeConfig.AdditionalChannelCapacity), MinConfs: node.NodeConfig.MinConfs, TargetConf: node.NodeConfig.TargetConf,