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 50 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.

Security candidateUse `saturating_mul` when multiplying feerates by the fee spike bufby Matt Corallo · b98d7b8a · Apr 13, 2026 · 2 filesMessage 90 · StrongModerate 53Details
Commit message · Matt Corallo

Use `saturating_mul` when multiplying feerates by the fee spike buf

In theory a channel's feerate could be set to some absurd value
(millions of satoshis per vB) and we'd overflow the fee spike
buffer, accepting the absurd fee and ignoring our fee spike buffer
check. This is harmless - the counterparty has much easier ways of
bricking the channel if they want, and paying several BTC in fees
is probably not the best way. Our commitment transaction and dust
fee exposure logic all correctly map the `u32` to a `u64` before
multiplying, making them overflow-safe.

Still, its good to fix overflows because it is a remotely-reachable
crash in debug builds.

Reported by Jordan Mecom of Block's Security Team

90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Names security-relevant behavior explicitly
Why it was queued
memory safetysigning or wallet path
AI analysis · Moderate 53/100

This patch fixes a potential integer overflow when calculating Lightning channel fees. If a malicious or misconfigured peer set an extremely high transaction fee rate, the software could overflow a 32-bit integer while applying a safety buffer multiplier. In release builds this would silently wrap around and ignore the safety buffer; in debug builds it would crash. The fix uses saturating multiplication so the result stays at the maximum safe value instead of overflowing. The commit notes this is not practically exploitable for theft because a peer already has easier ways to disrupt a channel, but it removes a remotely reachable debug crash.

Security candidateCorrect blinded path forwarding CLTV expiry checkby Matt Corallo · 8d8313de · Apr 13, 2026 · 2 filesMessage 95 · StrongLow 43Details
Commit message · Matt Corallo

Correct blinded path forwarding CLTV expiry check

The `PaymentConstraints::max_cltv_expiry` field exists to ensure
a blinded path expires across the entire path at once - once the
path is expired it will be rejected by the introduction node rather
than traversing the entire path and failing at the destination.

This was broken by the fact that we were checking the outgoing CLTV
value rather than the incoming one, which admittedly isn't clear in
the spec but is somewhat implied. Here we fix this, updating a test
which was actually (kinda) exploiting this privacy loss rather than
allowing the HTLC to fail at the introduction node.

This, of course, does not risk funds loss as our own CLTV policy is
still enforced on top. The only impact it could have is a recipient
which was relying on blinded path expiry to avoid some cost (e.g.
LSPS5 node wakeup cost) involved in receiving an HTLC they
ultimately fail, though I'm not aware of any practical deployment
where that is a concern.

Reported by Jordan Mecom of Block's Security Team

95/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
explicit security language
AI analysis · Low 43/100

This commit fixes a bug in how Lightning Dev Kit checks expiry times for payments sent through 'blinded paths' (a privacy feature that hides the final recipient). The code was accidentally checking the outgoing expiry time instead of the incoming one. Because of this, a payment could travel deeper into the blinded path than intended before being rejected, slightly weakening the privacy/cost protection that blinded-path expiry is meant to provide. The commit explicitly states this does not risk loss of funds.

Lower-priorityFix async release before HTLC decodeby Valentine Wallace · 2ebc372f · Apr 10, 2026 · 3 filesMessage 88 · StrongModerate 57Details
Commit message · Valentine Wallace

Fix async release before HTLC decode

Handle `ReleaseHeldHtlc` messages that arrive before the sender-side LSP
has even queued the held HTLC for onion decoding. Unlike lightningdevkit#4106, which
covers releases arriving after the HTLC is in `decode_update_add_htlcs`
but before it reaches `pending_intercepted_htlcs`, this preserves
releases that arrive one step earlier and would otherwise be dropped as
HTLC not found.

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

88/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
AI analysis · Moderate 57/100

This commit fixes a race condition in Lightning Dev Kit's async payments feature. When a user wants to receive a payment while offline, their LSP (Lightning Service Provider) holds the payment until they come back online. The bug occurred when a 'release this payment' message arrived *before* the held payment had been fully registered in the LSP's internal state. Previously, the release message would be ignored, causing the payment to get stuck. The fix makes the LSP remember the release request and apply it once the payment is registered.

Lower-priorityHold peer lock when pushing to decode_update_addsby Valentine Wallace · 2bd09e4e · Apr 10, 2026 · 1 fileMessage 80 · StrongModerate 55Details
Commit message · Valentine Wallace

