@@ -9515,7 +9515,7 @@ enum ExposureEvent {
9515
9515
AtUpdateFeeOutbound ,
9516
9516
}
9517
9517
9518
- fn do_test_max_dust_htlc_exposure ( dust_outbound_balance : bool , exposure_breach_event : ExposureEvent , on_holder_tx : bool ) {
9518
+ fn do_test_max_dust_htlc_exposure ( dust_outbound_balance : bool , exposure_breach_event : ExposureEvent , on_holder_tx : bool , multiplier_dust_limit : bool ) {
9519
9519
// Test that we properly reject dust HTLC violating our `max_dust_htlc_exposure_msat`
9520
9520
// policy.
9521
9521
//
@@ -9530,7 +9530,12 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
9530
9530
9531
9531
let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
9532
9532
let mut config = test_default_channel_config ( ) ;
9533
- config. channel_config . max_dust_htlc_exposure_msat = MaxDustHTLCExposure :: FixedLimitMsat ( 5_000_000 ) ; // default setting value
9533
+ config. channel_config . max_dust_htlc_exposure_msat = if multiplier_dust_limit {
9534
+ // Default test fee estimator rate is 253 sat/kw, so we set the multiplier to 5_000_000 / 253
9535
+ // to get roughly the same initial value as the default setting when this test was
9536
+ // originally written.
9537
+ MaxDustHTLCExposure :: FeeRateMultiplier ( 5_000_000 / 253 )
9538
+ } else { MaxDustHTLCExposure :: FixedLimitMsat ( 5_000_000 ) } ; // initial default setting value
9534
9539
let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
9535
9540
let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ Some ( config) , None ] ) ;
9536
9541
let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
@@ -9581,6 +9586,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
9581
9586
( chan. context . get_dust_buffer_feerate ( None ) as u64 ,
9582
9587
chan. context . get_max_dust_htlc_exposure_msat ( & LowerBoundedFeeEstimator ( nodes[ 0 ] . fee_estimator ) ) )
9583
9588
} ;
9589
+
9584
9590
let dust_outbound_htlc_on_holder_tx_msat: u64 = ( dust_buffer_feerate * htlc_timeout_tx_weight ( opt_anchors) / 1000 + open_channel. dust_limit_satoshis - 1 ) * 1000 ;
9585
9591
let dust_outbound_htlc_on_holder_tx: u64 = max_dust_htlc_exposure_msat / dust_outbound_htlc_on_holder_tx_msat;
9586
9592
@@ -9640,7 +9646,7 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
9640
9646
) , true , APIError :: ChannelUnavailable { .. } , { } ) ;
9641
9647
}
9642
9648
} else if exposure_breach_event == ExposureEvent :: AtHTLCReception {
9643
- let ( route, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( nodes[ 1 ] , nodes[ 0 ] , if on_holder_tx { dust_inbound_htlc_on_holder_tx_msat } else { dust_htlc_on_counterparty_tx_msat + 1 } ) ;
9649
+ let ( route, payment_hash, _, payment_secret) = get_route_and_payment_hash ! ( nodes[ 1 ] , nodes[ 0 ] , if on_holder_tx { dust_inbound_htlc_on_holder_tx_msat } else { dust_htlc_on_counterparty_tx_msat + 4 } ) ;
9644
9650
nodes[ 1 ] . node . send_payment_with_route ( & route, payment_hash,
9645
9651
RecipientOnionFields :: secret_only ( payment_secret) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
9646
9652
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
@@ -9658,13 +9664,19 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
9658
9664
// Outbound dust balance: 5200 sats
9659
9665
nodes[ 0 ] . logger . assert_log ( "lightning::ln::channel" . to_string ( ) ,
9660
9666
format ! ( "Cannot accept value that would put our exposure to dust HTLCs at {} over the limit {} on counterparty commitment tx" ,
9661
- dust_htlc_on_counterparty_tx_msat * ( dust_htlc_on_counterparty_tx - 1 ) + dust_htlc_on_counterparty_tx_msat + 1 ,
9667
+ dust_htlc_on_counterparty_tx_msat * ( dust_htlc_on_counterparty_tx - 1 ) + dust_htlc_on_counterparty_tx_msat + 4 ,
9662
9668
max_dust_htlc_exposure_msat) , 1 ) ;
9663
9669
}
9664
9670
} else if exposure_breach_event == ExposureEvent :: AtUpdateFeeOutbound {
9665
9671
route. paths [ 0 ] . hops . last_mut ( ) . unwrap ( ) . fee_msat = 2_500_000 ;
9666
- nodes[ 0 ] . node . send_payment_with_route ( & route, payment_hash,
9667
- RecipientOnionFields :: secret_only ( payment_secret) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
9672
+ // For the multiplier dust exposure limit, since it scales with feerate,
9673
+ // we need to add a lot of HTLCs that will become dust at the new feerate
9674
+ // to cross the threshold.
9675
+ for _ in 0 ..20 {
9676
+ let ( _, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 1 ] , Some ( 1_000 ) , None ) ;
9677
+ nodes[ 0 ] . node . send_payment_with_route ( & route, payment_hash,
9678
+ RecipientOnionFields :: secret_only ( payment_secret) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
9679
+ }
9668
9680
{
9669
9681
let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
9670
9682
* feerate_lock = * feerate_lock * 10 ;
@@ -9679,20 +9691,25 @@ fn do_test_max_dust_htlc_exposure(dust_outbound_balance: bool, exposure_breach_e
9679
9691
added_monitors. clear ( ) ;
9680
9692
}
9681
9693
9694
+ fn do_test_max_dust_htlc_exposure_by_threshold_type ( multiplier_dust_limit : bool ) {
9695
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCForward , true , multiplier_dust_limit) ;
9696
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCForward , true , multiplier_dust_limit) ;
9697
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCReception , true , multiplier_dust_limit) ;
9698
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCReception , false , multiplier_dust_limit) ;
9699
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCForward , false , multiplier_dust_limit) ;
9700
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCReception , false , multiplier_dust_limit) ;
9701
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCReception , true , multiplier_dust_limit) ;
9702
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCForward , false , multiplier_dust_limit) ;
9703
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtUpdateFeeOutbound , true , multiplier_dust_limit) ;
9704
+ do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtUpdateFeeOutbound , false , multiplier_dust_limit) ;
9705
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtUpdateFeeOutbound , false , multiplier_dust_limit) ;
9706
+ do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtUpdateFeeOutbound , true , multiplier_dust_limit) ;
9707
+ }
9708
+
9682
9709
#[ test]
9683
9710
fn test_max_dust_htlc_exposure ( ) {
9684
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCForward , true ) ;
9685
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCForward , true ) ;
9686
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCReception , true ) ;
9687
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCReception , false ) ;
9688
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCForward , false ) ;
9689
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCReception , false ) ;
9690
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtHTLCReception , true ) ;
9691
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtHTLCForward , false ) ;
9692
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtUpdateFeeOutbound , true ) ;
9693
- do_test_max_dust_htlc_exposure ( true , ExposureEvent :: AtUpdateFeeOutbound , false ) ;
9694
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtUpdateFeeOutbound , false ) ;
9695
- do_test_max_dust_htlc_exposure ( false , ExposureEvent :: AtUpdateFeeOutbound , true ) ;
9711
+ do_test_max_dust_htlc_exposure_by_threshold_type ( false ) ;
9712
+ do_test_max_dust_htlc_exposure_by_threshold_type ( true ) ;
9696
9713
}
9697
9714
9698
9715
#[ test]
0 commit comments