Add PaymentId in ChannelManager.list_recent_payments()
[rust-lightning] / lightning / src / chain / package.rs
index 0b7dbd462f47044561f5468693cfa9a27b68e8a1..b66a2f70d3369f4aff6e012025b3e995d6918a9e 100644 (file)
@@ -26,16 +26,13 @@ use crate::ln::chan_utils;
 use crate::ln::msgs::DecodeError;
 use crate::chain::chaininterface::{FeeEstimator, ConfirmationTarget, MIN_RELAY_FEE_SAT_PER_1000_WEIGHT};
 use crate::sign::WriteableEcdsaChannelSigner;
-#[cfg(anchors)]
-use crate::chain::onchaintx::ExternalHTLCClaim;
-use crate::chain::onchaintx::OnchainTxHandler;
+use crate::chain::onchaintx::{ExternalHTLCClaim, OnchainTxHandler};
 use crate::util::logger::Logger;
 use crate::util::ser::{Readable, Writer, Writeable, RequiredWrapper};
 
 use crate::io;
 use crate::prelude::*;
 use core::cmp;
-#[cfg(anchors)]
 use core::convert::TryInto;
 use core::mem;
 use core::ops::Deref;
@@ -75,6 +72,30 @@ pub(crate) fn weight_received_htlc(channel_type_features: &ChannelTypeFeatures)
        if channel_type_features.supports_anchors_zero_fee_htlc_tx() { WEIGHT_RECEIVED_HTLC_ANCHORS } else { WEIGHT_RECEIVED_HTLC }
 }
 
+/// Verifies deserializable channel type features
+pub(crate) fn verify_channel_type_features(channel_type_features: &Option<ChannelTypeFeatures>, additional_permitted_features: Option<&ChannelTypeFeatures>) -> Result<(), DecodeError> {
+       if let Some(features) = channel_type_features.as_ref() {
+               if features.requires_unknown_bits() {
+                       return Err(DecodeError::UnknownRequiredFeature);
+               }
+
+               let mut supported_feature_set = ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies();
+               supported_feature_set.set_scid_privacy_required();
+               supported_feature_set.set_zero_conf_required();
+
+               // allow the passing of an additional necessary permitted flag
+               if let Some(additional_permitted_features) = additional_permitted_features {
+                       supported_feature_set |= additional_permitted_features;
+               }
+
+               if !features.is_subset(&supported_feature_set) {
+                       return Err(DecodeError::UnknownRequiredFeature);
+               }
+       }
+
+       Ok(())
+}
+
 // number_of_witness_elements + sig_length + revocation_sig + true_length + op_true + witness_script_length + witness_script
 pub(crate) const WEIGHT_REVOKED_OUTPUT: u64 = 1 + 1 + 73 + 1 + 1 + 1 + 77;
 
