diff --git a/feature/required.go b/feature/required.go new file mode 100644 index 00000000..d141604d --- /dev/null +++ b/feature/required.go @@ -0,0 +1,37 @@ +package feature + +import ( + "fmt" + + "github.com/lightningnetwork/lnd/lnwire" +) + +// ErrUnknownRequired signals that a feature vector requires certain features +// that our node is unaware of or does not implement. +type ErrUnknownRequired struct { + unknown []lnwire.FeatureBit +} + +// NewErrUnknownRequired initializes an ErrUnknownRequired with the unknown +// feature bits. +func NewErrUnknownRequired(unknown []lnwire.FeatureBit) ErrUnknownRequired { + return ErrUnknownRequired{ + unknown: unknown, + } +} + +// Error returns a human-readable description of the error. +func (e ErrUnknownRequired) Error() string { + return fmt.Sprintf("feature vector contains unknown required "+ + "features: %v", e.unknown) +} + +// ValidateRequired returns an error if the feature vector contains a non-zero +// number of unknown, required feature bits. +func ValidateRequired(fv *lnwire.FeatureVector) error { + unknown := fv.UnknownRequiredFeatures() + if len(unknown) > 0 { + return NewErrUnknownRequired(unknown) + } + return nil +}