EL
← All projectsElectrum

Electrum

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

BitcoinSoftware walletsNormal
Repository coverage

1153 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 candidates261second-pass queue1007AI analyses
127commits · 30 days
262commits · 60 days
545commits · 180 days
1002commits · 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
549Adequate · 60–79
340Thin · 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
f321x40325387070
Sander van Grieken10910101057
ghost4342517069
Felix25410072
user323062
ekzyis222053
accumulator613071
Roman Zeyde515053
Sasha Zykov515075
Aaron Fiore414068
Analysis record

Published AI watches

Last scanned 1 hour ago

Low 29 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10992 from f321x/dedup_is_seed_wizard

This commit simplifies the seed-validation logic in Electrum's Qt wallet wizard by replacing a local copy of the rules with a call to an existing shared validation method. The change appears to be a code-cleanup refactor that removes dupli…

Refactor of seed-validation logic in wallet creation wizardRemoval of duplicated seed-type checks in favor of centralized validationAdded assertion constraining seed type to 'electrum'
554daca6by ghost43+2−81 file
No security note in commit
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 12 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qt: wizard: dedup seed validation rules

This commit is a small code cleanup in Electrum's wallet setup wizard. It removes a duplicate copy of the rules used to check whether a recovery seed is valid and instead reuses an existing method. There is no indication this fixes a secur…

89d0de06by f321x+2−81 file
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
Repository ledger

Explore captured commits

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

Lower-priorityinterface: extend client to be able to support a range of protocolsby SomberNight · cd3173a2 · Nov 3, 2025 · 4 filesMessage 50 · ThinInformational 19Details
Commit message · SomberNight

interface: extend client to be able to support a range of protocols

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

This commit refactors how the Electrum wallet negotiates the server protocol version. Previously the client requested a single fixed protocol version; now it advertises a supported range (currently still set to just 1.4 to 1.4, so behavior is unchanged in practice). It also updates the QML GUI to display a range string and changes a server-list filter to use the minimum protocol version. There is no direct security fix here, but it lays groundwork for future protocol-version flexibility and slightly hardens version-string parsing by falling back to version 0 on malformed input.

Lower-prioritytests: interface: fix estimatefee response (wrong unit)by SomberNight · b1fc5b24 · Nov 3, 2025 · 1 fileMessage 60 · AdequateInformational 15Details
Commit message · SomberNight

tests: interface: fix estimatefee response (wrong unit)

60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 15/100

This commit fixes a single test mock so that a fake server returns a realistic Bitcoin transaction fee estimate. The change only affects the test suite and has no impact on the real Electrum wallet or its users.

Lower-prioritytests: interface: add timeout to avoid hangsby SomberNight · 325b83b3 · Nov 3, 2025 · 1 fileMessage 82 · StrongInformational 15Details
Commit message · SomberNight

tests: interface: add timeout to avoid hangs

instead of an infinite hang, the unit test should just fail

82/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only changes a unit test file. It swaps a custom wait helper for a standard async timeout wrapper so that the test fails instead of hanging forever if something goes wrong. There is no change to the actual Electrum wallet or server code, and no security issue is introduced or fixed.

Lower-prioritysynchronizer: rm redundant get_history call if new block mined unconfby SomberNight · 6d016d70 · Nov 3, 2025 · 2 filesMessage 85 · StrongLow 26Details
Commit message · SomberNight

synchronizer: rm redundant get_history call if new block mined unconf

This is an optimisation and possible hardening against traffic analysis.

After a new block is mined, we sometimes receive "blockchain.scripthash.subscribe" notifications. If so, this is often due to the just mined block including mempool txs we already knew about.

Normally we would call the "blockchain.scripthash.get_history" RPC, to get full history of the affected scripthash.
Instead now we first optimistically guess that all mempool txs touching this scripthash just got mined and see if by assuming that we can reproduce the announced sh status.
- if yes, we saved a network RTT by not having to call "blockchain.scripthash.get_history"
- if no, we request the history from the server using the RPC

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
defensive validation
AI analysis · Low 26/100

