Skip to content

Commit 8fdf3c3

Browse files
Make our in-flight limit percentage configurable
1 parent dc8479a commit 8fdf3c3

File tree

2 files changed

+49
-10
lines changed

2 files changed

+49
-10
lines changed

lightning/src/ln/channel.rs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use util::events::ClosureReason;
3939
use util::ser::{Readable, ReadableArgs, Writeable, Writer, VecWriter};
4040
use util::logger::Logger;
4141
use util::errors::APIError;
42-
use util::config::{UserConfig, ChannelConfig, ChannelHandshakeLimits};
42+
use util::config::{UserConfig, ChannelConfig, ChannelHandshakeConfig, ChannelHandshakeLimits};
4343
use util::scid_utils::scid_from_parts;
4444

4545
use io;
@@ -803,9 +803,23 @@ macro_rules! secp_check {
803803
}
804804

805805
impl<Signer: Sign> Channel<Signer> {
806-
// Convert constants + channel value to limits:
807-
fn get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis: u64) -> u64 {
808-
channel_value_satoshis * 1000 / 10 //TODO
806+
/// Returns the value to use for `holder_max_htlc_value_in_flight_msat` as a percentage of the
807+
/// `channel_value_satoshis` in msat, based on how many of the percent its been configured to
808+
/// be set to by the user.
809+
///
810+
/// As we only allow the user to set the percentage to a value between `1-100`, if the user
811+
/// sets a value less than `1`, the function will result in `1` percent of the
812+
/// `channel_value_satoshis`, as well as `100` percent if the user has set a value larger
813+
/// than `100`.
814+
fn get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis: u64, config: &ChannelHandshakeConfig) -> u64 {
815+
let configured_percent = if config.max_inbound_htlc_value_in_flight_percent_of_channel < 1 {
816+
1
817+
} else if config.max_inbound_htlc_value_in_flight_percent_of_channel > 100 {
818+
100
819+
} else {
820+
config.max_inbound_htlc_value_in_flight_percent_of_channel as u64
821+
};
822+
channel_value_satoshis * 10 * configured_percent
809823
}
810824

