]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Add `Event::ChannelClosed::last_local_balance_msats`
authorMirebella <166803555+Mirebella@users.noreply.github.com>
Sun, 11 Aug 2024 15:50:45 +0000 (17:50 +0200)
committerMatt Corallo <git@bluematt.me>
Tue, 8 Oct 2024 15:28:58 +0000 (15:28 +0000)
Users commonly want to know what their balance was when a channel
was closed, which this provides in a somewhat simplified manner.

It does not consider pending HTLCs and will always overstate our
balance by transaction fees.

lightning/src/events/mod.rs
lightning/src/ln/channel.rs
lightning/src/ln/channelmanager.rs

index a7cf68dcc1cc550a559fc62348ed8e41b95976fc..5e8346a9b8306f2f8262f8bd054cae19672c9f9f 100644 (file)
@@ -1276,6 +1276,17 @@ pub enum Event {
                /// status of the closing tx.
                /// Note that for instances serialized in v0.0.119 or prior this will be missing (None).
                channel_funding_txo: Option<transaction::OutPoint>,
+               /// An upper bound on the our last local balance in msats before the channel was closed.
+               ///
+               /// Will overstate our balance as it ignores pending outbound HTLCs and transaction fees.
+               ///
+               /// For more accurate balances including fee information see
+               /// [`ChainMonitor::get_claimable_balances`].
+               ///
+               /// This field will be `None` only for objects serialized prior to LDK 0.1.
+               ///
+               /// [`ChainMonitor::get_claimable_balances`]: crate::chain::chainmonitor::ChainMonitor::get_claimable_balances
+               last_local_balance_msat: Option<u64>,
        },
        /// Used to indicate to the user that they can abandon the funding transaction and recycle the
        /// inputs for another purpose.
@@ -1555,7 +1566,8 @@ impl Writeable for Event {
                                });
                        },
                        &Event::ChannelClosed { ref channel_id, ref user_channel_id, ref reason,
-                               ref counterparty_node_id, ref channel_capacity_sats, ref channel_funding_txo
+                               ref counterparty_node_id, ref channel_capacity_sats, ref channel_funding_txo,
+                               ref last_local_balance_msat,
                        } => {
                                9u8.write(writer)?;
                                // `user_channel_id` used to be a single u64 value. In order to remain backwards
@@ -1571,6 +1583,7 @@ impl Writeable for Event {
                                        (5, counterparty_node_id, option),
                                        (7, channel_capacity_sats, option),
                                        (9, channel_funding_txo, option),
+                                       (11, last_local_balance_msat, option)
                                });
                        },
                        &Event::DiscardFunding { ref channel_id, ref funding_info } => {
@@ -1939,6 +1952,7 @@ impl MaybeReadable for Event {
                                        let mut counterparty_node_id = None;
                                        let mut channel_capacity_sats = None;
                                        let mut channel_funding_txo = None;
+                                       let mut last_local_balance_msat = None;
                                        read_tlv_fields!(reader, {
                                                (0, channel_id, required),
                                                (1, user_channel_id_low_opt, option),
@@ -1947,6 +1961,7 @@ impl MaybeReadable for Event {
                                                (5, counterparty_node_id, option),
                                                (7, channel_capacity_sats, option),
                                                (9, channel_funding_txo, option),
+                                               (11, last_local_balance_msat, option)
                                        });
 
                                        // `user_channel_id` used to be a single u64 value. In order to remain
@@ -1955,8 +1970,10 @@ impl MaybeReadable for Event {
                                        let user_channel_id = (user_channel_id_low_opt.unwrap_or(0) as u128) +
                                                ((user_channel_id_high_opt.unwrap_or(0) as u128) << 64);
 
-                                       Ok(Some(Event::ChannelClosed { channel_id, user_channel_id, reason: _init_tlv_based_struct_field!(reason, upgradable_required),
-                                               counterparty_node_id, channel_capacity_sats, channel_funding_txo }))
+                                       Ok(Some(Event::ChannelClosed {
+                                               channel_id, user_channel_id, reason: _init_tlv_based_struct_field!(reason, upgradable_required),
+                                               counterparty_node_id, channel_capacity_sats, channel_funding_txo, last_local_balance_msat,
+                                       }))
                                };
                                f()
                        },
index 46b35a940382d3a9c596d979185a53b43fc8f3c4..250704ea2a78af5bdbc392cab2e9af712aa7ec86 100644 (file)
@@ -937,6 +937,7 @@ pub(crate) struct ShutdownResult {
        pub(crate) is_manual_broadcast: bool,
        pub(crate) unbroadcasted_funding_tx: Option<Transaction>,
        pub(crate) channel_funding_txo: Option<OutPoint>,
+       pub(crate) last_local_balance_msat: u64,
 }
 
 /// Tracks the transaction number, along with current and next commitment points.
@@ -2066,6 +2067,8 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider  {
                })
        }
 
+       pub(crate) fn get_value_to_self_msat(&self) -> u64 {self.value_to_self_msat}
+
        /// Allowed in any state (including after shutdown)
        pub fn get_update_time_counter(&self) -> u32 {
                self.update_time_counter
@@ -3532,6 +3535,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider  {
                        unbroadcasted_funding_tx,
                        is_manual_broadcast: self.is_manual_broadcast,
                        channel_funding_txo: self.get_funding_txo(),
+                       last_local_balance_msat: self.value_to_self_msat,
                }
        }
 
@@ -6180,6 +6184,7 @@ impl<SP: Deref> Channel<SP> where
                        unbroadcasted_funding_tx: self.context.unbroadcasted_funding(),
                        is_manual_broadcast: self.context.is_manual_broadcast,
                        channel_funding_txo: self.context.get_funding_txo(),
+                       last_local_balance_msat: self.context.value_to_self_msat,
                }
        }
 
index 5f8dc1e5541fa1689caf22276b28bf9624d6a9c8..3c5b0b4fb6b7940928ee183367cf9df6a6cd063b 100644 (file)
@@ -3574,6 +3574,7 @@ where
                                counterparty_node_id: Some(shutdown_res.counterparty_node_id),
                                channel_capacity_sats: Some(shutdown_res.channel_capacity_satoshis),
                                channel_funding_txo: shutdown_res.channel_funding_txo,
+                               last_local_balance_msat: Some(shutdown_res.last_local_balance_msat),
                        }, None));
 
                        if let Some(transaction) = shutdown_res.unbroadcasted_funding_tx {
@@ -12039,6 +12040,7 @@ where
                                                counterparty_node_id: Some(channel.context.get_counterparty_node_id()),
                                                channel_capacity_sats: Some(channel.context.get_value_satoshis()),
                                                channel_funding_txo: channel.context.get_funding_txo(),
+                                               last_local_balance_msat: Some(channel.context.get_value_to_self_msat()),
                                        }, None));
                                        for (channel_htlc_source, payment_hash) in channel.inflight_htlc_sources() {
                                                let mut found_htlc = false;
@@ -12095,6 +12097,7 @@ where
                                        counterparty_node_id: Some(channel.context.get_counterparty_node_id()),
                                        channel_capacity_sats: Some(channel.context.get_value_satoshis()),
                                        channel_funding_txo: channel.context.get_funding_txo(),
+                                       last_local_balance_msat: Some(channel.context.get_value_to_self_msat()),
                                }, None));
                        } else {
                                log_error!(logger, "Missing ChannelMonitor for channel {} needed by ChannelManager.", &channel.context.channel_id());