This commit changes how the Electrum wallet reacts when a new Bitcoin block is mined. Instead of always asking the server for the full updated history of an address, it first tries to guess that the change is just because transactions it already knew about in the memory pool got included in the new block. If the guess matches the server's notification, it skips the extra network request. The commit message says this is an optimization and a possible hardening against traffic analysis.

Lower-priorityadd dust_override to SweepInfoby ThomasV · 879dcb32 · Nov 3, 2025 · 4 filesMessage 50 · ThinLow 26Details
Commit message · ThomasV

add dust_override to SweepInfo

We might want to set this value independently from is_anchor.

50/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body
AI analysis · Low 26/100

This commit changes how Electrum decides whether a tiny ("dust") Lightning Network sweep output is worth including in a transaction. Previously, the code only skipped the dust check for anchor outputs. Now it uses a new explicit flag, `dust_override`, so other sweep types can also skip the dust check when appropriate. The change itself is a small refactor and does not obviously introduce a security bug, but it adjusts a safety check that prevents creating uneconomical or non-standard transactions.

Lower-priorityregtest: add timeout to wait_ functionsby f321x · ce7774ef · Oct 31, 2025 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · f321x

regtest: add timeout to wait_ functions

Add 30s timeouts to the "wait_" functions in regtest.sh as it
happens from time to time that they get stuck on the CI and waste compute.

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

This commit only changes the project's internal regression test script. It adds 30-second timeouts to helper functions that wait for certain conditions during automated testing, so that tests don't hang forever on the continuous integration (CI) system. There is no change to the actual Electrum wallet software that users run, and no security issue is introduced or fixed.

AI review queuedconfig/regtest: add config to disable automatic fee updatesby f321x · 76f69676 · Oct 31, 2025 · 4 filesMessage 83 · StrongInformational 15Details
Commit message · f321x

config/regtest: add config to disable automatic fee updates

Some regtest tests depend on manual fee injection to simulate certain
mempool conditions (e.g. lnwatcher_waits_until_fees_go_down). This is
done by manually injecting fee estimates into the `Network` object using
the `test_inject_fee_etas` cli command. However it can still happen that
the Network automatically updates its fee estimates from the connected
electrum server in the time between injecting the fee and the actual
tested logic making decisions based on the fee. This causes the test to
fail sometimes.
By setting the `test_disable_automatic_fee_eta_update` true the Network
will stop automatically updating the fee estimates and the test will
behave as expected.

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
second-pass: broader security terminology
AI analysis · Informational 15/100

This commit adds a hidden test-only setting that prevents Electrum from automatically updating fee estimates during certain automated regtest tests. It is purely a testing helper and does not change any behavior unless the user explicitly sets the new config flag. There is no security issue visible in the change.

Lower-prioritylnwatcher/txbatcher: more loggingby f321x · 19e32d60 · Oct 31, 2025 · 2 filesMessage 58 · ThinInformational 15Details
Commit message · f321x

lnwatcher/txbatcher: more logging

log more clearly if an input is considered dust, this makes the logs
more helpful when debugging sweeping of lightning utxos.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit only adds extra debug and info log messages. It does not change any program behavior, transaction logic, or security checks. The change makes it easier for developers to see when a small Lightning UTXO is considered 'dust' (too tiny to spend economically) or when fee estimates are unavailable. There is no security fix or vulnerability here.

Lower-priorityCI: regtest: stop on failed test, expose datadirsby f321x · 80ea7bec · Oct 31, 2025 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · f321x

CI: regtest: stop on failed test, expose datadirs

Stops the running regtest if one test fails (using the --failfast
option) and makes the wallet data directories of alice, bob and carol
available for debugging. This seems helpful to fix issues only happening
on the CI.

90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only changes how Electrum's automated CI (continuous integration) tests run. It makes tests stop at the first failure and saves wallet data directories as debugging artifacts. There is no change to the Electrum wallet software itself, no user-facing behavior change, and no security fix or vulnerability introduced.

AI review queuedsynchronizer: small refactor _on_address_statusby SomberNight · 5212d20f · Oct 29, 2025 · 1 fileMessage 35 · OpaqueInformational 15Details
Commit message · SomberNight

