Extend OnchainTxHandler::generate_claim to optionally force feerate bump
[rust-lightning] / lightning / src / chain / onchaintx.rs
index cd0cb08eab3522c00a057a7e9043c45c6a2a43a0..aece19c8371566bee10913d7f0404bbdba3ea62c 100644 (file)
@@ -489,9 +489,13 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
        ///
        /// Panics if there are signing errors, because signing operations in reaction to on-chain
        /// events are not expected to fail, and if they do, we may lose funds.
-       fn generate_claim<F: Deref, L: Deref>(&mut self, cur_height: u32, cached_request: &PackageTemplate, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L) -> Option<(u32, u64, OnchainClaim)>
-               where F::Target: FeeEstimator,
-                                       L::Target: Logger,
+       fn generate_claim<F: Deref, L: Deref>(
+               &mut self, cur_height: u32, cached_request: &PackageTemplate, force_feerate_bump: bool,
+               fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L,
+       ) -> Option<(u32, u64, OnchainClaim)>
+       where
+               F::Target: FeeEstimator,
+               L::Target: Logger,
        {
                let request_outpoints = cached_request.outpoints();
                if request_outpoints.is_empty() {
@@ -538,8 +542,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
                        #[cfg(anchors)]
                        { // Attributes are not allowed on if expressions on our current MSRV of 1.41.
                                if cached_request.requires_external_funding() {
-                                       let target_feerate_sat_per_1000_weight = cached_request
-                                               .compute_package_feerate(fee_estimator, ConfirmationTarget::HighPriority);
+                                       let target_feerate_sat_per_1000_weight = cached_request.compute_package_feerate(
+                                               fee_estimator, ConfirmationTarget::HighPriority, force_feerate_bump
+                                       );
                                        if let Some(htlcs) = cached_request.construct_malleable_package_with_external_funding(self) {
                                                return Some((
                                                        new_timer,
@@ -558,7 +563,8 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
 
                        let predicted_weight = cached_request.package_weight(&self.destination_script);
                        if let Some((output_value, new_feerate)) = cached_request.compute_package_output(
-                               predicted_weight, self.destination_script.dust_value().to_sat(), fee_estimator, logger,
+                               predicted_weight, self.destination_script.dust_value().to_sat(),
+                               force_feerate_bump, fee_estimator, logger,
                        ) {
                                assert!(new_feerate != 0);
 
@@ -601,7 +607,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
                                                        // counterparty's latest commitment don't have any HTLCs present.
                                                        let conf_target = ConfirmationTarget::HighPriority;
                                                        let package_target_feerate_sat_per_1000_weight = cached_request
-                                                               .compute_package_feerate(fee_estimator, conf_target);
+                                                               .compute_package_feerate(fee_estimator, conf_target, force_feerate_bump);
                                                        Some((
                                                                new_timer,
                                                                package_target_feerate_sat_per_1000_weight as u64,
@@ -700,7 +706,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
                // Generate claim transactions and track them to bump if necessary at
                // height timer expiration (i.e in how many blocks we're going to take action).
                for mut req in preprocessed_requests {
-                       if let Some((new_timer, new_feerate, claim)) = self.generate_claim(cur_height, &req, &*fee_estimator, &*logger) {
+                       if let Some((new_timer, new_feerate, claim)) = self.generate_claim(
+                               cur_height, &req, true /* force_feerate_bump */, &*fee_estimator, &*logger,
+                       ) {
                                req.set_timer(new_timer);
                                req.set_feerate(new_feerate);
                                let package_id = match claim {
@@ -893,7 +901,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
                // Build, bump and rebroadcast tx accordingly
                log_trace!(logger, "Bumping {} candidates", bump_candidates.len());
                for (package_id, request) in bump_candidates.iter() {
-                       if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(cur_height, &request, &*fee_estimator, &*logger) {
+                       if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(
+                               cur_height, &request, true /* force_feerate_bump */, &*fee_estimator, &*logger,
+                       ) {
                                match bump_claim {
                                        OnchainClaim::Tx(bump_tx) => {
                                                log_info!(logger, "Broadcasting RBF-bumped onchain {}", log_tx!(bump_tx));
@@ -973,7 +983,9 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
                        }
                }
                for ((_package_id, _), ref mut request) in bump_candidates.iter_mut() {
-                       if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(height, &request, fee_estimator, &&*logger) {
+                       if let Some((new_timer, new_feerate, bump_claim)) = self.generate_claim(
+                               height, &request, true /* force_feerate_bump */, fee_estimator, &&*logger
+                       ) {
                                request.set_timer(new_timer);
                                request.set_feerate(new_feerate);
                                match bump_claim {