@@ -17,7 +17,8 @@ use ln::channelmonitor::{ANTI_REORG_DELAY, CLTV_SHARED_CLAIM_BUFFER};
17
17
use ln:: channelmanager:: PaymentPreimage ;
18
18
use ln:: chan_utils:: LocalCommitmentTransaction ;
19
19
use ln:: onchain_utils:: { OnchainRequest , PackageTemplate } ;
20
- use chain:: chaininterface:: { FeeEstimator , BroadcasterInterface , ConfirmationTarget , MIN_RELAY_FEE_SAT_PER_1000_WEIGHT } ;
20
+ use ln:: onchain_utils;
21
+ use chain:: chaininterface:: { FeeEstimator , BroadcasterInterface } ;
21
22
use chain:: keysinterface:: ChannelKeys ;
22
23
use util:: logger:: Logger ;
23
24
use util:: ser:: { Readable , Writer , Writeable } ;
@@ -46,41 +47,6 @@ enum OnchainEvent {
46
47
}
47
48
}
48
49
49
- macro_rules! subtract_high_prio_fee {
50
- ( $logger: ident, $fee_estimator: expr, $value: expr, $predicted_weight: expr, $used_feerate: expr) => {
51
- {
52
- $used_feerate = $fee_estimator. get_est_sat_per_1000_weight( ConfirmationTarget :: HighPriority ) ;
53
- let mut fee = $used_feerate * ( $predicted_weight as u64 ) / 1000 ;
54
- if $value <= fee {
55
- $used_feerate = $fee_estimator. get_est_sat_per_1000_weight( ConfirmationTarget :: Normal ) ;
56
- fee = $used_feerate * ( $predicted_weight as u64 ) / 1000 ;
57
- if $value <= fee {
58
- $used_feerate = $fee_estimator. get_est_sat_per_1000_weight( ConfirmationTarget :: Background ) ;
59
- fee = $used_feerate * ( $predicted_weight as u64 ) / 1000 ;
60
- if $value <= fee {
61
- log_error!( $logger, "Failed to generate an on-chain punishment tx as even low priority fee ({} sat) was more than the entire claim balance ({} sat)" ,
62
- fee, $value) ;
63
- false
64
- } else {
65
- log_warn!( $logger, "Used low priority fee for on-chain punishment tx as high priority fee was more than the entire claim balance ({} sat)" ,
66
- $value) ;
67
- $value -= fee;
68
- true
69
- }
70
- } else {
71
- log_warn!( $logger, "Used medium priority fee for on-chain punishment tx as high priority fee was more than the entire claim balance ({} sat)" ,
72
- $value) ;
73
- $value -= fee;
74
- true
75
- }
76
- } else {
77
- $value -= fee;
78
- true
79
- }
80
- }
81
- }
82
- }
83
-
84
50
impl Readable for Option < Vec < Option < ( usize , Signature ) > > > {
85
51
fn read < R : :: std:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
86
52
match Readable :: read ( reader) ? {
@@ -333,45 +299,6 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
333
299
{
334
300
if cached_request. content . outpoints ( ) . len ( ) == 0 { return None } // But don't prune pending claiming request yet, we may have to resurrect HTLCs
335
301
336
- macro_rules! RBF_bump {
337
- ( $amount: expr, $old_feerate: expr, $fee_estimator: expr, $predicted_weight: expr) => {
338
- {
339
- let mut used_feerate;
340
- // If old feerate inferior to actual one given back by Fee Estimator, use it to compute new fee...
341
- let new_fee = if $old_feerate < $fee_estimator. get_est_sat_per_1000_weight( ConfirmationTarget :: HighPriority ) {
342
- let mut value = $amount;
343
- if subtract_high_prio_fee!( logger, $fee_estimator, value, $predicted_weight, used_feerate) {
344
- // Overflow check is done in subtract_high_prio_fee
345
- $amount - value
346
- } else {
347
- log_trace!( logger, "Can't new-estimation bump new claiming tx, amount {} is too small" , $amount) ;
348
- return None ;
349
- }
350
- // ...else just increase the previous feerate by 25% (because that's a nice number)
351
- } else {
352
- let fee = $old_feerate * $predicted_weight / 750 ;
353
- if $amount <= fee {
354
- log_trace!( logger, "Can't 25% bump new claiming tx, amount {} is too small" , $amount) ;
355
- return None ;
356
- }
357
- fee
358
- } ;
359
-
360
- let previous_fee = $old_feerate * $predicted_weight / 1000 ;
361
- let min_relay_fee = MIN_RELAY_FEE_SAT_PER_1000_WEIGHT * $predicted_weight / 1000 ;
362
- // BIP 125 Opt-in Full Replace-by-Fee Signaling
363
- // * 3. The replacement transaction pays an absolute fee of at least the sum paid by the original transactions.
364
- // * 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.
365
- let new_fee = if new_fee < previous_fee + min_relay_fee {
366
- new_fee + previous_fee + min_relay_fee - new_fee
367
- } else {
368
- new_fee
369
- } ;
370
- Some ( ( new_fee, new_fee * 1000 / $predicted_weight) )
371
- }
372
- }
373
- }
374
-
375
302
// Compute new height timer to decide when we need to regenerate a new bumped version of the claim tx (if we
376
303
// didn't receive confirmation of it before, or not enough reorg-safe depth on top of it).
377
304
let new_timer = Some ( Self :: get_height_timer ( height, cached_request. absolute_timelock ) ) ;
@@ -380,28 +307,14 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
380
307
if amt == 0 { dynamic_fee = false ; }
381
308
if dynamic_fee {
382
309
let predicted_weight = cached_request. content . package_weight ( & self . destination_script ) ;
383
- let mut new_feerate;
384
- // If old feerate is 0, first iteration of this claim, use normal fee calculation
385
- if cached_request. feerate_previous != 0 {
386
- if let Some ( ( new_fee, feerate) ) = RBF_bump ! ( amt, cached_request. feerate_previous, fee_estimator, predicted_weight as u64 ) {
387
- // If new computed fee is superior at the whole claimable amount burn all in fees
388
- if new_fee > amt {
389
- amt = 0 ;
390
- } else {
391
- amt = amt - new_fee;
392
- }
393
- new_feerate = feerate;
394
- } else { return None ; }
395
- } else {
396
- if subtract_high_prio_fee ! ( logger, fee_estimator, amt, predicted_weight, new_feerate) {
397
- } else { return None ; }
398
- }
399
- assert ! ( new_feerate != 0 ) ;
310
+ if let Some ( ( output_value, new_feerate) ) = onchain_utils:: compute_output_value ( predicted_weight, amt, cached_request. feerate_previous , & fee_estimator, & logger) {
311
+ assert ! ( new_feerate != 0 ) ;
400
312
401
- let transaction = cached_request. content . package_finalize ( self , amt, self . destination_script . clone ( ) , & logger) . unwrap ( ) ;
402
- log_trace ! ( logger, "...with timer {} and feerate {}" , new_timer. unwrap( ) , new_feerate) ;
403
- assert ! ( predicted_weight >= transaction. get_weight( ) ) ;
404
- return Some ( ( new_timer, new_feerate, transaction) )
313
+ let transaction = cached_request. content . package_finalize ( self , output_value, self . destination_script . clone ( ) , & logger) . unwrap ( ) ;
314
+ log_trace ! ( logger, "...with timer {} and feerate {}" , new_timer. unwrap( ) , new_feerate) ;
315
+ assert ! ( predicted_weight >= transaction. get_weight( ) ) ;
316
+ return Some ( ( new_timer, new_feerate, transaction) )
317
+ }
405
318
} else {
406
319
if let Some ( transaction) = cached_request. content . package_finalize ( self , amt, self . destination_script . clone ( ) , & logger) {
407
320
return Some ( ( None , self . local_commitment . as_ref ( ) . unwrap ( ) . feerate_per_kw , transaction) ) ;
0 commit comments