Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); 0.2 backports by TheBlueMatt · Pull Request #4221 · lightningdevkit/rust-lightning · GitHub
Skip to content

0.2 backports - #4221

Merged
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release
Nov 12, 2025
Merged

0.2 backports#4221
TheBlueMatt merged 25 commits into
lightningdevkit:0.2from
TheBlueMatt:2025-11-0.2-backports-release

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Nov 12, 2025

Copy link
Copy Markdown
Collaborator

Hopefully the final set. This backports #4200, #4201, #4203, #4208, #4204, and #4219. Plus an MSRV pin.

TheBlueMattand others added 23 commits November 3, 2025 21:41
In c084767 we a
`ChainMonitor::new_async_beta` and a corresponding
`MonitorUpdatingPersisterAsync` struct. To avoid circular
references, the `ChainMonitor` owns the
`MonitorUpdatingPersisterAsync` which uses a `FutureSpawner` to let
async writes happen in the background after it returns control flow
ownership to the `ChainMonitor`. This is great, except that because
`MonitorUpdatingPersisterAsync` thus doesn't have a reference to
the `ChainMonitor`, we have to poll for completion of the futures.
We do so in the new `Persist::get_and_clear_completed_updates` that
was added in the above-referenced commit. But on async monitor
write completion we're supposed to call `ChainMonitor`'s
`event_notifier.notify()` (ultimately waking up the background
processor which `await`s the corresponding update future). This
didn't happen in the new async flow.
Here we move `ChainMonitor`'s `event_notifier` into an `Arc` and
pass a reference to it through to the
`MonitorUpdatingPersisterAsync` which can then directly `notify()`
it and wake the background processor.
Backport of 092a50a
Previously, we would also prune any pending `GetInfo` or expired `Buy`
requests before we `persist`. This could have lead to races where we
drop a pending request and even remove the peer when calling `persist`.
Here, we simply split the pruning logic for the `pending_requests` and
expired JIT channel state, and only prune the latter before persisting.
This generally makes sense, as `pending_requests` isn't currently
persisted, so there is no need to prune before repersisting.
Both are however still pruned on peer disconnection.
Backport of 5f8c54a
The details of these errors aren't particularly relevant, and its
not worth the effort of exporting them, so we just mark them
no-export here.
Backport of 16aabce
As move semantics do not map to bindings, the BOLT 12 object
builders are marked no-export. In the new `OffersMesageFlow`, here,
we also mark the methods which return these builders as no-export.
Backport of 7fb0f2a
Trivial conflicts resolved in:
* lightning/src/offers/flow.rs
Methods like `StaticInvoice::sign` have their own signing-function
traits, so there's no actual need to use `SignFn` directly, its
just a useful generic wrapper. Sadly, because it uses `AsRef`
bounds, which aren't really practical to map in bindings, we can't
really expose it directly in bindings. Because there's an
alternative and its tricky to expose, we simply mark it no-export
here.
Backport of 2bf737c
We do not currently support async traits or methods in our
home-grown bindings logic, so here mark them no-export.
Backport of 3f82fd6
Rather than importing `ChannelTransactionParameters` via the `use`
in `lightning::sign`, import it via its real path in
`lightning::sign::ecdsa`. This makes reading the code (incredibly
marginally) simpler, but also makes the bindings generator happy.
Backport of b07111e
In 0.2 we added new `LengthLimitedRead` and `LengthReadable`
traits, but forgot to copy the no-export tags from the existing
`Read` and `Readable` traits. Here we add the missing tags.
Backport of 8eabcc1
This avoids confusing the bindings generator.
Backport of 126ac50
When we added the async traits and wrapper structs for the
transaction-bumping logic, we didn't bother copying the
documentation to the sync wrappers as we figured the links
sufficed. Sadly, however, this means that our bindings logic will
have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
We also fix one bogus link in `Wallet`'s docs.
Backport of c311447
When we added the async trait for `KVStore`, we didn't bother
copying the documentation to the sync wrappers as we figured the
links sufficed. Sadly, however, this means that our bindings logic
will have no docs but a broken link to an async object that doesn't
exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 9516400
When we added the async wrapper for `OutputSweeper`, we didn't
bother copying the documentation to the sync wrappers as we figured
the links sufficed. Sadly, however, this means that our bindings
logic will have no docs but a broken link to an async object that
doesn't exist.
Instead, here, we copy the docs from the async objects to the sync
ones, at least leaving behind a comment noting that both need
updating whenever one gets updated.
Backport of 4bc993c
When estimating signature weight, 73 WU was used in some places while 72
WU was used in others. Consistently use 72 WU and replace hardcoded
values with constants. 73 WU signatures are non-standard and won't be
produced by LDK. Additionally, using 73 WU along with grind_signatures
adjustment is nonsensical.
Backport of eb341de
When estimating the splice funding transaction fees, adjust for
grind_signatures. Since LDK supplies one of the signatures, only adjust
by 1 WU even though spending the shared input requires two signatures.
Backport of 4698026
The interactive-tx construction protocol uses an agreed upon fee rate.
Since the bitcoind coin selection algorithm may underpay fees when no
change output is needed, providing a tolerance when checking if the
remote's fee contribution could avoid some unexpected failures. This
commit introduces a 95% tolerance similar to Eclair.
Backport of 3aa4574
The interactive-tx construction protocol needs to make sure the
constructed transaction does not exceed MAX_STANDARD_TX_WEIGHT. A naive
estimate of the transaction weight after signing was used, but was not
accurate. Specifically, it double-counted EMPTY_SCRIPT_SIG_WEIGHT and
didn't include SEGWIT_MARKER_FLAG_WEIGHT.
Backport of b4803c7
Useful for re-using code producing a FundingTxInput set to implement
CoinSelectionSource.
Backport of 2330ed9
Upon processing the counterparty's initial `commitment_signed` for a
splice, we queue a monitor update with the new commitment transactions
spending the new funding transaction. Once handled, funding transaction
signatures can be exchanged and we must start monitoring the chain for a
possible commitment transaction broadcast spending the new funding
transaction. Aborting the splice negotiation then would therefore be
unsafe, hence why we currently force close in such cases. However, there
is no reason to force close prior to receiving their initial
`commitment_signed`, as this would imply the funding transaction
signatures have yet to be exchanged, thus making a commitment broadcast
spending said transaction impossible allowing us to abort the splice
negotiation safely.
Backport of d282a47
When we propose quiescence due to a user initiated action, such as a
splice, it's possible that the `stfu` message is not ready to be sent
out yet due to the state machine pending a change. This would result in
an error communicated back to the caller of
`ChannelManager::splice_channel`, but this is unnecessary and confusing,
the splice is still pending and will be carried out once quiescence is
eventually negotiated.
Backport of c2b15c2
We incorrectly assumed that both commitments must be at the same height,
but this is certainly possible whenever updates are proposed in both
directions at the same time.
Backport of a6ed667
This method was originally intended to DRY the logic between
`FundedChannel` and `PendingChannelV2` when handling
`funding_tx_constructed`, though it's not very useful anymore.
Backport of 25264d7
@TheBlueMattTheBlueMatt added this to the 0.2 milestone Nov 12, 2025
@ldk-reviews-bot

