EL
← All projectsElectrum

Electrum

Long-running lightweight Bitcoin wallet for desktop and mobile platforms.

BitcoinSoftware walletsNormal
Repository coverage

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

92security candidates259second-pass queue1005AI analyses
131commits · 30 days
260commits · 60 days
543commits · 180 days
1000commits · 365 days
Backfill bands
Aug 5 → Feb 6470 seen11 candidatesComplete
Feb 6 → Jun 6346 seen10 candidatesComplete
Jun 6 → Jul 653 seen2 candidatesComplete
Jul 6 → Aug 554 seen3 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

66/100 average clarity
220Strong · 80–100
548Adequate · 60–79
339Thin · 40–59
44Opaque · 0–39
2security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
ThomasV137891162
SomberNight39330362063
f321x40225386070
Sander van Grieken10910101057
ghost4341516070
Felix25410072
user323062
ekzyis222053
accumulator613071
Roman Zeyde515053
Sasha Zykov515075
Aaron Fiore414068
Analysis record

Published AI watches

Last scanned 45 minutes ago

Low 29 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10982 from spesmilo/wizard_2fa_seed_redirect

This commit changes Electrum's wallet creation wizard so that if a user tries to restore a normal 'standard' wallet but pastes a seed phrase that actually belongs to a two-factor authentication (2FA) wallet, the wizard automatically redire…

UX-level safety fix preventing wallet-type/seed mismatchState mutation: wizard_data['wallet_type'] changed from 'standard' to '2fa' based on seed typeNo cryptographic, network, or privilege changes
310c9dd0by Felix+102−133 files
No security note in commit
Informational 15 AI analysisMessage 70 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

tests: wizard: cover standard -> 2fa redirection

This commit only adds and reorganizes automated test code for Electrum's wallet creation wizard. It does not change any production wallet logic, cryptography, or network handling. The tests verify that when a user tries to restore a 'stand…

70b4d27cby f321x+68−91 file
No security note in commit
Informational 15 AI analysisMessage 78 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10988 from f321x/update_security_review_ci_model

This commit updates Electrum's internal CI (continuous integration) script that runs an automated security review using Anthropic's Claude Code tool. It changes the AI model version used for reviews from 'claude-opus-5' to 'claude-opus-5-5…

CI hardening: detects and reports AI model downgrades during automated security reviewNo changes to application code, cryptography, network protocol, or build artifactsNo privilege escalation, injection, or data-exfiltration vectors introduced by the diff
638fbba8by Felix+75−111 file
No security note in commit
Informational 12 AI analysisMessage 90 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

ci: security review: warn if the model got downgraded

This commit updates Electrum's own CI security-review script. It adds detection and warnings when the automated code reviewer (Claude Code) silently falls back to a different AI model, for example after a content-policy refusal. It does no…

CI-only changeNo modification of wallet, crypto, networking, or build artifactsAdds detection for AI model fallback/downgrade in automated security review
ace2ca7aby f321x+74−101 file
No security note in commit
Low 44 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10987 from spesmilo/fix_10986

This commit fixes a bug where Electrum failed to recognize certain already-signed Bitcoin transactions as complete. Specifically, for native SegWit inputs, Bitcoin Core can produce a finalized PSBT with a valid witness but an empty scriptS…

Logic error in transaction completeness detectionNative SegWit witness handling edge casePSBT interoperability issue with Bitcoin Core
bef80421by ghost43+11−02 files
No security note in commit
Low 35 AI analysisMessage 81 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

transaction: treat native segwit input with non-empty witness as complete

This commit fixes a bug where Electrum incorrectly treated finalized Bitcoin transactions as incomplete. Some wallet software (like Bitcoin Core and Sparrow) creates native SegWit transactions that omit an empty placeholder field Electrum …

Logic error in transaction completeness detectionPotential denial of service / user funds stuck due to refusal to broadcast valid finalized transactionInteroperability failure with Bitcoin Core and Sparrow PSBT output
e9bb42e6by ThomasV+11−02 files
No security note in commit
Moderate 68 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10981 from spesmilo/do_not_sign_txin_with_witness

This change prevents Electrum from re-signing Bitcoin transaction inputs that already contain a witness (the data proving the input was authorized). The patch fixes a bug where Electrum could incorrectly sign a non-SegWit input as if it we…

Incorrect signature algorithm selection for non-SegWit inputs when witness data is presentPSBT handling edge case where pre-existing witness data influences signing pathPotential invalid signature production during transaction signing
9da4c342by ThomasV+10−21 file
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10974 from SomberNight/202609_nostr_psbt_xpub

This commit only adds a long code comment explaining a design choice in Electrum's PSBT-over-Nostr plugin. It does not change any program behavior. The comment documents that the plugin derives each cosigner's Nostr secret key from their B…

Documentation-only changeExplicit design tradeoff disclosure: cosigners can derive each other's Nostr secret keys from shared xpubsNo functional code change
46408a78by ThomasV+13−01 file
No security note in commit
Low 42 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10980 from spesmilo/add_input_from_network_do_not_ignore_exceptions

This is a one-line bugfix in Electrum's transaction handling. Previously, the code accidentally swallowed (hid) almost all exceptions when fetching extra transaction data from the network, only re-raising errors that were both network-rela…

Exception swallowing bug fixedNetwork/transaction input enrichment logic changedSilent failure mode removed
bb9d3280by ghost43+1−11 file
No security note in commit
Moderate 60 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10970 from f321x/fix_bolt11_bugs_2

This commit fixes several bugs in Electrum's handling of BOLT11 Lightning invoices. The most user-visible fixes are: stricter validation of invoice amounts (rejecting zero, negative, sub-millisatoshi, and leading-zero amounts), correct pad…

Stricter BOLT11 amount validation prevents acceptance of zero, negative, sub-millisatoshi, and leading-zero amountsFixed int_to_data5 padding bug that corrupted small timestamp values during invoice round-tripMalformed 'r' routing tags now raise exceptions instead of being silently skipped
4b92c0f2by ghost43+82−939 files
No security note in commit
Moderate 61 AI analysisMessage 80 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

add_info_from_network: do not swallow exceptions

Electrum's transaction builder had a bug where it would ignore certain consistency errors when fetching extra transaction data from the network. A malicious or misbehaving server could supply a wrong input amount, and Electrum would silent…

Swallowed exception leading to use of attacker-controlled input valuePSBT input consistency check bypassedPotential malicious Electrum server influence on transaction signing
3f67b21bby ThomasV+1−11 file
Vendor flagged security relevance
Informational 15 AI analysisMessage 60 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

bolt11: remove tag arg from get_routing_info

This is a small code cleanup change. A function that reads routing hints from Lightning invoices no longer takes a tag argument because only one type of routing hint ('r') is now supported. All callers are updated accordingly. There is no …

e78fba28by f321x+12−127 files
No security note in commit
Moderate 62 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10940 from accumulator/fix_10937

This commit tightens how Electrum parses Bitcoin payment requests (BOLT11 lightning invoices and BIP21 URIs). It turns previously uncaught internal errors into proper validation failures, rejects malformed invoice fields that used to be si…

Stricter input validation for externally supplied BOLT11 invoices and BIP21 URIsPreviously uncaught exceptions (ValueError, UnicodeDecodeError, ecc errors) are now wrapped in domain-specific decode exceptionsMalformed fallback addresses are skipped rather than aborting or crashing
a57ef6e7by Felix+707−9610 files
No security note in commit
Low 40 AI analysisMessage 36 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

bolt11: followup #10940

This commit tightens how Electrum parses BOLT11 Lightning invoices. It now rejects duplicate 'n' (node pubkey) tags instead of silently keeping only the first one, and it rejects invoice timestamps that are negative or too far in the futur…

Stricter validation of invoice timestamp boundsDuplicate 'n' tag now raises an exception instead of being silently droppedFollow-up to prior PR #10940, indicating a recent area of security-sensitive review
3026fbdbby f321x+14−232 files
No security note in commit
Low 32 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10737 from sashazykov/hw-close-wallet-thread-leak

This commit fixes a shutdown bug in Electrum's hardware wallet support. Previously, if disconnecting from a hardware wallet failed, the cleanup thread could keep running, which could crash the application when closing. The fix stops the th…

Process abort/crash at shutdown due to leaked QThreadException during cleanup not handled, potentially causing abnormal terminationHardware wallet client close made best-effort with error logging
5b77ca46by Felix+9−22 files
No security note in commit
Informational 23 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10958 from SomberNight/202609_deps

This commit is a routine dependency update for the Electrum Bitcoin wallet. It bumps versions of Python, OpenSSL, secp256k1, and various Python packages used in builds and runtime. The commit itself does not fix any known security bug in E…

Dependency version bumps for cryptographic libraries (OpenSSL, libsecp256k1, electrum-ecc)Routine maintenance commit with no explicit security claimHash-only changes in deterministic requirements files
8bd8c3fbby ghost43+57−5612 files
No security note in commit
Informational 21 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10965 from SomberNight/202609_header_checkpoints

This commit only adds new Bitcoin block header checkpoints to Electrum's built-in chain data files. Checkpoints are hardcoded reference points that help the wallet verify it is following the real blockchain and not a fake one. Updating the…

Hardcoded blockchain checkpoints extended for all supported networksNo executable code or cryptographic logic changedNo bug fix, privilege change, or input validation change present
9e0b7e64by ghost43+276−04 files
No security note in commit
Informational 15 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

update block header checkpoints

This commit simply refreshes Electrum's built-in list of Bitcoin blockchain checkpoints. Checkpoints are known-good block hashes that help the wallet verify it is following the real chain. The update adds newer checkpoints for mainnet, sig…

e11c579bby SomberNight+276−04 files
No security note in commit
Low 46 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10945 from accumulator/stale_utxo_data_fixes

This commit fixes cases where Electrum's wallet cache could hold onto outdated information about coins and transactions after blockchain reorganizations or mempool changes. For example, if a transaction was previously thought to be mined b…

stale cached state after reorg/mempool evictionincorrect confirmation metadata displayed to userscache invalidation added at multiple state transitions
e20b24c0by Felix+132−239 files
No security note in commit
Informational 15 AI analysisMessage 60 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

transaction: add set_mined_info setter to TxInput

This commit is a simple code cleanup: it replaces two repeated lines that set a transaction input's block height and position with a single helper method called set_mined_info. There is no change in behavior, no bug fix, and no security re…

61f71acbby f321x+7−73 files
No security note in commit
Repository ledger

Explore captured commits

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

Lower-priorityci: add claude code code reviewby f321x · 88f9c49a · Mar 27, 2026 · 3 filesMessage 85 · StrongInformational 15Details
Commit message · f321x

ci: add claude code code review

Adds a CI step to the Cirrus CI which will run claude code on the diff
of a Pull Request and fail if it finds critical security vulnerabilities
or serious code issues. Optinally it can be given a GitHub api key to
create a comment in the pull request.

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

This commit adds a new automated security-review step to Electrum's continuous integration (CI) pipeline. It does not change any wallet, networking, or cryptographic code. Instead, it introduces a script that sends pull-request diffs to Anthropic's Claude Code AI for a security scan and can post results back to GitHub. There is no vulnerability being fixed or introduced here; it is purely a tooling change.

Lower-prioritytrampoline: prevent adding ourself on the routeby f321x · 11f0a68c · Mar 27, 2026 · 1 fileMessage 98 · StrongLow 33Details
Commit message · f321x

trampoline: prevent adding ourself on the route

Followup #10541.
Fixes tests.regtest.TestLightningSwapserver.test_swapserver_forceclose.

In the regtest bob would now signal trampoline support due to #10541 and
include Alice into the invoice trampoline as he is connected to Alice.
Alice would then try to add herself onto the trampoline route, causing
the payment to fail.

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
AI analysis · Low 33/100

This commit fixes a bug in Electrum's Lightning trampoline routing where a payer could accidentally include themselves as a hop on the payment route. When a user had a direct channel with the recipient, their own public key could appear in the invoice's trampoline list, and the routing code would then try to route the payment through themselves. This caused legitimate payments to fail. The fix simply removes the user's own public key from the list of candidate trampoline hops before building the route.

