From: Valentine Wallace Date: Tue, 16 May 2023 18:18:47 +0000 (-0400) Subject: Add config knob for accepting underpaying HTLCs X-Git-Tag: v0.0.116-alpha1~6^2~9 X-Git-Url: http://git.bitcoin.ninja/?a=commitdiff_plain;h=85a5b31bb82c14e43a1691ceb4201dab18050ab9;p=rust-lightning Add config knob for accepting underpaying HTLCs See ChannelConfig::accept_underpaying_htlcs --- diff --git a/lightning/src/util/config.rs b/lightning/src/util/config.rs index 8f1f77b32..b948a1383 100644 --- a/lightning/src/util/config.rs +++ b/lightning/src/util/config.rs @@ -397,6 +397,34 @@ pub struct ChannelConfig { /// [`Normal`]: crate::chain::chaininterface::ConfirmationTarget::Normal /// [`Background`]: crate::chain::chaininterface::ConfirmationTarget::Background pub force_close_avoidance_max_fee_satoshis: u64, + /// If set, allows this channel's counterparty to skim an additional fee off this node's inbound + /// HTLCs. Useful for liquidity providers to offload on-chain channel costs to end users. + /// + /// Usage: + /// - The payee will set this option and set its invoice route hints to use [intercept scids] + /// generated by this channel's counterparty. + /// - The counterparty will get an [`HTLCIntercepted`] event upon payment forward, and call + /// [`forward_intercepted_htlc`] with less than the amount provided in + /// [`HTLCIntercepted::expected_outbound_amount_msat`]. The difference between the expected and + /// actual forward amounts is their fee. + // TODO: link to LSP JIT channel invoice generation spec when it's merged + /// + /// # Note + /// It's important for payee wallet software to verify that [`PaymentClaimable::amount_msat`] is + /// as-expected if this feature is activated, otherwise they may lose money! + /// + /// # Note + /// Switching this config flag on may break compatibility with versions of LDK prior to 0.0.116. + /// + /// Default value: false. + /// + /// [intercept scids]: crate::ln::channelmanager::ChannelManager::get_intercept_scid + /// [`forward_intercepted_htlc`]: crate::ln::channelmanager::ChannelManager::forward_intercepted_htlc + /// [`HTLCIntercepted`]: crate::events::Event::HTLCIntercepted + /// [`HTLCIntercepted::expected_outbound_amount_msat`]: crate::events::Event::HTLCIntercepted::expected_outbound_amount_msat + /// [`PaymentClaimable::amount_msat`]: crate::events::Event::PaymentClaimable::amount_msat + // TODO: link to bLIP when it's merged + pub accept_underpaying_htlcs: bool, } impl ChannelConfig { @@ -429,12 +457,14 @@ impl Default for ChannelConfig { cltv_expiry_delta: 6 * 12, // 6 blocks/hour * 12 hours max_dust_htlc_exposure_msat: 5_000_000, force_close_avoidance_max_fee_satoshis: 1000, + accept_underpaying_htlcs: false, } } } impl_writeable_tlv_based!(ChannelConfig, { (0, forwarding_fee_proportional_millionths, required), + (1, accept_underpaying_htlcs, (default_value, false)), (2, forwarding_fee_base_msat, required), (4, cltv_expiry_delta, required), (6, max_dust_htlc_exposure_msat, required), @@ -543,6 +573,7 @@ impl crate::util::ser::Readable for LegacyChannelConfig { cltv_expiry_delta, force_close_avoidance_max_fee_satoshis, forwarding_fee_base_msat, + accept_underpaying_htlcs: false, }, announced_channel, commit_upfront_shutdown_pubkey,