Hold peer lock when pushing to decode_update_adds

This avoids race conditions where we're unable to properly update an HTLC's
state because we need to update its state in the ChannelManager, but the HTLC
is stuck in transit from the Channel to
ChannelManager::decode_update_add_htlcs. Now the HTLC will atomically go from
the Channel to the ChannelManager decode queue under the same lock.

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Moderate 55/100

This change fixes a timing issue in how the Lightning node hands off payment packets (HTLCs) between two internal components. Previously, an HTLC could be in an in-between state where one part of the code thought it had been forwarded while another part had not yet processed it, potentially leading to inconsistent bookkeeping. The fix moves the handoff so it happens while the same lock is held, making the transition atomic.

Lower-priorityRemove wallet argument from FundingTemplate::splice_outby Wilmer Paulino · b4b3bfb5 · Apr 8, 2026 · 4 filesMessage 65 · AdequateLow 29Details
Commit message · Wilmer Paulino

Remove wallet argument from FundingTemplate::splice_out

It does not require coin selection, so the wallet argument is not
necessary.

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 29/100

This commit is a routine API cleanup, not a security fix. It removes an unnecessary wallet/coin-selection argument from the splice_out function because splicing funds out of a Lightning channel only spends from the channel balance and never needs to select wallet inputs. The change refactors shared validation into a helper and makes the function synchronous, but it does not patch any vulnerability and the commit message does not claim it does.

Lower-priorityutil: add helper ChannelHandshakeConfig -> ChannelHandshakeConfigUpdateby Philip Kannegaard Hayes · 484ecb89 · Apr 7, 2026 · 1 fileMessage 65 · AdequateInformational 15Details
Commit message · Philip Kannegaard Hayes

util: add helper ChannelHandshakeConfig -> ChannelHandshakeConfigUpdate

Mirror the ChannelConfig -> ChannelConfigUpdate helper

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Informational 15/100

This commit adds a simple helper that converts a full channel handshake configuration into a partial update object, mirroring an existing helper for another config type. It is a routine code utility with no security relevance visible in the diff or commit message.

Lower-priorityfuzz: add fuzz target for P2PGossipSync gossip message handlingby Nishant Bansal · d0f1f39c · Apr 7, 2026 · 5 filesMessage 75 · AdequateInformational 15Details
Commit message · Nishant Bansal

fuzz: add fuzz target for P2PGossipSync gossip message handling

Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>

75/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit only adds a new fuzz test target. Fuzz tests are automated tools that feed random or crafted inputs to code to try to make it crash. The commit does not change any production code, so it cannot by itself introduce a security vulnerability or fix one. It is a testing/infrastructure addition.

Lower-priorityNote why we don't use `update_for_new_tip` in offers flow block updby Matt Corallo · 5704e8e7 · Apr 7, 2026 · 1 fileMessage 62 · AdequateInformational 15Details
Commit message · Matt Corallo

Note why we don't use `update_for_new_tip` in offers flow block upd

62/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Explains rationale or failure mode! No meaningful explanatory body
AI analysis · Informational 15/100

This commit only adds a two-line comment explaining why a particular helper function is not used in the offers flow code. It does not change any code behavior, fix a bug, or alter security logic.

AI review queuedcargo fmtby Swagmuffin · 2b181dc4 · Apr 7, 2026 · 2 filesMessage 0 · OpaqueInformational 15Details
Commit message · Swagmuffin

cargo fmt

0/100 · OpaqueMessage clarity
! Very short subject! Too few words to establish purpose! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit only reformats existing Rust code using 'cargo fmt'. It changes whitespace and line breaks in two files but does not alter any logic, values, or behavior. There is no security relevance.

Lower-priorityBypass channel monitor sync requests when no partition key givenby Swagmuffin · 6bf2352d · Apr 7, 2026 · 1 fileMessage 50 · ThinLow 30Details
Commit message · Swagmuffin

Bypass channel monitor sync requests when no partition key given

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Low 30/100

This small patch changes how a Lightning node decides which channel monitors need to be re-synchronized with the blockchain after a restart. Previously, if the node's best-known block height was missing, the code treated that as height 0 and still computed a partition key, which could cause the wrong subset of monitors to sync. Now, if no best height is known, the partition key is treated as absent and the monitor is skipped unless it has pending claims. The fix is more about correctness and avoiding unnecessary/misdirected sync work than a direct theft-of-funds vulnerability, but in a Lightning context monitor-sync bugs can affect safety.

