@@ -157,6 +157,7 @@ mod sealed {
157
157
// Byte 2
158
158
BasicMPP ,
159
159
] ) ;
160
+ define_context ! ( OfferContext , [ ] ) ;
160
161
// This isn't a "real" feature context, and is only used in the channel_type field in an
161
162
// `OpenChannel` message.
162
163
define_context ! ( ChannelTypeContext , [
@@ -366,7 +367,7 @@ mod sealed {
366
367
supports_keysend, requires_keysend) ;
367
368
368
369
#[ cfg( test) ]
369
- define_feature ! ( 123456789 , UnknownFeature , [ NodeContext , ChannelContext , InvoiceContext ] ,
370
+ define_feature ! ( 123456789 , UnknownFeature , [ NodeContext , ChannelContext , InvoiceContext , OfferContext ] ,
370
371
"Feature flags for an unknown feature used in testing." , set_unknown_feature_optional,
371
372
set_unknown_feature_required, supports_unknown_test_feature, requires_unknown_test_feature) ;
372
373
}
@@ -425,6 +426,8 @@ pub type NodeFeatures = Features<sealed::NodeContext>;
425
426
pub type ChannelFeatures = Features < sealed:: ChannelContext > ;
426
427
/// Features used within an invoice.
427
428
pub type InvoiceFeatures = Features < sealed:: InvoiceContext > ;
429
+ /// Features used within an offer.
430
+ pub type OfferFeatures = Features < sealed:: OfferContext > ;
428
431
429
432
/// Features used within the channel_type field in an OpenChannel message.
430
433
///
@@ -684,6 +687,15 @@ impl<T: sealed::Wumbo> Features<T> {
684
687
}
685
688
}
686
689
690
+ #[ cfg( test) ]
691
+ impl < T : sealed:: UnknownFeature > Features < T > {
692
+ pub ( crate ) fn unknown ( ) -> Self {
693
+ let mut features = Self :: empty ( ) ;
694
+ features. set_unknown_feature_required ( ) ;
695
+ features
696
+ }
697
+ }
698
+
687
699
macro_rules! impl_feature_len_prefixed_write {
688
700
( $features: ident) => {
689
701
impl Writeable for $features {
@@ -704,21 +716,26 @@ impl_feature_len_prefixed_write!(ChannelFeatures);
704
716
impl_feature_len_prefixed_write ! ( NodeFeatures ) ;
705
717
impl_feature_len_prefixed_write ! ( InvoiceFeatures ) ;
706
718
707
- // Because ChannelTypeFeatures only appears inside of TLVs, it doesn't have a length prefix when
708
- // serialized. Thus, we can't use `impl_feature_len_prefixed_write`, above, and have to write our
709
- // own serialization.
710
- impl Writeable for ChannelTypeFeatures {
711
- fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
712
- self . write_be ( w)
713
- }
714
- }
715
- impl Readable for ChannelTypeFeatures {
716
- fn read < R : io:: Read > ( r : & mut R ) -> Result < Self , DecodeError > {
717
- let v = io_extras:: read_to_end ( r) ?;
718
- Ok ( Self :: from_be_bytes ( v) )
719
+ // Some features only appear inside of TLVs, so they don't have a length prefix when serialized.
720
+ macro_rules! impl_feature_tlv_write {
721
+ ( $features: ident) => {
722
+ impl Writeable for $features {
723
+ fn write<W : Writer >( & self , w: & mut W ) -> Result <( ) , io:: Error > {
724
+ self . write_be( w)
725
+ }
726
+ }
727
+ impl Readable for $features {
728
+ fn read<R : io:: Read >( r: & mut R ) -> Result <Self , DecodeError > {
729
+ let v = io_extras:: read_to_end( r) ?;
730
+ Ok ( Self :: from_be_bytes( v) )
731
+ }
732
+ }
719
733
}
720
734
}
721
735
736
+ impl_feature_tlv_write ! ( ChannelTypeFeatures ) ;
737
+ impl_feature_tlv_write ! ( OfferFeatures ) ;
738
+
722
739
#[ cfg( test) ]
723
740
mod tests {
724
741
use super :: { ChannelFeatures , ChannelTypeFeatures , InitFeatures , InvoiceFeatures , NodeFeatures , sealed} ;
0 commit comments