LDK
← All projectsLightning Dev Kit

rust-lightning

Composable Rust libraries for building Lightning wallets, nodes, and services.

BitcoinCryptographic librariesLightning NetworkNormal
Repository coverage

1655 commits in the local evidence base

Every captured commit receives deterministic security triage and a separate communication-quality score. Security candidates and broader second-pass signals receive full-patch Ollama analysis.

249security candidates223second-pass queue1517AI analyses
84commits · 30 days
194commits · 60 days
565commits · 180 days
1253commits · 365 days
Backfill bands
Aug 5 → Feb 6819 seen18 candidatesComplete
Feb 6 → Jun 6468 seen16 candidatesComplete
Jun 6 → Jul 6128 seen8 candidatesComplete
Jul 6 → Aug 561 seen3 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

70/100 average clarity
470Strong · 80–100
830Adequate · 60–79
293Thin · 40–59
62Opaque · 0–39
3security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
Elias Rohrer15315153667
Matt Corallo43452370574
Jeffrey Czyz19545182169
Wilmer Paulino15945155169
Leo Nash11613116162
Valentine Wallace14010135169
Vincenzo Palazzo11311183
Joost Jager16224162069
elnosh371331057
auto-pr-bot2478087
shaavan22622069
Carla Kirk-Cohen78366068
Analysis record

Published AI watches

Last scanned 11 minutes ago

