@@ -132,6 +132,18 @@ pub use crate::ln::outbound_payment::{Bolt12PaymentError, ProbeSendFailure, Retr
132
132
pub(crate) use crate::ln::outbound_payment::PaymentSendFailure;
133
133
use crate::ln::script::ShutdownScript;
134
134
135
+
136
+ /// Config structure for overriding incoming channel configuration parameters.
137
+ #[derive(Default)]
138
+ pub struct InboundChannelConfigOverrides {
139
+ max_inbound_htlc_value_in_flight_percent_of_channel: Option<u8>,
140
+ htlc_minimum_msat: Option<u64>,
141
+ minimum_depth: Option<u32>,
142
+ to_self_delay: Option<u16>,
143
+ max_accepted_htlcs: Option<u16>,
144
+ channel_reserve_proportional_millionths: Option<u32>
145
+ }
146
+
135
147
// We hold various information about HTLC relay in the HTLC objects in Channel itself:
136
148
//
137
149
// Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -1851,7 +1863,7 @@ where
1851
1863
///
1852
1864
/// ```
1853
1865
/// # use bitcoin::secp256k1::PublicKey;
1854
- /// # use lightning::ln::channelmanager::AChannelManager;
1866
+ /// # use lightning::ln::channelmanager::{ AChannelManager, InboundChannelConfigOverride} ;
1855
1867
/// # use lightning::events::{Event, EventsProvider};
1856
1868
/// #
1857
1869
/// # fn is_trusted(counterparty_node_id: PublicKey) -> bool {
@@ -1877,7 +1889,7 @@ where
1877
1889
///
1878
1890
/// let user_channel_id = 43;
1879
1891
/// match channel_manager.accept_inbound_channel(
1880
- /// &temporary_channel_id, &counterparty_node_id, user_channel_id
1892
+ /// &temporary_channel_id, &counterparty_node_id, user_channel_id, InboundChannelConfigOverride::default()
1881
1893
/// ) {
1882
1894
/// Ok(()) => println!("Accepting channel {}", temporary_channel_id),
1883
1895
/// Err(e) => println!("Error accepting channel {}: {:?}", temporary_channel_id, e),
@@ -7699,8 +7711,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7699
7711
///
7700
7712
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
7701
7713
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7702
- pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7703
- self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, vec![], Weight::from_wu(0))
7714
+ pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: InboundChannelConfigOverrides ) -> Result<(), APIError> {
7715
+ self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, vec![], Weight::from_wu(0), config_overrides )
7704
7716
}
7705
7717
7706
7718
/// Accepts a request to open a channel after a [`events::Event::OpenChannelRequest`], treating
@@ -7721,15 +7733,42 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7721
7733
///
7722
7734
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
7723
7735
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7724
- pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128) -> Result<(), APIError> {
7725
- self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, vec![], Weight::from_wu(0))
7736
+ pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: InboundChannelConfigOverrides ) -> Result<(), APIError> {
7737
+ self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, vec![], Weight::from_wu(0), config_overrides )
7726
7738
}
7727
7739
7728
7740
fn do_accept_inbound_channel(
7729
7741
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
7730
7742
user_channel_id: u128, _funding_inputs: Vec<(TxIn, TransactionU16LenLimited)>,
7731
- _total_witness_weight: Weight,
7743
+ _total_witness_weight: Weight, config_overrides: InboundChannelConfigOverrides
7732
7744
) -> Result<(), APIError> {
7745
+
7746
+ // Apply configuration overrides.
7747
+ let mut config = self.default_configuration.clone();
7748
+ if let Some(max_in_flight_percent) = config_overrides.max_inbound_htlc_value_in_flight_percent_of_channel {
7749
+ config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = max_in_flight_percent;
7750
+ }
7751
+
7752
+ if let Some(htlc_minimum_msat) = config_overrides.htlc_minimum_msat {
7753
+ config.channel_handshake_config.our_htlc_minimum_msat = htlc_minimum_msat;
7754
+ }
7755
+
7756
+ if let Some(minimum_depth) = config_overrides.minimum_depth {
7757
+ config.channel_handshake_config.minimum_depth = minimum_depth;
7758
+ }
7759
+
7760
+ if let Some(to_self_delay) = config_overrides.to_self_delay {
7761
+ config.channel_handshake_config.our_to_self_delay = to_self_delay;
7762
+ }
7763
+
7764
+ if let Some(max_accepted_htlcs) = config_overrides.max_accepted_htlcs {
7765
+ config.channel_handshake_config.our_max_accepted_htlcs = max_accepted_htlcs;
7766
+ }
7767
+
7768
+ if let Some(channel_reserve) = config_overrides.channel_reserve_proportional_millionths {
7769
+ config.channel_handshake_config.their_channel_reserve_proportional_millionths = channel_reserve;
7770
+ }
7771
+
7733
7772
let logger = WithContext::from(&self.logger, Some(*counterparty_node_id), Some(*temporary_channel_id), None);
7734
7773
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
7735
7774
@@ -7759,7 +7798,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7759
7798
InboundV1Channel::new(
7760
7799
&self.fee_estimator, &self.entropy_source, &self.signer_provider, *counterparty_node_id,
7761
7800
&self.channel_type_features(), &peer_state.latest_features, &open_channel_msg,
7762
- user_channel_id, &self.default_configuration , best_block_height, &self.logger, accept_0conf
7801
+ user_channel_id, &config , best_block_height, &self.logger, accept_0conf
7763
7802
).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id)
7764
7803
).map(|mut channel| {
7765
7804
let logger = WithChannelContext::from(&self.logger, &channel.context, None);
@@ -14478,9 +14517,9 @@ mod tests {
14478
14517
use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, ClosureReason};
14479
14518
use crate::ln::types::ChannelId;
14480
14519
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14481
- use crate::ln::channelmanager::{create_recv_pending_htlc_info, HTLCForwardInfo, inbound_payment , PaymentId, RecipientOnionFields, InterceptId };
14520
+ use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, InboundChannelConfigOverrides, HTLCForwardInfo, InterceptId , PaymentId, RecipientOnionFields};
14482
14521
use crate::ln::functional_test_utils::*;
14483
- use crate::ln::msgs::{self, ErrorAction};
14522
+ use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
14484
14523
use crate::ln::msgs::ChannelMessageHandler;
14485
14524
use crate::ln::outbound_payment::Retry;
14486
14525
use crate::prelude::*;
@@ -15237,7 +15276,7 @@ mod tests {
15237
15276
// Test the API functions.
15238
15277
check_not_connected_to_peer_error(nodes[0].node.create_channel(unkown_public_key, 1_000_000, 500_000_000, 42, None, None), unkown_public_key);
15239
15278
15240
- check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42), unkown_public_key);
15279
+ check_unkown_peer_error(nodes[0].node.accept_inbound_channel(&channel_id, &unkown_public_key, 42, InboundChannelConfigOverrides::default() ), unkown_public_key);
15241
15280
15242
15281
check_unkown_peer_error(nodes[0].node.close_channel(&channel_id, &unkown_public_key), unkown_public_key);
15243
15282
@@ -15268,7 +15307,7 @@ mod tests {
15268
15307
let error_message = "Channel force-closed";
15269
15308
15270
15309
// Test the API functions.
15271
- check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42));
15310
+ check_api_misuse_error(nodes[0].node.accept_inbound_channel(&channel_id, &counterparty_node_id, 42, InboundChannelConfigOverrides::default() ));
15272
15311
15273
15312
check_channel_unavailable_error(nodes[0].node.close_channel(&channel_id, &counterparty_node_id), channel_id, counterparty_node_id);
15274
15313
@@ -15459,7 +15498,7 @@ mod tests {
15459
15498
let events = nodes[1].node.get_and_clear_pending_events();
15460
15499
match events[0] {
15461
15500
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15462
- nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23).unwrap();
15501
+ nodes[1].node.accept_inbound_channel(&temporary_channel_id, &random_pk, 23, InboundChannelConfigOverrides::default() ).unwrap();
15463
15502
}
15464
15503
_ => panic!("Unexpected event"),
15465
15504
}
@@ -15477,7 +15516,7 @@ mod tests {
15477
15516
let events = nodes[1].node.get_and_clear_pending_events();
15478
15517
match events[0] {
15479
15518
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15480
- match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23) {
15519
+ match nodes[1].node.accept_inbound_channel(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default() ) {
15481
15520
Err(APIError::APIMisuseError { err }) =>
15482
15521
assert_eq!(err, "Too many peers with unfunded channels, refusing to accept new ones"),
15483
15522
_ => panic!(),
@@ -15493,7 +15532,7 @@ mod tests {
15493
15532
let events = nodes[1].node.get_and_clear_pending_events();
15494
15533
match events[0] {
15495
15534
Event::OpenChannelRequest { temporary_channel_id, .. } => {
15496
- nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23).unwrap();
15535
+ nodes[1].node.accept_inbound_channel_from_trusted_peer_0conf(&temporary_channel_id, &last_random_pk, 23, InboundChannelConfigOverrides::default() ).unwrap();
15497
15536
}
15498
15537
_ => panic!("Unexpected event"),
15499
15538
}
@@ -15573,6 +15612,30 @@ mod tests {
15573
15612
15574
15613
#[test]
15575
15614
fn test_inbound_anchors_manual_acceptance() {
15615
+ test_inbound_anchors_manual_acceptance_with_override(InboundChannelConfigOverrides::default());
15616
+ }
15617
+
15618
+ #[test]
15619
+ fn test_inbound_anchors_manual_acceptance_overridden() {
15620
+ let overrides = InboundChannelConfigOverrides {
15621
+ max_inbound_htlc_value_in_flight_percent_of_channel: Some(5),
15622
+ htlc_minimum_msat: Some(1000),
15623
+ minimum_depth: Some(2),
15624
+ to_self_delay: Some(200),
15625
+ max_accepted_htlcs: Some(5),
15626
+ channel_reserve_proportional_millionths: Some(20000),
15627
+ };
15628
+
15629
+ let accept_message = test_inbound_anchors_manual_acceptance_with_override(overrides);
15630
+ assert_eq!(accept_message.common_fields.max_htlc_value_in_flight_msat, 5_000_000);
15631
+ assert_eq!(accept_message.common_fields.htlc_minimum_msat, 1_000);
15632
+ assert_eq!(accept_message.common_fields.minimum_depth, 2);
15633
+ assert_eq!(accept_message.common_fields.to_self_delay, 200);
15634
+ assert_eq!(accept_message.common_fields.max_accepted_htlcs, 5);
15635
+ assert_eq!(accept_message.channel_reserve_satoshis, 2_000);
15636
+ }
15637
+
15638
+ fn test_inbound_anchors_manual_acceptance_with_override(config_overrides: InboundChannelConfigOverrides) -> AcceptChannel {
15576
15639
// Tests that we properly limit inbound channels when we have the manual-channel-acceptance
15577
15640
// flag set and (sometimes) accept channels as 0conf.
15578
15641
let mut anchors_cfg = test_default_channel_config();
@@ -15609,10 +15672,10 @@ mod tests {
15609
15672
let events = nodes[2].node.get_and_clear_pending_events();
15610
15673
match events[0] {
15611
15674
Event::OpenChannelRequest { temporary_channel_id, .. } =>
15612
- nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23).unwrap(),
15675
+ nodes[2].node.accept_inbound_channel(&temporary_channel_id, &nodes[0].node.get_our_node_id(), 23, config_overrides ).unwrap(),
15613
15676
_ => panic!("Unexpected event"),
15614
15677
}
15615
- get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
15678
+ get_event_msg!(nodes[2], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id())
15616
15679
}
15617
15680
15618
15681
#[test]
0 commit comments