@@ -1117,10 +1117,10 @@ impl PackageTemplate {
1117
1117
// If old feerate is 0, first iteration of this claim, use normal fee calculation
1118
1118
if self . feerate_previous != 0 {
1119
1119
if let Some ( ( new_fee, feerate) ) = feerate_bump (
1120
- predicted_weight, input_amounts, self . feerate_previous , feerate_strategy ,
1121
- conf_target, fee_estimator, logger,
1120
+ predicted_weight, input_amounts, dust_limit_sats , self . feerate_previous ,
1121
+ feerate_strategy , conf_target, fee_estimator, logger,
1122
1122
) {
1123
- return Some ( ( cmp :: max ( input_amounts as i64 - new_fee as i64 , dust_limit_sats as i64 ) as u64 , feerate) ) ;
1123
+ return Some ( ( input_amounts. saturating_sub ( new_fee) , feerate) ) ;
1124
1124
}
1125
1125
} else {
1126
1126
if let Some ( ( new_fee, feerate) ) = compute_fee_from_spent_amounts ( input_amounts, predicted_weight, conf_target, fee_estimator, logger) {
@@ -1270,16 +1270,20 @@ fn compute_fee_from_spent_amounts<F: Deref, L: Logger>(
1270
1270
/// respect BIP125 rules 3) and 4) and if required adjust the new fee to meet the RBF policy
1271
1271
/// requirement.
1272
1272
fn feerate_bump < F : Deref , L : Logger > (
1273
- predicted_weight : u64 , input_amounts : u64 , previous_feerate : u64 , feerate_strategy : & FeerateStrategy ,
1274
- conf_target : ConfirmationTarget , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ,
1273
+ predicted_weight : u64 , input_amounts : u64 , dust_limit_sats : u64 , previous_feerate : u64 ,
1274
+ feerate_strategy : & FeerateStrategy , conf_target : ConfirmationTarget ,
1275
+ fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L ,
1275
1276
) -> Option < ( u64 , u64 ) >
1276
1277
where
1277
1278
F :: Target : FeeEstimator ,
1278
1279
{
1280
+ let previous_fee = previous_feerate * predicted_weight / 1000 ;
1281
+
1279
1282
// If old feerate inferior to actual one given back by Fee Estimator, use it to compute new fee...
1280
1283
let ( new_fee, new_feerate) = if let Some ( ( new_fee, new_feerate) ) =
1281
1284
compute_fee_from_spent_amounts ( input_amounts, predicted_weight, conf_target, fee_estimator, logger)
1282
1285
{
1286
+ log_debug ! ( logger, "Initiating fee rate bump from {} s/kWU ({} s) to {} s/kWU ({} s) using {:?} strategy" , previous_feerate, previous_fee, new_feerate, new_fee, feerate_strategy) ;
1283
1287
match feerate_strategy {
1284
1288
FeerateStrategy :: RetryPrevious => {
1285
1289
let previous_fee = previous_feerate * predicted_weight / 1000 ;
@@ -1297,15 +1301,12 @@ where
1297
1301
// ...else just increase the previous feerate by 25% (because that's a nice number)
1298
1302
let bumped_feerate = previous_feerate + ( previous_feerate / 4 ) ;
1299
1303
let bumped_fee = bumped_feerate * predicted_weight / 1000 ;
1300
- if input_amounts <= bumped_fee {
1301
- log_warn ! ( logger, "Can't 25% bump new claiming tx, amount {} is too small" , input_amounts) ;
1302
- return None ;
1303
- }
1304
+
1304
1305
( bumped_fee, bumped_feerate)
1305
1306
} ,
1306
1307
}
1307
1308
} else {
1308
- log_warn ! ( logger, "Can't new-estimation bump new claiming tx, amount {} is too small" , input_amounts) ;
1309
+ log_warn ! ( logger, "Can't bump new claiming tx, input amount {} is too small" , input_amounts) ;
1309
1310
return None ;
1310
1311
} ;
1311
1312
@@ -1316,17 +1317,26 @@ where
1316
1317
return Some ( ( new_fee, new_feerate) ) ;
1317
1318
}
1318
1319
1319
- let previous_fee = previous_feerate * predicted_weight / 1000 ;
1320
1320
let min_relay_fee = INCREMENTAL_RELAY_FEE_SAT_PER_1000_WEIGHT * predicted_weight / 1000 ;
1321
1321
// BIP 125 Opt-in Full Replace-by-Fee Signaling
1322
1322
// * 3. The replacement transaction pays an absolute fee of at least the sum paid by the original transactions.
1323
1323
// * 4. The replacement transaction must also pay for its own bandwidth at or above the rate set by the node's minimum relay fee setting.
1324
- let new_fee = if new_fee < previous_fee + min_relay_fee {
1325
- new_fee + previous_fee + min_relay_fee - new_fee
1326
- } else {
1327
- new_fee
1328
- } ;
1329
- Some ( ( new_fee, new_fee * 1000 / predicted_weight) )
1324
+ let naive_new_fee = new_fee;
1325
+ let new_fee = cmp:: max ( new_fee, previous_fee + min_relay_fee) ;
1326
+
1327
+ if new_fee > naive_new_fee {
1328
+ log_debug ! ( logger, "Naive fee bump of {}s does not meet min relay fee requirements of {}s" , naive_new_fee - previous_fee, min_relay_fee) ;
1329
+ }
1330
+
1331
+ let remaining_output_amount = input_amounts. saturating_sub ( new_fee) ;
1332
+ if remaining_output_amount < dust_limit_sats {
1333
+ log_warn ! ( logger, "Can't bump new claiming tx, output amount {} would end up below dust threshold {}" , remaining_output_amount, dust_limit_sats) ;
1334
+ return None ;
1335
+ }
1336
+
1337
+ let new_feerate = new_fee * 1000 / predicted_weight;
1338
+ log_debug ! ( logger, "Fee rate bumped by {}s from {} s/KWU ({} s) to {} s/KWU ({} s)" , new_fee - previous_fee, previous_feerate, previous_fee, new_feerate, new_fee) ;
1339
+ Some ( ( new_fee, new_feerate) )
1330
1340
}
1331
1341
1332
1342
#[ cfg( test) ]
0 commit comments