Skip to content

Expose current dust exposure in ChannelDetails#4470

Open
Bortlesboat wants to merge 3 commits intolightningdevkit:mainfrom
Bortlesboat:feat/expose-dust-exposure
Open

Expose current dust exposure in ChannelDetails#4470
Bortlesboat wants to merge 3 commits intolightningdevkit:mainfrom
Bortlesboat:feat/expose-dust-exposure

Conversation

@Bortlesboat
Copy link

Summary

Adds a current_dust_exposure_msat field to ChannelDetails that surfaces the current total dust exposure on a channel.

  • The value is the maximum of the dust exposure across the holder and counterparty commitment transactions
  • Includes both dust HTLC values and the commitment transaction fee component (as noted by @TheBlueMatt in Expose current dust exposure #2264, dust exposure now includes commitment tx fees, not just dust HTLCs)
  • Users can compare this against ChannelConfig::max_dust_htlc_exposure to monitor how close a channel is to its dust limit
  • Field is Option<u64>, None for objects serialized prior to 0.2.1
  • TLV tag 49 for backwards-compatible serialization

Implementation

  1. Added dust_exposure_msat to AvailableBalances — computed as max(local_dust_exposure_msat, remote_dust_exposure_msat) in get_available_balances (tx_builder.rs)
  2. When folding across multiple funding scopes (splices), takes the max dust exposure
  3. Added current_dust_exposure_msat: Option<u64> to ChannelDetails struct, populated from the balance computation in from_channel

Fixes #2264

@ldk-reviews-bot
Copy link

ldk-reviews-bot commented Mar 8, 2026

👋 I see @tankyleo was un-assigned.
If you'd like another reviewer assignment, please click here.

@Bortlesboat Bortlesboat force-pushed the feat/expose-dust-exposure branch from 06585ba to c571ad4 Compare March 9, 2026 01:31
@tankyleo tankyleo requested review from tankyleo and removed request for valentinewallace March 9, 2026 11:18
@Bortlesboat Bortlesboat force-pushed the feat/expose-dust-exposure branch from c571ad4 to 4f9b1e5 Compare March 9, 2026 18:25
@codecov
Copy link

codecov bot commented Mar 9, 2026

Codecov Report

❌ Patch coverage is 75.00000% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.18%. Comparing base (4a3aaef) to head (40ce774).
⚠️ Report is 92 commits behind head on main.

Files with missing lines Patch % Lines
lightning/src/ln/channel_state.rs 66.66% 1 Missing ⚠️
lightning/src/routing/router.rs 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4470      +/-   ##
==========================================
+ Coverage   86.01%   86.18%   +0.16%     
==========================================
  Files         159      160       +1     
  Lines      105430   107546    +2116     
  Branches   105430   107546    +2116     
==========================================
+ Hits        90690    92689    +1999     
- Misses      12229    12230       +1     
- Partials     2511     2627     +116     
Flag Coverage Δ
tests 86.18% <75.00%> (+0.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ldk-reviews-bot
Copy link

🔔 1st Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@Bortlesboat
Copy link
Author

Quick follow-up from my side: I’m treating review-required PRs as top priority this week. If you want any specific changes, rebase, or split, I can turn them around quickly.

@Bortlesboat Bortlesboat force-pushed the feat/expose-dust-exposure branch from 4f9b1e5 to 03c307d Compare March 13, 2026 04:41
@ldk-reviews-bot
Copy link

🔔 2nd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

Add current_dust_exposure_msat field to ChannelDetails that surfaces
the total dust exposure including both dust HTLC values and the
commitment transaction fee component. This is the maximum of the
holder and counterparty commitment transaction dust exposures.

Users can compare this value against max_dust_htlc_exposure in
ChannelConfig to understand how close a channel is to its dust
exposure limit without needing internal channel access.

Fixes lightningdevkit#2264
@Bortlesboat Bortlesboat force-pushed the feat/expose-dust-exposure branch from 03c307d to b856d80 Compare March 15, 2026 18:19
@ldk-claude-review-bot
Copy link
Collaborator

ldk-claude-review-bot commented Mar 15, 2026

I've completed a thorough review of all files in this diff. The implementation is correct:

  • The dust exposure computation (max(local, remote)) in tx_builder.rs properly captures the worst-case dust exposure across both commitment transactions.
  • The fold across funding scopes using .max() is consistent with how a user would want to see the highest risk exposure.
  • TLV tag 49 (odd = optional) is correctly ordered after tag 47 for backwards-compatible serialization.
  • The error fallback path (dust_exposure_msat: 0) is consistent with how other fields default in that same block.
  • The serialization round-trip test and all test fixture updates are correct.

The only issue from my prior review (version string format) was partially addressed — changed from the wrong version "0.2.1" to "0.3", but the format still doesn't match the convention used by every other field in the file ("0.3.0", "0.2.0", "0.0.122", etc.). Since this was already flagged in the prior review pass, I'm not re-posting it.

No new issues found. The prior inline comment about the version format ("0.3" → "0.3.0" for consistency) remains partially unaddressed but was already flagged.

@ldk-reviews-bot
Copy link

🔔 3rd Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@Bortlesboat
Copy link
Author

Hi @tankyleo — no worries if you're busy! Could another maintainer pick this up? Happy to address any feedback quickly.

@ldk-reviews-bot
Copy link

🔔 4th Reminder

Hey @tankyleo! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@TheBlueMatt TheBlueMatt removed the request for review from tankyleo March 19, 2026 20:41
Copy link
Contributor

@tankyleo tankyleo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay

outbound_capacity_msat,
next_outbound_htlc_limit_msat: available_capacity_msat,
next_outbound_htlc_minimum_msat,
dust_exposure_msat,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TheBlueMatt it's a current quirk of the tx_buider API we currently report the dust exposure on the commitment that matches the local: bool parameter in NextCommitmentStats. With this PR we'd now also take the max of both the local and the remote commitments here, and report it in AvailableBalances.

Seems ok to me for now.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mmm, its weird that we return available_balances from get_channel_stats ignoring the local parameter but its true for the whole balances struct so...oh well.

/// [`ChannelConfig::max_dust_htlc_exposure`] to determine whether new HTLCs can be
/// accepted or offered on this channel.
///
/// This field will be `None` for objects serialized with LDK versions prior to 0.2.1.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The version here says "prior to 0.2.1" but Cargo.toml has version = "0.3.0+git", so this field will first appear in 0.3.0. The previous field (funding_redeem_script) correctly says "prior to 0.2.0".

Suggested change
/// This field will be `None` for objects serialized with LDK versions prior to 0.2.1.
/// This field will be `None` for objects serialized with LDK versions prior to 0.3.0.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, claude is right - this will be shipped in 0.3. We should write "0.3" here (not "0.3.0", though).

@Bortlesboat
Copy link
Author

Hi — tankyleo appears to be unavailable (4 reminders sent). Could another reviewer pick this up? It's a small addition exposing dust exposure values that are already computed internally. Happy to address any feedback.

Copy link
Collaborator

@TheBlueMatt TheBlueMatt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two small things, one that actually needs fixing, otherwise we'll land this. Thanks!

/// [`ChannelConfig::max_dust_htlc_exposure`] to determine whether new HTLCs can be
/// accepted or offered on this channel.
///
/// This field will be `None` for objects serialized with LDK versions prior to 0.2.1.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, claude is right - this will be shipped in 0.3. We should write "0.3" here (not "0.3.0", though).

/// threshold as well as any excess commitment transaction fees that contribute to dust
/// exposure.
///
/// See [`ChannelConfig::max_dust_htlc_exposure`] for the config knob that limits this.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit

Suggested change
/// See [`ChannelConfig::max_dust_htlc_exposure`] for the config knob that limits this.
/// See [`ChannelConfig::max_dust_htlc_exposure`] for more information on the dust calculation and to configure a limit.

outbound_capacity_msat,
next_outbound_htlc_limit_msat: available_capacity_msat,
next_outbound_htlc_minimum_msat,
dust_exposure_msat,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mmm, its weird that we return available_balances from get_channel_stats ignoring the local parameter but its true for the whole balances struct so...oh well.

Fix version string to 0.3 (not 0.2.1) and improve doc wording
for dust_exposure_msat per TheBlueMatt's review.
Copy link
Collaborator

@TheBlueMatt TheBlueMatt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please feel free to squash the fixup commits down so that the git history only contains the one main commit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expose current dust exposure

5 participants