ldk-reviews-bot commented Nov 12, 2025

Copy link
Copy Markdown

I've assigned @valentinewallace as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

Splicing should also have fuzz coverage, and it depends on the
quiescence protocol.
Backport of 1e78628
@codecov

codecovBot commented Nov 12, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.24316% with 65 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.87%. Comparing base (ec06df0) to head (03eea88).
⚠️ Report is 26 commits behind head on 0.2.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs59.74%31 Missing ⚠️
lightning/src/ln/channel.rs80.16%14 Missing and 10 partials ⚠️
lightning/src/ln/functional_test_utils.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/funding.rs42.85%4 Missing ⚠️
lightning/src/ln/splicing_tests.rs97.05%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## 0.2 #4221 +/- ##
========================================
Coverage 88.86% 88.87% ========================================
Files 180 180 Lines 137802 138000 +198 Branches 137802 138000 +198 ========================================
+ Hits 122456 122645 +189 + Misses 12534 12533 -1 - Partials 2812 2822 +10 
FlagCoverage Δ
fuzzing20.84% <3.07%> (-0.03%)⬇️
tests88.71% <80.24%> (+<0.01%)⬆️

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.

@TheBlueMatt
TheBlueMattforce-pushed the 2025-11-0.2-backports-release branch from c91b14c to 03eea88CompareNovember 12, 2025 19:20
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Just gonna land this even though the fuzz build is still failing due to MSRV. We'll bump the crate version still before 0.2 so can fix it then.

@TheBlueMatt
TheBlueMatt merged commit 1daf93d into lightningdevkit:0.2Nov 12, 2025
24 of 25 checks passed
Sign up for freeto 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.

5 participants

@TheBlueMatt@ldk-reviews-bot@wpaulino@tnull@jkczyz