@@ -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 , manually_bump_feerate : 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 , manually_bump_feerate,
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 `manually_bump_feerate` 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
+ manually_bump_feerate : 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 !manually_bump_feerate {
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 ( ) )
@@ -948,29 +958,43 @@ fn compute_fee_from_spent_amounts<F: Deref, L: Deref>(input_amounts: u64, predic
948
958
/// attempt, use them. Otherwise, blindly bump the feerate by 25% of the previous feerate. We also
949
959
/// verify that those bumping heuristics respect BIP125 rules 3) and 4) and if required adjust
950
960
/// 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 ,
961
+ fn feerate_bump < F : Deref , L : Deref > (
962
+ predicted_weight : usize , input_amounts : u64 , previous_feerate : u64 , manually_bump_feerate : bool ,
963
+ fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ,
964
+ ) -> Option < ( u64 , u64 ) >
965
+ where
966
+ F :: Target : FeeEstimator ,
967
+ L :: Target : Logger ,
954
968
{
955
969
// 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
970
+ let ( new_fee, new_feerate) = if let Some ( ( new_fee, new_feerate) ) = compute_fee_from_spent_amounts ( input_amounts, predicted_weight, fee_estimator, logger) {
971
+ if new_feerate > previous_feerate {
972
+ ( new_fee, new_feerate)
973
+ } else if !manually_bump_feerate {
974
+ let previous_fee = previous_feerate * ( predicted_weight as u64 ) / 1000 ;
975
+ ( previous_fee, previous_feerate)
960
976
} else {
961
977
// ...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 {
978
+ let bumped_feerate = previous_feerate + ( previous_feerate / 4 ) ;
979
+ let bumped_fee = bumped_feerate * ( predicted_weight as u64 ) / 1000 ;
980
+ if input_amounts <= bumped_fee {
964
981
log_warn ! ( logger, "Can't 25% bump new claiming tx, amount {} is too small" , input_amounts) ;
965
982
return None ;
966
983
}
967
- new_fee
984
+ ( bumped_fee , bumped_feerate )
968
985
}
969
986
} else {
970
987
log_warn ! ( logger, "Can't new-estimation bump new claiming tx, amount {} is too small" , input_amounts) ;
971
988
return None ;
972
989
} ;
973
990
991
+ // Our feerates should never decrease. If it hasn't changed though, we just need to
992
+ // rebroadcast/re-sign the previous claim.
993
+ debug_assert ! ( new_feerate >= previous_feerate) ;
994
+ if new_feerate == previous_feerate {
995
+ return Some ( ( new_fee, new_feerate) ) ;
996
+ }
997
+
974
998
let previous_fee = previous_feerate * ( predicted_weight as u64 ) / 1000 ;
975
999
let min_relay_fee = MIN_RELAY_FEE_SAT_PER_1000_WEIGHT * ( predicted_weight as u64 ) / 1000 ;
976
1000
// BIP 125 Opt-in Full Replace-by-Fee Signaling
0 commit comments