Include RecipientOnionFields in PaymentClaimed
[rust-lightning] / lightning / src / events / mod.rs
index d34db885f7c4e0d24ad52281f143f5fb08c385ad..0350f816a48cc418ea6d41f7671d027a89bd71ec 100644 (file)
@@ -24,7 +24,7 @@ use crate::ln::channelmanager::{InterceptId, PaymentId, RecipientOnionFields};
 use crate::ln::channel::FUNDING_CONF_DEADLINE_BLOCKS;
 use crate::ln::features::ChannelTypeFeatures;
 use crate::ln::msgs;
-use crate::ln::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret};
+use crate::ln::types::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret};
 use crate::chain::transaction;
 use crate::routing::gossip::NetworkUpdate;
 use crate::util::errors::APIError;
@@ -653,6 +653,11 @@ pub enum Event {
                /// The sender-intended sum total of all the MPP parts. This will be `None` for events
                /// serialized prior to LDK version 0.0.117.
                sender_intended_total_msat: Option<u64>,
+               /// The fields in the onion which were received with each HTLC. Only fields which were
+               /// identical in each HTLC involved in the payment will be included here.
+               ///
+               /// Payments received on LDK versions prior to 0.0.124 will have this field unset.
+               onion_fields: Option<RecipientOnionFields>,
        },
        /// Indicates that a peer connection with a node is needed in order to send an [`OnionMessage`].
        ///
@@ -886,9 +891,15 @@ pub enum Event {
        },
        /// Used to indicate that an output which you should know how to spend was confirmed on chain
        /// and is now spendable.
-       /// Such an output will *not* ever be spent by rust-lightning, and are not at risk of your
+       ///
+       /// Such an output will *never* be spent directly by LDK, and are not at risk of your
        /// counterparty spending them due to some kind of timeout. Thus, you need to store them
        /// somewhere and spend them when you create on-chain transactions.