Security candidatecrypto.py: replace sys.exit with ImportErrorby SomberNight · d3321265 · Mar 27, 2026 · 1 fileMessage 60 · AdequateInformational 19Details
Commit message · SomberNight

crypto.py: replace sys.exit with ImportError

not nice to call sys.exit from inside the library
(run_electrum can do it, but the library probably should not)

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
cryptography-sensitive path
AI analysis · Informational 19/100

This commit changes a single line in Electrum's crypto library. Previously, if required encryption packages were missing, the library would abruptly terminate the entire program with sys.exit. Now it raises a standard ImportError instead, which is the normal Python way to report a missing dependency. This is a code-quality and robustness improvement, not a fix for an active security vulnerability. The main practical benefit is that other programs importing Electrum's crypto module will get a catchable exception rather than having their process killed.

AI review queuedqt: SettingsDialog: guard self.network accessby f321x · 1aad09a6 · Mar 27, 2026 · 1 fileMessage 68 · AdequateInformational 19Details
Commit message · f321x

qt: SettingsDialog: guard self.network access

Check if self.network before trying to access it. This would trigger an
exception when toggling the trampoline checkbox in offline mode:
```
29.13 | E | gui.qt.exception_window.Exception_Hook | exception caught by crash reporter
Traceback (most recent call last):
File "/home/user/Documents/electrum/electrum/gui/qt/settings_dialog.py", line 133, in on_trampoline_checked
self.network.run_from_another_thread(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'run_from_another_thread'
31.00 | E | gui.qt.exception_window.Exception_Hook | exception caught by crash reporter
Traceback (most recent call last):
File "/home/user/Documents/electrum/electrum/gui/qt/settings_dialog.py", line 131, in on_trampoline_checked
self.network.start_gossip()
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'start_gossip'
```

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI analysis · Informational 19/100

This commit fixes a simple crash bug in Electrum's settings window. When the user toggled a Lightning network option while running offline (no network connection), the program tried to use a non-existent network object and crashed with an error. The fix adds a safety check to skip network calls when there is no network connection.

Lower-priorityplugin: nwc: handle missing params dict in requestby f321x · b9a24ae1 · Mar 27, 2026 · 1 fileMessage 73 · AdequateInformational 21Details
Commit message · f321x

plugin: nwc: handle missing params dict in request

Even though the NIP-47 specification kind of defines that requests should
always pass a params dict in their request i witnessed way too often
that clients don't include it in some requests where it is technically
not neccessary and we fail on it.
Handling this gracefully improves compatibility without obvious
downsides.

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

This is a small compatibility fix for the NWC (Nostr Wallet Connect) plugin in Electrum. It changes how incoming client requests are read so that if a request does not include a 'params' section, the server treats it as an empty params dictionary instead of crashing. The change makes Electrum work with more third-party NWC clients, but it does not appear to introduce a security vulnerability on its own.

AI review queuedfollow-up prevby SomberNight · 7afec538 · Mar 27, 2026 · 1 fileMessage 28 · OpaqueInformational 15Details
Commit message · SomberNight

follow-up prev

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This is a tiny code cleanup that removes an unused 'self' parameter from a static method. It does not change what the code does or fix any security problem. It is a follow-up to a previous commit.

Lower-priorityplugin.py: fix some type hintsby SomberNight · a5085190 · Mar 26, 2026 · 1 fileMessage 45 · ThinInformational 18Details
Commit message · SomberNight

plugin.py: fix some type hints

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 18/100

This commit is a small code-quality patch that fixes type hints and one error message in Electrum's plugin loader. It does not appear to fix a security vulnerability. The most notable change is that a missing plugin icon now raises a clearer exception instead of returning None, which is a behavior change but not a security-relevant one.

Lower-priorityplugins: use decorator to early return if plugin not authorizedby ThomasV · 032dfcf1 · Mar 26, 2026 · 1 fileMessage 50 · ThinModerate 65Details
Commit message · ThomasV

plugins: use decorator to early return if plugin not authorized

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

This commit tightens Electrum's plugin authorization checks. Previously, some plugin-loading paths could execute parts of a plugin even if the user had not authorized it. The change adds early 'return' or 'assert' checks so unauthorized plugins are skipped before their code is loaded or run. This reduces the chance that a malicious or unwanted plugin could activate without explicit permission.

