From 9088dae7daab47c46ad9b8447c376eceade7c7c4 Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Tue, 11 Jul 2023 15:30:51 -0700 Subject: [PATCH] Consider existing commitment transaction feerate when bumping With anchors, we've yet to change the frequency or aggressiveness of feerate updates, so it's likely that commitment transactions have a good enough feerate to confirm on its own. In any case, when producing a child anchor transaction, we should already take into account the fees paid by the commitment transaction itself, allowing the user to save some satoshis. Unfortunately, in its current form, this will still result in overpaying by a small margin at the expense of making the coin selection API more complex. --- lightning/src/events/bump_transaction.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lightning/src/events/bump_transaction.rs b/lightning/src/events/bump_transaction.rs index ffd9b228..f9d956ec 100644 --- a/lightning/src/events/bump_transaction.rs +++ b/lightning/src/events/bump_transaction.rs @@ -14,7 +14,7 @@ use alloc::collections::BTreeMap; use core::ops::Deref; -use crate::chain::chaininterface::{BroadcasterInterface, compute_feerate_sat_per_1000_weight, fee_for_weight}; +use crate::chain::chaininterface::{BroadcasterInterface, compute_feerate_sat_per_1000_weight, fee_for_weight, FEERATE_FLOOR_SATS_PER_KW}; use crate::chain::ClaimId; use crate::io_extras::sink; use crate::ln::channel::ANCHOR_OUTPUT_VALUE_SATOSHI; @@ -700,8 +700,21 @@ where &self, claim_id: ClaimId, package_target_feerate_sat_per_1000_weight: u32, commitment_tx: &Transaction, commitment_tx_fee_sat: u64, anchor_descriptor: &AnchorDescriptor, ) -> Result<(), ()> { + // Our commitment transaction already has fees allocated to it, so we should take them into + // account. We compute its feerate and subtract it from the package target, using the result + // as the target feerate for our anchor transaction. Unfortunately, this results in users + // overpaying by a small margin since we don't yet know the anchor transaction size, and + // avoiding the small overpayment only makes our API even more complex. + let commitment_tx_sat_per_1000_weight: u32 = compute_feerate_sat_per_1000_weight( + commitment_tx_fee_sat, commitment_tx.weight() as u64, + ); + let anchor_target_feerate_sat_per_1000_weight = core::cmp::max( + package_target_feerate_sat_per_1000_weight - commitment_tx_sat_per_1000_weight, + FEERATE_FLOOR_SATS_PER_KW, + ); + let mut anchor_tx = self.build_anchor_tx( - claim_id, package_target_feerate_sat_per_1000_weight, commitment_tx, anchor_descriptor, + claim_id, anchor_target_feerate_sat_per_1000_weight, commitment_tx, anchor_descriptor, )?; debug_assert_eq!(anchor_tx.output.len(), 1); -- 2.30.2