ppad-bolt9-0.0.1: Feature flags per BOLT #9
Copyright(c) 2025 Jared Tobin
LicenseMIT
MaintainerJared Tobin <jared@ppad.tech>
Safe HaskellSafe-Inferred
LanguageHaskell2010

Lightning.Protocol.BOLT9.Types

Description

Baseline types for BOLT #9 feature flags.

Synopsis

Context

data Context Source #

Presentation context for feature flags.

Per BOLT #9, features are presented in different message contexts:

  • Init - the init message
  • NodeAnn - node_announcement messages
  • ChanAnn - channel_announcement messages (normal)
  • ChanAnnOdd - channel_announcement, always odd (optional)
  • ChanAnnEven - channel_announcement, always even (required)
  • Invoice - BOLT 11 invoices
  • Blinded - allowed_features field of a blinded path
  • ChanType - channel_type field when opening channels

Constructors

Init

I: presented in the init message

NodeAnn

N: presented in node_announcement messages

ChanAnn

C: presented in channel_announcement message

ChanAnnOdd

C-: channel_announcement, always odd (optional)

ChanAnnEven

C+: channel_announcement, always even (required)

Invoice

9: presented in BOLT 11 invoices

Blinded

B: allowed_features field of a blinded path

ChanType

T: channel_type field when opening channels

Instances

Instances details
NFData Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: Context -> () #