Informational 19 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'tx-sync: Parallelize esplora status queries' (#4913)

This commit rewrites how a Lightning wallet talks to Esplora block-explorer servers so that many status checks happen in parallel instead of one at a time. It is a performance/refactoring change. There is no direct evidence in the commit t…

Concurrency/timing change in transaction confirmation logicNew inconsistency check preserved when a previously-confirmed tx is reported unconfirmedAdded defensive error path for missing pre-fetched block status
c303f515by Matt Corallo+140−371 file
No security note in commit
Low 30 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Skip Electrum creator transaction downloads' (#4992)

This change stops the Electrum-based transaction sync client from downloading the very transaction that created an output it is watching. Previously, the client could request that transaction from Electrum, even though a transaction can ne…

Avoids unnecessary Electrum transaction.get requests for watched outputsReduces information disclosure to Electrum server about watched outpointsAdds regression test verifying request suppression
c36e50cbby Matt Corallo+142−02 files
No security note in commit
Low 44 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Use preferred sPK of watched txn in electrum, not rand ones' (#4867)

This change improves how the Lightning Dev Kit's Electrum and Esplora transaction-sync clients track watched Bitcoin transactions. Previously, the code ignored the script pubkey (the 'address' associated with a transaction) supplied when r…

Previously ignored `script_pubkey` argument in `register_tx` for transaction watchersElectrum script-history queries previously used an arbitrary transaction output, which could be OP_RETURN and therefore unindexed by some Electrum serversNew logic prefers caller-supplied script pubkey and falls back to non-OP_RETURN outputs
bfe5ca89by tnull+52−243 files
No security note in commit
Low 33 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Serialize transient Event variants; move persist decision into ChannelManager' (#4791)

This commit changes how LDK stores pending event notifications. It adds serialization support for several event types that previously were not fully saved to disk, and introduces a helper method so the code can decide which events are wort…

Data-loss prevention: previously non-round-trippable event variants are now fully serialized, avoiding accidental event loss when users serialize Event queues themselvesState-consistency hardening: ChannelManager now explicitly skips events that describe non-surviving restart state, preventing replay of stale eventsDefensive assertion: debug builds assert that every persisted event round-trips to Some(event), catching serialization mismatches
a0d4632eby Matt Corallo+694−818 files
No security note in commit
Informational 15 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Document that funding signing events can go stale' (#4960)

This commit only adds documentation comments to two source files. It explains that certain funding-signing events can become stale if the underlying negotiation fails, and that callers may see specific harmless errors as a result. No code …

26eecf2dby Matt Corallo+15−02 files
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Drop the honggfuzz version pin from the CI fuzz job

This commit removes a fixed-version pin for the honggfuzz fuzzing tool in a continuous-integration script. The project now uses the current release of honggfuzz instead of an older pinned version. There is no change to the actual Lightning…

4a1635efby auto-pr-bot+1−51 file
No security note in commit
Informational 15 AI analysisMessage 86 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Run the CI fuzz job on the stable toolchain

This commit changes the Rust toolchain used in the continuous integration (CI) fuzzing job from a fixed older version (1.75) to the latest stable release. It is purely a build/test infrastructure change to fix a dependency compatibility is…

21c4ed2bby auto-pr-bot+3−32 files
No security note in commit
Informational 19 AI analysisMessage 91 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Expose the dummy-hop tail constructor publicly

This commit makes a previously internal helper function public so that outside developers can build dummy-hop tails for blinded payment paths without recreating the logic themselves. It is an API usability change, not a fix for a known sec…

No security-relevant behavior change in the diffAPI visibility broadened from crate-public to publicCLTV expiry overflow check already present and unchanged
c5443353by auto-pr-bot+14−71 file
No security note in commit
Moderate 54 AI analysisMessage 100 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Fail commitment sig verification without counterparty params

This change adds a safety check in a Bitcoin Lightning Network library (LDK). Previously, if the software tried to verify a peer's commitment signature before it had learned the peer's channel parameters, it could crash with a panic. Now i…

Defensive check added on peer-driven code path to prevent panicMissing counterparty_parameters could previously cause panic during commitment transaction constructionChannel closure returned instead of panic
de7ecc2fby auto-pr-bot+24−01 file
Vendor flagged security relevance
Informational 15 AI analysisMessage 100 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Clarify the commitment validation failure message

This commit only changes the wording of an error message sent to peers when a commitment transaction fails validation. It replaces the vague phrase 'Failed to validate our commitment' with the clearer 'Received commitment failed validation…

3284a006by auto-pr-bot+11−114 files
No security note in commit
Moderate 61 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Move holder commit sig checks to `InMemorySigner`' (#4885)

This commit moves the checks that validate a counterparty's signatures on the holder's commitment and HTLC transactions out of the general channel code and into the signer module (InMemorySigner). Previously, these signature checks were do…

Moved signature validation from channel state machine into signer moduleAdded new tests that corrupt signatures and verify rejectionChanged error message from 'Invalid commitment tx signature from peer' / 'Invalid funding_created signature from peer' to 'Failed to validate our commitment'
83f5ba55by Matt Corallo+626−31024 files
No security note in commit
Low 42 AI analysisMessage 86 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Drop stale splice signature on disconnect' (#4954)

This change fixes a Lightning channel splicing bug: when two peers temporarily disconnect during a splice, any half-finished signature the other side already sent is now discarded. Before the fix, that stale signature could be reused after…

State-invalidation bug in multi-step protocol (splice negotiation)Stale cryptographic signature not cleared on disconnectPotential reuse of old commitment state after reconnect
c9a77251by Matt Corallo+22−12 files
No security note in commit
Moderate 58 AI analysisMessage 73 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Drop stale splice signature on disconnect

This fix prevents a Lightning channel from being accidentally force-closed. During a splice (a way to resize a payment channel), one side's initial signature could be kept in memory after the peers disconnected. If the peers later reconnec…

State inconsistency: in-memory buffered message not cleared on disconnectDuplicate message processing after reconnectionForce-close consequence for active Lightning channel
71405b4bby Wilmer Paulino+22−12 files
Vendor flagged security relevance
Informational 20 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'offers: rename matches_invoice_signing_pubkey to key_can_sign_invoice' (#4942)

This commit is a simple rename of a public function from `matches_invoice_signing_pubkey` to `key_can_sign_invoice`, plus matching updates to its documentation, callers, tests, and changelog. No behavior changed. It is not a security fix.

a476cf92by Matt Corallo+13−133 files
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

offers: rename matches_invoice_signing_pubkey to key_can_sign_invoice

This commit is a simple rename of a function and its documentation from matches_invoice_signing_pubkey to key_can_sign_invoice. No logic, behavior, or security properties changed. It is a follow-up code-review naming cleanup.

388187caby Vincenzo Palazzo+13−133 files
No security note in commit
Informational 18 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'offers: add Offer::permits_invoice_signed_by' (#4884)

This commit adds a new public helper method, Offer::matches_invoice_signed_by (later renamed matches_invoice_signing_pubkey), that lets callers check whether an invoice signing key belongs to the recipient named by a BOLT 12 offer. It also…

Refactors existing BOLT 12 invoice-signing-pubkey validation into a reusable helperAdds public API to bind an invoice signing key to an offer recipientAdds unit tests for issuer-id vs. path-last-hop matching behavior
016af8f9by Matt Corallo+81−135 files
No security note in commit
Low 29 AI analysisMessage 85 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Support retired TLV fields in object-constructing macros

This commit is a feature enhancement for LDK's internal serialization macros. It allows developers to mark old protocol fields as 'retired' (reserved but no longer used) in more places, so those type numbers cannot be accidentally reused. …

TLV type-number reservation mechanism extended to more macro-generated code pathsPrevents accidental reuse of retired protocol field type numbersAvoids UnknownRequiredFeature decode failures for obsolete even-type fields
6d7c2bdaby Jeffrey Czyz+120−222 files
No security note in commit
Informational 17 AI analysisMessage 91 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Replace splice failure wire tests with a 0.2 downgrade test

This commit is a test-only cleanup in the Lightning Dev Kit (LDK) Rust codebase. It removes low-level byte-level tests for splice failure events and replaces them with a single cross-version test that actually loads a 0.2 node with seriali…

Cross-version serialization compatibility test addedRemoval of byte-level tests that could not detect real 0.2 mismatchesNo production code changes
80f2b44fby auto-pr-bot+95−2663 files
No security note in commit
Low 28 AI analysisMessage 98 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Document duplicate HTLC handling on revoked commitments

This commit only adds a code comment explaining an existing quirk: if a revoked old channel transaction contains two identical-looking payment forwards and the other side claims both, the software may only claim one upstream while letting …

Behavioral quirk in revoked-commitment HTLC resolution documentedDuplicate (payment_hash, amount) HTLCs can map to the same upstream sourcePotential missed upstream preimage claim on second identical HTLC
c5bd8b11by auto-pr-bot+19−01 file
Vendor flagged security relevance
Moderate 60 AI analysisMessage 73 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Abort active splice RBF when prior candidate confirms

This commit fixes a state-handling bug in Lightning Dev Kit's splicing feature. When a user tries to speed up or replace a pending splice (an 'RBF' attempt) and the older splice transaction unexpectedly gets confirmed on-chain, the softwar…

State-conflict handling between confirmed splice candidate and active RBF negotiationStructured abort propagation through chain-event pathConditional abort based on holder signature progress to avoid unsafe cancellation
7587d2cdby Wilmer Paulino+623−424 files
No security note in commit
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

Lower-priorityHoist chanmon process_all_events macroby Joost Jager · 94981ff1 · May 8, 2026 · 1 fileMessage 58 · ThinInformational 15Details
Commit message · Joost Jager

Hoist chanmon process_all_events macro

Move the settlement helper outside the final input arm.

This lets later payment helper extraction use it from more arms.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a simple code cleanup inside a fuzz test file. It moves a helper macro (a reusable chunk of code) to a higher scope so that more parts of the test can use it later. No production code, no security fix, and no behavior change.

Lower-priorityRoute chanmon messages through EventQueuesby Joost Jager · 55df0b3d · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager

Route chanmon messages through EventQueues

Replace the four directional message vectors with one queue owner.
Move per-node queue draining, middle-node routing, and disconnect
cleanup into EventQueues so routing behavior lives with the queue
state.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a code cleanup inside a fuzz test file. It replaces four separate message queues with one struct and moves some routing logic into methods. There is no change to the actual Lightning node library, network protocol, or cryptographic handling, so it does not affect real users or funds.

Lower-priorityExtract chanmon harness payment helpersby Joost Jager · 3d1899cb · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager

Extract chanmon harness payment helpers

Move payment bookkeeping into a payment tracker.

Payment sends, resolutions, claims, and stuck checks share one owner.

This avoids borrowing several local maps.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a pure internal refactoring of a fuzz test harness. It moves payment bookkeeping helpers into a new PaymentTracker struct but does not change the actual Lightning library code, network protocol handling, or any behavior visible to users. There is no security relevance.

Lower-priorityExtract chanmon harness nodesby Joost Jager · 69cda6ba · May 8, 2026 · 1 fileMessage 58 · ThinInformational 15Details
Commit message · Joost Jager

Extract chanmon harness nodes

Centralize creation of the three chanmon harness nodes. The fuzzer now
initializes the node array through one path, which reduces duplicated
setup before the event and payment helpers are split out.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit is a straightforward internal cleanup of a fuzz test file. It removes duplicated local variables (monitor_a/b/c, keys_manager_a/b/c) and changes helper functions to read those values directly from a shared HarnessNode structure. There is no change to production code, cryptographic logic, network behavior, or user-facing behavior. It is purely refactoring to make the test harness easier to maintain.

Lower-priorityExtract chanmon harness node lifecycleby Joost Jager · 42449419 · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager

Extract chanmon harness node lifecycle

Move persistence, reload, and chain sync state onto each harness node.
Keeping serialized managers and heights with the node makes restarts and
block updates easier to reason about.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a code cleanup inside a fuzzing test file. It moves bookkeeping variables (like saved node state, block heights, and fee values) into a test helper struct and converts some closures into methods. There is no change to the actual Lightning protocol logic or to any production code, so it cannot affect real users or funds.

Lower-priorityExtract chanmon harness node operationsby Joost Jager · 84c40774 · May 8, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · Joost Jager

Extract chanmon harness node operations

Move the action helpers onto `HarnessNode` methods. Node-local
operations now live with the state they mutate, which reduces argument
threading through the fuzz loop.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit is a straightforward internal code cleanup in a fuzzing test harness. It moves helper functions that operate on test nodes into methods on the HarnessNode struct, reducing the need to pass many arguments around. There is no change to production code, no security fix, and no externally visible behavior change.

Lower-priorityRoute chanmon fuzz exits through loop breakby Joost Jager · ad0498eb · May 8, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · Joost Jager

Route chanmon fuzz exits through loop break

Replace the local test_return macro with a labeled fuzz loop.

Keep one invariant check after the loop.

Leave harness setup extraction for the next commit.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit is a small internal cleanup of a fuzz-testing harness in the rust-lightning project. It replaces a macro that immediately ended the test with a normal labeled loop break, and moves one final consistency check to after the loop. There is no change to production Lightning code, no fix for a real vulnerability, and no security impact on users.

Lower-priorityExtract chanmon harness peer linksby Joost Jager · b7510228 · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager

Extract chanmon harness peer links

Represent each channel pair as a peer link with its channel ids and
disconnect state. Link methods now own peer reconnect, disconnect, and
monitor-update operations for that channel group.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a code cleanup inside a fuzzing test harness. It groups together repeated code for managing simulated peer connections and channel monitor updates into a new helper structure called PeerLink. There is no change to the actual Lightning protocol logic or to any code that runs in production; it only affects how a test file is organized.

Lower-priorityBuild chanmon node resourcesby Joost Jager · 1ad022b6 · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 14Details
Commit message · Joost Jager

Build chanmon node resources

Move construction of loggers, keys, monitors, broadcasters, wallets,
and fee estimators into node resource setup. This removes ad hoc local
closures while preserving the deterministic test inputs used by the
fuzzer.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 14/100

This commit is a code cleanup inside a fuzz test file. It moves the creation of test-only helpers (loggers, keys, monitors, broadcasters, wallets, fee estimators) into a single struct method and removes duplicated local closures. There is no change to production code, no change to cryptographic behavior, and no fix for a security bug.

Lower-priorityExtract chanmon bootstrap helpersby Joost Jager · 06459fbd · May 8, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Joost Jager

Extract chanmon bootstrap helpers

Extract the repeated peer-connection and channel-funding setup into
small helpers. This leaves the fuzz scenario setup behavior unchanged
while making later harness refactors easier to review.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit is a pure code cleanup inside a fuzz-testing file. It takes four blocks of test-setup logic that were previously copy-pasted as macros and turns them into ordinary Rust helper functions. No production code, no protocol behavior, and no security logic were changed. The commit message explicitly says the goal is to make later refactors easier to review while leaving fuzz scenario behavior unchanged.

Lower-priorityWrap chanmon nodes in HarnessNodeby Joost Jager · 7eccad39 · May 8, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · Joost Jager

Wrap chanmon nodes in HarnessNode

Introduce a small wrapper around each channel manager and its test
resources. This keeps node-local state together before moving more
operations onto the harness.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit is a small internal cleanup of a fuzz test file. It wraps test node objects in a new HarnessNode struct so related pieces (channel manager, chain monitor, key manager) stay together, and it removes some repetitive function arguments. There is no change to production code, no change to security behavior, and no fix for a vulnerability.

AI review queuedError if the calculated v2 reserve is greater than the channel valueby Leo Nash · 3835f842 · May 8, 2026 · 3 filesMessage 85 · StrongModerate 66Details
Commit message · Leo Nash

Error if the calculated v2 reserve is greater than the channel value

In 0FC channels, capping the reserve to the total value of the channel
allowed a splice initiator to withdraw past their reserve in case the
acceptor had no balance in the channel.

This is because the post-splice value of the channel was equal to the
initiator's post splice balance. Hence, this post splice balance always
matched the reserve, even though the reserve was below the dust limit.

The only thing that prevented the initiator from withdrawing all their
balance was the script dust limit check in
`interactivetxs::NegotiationContext::receive_tx_add_output`.

In case the splice acceptor had any balance in the channel, or there
were HTLCs in the channel, or the channel was not 0FC, the
splice initiator's post-splice balance was always below the full channel
value. Hence when the reserve was capped at the channel value, the
post-splice balance was always below the reserve, and the splice was
rejected.

Also, in `validate_splice_contributions`, to determine the
`counterparty_selected_channel_reserve`, we now read the holder's dust
limit from the context, instead of the current global constant.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
defensive validationsigning or wallet pathsecond-pass: near security thresholdsecond-pass: security-sensitive path
AI analysis · Moderate 66/100

This commit fixes a bug in Lightning Dev Kit's splicing logic for zero-fee-commitment (0FC) channels. Previously, when calculating the required channel reserve after a splice, the code would cap the reserve at the total channel value. In a special case where the splice acceptor had no balance and no HTLCs existed, this cap allowed the splice initiator to withdraw more than they should—effectively reducing their balance below the required reserve. The only thing stopping a full drain was a separate dust-limit check. The fix makes the reserve calculation return an error if the computed reserve would exceed the post-splice channel value, and it uses each side's actual dust limit instead of a global constant when validating splice contributions.

Security candidateError if the calculated v1 reserve is greater than the channel valueby Leo Nash · 53e156a7 · May 8, 2026 · 6 filesMessage 65 · AdequateModerate 59Details
Commit message · Leo Nash

Error if the calculated v1 reserve is greater than the channel value

We made the same change to the calculation of the v2 reserve in the
previous commit.

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
boot or update path
AI analysis · Moderate 59/100

This commit tightens how Lightning Dev Kit calculates the channel reserve for older-style (v1) channels. The reserve is a portion of channel funds that must stay untouched to guarantee both parties can pay penalties if someone cheats. Previously, a misconfigured or malicious proportion could make the calculated reserve exceed the entire channel value, or a tiny channel/dust limit could produce a nonsensical reserve. Now the code rejects those cases outright and also caps the proportional reserve at 100%. The change is defensive: it prevents opening channels with impossible reserve settings rather than silently accepting them.

Security candidateRename should_reset_pending_splice_state argumentby Wilmer Paulino · 637cc413 · May 7, 2026 · 1 fileMessage 58 · ThinLow 34Details
Commit message · Wilmer Paulino

Rename should_reset_pending_splice_state argument

There's a case in `should_reset_pending_splice_state` where we are
awaiting signatures, but still want to preserve the pending negotiation
upon a disconnection. We previously used `counterparty_aborted` as a way
to toggle this behavior. Now that we support the user manually canceling
an ongoing negotiation, we interpret the argument a bit more
generically in terms of whether we wish to resume the negotiation or not
when we are found in such a state.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Why it was queued
signing boundary
AI analysis · Low 34/100

This commit renames and flips the meaning of a flag used during Lightning channel splice negotiations. It changes when the software decides to keep or discard an in-progress splice after a disconnect or abort. The change appears intended to support a new 'user manually cancels' case, but the logic is subtle: several call sites now pass the opposite boolean, and the function's internal cases were reordered. There is no direct evidence this fixes an exploitable vulnerability, but the change touches safety-critical state cleanup during channel funding/splicing, where mistakes can lead to stuck funds or inconsistent channel state.

Lower-priorityAllow cancellation of pending splice funding negotiationsby Wilmer Paulino · 554d833c · May 7, 2026 · 5 filesMessage 73 · AdequateLow 29Details
Commit message · Wilmer Paulino

Allow cancellation of pending splice funding negotiations

A user may wish to cancel an in-flight funding negotiation for whatever
reason (e.g., mempool feerates have gone down, inability to sign, etc.),
so we should make it possible for them to do so. Note that this can only
be done for splice funding negotiations for which the user has made a
contribution to.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 29/100

This commit adds a new public API that lets a Lightning node operator cancel a splice funding negotiation they started, as long as they have not yet signed the funding transaction. It replaces an older test-only cancellation path with a safer, more complete implementation that checks the user actually contributed inputs or outputs and refuses cancellation once signatures have been sent. The change is a defensive feature improvement rather than a fix for an active vulnerability.

Lower-priorityProduce FundingInfo::Contribution variants in ChannelMonitorby Wilmer Paulino · 7e806f97 · May 7, 2026 · 5 filesMessage 73 · AdequateInformational 24Details
Commit message · Wilmer Paulino

Produce FundingInfo::Contribution variants in ChannelMonitor

Similar to the `ChannelManager`, we expose the contributed inputs and
outputs of a splice via `FundingInfo::Contribution` at the
`ChannelMonitor` level such that we don't lose the context when the
channel closes while a splice is still pending. This relies on tracking
the `FundingContribution` that was provided to the `ChannelManager`
prior to negotiating the new funding transaction. If no
`FundingContribution` exists, then we continue to emit the
`FundingInfo::OutPoint` variant.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 24/100

This commit improves how the Lightning Dev Kit node keeps track of funds involved in a 'splice' (a way to resize a Lightning channel while it is open). Previously, if the channel closed while a splice was still pending, the wallet only received a generic reference to the old funding transaction. Now it receives the actual inputs and outputs the user contributed, making it easier to recover those funds safely. The change is a feature completeness / robustness improvement rather than a fix for an active exploit.

Lower-priorityChange FundingInfo::Contribution to expose contributed output scriptsby Wilmer Paulino · b9d0eb74 · May 7, 2026 · 5 filesMessage 85 · StrongLow 28Details
Commit message · Wilmer Paulino

Change FundingInfo::Contribution to expose contributed output scripts

Exposing the amounts for each output isn't very helpful because it's
possible that they vary across over multiple splice candidates due to
RBF. This commit changes `FundingInfo::Contribution` and several of the
helpers used to derive it to be based on output scripts instead.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Low 28/100

This commit refactors how a Lightning node reports which transaction outputs a user is contributing during channel funding or splicing. Instead of sharing full output details (including amounts), it now shares only the output scripts (addresses). The stated reason is that amounts can change across RBF (fee-bump) attempts, so scripts are a more stable identifier. The change also fixes filtering logic so duplicate outputs are correctly recognized by their script, preventing a user's own change output from being incorrectly reported as a new contribution in later rounds.

Security candidateStrip Unicode `Cf` characters in `PrintableString`by Elias Rohrer · 1a01b5ae · May 7, 2026 · 1 fileMessage 86 · StrongHigh 72Details
Commit message · Elias Rohrer

Strip Unicode `Cf` characters in `PrintableString`

`PrintableString` is the sanitiser LDK uses to render untrusted strings
(node aliases, BOLT-12 invoice / offer text, `UntrustedString`, LSPS
messages, `lightning-invoice` descriptions) to logs and UI. It only
replaced `char::is_control` matches (Unicode general category `Cc`)
with U+FFFD, leaving the entire `Cf` (Format) category untouched.

That is the exact category covering the bidirectional override /
isolate codepoints (U+202A..U+202E, U+2066..U+2069) and zero-width
characters (U+200B..U+200D, U+FEFF) behind the "Trojan Source" attack
family (CVE-2021-42574): a peer can set its alias / invoice description
/ offer fields to e.g. `safe\u{202E}cipsxe.exe`, which previously
passed through verbatim while a human reader sees `safeexe.cips` —
defeating the threat model `PrintableString` exists to defend against.

Replace `Cf` codepoints alongside `Cc` ones. The `Cf` ranges are
inlined as a `matches!` table sourced from Unicode 16.0 to keep the
change `no_std`-friendly with no new dependencies.

Co-Authored-By: HAL 9000
Signed-off-by: Elias Rohrer <dev@tnull.de>

86/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
explicit security language
AI analysis · High 72/100

This commit fixes a security gap in LDK's string sanitizer, PrintableString, which is used to display untrusted text like node names and invoice descriptions in logs and user interfaces. Previously it only stripped traditional control characters (like newlines and tabs) but left behind Unicode 'format' characters, including invisible bidirectional override characters and zero-width spaces. These can trick a human reader into seeing a different string than what the software processes—an attack family known as 'Trojan Source.' The patch now replaces those format characters with the standard replacement symbol (), so spoofed strings render safely.

Lower-priorityExpose probe status in recent paymentsby Elias Rohrer · 419908da · May 7, 2026 · 2 filesMessage 76 · AdequateInformational 16Details
Commit message · Elias Rohrer

Expose probe status in recent payments

Previously, `ChannelManager::list_recent_payments` didn't give us the
means to discern 'real' payments from inflight probes. In
https://github.com/lightningdevkit/ldk-node/pull/815 we found that we
need a way to re-derive which probes are still pending so our accounting
of inflight probing amounts is still correct after restart.

To this end, we here let callers distinguish liquidity probes while they
are pending or abandoned.

Co-Authored-By: HAL 9000

Co-Authored-By: HAL 9000
Signed-off-by: Elias Rohrer <dev@tnull.de>

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 16/100

This commit adds a small informational flag to a public API so that users of the Lightning library can tell whether a recent payment was a 'probe' (a test payment used to check network liquidity) rather than a real payment. It is a feature/API improvement, not a security fix, and does not change how funds are handled.

Lower-priorityDerive DiscardFunding inputs and outputs from contributions on promotionby Jeffrey Czyz · 51e60798 · May 7, 2026 · 2 filesMessage 73 · AdequateLow 29Details
Commit message · Jeffrey Czyz

Derive DiscardFunding inputs and outputs from contributions on promotion

When a splice funding is promoted, produce FundingInfo::Contribution
instead of FundingInfo::Tx for the discarded funding events. Each
contribution is filtered against the promoted funding transaction's
inputs and outputs, so only inputs and outputs unique to the discarded
round are reported.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 29/100

This commit changes how a Lightning node reports 'discarded' bitcoin inputs and outputs when a splice attempt is replaced by a newer version (RBF). Instead of discarding whole transactions, it now reports only the specific inputs and outputs that were unique to the abandoned splice round. This is a correctness and wallet-recovery improvement, not a clear-cut security fix, but a prior bug in this area could leave funds unrecovered or confuse wallet tracking.

Lower-priorityCheck can_initiate_rbf in stfu handler before sending tx_init_rbfby Jeffrey Czyz · ffbb8fe6 · May 7, 2026 · 4 filesMessage 85 · StrongModerate 58Details
Commit message · Jeffrey Czyz

Check can_initiate_rbf in stfu handler before sending tx_init_rbf

If splice_locked is sent between our outgoing STFU and the
counterparty's STFU response, the stfu() handler would proceed to
send tx_init_rbf for an already-confirmed splice. Guard against this
by re-checking can_initiate_rbf when entering quiescence. Disconnect
because there is no way to cancel quiescence after both sides have
exchanged STFU.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Moderate 58/100

This commit fixes a bug in the Lightning Dev Kit's splicing/RBF (fee-bump) protocol. If a splice transaction got confirmed while both sides were exchanging 'quiet' (STFU) messages, the code could wrongly try to start a new RBF round for an already-final splice. The fix adds a re-check before sending the RBF initiation message and disconnects the peer if the splice is already locked, preventing protocol confusion and potential loss or locking of funds.

Lower-priorityAdd pending changelog for splice negotiation event changesby Jeffrey Czyz · b44076e0 · May 7, 2026 · 1 fileMessage 65 · AdequateInformational 15Details
Commit message · Jeffrey Czyz

Add pending changelog for splice negotiation event changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit only adds a pending changelog file describing upcoming API renames and additions for splicing-related events. It contains no code changes, no bug fixes, and no security-sensitive behavior changes.

Lower-priorityRemove unused NegotiationError and contributed_inputs_and_outputs methodsby Jeffrey Czyz · 367ffaa1 · May 7, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Jeffrey Czyz

Remove unused NegotiationError and contributed_inputs_and_outputs methods

Now that splice_funding_failed_for! derives inputs and outputs from
FundingContribution directly, remove the unused NegotiationError struct
and into_negotiation_error methods from the interactive tx types, along
with the into/to_contributed_inputs_and_outputs methods on
ConstructedTransaction.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a routine code cleanup. It removes an unused error type and several helper methods that are no longer called anywhere in the codebase. There is no change to behavior, no bug fix, and no security-related content.

Lower-priorityDerive SpliceFundingFailed inputs from FundingContributionby Jeffrey Czyz · db45c833 · May 7, 2026 · 1 fileMessage 73 · AdequateInformational 11Details
Commit message · Jeffrey Czyz

Derive SpliceFundingFailed inputs from FundingContribution

Replace the maybe_create_splice_funding_failed! macro and
splice_funding_failed_for method with a unified splice_funding_failed_for!
macro that derives contributed inputs and outputs from the
FundingContribution rather than extracting them from the negotiation
state.

Callers pass ident parameters for which PendingSplice filtering methods
to use: contributed_inputs/contributed_outputs when the current round's
contribution has been popped or was never pushed, and
prior_contributed_inputs/prior_contributed_outputs for the read-only
persistence path where the contribution is cloned instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 11/100

This is a code cleanup change in a Lightning Network library. It replaces an older way of building a failure message during a failed channel splice with a newer, more consistent method. There is no indication in the commit that this fixes a security bug or introduces a vulnerability; it appears to be a refactor to make the code simpler and less error-prone.

Lower-priorityFix output filtering in into_unique_contributionsby Jeffrey Czyz · 9c6cca6b · May 7, 2026 · 2 filesMessage 68 · AdequateLow 44Details
Commit message · Jeffrey Czyz

Fix output filtering in into_unique_contributions

Filter outputs by script_pubkey rather than full TxOut equality. Outputs
reusing the same address as a prior round are still considered committed
even if the value differs (e.g., different change amounts across RBF
rounds with different feerates).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 44/100

This commit fixes a bug in how the Lightning Dev Kit filters duplicate transaction outputs when multiple funding or splicing attempts overlap. Previously, it treated two outputs as duplicates only if both the amount and the destination address matched exactly. The fix now treats outputs as duplicates if only the destination address matches, even if the amounts differ. This prevents a user from accidentally losing control of funds when a second splicing attempt reuses a change address with a different amount, such as after a fee-bump (RBF).