Lower-priorityAdd missing `OffersMessageHandler::best_block` updatingby Matt Corallo · 417b0658 · Apr 7, 2026 · 1 fileMessage 85 · StrongModerate 59Details
Commit message · Matt Corallo

Add missing `OffersMessageHandler::best_block` updating

It seems we forgot to ensure `OffersMessageHandler::best_block` is
consistently updated, leading to us building invalid blinded
payment paths for short-lived payment paths after two weeks without
restart.

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 59/100

This commit fixes a bug where a piece of data called `best_block` was not being updated when new blocks arrived. This data is used when creating private, one-time Lightning payment routes. If it goes stale for more than two weeks, the software could build payment routes that other nodes consider expired or invalid, causing payments to fail. The fix simply updates `best_block` whenever a new block is seen.

Lower-priorityDrop stale DNSSec resolution logic in `OffersMessageFlow`by Matt Corallo · 2637b387 · Apr 7, 2026 · 1 fileMessage 73 · AdequateInformational 17Details
Commit message · Matt Corallo

Drop stale DNSSec resolution logic in `OffersMessageFlow`

In 884158d0914c64df4807c394e3155646dead478d we dropped built-in
BIP 353 resolution logic in favor of the
`bitcoin-payment-instructions` crate but forgot to do so in the
`OffersMessageFlow`. Here we do so.

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

This commit removes leftover, unused code that handled DNS-based human-readable name resolution inside the BOLT12 offers message flow. The project had already switched to an external crate for this job, and this change simply cleans up the stale internal pieces that were accidentally left behind. It is a maintenance/cleanup change, not a security fix for an active vulnerability.

Lower-priorityFix cltv_expiry_delta commentby elnosh · dc06afa0 · Apr 3, 2026 · 1 fileMessage 58 · ThinInformational 15Details
Commit message · elnosh

Fix cltv_expiry_delta comment

Fix incorrect comment about cltv_expiry_delta.
The cltv_expiry on the outgoing HTLC must be less than the
one in the incoming HTLC.

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

This commit only fixes a comment describing a Lightning Network routing parameter. It changes no actual code logic, so it cannot affect security or behavior.

Lower-priorityCorrectly refer to `pay_for_offer_from_hrn` in `pay_for_offer` docsby Matt Corallo · 39029081 · Apr 3, 2026 · 1 fileMessage 73 · AdequateInformational 16Details
Commit message · Matt Corallo

Correctly refer to `pay_for_offer_from_hrn` in `pay_for_offer` docs

If a `pay_for_offer` call comes in that was for an HRN, downstream
code should instead call `pay_for_offer_from_hrn`, not
`pay_for_offer`.

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

This commit is a tiny documentation fix. It updates the comment above the `pay_for_offer` function to tell developers to use a related function, `pay_for_offer_from_hrn`, when handling human-readable payment names. No code behavior changed.

Lower-priorityDrop `ChannelManager`-built-in BIP 353 resolution logicby Matt Corallo · 884158d0 · Apr 3, 2026 · 5 filesMessage 73 · AdequateInformational 15Details
Commit message · Matt Corallo

Drop `ChannelManager`-built-in BIP 353 resolution logic

Since we shipped the `bitcoin-payment-instructions` crate we
generally expect downstream code to use that rather than doing
BIP 353 DNS resolutions over onion messages directly from the
`ChannelManager`. Thus, in 0.2 we marked
`pay_for_offer_from_human_readable_name` deprecated and here remove
it in favor of explicit references to the
`bitcoin-payment-instructions` crate in documentation.

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

This commit removes an old, already-deprecated feature from the Lightning Dev Kit's core ChannelManager: the ability to pay a BOLT 12 offer by resolving a human-readable BIP 353 name (like an email-style address) through DNS-over-onion-message inside the library. The project now expects users to use a separate, dedicated `bitcoin-payment-instructions` crate for that name resolution instead. The change is a routine API cleanup, not a security fix, and does not introduce any vulnerability.

Lower-prioritychainmon: fixup stale docs mentioning removed funding_txo paramsby Philip Kannegaard Hayes · c1c98049 · Apr 2, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Philip Kannegaard Hayes

chainmon: fixup stale docs mentioning removed funding_txo params

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 15/100

This commit only updates three stale documentation comments in the chain monitor code. The comments previously referred to old function parameters named `funding_txo` (a transaction output identifier) but the actual code now uses `channel_id`. There are no code behavior changes, no bug fixes, and no security implications.

