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;
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;
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, {
(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(),
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, {
(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(),
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(),
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()),
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>> {
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.