LDK
← All projectsLightning Dev Kit

rust-lightning

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

BitcoinCryptographic librariesLightning NetworkNormal
Repository coverage

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

252security candidates228second-pass queue1525AI analyses
82commits · 30 days
181commits · 60 days
555commits · 180 days
1254commits · 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
473Strong · 80–100
836Adequate · 60–79
294Thin · 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 Corallo43553371574
Jeffrey Czyz19545182169
Wilmer Paulino15945155169
Leo Nash11613116162
Valentine Wallace14511138169
Vincenzo Palazzo11311183
Joost Jager16224162069
elnosh391333058
auto-pr-bot2478087
shaavan22622069
Carla Kirk-Cohen78366068
Analysis record

Published AI watches

Last scanned 32 minutes ago

Moderate 55 AI analysisMessage 76 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Persistent `MonitorEvent`s' (#4491)

This commit makes on-chain 'MonitorEvent' notifications durable and replay-safe. Previously, if a node crashed after a ChannelMonitor persisted a block update but before the ChannelManager processed the resulting event, the event could be …

Durability/atomicity fix for async persistence: prevents lost MonitorEvents across crashesNew ack-based event lifecycle with random event IDsArchival gating on unacknowledged events to avoid losing preimage/timeout information
9a324e72by wpaulino+467−45912 files
No security note in commit
Low 47 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'Fix payment attribution edge cases and simplify claiming' (#5021)

This commit refactors how LDK nodes claim incoming Lightning payments. It replaces a separate 'claim with known custom TLVs' method with an options struct passed to the normal claim call, and fixes two edge cases in payment attribution dat…

API change: claim_funds now takes ClaimFundsOptions, consolidating TLV-known behavior into one pathFailure-packet length bound added to prevent oversized onion error messagesIncoming failure packet truncated at 32 KiB before processing
ee7c61c2by Matt Corallo+256−17322 files
No security note in commit
Low 47 AI analysisMessage 81 · Strong
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Merge PR 'release utxos from failed splices' (#4973)

This change fixes a wallet bookkeeping problem in rust-lightning's built-in coin-selection wrappers. Previously, when a splice attempt failed or coin selection errored after picking UTXOs, those UTXOs stayed marked as 'reserved' in memory …

Resource exhaustion / denial-of-service via permanent in-memory UTXO reservationIncorrect state tracking in coin-selection wrapperNew API method required for correct lifecycle management (release_utxos)
7220a6fdby jkczyz+295−383 files
No security note in commit
Low 49 AI analysisMessage 73 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Restore `Wallet` UTXO locks when coin selection fails afterwards

This commit fixes a bug in the wallet's coin-selection code. When the wallet picked UTXOs to spend, it locked them immediately so they couldn't be reused. But if a later step—fetching the change address or the previous transaction—failed, …

Resource lock leak on error pathUTXO lock state inconsistency between selection and confirmationDenial-of-service/funds-unavailability risk from persistent UTXO locks
81afd9caby elnosh+146−331 file
No security note in commit
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
Moderate 58 AI analysisMessage 73 · Adequate
LDK Lightning Dev Kitrust-lightning BitcoinCryptographic librariesLightning Network

Add `Wallet::release_utxos` to free UTXOs from abandoned transactions

This commit fixes a design flaw in LDK's built-in wallet helper where coins selected for a splice-in (or other unclaimed funding) were permanently reserved in memory if the transaction was abandoned. Over repeated failed splices, all spend…

Denial-of-service via UTXO exhaustion from repeated failed splice negotiationsRisk of inability to broadcast fee-bumping/claim transactions due to lack of available UTXOsNew API surface (release_utxos) introduced to mitigate resource leak
52ab13fdby elnosh+148−43 files
Vendor flagged security relevance
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
Repository ledger

Explore captured commits

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

Security candidateValidate the `Router` is meeting MPP and max-fee limitations givenby Matt Corallo · c31a7bee · Feb 20, 2026 · 6 filesMessage 73 · AdequateLow 47Details
Commit message · Matt Corallo

Validate the `Router` is meeting MPP and max-fee limitations given

When `OutboundPayments` calls the provided `Router` to fetch a
`Route` it passes a `RouteParameters` with a specific max-fee. Here
we validate that the `Route` returned sticks to the limits
provided, and also that it meets the MPP rules of not having any
single MPP part which can be removed while still meeting the
desired payment amount.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
defensive validationboot or update path
AI analysis · Low 47/100

This commit adds safety checks inside the Lightning payment code to make sure the route finder (the 'Router') actually follows the rules it was given. Before sending a payment, the code now verifies that the chosen route does not exceed the user-set maximum fee, does not contain useless empty paths, and does not include unnecessary multi-path payment (MPP) parts. If the router misbehaves, the payment is abandoned instead of being sent. It is a defensive hardening change rather than a fix for a known active attack.

Lower-priorityAdd FilesystemStoreV2 with paginated listing supportby benthecarman · 8f2266e4 · Feb 20, 2026 · 4 filesMessage 73 · AdequateInformational 19Details
Commit message · benthecarman

Add FilesystemStoreV2 with paginated listing support

Implements PaginatedKVStore traits with timestamp-prefixed filenames for
newest-first pagination and [empty] directory markers for consistent
namespace hierarchy.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

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

This commit adds a new version of a file-based storage backend (FilesystemStoreV2) for the Lightning Dev Kit. It is a feature addition, not a security patch. The code introduces pagination support and a consistent directory layout using a special marker directory named '[empty]'. There is no direct evidence in the commit of a vulnerability being fixed, but the new code touches filesystem paths and page-token parsing, which are typical places where bugs can hide. The changes appear defensive and well-tested.

Lower-priorityAdd PaginatedKVStore traits upstreamed from ldk-serverby benthecarman · 38db7abf · Feb 19, 2026 · 1 fileMessage 83 · StrongInformational 18Details
Commit message · benthecarman

Add PaginatedKVStore traits upstreamed from ldk-server

Allows for a paginated KV store for more efficient listing of keys so
you don't need to fetch all at once. Uses monotonic counter or timestamp
to track the order of keys and allow for pagination. The traits are
largely just copy-pasted from ldk-server.

Adds some basic tests that were generated using claude code.

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 18/100

This commit adds new Rust programming interfaces (traits) for listing stored data in pages rather than all at once. It does not change any existing behavior, fix a bug, or alter how data is stored or protected. It is a feature addition to support more efficient key listing in future code.

Lower-priorityprefactor: move FilesystemStore utilies into fs_store/common.rsby benthecarman · 32698136 · Feb 19, 2026 · 6 filesMessage 73 · AdequateInformational 15Details
Commit message · benthecarman

prefactor: move FilesystemStore utilies into fs_store/common.rs

Ahead of adding the FilesystemStoreV2 we move some common utilies into a
shared file.

We also move the FilesystemStore into its own module.

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 pure code reorganization (refactor) with no security-relevant behavior change. It splits the existing FilesystemStore implementation into a shared common module and a v1 module, in preparation for a future FilesystemStoreV2. All call sites are updated to use the new module path, but the actual file-reading, writing, locking, and listing logic is moved unchanged.

Lower-priorityError api change- replaced io::error with string based formatby Apostlex0 · 16ea4c7e · Feb 19, 2026 · 4 filesMessage 50 · ThinInformational 19Details
Commit message · Apostlex0

Error api change- replaced io::error with string based format

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

This commit is a code-quality refactor in the Lightning Dev Kit's block-sync module. It replaces the use of Rust's generic input/output error type with more specific string-based error messages when parsing HTTP and RPC responses. It does not appear to fix a security vulnerability, change network behavior, or introduce a new attack path. The main risk is that some error classifications may have shifted slightly (for example, parse errors are now consistently treated as persistent rather than transient), which could affect retry behavior but is not directly exploitable.

Security candidateReplace `get_closing_signed_broadcast!` macro with direct function callsby elnosh · 28388c40 · Feb 19, 2026 · 5 filesMessage 65 · AdequateInformational 15Details
Commit message · elnosh

Replace `get_closing_signed_broadcast!` macro with direct function calls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
signing or wallet pathboot or update path
AI analysis · Informational 15/100

This commit is a straightforward code cleanup in the project's test suite. It replaces a Rust macro used only in tests with an equivalent regular function. There is no change to the actual Lightning node logic that runs in production, and no security-relevant behavior is altered.

Security candidateReplace `get_payment_preimage_hash!` macro with direct function callsby elnosh · e48478a7 · Feb 19, 2026 · 9 filesMessage 65 · AdequateInformational 15Details
Commit message · elnosh

Replace `get_payment_preimage_hash!` macro with direct function calls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

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 · Informational 15/100

This commit is a straightforward code cleanup in the project's test suite. It removes a helper macro used only in tests and replaces it with direct calls to an existing function. There is no change to the actual Lightning node logic that runs in production, and nothing in the commit suggests a security fix.

Security candidateReplace `check_closed_broadcast!` macro with direct function callsby elnosh · 63f4f8f5 · Feb 19, 2026 · 13 filesMessage 65 · AdequateInformational 15Details
Commit message · elnosh

Replace `check_closed_broadcast!` macro with direct function calls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

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 · Informational 15/100

This commit is a straightforward code cleanup in the project's test suite. It replaces a Rust macro called `check_closed_broadcast!` with direct calls to an equivalent function. Macros are a shorthand in Rust; replacing them with normal function calls makes the test code easier to read and maintain but does not change what the tests actually do. There is no change to the live Lightning node software that users run, so this cannot affect real funds or network security.

Lower-prioritychanges: switch to bitreq from chunked_transferby Apostlex0 · 98535fab · Feb 19, 2026 · 5 filesMessage 68 · AdequateLow 39Details
Commit message · Apostlex0

changes: switch to bitreq from chunked_transfer

we changed the http layer from the manual tcpstream client
implementation to bitreq, this change lets us rely on bitreq for
http request formatting, sockets, HTTP parsing, chunked bodies,
pooling, and async support instead of having to manually implement
them.

cargo.toml: we added bitreq 0.3 and updates the rest-client and
rpc-client feature wiring to depend on bitreq. A tokio feature is
also enabled to allow bitreq async support and pipelining.

http.rs: The old HttpEndpoint builder and all manual TCP/socket
timeout logic are dropped along with the manual GET/POST
construction and response parsing. The client API now uses base_url
and get/post return Result with a typed HttpClientError instead of
std::io::Result. HttpClientError splits transport failures
(bitreq::Error), non-2xx HTTP responses (HttpError), and response
decoding issues (std::io::Error).

rest.rs and rpc.rs: HttpEndpoint and the Mutex<Option<HttpClient>>
caching pattern are removed and both clients now own an HttpClient
directly using base_url. rpc.rs also adds RpcClientError so we can
represent HTTP failures, JSON-RPC errors from the server, and
malformed responses instead of just giving out std::io::Error.

convert.rs: it maps HttpClientError and RpcClientError into
BlockSourceError with this retry classification: transport errors
and HTTP 5xx are transient, HTTP 4xx and invalid data are
persistent, and RPC errors are treated as transient.

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

This commit replaces the project's custom-built HTTP client code with an external library called bitreq. It is a large refactoring of how the software talks to Bitcoin nodes over REST and RPC. The change itself is described as a maintenance improvement, not a security fix. It removes a lot of hand-written HTTP parsing and replaces it with a dependency, which could introduce new bugs or behavior differences, but the diff does not show a known vulnerability being patched.

Lower-priorityAvoid sending stfu for quiescent splice action while pending spliceby Wilmer Paulino · 15b04b5e · Feb 19, 2026 · 2 filesMessage 65 · AdequateLow 35Details
Commit message · Wilmer Paulino

Avoid sending stfu for quiescent splice action while pending splice

We can't splice while one is already pending, so there's no point in
attempting to become quiescent.

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

This change fixes a minor protocol behavior bug in the Lightning Dev Kit's splicing feature. Previously, the code would try to send a 'stfu' (stop, let's become quiescent) message to start a new splice even when another splice was already pending. Since starting a second splice isn't allowed while one is pending, sending the message was pointless and could cause confusion or unnecessary protocol churn. The patch now skips sending 'stfu' in that situation and adds tests covering reconnection scenarios.

Lower-priorityRework max commitment transaction balance debug assertionsby Wilmer Paulino · 034892b5 · Feb 19, 2026 · 2 filesMessage 73 · AdequateInformational 19Details
Commit message · Wilmer Paulino

Rework max commitment transaction balance debug assertions

These assertions made sure that our balance would never dip below the
reserve, and if they ever were, that the balance must only move towards
meeting the reserve. With splicing, this doesn't always work, as a node
that is not interested in contributing could end up below the reserve of
the post-splice channel. Therefore, we rework these assertions such that
we only keep track of the previous commitment transaction balance, and
compare against the current, ensuring that our balance only increases
when below the reserve.

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

This commit changes internal bookkeeping checks that only run in debug builds. The old checks could incorrectly fire and crash a developer/test build when a Lightning channel was spliced (resized) in a way that left one party temporarily below the required reserve balance. The new checks relax that rule for splicing by only requiring balances move upward when below reserve, rather than always staying above reserve. It is a robustness fix for an assertion, not a fix for a live-network security vulnerability.

Lower-priorityAccount for missing balance in channel reserve assertions for splicesby Wilmer Paulino · 52c76abf · Feb 19, 2026 · 1 fileMessage 73 · AdequateInformational 21Details
Commit message · Wilmer Paulino

Account for missing balance in channel reserve assertions for splices

When we create the post-splice `FundingScope`, the monotonicity debug
assertion trackers were initialized to the post-splice balance without
accounting for pending HTLCs or anchor costs. Since splices can have
in-flight HTLCs (unlike fresh channel opens), the first commitment
transaction's actual balance was lower than the initialized max, causing
the debug assertion in `ChannelContext::build_commitment_transaction` to
fire.

Note that we don't need to recompute the full post-splice balance here.
We can rely on the pre-splice `FundingScope`'s
`holder/counterparty_max_commitment_tx_output` instead since they're
already accounted for there.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

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

This commit fixes an internal debug-only accounting bug that occurs when a Lightning channel is spliced (its funding amount is changed) while payments are still in flight. The bug made a non-release debug assertion incorrectly fire, but it did not change normal runtime behavior or allow funds to be stolen.

Lower-priorityBind Channel::commitment_signed result in internal_commitment_signedby Wilmer Paulino · 1b8617c3 · Feb 18, 2026 · 1 fileMessage 50 · ThinLow 32Details
Commit message · Wilmer Paulino

Bind Channel::commitment_signed result in internal_commitment_signed

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

This is a small Rust code cleanup in the Lightning Dev Kit's channel manager. It changes how the result of a commitment_signed call is handled so the result is first bound to a local variable before being passed to an error-handling macro. The change itself does not alter the visible behavior of the code, but it may fix a subtle Rust borrow-checker or drop-order issue that could affect correctness during channel state updates. There is no direct evidence in the commit that this fixes a security vulnerability.

Lower-priorityInline unreachable debug assertion in MsgHandlErrInternal::no_such_peerby Wilmer Paulino · f6ea33e9 · Feb 18, 2026 · 1 fileMessage 50 · ThinInformational 13Details
Commit message · Wilmer Paulino

Inline unreachable debug assertion in MsgHandlErrInternal::no_such_peer

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

This commit is a code cleanup, not a security fix. It moves a debug-only assertion (a check that only runs in test builds) from many call sites into a single helper function and renames that helper to make its purpose clearer. The runtime behavior is unchanged, and the assertion is still not active in production builds.

Lower-priorityAvoid persisting ChannelManager on handle_tx_* errorsby Wilmer Paulino · c9827fc0 · Feb 18, 2026 · 1 fileMessage 85 · StrongLow 34Details
Commit message · Wilmer Paulino

Avoid persisting ChannelManager on handle_tx_* errors

These errors will only ever affect our in-memory state, so there's no
need to persist the ChannelManager when we come across one. Note that
`tx_abort` is not included here because there is a possibility we force
close the channel, which we should persist.

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

This change adjusts when LDK saves its channel state to disk while processing certain transaction-sharing messages during channel setup. Previously, an error in handling these messages would trigger a disk save even though the error only affected temporary in-memory state. Now the code skips that unnecessary save, while still saving when something important actually happens (like completing a signing session). The commit message frames this as a cleanup/optimization, not a security fix.

Lower-priorityRefactor channel splice operations into helper in chanmon_consistencyby Wilmer Paulino · ff39dff9 · Feb 18, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Wilmer Paulino

Refactor channel splice operations into helper in chanmon_consistency

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

This commit is a straightforward code cleanup in a fuzz test file. It moves repeated splice-in and splice-out test operations into shared helper functions and updates the test cases to use them. There is no change to production code, no security fix, and no behavior change intended.

Lower-priorityAdd newline to fuzz log statementsby Wilmer Paulino · 7b8c68c9 · Feb 18, 2026 · 1 fileMessage 70 · AdequateInformational 15Details
Commit message · Wilmer Paulino

Add newline to fuzz log statements

This regressed at some point, making the logs harder to parse on a
failed test run.

70/100 · AdequateMessage clarity
✓ 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 fixes a formatting issue in fuzz testing logs by adding a missing newline at the end of each log entry. It only affects test output readability and has no security relevance.

Security candidateTime out incomplete MPP payments in chanmon_consistencyby Wilmer Paulino · 520dcbb2 · Feb 18, 2026 · 4 filesMessage 73 · AdequateLow 27Details
Commit message · Wilmer Paulino

Time out incomplete MPP payments in chanmon_consistency

This requires calling `timer_tick_occurred`. As a result, when
`timer_tick_occurred` is called, disabled/enabled updates and
`WarnAndDisconnect` events may be triggered.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
boot or update path
AI analysis · Low 27/100

This commit changes how a Lightning payment library runs its internal fuzz tests. It makes the test harness call the normal periodic timer function instead of a special stripped-down version, so incomplete multi-part payments time out properly during testing. The production code is mostly unchanged, but a few internal test-only helpers are now available under a new test-utilities feature flag. There is no direct evidence this fixes a real-world security bug; it appears to be a test-harness cleanup that makes fuzzing more realistic.

Lower-priorityConsider probe events for stuck payments check in chanmon_consistencyby Wilmer Paulino · 28ef7a8d · Feb 18, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · Wilmer Paulino

Consider probe events for stuck payments check in chanmon_consistency

Even though we don't explicitly send probes, because probes are detected
based on hashing the payment hash+preimage, it's rather trivial for the
fuzzer to build payments that accidentally end up looking like probes.

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
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit fixes a fuzz testing harness so it correctly tracks payments that the fuzzer accidentally generates as probe-like payments. It is a test-only change and does not affect real Lightning node behavior or user funds.

Lower-priorityUse channel_id over short_channel_id for payments in chanmon_consistencyby Wilmer Paulino · c0c09c7d · Feb 18, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Wilmer Paulino

Use channel_id over short_channel_id for payments in chanmon_consistency

The `short_channel_id` is no longer guaranteed to be stable with
splicing now that the fuzzer can actually lock splices.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit updates an internal fuzz-testing harness (a tool that automatically throws random inputs at the code to find bugs) to use a more stable channel identifier when building test payments. It does not change the production Lightning node code that real users run, and there is no indication it fixes a security vulnerability. The change is purely about making the fuzzer work correctly now that the codebase supports 'splicing,' a feature that can change a channel's short identifier.

Security candidateDrive splices to completion in chanmon_consistencyby Wilmer Paulino · 3c09513b · Feb 18, 2026 · 1 fileMessage 85 · StrongInformational 12Details
Commit message · Wilmer Paulino

Drive splices to completion in chanmon_consistency

This commit adds support for locking splices. This required confirming
transactions, which this target previously didn't consider.

It also fixes a `serial_id` collision, due to its generation using
the first 4 bytes of `get_secure_random_bytes`, that was preventing
splices from negotiating up to the `tx_signatures` exchange.

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
signing boundary
AI analysis · Informational 12/100

This commit updates a fuzzing test harness (chanmon_consistency) in the Lightning Dev Kit project. It adds the ability to simulate confirming splice transactions on a fake blockchain and fixes a serial ID collision in the test's random number generator. The changes are confined to test/fuzzing code and do not alter production Lightning logic.

Security candidateSupport async signing in chanmon_consistencyby Wilmer Paulino · ed520ae9 · Feb 18, 2026 · 2 filesMessage 68 · AdequateInformational 13Details
Commit message · Wilmer Paulino

Support async signing in chanmon_consistency

This commit adds new opcodes to enable/disable signer operations one by
one. Note that this only covers signer operations post-funding.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundarysigning or wallet path
AI analysis · Informational 13/100

This commit only changes test and fuzzing code. It adds new test controls that let developers temporarily disable or enable individual signer operations during fuzz testing, and it removes one unused signer-operation flag. There is no change to production Lightning code, so it does not create a real-world security vulnerability or fix one.

Lower-prioritySplit CI test script into parallel jobsby Joost Jager · a026acef · Feb 18, 2026 · 10 filesMessage 78 · AdequateInformational 15Details
Commit message · Joost Jager

Split CI test script into parallel jobs

Split the monolithic ci-tests.sh into six focused scripts that run as
separate parallel jobs via a reusable workflow (ci-build.yml):

- ci-tests-workspace.sh: workspace checks, tests, docs, and downstream compat
- ci-tests-features.sh: crate feature/flag combinations (dnssec, tokio, backtrace, test vectors, serde)
- ci-tests-bindings.sh: c_bindings builds and tests
- ci-tests-nostd.sh: no_std builds and compatibility checks
- ci-tests-cfg-flags.sh: experimental gated cfg flags (taproot, simple_close, lsps1_service, peer_storage)
- ci-tests-sync.sh: block sync and transaction sync clients

Shared setup (MSRV pins, backtrace) is extracted into ci-tests-common.sh.
The ci-tests.sh script now delegates to the sub-scripts for local use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

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 purely a refactoring of the project's continuous integration (CI) setup. It splits one large test script into six smaller, focused scripts that can run in parallel on GitHub Actions. There are no changes to the actual Lightning protocol code, cryptography, networking, or any code that end users or nodes run. It does not fix or introduce any security-relevant behavior.

Lower-priorityAllow intercepting HTLCs based on the source channelby Matt Corallo · 9a9531f3 · Feb 18, 2026 · 3 filesMessage 73 · AdequateInformational 19Details
Commit message · Matt Corallo

Allow intercepting HTLCs based on the source channel

It may be useful in some situations to select HTLCs for
interception based on the source channel in addition to the sink.
Here we add the ability to do so by adding new flags to
`HTLCInterceptionFlags`.

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

This commit adds new configuration options that let a Lightning node operator choose to intercept (pause and manually handle) forwarded payments based on whether the payment arrived over a publicly announced channel or a private one. It is a feature addition, not a fix for an existing security flaw. The code does not bypass fee or time-lock requirements, so it cannot be used to steal funds or force free routing on its own. The main risk is operational: a node operator who enables these new flags and then mishandles intercepted payments could cause payment delays or failures.

Lower-priorityPass constructed `PendingAddHTLCInfo` to chanman `forward_htlcs`by Matt Corallo · 113f9cbd · Feb 18, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · Matt Corallo

Pass constructed `PendingAddHTLCInfo` to chanman `forward_htlcs`

We jump through some hoops in order to pass a small list of objects
to `forward_htlcs` on a per-channel basis rather than per-HTLC.
Then, `forward_htlcs` builds a `PendingAddHTLCInfo` for each HTLC
for insertion. Worse, in some `forward_htlcs` callsites we're
actually starting with a `PendingAddHTLCInfo`, converting it to a
tuple, then back inside `forward_htlcs`.

Instead, here we just pass a list of built `PendingAddHTLCInfo`s to
`forward_htlcs`, cleaning up a good bit of code and even avoiding
an allocation of the HTLCs vec in many cases.

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

This commit is a straightforward internal code cleanup in the Lightning Dev Kit's channel manager. It changes how pending HTLC (Hashed Time-Locked Contract) forwarding information is passed between functions: instead of converting data into tuples and then back into a structured object, the structured object is passed directly. The commit message and diff show no intent to fix a security issue, and the behavior appears functionally equivalent.