@@ -226,7 +247,7 @@ impl Readable for CounterpartyOfferedHTLCOutput {
                let mut counterparty_htlc_base_key = RequiredWrapper(None);
                let mut preimage = RequiredWrapper(None);
                let mut htlc = RequiredWrapper(None);
-               let mut legacy_deserialization_prevention_marker: Option<()> = None;
+               let mut _legacy_deserialization_prevention_marker: Option<()> = None;
                let mut channel_type_features = None;
 
                read_tlv_fields!(reader, {
@@ -235,10 +256,12 @@ impl Readable for CounterpartyOfferedHTLCOutput {
                        (4, counterparty_htlc_base_key, required),
                        (6, preimage, required),
                        (8, htlc, required),
-                       (10, legacy_deserialization_prevention_marker, option),
+                       (10, _legacy_deserialization_prevention_marker, option),
                        (11, channel_type_features, option),
                });
 
+               verify_channel_type_features(&channel_type_features, None)?;
+
                Ok(Self {
                        per_commitment_point: per_commitment_point.0.unwrap(),
                        counterparty_delayed_payment_base_key: counterparty_delayed_payment_base_key.0.unwrap(),
@@ -298,7 +321,7 @@ impl Readable for CounterpartyReceivedHTLCOutput {
                let mut counterparty_delayed_payment_base_key = RequiredWrapper(None);
                let mut counterparty_htlc_base_key = RequiredWrapper(None);
                let mut htlc = RequiredWrapper(None);
-               let mut legacy_deserialization_prevention_marker: Option<()> = None;
+               let mut _legacy_deserialization_prevention_marker: Option<()> = None;
                let mut channel_type_features = None;
 
                read_tlv_fields!(reader, {
@@ -306,10 +329,12 @@ impl Readable for CounterpartyReceivedHTLCOutput {
                        (2, counterparty_delayed_payment_base_key, required),
                        (4, counterparty_htlc_base_key, required),
                        (6, htlc, required),
-                       (8, legacy_deserialization_prevention_marker, option),
+                       (8, _legacy_deserialization_prevention_marker, option),
                        (9, channel_type_features, option),
                });
 
+               verify_channel_type_features(&channel_type_features, None)?;
+
                Ok(Self {
                        per_commitment_point: per_commitment_point.0.unwrap(),
                        counterparty_delayed_payment_base_key: counterparty_delayed_payment_base_key.0.unwrap(),
@@ -374,17 +399,19 @@ impl Readable for HolderHTLCOutput {
                let mut amount_msat = RequiredWrapper(None);
                let mut cltv_expiry = RequiredWrapper(None);
                let mut preimage = None;
-               let mut legacy_deserialization_prevention_marker: Option<()> = None;
+               let mut _legacy_deserialization_prevention_marker: Option<()> = None;
                let mut channel_type_features = None;
 
                read_tlv_fields!(reader, {
                        (0, amount_msat, required),
                        (2, cltv_expiry, required),
                        (4, preimage, option),
-                       (6, legacy_deserialization_prevention_marker, option),
+                       (6, _legacy_deserialization_prevention_marker, option),
                        (7, channel_type_features, option),
                });
 
+               verify_channel_type_features(&channel_type_features, None)?;
+
                Ok(Self {
                        amount_msat: amount_msat.0.unwrap(),
                        cltv_expiry: cltv_expiry.0.unwrap(),
@@ -402,7 +429,7 @@ impl Readable for HolderHTLCOutput {
 #[derive(Clone, PartialEq, Eq)]
 pub(crate) struct HolderFundingOutput {
        funding_redeemscript: Script,
-       funding_amount: Option<u64>,
+       pub(crate) funding_amount: Option<u64>,
        channel_type_features: ChannelTypeFeatures,
 }
 
@@ -433,17 +460,19 @@ impl Writeable for HolderFundingOutput {
 impl Readable for HolderFundingOutput {
        fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
                let mut funding_redeemscript = RequiredWrapper(None);
-               let mut legacy_deserialization_prevention_marker: Option<()> = None;
+               let mut _legacy_deserialization_prevention_marker: Option<()> = None;
                let mut channel_type_features = None;
                let mut funding_amount = None;
 
                read_tlv_fields!(reader, {
                        (0, funding_redeemscript, required),
                        (1, channel_type_features, option),
-                       (2, legacy_deserialization_prevention_marker, option),
+                       (2, _legacy_deserialization_prevention_marker, option),
                        (3, funding_amount, option)
                });
 
+               verify_channel_type_features(&channel_type_features, None)?;
+
                Ok(Self {
                        funding_redeemscript: funding_redeemscript.0.unwrap(),
                        channel_type_features: channel_type_features.unwrap_or(ChannelTypeFeatures::only_static_remote_key()),
@@ -834,7 +863,6 @@ impl PackageTemplate {
                let output_weight = (8 + 1 + destination_script.len()) * WITNESS_SCALE_FACTOR;
                inputs_weight + witnesses_weight + transaction_weight + output_weight
        }
-       #[cfg(anchors)]
        pub(crate) fn construct_malleable_package_with_external_funding<Signer: WriteableEcdsaChannelSigner>(
                &self, onchain_handler: &mut OnchainTxHandler<Signer>,
        ) -> Option<Vec<ExternalHTLCClaim>> {
@@ -939,7 +967,6 @@ impl PackageTemplate {
                None
        }
 
-       #[cfg(anchors)]
        /// Computes a feerate based on the given confirmation target. If a previous feerate was used,
        /// the new feerate is below it, and `force_feerate_bump` is set, we'll use a 25% increase of
        /// the previous feerate instead of the new feerate.