synchronizer: small refactor _on_address_status

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit is a minor internal cleanup in Electrum's synchronizer code. It renames a variable, adds type hints, extracts a small helper method, and fixes a log message to display transaction byte length correctly. There is no security-relevant change visible in the diff.

Lower-priorityqt: remove outdated help string in SendTabby f321x · fb4b7441 · Oct 29, 2025 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · f321x

qt: remove outdated help string in SendTab

The amount edit box is not turning red anymore if the amount is higher
than the wallet balance, so this string can be removed.
Alternatively it could be made red again but seems like nobody missed
it.

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

This commit simply removes one outdated sentence from a help tooltip in Electrum's Qt wallet. The tooltip previously told users that an amount would turn red if they didn't have enough funds, but that visual feature no longer exists. There is no security issue here—it's a minor user-interface cleanup.

Lower-priorityqt: allow opening BalanceDialog if warningby f321x · 64849474 · Oct 29, 2025 · 2 filesMessage 68 · AdequateInformational 15Details
Commit message · f321x

qt: allow opening BalanceDialog if warning

Allow to open the BalanceDialog, by clicking on the Pie Diagram in the
bottom left corner of the main window, if there is an active warning,
even if the wallets balance is 0. Right now the user can see the
warning icon for the lighting channel reserve, but cannot click on the
icon to read the actual warning if there is no balance in the wallet.

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

This is a small user-interface fix, not a security change. It lets users click the balance pie chart in Electrum's main window to read an active warning message even when their wallet balance is zero. Previously, the click was ignored if the balance was zero, so a warning icon could be visible but not openable. The change adds a helper property to check whether a warning exists and opens the dialog when a warning is present.

Lower-prioritytest_commands: add unittest for add_peer cliby f321x · fca879d4 · Oct 28, 2025 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · f321x

test_commands: add unittest for add_peer cli

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

This commit only adds a new automated test for an existing command-line feature called add_peer. It does not change any production code, so it cannot introduce a security vulnerability or fix one.

Lower-prioritycli: add_peer: make add_peer wait for connectionby f321x · 95ba7e75 · Oct 28, 2025 · 1 fileMessage 80 · StrongInformational 20Details
Commit message · f321x

cli: add_peer: make add_peer wait for connection

peer initialization was never awaited in the `add_peer` method.
This awaits the initialization of the peer so that the caller
actually knows if connection succeeded or timed out.

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

This commit fixes a command-line bug where the `add_peer` command would report success before actually confirming that a new Lightning peer connected. Previously, callers could be told the peer was added even if the connection later failed or timed out. The change makes the command wait for the peer handshake to complete and report a clear error if it does not.

Lower-prioritylnpeer: await init in main_loopby f321x · a5cf5f75 · Oct 28, 2025 · 1 fileMessage 80 · StrongLow 26Details
Commit message · f321x

lnpeer: await init in main_loop

Because `LNPeer.initialized` was awaited in
`LNPeer._query_gossip()` instead of the main loop the other tasks got
spawned concurrently and each task on its own has to wait for the
initialization. In `LNPeer._send_own_gossip()` this was missing, instead
there is a fixed 10 sec sleep. If the connection was not initialized but
the 10 sec are exceeded `_send_own_gossip()` tries to send gossip and
causes this exception as the `LNTransport` is not ready:

```
2.13 | E | lnpeer.Peer.[LNWallet, 0288fa27c0-bc1900c8] | Exception in main_loop: AttributeError("'LNTransport' object has no attribute 'sk'")
Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/util.py", line 1232, in wrapper
return await func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/lnpeer.py", line 511, in wrapper_func
return await func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/lnpeer.py", line 525, in main_loop
async with self.taskgroup as group:
^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/env/lib/python3.14/site-packages/aiorpcx/curio.py", line 304, in __aexit__
await self.join()
File "/home/user/code/electrum-fork/electrum/util.py", line 1420, in join
task.result()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/lnpeer.py", line 573, in _send_own_gossip
self.send_node_announcement(alias, color)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/lnpeer.py", line 1830, in send_node_announcement
self.transport.send_bytes(raw_msg)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/lntransport.py", line 225, in send_bytes
lc = aead_encrypt(self.sk, self.sn(), b'', l)
^^^^^^^
AttributeError: 'LNTransport' object has no attribute 'sk'. Did you mean: 'sn'?
```

