From: Mirebella <166803555+Mirebella@users.noreply.github.com> Date: Sun, 11 Aug 2024 15:50:45 +0000 (+0200) Subject: Add `Event::ChannelClosed::last_local_balance_msats` X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=5d48d588ef16aad12a1a0786a310570bdf469c31;p=rust-lightning Add `Event::ChannelClosed::last_local_balance_msats` 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. --- diff --git a/lightning/src/events/mod.rs b/lightning/src/events/mod.rs index a7cf68dcc..5e8346a9b 100644 --- a/lightning/src/events/mod.rs +++ b/lightning/src/events/mod.rs @@ -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, + /// 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, }, /// 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() }, diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 46b35a940..250704ea2 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -937,6 +937,7 @@ pub(crate) struct ShutdownResult { pub(crate) is_manual_broadcast: bool, pub(crate) unbroadcasted_funding_tx: Option, pub(crate) channel_funding_txo: Option, + pub(crate) last_local_balance_msat: u64, } /// Tracks the transaction number, along with current and next commitment points. @@ -2066,6 +2067,8 @@ impl ChannelContext 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 ChannelContext 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 Channel 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, } } diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 5f8dc1e55..3c5b0b4fb 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -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());