Skip to content

Commit b63b336

Browse files
committed
Test that the excess fees of non-dust htlcs count towards the dust limit
1 parent b677a0c commit b63b336

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed

lightning/src/ln/functional_tests.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10518,28 +10518,37 @@ fn test_max_dust_htlc_exposure() {
1051810518
}
1051910519

1052010520
#[test]
10521-
fn test_nondust_htlc_fees_are_dust() {
10522-
// Test that the transaction fees paid in nondust HTLCs count towards our dust limit
10521+
fn test_nondust_htlc_excess_fees_are_dust() {
10522+
// Test that the excess transaction fees paid in nondust HTLCs count towards our dust limit
10523+
const DEFAULT_FEERATE: u32 = 253;
10524+
const HIGH_FEERATE: u32 = 275;
10525+
const EXCESS_FEERATE: u32 = HIGH_FEERATE - DEFAULT_FEERATE;
1052310526
let chanmon_cfgs = create_chanmon_cfgs(3);
10527+
{
10528+
// Set the feerate of the channel funder above the `dust_exposure_limiting_feerate` of
10529+
// the fundee. This delta means that the fundee will add the mining fees of the commitment and
10530+
// htlc transactions in excess of its `dust_exposure_limiting_feerate` to its total dust htlc
10531+
// exposure.
10532+
let mut feerate_lock = chanmon_cfgs[1].fee_estimator.sat_per_kw.lock().unwrap();
10533+
*feerate_lock = HIGH_FEERATE;
10534+
}
1052410535
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
1052510536

1052610537
let mut config = test_default_channel_config();
1052710538
// Set the dust limit to the default value
1052810539
config.channel_config.max_dust_htlc_exposure =
1052910540
MaxDustHTLCExposure::FeeRateMultiplier(10_000);
1053010541
// Make sure the HTLC limits don't get in the way
10531-
config.channel_handshake_limits.min_max_accepted_htlcs = 400;
10532-
config.channel_handshake_config.our_max_accepted_htlcs = 400;
10542+
config.channel_handshake_limits.min_max_accepted_htlcs = chan_utils::MAX_HTLCS;
10543+
config.channel_handshake_config.our_max_accepted_htlcs = chan_utils::MAX_HTLCS;
1053310544
config.channel_handshake_config.our_htlc_minimum_msat = 1;
10545+
config.channel_handshake_config.max_inbound_htlc_value_in_flight_percent_of_channel = 100;
1053410546

1053510547
let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[Some(config), Some(config), Some(config)]);
1053610548
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
1053710549

10538-
// Create a channel from 1 -> 0 but immediately push all of the funds towards 0
10539-
let chan_id_1 = create_announced_chan_between_nodes(&nodes, 1, 0).2;
10540-
while nodes[1].node.list_channels()[0].next_outbound_htlc_limit_msat > 0 {
10541-
send_payment(&nodes[1], &[&nodes[0]], nodes[1].node.list_channels()[0].next_outbound_htlc_limit_msat);
10542-
}
10550+
// Leave enough on the funder side to let it pay the mining fees for a commit tx with tons of htlcs
10551+
let chan_id_1 = create_announced_chan_between_nodes_with_value(&nodes, 1, 0, 1_000_000, 750_000_000).2;
1054310552

1054410553
// First get the channel one HTLC_VALUE HTLC away from the dust limit by sending dust HTLCs
1054510554
// repeatedly until we run out of space.
@@ -10561,14 +10570,13 @@ fn test_nondust_htlc_fees_are_dust() {
1056110570

1056210571
// At this point we have somewhere between dust_limit and dust_limit * 2 left in our dust
1056310572
// exposure limit, and we want to max that out using non-dust HTLCs.
10564-
let commitment_tx_per_htlc_cost =
10565-
htlc_success_tx_weight(&ChannelTypeFeatures::empty()) * 253;
10573+
let commitment_tx_per_htlc_cost = chan_utils::per_outbound_htlc_counterparty_commit_tx_fee_msat(EXCESS_FEERATE, &ChannelTypeFeatures::empty());
1056610574
let max_htlcs_remaining = dust_limit * 2 / commitment_tx_per_htlc_cost;
10567-
assert!(max_htlcs_remaining < 30,
10575+
assert!(max_htlcs_remaining < chan_utils::MAX_HTLCS.into(),
1056810576
"We should be able to fill our dust limit without too many HTLCs");
1056910577
for i in 0..max_htlcs_remaining + 1 {
1057010578
assert_ne!(i, max_htlcs_remaining);
10571-
if nodes[0].node.list_channels()[0].next_outbound_htlc_limit_msat < dust_limit {
10579+
if nodes[0].node.list_channels()[0].next_outbound_htlc_limit_msat <= dust_limit {
1057210580
// We found our limit, and it was less than max_htlcs_remaining!
1057310581
// At this point we can only send dust HTLCs as any non-dust HTLCs will overuse our
1057410582
// remaining dust exposure.

0 commit comments

Comments
 (0)