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 change stops LND from opening new Lightning channels using the old 'legacy' commitment format. The legacy format makes it harder to recover funds if something goes wrong, because the money owed to you is tied to a secret key that chan…
Prevents opening new channels with the legacy commitment type, whose tweaked to_remote output complicates data-loss recoveryCloses a negotiation path where an empty channel_type TLV bypassed feature checks and forced a legacy channelAdds explicit RPC and wire rejection with a dedicated error code
This update fixes a bug in how LND handles old-style punishment transactions when a channel partner tries to cheat. Previously, tiny (dust) HTLCs were left as blank placeholder entries in the punishment data, which could cause the node to …
nil-pointer dereference risk in breach retribution pathlegacy revocation log handling inconsistency with modern formatdefensive hardening added for trimmed/dust HTLCs
This change tightens how LND reads Lightning invoices (BOLT 11). Previously, if an invoice contained more than one payment hash field, LND would silently keep the first one and ignore the rest. Now it rejects the invoice entirely. The rele…
Behavior change from 'use first duplicate field' to 'reject duplicate fields'New error type ErrDuplicatePaymentHash returned on duplicate payment hash fieldsMalformed/unsupported-length duplicate payment hash now treated as duplicate and rejected
This change tightens how LND reads Lightning invoices. Previously, if an invoice contained more than one payment hash field, LND would silently keep the first valid one and ignore the rest. Now it rejects such invoices outright. This preve…
Behavioral change from silent first-field acceptance to explicit rejection of duplicate payment hash fieldsPrevents invoice parsing from depending on field ordering when multiple payment hashes are presentCovers malformed first field + valid second field, closing a potential bypass
This change fixes how LND answers network 'ping' messages from other Lightning nodes. Previously, LND would sometimes silently ignore valid pings to limit reply traffic, which violates the Lightning protocol (BOLT 1) and could make a peer …
Protocol compliance fix: BOLT 1 requires a Pong for every valid PingRemoved silent suppression of Pong replies that could cause peer timeout/misbehaviorUnified rate limiting now accounts for amplification bandwidth, not just ping count
This commit updates LND's integration tests to stop using an obsolete 'legacy' channel type and adds a test confirming that LND now rejects that legacy type. The commit message says the real fix is elsewhere in the same pull request: previ…
Deprecated commitment format (legacy) is now rejected by RPCTest added to verify legacy channel type is refusedUnused legacy node configuration flag removed
This change fixes a bug in LND's handling of AMP (Atomic Multi-Path) payments. Previously, if one partial payment set failed to reconstruct its secret preimage, the entire invoice was canceled, including unrelated partial payment sets from…
Denial-of-service against reusable static AMP invoices by causing unrelated accepted HTLC sets to be canceledIncorrect invoice state transition from set-local failure to global invoice cancellationAvailability impact on multi-payer AMP invoice scenarios
This commit updates the Go programming language version used to build LND from 1.25.13/1.26.6 to 1.26.8 (language version) and 1.27.1 (toolchain). It also regenerates many automatically generated RPC files and adjusts linter settings. The …
Go version bump may indirectly address unlisted runtime/standard-library security fixesLarge regenerated protobuf files suggest dependency/toolchain refresh rather than logic changeLinter configuration expanded to suppress new checks, consistent with a toolchain upgrade
This commit is a routine build-maintenance change. It updates the project's Go linter configuration to a newer version and fixes the resulting style warnings: a WebSocket header spelling and several documentation comments that didn't start…
This commit is a housekeeping change that regenerates automatically generated RPC binding files using a newer Go compiler version. The only differences are in code comments (doc-comment formatting), not in actual program logic or API behav…
This commit is a routine build-and-test maintenance patch to make the LND codebase compile and pass tests with the upcoming Go 1.27 release. It upgrades the project's custom linter tool, refreshes many indirect tool dependencies, adjusts o…
No production code changesNo vulnerability fix or CVE reference presentDependency-only refresh in tools module (development tooling)
This commit is a routine maintenance update that changes which version of the Go programming language is used to build the lnd project. It does not change any application logic, fix a bug, or address a security vulnerability. The project i…
This commit fixes a bug in LND's invoice handling for reusable AMP (Atomic Multi-Path) invoices. Previously, if one payment set failed to reconstruct its preimage, the entire invoice was canceled, even though other valid payment sets on th…
Denial-of-service-like availability impact: a malicious or buggy payer could cause a whole reusable AMP invoice to be canceled, blocking legitimate concurrent payersSet-local failure incorrectly escalated to invoice-global cancellationRegression test added for concurrent-set survival after reconstruction failure
This commit adds the missing cryptographic signature layer for BOLT 12 offers in LND. It builds a Merkle tree from the message fields, signs that tree with a BIP-340 Schnorr signature, and now rejects invoice requests and invoices whose si…
Adds BIP-340 Schnorr signature verification for BOLT 12 invoice_request and invoice messagesMerkle tree commits to canonical re-encoded TLV records; non-minimal feature/amount encodings now rejected to preserve byte-exactnessSignature TLV type 240 and reserved range 240-1000 excluded from the signed Merkle root
This commit adds a new optional wallet feature to LND that lets users lock UTXOs until the transaction spending them reaches a chosen confirmation depth, instead of relying on a wall-clock timeout. It is a feature addition with safety chec…
New RPC fields release_after_spend_confs and confirmed_spend_height added to LeaseOutput and FundPsbtCustom lock ID enforced as required for confirmation-controlled FundPsbt leases; all-zero and reserved internal IDs rejectedCapability check (ResolveOutputLeaser) prevents silent downgrade to time-only lease when confirmation control is requested
This commit is a large internal code reorganization for the LND Lightning node. It moves channel state storage logic from the `channeldb` package into a new `chanstate` package, while keeping the same database keys, serialization formats, …
Large refactoring with no change to cryptographic or consensus-critical logicCodec serialization moved verbatim to new package; wire format unchangedDatabase bucket keys and TLV record types preserved
This change fixes a data-handling bug in LND's channel-opening code. When opening a Lightning channel using an optional 'auxiliary funding controller' (used for custom channel types such as Taproot Assets), the funding manager was previous…
Data-correctness fix in funding handshake: negotiated channel configs now exposed to auxiliary funding controllerAuxiliary funding controller receives incomplete channel state before patch, complete state after patchNo explicit security claim, CVE, or advisory referenced in commit or supplied materials
This change makes LND's BOLT 12 invoice and invoice-request reader actually check that the digital signature is valid, instead of only checking that a signature field exists. Before, an attacker could craft or modify a BOLT 12 message and …
Missing cryptographic verification on parsed BOLT 12 messages replaced with BIP-340 Schnorr signature verificationReader accepted any 64-byte placeholder signature before the patchNew negative tests verify rejection of wrong-signer and tampered Merkle-root fields
This commit only adds a new integration test for an existing feature called confirmation-controlled leases. It does not change production code, so it cannot introduce a security vulnerability or fix one directly. The test exercises how lon…
This update fixes two security-related bugs in LND's REST WebSocket proxy. First, a specially crafted WebSocket protocol header could crash the proxy (a panic). Second, the proxy previously had no limit on how large an incoming WebSocket m…
panic fix in request header parsingunbounded incoming WebSocket message read now cappedincorrect header value assignment possible before fix
Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.
Security candidatemulti: drop tor v2 onion production, keep wire codec faithfulby Erick Cestari · 2ae1db83 · May 22, 2026 · 31 filesMessage 88 · StrongLow 34Details
Commit message · Erick Cestari
multi: drop tor v2 onion production, keep wire codec faithful
Tor stopped serving v2 onion services in October 2021; lnd should not produce v2 addresses anymore, but it must still verify signatures on and re-broadcast peer NodeAnnouncement messages that carry v2 entries.
Stop accepting v2 as configuration input (lncfg), strip the legacy `--tor.v2` flag from the sample config, and remove the `tor.OnionHostToFakeIP` helper. Operator entry points (`--externalip`, `--listen`, `lncli connect`, `lncli wtclient towers add`) fail fast on a v2 `.onion` string, so upgrading nodes must remove any v2 entry from `lnd.conf` before lnd will start.
Filter persisted v2 state before use without rewriting on-disk records: the self-announcement builder strips any v2 entry inherited from the stored self-node; the watchtower client drops v2 entries from each persisted tower's address list (skipping the tower entirely if no non-v2 address remains); the autopilot connector, graph bootstrapper, and static-channel backup restore paths skip v2 entries before attempting outbound dials. Restrict the Tor controller's ADD_ONION path to v3 keys, including the encrypted on-disk legacy-key fallback.
For inbound announcements, keep the wire codec wire-faithful: `lnwire.WriteOnionAddr`, `graph/db.encodeOnionAddr`, and the matching decoders round-trip v2 bytes so `DataToSign` reproduces the bytes the remote peer signed, signature validation succeeds, and the announcement is persisted to the graph DB and re-broadcast across restarts byte-for- byte. RPC surfaces continue to expose the full address set so external tools can independently reproduce and verify the signed bytes.
Add a netann regression test that signs a [v3, v2, ipv4] announcement, round-trips it through Encode/Decode, verifies the signature, and confirms the resulting models.Node preserves the v2 entry. Add a graph bootstrapper test asserting v2 entries are skipped while v3 and plain TCP entries on the same node still surface as bootstrap candidates.
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 boundaryfuzzing or regression evidence
AI analysis · Low 34/100
This commit removes support for obsolete Tor v2 onion addresses from the Lightning Network Daemon (lnd). Tor v2 services were shut down by the Tor network in October 2021, so lnd will no longer create, accept, or dial v2 onion addresses. However, it still keeps the ability to store and re-broadcast v2 addresses that appear in messages from other nodes, because doing otherwise would break signature verification on those older announcements. The change is a cleanup and hardening patch rather than a fix for an active security vulnerability.
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 15/100
This commit only changes integration test code for the LND Lightning node. It makes a test more robust by checking that a specific coin (an 'outpoint') was spent in a mined block, rather than checking the exact transaction ID seen earlier. This handles cases where a transaction gets replaced via RBF (Replace-By-Fee) between the mempool check and block mining. There is no change to production code, no security fix, and no vulnerability.
AI review queuedcontractcourt+itest: tests for coop close insta-dispatchby Olaoluwa Osuntokun · eaa2d682 · May 21, 2026 · 5 filesMessage 83 · StrongLow 39Details
Commit message · Olaoluwa Osuntokun
contractcourt+itest: tests for coop close insta-dispatch
In this commit, we add three focused unit tests in contractcourt plus an itest that exercises the regression end-to-end.
The chain watcher harness gains an opt-in early-dispatch capture that records every notifyEarlyCoopClose invocation so tests can assert how many fired and what summaries they carried. On top of that:
TestEarlyDispatchCoopClose verifies the headline behavior. An async-path coop close fires exactly one early dispatch with IsPending=true and the post-N-conf flow still produces the regular CooperativeCloseInfo downstream.
TestEarlyDispatchForceCloseNotInvoked guards the carve-out: force closes never fire the early dispatch since their CLOSED_CHANNEL event timing is intentionally unchanged.
TestEarlyDispatchReorgRefiresOnReReplacement nails down the reorg path. Once a deep reorg removes the close, the early-dispatch flag is cleared and the next coop close re-fires the early event with its own summary, so a subscriber observes each distinct close attempt.
testZeroConfCoopCloseSubscribeEvents brings up a zero-conf channel between Alice and Bob with --dev.force-channel-close-confs=3 so the chain watcher takes the async multi-confirmation path. Alice subscribes to channel events, initiates a cooperative close, and the test asserts that CLOSED_CHANNEL fires after only one confirmation of the close tx (not after the full three) and that FULLY_RESOLVED_CHANNEL arrives once the close has reached three confirmations. A quiet-window assertion at the end verifies that exactly one CLOSED_CHANNEL event is delivered. If the suppression in MarkChannelClosed broke and let it re-fire NotifyClosedChannel at N confs, this assertion would catch the duplicate.
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
second-pass: broader security terminology
AI analysis · Low 39/100
This commit is a follow-up test and release-note patch for a previously fixed LND bug. The underlying issue was that subscribers listening for channel close events would not receive the 'CLOSED_CHANNEL' notification until a cooperative close transaction had been buried several blocks deep, instead of being told immediately when the close first appeared on-chain. The commit itself only adds unit tests and an integration test that prove the fix works, plus a release-note entry describing the restored behavior. It does not change production code, so it cannot introduce a new exploitable vulnerability on its own.
Lower-prioritycontractcourt+server: insta-dispatch CLOSED_CHANNEL on first confby Olaoluwa Osuntokun · cae2de1f · May 21, 2026 · 5 filesMessage 91 · StrongLow 32Details
Commit message · Olaoluwa Osuntokun
contractcourt+server: insta-dispatch CLOSED_CHANNEL on first conf
PR #10331 introduced a multi-confirmation reorg-aware dispatch in the chain watcher. In production builds CloseConfsForCapacity is at least 3, so the chain watcher waits for three confirmations of a close tx before running dispatchCooperativeClose, MarkChannelClosed, and NotifyClosedChannel. Subscribers of the SubscribeChannelEvents stream that used to receive a CLOSED_CHANNEL event after a single confirmation in v0.20.1 stopped seeing the event entirely on shorter test cycles and were delayed by two extra blocks on longer ones. This is the regression alexbosworth reported on zero-conf channels.
The intent behind the original change was to wait three confirmations under the hood for reorg safety while still dispatching a CLOSED_CHANNEL event to RPC subscribers immediately, matching the v0.20.1 surface. That insta-dispatch was wired into peer.WaitForChanToClose for the local CloseChannel response stream but was never extended to the channel-notifier path that drives SubscribeChannelEvents.
In this commit, we wire a new optional notifyEarlyCoopClose callback into the chain watcher's processDetectedSpend. The first time a coop close spend is detected on chain, the chain watcher synthesizes a ChannelCloseSummary with IsPending=true and dispatches a CLOSED_CHANNEL event over the channel notifier, no DB round-trip required. The callback is plumbed through ChainArbitratorConfig .NotifyEarlyClosedChannel to the new ChannelNotifier.NotifyEarlyClosedChannelEvent. The summary builder shared with dispatchCooperativeClose is extracted into buildCoopCloseSummary so the early and post-N-conf paths produce equivalent payloads.
A coopCloseEarlyDispatched flag on the chain watcher keeps the dispatch idempotent across blockbeat replays of the same spend, and the closeObserver clears it on negativeConfChan so a re-mined or replacement close after a deep reorg re-fires the preliminary event with its own summary. The early-dispatch call sits before the fast-path check so numConfs==1 also fires the early event through the same code path.
Suppressing the duplicate notify at MarkChannelClosed time happens inline in the chain_arbitrator MarkChannelClosed callback: after CloseChannel succeeds, NotifyClosedChannel is fired only when the close type is not CooperativeClose. Force, breach, and abandon paths intentionally remain on the existing N-confirmation dispatch contract.
91/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI analysis · Low 32/100
This commit fixes a regression in the LND Lightning node where users subscribing to channel-closure events stopped receiving timely notifications after a previous update added extra confirmation waiting. The fix restores the old behavior of notifying immediately when a cooperative channel close is first seen on the blockchain, while still waiting the full number of confirmations internally before finalizing the closure in the database. It is a bug-fix for event timing, not a security vulnerability, and does not introduce an attack vector.
Today NotifyClosedChannelEvent rebuilds its event by round-tripping through FetchClosedChannel, which forces the caller to have already persisted the close summary to the closed-channel bucket. The chain watcher needs to surface a CLOSED_CHANNEL event to RPC subscribers as soon as a coop close spend is first detected on chain, well before the close has reached the required confirmation depth at which the state machine would normally call MarkChannelClosed.
In this commit, we add NotifyEarlyClosedChannelEvent, which dispatches a ClosedChannelEvent built from a caller-supplied summary directly through the subscribe server. The summary is expected to carry IsPending=true so subscribers can recognize that the close has not yet been finalized in the database.
Two unit tests assert that the new path delivers the supplied summary verbatim and produces exactly one event per call.
This commit adds a new internal notification path in LND so that the chain watcher can tell RPC subscribers about a cooperative channel close as soon as it is seen on the Bitcoin blockchain, before the usual database bookkeeping is finished. It is a feature/refactoring change, not a fix for an active security bug. The new function simply forwards a caller-supplied close summary to subscribers without reading from the database.
Lower-prioritydocs: clarify taproot channel open defaultsby yyforyongyu · 654b680a · May 21, 2026 · 1 fileMessage 57 · ThinInformational 15Details
Commit message · yyforyongyu
docs: clarify taproot channel open defaults
57/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope! No meaningful explanatory body
Why it was queued
documentation-only discount
AI analysis · Informational 15/100
This commit only updates release notes documentation. It clarifies that users must explicitly request Taproot channel types and keep them private for now. There is no code change and no security fix or vulnerability introduced.
Lower-priorityfunding: reject public taproot opens before sendingby yyforyongyu · 70953e08 · May 21, 2026 · 2 filesMessage 50 · ThinLow 43Details
Commit message · yyforyongyu
funding: reject public taproot opens before sending
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Low 43/100
This commit adds a safety check in LND's channel-opening code to prevent users from accidentally creating public (advertised) Taproot payment channels. The current Taproot channel implementation is only meant for private channels, so the patch now rejects such requests locally before any network message is sent. It also adds tests to confirm both sides of the channel-opening handshake reject public Taproot channels.
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Low 35/100
This change stops LND from automatically opening Taproot Lightning channels when both peers merely advertise support for them. Instead, Taproot channels now require an explicit channel type request. The commit message explains this is because public Taproot channel announcements are not yet supported, so implicit negotiation could accidentally create channels that cannot be publicly announced. This is a behavior-hardening change rather than a fix for a known active exploit.
Lower-prioritymulti: rename "taproot" channel type to mean production variantby Olaoluwa Osuntokun · 0aa1d8bd · May 21, 2026 · 6 filesMessage 73 · AdequateInformational 19Details
Commit message · Olaoluwa Osuntokun
multi: rename "taproot" channel type to mean production variant
In this commit, we shuffle the CLI and RPC names so the bare "taproot" identifier refers to the production taproot channel type (final scripts, feature bits 80/81), i.e. the variant new integrations should actually be using. Before this commit, "taproot" on the CLI mapped to the staging bits, and anyone who wanted a real production taproot channel had to spell out "taproot-final" on `lncli openchannel` or `SIMPLE_TAPROOT_FINAL` over RPC. The recommended choice was hidden behind the longer name.
On the CLI (`lncli openchannel --channel_type=...`):
- "taproot" now selects the production variant (it used to mean staging). - "taproot-staging" is added for the legacy development bits, for peers that haven't moved over yet. - "taproot-final" stays as a deprecated alias for "taproot" so existing scripts don't break.
On the RPC (`CommitmentType`):
- `TAPROOT = 7` is added as the canonical name for the production type. `SIMPLE_TAPROOT_FINAL = 7` is kept as a deprecated alias via `option allow_alias = true`, so existing clients keep compiling against the same Go constant and the wire value doesn't change. - `SIMPLE_TAPROOT = 5` (staging) is unchanged. - `SIMPLE_TAPROOT_OVERLAY = 6` is unchanged. The taproot-assets daemon hard-codes this distinct enum value, so it's unaffected.
Wire compat is preserved end-to-end: only the comments, enum entry order, and the CLI string-to-enum mapping change. The numeric values and the existing generated Go identifiers stay stable.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 19/100
This change is a user-facing rename, not a security fix. The developers noticed that the short, obvious name 'taproot' was accidentally pointing to an older experimental ('staging') channel type, while the recommended production version required a longer, harder-to-find name. They swapped the labels so 'taproot' now means the production version, added 'taproot-staging' for the old experimental one, and kept 'taproot-final' as a compatibility alias. The underlying numeric codes on the network wire did not change, so existing software keeps working.
Security candidatemulti: update neutrino dep to include chainimport and header state fixby Olaoluwa Osuntokun · 88fff36e · May 21, 2026 · 3 filesMessage 78 · AdequateInformational 12Details
Commit message · Olaoluwa Osuntokun
multi: update neutrino dep to include chainimport and header state fix
Update the neutrino dependency to a version that includes the chainimport package for fast initial header sync, and the ResetHeaderState fix that allows P2P sync to continue after import.
The updated neutrino dependency changes the ChainService.Start method signature to accept a context.Context parameter. Update all call sites to pass context.TODO() to maintain existing behavior.
78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
signing boundary
AI analysis · Informational 12/100
This commit simply updates a software library dependency (neutrino) used by the Lightning Network Daemon (LND). The new version is said to add a faster way to import blockchain headers and fix a bug that could stop peer-to-peer header syncing after an import. The actual code change shown is only a version bump in dependency files plus a tiny whitespace cleanup in a linter config. There is no direct evidence in the commit of a security vulnerability or attack.
Pass the configured BlockHeadersSource and FilterHeadersSource into neutrino's HeadersImportConfig when initializing the neutrino backend. Set blockchain.BFFastAdd validation flags for regtest and simnet to skip contextual timestamp checks on rapidly-mined blocks.
Call Validate on the neutrino config before proceeding to catch misconfiguration early.
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 · Low 32/100
This commit connects two previously-unused configuration options for Neutrino (LND's lightweight Bitcoin backend) so that users can import block and filter headers from a file or URL instead of downloading them from peers. It also loosens timestamp checks for local test networks and adds an early validation step for the Neutrino configuration. The change is a feature wiring/fix rather than a clear security patch, but it touches header validation paths that protect the wallet's view of the blockchain.
itest: add neutrino headers import integration test
Add an integration test that verifies neutrino header import from local files. The test mines blocks, starts a reference node to generate header files via normal P2P sync, copies those files with import metadata, then starts a new node configured to import headers from the prepared files.
The test verifies the import node syncs to the chain tip and can continue syncing additional blocks mined after import via P2P, exercising the hybrid import-then-P2P sync path.
83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100
This commit adds a new automated test for the LND Lightning node software. It does not change any production code; it only verifies that a neutrino-based node can import block headers from pre-built files and then continue syncing over the peer-to-peer network. There is no security fix or vulnerability present in this change.
Document the neutrino fast sync feature that allows importing block and filter headers from local files or HTTP URLs on startup. Cover configuration for mainnet (block-dn.org), testnet3, testnet4, signet, file format details, security considerations, and troubleshooting.
85/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
documentation-only discount
AI analysis · Informational 15/100
This commit only adds documentation for an existing LND feature called neutrino headers import, which lets lightweight Bitcoin nodes sync faster by importing pre-built block and filter headers from files or URLs. There are no code changes, no bug fixes, and no security patches in this commit. It is purely a documentation update describing how to use the feature safely.
Add BlockHeadersSource and FilterHeadersSource fields to the Neutrino config struct. These accept either local file paths or HTTP(S) URLs pointing to pre-built header files for fast initial sync.
Add a Validate method that ensures both sources are specified together or both are empty.
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 · Informational 12/100
This commit adds new configuration options to LND's Neutrino (light client) settings that let users import pre-built blockchain header files from a local file or a web URL to speed up initial synchronization. It also adds a simple validation rule requiring both block headers and filter headers sources to be set together, or both left empty. There is no direct evidence in the commit that this introduces a security vulnerability.
Add commented examples for the new neutrino.blockheaderssource and neutrino.filterheaderssource options, showing both URL-based import from block-dn.org and local file path usage.
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 updates the example configuration file (sample-lnd.conf) with documentation comments. It adds explanations and commented-out examples for two existing Neutrino options that let users import Bitcoin block and filter headers from a URL or local file to speed up initial synchronization. No code behavior is changed, and the options themselves are not new in this commit.
routerrpc: pass outgoing channels to probe requests
50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 18/100
This commit fixes a small bug in LND's fee-estimation API: when a user asked to probe a payment route through specific outgoing channels, the list of channels was accidentally dropped before the actual probe was sent. The patch simply passes the channel list through to the probe request. It is a functional bug fix rather than a clear security vulnerability, but it could have caused users to receive fee estimates based on routes they did not intend to use.
Channel update notifications now flow through ChannelNotifier, so the existing backup subscription deny-list started treating commitment updates as backup-relevant events. This makes SubscribeChannelBackups emit on every channel update, even though those updates can happen much more frequently than lifecycle changes.
Switch the backup subscription to an allow-list of lifecycle events that should trigger the stream. Also document that ChannelNotifier includes high-frequency state updates, so lifecycle-only consumers should filter explicitly.
68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 25/100
This change fixes a bug where a backup notification stream would fire far too often. Previously, routine channel state updates were treated as backup-relevant, causing the stream to emit on every update. The patch switches to an explicit allow-list of true lifecycle events (open, close, pending, resolved, funding timeout) and documents that the underlying notifier also carries high-frequency state updates. There is no direct security exploit here, but the excess noise could hide real backup-relevant events or waste resources.
lnwallet/rpcwallet: accept zero-value WitnessUtxo entries in remote-sign prep
Before forwarding a SignOutputRaw request to the remote signer instance, remoteSign rebuilds a PSBT from the unsigned transaction and annotates every input with a WitnessUtxo (so the downstream walletkit.SignPsbt call accepts it — taproot sighash computation requires the prev output of every input, not just the one being signed).
For non-signed inputs the prep stage first asks the watch-only wallet about the outpoint via FetchOutpointInfo, then — when the wallet does not own or track the outpoint — falls back to the sign descriptor's PrevOutputFetcher. The fallback previously required `utxo.Value != 0`, which silently dropped legitimate zero-value entries on the floor and left the corresponding PSBT input bare.
The walletkit.SignPsbt entry point on the remote signer then rejected the PSBT with "input (index=N) doesn't specify any UTXO info" because input N had neither a WitnessUtxo nor a NonWitnessUtxo annotation.
BIP-322 (signing virtual transactions for message attestation) is the canonical hitter: its to_spend output is mandated by the BIP to be exactly value=0 with the message commitment as pk_script, and that output is referenced as input 0 of every BIP-322 to_sign transaction. Any caller that drives a BIP-322 sign through a remote-signer LND deployment was failing for this reason.
The validation we actually want is that the fetched prev output is representable as a usable WitnessUtxo: non-nil and with a non-empty pk_script. Drop the Value check; the zero-value case is well-formed and the resulting PSBT input will serialize cleanly. The fetched-but- empty-pk_script case continues to be rejected (a WitnessUtxo with empty PkScript is malformed at PSBT serialization), and the warning log when no fallback resolves the outpoint is preserved verbatim.
Lift the WitnessUtxo-population loop out of remoteSign into a package-level helper so the resolution policy is unit-testable without spinning up a real wallet + remote signer pair. The helper takes a fetchOutpointInfoFn callback that mirrors lnwallet.WalletController.FetchOutpointInfo. No behavior change for the wallet-owns-it path or the no-fallback path.
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 boundaryupdate trustsigning or wallet path
AI analysis · Low 43/100
This commit fixes a bug in LND's remote-signing setup where zero-value previous transaction outputs were wrongly ignored when preparing a PSBT for a remote signer. The most concrete affected use case is BIP-322 message attestation, where the protocol requires a zero-value output. Because of the bug, the remote signer would refuse to sign, causing a functional failure rather than a loss of funds. The patch removes the mistaken zero-value check and adds a unit-testable helper function.
Security candidatelnwallet/rpcwallet: add unit tests for WitnessUtxo population helperby Olaoluwa Osuntokun · 6bb2c6f5 · May 19, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · Olaoluwa Osuntokun
lnwallet/rpcwallet: add unit tests for WitnessUtxo population helper
Cover the four resolution branches plus the BIP-322 regression case:
- wallet-owns-it: FetchOutpointInfo returns a Utxo, helper writes the matching WitnessUtxo into the PSBT input. - external-fallback: wallet returns ErrNotMine, helper writes the WitnessUtxo from the sign descriptor's PrevOutputFetcher. - zero-value-fallback: same as above with the fetched entry's Value set to zero. This is the BIP-322 to_spend shape (input 0 of every BIP-322 to_sign references a virtual prev whose Value is mandated to be zero); the helper must populate the WitnessUtxo rather than silently skip it. - no-fallback: wallet returns ErrNotMine and no PrevOutputFetcher is provided; the helper leaves the input bare and the warning log fires (asserted only by absence of a populated WitnessUtxo). - empty-pk_script-fallback: the fetcher returns a non-nil entry with an empty PkScript; the helper rejects it as unusable (the PSBT WitnessUtxo serializer requires a non-empty script) and leaves the input bare.
The signed input (signDesc.InputIndex) is intentionally left untouched by the helper — that input is the one the caller's main path will populate later — and the tests cross-check that invariant on the wallet-owns-it case.
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
signing boundarysigning or wallet path
AI analysis · Informational 15/100
This commit only adds new unit tests for an existing helper function in LND's RPC wallet code. It does not change any production logic, so it cannot introduce a security vulnerability or directly fix one in the code being committed. The tests document and verify how the helper populates PSBT witness UTXO data, including a regression test for BIP-322 zero-value outputs.
Add the bug-fix entry under 0.21.0 with a link to the PR.
77/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body
Why it was queued
documentation-only discount
AI analysis · Low 29/100
This commit is only a documentation update adding a release-note entry for an already-merged bug fix. The underlying fix changes how LND's remote-signer PSBT preparation handles zero-value previous outputs. It allows signing workflows for special Bitcoin transactions (BIP-322 'to_sign' transactions) where a previous output is required to have zero value. Previously, the remote signer silently dropped these inputs, causing a later signing step to fail with an error. There is no direct code change in this commit, only a description of the prior fix.
Also remove the now-unused PaymentState enum and PaymentStatus message that were only used by the deprecated TrackPayment response stream, plus the corresponding REST annotations from the yaml files.
Drop the now-orphan routerrpc.SendToRouteResponse message that was only referenced by the deleted routerrpc.SendToRoute RPC.
Also remove the deprecated outgoing_chan_id field from lnrpc.QueryRoutesRequest (tag 14) and routerrpc.SendPaymentRequest (tag 8); their tag numbers are now reserved. Callers must use the multi-channel outgoing_chan_ids field introduced in 0.20.
Drop the compat fallback in router_backend.go that previously consumed the field, and regenerate all protobuf, gRPC, REST gateway, JSON, and swagger files.
73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Low 28/100
This commit removes several old, previously-deprecated payment-related API methods from the Lightning Network Daemon (LND). It is a planned cleanup that breaks backward compatibility for clients still using those old methods. There is no indication in the commit that this fixes an active security vulnerability; it is primarily a maintenance and API-surface reduction change.
Lower-prioritydocs: document deprecated RPC and field removals in 0.21 release notesby Erick Cestari · 05bdb663 · May 19, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · Erick Cestari
docs: document deprecated RPC and field removals in 0.21 release notes
Add entries to the Breaking Changes section covering the payment and tracking RPCs and the `outgoing_chan_id` field removed in this branch, all of which were announced for removal in 0.21 via the 0.20 release notes.
85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
documentation-only discount
AI analysis · Informational 15/100
This commit only updates the 0.21 release notes to document RPC and field removals that had already been announced in the 0.20 release notes. It is a documentation-only change with no code modifications, no security fixes, and no new vulnerabilities.
In this commit, we added createValidTLVExtraData which creates a valid TLV data, and use it in place of createExtraData for messages that their Encode or Decode requires validating the TLV data, which were failing initially.
This commit only changes test code in LND's lnwire package. It adds a helper function that creates properly formatted TLV (Type-Length-Value) data for use in unit tests, replacing an older helper that generated random bytes. Some message types now require valid TLV formatting during encoding/decoding, so the tests were updated to supply valid data. There is no change to production code and no security vulnerability is present.
In this commit, we include onion message to the list of lnwire messages for benchmark testing.
70/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
AI analysis · Informational 15/100
This commit only adds a test helper that creates a random sample 'onion message' for benchmark testing of LND's wire protocol encoding/decoding. It does not change any production code, network handling, or security behavior.
Lower-prioritydocs: add release note for EstimateRouteFee outgoing chansby Roy Lee · 11349b89 · May 19, 2026 · 1 fileMessage 62 · AdequateInformational 15Details
Commit message · Roy Lee
docs: add release note for EstimateRouteFee outgoing chans
62/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope! No meaningful explanatory body
Why it was queued
documentation-only discount
AI analysis · Informational 15/100
This commit only adds documentation to the release notes describing a new feature: the ability to restrict fee estimates to specific first-hop outgoing channels in the EstimateRouteFee RPC and lncli command. There is no code change, no bug fix, and no security-related content.