Lower-priorityqt: ReceiveTab: fix flickering zeroconf messageby f321x · a4af5cf4 · Mar 26, 2026 · 1 fileMessage 80 · StrongInformational 15Details
Commit message · f321x

qt: ReceiveTab: fix flickering zeroconf message

The ReceiveTab gets updated regularly (e.g. when syncing headers).
Every time it updates we would first show the invoice and then the
zeroconf confirmation overlay. This caused the overly to appear
flickering when there are updates in higher frequency.

Also we need to keep state if the user has already confirmed the
zeroconf message for this request, otherwise the question
will re-appear each time the user clicked "Accept" and the
ReceiveTab updates again.

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

This commit fixes a user-interface flickering bug in Electrum's 'Receive' tab. When the wallet synced new blockchain headers, the zeroconf (zero-confirmation) warning overlay would briefly disappear and reappear, and after a user clicked 'Accept' the warning could come back again. The patch remembers whether the user already accepted the warning for the current payment request and reorders widget updates to stop the flicker. There is no security vulnerability here.

Lower-prioritylnpeer: don't signal OPTION_ZEROCONF_OPT to untrusted peerby f321x · a06c8bac · Mar 26, 2026 · 3 filesMessage 85 · StrongLow 37Details
Commit message · f321x

lnpeer: don't signal OPTION_ZEROCONF_OPT to untrusted peer

Only signal `OPTION_ZEROCONF_OPT` to peers if we either:
1. Have no trusted peer configured (assuming that we are LSP)
2. Have a trusted peer configured, and the peer we are connecting
to is this trusted peer.

Otherwise peers that are LSPs but are not the clients trusted LSP
might try to open a channel to the client but it would get rejected.

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

This commit changes how Electrum advertises a Lightning feature called 'zeroconf' (zero-confirmation channels). Previously, a user's wallet could tell any Lightning peer that it supports zeroconf channels, even untrusted ones. That could mislead a non-trusted Lightning Service Provider (LSP) into trying to open a special channel that the wallet would then reject, causing confusion, failed channel opens, and possibly minor privacy or denial-of-service issues. The fix makes the wallet only advertise zeroconf support to a specifically trusted LSP, or when the wallet itself acts as an LSP with no trusted peer configured.

AI review queuedlnwallet: make jit fees configurable, add mining feesby f321x · 85356e55 · Mar 26, 2026 · 4 filesMessage 85 · StrongLow 33Details
Commit message · f321x

lnwallet: make jit fees configurable, add mining fees

Make the just in time channel fees and channel size
configvars, as in practice not every provider would
use the same hardcoded fees or channel sizes.
Add the mining fees required for the funding transaction on top of the
opening fees to prevent opening channels at a loss in a higher
fee environment.

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 or wallet pathsecond-pass: security-sensitive path
AI analysis · Low 33/100

This commit changes how Electrum calculates fees for 'just-in-time' (JIT) Lightning channels. Previously the channel size and opening fee were hardcoded; now they are configurable settings. More importantly, the code now adds the actual Bitcoin mining fee for the funding transaction on top of the service fee, so the Lightning Service Provider (LSP) does not accidentally open channels at a loss when on-chain fees are high. It also rejects payments that would be too small after deducting those fees. This is a business-logic/economic fix rather than a remote code-execution vulnerability.

AI review queuedtests: add unittests for LNWallet just in time openingby f321x · a3f12506 · Mar 26, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · f321x

tests: add unittests for LNWallet just in time opening

Adds unittests for `LNWallet.open_channel_just_in_time()`,
`LNWallet._cleanup_failed_jit_channel()`,
`LNWallet.can_get_zeroconf_channel()` and
`LNWallet.receive_requires_jit_channel()`.

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 or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit only adds new automated tests for an existing Lightning Network feature called 'just-in-time channel opening.' It does not change the actual wallet or payment-handling code that users run. There is no security fix or vulnerability introduced here.

Lower-priorityopen_channel_just_in_time: add cleanup and broadcast retryby f321x · 2eac67b4 · Mar 26, 2026 · 1 fileMessage 73 · AdequateLow 42Details
Commit message · f321x

