@@ -3364,6 +3364,49 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3364
3364
_ => todo!()
3365
3365
}
3366
3366
}
3367
+
3368
+ /// If we receive an error message when attempting to open a channel, it may only be a rejection
3369
+ /// of the channel type we tried, not of our ability to open any channel at all. We can see if a
3370
+ /// downgrade of channel features would be possible so that we can still open the channel.
3371
+ pub(crate) fn maybe_downgrade_channel_features<F: Deref>(
3372
+ &mut self, fee_estimator: &LowerBoundedFeeEstimator<F>
3373
+ ) -> Result<(), ()>
3374
+ where
3375
+ F::Target: FeeEstimator
3376
+ {
3377
+ if !self.is_outbound() ||
3378
+ !matches!(
3379
+ self.channel_state, ChannelState::NegotiatingFunding(flags)
3380
+ if flags == NegotiatingFundingFlags::OUR_INIT_SENT
3381
+ )
3382
+ {
3383
+ return Err(());
3384
+ }
3385
+ if self.channel_type == ChannelTypeFeatures::only_static_remote_key() {
3386
+ // We've exhausted our options
3387
+ return Err(());
3388
+ }
3389
+ // We support opening a few different types of channels. Try removing our additional
3390
+ // features one by one until we've either arrived at our default or the counterparty has
3391
+ // accepted one.
3392
+ //
3393
+ // Due to the order below, we may not negotiate `option_anchors_zero_fee_htlc_tx` if the
3394
+ // counterparty doesn't support `option_scid_privacy`. Since `get_initial_channel_type`
3395
+ // checks whether the counterparty supports every feature, this would only happen if the
3396
+ // counterparty is advertising the feature, but rejecting channels proposing the feature for
3397
+ // whatever reason.
3398
+ if self.channel_type.supports_anchors_zero_fee_htlc_tx() {
3399
+ self.channel_type.clear_anchors_zero_fee_htlc_tx();
3400
+ self.feerate_per_kw = fee_estimator.bounded_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
3401
+ assert!(!self.channel_transaction_parameters.channel_type_features.supports_anchors_nonzero_fee_htlc_tx());
3402
+ } else if self.channel_type.supports_scid_privacy() {
3403
+ self.channel_type.clear_scid_privacy();
3404
+ } else {
3405
+ self.channel_type = ChannelTypeFeatures::only_static_remote_key();
3406
+ }
3407
+ self.channel_transaction_parameters.channel_type_features = self.channel_type.clone();
3408
+ Ok(())
3409
+ }
3367
3410
}
3368
3411
3369
3412
// Internal utility functions for channels
@@ -7302,37 +7345,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7302
7345
where
7303
7346
F::Target: FeeEstimator
7304
7347
{
7305
- if !self.context.is_outbound() ||
7306
- !matches!(
7307
- self.context.channel_state, ChannelState::NegotiatingFunding(flags)
7308
- if flags == NegotiatingFundingFlags::OUR_INIT_SENT
7309
- )
7310
- {
7311
- return Err(());
7312
- }
7313
- if self.context.channel_type == ChannelTypeFeatures::only_static_remote_key() {
7314
- // We've exhausted our options
7315
- return Err(());
7316
- }
7317
- // We support opening a few different types of channels. Try removing our additional
7318
- // features one by one until we've either arrived at our default or the counterparty has
7319
- // accepted one.
7320
- //
7321
- // Due to the order below, we may not negotiate `option_anchors_zero_fee_htlc_tx` if the
7322
- // counterparty doesn't support `option_scid_privacy`. Since `get_initial_channel_type`
7323
- // checks whether the counterparty supports every feature, this would only happen if the
7324
- // counterparty is advertising the feature, but rejecting channels proposing the feature for
7325
- // whatever reason.
7326
- if self.context.channel_type.supports_anchors_zero_fee_htlc_tx() {
7327
- self.context.channel_type.clear_anchors_zero_fee_htlc_tx();
7328
- self.context.feerate_per_kw = fee_estimator.bounded_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
7329
- assert!(!self.context.channel_transaction_parameters.channel_type_features.supports_anchors_nonzero_fee_htlc_tx());
7330
- } else if self.context.channel_type.supports_scid_privacy() {
7331
- self.context.channel_type.clear_scid_privacy();
7332
- } else {
7333
- self.context.channel_type = ChannelTypeFeatures::only_static_remote_key();
7334
- }
7335
- self.context.channel_transaction_parameters.channel_type_features = self.context.channel_type.clone();
7348
+ self.context.maybe_downgrade_channel_features(fee_estimator)?;
7336
7349
Ok(self.get_open_channel(chain_hash))
7337
7350
}
7338
7351
@@ -7966,6 +7979,19 @@ impl<SP: Deref> OutboundV2Channel<SP> where SP::Target: SignerProvider {
7966
7979
Ok(chan)
7967
7980
}
7968
7981
7982
+ /// If we receive an error message, it may only be a rejection of the channel type we tried,
7983
+ /// not of our ability to open any channel at all. Thus, on error, we should first call this
7984
+ /// and see if we get a new `OpenChannelV2` message, otherwise the channel is failed.
7985
+ pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7986
+ &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7987
+ ) -> Result<msgs::OpenChannelV2, ()>
7988
+ where
7989
+ F::Target: FeeEstimator
7990
+ {
7991
+ self.context.maybe_downgrade_channel_features(fee_estimator)?;
7992
+ Ok(self.get_open_channel_v2(chain_hash))
7993
+ }
7994
+
7969
7995
pub fn get_open_channel_v2(&self, chain_hash: ChainHash) -> msgs::OpenChannelV2 {
7970
7996
if self.context.have_received_message() {
7971
7997
debug_assert!(false, "Cannot generate an open_channel2 after we've moved forward");
0 commit comments