By awaiting the initialization directly in the `main_loop` it is more
clear that the task getting spawned subsequently depend on the transport
being available and separates the initialization more clearly these
other functions.

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

This commit fixes a crash in Electrum's Lightning peer connection handling. Previously, several background tasks could start before the encrypted transport was fully ready, causing one task to try sending data on an uninitialized connection and trigger an AttributeError. The fix moves the 'wait for initialization' step into the main task loop and adds explicit checks so tasks only run after the connection is ready. It is a reliability/robustness bug, not an obvious security vulnerability.

Security candidateutil: cleanup asyncio event loop after stoppingby f321x · 08673d35 · Oct 28, 2025 · 1 fileMessage 86 · StrongInformational 19Details
Commit message · f321x

util: cleanup asyncio event loop after stopping

I noticed many ResourceWarning when running regtests with
PYTHONASYNCIODEBUG=1 and PYTHONDEVMODE=1, each time a daemon
gets stopped the asyncio loop wouldn't get properly cleaned up:

```
(env) user@hp:~/code/electrum-fork$ python3 -m unittest tests.regtest.TestLightningAB.test_lnwatcher_waits_until_fees_go_down
***** test_lnwatcher_waits_until_fees_go_down ******
initializing alice
0.67 | W | asyncio | Executing <Task finished name='Task-1' coro=<run_offline_command() done, defined at /home/user/code/electrum-fork/./run_electrum:229> result={'msg': 'Please keep ... your wallet.', 'path': '/tmp/alice/r...efault_wallet', 'seed': 'fiction sadd...it radar desk'} created at /home/user/code/electrum-fork/electrum/util.py:1760> took 0.280 seconds
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
funding alice
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
f84277454a04243e500cf84c67aad16e04dd7a88ffa849ffcf20ce3f9af277df
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
initializing bob
0.54 | W | asyncio | Executing <Task finished name='Task-1' coro=<run_offline_command() done, defined at /home/user/code/electrum-fork/./run_electrum:229> result={'msg': 'Please keep ... your wallet.', 'path': '/tmp/bob/reg...efault_wallet', 'seed': 'wink loud so...ory myth case'} created at /home/user/code/electrum-fork/electrum/util.py:1760> took 0.195 seconds
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
funding bob
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
f68b651e84dc8547f54dd09129018a2d0d256dedc8ccc48595ae172de895371a
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
mining 1 blocks
starting daemon (PID 38153)
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
/tmp/alice/regtest/wallets/default_wallet
/usr/lib64/python3.14/asyncio/base_events.py:758: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=True>
```

This commits adds some cleanup to `util.create_and_start_event_loop()`
to
1. cancel remaining tasks
2. shut down asyncgens
3. shutdown the default executor
4. call loop.close() to free the resources allocated to the loop
See https://stackoverflow.com/questions/30765606/whats-the-correct-way-to-clean-up-after-an-interrupted-event-loop

This seems to reliably solve the mentioned `ResourceWarning`.

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
memory safety
AI analysis · Informational 19/100

This commit fixes a housekeeping issue in Electrum's background task manager. When the program stopped an internal 'event loop,' it previously left it partially open, causing Python resource warnings. The patch makes sure remaining tasks are cancelled, generators are shut down, the executor is stopped, and the loop is fully closed. There is no direct security vulnerability described; it is a cleanup that may improve stability and reduce resource leaks during testing.

Lower-priorityandroid: qr scanner: add emoji to clipboard stringby f321x · c8169871 · Oct 28, 2025 · 2 filesMessage 73 · AdequateInformational 15Details
Commit message · f321x

android: qr scanner: add emoji to clipboard string

The string is not translated and might not be accessible for non-english
speakers, even though its relatively self-explanatory i think adding
this emoji makes it more accessible.

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

