]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Remove Option from OfferContents::signing_pubkey
authorJeffrey Czyz <jkczyz@gmail.com>
Tue, 13 Dec 2022 22:05:59 +0000 (16:05 -0600)
committerJeffrey Czyz <jkczyz@gmail.com>
Tue, 13 Dec 2022 22:05:59 +0000 (16:05 -0600)
Refunds (i.e., `invoice_request` without an `offer`) will have its own
contents type, so OfferContents::signing_pubkey can be required.

lightning/src/offers/offer.rs

index a401ec1cc08388a633c7d91f44b362f9996488f0..6451d9431a188f3b15440c1d687435e7068f7240 100644 (file)
@@ -106,7 +106,7 @@ impl OfferBuilder {
                let offer = OfferContents {
                        chains: None, metadata: None, amount: None, description,
                        features: OfferFeatures::empty(), absolute_expiry: None, issuer: None, paths: None,
-                       supported_quantity: Quantity::one(), signing_pubkey: Some(signing_pubkey),
+                       supported_quantity: Quantity::one(), signing_pubkey,
                };
                OfferBuilder { offer }
        }
@@ -263,7 +263,7 @@ pub(super) struct OfferContents {
        issuer: Option<String>,
        paths: Option<Vec<BlindedPath>>,
        supported_quantity: Quantity,
-       signing_pubkey: Option<PublicKey>,
+       signing_pubkey: PublicKey,
 }
 
 impl Offer {
@@ -359,7 +359,7 @@ impl Offer {
 
        /// The public key used by the recipient to sign invoices.
        pub fn signing_pubkey(&self) -> PublicKey {
-               self.contents.signing_pubkey.unwrap()
+               self.contents.signing_pubkey
        }
 
        /// Creates an [`InvoiceRequest`] for the offer with the given `metadata` and `payer_id`, which
@@ -497,7 +497,7 @@ impl OfferContents {
                        paths: self.paths.as_ref(),
                        issuer: self.issuer.as_ref(),
                        quantity_max: self.supported_quantity.to_tlv_record(),
-                       node_id: self.signing_pubkey.as_ref(),
+                       node_id: Some(&self.signing_pubkey),
                }
        }
 }
@@ -634,13 +634,14 @@ impl TryFrom<OfferTlvStream> for OfferContents {
                        Some(n) => Quantity::Bounded(NonZeroU64::new(n).unwrap()),
                };
 
-               if node_id.is_none() {
-                       return Err(SemanticError::MissingSigningPubkey);
-               }
+               let signing_pubkey = match node_id {
+                       None => return Err(SemanticError::MissingSigningPubkey),
+                       Some(node_id) => node_id,
+               };
 
                Ok(OfferContents {
                        chains, metadata, amount, description, features, absolute_expiry, issuer, paths,
-                       supported_quantity, signing_pubkey: node_id,
+                       supported_quantity, signing_pubkey,
                })
        }
 }
@@ -1126,11 +1127,13 @@ mod tests {
                        panic!("error parsing offer: {:?}", e);
                }
 
-               let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
-               builder.offer.signing_pubkey = None;
+               let mut tlv_stream = offer.as_tlv_stream();
+               tlv_stream.node_id = None;
 
-               let offer = builder.build().unwrap();
-               match offer.to_string().parse::<Offer>() {
+               let mut encoded_offer = Vec::new();
+               tlv_stream.write(&mut encoded_offer).unwrap();
+
+               match Offer::try_from(encoded_offer) {
                        Ok(_) => panic!("expected error"),
                        Err(e) => {
                                assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingSigningPubkey));