Merge pull request #1425 from valentinewallace/2021-04-wumbo
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Thu, 28 Apr 2022 21:14:19 +0000 (21:14 +0000)
committerGitHub <noreply@github.com>
Thu, 28 Apr 2022 21:14:19 +0000 (21:14 +0000)
Wumbo!

1  2 
lightning/src/ln/channel.rs
lightning/src/ln/channelmanager.rs
lightning/src/ln/functional_tests.rs

index 3a12a2c066d0bb5e7580d5ef160a78dc5c890433,b172b8c52ad8a0fc78e44e3869e6820d68e2a83e..cf70749ad96b7bbc98fdca8917db77c0d03d601e
@@@ -62,17 -62,6 +62,17 @@@ pub struct ChannelValueStat 
        pub counterparty_dust_limit_msat: u64,
  }
  
 +pub struct AvailableBalances {
 +      /// The amount that would go to us if we close the channel, ignoring any on-chain fees.
 +      pub balance_msat: u64,
 +      /// Total amount available for our counterparty to send to us.
 +      pub inbound_capacity_msat: u64,
 +      /// Total amount available for us to send to our counterparty.
 +      pub outbound_capacity_msat: u64,
 +      /// The maximum value we can assign to the next outbound HTLC
 +      pub next_outbound_htlc_limit_msat: u64,
 +}
 +
  #[derive(Debug, Clone, Copy, PartialEq)]
  enum FeeUpdateState {
        // Inbound states mirroring InboundHTLCState
@@@ -745,9 -734,13 +745,13 @@@ pub const COMMITMENT_TX_WEIGHT_PER_HTLC
  
  pub const ANCHOR_OUTPUT_VALUE_SATOSHI: u64 = 330;
  
- /// Maximum `funding_satoshis` value, according to the BOLT #2 specification
- /// it's 2^24.
- pub const MAX_FUNDING_SATOSHIS: u64 = 1 << 24;
+ /// Maximum `funding_satoshis` value according to the BOLT #2 specification, if
+ /// `option_support_large_channel` (aka wumbo channels) is not supported.
+ /// It's 2^24 - 1.
+ pub const MAX_FUNDING_SATOSHIS_NO_WUMBO: u64 = (1 << 24) - 1;
+ /// Total bitcoin supply in satoshis.
+ pub const TOTAL_BITCOIN_SUPPLY_SATOSHIS: u64 = 21_000_000 * 1_0000_0000;
  
  /// The maximum network dust limit for standard script formats. This currently represents the
  /// minimum output value for a P2SH output before Bitcoin Core 22 considers the entire
@@@ -861,8 -854,11 +865,11 @@@ impl<Signer: Sign> Channel<Signer> 
                let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
                let pubkeys = holder_signer.pubkeys().clone();
  
-               if channel_value_satoshis >= MAX_FUNDING_SATOSHIS {
-                       return Err(APIError::APIMisuseError{err: format!("funding_value must be smaller than {}, it was {}", MAX_FUNDING_SATOSHIS, channel_value_satoshis)});
+               if !their_features.supports_wumbo() && channel_value_satoshis > MAX_FUNDING_SATOSHIS_NO_WUMBO {
+                       return Err(APIError::APIMisuseError{err: format!("funding_value must not exceed {}, it was {}", MAX_FUNDING_SATOSHIS_NO_WUMBO, channel_value_satoshis)});
+               }
+               if channel_value_satoshis >= TOTAL_BITCOIN_SUPPLY_SATOSHIS {
+                       return Err(APIError::APIMisuseError{err: format!("funding_value must be smaller than the total bitcoin supply, it was {}", channel_value_satoshis)});
                }
                let channel_value_msat = channel_value_satoshis * 1000;
                if push_msat > channel_value_msat {
                }
  
                // Check sanity of message fields:
-               if msg.funding_satoshis >= MAX_FUNDING_SATOSHIS {
-                       return Err(ChannelError::Close(format!("Funding must be smaller than {}. It was {}", MAX_FUNDING_SATOSHIS, msg.funding_satoshis)));
+               if msg.funding_satoshis > config.peer_channel_config_limits.max_funding_satoshis {
+                       return Err(ChannelError::Close(format!("Per our config, funding must be at most {}. It was {}", config.peer_channel_config_limits.max_funding_satoshis, msg.funding_satoshis)));
+               }
+               if msg.funding_satoshis >= TOTAL_BITCOIN_SUPPLY_SATOSHIS {
+                       return Err(ChannelError::Close(format!("Funding must be smaller than the total bitcoin supply. It was {}", msg.funding_satoshis)));
                }
                if msg.channel_reserve_satoshis > msg.funding_satoshis {
                        return Err(ChannelError::Close(format!("Bogus channel_reserve_satoshis ({}). Must be not greater than funding_satoshis: {}", msg.channel_reserve_satoshis, msg.funding_satoshis)));
                stats
        }
  
 -      /// Get the available (ie not including pending HTLCs) inbound and outbound balance in msat.
 +      /// Get the available balances, see [`AvailableBalances`]'s fields for more info.
        /// Doesn't bother handling the
        /// if-we-removed-it-already-but-haven't-fully-resolved-they-can-still-send-an-inbound-HTLC
        /// corner case properly.
 -      /// The channel reserve is subtracted from each balance.
 -      /// See also [`Channel::get_balance_msat`]
 -      pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
 +      pub fn get_available_balances(&self) -> AvailableBalances {
                // Note that we have to handle overflow due to the above case.
 -              (
 -                      cmp::max(self.channel_value_satoshis as i64 * 1000
 -                              - self.value_to_self_msat as i64
 -                              - self.get_inbound_pending_htlc_stats(None).pending_htlcs_value_msat as i64
 -                              - self.holder_selected_channel_reserve_satoshis as i64 * 1000,
 -                      0) as u64,
 -                      cmp::max(self.value_to_self_msat as i64
 -                              - self.get_outbound_pending_htlc_stats(None).pending_htlcs_value_msat as i64
 -                              - self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,
 -                      0) as u64
 -              )
 -      }
 +              let outbound_stats = self.get_outbound_pending_htlc_stats(None);
  
 -      /// Get our total balance in msat.
 -      /// This is the amount that would go to us if we close the channel, ignoring any on-chain fees.
 -      /// See also [`Channel::get_inbound_outbound_available_balance_msat`]
 -      pub fn get_balance_msat(&self) -> u64 {
 -              // Include our local balance, plus any inbound HTLCs we know the preimage for, minus any
 -              // HTLCs sent or which will be sent after commitment signed's are exchanged.
                let mut balance_msat = self.value_to_self_msat;
                for ref htlc in self.pending_inbound_htlcs.iter() {
                        if let InboundHTLCState::LocalRemoved(InboundHTLCRemovalReason::Fulfill(_)) = htlc.state {
                                balance_msat += htlc.amount_msat;
                        }
                }
 -              balance_msat - self.get_outbound_pending_htlc_stats(None).pending_htlcs_value_msat
 +              balance_msat -= outbound_stats.pending_htlcs_value_msat;
 +
 +              let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
 +                              - outbound_stats.pending_htlcs_value_msat as i64
 +                              - self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,
 +                      0) as u64;
 +              AvailableBalances {
 +                      inbound_capacity_msat: cmp::max(self.channel_value_satoshis as i64 * 1000
 +                                      - self.value_to_self_msat as i64
 +                                      - self.get_inbound_pending_htlc_stats(None).pending_htlcs_value_msat as i64
 +                                      - self.holder_selected_channel_reserve_satoshis as i64 * 1000,
 +                              0) as u64,
 +                      outbound_capacity_msat,
 +                      next_outbound_htlc_limit_msat: cmp::max(cmp::min(outbound_capacity_msat as i64,
 +                                      self.counterparty_max_htlc_value_in_flight_msat as i64
 +                                              - outbound_stats.pending_htlcs_value_msat as i64),
 +                              0) as u64,
 +                      balance_msat,
 +              }
        }
  
        pub fn get_holder_counterparty_selected_channel_reserve_satoshis(&self) -> (u64, Option<u64>) {
                if !self.pending_inbound_htlcs.is_empty() || !self.pending_outbound_htlcs.is_empty() {
                        return Err(ChannelError::Close("Remote end sent us a closing_signed while there were still pending HTLCs".to_owned()));
                }
-               if msg.fee_satoshis > 21_000_000 * 1_0000_0000 { //this is required to stop potential overflow in build_closing_transaction
+               if msg.fee_satoshis > TOTAL_BITCOIN_SUPPLY_SATOSHIS { // this is required to stop potential overflow in build_closing_transaction
                        return Err(ChannelError::Close("Remote tried to send us a closing tx with > 21 million BTC fee".to_owned()));
                }
  
        }
  
        /// Allowed in any state (including after shutdown)
 -      #[cfg(test)]
        pub fn get_holder_htlc_minimum_msat(&self) -> u64 {
                self.holder_htlc_minimum_msat
        }
  
 +      /// Allowed in any state (including after shutdown), but will return none before TheirInitSent
 +      pub fn get_holder_htlc_maximum_msat(&self) -> Option<u64> {
 +              self.get_htlc_maximum_msat(self.holder_max_htlc_value_in_flight_msat)
 +      }
 +
        /// Allowed in any state (including after shutdown)
        pub fn get_announced_htlc_max_msat(&self) -> u64 {
                return cmp::min(
                self.counterparty_htlc_minimum_msat
        }
  
 +      /// Allowed in any state (including after shutdown), but will return none before TheirInitSent
 +      pub fn get_counterparty_htlc_maximum_msat(&self) -> Option<u64> {
 +              self.get_htlc_maximum_msat(self.counterparty_max_htlc_value_in_flight_msat)
 +      }
 +
 +      fn get_htlc_maximum_msat(&self, party_max_htlc_value_in_flight_msat: u64) -> Option<u64> {
 +              self.counterparty_selected_channel_reserve_satoshis.map(|counterparty_reserve| {
 +                      let holder_reserve = self.holder_selected_channel_reserve_satoshis;
 +                      cmp::min(
 +                              (self.channel_value_satoshis - counterparty_reserve - holder_reserve) * 1000,
 +                              party_max_htlc_value_in_flight_msat
 +                      )
 +              })
 +      }
 +
        pub fn get_value_satoshis(&self) -> u64 {
                self.channel_value_satoshis
        }
@@@ -6327,7 -6308,7 +6337,7 @@@ mod tests 
        use ln::PaymentHash;
        use ln::channelmanager::{HTLCSource, PaymentId};
        use ln::channel::{Channel, InboundHTLCOutput, OutboundHTLCOutput, InboundHTLCState, OutboundHTLCState, HTLCCandidate, HTLCInitiator};
-       use ln::channel::MAX_FUNDING_SATOSHIS;
+       use ln::channel::{MAX_FUNDING_SATOSHIS_NO_WUMBO, TOTAL_BITCOIN_SUPPLY_SATOSHIS};
        use ln::features::InitFeatures;
        use ln::msgs::{ChannelUpdate, DataLossProtect, DecodeError, OptionalField, UnsignedChannelUpdate};
        use ln::script::ShutdownScript;
        }
  
        #[test]
-       fn test_max_funding_satoshis() {
-               assert!(MAX_FUNDING_SATOSHIS <= 21_000_000 * 100_000_000,
-                       "MAX_FUNDING_SATOSHIS is greater than all satoshis in existence");
+       fn test_max_funding_satoshis_no_wumbo() {
+               assert_eq!(TOTAL_BITCOIN_SUPPLY_SATOSHIS, 21_000_000 * 100_000_000);
+               assert!(MAX_FUNDING_SATOSHIS_NO_WUMBO <= TOTAL_BITCOIN_SUPPLY_SATOSHIS,
+                       "MAX_FUNDING_SATOSHIS_NO_WUMBO is greater than all satoshis in existence");
        }
  
        #[test]
index d7f2aeb6e4132374cc7a16d1c04361f65a3db358,4bc268748a3dc926093bcbab890b50c84a88593e..5990b2adf0863f690fcd6b099390a77de053d197
@@@ -18,7 -18,7 +18,7 @@@
  //! imply it needs to fail HTLCs/payments/channels it manages).
  //!
  
 -use bitcoin::blockdata::block::{Block, BlockHeader};
 +use bitcoin::blockdata::block::BlockHeader;
  use bitcoin::blockdata::transaction::Transaction;
  use bitcoin::blockdata::constants::genesis_block;
  use bitcoin::network::constants::Network;
@@@ -922,12 -922,6 +922,12 @@@ pub struct ChannelCounterparty 
        /// Information on the fees and requirements that the counterparty requires when forwarding
        /// payments to us through this channel.
        pub forwarding_info: Option<CounterpartyForwardingInfo>,
 +      /// The smallest value HTLC (in msat) the remote peer will accept, for this channel. This field
 +      /// is only `None` before we have received either the `OpenChannel` or `AcceptChannel` message
 +      /// from the remote peer, or for `ChannelCounterparty` objects serialized prior to LDK 0.0.107.
 +      pub outbound_htlc_minimum_msat: Option<u64>,
 +      /// The largest value HTLC (in msat) the remote peer currently will accept, for this channel.
 +      pub outbound_htlc_maximum_msat: Option<u64>,
  }
  
  /// Details of a channel, as returned by ChannelManager::list_channels and ChannelManager::list_usable_channels
@@@ -1005,13 -999,6 +1005,13 @@@ pub struct ChannelDetails 
        /// conflict-avoidance policy, exactly this amount is not likely to be spendable. However, we
        /// should be able to spend nearly this amount.
        pub outbound_capacity_msat: u64,
 +      /// The available outbound capacity for sending a single HTLC to the remote peer. This is
 +      /// similar to [`ChannelDetails::outbound_capacity_msat`] but it may be further restricted by
 +      /// the current state and per-HTLC limit(s). This is intended for use when routing, allowing us
 +      /// to use a limit as close as possible to the HTLC limit we can currently send.
 +      ///
 +      /// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
 +      pub next_outbound_htlc_limit_msat: u64,
        /// The available inbound capacity for the remote peer to send HTLCs to us. This does not
        /// include any pending HTLCs which are not yet fully resolved (and, thus, whose balance is not
        /// available for inclusion in new inbound HTLCs).
        pub is_usable: bool,
        /// True if this channel is (or will be) publicly-announced.
        pub is_public: bool,
 +      /// The smallest value HTLC (in msat) we will accept, for this channel. This field
 +      /// is only `None` for `ChannelDetails` objects serialized prior to LDK 0.0.107
 +      pub inbound_htlc_minimum_msat: Option<u64>,
 +      /// The largest value HTLC (in msat) we currently will accept, for this channel.
 +      pub inbound_htlc_maximum_msat: Option<u64>,
  }
  
  impl ChannelDetails {
@@@ -1516,8 -1498,6 +1516,6 @@@ impl<Signer: Sign, M: Deref, T: Deref, 
        ///
        /// Non-proportional fees are fixed according to our risk using the provided fee estimator.
        ///
-       /// panics if channel_value_satoshis is >= `MAX_FUNDING_SATOSHIS`!
-       ///
        /// Users need to notify the new ChannelManager when a new block is connected or
        /// disconnected using its `block_connected` and `block_disconnected` methods, starting
        /// from after `params.latest_hash`.
                        let channel_state = self.channel_state.lock().unwrap();
                        res.reserve(channel_state.by_id.len());
                        for (channel_id, channel) in channel_state.by_id.iter().filter(f) {
 -                              let (inbound_capacity_msat, outbound_capacity_msat) = channel.get_inbound_outbound_available_balance_msat();
 -                              let balance_msat = channel.get_balance_msat();
 +                              let balance = channel.get_available_balances();
                                let (to_remote_reserve_satoshis, to_self_reserve_satoshis) =
                                        channel.get_holder_counterparty_selected_channel_reserve_satoshis();
                                res.push(ChannelDetails {
                                                features: InitFeatures::empty(),
                                                unspendable_punishment_reserve: to_remote_reserve_satoshis,
                                                forwarding_info: channel.counterparty_forwarding_info(),
 +                                              // Ensures that we have actually received the `htlc_minimum_msat` value
 +                                              // from the counterparty through the `OpenChannel` or `AcceptChannel`
 +                                              // message (as they are always the first message from the counterparty).
 +                                              // Else `Channel::get_counterparty_htlc_minimum_msat` could return the
 +                                              // default `0` value set by `Channel::new_outbound`.
 +                                              outbound_htlc_minimum_msat: if channel.have_received_message() {
 +                                                      Some(channel.get_counterparty_htlc_minimum_msat()) } else { None },
 +                                              outbound_htlc_maximum_msat: channel.get_counterparty_htlc_maximum_msat(),
                                        },
                                        funding_txo: channel.get_funding_txo(),
                                        // Note that accept_channel (or open_channel) is always the first message, so
                                        inbound_scid_alias: channel.latest_inbound_scid_alias(),
                                        channel_value_satoshis: channel.get_value_satoshis(),
                                        unspendable_punishment_reserve: to_self_reserve_satoshis,
 -                                      balance_msat,
 -                                      inbound_capacity_msat,
 -                                      outbound_capacity_msat,
 +                                      balance_msat: balance.balance_msat,
 +                                      inbound_capacity_msat: balance.inbound_capacity_msat,
 +                                      outbound_capacity_msat: balance.outbound_capacity_msat,
 +                                      next_outbound_htlc_limit_msat: balance.next_outbound_htlc_limit_msat,
                                        user_channel_id: channel.get_user_id(),
                                        confirmations_required: channel.minimum_depth(),
                                        force_close_spend_delay: channel.get_counterparty_selected_contest_delay(),
                                        is_funding_locked: channel.is_usable(),
                                        is_usable: channel.is_live(),
                                        is_public: channel.should_announce(),
 +                                      inbound_htlc_minimum_msat: Some(channel.get_holder_htlc_minimum_msat()),
 +                                      inbound_htlc_maximum_msat: channel.get_holder_htlc_maximum_msat()
                                });
                        }
                }
                                                } else { None };
  
                                                let mut pending_events = self.pending_events.lock().unwrap();
 +
 +                                              let source_channel_id = Some(prev_outpoint.to_channel_id());
                                                pending_events.push(events::Event::PaymentForwarded {
 +                                                      source_channel_id,
                                                        fee_earned_msat,
                                                        claim_from_onchain_tx: from_onchain,
                                                });
@@@ -5310,17 -5277,18 +5308,17 @@@ wher
        F::Target: FeeEstimator,
        L::Target: Logger,
  {
 -      fn block_connected(&self, block: &Block, height: u32) {
 +      fn filtered_block_connected(&self, header: &BlockHeader, txdata: &TransactionData, height: u32) {
                {
                        let best_block = self.best_block.read().unwrap();
 -                      assert_eq!(best_block.block_hash(), block.header.prev_blockhash,
 +                      assert_eq!(best_block.block_hash(), header.prev_blockhash,
                                "Blocks must be connected in chain-order - the connected header must build on the last connected header");
                        assert_eq!(best_block.height(), height - 1,
                                "Blocks must be connected in chain-order - the connected block height must be one greater than the previous height");
                }
  
 -              let txdata: Vec<_> = block.txdata.iter().enumerate().collect();
 -              self.transactions_confirmed(&block.header, &txdata, height);
 -              self.best_block_updated(&block.header, height);
 +              self.transactions_confirmed(header, txdata, height);
 +              self.best_block_updated(header, height);
        }
  
        fn block_disconnected(&self, header: &BlockHeader, height: u32) {
@@@ -5927,8 -5895,6 +5925,8 @@@ impl_writeable_tlv_based!(ChannelCounte
        (4, features, required),
        (6, unspendable_punishment_reserve, required),
        (8, forwarding_info, option),
 +      (9, outbound_htlc_minimum_msat, option),
 +      (11, outbound_htlc_maximum_msat, option),
  });
  
  impl_writeable_tlv_based!(ChannelDetails, {
        (14, user_channel_id, required),
        (16, balance_msat, required),
        (18, outbound_capacity_msat, required),
 +      // Note that by the time we get past the required read above, outbound_capacity_msat will be
 +      // filled in, so we can safely unwrap it here.
 +      (19, next_outbound_htlc_limit_msat, (default_value, outbound_capacity_msat.0.unwrap())),
        (20, inbound_capacity_msat, required),
        (22, confirmations_required, option),
        (24, force_close_spend_delay, option),
        (28, is_funding_locked, required),
        (30, is_usable, required),
        (32, is_public, required),
 +      (33, inbound_htlc_minimum_msat, option),
 +      (35, inbound_htlc_maximum_msat, option),
  });
  
  impl_writeable_tlv_based!(PhantomRouteHints, {
index d7bebca0e4dff41088c4583632a302f700124314,3449bd941d9385d0ad8bb28a8c32239c1e489e1c..d9756035f7813794eaf515c0537249b343cd3209
@@@ -58,9 -58,12 +58,12 @@@ use ln::chan_utils::CommitmentTransacti
  #[test]
  fn test_insane_channel_opens() {
        // Stand up a network of 2 nodes
+       use ln::channel::TOTAL_BITCOIN_SUPPLY_SATOSHIS;
+       let mut cfg = UserConfig::default();
+       cfg.peer_channel_config_limits.max_funding_satoshis = TOTAL_BITCOIN_SUPPLY_SATOSHIS + 1;
        let chanmon_cfgs = create_chanmon_cfgs(2);
        let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
-       let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
+       let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, Some(cfg)]);
        let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Instantiate channel parameters where we push the maximum msats given our
                } else { assert!(false); }
        };
  
-       use ln::channel::MAX_FUNDING_SATOSHIS;
        use ln::channelmanager::MAX_LOCAL_BREAKDOWN_TIMEOUT;
  
        // Test all mutations that would make the channel open message insane
-       insane_open_helper(format!("Funding must be smaller than {}. It was {}", MAX_FUNDING_SATOSHIS, MAX_FUNDING_SATOSHIS).as_str(), |mut msg| { msg.funding_satoshis = MAX_FUNDING_SATOSHIS; msg });
+       insane_open_helper(format!("Per our config, funding must be at most {}. It was {}", TOTAL_BITCOIN_SUPPLY_SATOSHIS + 1, TOTAL_BITCOIN_SUPPLY_SATOSHIS + 2).as_str(), |mut msg| { msg.funding_satoshis = TOTAL_BITCOIN_SUPPLY_SATOSHIS + 2; msg });
+       insane_open_helper(format!("Funding must be smaller than the total bitcoin supply. It was {}", TOTAL_BITCOIN_SUPPLY_SATOSHIS).as_str(), |mut msg| { msg.funding_satoshis = TOTAL_BITCOIN_SUPPLY_SATOSHIS; msg });
  
        insane_open_helper("Bogus channel_reserve_satoshis", |mut msg| { msg.channel_reserve_satoshis = msg.funding_satoshis + 1; msg });
  
        insane_open_helper("max_accepted_htlcs was 484. It must not be larger than 483", |mut msg| { msg.max_accepted_htlcs = 484; msg });
  }
  
+ #[test]
+ fn test_funding_exceeds_no_wumbo_limit() {
+       // Test that if a peer does not support wumbo channels, we'll refuse to open a wumbo channel to
+       // them.
+       use ln::channel::MAX_FUNDING_SATOSHIS_NO_WUMBO;
+       let chanmon_cfgs = create_chanmon_cfgs(2);
+       let mut node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
+       node_cfgs[1].features = InitFeatures::known().clear_wumbo();
+       let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
+       let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
+       match nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), MAX_FUNDING_SATOSHIS_NO_WUMBO + 1, 0, 42, None) {
+               Err(APIError::APIMisuseError { err }) => {
+                       assert_eq!(format!("funding_value must not exceed {}, it was {}", MAX_FUNDING_SATOSHIS_NO_WUMBO, MAX_FUNDING_SATOSHIS_NO_WUMBO + 1), err);
+               },
+               _ => panic!()
+       }
+ }
  fn do_test_counterparty_no_reserve(send_from_initiator: bool) {
        // A peer providing a channel_reserve_satoshis of 0 (or less than our dust limit) is insecure,
        // but only for them. Because some LSPs do it with some level of trust of the clients (for a
@@@ -2684,23 -2706,10 +2706,23 @@@ fn test_htlc_on_chain_success() 
                Event::ChannelClosed { reason: ClosureReason::CommitmentTxConfirmed, .. } => {}
                _ => panic!("Unexpected event"),
        }
 -      if let Event::PaymentForwarded { fee_earned_msat: Some(1000), claim_from_onchain_tx: true } = forwarded_events[1] {
 -              } else { panic!(); }
 -      if let Event::PaymentForwarded { fee_earned_msat: Some(1000), claim_from_onchain_tx: true } = forwarded_events[2] {
 -              } else { panic!(); }
 +      let chan_id = Some(chan_1.2);
 +      match forwarded_events[1] {
 +              Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
 +                      assert_eq!(fee_earned_msat, Some(1000));
 +                      assert_eq!(source_channel_id, chan_id);
 +                      assert_eq!(claim_from_onchain_tx, true);
 +              },
 +              _ => panic!()
 +      }
 +      match forwarded_events[2] {
 +              Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
 +                      assert_eq!(fee_earned_msat, Some(1000));
 +                      assert_eq!(source_channel_id, chan_id);
 +                      assert_eq!(claim_from_onchain_tx, true);
 +              },
 +              _ => panic!()
 +      }
        let events = nodes[1].node.get_and_clear_pending_msg_events();
        {
                let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
@@@ -5117,9 -5126,8 +5139,9 @@@ fn test_onchain_to_onchain_claim() 
                _ => panic!("Unexpected event"),
        }
        match events[1] {
 -              Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
 +              Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
                        assert_eq!(fee_earned_msat, Some(1000));
 +                      assert_eq!(source_channel_id, Some(chan_1.2));
                        assert_eq!(claim_from_onchain_tx, true);
                },
                _ => panic!("Unexpected event"),