Security candidateAdd `unannounced_channel_max_inbound_htlc_value_in_flight_percentage`by Leo Nash · 2867d5c1 · Apr 2, 2026 · 13 filesMessage 53 · ThinLow 30Details
Commit message · Leo Nash

Add `unannounced_channel_max_inbound_htlc_value_in_flight_percentage`

Users can now configure two different max percentages for the channel
value that can be allocated to inbound HTLCs, one for announced
channels, and another for unannounced channels.

We also bump the default maximums to 25% for announced channels, and
100% for unannounced channels, to bring them closer to what people would
expect.

53/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Provides detailed explanatory context! Too few words to establish purpose
Why it was queued
boot or update path
AI analysis · Low 30/100

This commit is a feature change, not a security bug fix. It splits one setting into two: the maximum share of a channel's value that can be tied up in incoming payments (HTLCs). Announced channels now default to 25% and unannounced (private) channels default to 100%. The change also updates many tests to keep their old behavior by explicitly setting the previous 10% default. There is no direct vulnerability in the diff, but the higher defaults slightly increase funds-at-risk if a node goes offline while many HTLCs are pending.

Lower-priorityWipe empty entries from `actions_blocking_raa_monitor_updates`by Matt Corallo · f14b4b2f · Apr 2, 2026 · 2 filesMessage 83 · StrongLow 34Details
Commit message · Matt Corallo

Wipe empty entries from `actions_blocking_raa_monitor_updates`

In a very specific case, forgetting to do so can lead to a debug
assertion failure when we see a double-claim of an HTLC (see the
included test).

Found by @joostjager's work on growing the chanmon_consistency
fuzzer.

83/100 · StrongMessage clarity
✓ Specific, 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 · Low 34/100

This patch fixes a bug in the Lightning Dev Kit's channel manager where empty entries in a tracking map were not being removed. In a rare sequence of events—when an HTLC is claimed both off-chain and then on-chain—the leftover empty entry could trigger a debug assertion failure (a crash in debug builds) due to what appears to the code as a 'double-claim.' The fix simply deletes the empty map entry after cleaning it up. It was found through fuzzing, not a real-world exploit, and affects only debug builds because it relies on a debug_assert.

Lower-priorityMake fuzz targets deterministicby Joost Jager · f20bae33 · Apr 2, 2026 · 8 filesMessage 80 · StrongInformational 19Details
Commit message · Joost Jager

Make fuzz targets deterministic

Gate all SystemTime::now() and Instant::now() calls in production code
with #[cfg(all(feature = "std", not(fuzzing)))] so that fuzz targets
produce consistent results regardless of wall-clock time. For each
location, the existing no-std fallback (highest_seen_timestamp, None,
or a constant) is reused under fuzzing.

Also force deterministic hashing when the fuzzing cfg is active,
rather than requiring the LDK_TEST_DETERMINISTIC_HASHES env var.

AI tools were used in preparing this commit.

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 19/100

This commit changes how the Lightning Dev Kit code behaves when running under fuzz testing. Normally, the code uses the real wall-clock time and random hashing. Under fuzzing, it now uses fixed fallback values and deterministic hashing so that fuzz tests produce the same results every run. This is a testing-harness improvement, not a fix for an exploitable security bug in production. It does not change behavior for normal users.

Lower-priorityDocument that `Future` callbacks are not reentrant-safeby Matt Corallo · b06ba3fe · Apr 1, 2026 · 1 fileMessage 65 · AdequateLow 26Details
Commit message · Matt Corallo

Document that `Future` callbacks are not reentrant-safe

Claude was complaining about this, and it seems worth documenting,
but not worth (and kinda hard to) fix.

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 26/100

This commit only adds documentation comments warning that callbacks registered on a Future object must not re-enter the same Future or its Notifier. It does not change any code behavior, fix a bug, or add safeguards. The change suggests a pre-existing reentrancy hazard exists, but it is left unfixed because the authors considered it hard to address and not worth the effort.

Lower-priorityFix misleading comment on counterparty_commitment_txn_on_chain insertby Joost Jager · 414b38d3 · Apr 1, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Joost Jager

Fix misleading comment on counterparty_commitment_txn_on_chain insert

The comment claimed this insert "isn't useful yet" and was only a
safety measure for a watchtower race. In practice it is also used by
provide_payment_preimage to look up the commitment number when a
preimage arrives after the counterparty commitment tx is confirmed.

AI tools were used in preparing this commit.

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

