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) +}