From 3044d9f796a6cb50dfd6d8c8ca8605043686f181 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Tue, 7 Nov 2023 20:22:38 -0600 Subject: [PATCH] lnd: add ExtractChannel function --- lnd/chanbackup.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lnd/chanbackup.go b/lnd/chanbackup.go index 5799356..21e130c 100644 --- a/lnd/chanbackup.go +++ b/lnd/chanbackup.go @@ -4,6 +4,9 @@ import ( "bytes" "fmt" + "github.com/btcsuite/btcd/btcutil/hdkeychain" + "github.com/btcsuite/btcd/chaincfg" + "github.com/lightninglabs/chantools/dump" "github.com/lightningnetwork/lnd/chanbackup" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/keychain" @@ -35,3 +38,32 @@ func CreateChannelBackup(db *channeldb.DB, multiFile *chanbackup.MultiFile, } return nil } + +// ExtractChannel extracts a single channel from the given backup file and +// returns it as a dump.BackupSingle struct. +func ExtractChannel(extendedKey *hdkeychain.ExtendedKey, + chainParams *chaincfg.Params, multiFilePath, + channelPoint string) (*dump.BackupSingle, error) { + + multiFile := chanbackup.NewMultiFile(multiFilePath) + keyRing := &HDKeyRing{ + ExtendedKey: extendedKey, + ChainParams: chainParams, + } + + multi, err := multiFile.ExtractMulti(keyRing) + if err != nil { + return nil, fmt.Errorf("could not extract multi file: %w", err) + } + + channels := dump.BackupDump(multi, chainParams) + for _, channel := range channels { + channel := channel + + if channel.FundingOutpoint == channelPoint { + return &channel, nil + } + } + + return nil, fmt.Errorf("channel %s not found in backup", channelPoint) +}