open_channel_just_in_time: add cleanup and broadcast retry

Adds cleanup logic to `LNWallet.open_channel_just_in_time` so
that the channel provider removes unfunded channels again, e.g. if
the client didn't release the preimage or the provider failed
to broadcast the funding transaction.

Also adds more robust transaction broadcast logic so we retry to
broadcast if it failed and check against adb to see if any previous
broadcast was successful.

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

This commit hardens Electrum's 'just-in-time' Lightning channel opening. It makes the service provider automatically clean up half-open channels if the payment fails, and retry broadcasting the funding transaction more reliably. The main risk being fixed is that a provider could get stuck with an unfunded channel or lose track of whether the funding transaction was actually sent, which could lead to lost funds or service disruption.

Lower-prioritylnworker: stop setting static jit alias for jit channelby f321x · f56e1caf · Mar 26, 2026 · 2 filesMessage 95 · StrongLow 26Details
Commit message · f321x

lnworker: stop setting static jit alias for jit channel

...so we can have multiple just in time channels with the same lsp.
We already save a remote scid alias in `on_channel_ready` which we
already have received after the new zeroconf channel is in open state.
So setting the alias to the static node id hash is counterproductive
because it doesn't allow to differentiate between channels.

Also extends the regtest (`just_in_time`) to do a second channel
opening, to cover this scenario. This doesn't add much runtime to
the test, so the cost seems reasonable.

95/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Low 26/100

This change fixes a bug in Electrum's Lightning 'just-in-time' (JIT) channel feature. Previously, every JIT channel opened with the same Lightning service provider (LSP) was being assigned the same internal identifier derived from the LSP's public key. That made it impossible to tell multiple JIT channels apart, which could confuse routing and prevent a user from having more than one usable JIT channel with the same LSP. The patch stops setting that duplicate identifier and instead relies on a remote alias already received when the channel becomes ready. A test is added to verify that two JIT channels can be opened successfully.

AI review queuedlnworker/config: check if zeroconf is enabled when forwardingby f321x · 2da9fbbf · Mar 26, 2026 · 4 filesMessage 73 · AdequateLow 43Details
Commit message · f321x

lnworker/config: check if zeroconf is enabled when forwarding

On LSP side we were only checking if ACCEPT_ZEROCONF_CHANNELS
is enabled while forwarding a non-trampoline htlc.
During trampoline forwarding the config was ignored.

The ACCEPT_* prefix implied this was only for accepting inbound
zeroconf channels, but it also controls whether we open them when
forwarding HTLCs.

Renames the config var to OPEN_ZEROCONF_CHANNELS
to clarify it enables zeroconf channel opens in both directions,
and add the missing check when forwarding trampoline HTLCs.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Low 43/100

This commit fixes a configuration check in Electrum's Lightning Network code. Previously, when forwarding payments through a trampoline node, the software ignored a setting meant to control whether it opens special 'zeroconf' channels. The patch makes the code check that setting consistently and renames it from 'accept' to 'open' to better reflect that it controls opening channels in both directions. This is a defensive fix to prevent unintended channel opens.

Lower-prioritylnchannel: fix update_unfunded_state, add unittestby f321x · 1f17574d · Mar 26, 2026 · 2 filesMessage 73 · AdequateLow 44Details
Commit message · f321x

lnchannel: fix update_unfunded_state, add unittest

Fixes AbstractChannel.update_unfunded_state to stop calling a
non-existent method (unwatch_channel).
Adds unittest to execute the zeroconf path of update_unfunded_state.

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

This commit fixes a bug in Electrum's Lightning code that handled 'zeroconf' channels—channels that are usable before their funding transaction is confirmed on the Bitcoin blockchain. The old code would crash because it tried to call a method that no longer exists, and it could also remove a channel too early or leave a user exposed to a scamming payment provider. The fix makes the code more careful: it waits until the wallet is fully synced, freezes the channel so it isn't advertised for receiving more payments, and only removes the channel after a longer timeout. It also adds a unit test to cover this code path.

Lower-prioritylnpeer: check just-in-time channel opening feeby f321x · 297aed99 · Mar 26, 2026 · 1 fileMessage 60 · AdequateModerate 64Details
Commit message · f321x

