Add missing copyright statement
[rust-lightning] / lightning / src / blinded_path / payment.rs
index ad7b229b53fa1c830d042d24a892360666bf5b65..5e44c792d33b9c49df82c2d9840e462ad45cb9f6 100644 (file)
@@ -1,3 +1,12 @@
+// This file is Copyright its original authors, visible in version control
+// history.
+//
+// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
+// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
+// You may not use this file except in accordance with one or both of these
+// licenses.
+
 //! Data structures and methods for constructing [`BlindedPath`]s to send a payment over.
 //!
 //! [`BlindedPath`]: crate::blinded_path::BlindedPath
@@ -7,11 +16,12 @@ use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey};
 use crate::blinded_path::BlindedHop;
 use crate::blinded_path::utils;
 use crate::io;
-use crate::ln::PaymentSecret;
+use crate::ln::types::PaymentSecret;
 use crate::ln::channelmanager::CounterpartyForwardingInfo;
 use crate::ln::features::BlindedHopFeatures;
 use crate::ln::msgs::DecodeError;
 use crate::offers::invoice::BlindedPayInfo;
+use crate::offers::invoice_request::InvoiceRequestFields;
 use crate::offers::offer::OfferId;
 use crate::util::ser::{HighZeroBytesDroppedBigSize, Readable, Writeable, Writer};
 
@@ -121,6 +131,12 @@ pub enum PaymentContext {
        Bolt12Refund(Bolt12RefundContext),
 }
 
+// Used when writing PaymentContext in Event::PaymentClaimable to avoid cloning.
+pub(crate) enum PaymentContextRef<'a> {
+       Bolt12Offer(&'a Bolt12OfferContext),
+       Bolt12Refund(&'a Bolt12RefundContext),
+}
+
 /// An unknown payment context.
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub struct UnknownPaymentContext(());
@@ -134,6 +150,12 @@ pub struct Bolt12OfferContext {
        ///
        /// [`Offer`]: crate::offers::offer::Offer
        pub offer_id: OfferId,
+
+       /// Fields from an [`InvoiceRequest`] sent for a [`Bolt12Invoice`].
+       ///
+       /// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
+       /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
+       pub invoice_request: InvoiceRequestFields,
 }
 
 /// The context of a payment made for an invoice sent for a BOLT 12 [`Refund`].
@@ -372,6 +394,23 @@ impl_writeable_tlv_based_enum!(PaymentContext,
        (2, Bolt12Refund),
 );
 
+impl<'a> Writeable for PaymentContextRef<'a> {
+       fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+               match self {
+                       PaymentContextRef::Bolt12Offer(context) => {
+                               1u8.write(w)?;
+                               context.write(w)?;
+                       },
+                       PaymentContextRef::Bolt12Refund(context) => {
+                               2u8.write(w)?;
+                               context.write(w)?;
+                       },
+               }
+
+               Ok(())
+       }
+}
+
 impl Writeable for UnknownPaymentContext {
        fn write<W: Writer>(&self, _w: &mut W) -> Result<(), io::Error> {
                Ok(())
@@ -386,6 +425,7 @@ impl Readable for UnknownPaymentContext {
 
 impl_writeable_tlv_based!(Bolt12OfferContext, {
        (0, offer_id, required),
+       (2, invoice_request, required),
 });
 
 impl_writeable_tlv_based!(Bolt12RefundContext, {});
@@ -394,7 +434,7 @@ impl_writeable_tlv_based!(Bolt12RefundContext, {});
 mod tests {
        use bitcoin::secp256k1::PublicKey;
        use crate::blinded_path::payment::{ForwardNode, ForwardTlvs, ReceiveTlvs, PaymentConstraints, PaymentContext, PaymentRelay};
-       use crate::ln::PaymentSecret;
+       use crate::ln::types::PaymentSecret;
        use crate::ln::features::BlindedHopFeatures;
        use crate::ln::functional_test_utils::TEST_FINAL_CLTV;