Generic Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep Context 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep Context = D1 ('MetaData "Context" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'False) (((C1 ('MetaCons "Init" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NodeAnn" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ChanAnn" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ChanAnnOdd" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "ChanAnnEven" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Invoice" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "Blinded" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ChanType" 'PrefixI 'False) (U1 :: Type -> Type))))

Methods

from :: Context -> Rep Context x #

to :: Rep Context x -> Context #

Show Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

(==) :: Context -> Context -> Bool #

(/=) :: Context -> Context -> Bool #

Ord Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep Context Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep Context = D1 ('MetaData "Context" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'False) (((C1 ('MetaCons "Init" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "NodeAnn" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ChanAnn" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ChanAnnOdd" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "ChanAnnEven" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Invoice" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "Blinded" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ChanType" 'PrefixI 'False) (U1 :: Type -> Type))))

isChannelContext :: Context -> Bool Source #

Check if a context is a channel announcement context (C, C-, or C+).

channelParity :: Context -> Maybe Bool Source #

For channel contexts with forced parity, return Just the required parity: True for even (C+), False for odd (C-). Returns Nothing for contexts without forced parity.

Bit indices

data BitIndex Source #

A bit index into a feature vector. Bit 0 is the least significant bit.

Valid range: 0-65535 (sufficient for any practical feature flag).

Instances

Instances details
NFData BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: BitIndex -> () #

Generic BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep BitIndex 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep BitIndex = D1 ('MetaData "BitIndex" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "BitIndex" 'PrefixI 'True) (S1 ('MetaSel ('Just "unBitIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))

Methods

from :: BitIndex -> Rep BitIndex x #

to :: Rep BitIndex x -> BitIndex #

Show BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Ord BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep BitIndex Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep BitIndex = D1 ('MetaData "BitIndex" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "BitIndex" 'PrefixI 'True) (S1 ('MetaSel ('Just "unBitIndex") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))

bitIndex :: Word16 -> BitIndex Source #

Smart constructor for BitIndex. Always succeeds since all Word16 values are valid.

Required/optional level

data FeatureLevel Source #

Whether a feature is set as required or optional.

Per BOLT #9, each feature has a pair of bits: the even bit indicates required (compulsory) support, the odd bit indicates optional support.

Constructors

Required

The feature is required (even bit set)

Optional

The feature is optional (odd bit set)

Instances

Instances details
NFData FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: FeatureLevel -> () #

Generic FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep FeatureLevel 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureLevel = D1 ('MetaData "FeatureLevel" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'False) (C1 ('MetaCons "Required" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Optional" 'PrefixI 'False) (U1 :: Type -> Type))
Show FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Ord FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureLevel Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureLevel = D1 ('MetaData "FeatureLevel" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'False) (C1 ('MetaCons "Required" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Optional" 'PrefixI 'False) (U1 :: Type -> Type))

Required/optional bits

data RequiredBit Source #

A required (compulsory) feature bit. Required bits are always even.

Instances

Instances details
NFData RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: RequiredBit -> () #

Generic RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep RequiredBit 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep RequiredBit = D1 ('MetaData "RequiredBit" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "RequiredBit" 'PrefixI 'True) (S1 ('MetaSel ('Just "unRequiredBit") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))
Show RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Ord RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep RequiredBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep RequiredBit = D1 ('MetaData "RequiredBit" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "RequiredBit" 'PrefixI 'True) (S1 ('MetaSel ('Just "unRequiredBit") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))

requiredBit :: Word16 -> Maybe RequiredBit Source #

Smart constructor for RequiredBit. Returns Nothing if the bit index is odd.

>>> requiredBit 16
Just (RequiredBit {unRequiredBit = 16})
>>> requiredBit 17
Nothing

data OptionalBit Source #

An optional feature bit. Optional bits are always odd.

Instances

Instances details
NFData OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: OptionalBit -> () #

Generic OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep OptionalBit 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep OptionalBit = D1 ('MetaData "OptionalBit" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "OptionalBit" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOptionalBit") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))
Show OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Ord OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep OptionalBit Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep OptionalBit = D1 ('MetaData "OptionalBit" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "OptionalBit" 'PrefixI 'True) (S1 ('MetaSel ('Just "unOptionalBit") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))

optionalBit :: Word16 -> Maybe OptionalBit Source #

Smart constructor for OptionalBit. Returns Nothing if the bit index is even.

>>> optionalBit 17
Just (OptionalBit {unOptionalBit = 17})
>>> optionalBit 16
Nothing

Feature vectors

data FeatureVector Source #

A feature vector represented as a strict ByteString.

The vector is stored in big-endian byte order (most significant byte first), with bits numbered from the least significant bit of the last byte. Bit 0 is at position 0 of the last byte.

Instances

Instances details
NFData FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Methods

rnf :: FeatureVector -> () #

Generic FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Associated Types

type Rep FeatureVector 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureVector = D1 ('MetaData "FeatureVector" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "FeatureVector" 'PrefixI 'True) (S1 ('MetaSel ('Just "unFeatureVector") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString)))
Show FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Eq FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

Ord FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureVector Source # 
Instance details

Defined in Lightning.Protocol.BOLT9.Types

type Rep FeatureVector = D1 ('MetaData "FeatureVector" "Lightning.Protocol.BOLT9.Types" "ppad-bolt9-0.0.1-SCTy7SY2nBJMXEGG76XgS" 'True) (C1 ('MetaCons "FeatureVector" 'PrefixI 'True) (S1 ('MetaSel ('Just "unFeatureVector") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString)))

empty :: FeatureVector Source #

The empty feature vector (no features set).

>>> empty
FeatureVector {unFeatureVector = ""}

fromByteString :: ByteString -> FeatureVector Source #

Wrap a ByteString as a FeatureVector.

set :: BitIndex -> FeatureVector -> FeatureVector Source #

Set a bit in the feature vector.

>>> set (bitIndex 0) empty
FeatureVector {unFeatureVector = "\SOH"}
>>> set (bitIndex 8) empty
FeatureVector {unFeatureVector = "\SOH\NUL"}

clear :: BitIndex -> FeatureVector -> FeatureVector Source #

Clear a bit in the feature vector.

member :: BitIndex -> FeatureVector -> Bool Source #

Test if a bit is set in the feature vector.

>>> member (bitIndex 0) (set (bitIndex 0) empty)
True
>>> member (bitIndex 1) (set (bitIndex 0) empty)
False