lnpeer: check just-in-time channel opening fee

Check the just-in-time channel opening fee when receiving an incoming
channel opening.

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Moderate 64/100

This commit adds a safety check for Electrum's Lightning 'just-in-time channel opening' feature. When someone opens a payment channel to you on the fly, the remote party can propose an extra opening fee. Previously the code accepted any fee with only a 'todo' comment. Now it rejects the channel if that fee exceeds 10% of the channel's funding amount. Without this check, a malicious or misconfigured Lightning Service Provider (LSP) could potentially charge an unreasonably high opening fee.

AI review queuedtest_lnwallet: unittest trampoline invoice_feature and r_tagby f321x · ac87eea0 · Mar 26, 2026 · 1 fileMessage 73 · AdequateInformational 12Details
Commit message · f321x

test_lnwallet: unittest trampoline invoice_feature and r_tag

Add unittest that verifies we only include r_tags for trampoline nodes
if we signal trampoline support in the invoice_features and only signal
trampoline support if we use trampoline or have only open trampoline
channels.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 12/100

This commit only adds a new automated test for Electrum's Lightning wallet. It checks that when creating a Lightning invoice, the wallet correctly decides whether to advertise 'trampoline routing' support and which routing hints to include based on the types of channels the user has open. It does not change any production wallet code, so it cannot directly introduce or fix a security vulnerability on its own.

Lower-priorityLNWallet: set trampoline invoice feature independentlyby f321x · 609a2746 · Mar 26, 2026 · 2 filesMessage 73 · AdequateLow 35Details
Commit message · f321x

LNWallet: set trampoline invoice feature independently

Make the trampoline signaling in bolt11 invoices dependent upon all
unfrozen channels being with trampoline peers instead of the trampoline
config.
Stops automatically freezing non-trampoline channels for receiving if
trampoline is enabled.

One effect of this change is that now we don't signal trampoline support
anymore in the invoice even if trampoline is enabled, if one of the
channels is with a non trampoline peer.

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

This commit changes how Electrum decides whether to advertise 'trampoline routing' support on Lightning invoices and stops automatically freezing non-trampoline channels for receiving when trampoline mode is on. Previously, enabling trampoline could silently block payments through non-trampoline channels; now the wallet only advertises trampoline if every usable channel supports it, and users can receive through non-trampoline channels again. The change is more of a bug fix / behavior correction than a critical security patch, but it could affect payment routing and user expectations.

Lower-priorityLNWallet: only include tramp r_tags if tramp featureby f321x · 0265c707 · Mar 26, 2026 · 1 fileMessage 65 · AdequateLow 49Details
Commit message · f321x

LNWallet: only include tramp r_tags if tramp feature

Only include r_tags for trampoline nodes in a bolt11 invoice
if its invoice_features signal trampoline support.

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

This commit changes how Electrum generates Lightning Network invoices. Previously, routing hints could include regular (non-trampoline) channels even when the invoice advertised support for trampoline routing. Now, if the invoice says it supports trampoline routing, only trampoline-capable channels are included as hints. This makes the invoice's advertised features consistent with the actual routing hints, which can prevent payment failures or routing confusion for wallets that rely on those hints.

Lower-priorityqt gui: more defensive 'gui' RPC (i.e. URI) handlingby SomberNight · 726d3995 · Mar 25, 2026 · 1 fileMessage 50 · ThinModerate 53Details
Commit message · SomberNight

qt gui: more defensive 'gui' RPC (i.e. URI) handling

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

This commit hardens how the Electrum desktop wallet handles Bitcoin payment URIs received through its internal RPC interface. Before the change, an attacker who could already talk to Electrum's local RPC server might be able to silently change the recipient and amount on the user's Send tab while the user was in the middle of creating a different payment. The patch now shows a notification, clears the existing payment fields, and then fills in the new URI, making the change visible and preventing leftover values (such as an amount from a previous payment) from being reused unexpectedly.

Security candidatein GUI mode, only start a limited minimal RPC serverby SomberNight · d951a3d2 · Mar 25, 2026 · 2 filesMessage 78 · AdequateModerate 62Details
Commit message · SomberNight

