AQ
← All projectsACINQ

Eclair

Scala implementation of a Lightning Network node.

BitcoinLightning NetworkNormal
Repository coverage

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

51security candidates46second-pass queue191AI analyses
22commits · 30 days
46commits · 60 days
89commits · 180 days
168commits · 365 days
Backfill bands
Aug 5 → Feb 691 seen11 candidatesComplete
Feb 6 → Jun 660 seen5 candidatesComplete
Jun 6 → Jul 62 seen0 candidatesComplete
Jul 6 → Aug 514 seen0 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.

79/100 average clarity
126Strong · 80–100
52Adequate · 60–79
19Thin · 40–59
8Opaque · 0–39
1security candidate 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.
Bastien Teinturier13332127581
pm4727622270
Fabrice Drouin21918075
Thomas HUET16116075
rorp313069
Nishant Bansal212084
dependabot[bot]111081
ekzyis101058
Rusty Russell101081
Analysis record

Published AI watches

Last scanned 14 minutes ago

Low 25 AI analysisMessage 81 · Strong
AQ ACINQEclair BitcoinLightning Network

Upgrade postgresql client from 42.7.11 to 42.7.12 (#3330)

This commit updates the PostgreSQL database driver used by Eclair from version 42.7.11 to 42.7.12. It is a routine dependency bump by an automated tool. The commit itself does not say what bugs the new driver fixes, but small point-release…

Dependency version bump of a database driverPoint-release upgrade may include upstream security fixes, but none are named in the commitNo application code changes or direct vulnerability evidence in the diff
972dfe99by dependabot[bot]+3−12 files
No security note in commit
Low 31 AI analysisMessage 58 · Thin
AQ ACINQEclair BitcoinLightning Network

Use bitcoin-kmp 0.49 (depends on bitcoin-kmp 0.32.0 and secp256k1-kmp 0.24.0) (#3362)

This commit updates Eclair's Bitcoin library dependency from version 0.48 to 0.49, which internally uses newer versions of bitcoin-kmp and secp256k1-kmp. The code changes only replace old property accesses (like `.txid`) with new method ca…

Dependency version bump for Bitcoin and secp256k1 cryptographic librariesSource changes are API adaptations (.txid -> .getTxid), not logic changesSecurity-critical validation code is touched (PSBT/transaction integrity checks against malicious Bitcoin Core)
6162e2aaby Fabrice Drouin+22−44 files
No security note in commit
Informational 15 AI analysisMessage 86 · Strong
AQ ACINQEclair BitcoinLightning Network

Update build to improve release process (#3381)

This commit is a routine build-system update. It upgrades several Maven plugin versions, removes the git commit ID from one jar manifest field to avoid a build-time circular dependency, and adds an optional build profile for a fuzz-testing…

c3e9f5d6by Fabrice Drouin+834−105 files
No security note in commit
High 79 AI analysisMessage 81 · Strong
AQ ACINQEclair BitcoinLightning Network

Reject API access from browsers (#3380)

This commit closes a cross-site request forgery (CSRF) hole in Eclair's admin API. Before the change, a malicious web page visited by a node operator could silently submit authenticated API requests (for example, to send funds or close Lig…

New origin-check directive rejecting all requests with an Origin headerRemoval of CORS response headers from API responsesCSRF protection described in commit message and release notes
27438b75by pm47+111−86 files
Vendor flagged security relevance
Informational 15 AI analysisMessage 36 · Opaque
AQ ACINQEclair BitcoinLightning Network

Back to dev (#3379)

This commit is a routine post-release housekeeping change. It bumps the project version from 0.14.3 to 0.15.0-SNAPSHOT across several build files, re-enables a Maven trusted-checksum feature used for build verification, adds a placeholder …

No security-relevant code changesNo vulnerability indicatorsNo bug fixes or patches
bafcf3b6by Fabrice Drouin+74−68 files
No security note in commit
Informational 15 AI analysisMessage 76 · Adequate
AQ ACINQEclair BitcoinLightning Network

Improve the deterministic build (#3378)

This commit adjusts build packaging settings to make compiled releases more reproducible across different computers. It sets consistent file permissions and line endings for packaged documentation and runtime files. There is no indication …

eb7cb009by pm47+6−02 files
No security note in commit
Critical 89 AI analysisMessage 91 · Strong
AQ ACINQEclair BitcoinLightning Network

More AI fixes and defense-in-depth (#3376)

This is a large security patch for the Eclair Lightning node that fixes multiple ways an attacker could steal funds, burn money to miners, or lock funds forever. The fixes include: preventing force-closes with un-publishable splice transac…

Force-close uses latest publishable commitment to avoid unconfirmable splice commit txsClosing fee bounded by maxClosingFeerate when local node pays feesNew max-funding-feerate configuration caps funding/splice miner fees
4111ad86by pm47+698−9835 files
Vendor flagged security relevance
Low 38 AI analysisMessage 78 · Adequate
AQ ACINQEclair BitcoinLightning Network

Tor: allow password auth on private networks (#3375)

This change expands when Eclair will allow password-based authentication to a Tor control port. Previously, only loopback addresses (the same machine) were considered safe enough for password auth. Now, private/site-local and link-local ne…

Relaxation of authentication-method restriction for Tor control portPassword authentication now permitted on site-local and link-local addressesOriginal code explicitly rejected password auth for non-loopback addresses
8b58405dby pm47+1−11 file
No security note in commit
Informational 15 AI analysisMessage 36 · Opaque
AQ ACINQEclair BitcoinLightning Network

Back to dev (#3371)

This commit is a routine post-release housekeeping change. It bumps the project version from 0.14.2 to 0.15.0-SNAPSHOT, re-enables a Maven trusted-checksum feature used for build verification, adds a placeholder release-notes file, and del…

No security-relevant code changes indicating a vulnerabilityBoot.scala startup guard prevents accidental deployment of an unsafe development snapshotMaven trusted checksum verification is re-enabled, improving supply-chain/build integrity
39c5cb27by Bastien Teinturier+74−68 files
No security note in commit
High 70 AI analysisMessage 81 · Strong
AQ ACINQEclair BitcoinLightning Network

More robust splicing edge cases (#3366)

This commit hardens Eclair's handling of the Lightning 'splicing' feature when a peer misbehaves. Splicing lets two nodes resize an open payment channel without closing it on-chain. The patch adds extra checks so that if a peer sends unexp…

Adds commitment-index consistency checks before completing splice/RBF funding attemptsRejects forbidden update messages while remote peer is quiescingRejects commit_sig during quiescence to prevent commitment-index desync
59772fe1by Bastien Teinturier+408−3711 files
Vendor flagged security relevance
Moderate 54 AI analysisMessage 86 · Strong
AQ ACINQEclair BitcoinLightning Network

Add optional rate-limit on incoming pre-auth connections (#3356)

This commit adds a safety net to the Eclair Lightning node to limit how many incoming peer connections can sit unfinished before completing the cryptographic handshake. Previously, an attacker could open many TCP connections and leave them…

Resource-exhaustion mitigation: bounds unauthenticated incoming connections to prevent memory/file-descriptor/CPU exhaustionNew kill reason TooManyPendingConnections added to PeerConnection.KillReasonNew metrics incomingconnections.pending/evicted/rejected for monitoring abuse
a2fe6c74by Bastien Teinturier+445−2111 files
Vendor flagged security relevance
Moderate 67 AI analysisMessage 98 · Strong
AQ ACINQEclair BitcoinLightning Network

Fix a batch of Tor-related issues (#3354)

This commit fixes three security issues in how Eclair connects to the Tor network and stores sensitive files. First, it changes the default Tor authentication from password to safecookie, and blocks password mode when the Tor control port …

Default authentication changed from password to safecookiePassword authentication rejected for remote Tor control portsTor cookie length validated to be exactly 32 bytes
3d092da8by Bastien Teinturier+171−1067 files
Vendor flagged security relevance
Moderate 60 AI analysisMessage 86 · Strong
AQ ACINQEclair BitcoinLightning Network

Reject messages that include the wrong type of signatures (#3368)

This commit fixes a bug in the Eclair Lightning node where a peer could send a message containing both a correct standard signature and an incorrect partial signature. The old code would verify the correct signature but then store the inva…

Type-confusion between IndividualSignature and PartialSignatureWithNonce in channel messagesInvalid partial signature could be stored after valid individual signature was verifiedNew signatureFor helper enforces commitment-format-aware signature selection
1fc3dd7cby Fabrice Drouin+179−7816 files
Vendor flagged security relevance
Moderate 60 AI analysisMessage 88 · Strong
AQ ACINQEclair BitcoinLightning Network

Force-close on invalid HTLC `cltv_expiry` (#3367)

This change makes the Eclair Lightning node force-close a payment channel if a peer tries to add a payment whose timeout value (cltv_expiry) is 500,000,000 or higher. Such large values are invalid according to the Lightning BOLT 2 specific…

BOLT 2 compliance check added for HTLC cltv_expiry >= 500,000,000Invalid cltv_expiry now triggers local error and channel force-closeOff-by-one fix in locktime threshold interpretation (<= changed to <)
b7ebefdbby Bastien Teinturier+32−145 files
Vendor flagged security relevance
Low 37 AI analysisMessage 88 · Strong
AQ ACINQEclair BitcoinLightning Network

Add support for fulfillment payload (#3321)

This commit adds a new optional encrypted payload to Lightning payment fulfillment messages. It is a feature implementation, not a fix for an active vulnerability. The code does introduce a safety check: if a peer sends an oversized fulfil…

New cryptographic payload handling added to payment fulfillment pathSize limits and silent truncation applied to failure packets, fulfillment payloads, and attribution dataChannel force-close triggered on oversized peer fulfillment payload
1819a5e8by Bastien Teinturier+812−23344 files
No security note in commit
Moderate 52 AI analysisMessage 88 · Strong
AQ ACINQEclair BitcoinLightning Network

Fix a batch of low-severity issues (#3355)

This commit fixes five low-severity security or robustness issues in the Eclair Lightning node. It removes a risky type cast that could crash the node on corrupted channel data, forces encrypted cluster communication to prevent private dat…

Unsafe type cast removed from channel codecCluster mode now requires tls-tcp transportAPI error responses no longer include exception messages
06e0ff71by Bastien Teinturier+68−299 files
Vendor flagged security relevance
High 72 AI analysisMessage 93 · Strong
AQ ACINQEclair BitcoinLightning Network

Explicitly match on-the-fly HTLCs after a restart (#3357)

This commit fixes a bug in the Eclair Lightning node where, after a restart, the node could be tricked into keeping the wrong incoming payments alive. An attacker could reuse the same payment identifier (payment_hash) from a legitimate in-…

Fixes a logic bug that could lead to forced channel closuresAttack vector: payment_hash reuse to pin unrelated HTLCsChanges identifier from payment_hash to unique (channel_id, htlc_id)
aa321d69by Bastien Teinturier+57−53 files
Vendor flagged security relevance
Informational 15 AI analysisMessage 86 · Strong
AQ ACINQEclair BitcoinLightning Network

Better documentation for remote `bitcoind` (#3359)

This commit only updates user documentation. It adds warnings that the Bitcoin node (bitcoind) should run on the same machine as Eclair, and if it runs remotely, operators must use a secure encrypted tunnel. No code was changed, so this pa…

Documentation-only changeNo code, configuration, or cryptographic modificationsDescribes pre-existing deployment risk rather than a new vulnerability
24229589by Bastien Teinturier+7−02 files
Vendor flagged security relevance
High 78 AI analysisMessage 98 · Strong
AQ ACINQEclair BitcoinLightning Network

Fix several on-the-fly-funding bugs (#3351)

This commit fixes several bugs in Eclair's 'on-the-fly funding' feature, which lets a node open a Lightning channel and pay for it using future payment fees. The bugs could allow a malicious peer to make the node pay twice, lose money on f…

Double-payment vulnerability fixed: paymentAlreadyRelayed now checks commitment transactions in addition to pending local changes, preventing relay of already-cross-signed HTLCs after restart.Loss-of-funds vulnerability fixed: funded channels with unpaid future-HTLC fees are force-closed before upstream HTLCs are failed, avoiding a race where the peer fulfills a cross-signed downstream HTLC after we failed upstream.Upstream settlement gap fixed: preimages received after HTLC expiry are now relayed upstream, preventing the node from paying downstream without being paid upstream.
48ff28abby Bastien Teinturier+375−617 files
Vendor flagged security relevance
Moderate 62 AI analysisMessage 53 · Thin
AQ ACINQEclair BitcoinLightning Network

Harden permissions of seeds and datadir (#3340)

This commit tightens file and folder permissions for Eclair's sensitive data. It ensures that seed files (which protect the node's identity and Lightning channel funds) and the data directory are readable only by the owner on Linux/macOS s…

Hardening of seed file permissions to owner-only read/writeHardening of datadir and chaindir permissions to owner-onlyMigration path also re-permissions copied seed files
17edd765by rorp+62−14 files
Vendor flagged security relevance
Repository ledger

Explore captured commits

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

Security candidateUpgrade postgresql client from 42.7.11 to 42.7.12 (#3330)by dependabot[bot] · 972dfe99 · Sep 23, 2026 · 2 filesMessage 81 · StrongLow 25Details
Commit message · dependabot[bot]

Upgrade postgresql client from 42.7.11 to 42.7.12 (#3330)

Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.11 to 42.7.12.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.7.11...REL42.7.12)

---

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: pm47 <pm.padiou@gmail.com>

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
cryptography-sensitive pathautomated dependency-update discount
AI analysis · Low 25/100

This commit updates the PostgreSQL database driver used by Eclair from version 42.7.11 to 42.7.12. It is a routine dependency bump by an automated tool. The commit itself does not say what bugs the new driver fixes, but small point-release driver updates often include security fixes. Without a vendor statement linking this specific upgrade to a known vulnerability, we cannot confirm it fixes a security issue, but it is prudent maintenance.

Lower-priorityFix flaky tests caused by port allocation race (#3384)by Fabrice Drouin · 259ea647 · Sep 23, 2026 · 3 filesMessage 100 · StrongTriage 0Details
Commit message · Fabrice Drouin

Fix flaky tests caused by port allocation race (#3384)

`TestUtils.availablePort` opened a `ServerSocket` on port 0, read the
port it was given and closed the socket before returning the number:
nothing was ever reserved, so the OS was free to hand the same port to
the next caller. The `synchronized` block only serialized the calls.

This is a significant source of CI flakiness: suites run in parallel and
13 of them mix in `BitcoindService`, which reserves 4 ports each (p2p,
RPC, ZMQ block, ZMQ tx) when the suite is instantiated but only binds
them later, when bitcoind starts. Whichever suite lost the race failed
with a bind error, unrelated to what it was testing.

We now remember every port we hand out, which makes duplicates within a
JVM impossible. We also allocate below the ephemeral port range: ports
in that range could otherwise be taken by one of the many outgoing
connections tests open (e.g. to bitcoind's RPC endpoint) while the port
was reserved but not yet bound.

Reproduced with 12 threads allocating 4 ports each: 17.5% of rounds
produced a duplicate port before this change, 0% after.

The ports in `integration/bitcoin.conf` are now named placeholders. The
previous chained `.replace("28333", ...)` was order-dependent and only
safe as long as the allocated ports couldn't collide with the literals
it was substituting.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

100/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✓ Links an issue, advisory, or supporting reference
Security candidateUse bitcoin-kmp 0.49 (depends on bitcoin-kmp 0.32.0 and secp256k1-kmp 0.24.0) (#3362)by Fabrice Drouin · 6162e2aa · Sep 22, 2026 · 4 filesMessage 58 · ThinLow 31Details
Commit message · Fabrice Drouin

Use bitcoin-kmp 0.49 (depends on bitcoin-kmp 0.32.0 and secp256k1-kmp 0.24.0) (#3362)

58/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
cryptography-sensitive path
AI analysis · Low 31/100

This commit updates Eclair's Bitcoin library dependency from version 0.48 to 0.49, which internally uses newer versions of bitcoin-kmp and secp256k1-kmp. The code changes only replace old property accesses (like `.txid`) with new method calls (like `.getTxid`) to match the updated library's API. There is no explicit security fix described in the commit, and no verified external references are provided. The change could include bug fixes or security improvements in the upstream cryptographic libraries, but the commit itself does not disclose any specific vulnerability.

Security candidateUpdate build to improve release process (#3381)by Fabrice Drouin · c3e9f5d6 · Sep 17, 2026 · 5 filesMessage 86 · StrongInformational 15Details
Commit message · Fabrice Drouin

Update build to improve release process (#3381)

* Update maven plugins

* Don't store commit id in eclair-core jar manifest

It creates a chicken-and-egg problem if you want to commit the checksum of eclair-core.jar to .mvn/checksums/checksums-workspace.sha256.

* Add maven profile for eclair-fuzz

To build eclair-fuzz, use the with-eclair-fuzz profile with -Pwith-eclair-fuzz

86/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
fuzzing or regression evidencecryptography-sensitive path
AI analysis · Informational 15/100

This commit is a routine build-system update. It upgrades several Maven plugin versions, removes the git commit ID from one jar manifest field to avoid a build-time circular dependency, and adds an optional build profile for a fuzz-testing module. There are no code changes that affect how the software runs or how users interact with it.

Security candidateReject API access from browsers (#3380)by pm47 · 27438b75 · Sep 15, 2026 · 6 filesMessage 81 · StrongHigh 79Details
Commit message · pm47

Reject API access from browsers (#3380)

Any request carrying an `Origin` header is now rejected with 403 before the inner route runs: browsers set it on every cross-site request and every non-GET/HEAD request, while `curl` and `eclair-cli` never do. Checking presence rather than value also covers `Origin: null` and DNS rebinding.

This is a defence against browser CSRF, not an authentication mechanism — `Origin` is trivially omitted by a non-browser client, and the API should still never be exposed beyond loopback.

Breaking change: the API can no longer be called from a web browser, even same-origin; anyone serving a web front-end against it now needs their own back-end in front.

Fixes project-loupe/audit-eclair#223, and by construction any other CSRF report against an individual endpoint.

81/100 · StrongMessage clarity
✓ 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
access control
AI analysis · High 79/100

This commit closes a cross-site request forgery (CSRF) hole in Eclair's admin API. Before the change, a malicious web page visited by a node operator could silently submit authenticated API requests (for example, to send funds or close Lightning channels) because browsers reuse cached HTTP basic-auth credentials. The patch now rejects any API request that carries an Origin header, which browsers set automatically while command-line tools do not. It also removes CORS headers that wrongly advertised cross-origin access. This is a hardening/breaking-change fix, not a full authentication replacement, and the API should still only be reachable on the local machine.

AI review queuedBack to dev (#3379)by Fabrice Drouin · bafcf3b6 · Sep 14, 2026 · 8 filesMessage 36 · OpaqueInformational 15Details
Commit message · Fabrice Drouin

Back to dev (#3379)

After the v0.14.3 release.

36/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit is a routine post-release housekeeping change. It bumps the project version from 0.14.3 to 0.15.0-SNAPSHOT across several build files, re-enables a Maven trusted-checksum feature used for build verification, adds a placeholder release-notes document, and deliberately prevents accidental startup of the new development snapshot by throwing an error unless a special override flag is set. There is no security vulnerability in this commit.

Lower-priorityEclair v0.14.3 release (#3377)by Fabrice Drouin · 1de8b2df · Sep 14, 2026 · 8 filesMessage 53 · ThinTriage 0Details
Commit message · Fabrice Drouin

Eclair v0.14.3 release (#3377)

53/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Security candidateImprove the deterministic build (#3378)by pm47 · eb7cb009 · Sep 14, 2026 · 2 filesMessage 76 · AdequateInformational 15Details
Commit message · pm47

Improve the deterministic build (#3378)

Explicitly specify file permissions and line endings so it is easier to end up with the same binaries in various set ups.

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
credential or privilege state
AI analysis · Informational 15/100

This commit adjusts build packaging settings to make compiled releases more reproducible across different computers. It sets consistent file permissions and line endings for packaged documentation and runtime files. There is no indication this fixes a security vulnerability or introduces one.

Security candidateMore AI fixes and defense-in-depth (#3376)by pm47 · 4111ad86 · Sep 14, 2026 · 35 filesMessage 91 · StrongCritical 89Details
Commit message · pm47

More AI fixes and defense-in-depth (#3376)

* loupe: add min-to-self-delay check

See: https://github.com/project-loupe/audit-eclair/issues/205

* loupe: use distinct nonces for initial commitments

See https://github.com/project-loupe/audit-eclair/issues/83

* loupe: check signed psbt

See https://github.com/project-loupe/audit-eclair/issues/44

* loupe: prevent overflow on relay-fee calculation

See https://github.com/project-loupe/audit-eclair/issues/31

* Validate relay parameters before on-the-fly funding

When relaying a blinded payment to a wallet node we don't have a channel
with, we cannot validate the relay parameters against a channel_update,
so we skipped that validation entirely before attempting on-the-fly
funding. A malicious wallet node could thus create a blinded path with
a null cltv_expiry_delta for our node, and we would fund a channel and
relay an HTLC that expires at the same block as the upstream HTLC. That
HTLC could then be fulfilled on-chain by the wallet node while the
upstream HTLC times out, making us lose the HTLC amount.

We now validate the relay parameters against the ones the channel we
would create would use (our expiry delta, htlc minimum and our default
relay fees) and fail early instead of funding a
channel for a payment we would have rejected anyway.

See: https://github.com/project-loupe/audit-eclair/issues/162

* Force-close with a publishable commitment

When we sign a splice transaction first (which always happens when we
don't contribute any input) and our peer withholds their tx_signatures,
we cannot publish that splice transaction. Our latest commitment builds
on it, so its commit tx cannot confirm unless our peer publishes the
splice transaction. We still force-closed with that commitment, and the
publisher then retried forever waiting for the parent.

A malicious peer could exploit this to lock our funds indefinitely, or
worse, to steal pending HTLCs: they wait for the upstream HTLC to time
out, then publish the previous commitment and claim the HTLC with its
preimage, since we were unable to time it out on-chain.

When force-closing, we now skip commitments whose funding transaction
hasn't been fully signed and use the latest one that can confirm. The
commitments themselves are left untouched: the closing state now
resolves the commitment matching each published commit txid (ours or
our peer's) wherever it needs commitment-specific data (HTLC signatures,
keys, format), including when restoring after a restart and when
reporting the closed channel. Revoked and future commit txs cannot be
matched and keep using the latest commitment, as before. If our peer
later publishes that splice transaction and it confirms, our commit tx
is double-spent and we force-close again with the latest commitment.

* Bound closing fees proposed by our peer

When we pay the closing fees and our peer sends a closing_signed with a
fee outside of our fee range, we try to converge towards their fee, for
compatibility with implementations that ignore fee ranges. But nothing
bounded that fee: a malicious peer could propose a fee larger than our
balance, we would drop our output and sign a closing transaction that
sends our whole balance to miners, in a single round-trip.

We now refuse fees that exceed what our maximum closing feerate allows
when we pay the fees, and reply with a warning: our peer must propose a
reasonable fee, or we can force-close.

See: https://github.com/project-loupe/audit-eclair/issues/63

* Extract preimage from taproot HTLC-success with annex

When our peer publishes their commit tx and claims an HTLC with an
HTLC-success transaction, we extract the preimage from its witness to
relay it upstream. For taproot channels, we only handled the witness
without an annex, whereas we already handled both cases for
Claim-HTLC-success transactions. If an HTLC-success transaction with an
annex was confirmed, we would fail to extract the preimage and treat
the HTLC as timed out, failing it upstream even though it was fulfilled
downstream.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* Use pending signed commitment in canSendFee

When checking that we can afford a new feerate, we were using the spec
of the remote commitment we last received a revocation for, ignoring
the changes we had already signed in a pending commit_sig. Every other
balance check uses the pending commitment when there is one. We could
thus send an update_fee that our peer cannot accept, since they check
it against the commitment we signed, which would make them force-close.

* Bound hidden blinded path fees per payment part

When we hide part of the blinded path fees from the payer, we accept
HTLCs whose amount is smaller than the onion amount by at most those
fees. That bound was computed on the whole invoice amount for every
HTLC, so a payer splitting the payment in several parts could underpay
us by the proportional fee on each part.

The hidden fees are paid on each part, so we now compute the bound on
the part's onion amount. We add a small tolerance since LDK doesn't use
the BOLT 4 formula to compute amt_to_forward inside blinded paths and
rounds down the fee it pays as a sender, which can leave parts short by
a few msat.

* Only accept derivation paths tracked by our wallet

When using the eclair signer, Bitcoin Core only holds a watch-only
wallet built from our BIP84 and BIP86 account xpubs. We verified that
addresses and change outputs it provides belong to us by re-deriving
the public key along the derivation path it gives us, but we accepted
any path. Since Bitcoin Core knows our account xpubs, a malicious node
could provide addresses for deeper or non-standard branches: we would
consider them ours and use them for channel closing scripts, splice
outputs and change, but our wallet would never track them and we would
be unable to find those funds.

We now only accept paths of the form purpose'/coin_type'/account'/{0,1}/i
matching the descriptors we import, with the purpose matching the
address type.

* Check mining fees of wallet-funded interactive txs

When funding an interactive transaction (dual funding or splice), we
let bitcoind select wallet inputs and add a change output. We verified
that the funding output and our outputs were preserved, but never that
the resulting mining fee was sane: interactive-tx validation only
enforces a lower bound on the feerate, and splices don't provide a fee
budget. A malicious bitcoind could thus select inputs worth much more
than needed and skip the change output: all checks would pass and the
difference would be paid to miners once we sign.

We now verify that the mining fee we pay stays close to the target
feerate before announcing our inputs to our peer, like we already do
for single-funded channels.

* Add max-funding-feerate configuration parameter

The feerate we use for funding and splice transactions comes from our
fee estimator, which relies on external data. Nothing bounded that
feerate, so inaccurate or malicious data could make us pay arbitrarily
high mining fees on every channel open or splice. Closing transactions
were already protected by max-closing-feerate.

We add a max-funding-feerate parameter (50 sat/byte by default) that
caps the feerate we use for funding and splice transactions. Operators
can RBF their transactions or increase this value and restart their
node if their transactions don't confirm when the mempool is congested.

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

91/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
explicit security languagesigning boundarymemory safetydefensive validationcryptography-sensitive pathsigning or wallet path
AI analysis · Critical 89/100

This is a large security patch for the Eclair Lightning node that fixes multiple ways an attacker could steal funds, burn money to miners, or lock funds forever. The fixes include: preventing force-closes with un-publishable splice transactions; capping funding/closing miner fees; validating relay fees before opening channels on-the-fly; stopping overflow in fee math; rejecting fake Bitcoin Core change addresses; checking signed PSBTs haven't been altered; extracting payment secrets from newer taproot transactions; and ensuring distinct cryptographic nonces are used when signing commitments.

AI review queuedTor: allow password auth on private networks (#3375)by pm47 · 8b58405d · Sep 14, 2026 · 1 fileMessage 78 · AdequateLow 38Details
Commit message · pm47

Tor: allow password auth on private networks (#3375)

This is a follow-up to #3354: we allow using a password on private networks. It is useful in cluster deployments.

78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
parser or protocol pathsecond-pass: broader security terminologysecond-pass: security-sensitive path
AI analysis · Low 38/100

This change expands when Eclair will allow password-based authentication to a Tor control port. Previously, only loopback addresses (the same machine) were considered safe enough for password auth. Now, private/site-local and link-local networks are also treated as local, so password auth is permitted there too. This is intentional for cluster deployments, but it slightly relaxes a security boundary around how Eclair talks to Tor.

Lower-priorityOptional setting to dip into trampoline relay fees (#3372)by Bastien Teinturier · dd6587dc · Sep 11, 2026 · 9 filesMessage 81 · StrongTriage 0Details
Commit message · Bastien Teinturier

Optional setting to dip into trampoline relay fees (#3372)

Many service providers (lightning nodes that provide services to mobile wallets that support it) get paid by adding a fee to the routing hints of the end user's invoices: this lets them be paid a fee that may be larger than their usual relay fees when wallet users receive payments.

We set a floor for trampoline fees that may be different from our local channel fees when trampoline payments contain a routing hint.

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Lower-priorityImprovements in `PeerScorer` (#3365)by pm47 · 232f721b · Aug 28, 2026 · 2 filesMessage 66 · AdequateTriage 0Details
Commit message · pm47

Improvements in `PeerScorer` (#3365)

This is mainly consistency improvements in logging.

Also made min/max proportional relay fee reconfigurable while the node is running.

66/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI review queuedBack to dev (#3371)by Bastien Teinturier · 39c5cb27 · Aug 26, 2026 · 8 filesMessage 36 · OpaqueInformational 15Details
Commit message · Bastien Teinturier

Back to dev (#3371)

After the v0.14.2 release.

36/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit is a routine post-release housekeeping change. It bumps the project version from 0.14.2 to 0.15.0-SNAPSHOT, re-enables a Maven trusted-checksum feature used for build verification, adds a placeholder release-notes file, and deliberately prevents the new development snapshot from starting in production by throwing an error unless a special override flag is set. There is no security vulnerability here; the change is a safety guard, not a flaw.

Lower-priorityEclair v0.14.2 release (#3370)by Bastien Teinturier · 3dd8d2d9 · Aug 26, 2026 · 8 filesMessage 53 · ThinTriage 0Details
Commit message · Bastien Teinturier

Eclair v0.14.2 release (#3370)

53/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Security candidateMore robust splicing edge cases (#3366)by Bastien Teinturier · 59772fe1 · Aug 26, 2026 · 11 filesMessage 81 · StrongHigh 70Details
Commit message · Bastien Teinturier

More robust splicing edge cases (#3366)

We apply some defense-in-depth to better handle edge cases during
splicing where a remote peer doesn't follow the BOLTs. This also
includes more thorough pattern-matching, which protects against
future refactoring or new features from inadvertently introducing
a vulnerability related to splicing.

Co-authored-by: Fabrice Drouin <sstone@users.noreply.github.com>

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

This commit hardens Eclair's handling of the Lightning 'splicing' feature when a peer misbehaves. Splicing lets two nodes resize an open payment channel without closing it on-chain. The patch adds extra checks so that if a peer sends unexpected messages during the splice—especially messages that would shift the channel's commitment index—it disconnects or force-closes instead of applying them. Applying such messages could let a malicious peer trick the node into revoking a commitment number that a new splice commitment is still using, potentially putting funds at risk. The commit also fixes a batching bug so that a single commit_sig is delivered as a single message, not as a one-message batch that could trigger an unnecessary force-close.

Security candidateAdd optional rate-limit on incoming pre-auth connections (#3356)by Bastien Teinturier · a2fe6c74 · Aug 26, 2026 · 11 filesMessage 86 · StrongModerate 54Details
Commit message · Bastien Teinturier

Add optional rate-limit on incoming pre-auth connections (#3356)

Peers that open a connection but never complete the BOLT 8 handshake
consume resources on our node (memory, file descriptors and CPU).

We now bound how many of those we're willing to keep around, with an
eviction mechanism that lets honest peers eventually get connected.

Note that this only affects incoming connections: outgoing connections
are not rate-limited, which means that peers with whom we have channels
cannot be negatively affected by this mechanism since we'll actively
reconnect to them.

This isn't a foolproof DDoS protection at all however: attackers that
spam connection attempts can still severely delay or prevent honest
new peers from connecting. It should be coupled with a DDoS protection
layer at the cloud provider layer, where it is easier to do correctly
and more efficient.

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

This commit adds a safety net to the Eclair Lightning node to limit how many incoming peer connections can sit unfinished before completing the cryptographic handshake. Previously, an attacker could open many TCP connections and leave them hanging, consuming memory, file descriptors, and CPU. The change caps those pending connections, evicts the oldest ones after a short grace period, and briefly pauses accepting new connections when the cap is hit. It also fixes a related bug where authenticated-but-never-initialized connections could stay open forever.

Security candidateFix a batch of Tor-related issues (#3354)by Bastien Teinturier · 3d092da8 · Aug 26, 2026 · 7 filesMessage 98 · StrongModerate 67Details
Commit message · Bastien Teinturier

Fix a batch of Tor-related issues (#3354)

* Verify that Tor cookie is 32-bytes

In order to be valid, a Tor cookie must be exactly 32 bytes.
We verify that and fail otherwise.

* Use Tor safe-cookie mode by default

And fail if password mode is used but the host is remote.

* Fix race condition in file permissions

There was a race condition in file permissions that allowed attackers
on the machine to read secrets, because we started by creating the
secret and only after that we set the file permissions.

We now reverse that flow: we create an empty file with the right
permissions and then write the secret to it.

This applies to our seed files and to tor private keys.

98/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
explicit security languagesecret or key materialcredential or privilege stateparser or protocol path
AI analysis · Moderate 67/100

This commit fixes three security issues in how Eclair connects to the Tor network and stores sensitive files. First, it changes the default Tor authentication from password to safecookie, and blocks password mode when the Tor control port is on a remote machine, because password mode sends secrets in cleartext and cannot prove the server is really Tor. Second, it checks that Tor's authentication cookie is exactly 32 bytes. Third, it fixes a race condition where secret files (seed files and Tor private keys) were created with loose permissions before being locked down, which could let other users on the same machine read them; now the file is created with strict permissions first, then the secret is written.

Security candidateReject messages that include the wrong type of signatures (#3368)by Fabrice Drouin · 1fc3dd7c · Aug 26, 2026 · 16 filesMessage 86 · StrongModerate 60Details
Commit message · Fabrice Drouin

Reject messages that include the wrong type of signatures (#3368)

Signatures can either be standard signatures, for non-taproot channels, or partial signatures for taproot channels.
Here we reject messages that include signatures that don't match the channel commitment format.
This will fix an error where, for non-taproot channels, when our peer sends a message that contains a valid "single"
signature and an invalid "partial" signature, we would check the correct "single" signature, but store the invalid "partial" signature.

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 boundarysigning or wallet pathparser or protocol path
AI analysis · Moderate 60/100

This commit fixes a bug in the Eclair Lightning node where a peer could send a message containing both a correct standard signature and an incorrect partial signature. The old code would verify the correct signature but then store the invalid partial signature for later use. The fix makes Eclair reject messages that include the wrong kind of signature for the channel type, so non-taproot channels ignore partial signatures and taproot channels require partial signatures.

AI review queuedForce-close on invalid HTLC `cltv_expiry` (#3367)by Bastien Teinturier · b7ebefdb · Aug 26, 2026 · 5 filesMessage 88 · StrongModerate 60Details
Commit message · Bastien Teinturier

Force-close on invalid HTLC `cltv_expiry` (#3367)

Bolt 2 specifies that if tje sending node sets `cltv_expiry` to greater
or equal to 500000000, we should send a warning and close the connection
or send an error and fail the channel. We never implemented that, which
was fine because we already rejected large `cltv_expiry` before that
threshold (without force-closing), but it's better to explicitly force
close if our peer is sending such invalid values.

88/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Moderate 60/100

This change makes the Eclair Lightning node force-close a payment channel if a peer tries to add a payment whose timeout value (cltv_expiry) is 500,000,000 or higher. Such large values are invalid according to the Lightning BOLT 2 specification because they would be interpreted as a Unix timestamp rather than a Bitcoin block height, which could confuse the node and lead to incorrect fund-locking behavior. Previously Eclair rejected these values without force-closing; now it explicitly closes the channel as the spec recommends.

Lower-priorityEmit `ChannelPersisted` event at channel creation (#3361)by pm47 · 14d40937 · Aug 25, 2026 · 3 filesMessage 81 · StrongTriage 0Details
Commit message · pm47

Emit `ChannelPersisted` event at channel creation (#3361)

Since #3337 we are calling directly `db.addChannel` for the initial storage in db. But the `storing()` method that we were previously using also emitted a `ChannelPersisted`.

This caused the `BalanceActor` to not be aware of the newly created channel and resulted in a temporary balance glitch.

Found by Claude.

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Lower-priority(Minor) Fix flaky test in `WaitForAcceptChannelStateSpec` (#3364)by pm47 · 23316e4e · Aug 25, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · pm47

(Minor) Fix flaky test in `WaitForAcceptChannelStateSpec` (#3364)

68/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Lower-priority(Minor) Update claude gitignore files (#3363)by pm47 · 141269f5 · Aug 25, 2026 · 1 fileMessage 53 · ThinTriage 0Details
Commit message · pm47

(Minor) Update claude gitignore files (#3363)

53/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Lower-priorityForce-close channels that our peer claims are late without proving it (#3360)by pm47 · 5b765e02 · Aug 21, 2026 · 7 filesMessage 93 · StrongTriage 0Details
Commit message · pm47

Force-close channels that our peer claims are late without proving it (#3360)

When our peer claims, in their `channel_reestablish` message, that we're late but don't prove it, we force-close the channel instead of transitioning to `WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT`.

There is a special case where we are late but safe because they don't have our revocation secret: we use the commitment point from their `channel_reestablish` message to spend their commit tx if they publish it, as we would in `WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT`.

---------

Co-authored-by: Fabrice Drouin <sstone@users.noreply.github.com>

93/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
Lower-priorityAdd support for `option_onion_messages_only_channels` (#3342)by Bastien Teinturier · b3586905 · Aug 21, 2026 · 9 filesMessage 81 · StrongTriage 0Details
Commit message · Bastien Teinturier

Add support for `option_onion_messages_only_channels` (#3342)

We now configure our onion message relay policy based on features that
we activate (either `option_onion_messages_only_channels` when relaying
only from peers with whom we have a channel or `option_onion_messages`
when relaying from all peers). In all cases, we still apply rate limits.

Fixes #3335

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Security candidateAdd support for fulfillment payload (#3321)by Bastien Teinturier · 1819a5e8 · Aug 21, 2026 · 44 filesMessage 88 · StrongLow 37Details
Commit message · Bastien Teinturier

Add support for fulfillment payload (#3321)

This adds support for including a payload in `update_fulfill_htlc` that
the recipient encrypts for the payer. This can be useful to transmit
data atomically with the fulfillment of a payment. The main challenge
is that intermediate nodes may drop or tamper with this fulfillment
payload, which is why we include it in the HMACs of the attribution
data, which lets senders detect which pair of nodes may be malicious.

We limit error packets and fulfillment payloads to 32kB to leave room
for future TLVs. We silently truncate payloads that are larger, which
ensures that the messages we create are always compliant. We truncate
attribution data that doesn't have the expected length as well.

See https://github.com/lightning/bolts/pull/1344

88/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
Why it was queued
cryptography-sensitive pathparser or protocol path
AI analysis · Low 37/100

This commit adds a new optional encrypted payload to Lightning payment fulfillment messages. It is a feature implementation, not a fix for an active vulnerability. The code does introduce a safety check: if a peer sends an oversized fulfillment payload, the node force-closes the channel after first relaying the payment preimage upstream so funds are not lost. The main risk is that any bugs in the new encryption, wrapping, or truncation logic could affect payment settlement or channel stability, but the commit itself is defensive and follows a proposed Lightning specification.