@@@ -5202,9 -5210,7 +5224,9 @@@ fn test_duplicate_payment_hash_one_fail
        // We reduce the final CLTV here by a somewhat arbitrary constant to keep it under the one-byte
        // script push size limit so that the below script length checks match
        // ACCEPTED_HTLC_SCRIPT_WEIGHT.
 -      let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[3], vec![], 900000, TEST_FINAL_CLTV - 40);
 +      let payment_params = PaymentParameters::from_node_id(nodes[3].node.get_our_node_id())
 +              .with_features(InvoiceFeatures::known());
 +      let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[3], payment_params, 900000, TEST_FINAL_CLTV - 40);
        send_along_route_with_secret(&nodes[0], route, &[&[&nodes[1], &nodes[2], &nodes[3]]], 900000, duplicate_payment_hash, payment_secret);
  
        let commitment_txn = get_local_commitment_txn!(nodes[2], chan_2.2);
        // Note that the fee paid is effectively double as the HTLC value (including the nodes[1] fee
        // and nodes[2] fee) is rounded down and then claimed in full.
        mine_transaction(&nodes[1], &htlc_success_txn[0]);
 -      expect_payment_forwarded!(nodes[1], Some(196*2), true);
 +      expect_payment_forwarded!(nodes[1], nodes[0], Some(196*2), true);
        let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
        assert!(updates.update_add_htlcs.is_empty());
        assert!(updates.update_fail_htlcs.is_empty());