811825
/// Returns a minimum channel reserve value the remote needs to maintain,
@@ -964,7 +978,7 @@ impl<Signer: Sign> Channel<Signer> {
964978
counterparty_dust_limit_satoshis: 0,
965979
holder_dust_limit_satoshis: MIN_CHAN_DUST_LIMIT_SATOSHIS,
966980
counterparty_max_htlc_value_in_flight_msat: 0,
967-
holder_max_htlc_value_in_flight_msat: Self::get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis),
981+
holder_max_htlc_value_in_flight_msat: Self::get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis, &config.own_channel_config),
968982
counterparty_selected_channel_reserve_satoshis: None, // Filled in in accept_channel
969983
holder_selected_channel_reserve_satoshis,
970984
counterparty_htlc_minimum_msat: 0,
@@ -1282,7 +1296,7 @@ impl<Signer: Sign> Channel<Signer> {
12821296
counterparty_dust_limit_satoshis: msg.dust_limit_satoshis,
12831297
holder_dust_limit_satoshis: MIN_CHAN_DUST_LIMIT_SATOSHIS,
12841298
counterparty_max_htlc_value_in_flight_msat: cmp::min(msg.max_htlc_value_in_flight_msat, msg.funding_satoshis * 1000),
1285-
holder_max_htlc_value_in_flight_msat: Self::get_holder_max_htlc_value_in_flight_msat(msg.funding_satoshis),
1299+
holder_max_htlc_value_in_flight_msat: Self::get_holder_max_htlc_value_in_flight_msat(msg.funding_satoshis, &config.own_channel_config),
12861300
counterparty_selected_channel_reserve_satoshis: Some(msg.channel_reserve_satoshis),
12871301
holder_selected_channel_reserve_satoshis,
12881302
counterparty_htlc_minimum_msat: msg.htlc_minimum_msat,
@@ -5877,13 +5891,15 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
58775891
let chan_type = if self.channel_type != ChannelTypeFeatures::only_static_remote_key() {
58785892
Some(&self.channel_type) } else { None };
58795893

5880-
// The same logic applies for `holder_selected_channel_reserve_satoshis` and
5881-
// `holder_max_htlc_value_in_flight_msat` values other than the defaults.
5894+
// The same logic applies for `holder_selected_channel_reserve_satoshis` values other than
5895+
// the default, and when `holder_max_htlc_value_in_flight_msat` is configured to be set to
5896+
// a different percentage of the channel value then the default value of
5897+
// `ChannelHandshakeConfig::max_inbound_htlc_value_in_flight_percent_of_channel`.
58825898
let serialized_holder_selected_reserve =
58835899
if self.holder_selected_channel_reserve_satoshis != Self::get_holder_selected_channel_reserve_satoshis(self.channel_value_satoshis)
58845900
{ Some(self.holder_selected_channel_reserve_satoshis) } else { None };
58855901
let serialized_holder_htlc_max_in_flight =
5886-
if self.holder_max_htlc_value_in_flight_msat != Self::get_holder_max_htlc_value_in_flight_msat(self.channel_value_satoshis)
5902+
if self.holder_max_htlc_value_in_flight_msat != Self::get_holder_max_htlc_value_in_flight_msat(self.channel_value_satoshis, &UserConfig::default().own_channel_config)
58875903
{ Some(self.holder_max_htlc_value_in_flight_msat) } else { None };
58885904

58895905
write_tlv_fields!(writer, {
@@ -6153,7 +6169,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<(&'a K, u32)> for Channel<Signer>
61536169
let mut target_closing_feerate_sats_per_kw = None;
61546170
let mut monitor_pending_finalized_fulfills = Some(Vec::new());
61556171
let mut holder_selected_channel_reserve_satoshis = Some(Self::get_holder_selected_channel_reserve_satoshis(channel_value_satoshis));
6156-
let mut holder_max_htlc_value_in_flight_msat = Some(Self::get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis));
6172+
let mut holder_max_htlc_value_in_flight_msat = Some(Self::get_holder_max_htlc_value_in_flight_msat(channel_value_satoshis, &UserConfig::default().own_channel_config));
61576173
// Prior to supporting channel type negotiation, all of our channels were static_remotekey
61586174
// only, so we default to that if none was written.
61596175
let mut channel_type = Some(ChannelTypeFeatures::only_static_remote_key());

lightning/src/util/config.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,28 @@ pub struct ChannelHandshakeConfig {
4848
/// Default value: 1. If the value is less than 1, it is ignored and set to 1, as is required
4949
/// by the protocol.
5050
pub our_htlc_minimum_msat: u64,
51+
/// Sets how many the percent of the channel value we will cap the total value of outstanding
52+
/// inbound HTLCs to.
53+
///
54+
/// This can be set to a value between 1-100, where the value corresponds to the percent of the
55+
/// channel value in whole percentages.
56+
///
57+
/// Note that if configured to another value than the default value 10, any new channels
58+
/// created with the non default value won't be backwards compatible with LDK versions prior
59+
/// to 0.0.100.
60+
///
61+
/// Note that this caps the total value for inbound HTLCs in-flight only, and there's currently
62+
/// no availability to configure the cap for the total value of outbound HTLCs in-flight.
63+
/// This effects the in-flight HTLC balance, which [`ChannelConfig::cltv_expiry_delta`] is
64+
/// applied to.
65+
///
66+
/// This does not cap the total value of the non-HTLC-encumbered balance which
67+
/// [`ChannelHandshakeConfig::our_to_self_delay`] is applied to.
68+
///
69+
/// Default value: 10.
70+
/// Minimum value: 1, any values less than 1 will be treated as 1 instead.
71+
/// Maximum value: 100, any values larger than 100 will be treated as 100 instead.
72+
pub max_inbound_htlc_value_in_flight_percent_of_channel: u8,
5173
/// If set, we attempt to negotiate the `scid_privacy` (referred to as `scid_alias` in the
5274
/// BOLTs) option for outbound private channels. This provides better privacy by not including
5375
/// our real on-chain channel UTXO in each invoice and requiring that our counterparty only
@@ -78,6 +100,7 @@ impl Default for ChannelHandshakeConfig {
78100
minimum_depth: 6,
79101
our_to_self_delay: BREAKDOWN_TIMEOUT,
80102
our_htlc_minimum_msat: 1,
103+
max_inbound_htlc_value_in_flight_percent_of_channel: 10,
81104
negotiate_scid_privacy: false,
82105
}
83106
}

0 commit comments

Comments
 (0)