+       ///
+       /// You may hand them to the [`OutputSweeper`] utility which will store and (re-)generate spending
+       /// transactions for you.
+       ///
+       /// [`OutputSweeper`]: crate::util::sweep::OutputSweeper
        SpendableOutputs {
                /// The outputs which you should store as spendable by you.
                outputs: Vec<SpendableOutputDescriptor>,
@@ -1006,8 +1017,8 @@ pub enum Event {
                /// The features that this channel will operate with.
                channel_type: ChannelTypeFeatures,
        },
-       /// Used to indicate that a previously opened channel with the given `channel_id` is in the
-       /// process of closure.
+       /// Used to indicate that a channel that got past the initial handshake with the given `channel_id` is in the
+       /// process of closure. This includes previously opened channels, and channels that time out from not being funded.
        ///
        /// Note that this event is only triggered for accepted channels: if the
        /// [`UserConfig::manually_accept_inbound_channels`] config flag is set to true and the channel is
@@ -1135,6 +1146,30 @@ pub enum Event {
        ///
        /// [`ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx`]: crate::util::config::ChannelHandshakeConfig::negotiate_anchors_zero_fee_htlc_tx
        BumpTransaction(BumpTransactionEvent),
+       /// We received an onion message that is intended to be forwarded to a peer
+       /// that is currently offline. This event will only be generated if the
+       /// `OnionMessenger` was initialized with
+       /// [`OnionMessenger::new_with_offline_peer_interception`], see its docs.
+       ///
+       /// [`OnionMessenger::new_with_offline_peer_interception`]: crate::onion_message::messenger::OnionMessenger::new_with_offline_peer_interception
+       OnionMessageIntercepted {
+               /// The node id of the offline peer.
+               peer_node_id: PublicKey,
+               /// The onion message intended to be forwarded to `peer_node_id`.
+               message: msgs::OnionMessage,
+       },
+       /// Indicates that an onion message supporting peer has come online and it may
+       /// be time to forward any onion messages that were previously intercepted for
+       /// them. This event will only be generated if the `OnionMessenger` was
+       /// initialized with
+       /// [`OnionMessenger::new_with_offline_peer_interception`], see its docs.
+       ///
+       /// [`OnionMessenger::new_with_offline_peer_interception`]: crate::onion_message::messenger::OnionMessenger::new_with_offline_peer_interception
+       OnionMessagePeerConnected {
+               /// The node id of the peer we just connected to, who advertises support for
+               /// onion messages.
+               peer_node_id: PublicKey,
+       }
 }
 
 impl Writeable for Event {
@@ -1318,7 +1353,7 @@ impl Writeable for Event {
                                // We never write the OpenChannelRequest events as, upon disconnection, peers
                                // drop any channels which have not yet exchanged funding_signed.
                        },
-                       &Event::PaymentClaimed { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id, ref htlcs, ref sender_intended_total_msat } => {
+                       &Event::PaymentClaimed { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id, ref htlcs, ref sender_intended_total_msat, ref onion_fields } => {
                                19u8.write(writer)?;
                                write_tlv_fields!(writer, {
                                        (0, payment_hash, required),
@@ -1327,6 +1362,7 @@ impl Writeable for Event {
                                        (4, amount_msat, required),
                                        (5, *htlcs, optional_vec),
                                        (7, sender_intended_total_msat, option),
+                                       (9, onion_fields, option),
                                });
                        },
                        &Event::ProbeSuccessful { ref payment_id, ref payment_hash, ref path } => {
@@ -1398,6 +1434,19 @@ impl Writeable for Event {
                                35u8.write(writer)?;
                                // Never write ConnectionNeeded events as buffered onion messages aren't serialized.
                        },
+                       &Event::OnionMessageIntercepted { ref peer_node_id, ref message } => {
+                               37u8.write(writer)?;
+                               write_tlv_fields!(writer, {
+                                       (0, peer_node_id, required),
+                                       (2, message, required),
+                               });
+                       },
+                       &Event::OnionMessagePeerConnected { ref peer_node_id } => {
+                               39u8.write(writer)?;
+                               write_tlv_fields!(writer, {
+                                       (0, peer_node_id, required),
+                               });
+                       }
                        // Note that, going forward, all new events must only write data inside of
                        // `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write
                        // data via `write_tlv_fields`.
@@ -1676,6 +1725,7 @@ impl MaybeReadable for Event {
                                        let mut receiver_node_id = None;
                                        let mut htlcs: Option<Vec<ClaimedHTLC>> = Some(vec![]);
                                        let mut sender_intended_total_msat: Option<u64> = None;
+                                       let mut onion_fields = None;
                                        read_tlv_fields!(reader, {
                                                (0, payment_hash, required),
                                                (1, receiver_node_id, option),
@@ -1683,6 +1733,7 @@ impl MaybeReadable for Event {
                                                (4, amount_msat, required),
                                                (5, htlcs, optional_vec),
                                                (7, sender_intended_total_msat, option),
+                                               (9, onion_fields, option),
                                        });
                                        Ok(Some(Event::PaymentClaimed {
                                                receiver_node_id,
@@ -1691,6 +1742,7 @@ impl MaybeReadable for Event {
                                                amount_msat,
                                                htlcs: htlcs.unwrap_or(vec![]),
                                                sender_intended_total_msat,
+                                               onion_fields,
                                        }))
                                };
                                f()
@@ -1808,6 +1860,29 @@ impl MaybeReadable for Event {
                        },
                        // Note that we do not write a length-prefixed TLV for ConnectionNeeded events.
                        35u8 => Ok(None),
+                       37u8 => {
+                               let mut f = || {
+                                       _init_and_read_len_prefixed_tlv_fields!(reader, {
+                                               (0, peer_node_id, required),
+                                               (2, message, required),
+                                       });
+                                       Ok(Some(Event::OnionMessageIntercepted {
+                                               peer_node_id: peer_node_id.0.unwrap(), message: message.0.unwrap()
+                                       }))
+                               };
+                               f()
+                       },
+                       39u8 => {
+                               let mut f = || {
+                                       _init_and_read_len_prefixed_tlv_fields!(reader, {
+                                               (0, peer_node_id, required),
+                                       });
+                                       Ok(Some(Event::OnionMessagePeerConnected {
+                                               peer_node_id: peer_node_id.0.unwrap()
+                                       }))
+                               };
+                               f()
+                       },
                        // Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
                        // Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt
                        // reads.