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.
Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.
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
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
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
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
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 …
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…
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…
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
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
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…
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'
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
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
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.
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.
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
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
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
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
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
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
AI review queuedAdd `ChannelDetails::next_splice_out_maximum_sat`by Leo Nash · 9bc7b194 · May 5, 2026 · 3 filesMessage 35 · OpaqueInformational 15Details
Commit message · Leo Nash
Add `ChannelDetails::next_splice_out_maximum_sat`
35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100
This commit adds a new read-only field called next_splice_out_maximum_sat to the public ChannelDetails struct. It exposes how much bitcoin can be spliced out of a channel in the next splice operation. There is no change to logic, permissions, or cryptographic checks; it is purely an API/data exposure addition. No security issue is evident from the diff.
AI review queuedAdd `AvailableBalances::next_splice_out_maximum_sat`by Leo Nash · 1d28afca · May 5, 2026 · 5 filesMessage 63 · AdequateLow 46Details
We previously determined this value by subtracting the htlcs, the anchors, and the commitment transaction fee. This ignored the reserve, as well as the at-least-one-output requirement in zero-reserve channels.
This new field now accounts for both of these constraints. It can be seen as the total spliceable balance from the channel.
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Low 46/100
This commit fixes how rust-lightning calculates the maximum amount a user can splice out of a Lightning channel. Previously the calculation ignored channel reserve rules and a requirement to keep at least one output, which could have allowed a user to request an invalid splice-out that the protocol or counterparty would reject. The new field properly accounts for both constraints, making splice-out operations safer and more likely to succeed.
Lower-priorityRun existing validation code against the candidate funding scopeby Leo Nash · 33b5166c · May 5, 2026 · 1 fileMessage 73 · AdequateModerate 59Details
Commit message · Leo Nash
Run existing validation code against the candidate funding scope
As a result, we now validate that both commitments retain at least one output under the new funding scope, which is crucial for zero-reserve channels.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
defensive validation
AI analysis · Moderate 59/100
This commit tightens validation when Lightning channels are re-funded or 'spliced.' Previously, some checks used rough estimates and debug-only assertions; now the code builds a realistic candidate funding state and runs the same balance/reserve checks against it. The key fix is ensuring that after a splice, both sides' commitment transactions still have at least one output, which matters for zero-reserve channels. Without this, a malicious or malformed splice proposal could potentially reduce a party's balance so low that their commitment transaction becomes empty or invalid, risking loss of funds or channel failure.
Lower-prioritySwitch to ldk-fuzzing-corpus repo rather than CI cacheby Matt Corallo · efa95b49 · May 4, 2026 · 2 filesMessage 73 · AdequateInformational 14Details
Commit message · Matt Corallo
Switch to ldk-fuzzing-corpus repo rather than CI cache
Rather than storing our fuzzing corpus in the CI cache, move it to a new repo which anyone can use for their own local fuzzing and can be updated outside of CI with additional seeds.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
fuzzing or regression evidencedocumentation-only discount
AI analysis · Informational 14/100
This change only moves the project's fuzzing test data from a GitHub Actions cache into a separate public repository. It updates CI scripts to clone that repository, copy files into place, and open pull requests with any newly discovered fuzz inputs. There is no change to the actual Lightning Dev Kit code that users run, and nothing in the diff suggests a security vulnerability or fix.
Lower-priorityFix typo in `_encode_tlv` leading to confused encodingby Matt Corallo · 05135aec · May 1, 2026 · 1 fileMessage 50 · ThinModerate 61Details
Commit message · Matt Corallo
Fix typo in `_encode_tlv` leading to confused encoding
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Moderate 61/100
This commit fixes a small but meaningful typo in a Rust macro used to encode Lightning protocol data. The misplaced parenthesis could cause the macro to match the wrong pattern when encoding optional fields that use a custom encoding. That could lead to messages being serialized incorrectly, which in a Lightning node might cause peers to reject messages, fail to parse state, or potentially behave in unexpected ways during channel operations. The fix is one character moving a closing parenthesis.
Lower-priority`as_ref()` before wrapping encoded types in writing `option` TLVsby Matt Corallo · 8b1c7710 · Apr 30, 2026 · 4 filesMessage 73 · AdequateLow 35Details
Commit message · Matt Corallo
`as_ref()` before wrapping encoded types in writing `option` TLVs
We almost certainly don't want to be moving `option` TLVs during serialization, and while we had logic elsewhere to work around this previously its nice not to have to in the future.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 35/100
This commit changes how optional data fields are serialized in Lightning Dev Kit. Previously, the code could move (consume) values when wrapping them for encoding. Now it borrows them via `.as_ref()` first. The change is framed as a cleanup to avoid future bugs, but the prior workaround suggests there was a real risk of incorrect serialization or use-after-move behavior. There is no direct evidence of an exploitable vulnerability in the diff itself.
Extend the rustfmt CI job to check the fuzz workspace.
This covers fuzz alongside the root workspace and lightning-tests.
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 only adds a code-formatting check for the fuzz testing workspace in the project's continuous integration (CI). It also reformats a few lines in one fuzz test file to satisfy the new check. There is no functional code change and no security impact.
Skip pre-splice announcement_signatures on reestablish
When a splice transaction confirms on both sides while peers are disconnected, each peer's `channel_reestablish` carries `my_current_funding_locked` with the splice txid. In the reestablish handler, `get_announcement_sigs` was called before the inferred `splice_locked` was processed and the splice was promoted, so `self.funding` still pointed to the pre-splice scope. If `announcement_sigs_state` was `NotSent`, the generated `announcement_signatures` carried the pre-splice `short_channel_id` and bitcoin key — which the peer (having already promoted via its own inferred `splice_locked`) would verify against the post-splice `UnsignedChannelAnnouncement`, failing the signature check and force-closing.
Skip the pre-promotion call when `my_current_funding_locked` matches the splice we've already confirmed — i.e. `pending_splice.sent_funding_txid` is set and equals the peer's locked txid. `maybe_promote_splice_funding` emits correct post-splice signatures after the inferred `splice_locked` is processed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
88/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
signing boundary
AI analysis · Moderate 57/100
This commit fixes a bug in the Lightning Dev Kit where reconnecting after a channel 'splice' (a funding update) could cause one peer to send outdated channel announcement signatures. The peer receiving those stale signatures would reject them and force-close the channel. The fix skips generating announcement signatures until the splice has been promoted to the new funding, so both sides agree on the current channel state.
Ignore stale announcement_signatures instead of force-closing
A peer may transmit `announcement_signatures` signed over a stale `short_channel_id` — most plausibly a retransmission or a peer implementation whose view hasn't caught up to our post-splice promotion. Verifying such sigs against the current `UnsignedChannelAnnouncement` (built from `self.funding`) always fails the hash check, which previously produced a force-close.
BOLT #7 does not require closing in this situation; the mismatch is expected across splice handoffs. Short-circuit with `ChannelError::Ignore` when `msg.short_channel_id` doesn't match the current funding's scid, leaving the genuine invalid-signature paths in place for sigs that actually target our current scid.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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
signing boundary
AI analysis · Moderate 62/100
This change fixes a bug where a Lightning node would unnecessarily force-close a payment channel if its peer sent an outdated 'announcement_signatures' message referencing the old channel identifier after a splice (a channel funding update). The node now simply ignores these stale messages, keeping the channel open. The bug was not a direct theft of funds, but it could cause unwanted channel closures and disruption.
Model RBF splice tx replacement in chanmon_consistency
The SplicePending event handler was immediately confirming splice transactions, which caused force-closes when RBF splice replacements were also confirmed for the same channel. Since both transactions spend the same funding UTXO, only one can exist on a real chain.
Model this properly by adding a mempool-like pending pool to ChainState. Splice transactions are added to the pool instead of being confirmed immediately. At chain-sync time, pending transactions are sorted by txid and confirmed together in one block; candidates that double-spend an already-confirmed outpoint or another candidate earlier in the sort are dropped.
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 17/100
This commit fixes a bug in a fuzzing test harness, not in the production Lightning Dev Kit code. The test was incorrectly treating splice transactions as confirmed immediately, which could cause simulated force-closes when multiple RBF (fee-bump) replacements existed. The fix adds a fake mempool so the test models real Bitcoin behavior: only one transaction spending the same funding output can be confirmed. End users running real Lightning nodes are not directly affected.
Security candidateRename `BestBlock` to `BlockLocator`by Matt Corallo · dcba68d2 · Apr 24, 2026 · 22 filesMessage 58 · ThinInformational 20Details
Commit message · Matt Corallo
Rename `BestBlock` to `BlockLocator`
`BestBlock` is now really a pointer to a block rather than just a block itself, so its weird to still call it `BestBlock`. Here we rename it to `BlockLocator`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is a straightforward rename of the Rust type `BestBlock` to `BlockLocator` across the rust-lightning codebase. The struct's fields, serialization format, and behavior are unchanged; only identifiers, comments, and documentation are updated to reflect that the value now also carries recent ancestor block hashes (a 'block locator') rather than just a single best block. There is no security-relevant code change.
Replace the custom LSPS5 URL parser with `bitreq::Url` while keeping the LSPS5-specific HTTPS and length checks. This reduces bespoke parsing logic and aligns accepted webhook URLs with the HTTP client's URL handling.
Co-Authored-By: HAL 9000 Signed-off-by: Elias Rohrer <dev@tnull.de>
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 35/100
This commit swaps a custom-built URL parser for a well-known library (bitreq::Url) when handling LSPS5 webhook URLs. The goal is to reduce home-grown parsing bugs and make accepted URLs match what the HTTP client actually understands. It keeps the rule that only HTTPS URLs are allowed and still enforces a length limit elsewhere. The change is a hardening/refactoring move rather than a fix for a known active vulnerability, though it could close gaps between the old parser and the real HTTP client.
Handle DiscardFunding with FundingInfo::Tx variant in chanmon_consistency
The process_events! macro only handled DiscardFunding events with FundingInfo::Contribution, but splice RBF replacements can produce DiscardFunding with FundingInfo::Tx when the original splice transaction is discarded.
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 16/100
This is a small fix to a fuzz-testing harness (a tool that automatically feeds random inputs to software to find crashes). The change teaches the test harness to recognize one more type of internal event, `DiscardFunding` carrying a full transaction, so the harness does not panic and abort the fuzzing run. It is not a fix in the production Lightning protocol code itself, and there is no indication it can be exploited by an attacker on a real network.
Several code paths exit quiescence by calling `clear_quiescent()` directly without also clearing the disconnect timer via `mark_response_received()`. This causes the timer to fire after the splice completes or is aborted, spuriously disconnecting the peer.
Replace `clear_quiescent()` with `exit_quiescence()` in `on_tx_signatures_exchange`, `reset_pending_splice_state`, and `peer_connected_get_handshake`, which clears both the quiescent state and the disconnect timer.
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
Why it was queued
signing boundary
AI analysis · Low 44/100
This commit fixes a bug in the Lightning Dev Kit where a timer meant to disconnect unresponsive peers could fire by mistake after a splice operation completed, was aborted, or after reconnecting. The fix makes sure the timer is cleared whenever the protocol leaves its 'quiet' (quiescent) state, preventing unnecessary peer disconnections.
Return InteractiveTxMsgError from splice_init and tx_init_rbf
The prior two commits manually intercepted ChannelError::Abort in the channelmanager handlers for splice_init and tx_init_rbf to exit quiescence before returning, since the channel methods didn't signal this themselves. The interactive TX message handlers already solved this by returning InteractiveTxMsgError which bundles exited_quiescence into the error type.
Apply the same pattern: change splice_init and tx_init_rbf to return InteractiveTxMsgError, adding a quiescent_negotiation_err helper on FundedChannel that exits quiescence for Abort errors and passes through other variants unchanged. Extract handle_interactive_tx_msg_err in channelmanager to deduplicate the error handling across internal_tx_msg, internal_splice_init, internal_tx_init_rbf, and internal_tx_complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.7 (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 33/100
This commit is a code-quality and correctness refactor for the Lightning Dev Kit's handling of splicing and RBF (fee-bump) negotiations. It makes error handling more consistent so that when a channel negotiation fails, the channel properly exits 'quiescence' (a paused state used during splicing) instead of getting stuck. The commit also adds tests confirming that misbehaving peers who send splice or RBF messages before quiescence are established receive a warning and are disconnected. There is no direct evidence this fixes an active exploit, but it removes a class of state-consistency bugs that could lead to stuck channels or incorrect behavior.
The `exited_quiescence` field on `MsgHandleErrInternal` and `InteractiveTxMsgError` is a leaky abstraction -- the channelmanager error handling shouldn't know about quiescence, only whether the holding cell needs to be released.
Infer this from the presence of a `tx_abort` instead, since exiting quiescence via an error always produces one. Remove `exited_quiescence` from `InteractiveTxMsgError`, `MsgHandleErrInternal`, and the return type of `Channel::tx_abort`, along with the `with_exited_quiescence` builder.
For unfunded v2 channels, `tx_abort` may be present without quiescence having been exited, but the holding cell release is a no-op since an unfunded channel won't have any HTLCs. Similarly, the unreachable `debug_assert!(false)` branch in `fail_interactive_tx_negotiation` for funded channels produces a `tx_abort` without exiting quiescence, but the holding cell release is a no-op since the channel is still quiescent.
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 28/100
This commit is a code-cleanup refactor in a Lightning network library. It removes a redundant flag called `exited_quiescence` and instead decides whether to release queued payments by checking whether a `tx_abort` message was produced. The change is described by the authors as fixing a 'leaky abstraction' where error-handling code knew too much about channel quiescence. It is not a security patch for an exploitable vulnerability, but it touches logic that controls when HTLCs (payments) held during channel quiescence are released, so a bug here could theoretically affect payment liveness or state consistency.
Lower-priorityExit quiescence when tx_init_rbf is rejected with Abortby Jeffrey Czyz · adf87326 · Apr 23, 2026 · 3 filesMessage 95 · StrongModerate 60Details
Commit message · Jeffrey Czyz
Exit quiescence when tx_init_rbf is rejected with Abort
When tx_init_rbf is rejected with ChannelError::Abort (e.g., insufficient RBF feerate, negotiation in progress, feerate too high), the error is converted to a tx_abort message but quiescence is never exited and holding cells are never freed. This leaves the channel stuck in a quiescent state.
Fix this by intercepting ChannelError::Abort before try_channel_entry! in internal_tx_init_rbf, calling exit_quiescence on the channel, and returning the error with exited_quiescence set so that handle_error frees holding cells. Also make exit_quiescence available in non-test builds by removing its cfg gate.
Update tests to use the proper RBF initiation flow (with tampered feerates) so that handle_tx_abort correctly echoes the abort and exits quiescence, rather than manually crafting tx_init_rbf messages that leave node 0 without proper negotiation state.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
95/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Moderate 60/100
This commit fixes a bug in the Lightning Dev Kit where a channel could get stuck in a 'quiet' state after a fee-bump (RBF) attempt is rejected. Normally, when an RBF request is rejected, the channel should resume normal operation and release any held payments. The bug left the channel frozen, which could delay or block payments. The fix ensures the channel exits the quiet state and frees held payments when an RBF rejection occurs.
Lower-priorityExit quiescence when splice_init is rejected with Abortby Jeffrey Czyz · bd5b04dc · Apr 23, 2026 · 2 filesMessage 73 · AdequateModerate 53Details
Commit message · Jeffrey Czyz
Exit quiescence when splice_init is rejected with Abort
The same bug fixed in the prior commit for tx_init_rbf also exists in internal_splice_init: when splice_init triggers FeeRateTooHigh in resolve_queued_contribution, the ChannelError::Abort goes through try_channel_entry! without exiting quiescence.
Apply the same fix: intercept ChannelError::Abort before try_channel_entry!, call exit_quiescence, and return the error with exited_quiescence set.
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 · Moderate 53/100
This commit fixes a state-handling bug in the Lightning Dev Kit's splicing feature. When a splice attempt is rejected because the proposed transaction fee rate is too high, the code now properly exits 'quiescence' (a temporary pause in normal channel activity) before returning the error. Previously, the channel could remain stuck in quiescence, which might disrupt normal channel operation and message flow.
Lower-priorityAdd FilesystemStoreV2Error for v1 data detectionby benthecarman · 61125214 · Apr 21, 2026 · 1 fileMessage 68 · AdequateInformational 19Details
Commit message · benthecarman
Add FilesystemStoreV2Error for v1 data detection
FilesystemStoreV2::new previously returned io::Error with ErrorKind::InvalidData when the data directory contained top-level files left behind by FilesystemStore (v1). That forced us to match on an error that could potentially be given by our normal io calls. This adds a dedicated FilesystemStoreV2Error enum with a V1DataDetected(PathBuf) so we can distinguish between normal io errors and an old V1 fs store.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 19/100
This commit is a code-quality improvement, not a security fix. It changes how a new version of a file-storage component reports that it has found leftover data from the older version. Previously it returned a generic I/O error; now it returns a dedicated, clearly typed error so callers can tell the two situations apart. No vulnerability is patched and no exploit is prevented.
Replace FundingTemplate contribution methods with FundingBuilder
This results in a slight change of behavior: now these methods reuse and amend the prior contribution, as opposed to always starting from a fresh contribution, which would be the desired expected behavior by users.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 27/100
This commit refactors how users build funding contributions for Lightning channel splicing and RBF (fee-bumping). It replaces several convenience methods with a builder-style API and changes the behavior so that, when a prior splice request exists, new calls amend (add to) the prior request instead of silently replacing it. The commit also removes the ability to start an RBF attempt when there is no prior contribution, and adds tests showing that prior contributions can be amended. There is no explicit security bug in the diff, but the behavioral change could affect how wallets construct splice transactions and could, if callers misunderstand the new semantics, lead to unintended transaction shapes or fee handling.
This lets callers easily amend a prior contribution in place and only re-run coin selection when the new request cannot be satisfied with the existing inputs.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 32/100
This commit refactors how Bitcoin Lightning channel 'splice' funding requests are built. It introduces a FundingBuilder API that lets callers amend an earlier contribution (for example, changing the amount or adding a withdrawal output) without re-running wallet coin selection when the existing inputs can still cover the new request. The change also moves prevtx-size validation into the builder and adds explicit error variants for missing coin-selection sources and oversized previous transactions. There is no direct evidence in the commit or supplied references that this fixes a known security vulnerability; it reads as a feature/refactoring change with defensive hardening.
Disallow net-negative contributions when adding value
When a user requests to add value via coin-selected inputs, we should strive to fulfill their request. Allowing them to remove value from the channel is undesired as it goes against their request. While we still allow adding outputs to enabled mixed contributions, their funds must now always come from the set of coin-selected inputs, and must never draw from the channel balance resulting in a smaller added value.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Moderate 59/100
This commit fixes a logic bug in Lightning channel 'splicing'—a way to add or remove funds from an existing channel. Previously, when a user tried to add funds to a channel while also requesting some money be sent elsewhere, the software could silently reduce the channel balance instead of increasing it. The change now ensures that when wallet inputs are provided to add value, the added value truly goes into the channel and any side payments come only from those wallet inputs, not from the existing channel funds.
Lower-priorityFix chanmon_consistency for real hashesby Joost Jager · c26f3c72 · Apr 15, 2026 · 1 fileMessage 68 · AdequateInformational 14Details
Commit message · Joost Jager
Fix chanmon_consistency for real hashes
Store real payment preimages in `chanmon_consistency` and use them when claiming funds, so the real-hashes runner does not treat `payment_hash` bytes as a stand-in preimage.
AI tools were used in preparing this commit.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 14/100
This change fixes a fuzz-testing harness so it generates and stores real payment preimages instead of reusing payment hash bytes as fake preimages. It only affects internal test code, not the production Lightning library, so it has no direct security impact on real users.
Move shared fuzz logic into the root fuzz crate and generate fake-hashes and real-hashes runner crates.
Keep `chanmon_consistency_target` on the real-hashes side, remove the fuzz-local Cargo config, and update scripts, CI, coverage, and docs to use explicit flags for each runner.
Generate the hash-mode compile checks in the wrapper bins without a synthetic Cargo feature, while keeping the wrapper template close to its original shape.
AI tools were used in preparing this 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 evidenceseed or entropy pathsigning or wallet pathboot or update pathauthentication pathparser or protocol path
AI analysis · Informational 15/100
This commit is a build-system and test-infrastructure refactor for the project's fuzzing (automated randomized testing) harness. It splits fuzz test runners into two groups based on whether they use fake or real cryptographic hashes, moves shared code into a common crate, and updates CI scripts, coverage tooling, and documentation accordingly. There is no change to the actual Lightning protocol library or to how production nodes behave, and no security vulnerability is introduced or fixed.
This commit removes `FundingContribution::value_added` as tracking it is unnecessary -- it can just be derived from the total amount in minus total amount out minus fees.
This commit refactors how a Lightning channel funding contribution calculates the amount being added to or removed from a channel. Instead of storing a separate 'value_added' field, the code now derives it from the inputs, outputs, change, and fees. The change removes an explicit input-sufficiency check and rewrites fee-buffer logic. It appears to be a code-cleanup and correctness refactor rather than a clear security fix, but it alters validation boundaries around fees and change in splicing transactions.