@@ -762,16 +762,23 @@ impl PackageTemplate {
762
762
/// Returns value in satoshis to be included as package outgoing output amount and feerate
763
763
/// which was used to generate the value. Will not return less than `dust_limit_sats` for the
764
764
/// value.
765
- pub ( crate ) fn compute_package_output < F : Deref , L : Deref > ( & self , predicted_weight : usize , dust_limit_sats : u64 , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ) -> Option < ( u64 , u64 ) >
766
- where F :: Target : FeeEstimator ,
767
- L :: Target : Logger ,
765
+ pub ( crate ) fn compute_package_output < F : Deref , L : Deref > (
766
+ & self , predicted_weight : usize , dust_limit_sats : u64 , force_feerate_bump : bool ,
767
+ fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ,
768
+ ) -> Option < ( u64 , u64 ) >
769
+ where
770
+ F :: Target : FeeEstimator ,
771
+ L :: Target : Logger ,
768
772
{
769
773
debug_assert ! ( self . malleability == PackageMalleability :: Malleable , "The package output is fixed for non-malleable packages" ) ;
770
774
let input_amounts = self . package_amount ( ) ;
771
775
assert ! ( dust_limit_sats as i64 > 0 , "Output script must be broadcastable/have a 'real' dust limit." ) ;
772
776
// If old feerate is 0, first iteration of this claim, use normal fee calculation
773
777
if self . feerate_previous != 0 {
774
- if let Some ( ( new_fee, feerate) ) = feerate_bump ( predicted_weight, input_amounts, self . feerate_previous , fee_estimator, logger) {
778
+ if let Some ( ( new_fee, feerate) ) = feerate_bump (
779
+ predicted_weight, input_amounts, self . feerate_previous , force_feerate_bump,
780
+ fee_estimator, logger,
781
+ ) {
775
782
return Some ( ( cmp:: max ( input_amounts as i64 - new_fee as i64 , dust_limit_sats as i64 ) as u64 , feerate) ) ;
776
783
}
777
784
} else {
@@ -784,16 +791,19 @@ impl PackageTemplate {
784
791
785
792
#[ cfg( anchors) ]
786
793
/// Computes a feerate based on the given confirmation target. If a previous feerate was used,
787
- /// and the new feerate is below it, we'll use a 25% increase of the previous feerate instead of
788
- /// the new one .
794
+ /// the new feerate is below it, and `force_feerate_bump` is set, we'll use a 25% increase of
795
+ /// the previous feerate instead of the new feerate .
789
796
pub ( crate ) fn compute_package_feerate < F : Deref > (
790
797
& self , fee_estimator : & LowerBoundedFeeEstimator < F > , conf_target : ConfirmationTarget ,
798
+ force_feerate_bump : bool ,
791
799
) -> u32 where F :: Target : FeeEstimator {
792
800
let feerate_estimate = fee_estimator. bounded_sat_per_1000_weight ( conf_target) ;
793
801
if self . feerate_previous != 0 {
794
802
// If old feerate inferior to actual one given back by Fee Estimator, use it to compute new fee...
795
803
if feerate_estimate as u64 > self . feerate_previous {
796
804
feerate_estimate
805
+ } else if !force_feerate_bump {
806
+ self . feerate_previous . try_into ( ) . unwrap_or ( u32:: max_value ( ) )
797
807
} else {
798
808
// ...else just increase the previous feerate by 25% (because that's a nice number)
799
809
( self . feerate_previous + ( self . feerate_previous / 4 ) ) . try_into ( ) . unwrap_or ( u32:: max_value ( ) )
@@ -945,32 +955,47 @@ fn compute_fee_from_spent_amounts<F: Deref, L: Deref>(input_amounts: u64, predic
945
955
946
956
/// Attempt to propose a bumping fee for a transaction from its spent output's values and predicted
947
957
/// weight. If feerates proposed by the fee-estimator have been increasing since last fee-bumping
948
- /// attempt, use them. Otherwise, blindly bump the feerate by 25% of the previous feerate. We also
949
- /// verify that those bumping heuristics respect BIP125 rules 3) and 4) and if required adjust
950
- /// the new fee to meet the RBF policy requirement.
951
- fn feerate_bump < F : Deref , L : Deref > ( predicted_weight : usize , input_amounts : u64 , previous_feerate : u64 , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ) -> Option < ( u64 , u64 ) >
952
- where F :: Target : FeeEstimator ,
953
- L :: Target : Logger ,
958
+ /// attempt, use them. If `force_feerate_bump` is set, we bump the feerate by 25% of the previous
959
+ /// feerate, or just use the previous feerate otherwise. If a feerate bump did happen, we also
960
+ /// verify that those bumping heuristics respect BIP125 rules 3) and 4) and if required adjust the
961
+ /// new fee to meet the RBF policy requirement.
962
+ fn feerate_bump < F : Deref , L : Deref > (
963
+ predicted_weight : usize , input_amounts : u64 , previous_feerate : u64 , force_feerate_bump : bool ,
964
+ fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ,
965
+ ) -> Option < ( u64 , u64 ) >
966
+ where
967
+ F :: Target : FeeEstimator ,
968
+ L :: Target : Logger ,
954
969
{
955
970
// If old feerate inferior to actual one given back by Fee Estimator, use it to compute new fee...
956
- let new_fee = if let Some ( ( new_fee, _) ) = compute_fee_from_spent_amounts ( input_amounts, predicted_weight, fee_estimator, logger) {
957
- let updated_feerate = new_fee / ( predicted_weight as u64 * 1000 ) ;
958
- if updated_feerate > previous_feerate {
959
- new_fee
971
+ let ( new_fee, new_feerate) = if let Some ( ( new_fee, new_feerate) ) = compute_fee_from_spent_amounts ( input_amounts, predicted_weight, fee_estimator, logger) {
972
+ if new_feerate > previous_feerate {
973
+ ( new_fee, new_feerate)
974
+ } else if !force_feerate_bump {
975
+ let previous_fee = previous_feerate * ( predicted_weight as u64 ) / 1000 ;
976
+ ( previous_fee, previous_feerate)
960
977
} else {
961
978
// ...else just increase the previous feerate by 25% (because that's a nice number)
962
- let new_fee = previous_feerate * ( predicted_weight as u64 ) / 750 ;
963
- if input_amounts <= new_fee {
979
+ let bumped_feerate = previous_feerate + ( previous_feerate / 4 ) ;
980
+ let bumped_fee = bumped_feerate * ( predicted_weight as u64 ) / 1000 ;
981
+ if input_amounts <= bumped_fee {
964
982
log_warn ! ( logger, "Can't 25% bump new claiming tx, amount {} is too small" , input_amounts) ;
965
983
return None ;
966
984
}
967
- new_fee
985
+ ( bumped_fee , bumped_feerate )
968
986
}
969
987
} else {
970
988
log_warn ! ( logger, "Can't new-estimation bump new claiming tx, amount {} is too small" , input_amounts) ;
971
989
return None ;
972
990
} ;
973
991
992
+ // Our feerates should never decrease. If it hasn't changed though, we just need to
993
+ // rebroadcast/re-sign the previous claim.
994
+ debug_assert ! ( new_feerate >= previous_feerate) ;
995
+ if new_feerate == previous_feerate {
996
+ return Some ( ( new_fee, new_feerate) ) ;
997
+ }
998
+
974
999
let previous_fee = previous_feerate * ( predicted_weight as u64 ) / 1000 ;
975
1000
let min_relay_fee = MIN_RELAY_FEE_SAT_PER_1000_WEIGHT * ( predicted_weight as u64 ) / 1000 ;
976
1001
// BIP 125 Opt-in Full Replace-by-Fee Signaling
0 commit comments