This commit simply adds a clipboard emoji (📋) to an on-screen button label in the Android QR scanner and updates the project's Unicode whitelist to allow that emoji. There is no security relevance.

Lower-priorityinterface: PaddedRSTransport: keep in sync with e-x: flush on closeby SomberNight · 64233230 · Oct 27, 2025 · 1 fileMessage 81 · StrongLow 35Details
Commit message · SomberNight

interface: PaddedRSTransport: keep in sync with e-x: flush on close

ref https://github.com/spesmilo/electrumx/commit/f62f986b3308a9a0493e7560d194926c05f3ea51

note: ReplyAndDisconnect is specific to electrumx, however I think the name is descriptive enough to keep it here.

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · Low 35/100

This commit fixes a bug in Electrum's network connection code where buffered data could be discarded when a connection closes. The fix ensures any pending reply is sent before disconnecting. It is a reliability/correctness fix that could affect protocol behavior, but the supplied materials do not describe it as a security vulnerability.

Lower-priorityqt: fix ServerWidgetby f321x · f2aa4404 · Oct 27, 2025 · 2 filesMessage 68 · AdequateInformational 23Details
Commit message · f321x

qt: fix ServerWidget

The ServerWidget was not working properly, when switching from "Manual
Mode" to "Auto Connect" the change wouldn't get saved as it depended on
having a correct server string entered (which isn't neccessary for Auto
Connect).
Also makes the widget behave more sane by cleaning the server input if
Auto Connect is enabled and switching to Manual Mode if the user
manually selects a server.

Update the ServerWidget every time it is shown (on initialization and
also when the user opens it again or switches between network dialog
tabs).
This will clean it up if the user has entered some invalid server and
closes it, otherwise this server would stay in the input field until the
application is restarted.

The list of servers in the ServerWidget allows the user to right click
and 'Use as server' on the servers in the list, however internally it
was handled differently than what the user would expect when clicking on
'Use as server'. E.g. if the user selects a server in autoconnect mode
it would still stay in autoconnect mode so the server could switch again
to another server any time? Now it will also change the mode to manual
(or stay in single server mode if that was selected before), making it
clear that this server will stay selected.

If the user clicks on "Follow this branch" the connect mode will get changed to
autoconnect as internally we connect to a random interface on this
branch.

68/100 · AdequateMessage clarity
✓ Subject identifies a change✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Names security-relevant behavior explicitly
AI analysis · Informational 23/100

This commit fixes the Qt 'ServerWidget' in the Electrum Bitcoin wallet so that network connection settings actually match what the user selects. Previously, switching from 'Manual Mode' to 'Auto Connect' could fail to save, picking a server from the list could leave the wallet in auto-connect (so it might switch servers unexpectedly), and invalid server text could persist. The patch also makes the widget refresh every time it is shown and cleans up related server-following logic in the network layer. It is a UI/UX bug-fix commit; there is no direct evidence in the commit that it addresses a security vulnerability, though misconfiguration of server settings can have security-adjacent consequences for a wallet.

Lower-priorityinterface: add warmup budget to PaddedRSTransportby f321x · 679b7fe1 · Oct 27, 2025 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · f321x

interface: add warmup budget to PaddedRSTransport

Adds a 1024 (unpadded) byte budget to the PaddedRSTransport below which
messages are instantly flushed down the socket before the transport will
beginn waiting for the buffer to reach MIN_PACKET_SIZE (1024).
This allows to get the first couple of messages sent quickly when
starting the wallet to improve UX.

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

This commit is a performance tweak, not a security fix. It changes how Electrum sends small network messages at the start of a connection so the initial handshake feels faster. There is no indication it addresses a vulnerability.

Lower-priorityinterface: check genesis hash on connectionby f321x · ff2bbf15 · Oct 27, 2025 · 2 filesMessage 68 · AdequateLow 35Details
Commit message · f321x

interface: check genesis hash on connection

Prevents the client from accidentally connecting to a server on a
different network.
I noticed its possible to connect to mainnet servers on a signet
instance causing the recent peers to get populated with mainnet peers
rendering the wallet instance barely usable. Doing this check should
prevent this and similar issues.

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

