diff --git a/lncfg/wtclient.go b/lncfg/wtclient.go new file mode 100644 index 000000000..a4c424fd8 --- /dev/null +++ b/lncfg/wtclient.go @@ -0,0 +1,65 @@ +package lncfg + +import ( + "fmt" + "strconv" + + "github.com/lightningnetwork/lnd/lnwire" +) + +// WtClient holds the configuration options for the daemon's watchtower client. +type WtClient struct { + // PrivateTowerURIs specifies the lightning URIs of the towers the + // watchtower client should send new backups to. + PrivateTowerURIs []string `long:"private-tower-uris" description:"Specifies the URIs of private watchtowers to use in backing up revoked states. URIs must be of the form @. Only 1 URI is supported at this time, if none are provided the tower will not be enabled."` + + // PrivateTowers is the list of towers parsed from the URIs provided in + // PrivateTowerURIs. + PrivateTowers []*lnwire.NetAddress + + // SweepFeeRate specifies the fee rate in sat/byte to be used when + // constructing justice transactions sent to the tower. + SweepFeeRate uint64 `long:"sweep-fee-rate" description:"Specifies the fee rate in sat/byte to be used when constructing justice transactions sent to the watchtower."` +} + +// Validate asserts that at most 1 private watchtower is requested. +// +// NOTE: Part of the Validator interface. +func (c *WtClient) Validate() error { + if len(c.PrivateTowerURIs) > 1 { + return fmt.Errorf("at most 1 private watchtower is supported, "+ + "found %d", len(c.PrivateTowerURIs)) + } + + return nil +} + +// IsActive returns true if the watchtower client should be active. +func (c *WtClient) IsActive() bool { + return len(c.PrivateTowerURIs) > 0 +} + +// ParsePrivateTowers parses any private tower URIs held PrivateTowerURIs. The +// value of port should be the default port to use when a URI does not have one. +func (c *WtClient) ParsePrivateTowers(port int, resolver TCPResolver) error { + towers := make([]*lnwire.NetAddress, 0, len(c.PrivateTowerURIs)) + for _, uri := range c.PrivateTowerURIs { + addr, err := ParseLNAddressString( + uri, strconv.Itoa(port), resolver, + ) + if err != nil { + return fmt.Errorf("unable to parse private "+ + "watchtower address: %v", err) + } + + towers = append(towers, addr) + } + + c.PrivateTowers = towers + + return nil +} + +// Compile-time constraint to ensure WtClient implements the Validator +// interface. +var _ Validator = (*WtClient)(nil)