package chanbackup
import (
"fmt"
"net"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/wire"
"github.com/lightningnetwork/lnd/channeldb"
)
type LiveChannelSource interface {
FetchAllChannels() ([]*channeldb.OpenChannel, error)
FetchChannel(chanPoint wire.OutPoint) (*channeldb.OpenChannel, error)
AddrsForNode(nodePub *btcec.PublicKey) ([]net.Addr, error)
}
func assembleChanBackup(chanSource LiveChannelSource,
openChan *channeldb.OpenChannel) (*Single, error) {
log.Debugf("Crafting backup for ChannelPoint(%v)",
openChan.FundingOutpoint)
nodeAddrs, err := chanSource.AddrsForNode(openChan.IdentityPub)
if err != nil {
return nil, err
}
single := NewSingle(openChan, nodeAddrs)
return &single, nil
}
func FetchBackupForChan(chanPoint wire.OutPoint,
chanSource LiveChannelSource) (*Single, error) {
targetChan, err := chanSource.FetchChannel(chanPoint)
if err != nil {
return nil, fmt.Errorf("unable to find target channel")
}
staticChanBackup, err := assembleChanBackup(chanSource, targetChan)
if err != nil {
return nil, fmt.Errorf("unable to create chan backup: %v", err)
}
return staticChanBackup, nil
}
func FetchStaticChanBackups(chanSource LiveChannelSource) ([]Single, error) {
openChans, err := chanSource.FetchAllChannels()
if err != nil {
return nil, err
}
staticChanBackups := make([]Single, 0, len(openChans))
for _, openChan := range openChans {
chanBackup, err := assembleChanBackup(chanSource, openChan)
if err != nil {
return nil, err
}
staticChanBackups = append(staticChanBackups, *chanBackup)
}
return staticChanBackups, nil
}