Add config knob for accepting underpaying HTLCs
authorValentine Wallace <vwallace@protonmail.com>
Tue, 16 May 2023 18:18:47 +0000 (14:18 -0400)
committerValentine Wallace <vwallace@protonmail.com>
Tue, 20 Jun 2023 21:57:38 +0000 (17:57 -0400)
See ChannelConfig::accept_underpaying_htlcs

lightning/src/util/config.rs

index 8f1f77b32aadd2f29b76be8fb6efc6290f2cb55a..b948a13835708db4ee3cb6328b5951f733f1b1a1 100644 (file)
@@ -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,