@@ -39,7 +39,7 @@ use util::events::ClosureReason;
39
39
use util:: ser:: { Readable , ReadableArgs , Writeable , Writer , VecWriter } ;
40
40
use util:: logger:: Logger ;
41
41
use util:: errors:: APIError ;
42
- use util:: config:: { UserConfig , ChannelConfig , ChannelHandshakeLimits } ;
42
+ use util:: config:: { UserConfig , ChannelConfig , ChannelHandshakeConfig , ChannelHandshakeLimits } ;
43
43
use util:: scid_utils:: scid_from_parts;
44
44
45
45
use io;
@@ -745,6 +745,12 @@ pub const COMMITMENT_TX_WEIGHT_PER_HTLC: u64 = 172;
745
745
746
746
pub const ANCHOR_OUTPUT_VALUE_SATOSHI : u64 = 330 ;
747
747
748
+ /// The percentage of the channel value `holder_max_htlc_value_in_flight_msat` used to be set to,
749
+ /// before this was made configurable. The percentage was made configurable in LDK 0.0.107,
750
+ /// although LDK 0.0.104+ enabled serialization of channels with a different value set for
751
+ /// `holder_max_htlc_value_in_flight_msat`.
752
+ pub const MAX_IN_FLIGHT_PERCENT_LEGACY : u8 = 10 ;
753
+
748
754
/// Maximum `funding_satoshis` value according to the BOLT #2 specification, if
749
755
/// `option_support_large_channel` (aka wumbo channels) is not supported.
750
756
/// It's 2^24 - 1.
@@ -803,9 +809,22 @@ macro_rules! secp_check {
803
809
}
804
810
805
811
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
812
+ /// Returns the value to use for `holder_max_htlc_value_in_flight_msat` as a percentage of the
813
+ /// `channel_value_satoshis` in msat, set through
814
+ /// [`ChannelHandshakeConfig::max_inbound_htlc_value_in_flight_percent_of_channel`]
815
+ ///
816
+ /// The effective percentage is lower bounded by 1% and upper bounded by 100%.
817
+ ///
818
+ /// [`ChannelHandshakeConfig::max_inbound_htlc_value_in_flight_percent_of_channel`]: crate::util::config::ChannelHandshakeConfig::max_inbound_htlc_value_in_flight_percent_of_channel
819
+ fn get_holder_max_htlc_value_in_flight_msat ( channel_value_satoshis : u64 , config : & ChannelHandshakeConfig ) -> u64 {
820
+ let configured_percent = if config. max_inbound_htlc_value_in_flight_percent_of_channel < 1 {
821
+ 1
822
+ } else if config. max_inbound_htlc_value_in_flight_percent_of_channel > 100 {
823
+ 100
824
+ } else {
825
+ config. max_inbound_htlc_value_in_flight_percent_of_channel as u64
826
+ } ;
827
+ channel_value_satoshis * 10 * configured_percent
809
828
}
810
829
811
830
/// Returns a minimum channel reserve value the remote needs to maintain,
@@ -964,7 +983,7 @@ impl<Signer: Sign> Channel<Signer> {
964
983
counterparty_dust_limit_satoshis : 0 ,
965
984
holder_dust_limit_satoshis : MIN_CHAN_DUST_LIMIT_SATOSHIS ,
966
985
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) ,
986
+ holder_max_htlc_value_in_flight_msat : Self :: get_holder_max_htlc_value_in_flight_msat ( channel_value_satoshis, & config . own_channel_config ) ,
968
987
counterparty_selected_channel_reserve_satoshis : None , // Filled in in accept_channel
969
988
holder_selected_channel_reserve_satoshis,
970
989
counterparty_htlc_minimum_msat : 0 ,
@@ -1282,7 +1301,7 @@ impl<Signer: Sign> Channel<Signer> {
1282
1301
counterparty_dust_limit_satoshis : msg. dust_limit_satoshis ,
1283
1302
holder_dust_limit_satoshis : MIN_CHAN_DUST_LIMIT_SATOSHIS ,
1284
1303
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 ) ,
1304
+ holder_max_htlc_value_in_flight_msat : Self :: get_holder_max_htlc_value_in_flight_msat ( msg. funding_satoshis , & config . own_channel_config ) ,
1286
1305
counterparty_selected_channel_reserve_satoshis : Some ( msg. channel_reserve_satoshis ) ,
1287
1306
holder_selected_channel_reserve_satoshis,
1288
1307
counterparty_htlc_minimum_msat : msg. htlc_minimum_msat ,
@@ -5877,13 +5896,18 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
5877
5896
let chan_type = if self . channel_type != ChannelTypeFeatures :: only_static_remote_key ( ) {
5878
5897
Some ( & self . channel_type ) } else { None } ;
5879
5898
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.
5899
+ // The same logic applies for `holder_selected_channel_reserve_satoshis` values other than
5900
+ // the default, and when `holder_max_htlc_value_in_flight_msat` is configured to be set to
5901
+ // a different percentage of the channel value then 10%, which older versions of LDK used
5902
+ // to set it to before the percentage was made configurable.
5882
5903
let serialized_holder_selected_reserve =
5883
5904
if self . holder_selected_channel_reserve_satoshis != Self :: get_holder_selected_channel_reserve_satoshis ( self . channel_value_satoshis )
5884
5905
{ Some ( self . holder_selected_channel_reserve_satoshis ) } else { None } ;
5906
+
5907
+ let mut old_max_in_flight_percent_config = UserConfig :: default ( ) . own_channel_config ;
5908
+ old_max_in_flight_percent_config. max_inbound_htlc_value_in_flight_percent_of_channel = MAX_IN_FLIGHT_PERCENT_LEGACY ;
5885
5909
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 )
5910
+ if self . holder_max_htlc_value_in_flight_msat != Self :: get_holder_max_htlc_value_in_flight_msat ( self . channel_value_satoshis , & old_max_in_flight_percent_config )
5887
5911
{ Some ( self . holder_max_htlc_value_in_flight_msat ) } else { None } ;
5888
5912
5889
5913
write_tlv_fields ! ( writer, {
@@ -6153,7 +6177,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<(&'a K, u32)> for Channel<Signer>
6153
6177
let mut target_closing_feerate_sats_per_kw = None ;
6154
6178
let mut monitor_pending_finalized_fulfills = Some ( Vec :: new ( ) ) ;
6155
6179
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) ) ;
6180
+ 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 ) ) ;
6157
6181
// Prior to supporting channel type negotiation, all of our channels were static_remotekey
6158
6182
// only, so we default to that if none was written.
6159
6183
let mut channel_type = Some ( ChannelTypeFeatures :: only_static_remote_key ( ) ) ;
0 commit comments