]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Offer features for BOLT 12
authorJeffrey Czyz <jkczyz@gmail.com>
Fri, 24 Jun 2022 21:40:49 +0000 (16:40 -0500)
committerJeffrey Czyz <jkczyz@gmail.com>
Sat, 17 Sep 2022 00:43:52 +0000 (19:43 -0500)
The offer message in BOLT 12 contains a features TLV record. Add a
corresponding OfferFeatures type where the length is not included in the
serialization as it would be redundant with the record length.
Otherwise, define the features to be the same as InvoiceFeatures.

lightning/src/ln/features.rs

index b372e6af6bf3df3fcf50a8c2ea3177c7f9989e07..d3141cc315c3c26de8ae0b5734007b53f2152379 100644 (file)
@@ -157,6 +157,7 @@ mod sealed {
                // Byte 2
                BasicMPP,
        ]);
+       define_context!(OfferContext, []);
        // This isn't a "real" feature context, and is only used in the channel_type field in an
        // `OpenChannel` message.
        define_context!(ChannelTypeContext, [
@@ -366,7 +367,7 @@ mod sealed {
                supports_keysend, requires_keysend);
 
        #[cfg(test)]
-       define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext, InvoiceContext],
+       define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext, InvoiceContext, OfferContext],
                "Feature flags for an unknown feature used in testing.", set_unknown_feature_optional,
                set_unknown_feature_required, supports_unknown_test_feature, requires_unknown_test_feature);
 }
@@ -425,6 +426,8 @@ pub type NodeFeatures = Features<sealed::NodeContext>;
 pub type ChannelFeatures = Features<sealed::ChannelContext>;
 /// Features used within an invoice.
 pub type InvoiceFeatures = Features<sealed::InvoiceContext>;
+/// Features used within an offer.
+pub type OfferFeatures = Features<sealed::OfferContext>;
 
 /// Features used within the channel_type field in an OpenChannel message.
 ///
@@ -704,21 +707,26 @@ impl_feature_len_prefixed_write!(ChannelFeatures);
 impl_feature_len_prefixed_write!(NodeFeatures);
 impl_feature_len_prefixed_write!(InvoiceFeatures);
 
-// Because ChannelTypeFeatures only appears inside of TLVs, it doesn't have a length prefix when
-// serialized. Thus, we can't use `impl_feature_len_prefixed_write`, above, and have to write our
-// own serialization.
-impl Writeable for ChannelTypeFeatures {
-       fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
-               self.write_be(w)
-       }
-}
-impl Readable for ChannelTypeFeatures {
-       fn read<R: io::Read>(r: &mut R) -> Result<Self, DecodeError> {
-               let v = io_extras::read_to_end(r)?;
-               Ok(Self::from_be_bytes(v))
+// Some features only appear inside of TLVs, so they don't have a length prefix when serialized.
+macro_rules! impl_feature_tlv_write {
+       ($features: ident) => {
+               impl Writeable for $features {
+                       fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+                               self.write_be(w)
+                       }
+               }
+               impl Readable for $features {
+                       fn read<R: io::Read>(r: &mut R) -> Result<Self, DecodeError> {
+                               let v = io_extras::read_to_end(r)?;
+                               Ok(Self::from_be_bytes(v))
+                       }
+               }
        }
 }
 
+impl_feature_tlv_write!(ChannelTypeFeatures);
+impl_feature_tlv_write!(OfferFeatures);
+
 #[cfg(test)]
 mod tests {
        use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, InvoiceFeatures, NodeFeatures, sealed};