This commit only changes a code comment to accurately describe why a particular data structure is populated. No program logic, data flow, or behavior was altered. It is purely a documentation fix.

Lower-priorityEnsure minimum RBF feerate satisfies BIP125by Jeffrey Czyz · 1ff1bb45 · Mar 31, 2026 · 3 filesMessage 68 · AdequateLow 47Details
Commit message · Jeffrey Czyz

Ensure minimum RBF feerate satisfies BIP125

The spec's 25/24 multiplier doesn't always satisfy BIP125's relay
requirement of an absolute fee increase at low feerates, while a flat
+25 sat/kwu increment falls below the spec's 25/24 rule above 600
sat/kwu. Use max(prev + 25, ceil(prev * 25/24)) for our own RBFs to
satisfy both constraints, while still accepting the bare 25/24 rule
from counterparties.

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 47/100

This commit fixes how Lightning Dev Kit calculates the minimum fee rate when a user tries to speed up (RBF) a channel funding or splicing transaction. Previously, the code only required the new fee to be 25/24 of the old fee. At very low fee rates that percentage bump is too small to meet Bitcoin's BIP125 network-relay rule, so the replacement transaction could be rejected by the network and never confirm. The fix now uses the larger of (old fee + 25 sat/kwu) and (25/24 of old fee) for transactions this node creates, while still accepting the bare 25/24 rule from peers. This is a protocol-compliance/robustness fix, not a direct theft or remote-exploitation vulnerability.

Lower-priorityutil: add default_value_vec for defaults without LengthReadableby Carla Kirk-Cohen · 5330f9f4 · Mar 31, 2026 · 1 fileMessage 85 · StrongInformational 19Details
Commit message · Carla Kirk-Cohen

util: add default_value_vec for defaults without LengthReadable

Right now, use of `default_value` requires that the struct implements
`LengthReadable` itself. When trying to use `default_value` outside of
LDK for `Vec<T>`, your code will run into the orphan rule because it
does not own the trait `LengthReadable` or the type `Vec`.

There are various ugly workarounds for this (like using `custom`), but
wanting to persist a vec with a default value seems like a common enough
use case to justify the change.

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

This commit adds a new helper macro called default_value_vec to LDK's serialization toolkit. It lets downstream developers store a list (Vec) of items with a fallback default value, without hitting Rust's 'orphan rule' that normally blocks adding serialization traits to standard types like Vec. The change is purely additive and includes unit tests. There is no indication it fixes a security bug or introduces a vulnerability.

Lower-priorityInclude recent blocks in the `synchronize_listeners`-returned cacheby Matt Corallo · 74e1da3c · Mar 30, 2026 · 2 filesMessage 85 · StrongLow 45Details
Commit message · Matt Corallo

Include recent blocks in the `synchronize_listeners`-returned cache

When `synchronize_listeners` runs, it returns a cache of the
headers it needed when doing chain difference-finding. This allows
us to ensure that when we start running normally we have all the
recent headers in case we need them to reorg.

Sadly, in some cases it was returning a mostly-empty cache.
Because it was only being filled during block difference
reconciliation it would only get a block around each listener's
fork point. Worse, because we were calling `disconnect_blocks` with
the cache the cache would assume we were reorging against the main
chain and drop blocks we actually want.

Instead, we avoid dropping blocks on `disconnect_blocks` calls and
ensure we always add connected blocks to the cache.

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 45/100

This patch fixes a bug in rust-lightning's initial blockchain synchronization where the header cache returned to callers was often nearly empty. The cache is meant to keep recent block headers so the node can handle chain reorganizations after startup. Because the cache was being incorrectly cleared during synchronization, a node could start normal operation without the recent headers it needs to safely detect and respond to reorgs. This is a correctness/reliability fix in chain-sync logic, not a direct remote-exploitable vulnerability.

Lower-priorityAdd `async_poll.rs` to `lightning-block-sync`by Matt Corallo · e68cbb3e · Mar 30, 2026 · 2 filesMessage 68 · AdequateInformational 15Details
Commit message · Matt Corallo

Add `async_poll.rs` to `lightning-block-sync`

In the next commit we'll fetch blocks during initial connection
in parallel, which requires a multi-future poller. Here we add a
symlink to the existing `lightning` `async_poll.rs` file, making it
available in `lightning-block-sync`

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

This commit adds a symlink to an existing internal utility file and makes minor build configuration changes. It is purely a code-organization/refactoring step with no security-relevant behavior change visible in the diff.