@@@ -6453,9 -6459,7 +6475,9 @@@ fn test_update_add_htlc_bolt2_sender_cl
        let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 0, InitFeatures::known(), InitFeatures::known());
  
 -      let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], vec![], 100000000, 0);
 +      let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id())
 +              .with_features(InvoiceFeatures::known());
 +      let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], payment_params, 100000000, 0);
        route.paths[0].last_mut().unwrap().cltv_expiry_delta = 500000001;
        unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)), true, APIError::RouteError { ref err },
                assert_eq!(err, &"Channel CLTV overflowed?"));
@@@ -7555,9 -7559,7 +7577,9 @@@ fn test_bump_penalty_txn_on_revoked_com
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
  
        let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
 -      let (route,_, _, _) = get_route_and_payment_hash!(nodes[1], nodes[0], vec![], 3000000, 30);
 +      let payment_params = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id())
 +              .with_features(InvoiceFeatures::known());
 +      let (route,_, _, _) = get_route_and_payment_hash!(nodes[1], nodes[0], payment_params, 3000000, 30);
        send_along_route(&nodes[1], route, &vec!(&nodes[0])[..], 3000000);
  
        let revoked_txn = get_local_commitment_txn!(nodes[0], chan.2);
@@@ -8869,7 -8871,7 +8891,7 @@@ fn do_test_onchain_htlc_settlement_afte
        assert_eq!(carol_updates.update_fulfill_htlcs.len(), 1);
  
        nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &carol_updates.update_fulfill_htlcs[0]);
 -      expect_payment_forwarded!(nodes[1], if go_onchain_before_fulfill || force_closing_node == 1 { None } else { Some(1000) }, false);
 +      expect_payment_forwarded!(nodes[1], nodes[0], if go_onchain_before_fulfill || force_closing_node == 1 { None } else { Some(1000) }, false);
        // If Alice broadcasted but Bob doesn't know yet, here he prepares to tell her about the preimage.
        if !go_onchain_before_fulfill && broadcast_alice {
                let events = nodes[1].node.get_and_clear_pending_msg_events();