This commit adds a safety check when Electrum connects to a Bitcoin server. It asks the server for its genesis block hash and disconnects if it doesn't match the network Electrum is configured for (mainnet, testnet, signet, etc.). This prevents accidental cross-network connections that could fill the peer list with incompatible servers and make the wallet misbehave. It is a hardening fix, not a clear-cut exploit patch.

Lower-prioritytrustedcoin: qt: set higher minimumHeight for QR componentby f321x · d954ddf0 · Oct 22, 2025 · 1 fileMessage 73 · AdequateInformational 20Details
Commit message · f321x

trustedcoin: qt: set higher minimumHeight for QR component

The default minimumHeight for wizard components is a bit small for the
2fa confirmation component as it only shows the QR code but not the
input field. This seems to confuse users as its not intuitive to scroll
down if there is no large text shown (as for example in the ToS component).
This change increases the minimumHeight and restores it to the previous
height once the user leaves the component again.

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

This commit is a user-interface tweak for Electrum's two-factor authentication setup. It makes the wizard window taller when showing a QR code so users can also see the text box where they type their one-time code without having to scroll. There is no security flaw here.

Lower-priorityfastlane: revert full_description to plain textby SomberNight · 224c5fa6 · Oct 21, 2025 · 1 fileMessage 76 · AdequateInformational 15Details
Commit message · SomberNight

fastlane: revert full_description to plain text

Rich text does not work reliably.
This reverts to the old formatting, but keeps some of the reordering/text changes.
follow-up https://github.com/spesmilo/electrum/pull/9492

I compared looking at the description in:
- google play store app
- google play store website [1]
- fdroid app
- fdroid website [2]

notes:
- Links work on playstore website and fdroid website, but not in the apps.
In the apps, they are not even shown at all, they are just ignored.
- ul/li/b tags do not work on playstore website

[1] https://play.google.com/store/apps/details?id=org.electrum.electrum
[2] https://f-droid.org/en/packages/org.electrum.electrum/

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

This commit only changes the marketing description text shown for the Electrum app on Google Play and F-Droid. It switches from HTML-style formatting (like bold and bullet lists) back to plain text because the formatting did not display correctly on all platforms. There is no change to the actual wallet software or its security.

Lower-prioritylnworker: fix todo, collect failed htlcs in paymentby f321x · f5aa82d4 · Oct 21, 2025 · 1 fileMessage 53 · ThinInformational 23Details
Commit message · f321x

lnworker: fix todo, collect failed htlcs in payment

This makes `LNWallet.pay_to_node()` wait
`PaySession.TIMEOUT_WAIT_FOR_NEXT_RESOLVED_HTLC` (0.5 sec) for another
htlc to get resolved after receiving a htlc failure during a payment
attempt.
This seems to make payments more reliable in scenarios where we receive
multiple htlc failures closely after each other as
`create_route_for_payment` then has access to the failed routes/failure
information of all these htlcs when trying to re-split the outstanding
amount.

53/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context! Contains work-in-progress language
AI analysis · Informational 23/100

This change tweaks how Electrum's Lightning payment code reacts when one payment chunk (HTLC) fails. Instead of immediately trying a new route based on a single failure, it waits up to 0.5 seconds to collect any other failures that arrive almost at the same time. That gives the re-splitting logic more complete information, making multi-part payments more reliable. It is a reliability/robustness improvement, not a fix for a security vulnerability.

Lower-prioritytimelock_recovery: recovery destination checks for address is_mine or script outputby Sander van Grieken · dc417a4f · Oct 20, 2025 · 1 fileMessage 65 · AdequateLow 46Details
Commit message · Sander van Grieken

timelock_recovery: recovery destination checks for address is_mine or script output

note: validation in frontend should be added to backend code as well

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

This commit adds safety checks to a wallet recovery feature. It prevents users from accidentally setting a recovery transaction that sends funds back to the same wallet they are trying to recover, or to a non-address destination. The commit message notes that frontend validation should also exist in backend code, suggesting this is only a partial fix in the user interface layer.