From 7e81f8dcb42602295ee41930310d2fb971bab712 Mon Sep 17 00:00:00 2001 From: Jeffrey Czyz Date: Tue, 13 Dec 2022 16:05:59 -0600 Subject: [PATCH] Remove Option from OfferContents::signing_pubkey 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 | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lightning/src/offers/offer.rs b/lightning/src/offers/offer.rs index a401ec1cc..6451d9431 100644 --- a/lightning/src/offers/offer.rs +++ b/lightning/src/offers/offer.rs @@ -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, paths: Option>, supported_quantity: Quantity, - signing_pubkey: Option, + 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 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::() { + 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)); -- 2.39.5