@@ -40,7 +40,7 @@ use crate::ln::chan_utils::{self,CommitmentTransaction, CounterpartyCommitmentSe
40
40
use crate :: ln:: channelmanager:: { HTLCSource , SentHTLCId } ;
41
41
use crate :: chain;
42
42
use crate :: chain:: { BestBlock , WatchedOutput } ;
43
- use crate :: chain:: chaininterface:: { BroadcasterInterface , FeeEstimator , LowerBoundedFeeEstimator } ;
43
+ use crate :: chain:: chaininterface:: { BroadcasterInterface , ConfirmationTarget , FeeEstimator , LowerBoundedFeeEstimator } ;
44
44
use crate :: chain:: transaction:: { OutPoint , TransactionData } ;
45
45
use crate :: sign:: { ChannelDerivationParameters , HTLCDescriptor , SpendableOutputDescriptor , StaticPaymentOutputDescriptor , DelayedPaymentOutputDescriptor , ecdsa:: EcdsaChannelSigner , SignerProvider , EntropySource } ;
46
46
use crate :: chain:: onchaintx:: { ClaimEvent , FeerateStrategy , OnchainTxHandler } ;
@@ -1902,8 +1902,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
1902
1902
let mut inner = self . inner . lock ( ) . unwrap ( ) ;
1903
1903
let logger = WithChannelMonitor :: from_impl ( logger, & * inner, None ) ;
1904
1904
let current_height = inner. best_block . height ;
1905
+ let conf_target = inner. closure_conf_target ( ) ;
1905
1906
inner. onchain_tx_handler . rebroadcast_pending_claims (
1906
- current_height, FeerateStrategy :: HighestOfPreviousOrNew , & broadcaster, & fee_estimator, & logger,
1907
+ current_height, FeerateStrategy :: HighestOfPreviousOrNew , & broadcaster, conf_target , & fee_estimator, & logger,
1907
1908
) ;
1908
1909
}
1909
1910
@@ -1927,8 +1928,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
1927
1928
let mut inner = self . inner . lock ( ) . unwrap ( ) ;
1928
1929
let logger = WithChannelMonitor :: from_impl ( logger, & * inner, None ) ;
1929
1930
let current_height = inner. best_block . height ;
1931
+ let conf_target = inner. closure_conf_target ( ) ;
1930
1932
inner. onchain_tx_handler . rebroadcast_pending_claims (
1931
- current_height, FeerateStrategy :: RetryPrevious , & broadcaster, & fee_estimator, & logger,
1933
+ current_height, FeerateStrategy :: RetryPrevious , & broadcaster, conf_target , & fee_estimator, & logger,
1932
1934
) ;
1933
1935
}
1934
1936
@@ -2684,6 +2686,30 @@ pub fn deliberately_bogus_accepted_htlc_witness() -> Vec<Vec<u8>> {
2684
2686
}
2685
2687
2686
2688
impl < Signer : EcdsaChannelSigner > ChannelMonitorImpl < Signer > {
2689
+ /// Gets the [`ConfirmationTarget`] we should use when selecting feerates for channel closure
2690
+ /// transactions for this channel right now.
2691
+ fn closure_conf_target ( & self ) -> ConfirmationTarget {
2692
+ // Treat the sweep as urgent as long as there is at least one HTLC which is pending on a
2693
+ // valid commitment transaction.
2694
+ if !self . current_holder_commitment_tx . htlc_outputs . is_empty ( ) {
2695
+ return ConfirmationTarget :: UrgentOnChainSweep ;
2696
+ }
2697
+ if self . prev_holder_signed_commitment_tx . as_ref ( ) . map ( |t| !t. htlc_outputs . is_empty ( ) ) . unwrap_or ( false ) {
2698
+ return ConfirmationTarget :: UrgentOnChainSweep ;
2699
+ }
2700
+ if let Some ( txid) = self . current_counterparty_commitment_txid {
2701
+ if !self . counterparty_claimable_outpoints . get ( & txid) . unwrap ( ) . is_empty ( ) {
2702
+ return ConfirmationTarget :: UrgentOnChainSweep ;
2703
+ }
2704
+ }
2705
+ if let Some ( txid) = self . prev_counterparty_commitment_txid {
2706
+ if !self . counterparty_claimable_outpoints . get ( & txid) . unwrap ( ) . is_empty ( ) {
2707
+ return ConfirmationTarget :: UrgentOnChainSweep ;
2708
+ }
2709
+ }
2710
+ ConfirmationTarget :: OutputSpendingFee
2711
+ }
2712
+
2687
2713
/// Inserts a revocation secret into this channel monitor. Prunes old preimages if neither
2688
2714
/// needed by holder commitment transactions HTCLs nor by counterparty ones. Unless we haven't already seen
2689
2715
/// counterparty commitment transaction's secret, they are de facto pruned (we can use revocation key).
@@ -2928,7 +2954,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2928
2954
macro_rules! claim_htlcs {
2929
2955
( $commitment_number: expr, $txid: expr, $htlcs: expr) => {
2930
2956
let ( htlc_claim_reqs, _) = self . get_counterparty_output_claim_info( $commitment_number, $txid, None , $htlcs) ;
2931
- self . onchain_tx_handler. update_claims_view_from_requests( htlc_claim_reqs, self . best_block. height, self . best_block. height, broadcaster, fee_estimator, logger) ;
2957
+ let conf_target = self . closure_conf_target( ) ;
2958
+ self . onchain_tx_handler. update_claims_view_from_requests( htlc_claim_reqs, self . best_block. height, self . best_block. height, broadcaster, conf_target, fee_estimator, logger) ;
2932
2959
}
2933
2960
}
2934
2961
if let Some ( txid) = self . current_counterparty_commitment_txid {
@@ -2976,7 +3003,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2976
3003
// block. Even if not, its a reasonable metric for the bump criteria on the HTLC
2977
3004
// transactions.
2978
3005
let ( claim_reqs, _) = self . get_broadcasted_holder_claims ( & holder_commitment_tx, self . best_block . height ) ;
2979
- self . onchain_tx_handler . update_claims_view_from_requests ( claim_reqs, self . best_block . height , self . best_block . height , broadcaster, fee_estimator, logger) ;
3006
+ let conf_target = self . closure_conf_target ( ) ;
3007
+ self . onchain_tx_handler . update_claims_view_from_requests ( claim_reqs, self . best_block . height , self . best_block . height , broadcaster, conf_target, fee_estimator, logger) ;
2980
3008
}
2981
3009
}
2982
3010
}
@@ -3036,9 +3064,10 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
3036
3064
L :: Target : Logger ,
3037
3065
{
3038
3066
let ( claimable_outpoints, _) = self . generate_claimable_outpoints_and_watch_outputs ( ClosureReason :: HolderForceClosed { broadcasted_latest_txn : Some ( true ) } ) ;
3067
+ let conf_target = self . closure_conf_target ( ) ;
3039
3068
self . onchain_tx_handler . update_claims_view_from_requests (
3040
3069
claimable_outpoints, self . best_block . height , self . best_block . height , broadcaster,
3041
- fee_estimator, logger
3070
+ conf_target , fee_estimator, logger,
3042
3071
) ;
3043
3072
}
3044
3073
@@ -3851,7 +3880,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
3851
3880
self . best_block = BestBlock :: new ( block_hash, height) ;
3852
3881
log_trace ! ( logger, "Best block re-orged, replaced with new block {} at height {}" , block_hash, height) ;
3853
3882
self . onchain_events_awaiting_threshold_conf . retain ( |ref entry| entry. height <= height) ;
3854
- self . onchain_tx_handler . block_disconnected ( height + 1 , broadcaster, fee_estimator, logger) ;
3883
+ let conf_target = self . closure_conf_target ( ) ;
3884
+ self . onchain_tx_handler . block_disconnected ( height + 1 , broadcaster, conf_target, fee_estimator, logger) ;
3855
3885
Vec :: new ( )
3856
3886
} else { Vec :: new ( ) }
3857
3887
}
@@ -4116,8 +4146,9 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
4116
4146
}
4117
4147
}
4118
4148
4119
- self . onchain_tx_handler . update_claims_view_from_requests ( claimable_outpoints, conf_height, self . best_block . height , broadcaster, fee_estimator, logger) ;
4120
- self . onchain_tx_handler . update_claims_view_from_matched_txn ( & txn_matched, conf_height, conf_hash, self . best_block . height , broadcaster, fee_estimator, logger) ;
4149
+ let conf_target = self . closure_conf_target ( ) ;
4150
+ self . onchain_tx_handler . update_claims_view_from_requests ( claimable_outpoints, conf_height, self . best_block . height , broadcaster, conf_target, fee_estimator, logger) ;
4151
+ self . onchain_tx_handler . update_claims_view_from_matched_txn ( & txn_matched, conf_height, conf_hash, self . best_block . height , broadcaster, conf_target, fee_estimator, logger) ;
4121
4152
4122
4153
// Determine new outputs to watch by comparing against previously known outputs to watch,
4123
4154
// updating the latter in the process.
@@ -4156,7 +4187,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
4156
4187
self . onchain_events_awaiting_threshold_conf . retain ( |ref entry| entry. height < height) ;
4157
4188
4158
4189
let bounded_fee_estimator = LowerBoundedFeeEstimator :: new ( fee_estimator) ;
4159
- self . onchain_tx_handler . block_disconnected ( height, broadcaster, & bounded_fee_estimator, logger) ;
4190
+ let conf_target = self . closure_conf_target ( ) ;
4191
+ self . onchain_tx_handler . block_disconnected ( height, broadcaster, conf_target, & bounded_fee_estimator, logger) ;
4160
4192
4161
4193
self . best_block = BestBlock :: new ( header. prev_blockhash , height - 1 ) ;
4162
4194
}
@@ -4190,7 +4222,8 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
4190
4222
4191
4223
debug_assert ! ( !self . onchain_events_awaiting_threshold_conf. iter( ) . any( |ref entry| entry. txid == * txid) ) ;
4192
4224
4193
- self . onchain_tx_handler . transaction_unconfirmed ( txid, broadcaster, fee_estimator, logger) ;
4225
+ let conf_target = self . closure_conf_target ( ) ;
4226
+ self . onchain_tx_handler . transaction_unconfirmed ( txid, broadcaster, conf_target, fee_estimator, logger) ;
4194
4227
}
4195
4228
4196
4229
/// Filters a block's `txdata` for transactions spending watched outputs or for any child
@@ -4983,7 +5016,7 @@ mod tests {
4983
5016
use crate :: util:: test_utils:: { TestLogger , TestBroadcaster , TestFeeEstimator } ;
4984
5017
use crate :: util:: ser:: { ReadableArgs , Writeable } ;
4985
5018
use crate :: util:: logger:: Logger ;
4986
- use crate :: sync:: { Arc , Mutex } ;
5019
+ use crate :: sync:: Arc ;
4987
5020
use crate :: io;
4988
5021
use crate :: ln:: features:: ChannelTypeFeatures ;
4989
5022
@@ -5083,7 +5116,7 @@ mod tests {
5083
5116
let secp_ctx = Secp256k1 :: new ( ) ;
5084
5117
let logger = Arc :: new ( TestLogger :: new ( ) ) ;
5085
5118
let broadcaster = Arc :: new ( TestBroadcaster :: new ( Network :: Testnet ) ) ;
5086
- let fee_estimator = TestFeeEstimator { sat_per_kw : Mutex :: new ( 253 ) } ;
5119
+ let fee_estimator = TestFeeEstimator :: new ( 253 ) ;
5087
5120
5088
5121
let dummy_key = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
5089
5122
0 commit comments