in GUI mode, only start a limited minimal RPC server

To limit attack surface.

Context:
- both in daemon mode and in GUI mode, we start an RPC server
- the RPC server uses HTTP basic auth, with a random password that is saved in the config file
- read access to the config file implies access to the RPC server
- the traffic is unencrypted
- by default the server listens
- on Windows, on localhost TCP
- all other platform, via unix domain sockets
- if an attacker can listen to localhost TCP traffic, and there was traffic
- they could see the plaintext RPC password and issue their own commands
- e.g. if wireshark was already installed on the system, this might not require root access
- the "ping" and "gui" commands are used by everyday operations that affect most users:
- "ping" is used when trying to launch a second instance of electrum, to contact the first instance and enforce "singleton" behaviour
- "gui" is used for URI handling (`$ xdg-open bitcoin:asdasd`)
- many other sensitive commands, that operate on wallets, require *also* the wallet password
- but note that wallet.unlock can be used by the user to bypass this and store the wallet password in memory (exposed in GUI)

I propose locking down the RPC server when running in GUI mode:
- we still start it, as it is used for "ping" and "gui" RPCs, however we disable all other RPCs
- we could opt-in enable it, using a config var, except that ofc would not help against an attacker that has filesystem write access to the config file
- so I think it's even safer to just "hardcode" disable it: however the functionality is useful for development
- I propose we branch based on `constants.net.TESTNET`
- an alternative we could branch on that is hard to fake is `is_git_clone` in run_electrum

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
explicit security language
AI analysis · Moderate 62/100

This commit reduces the attack surface of Electrum's built-in remote-control server when running in normal GUI mode. Previously, the RPC server exposed many wallet-related commands; now, in GUI mode on mainnet, it only exposes two safe commands ('ping' and 'gui'). The change is a hardening measure, not a fix for a known active exploit. It explicitly leaves the full RPC server enabled for daemon mode and for testnet GUI mode (for development).

Lower-prioritydaemon: (trivial) CommandsServer.run: move tcp-specific lineby SomberNight · e08390a0 · Mar 25, 2026 · 1 fileMessage 65 · AdequateInformational 18Details
Commit message · SomberNight

daemon: (trivial) CommandsServer.run: move tcp-specific line

this line would raise if site was a web.NamedPipeSite

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

This is a tiny code cleanup in Electrum's background daemon. A line that only makes sense for TCP network sockets was moved so it no longer runs for Unix domain sockets or Windows named pipes. Before the fix, starting the command server over a non-TCP socket could crash with an error. There is no sign this was exploitable as a security vulnerability.

Security candidatefix: remove negative fee assert from get_tx_fee_warningby f321x · 06490657 · Mar 25, 2026 · 1 fileMessage 97 · StrongLow 37Details
Commit message · f321x

fix: remove negative fee assert from get_tx_fee_warning

rm the `assert fee >= 0, f"{fee=!r} must be non-negative satoshis"`
from `Abstract_Wallet.get_tx_fee_warning()` to prevent an exception when
users load a psbt with negative tx fee.

97/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
signing boundarysigning or wallet path
AI analysis · Low 37/100

This commit removes a hard crash (assertion) in Electrum's wallet code when a user loads a partially-signed Bitcoin transaction (PSBT) whose calculated fee is negative. Instead of crashing, Electrum now logs a warning and continues. A negative fee can happen if transaction inputs and outputs are crafted or edited in unusual ways. The change prevents a denial-of-service-like crash when opening such a transaction, but it does not by itself fix whatever produced the negative fee.

Lower-priorityQt: move LN fee slider to payment dialog. fixes #10516by ThomasV · 3012c367 · Mar 25, 2026 · 2 filesMessage 58 · ThinInformational 15Details
Commit message · ThomasV

Qt: move LN fee slider to payment dialog. fixes #10516

58/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
AI analysis · Informational 15/100

This commit simply moves a user-interface slider for setting the maximum Lightning Network routing fee from the Settings window into the payment confirmation dialog. It is a usability improvement, not a security fix. There is no change to how payments are authorized, no new code path that could steal funds, and no vulnerability being patched.