EL
← All projectsElectrum

Electrum

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

BitcoinSoftware walletsNormal
Repository coverage

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

90security candidates259second-pass queue1003AI analyses
132commits · 30 days
258commits · 60 days
541commits · 180 days
1001commits · 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
546Adequate · 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
f321x40124385070
Sander van Grieken10910101057
ghost4341516070
Felix2439072
user323062
ekzyis222053
accumulator613071
Roman Zeyde515053
Sasha Zykov515075
Aaron Fiore414068
Analysis record

Published AI watches

Last scanned 29 minutes ago

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
Informational 15 AI analysisMessage 60 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qt/util: consolidate short_id check pattern

This is a small internal code cleanup in the Electrum Bitcoin wallet. It moves the logic that builds a compact transaction identifier (like '123x4') into one shared helper method, and removes a duplicate helper class. There is no user-faci…

2af9e26aby f321x+7−133 files
No security note in commit
Informational 19 AI analysisMessage 85 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

contrib: build appimage: fetch ca-certificates from pinned sources

This commit changes how the Electrum AppImage build container first obtains trusted web certificates. Because the build's pinned Debian package sources use HTTPS, the container needs certificates before it can talk to them. The old method …

build pipeline changetemporary downgrade from HTTPS to HTTP for package bootstrappackage integrity still protected by apt GPG signatures
fd687940by f321x+11−41 file
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.

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

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.

Security candidatedaemon: forbid "setconfig" command to change rpcserver settings in-flightby SomberNight · 0dcef978 · Mar 24, 2026 · 2 filesMessage 86 · StrongModerate 63Details
Commit message · SomberNight

daemon: forbid "setconfig" command to change rpcserver settings in-flight

It is much easier to reason about the rpcserver if we don't allow changing its basic settings while it is already running. What does it mean to change the TCP port it is listening on ("rpcport") if it's already running? It is even problematic to change the rpcpassword: care needs to be taken to already update it for the current server.
(ref https://github.com/spesmilo/electrum/issues/6762)

This commit disallows changing all of the "rpc*" config variables if the daemon is already running.

---

Simultaneously, it also ensures rpc_password is always set and auth cannot be disabled.

Previously if there was a daemon running, and the user ran
`$ electrum setconfig rpcpassword ""` that would leave the RPC unauthenticated
for the current session. However next time the daemon restarted, get_rpc_credentials would see
the unset password and generate one.

I think this was the worst of both worlds:
- we did not really allow removing the rpc password, except for the current session, and
- perhaps unexpectedly, we would generate a new password on daemon restart

Instead now we explicitly make sure the RPC server can never get into a state where it does not have a password set.

Based on a report by `Zuzana Kotásková <36777@mail.vsfs.cz>`

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
credential or privilege state
AI analysis · Moderate 63/100

This commit fixes a security issue in Electrum's background daemon (the program that stays running to serve wallet requests). Previously, a user could run a command that would instantly strip the RPC password from a running daemon, leaving it unauthenticated for the current session. The daemon would then accept commands from any local program without a password. On the next restart, Electrum would silently generate a new random password, which could lock out legitimate tools. The patch now forbids changing RPC server settings while the daemon is running and ensures a password is always required.

Security candidatewizard: catch NotLegacySinglesigScriptTypeby f321x · 543b73be · Mar 23, 2026 · 1 fileMessage 71 · AdequateInformational 21Details
Commit message · f321x

wizard: catch NotLegacySinglesigScriptType

Catch NetLegacySinglesigScriptType and convert it to a
UserFacingException if the user tries to import a private key for which
it is not possible to get a singlesig descriptor (e.g. p2wsh).

Fixes #10536

71/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
secret or key material
AI analysis · Informational 21/100

This commit fixes a bug in Electrum's wallet setup wizard. Previously, if a user tried to import an individual private key for an unusual script type (like p2wsh), the wizard would crash with an internal error instead of showing a friendly message saying it's not supported. The fix catches that internal error and converts it into a user-facing message. It is a robustness improvement, not a fix for a security vulnerability that allows theft or remote attacks.

Security candidateqt: perform 'fully spend' action with coin selection, keep separate from coin control when doing action.by Sander van Grieken · 48916f56 · Mar 3, 2026 · 4 filesMessage 85 · StrongInformational 22Details
Commit message · Sander van Grieken

qt: perform 'fully spend' action with coin selection, keep separate from coin control when doing action.

Also stop timer when dialog is finished, to avoid re-generating txs with the same input coin set, which
results in an exception as these coins have signatures when the swap has started.

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

This commit fixes a user-interface bug in the Electrum Bitcoin wallet's Qt desktop client. Previously, when a user chose to 'fully spend' selected coins to open a Lightning channel or perform a submarine swap, the wallet used the global 'coin control' setting to remember the coin selection. That caused the selected coins to remain locked in coin control after the dialog closed, and a background timer could keep re-creating transactions with the same already-signed coins, leading to an exception. The change passes the selected coins directly to the relevant dialogs instead of relying on coin control, and stops the timer when the dialog finishes. It is a reliability/usability fix rather than a remote-exploitable security vulnerability.

Security candidatedeps: bump libsecp256k1 version (0.7.0->0.7.1) and electrum-eccby SomberNight · 9dc725fa · Feb 25, 2026 · 3 filesMessage 50 · ThinLow 41Details
Commit message · SomberNight

deps: bump libsecp256k1 version (0.7.0->0.7.1) and electrum-ecc

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
cryptography-sensitive path
AI analysis · Low 41/100

This commit updates the cryptographic library (libsecp256k1) used by Electrum from version 0.7.0 to 0.7.1, and also updates the related Python wrapper package (electrum-ecc) from 0.0.6 to 0.0.7. It only changes version numbers and corresponding checksums in build scripts and dependency lists. There is no direct evidence in the commit itself that this fixes a specific security vulnerability, but updating a core cryptographic dependency is a routine security-hygiene change. Without a vendor reference linking this bump to a known bug, we cannot say it definitely fixes a security issue.

Security candidatetransaction: use dummy DER ECDSA sig from descriptor.pyby f321x · e9ac3e93 · Feb 24, 2026 · 1 fileMessage 65 · AdequateInformational 15Details
Commit message · f321x

transaction: use dummy DER ECDSA sig from descriptor.py

We have two different dummy der signatures of varying size,
this unifies them to use a single one from descriptor.py.

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
signing boundarysigning or wallet path
AI analysis · Informational 15/100

This commit is a minor code cleanup. It replaces a locally-defined placeholder fake cryptographic signature with a shared constant from another file. The placeholder is only used to estimate transaction size and is never broadcast or used in real transactions. There is no security issue here.

Security candidatewallet: rbf: estimate base tx size before strippingby f321x · a9f20e4d · Feb 24, 2026 · 1 fileMessage 73 · AdequateLow 37Details
Commit message · f321x

wallet: rbf: estimate base tx size before stripping

Estimate the size of a base tx before stripping its signatures
so the lower bound feerate used to calculate the fee for the rbf
transaction doesn't underestimate the feerate of the base tx.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundarysigning or wallet path
AI analysis · Low 37/100

This commit fixes a fee-calculation bug in Electrum's Replace-By-Fee (RBF) feature. Previously, the wallet estimated the size of the original transaction after removing its signatures. Because removing signatures makes the transaction look smaller than it really is, the wallet could set the new RBF transaction's fee too low, potentially causing the replacement transaction to be rejected by the Bitcoin network for not meeting the required fee rate. The fix estimates the original transaction size before stripping signatures, so the replacement fee is calculated more accurately.

Security candidatelnpeer: don't save our own channel update as remote updby f321x · ddb01f53 · Feb 23, 2026 · 2 filesMessage 88 · StrongLow 34Details
Commit message · f321x

lnpeer: don't save our own channel update as remote upd

I noticed CLN is sending our own channel update to us on
reestablishment, we then assume it to be the remote nodes
update and try to verify the signature against their pubkey
which fails and throws `InvalidGossipMsg`.

This adds a check preventing us from trying to save our own
channel updates as remote update.

88/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
signing boundary
AI analysis · Low 34/100

This commit fixes a bug in Electrum's Lightning Network code where, after reconnecting to another node, Electrum could mistakenly treat its own channel settings message as coming from the remote peer. That caused a signature verification failure and an InvalidGossipMsg error, potentially disrupting the Lightning connection or channel state handling. The fix checks who originated the message and ignores it if it came from Electrum itself.

Security candidatelocale: don't translate string "Electrum", "BIP39"by SomberNight · cf259909 · Feb 19, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · SomberNight

locale: don't translate string "Electrum", "BIP39"

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
secret or key materialseed or entropy path
AI analysis · Informational 15/100

This commit removes translation markers from two proper names ('Electrum' and 'BIP39') in a wallet setup wizard dropdown. It is a localization/UI consistency fix with no security relevance.

Security candidatelocale: don't translate string "Electrum"by SomberNight · e2c41aab · Feb 17, 2026 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · SomberNight

locale: don't translate string "Electrum"

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
seed or entropy path
AI analysis · Informational 15/100

This is a tiny localization cleanup: the word 'Electrum' (the software's own brand name) is no longer marked for translation in one dropdown menu. It is not a security fix and does not change program behavior in any meaningful way.

Security candidateandroid: biometry: catch java import errorsby f321x · f573ab2d · Feb 17, 2026 · 1 fileMessage 76 · AdequateInformational 23Details
Commit message · f321x

android: biometry: catch java import errors

Catch JavaError when trying to load the java classes of the biometry
module on startup. This can raise if the device is on an old API version
and the loaded java class depends on apis unknown to the os.

Fixes #10470

```
02-17 10:07:25.714 5254 5270 I python : 0.47 | E | __main__ | daemon.run_gui errored
02-17 10:07:25.714 5254 5270 I python : Traceback (most recent call last):
02-17 10:07:25.714 5254 5270 I python : File "app/main.py", line 514, in handle_cmd
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/daemon.py", line 653, in run_gui
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/__init__.py", line 38, in <module>
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qeapp.py", line 49, in <module>
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qebiometrics.py", line 33, in <module>
02-17 10:07:25.714 5254 5270 I python : File "jnius/reflect.py", line 243, in autoclass
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 877, in jnius.jnius.JavaMethod.__call__
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 964, in jnius.jnius.JavaMethod.call_method
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_utils.pxi", line 79, in jnius.jnius.check_exception
02-17 10:07:25.714 5254 5270 I python : jnius.jnius.JavaException: JVM exception occurred: Failed resolution of: Landroid/hardware/biometrics/BiometricPrompt$AuthenticationResult; java.lang.NoClassDefFoundError
```

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
access control
AI analysis · Informational 23/100

This commit fixes a crash in the Electrum Android app when it starts on older Android devices. The app was trying to load modern fingerprint/face-unlock Java classes that don't exist on old Android versions, causing an uncaught exception and preventing the app from opening. The fix catches that loading error and gracefully disables biometric features instead of crashing.

Security candidateannouncement_signatures: add more early returnsby ThomasV · 95273759 · Feb 17, 2026 · 1 fileMessage 45 · ThinLow 46Details
Commit message · ThomasV

announcement_signatures: add more early returns

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing boundary
AI analysis · Low 46/100

This small change tightens validation in Electrum's Lightning Network code. It makes the program return early and skip processing when it receives or is about to send 'announcement signatures' for a channel that isn't public or doesn't yet have a short channel ID. This likely prevents crashes or incorrect behavior caused by processing incomplete/unready channel data, but the diff alone does not show an obvious exploitable vulnerability.

Security candidatelocale: don't translate URL, like wtfby SomberNight · 61a6ab1d · Feb 14, 2026 · 1 fileMessage 73 · AdequateInformational 18Details
Commit message · SomberNight

locale: don't translate URL, like wtf

please, use common sense :(
I guess it was a copy-paste error, but still, treat all _() and qsTr() calls as "scary" and as potential attack vectors. Don't blindly call _(): every call needs to be weighed separately.

73/100 · AdequateMessage clarity
✓ 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 · Informational 18/100

This commit removes translation markup from a hardcoded web link in Electrum's 'About' screen. The developer's message warns that translation functions can be risky because malicious or compromised translators could alter URLs or inject harmful content. The actual change is very small and only affects a single, trusted URL label, so the direct security risk is low, but the commit reflects a broader defensive-coding concern.

Security candidateCI: changed API key for crowdin translations, update notesby SomberNight · cd802c6e · Feb 13, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · SomberNight

CI: changed API key for crowdin translations, update notes

api key was previously for "SomberNight" crowdin acc, now it's for a fresh acc "SomberNight_CI_BOT".

- "SomberNight_CI_BOT" acc has fewer permissions overall
- the new api key is minimally scoped
- I can't remember what the old api key was scoped to, and crowdin does not show the settings of existing api key, one can only revoke them
- the crowdin audit log can now distinguish actions of the bot vs actions I do manually

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
credential or privilege state
AI analysis · Informational 15/100

This commit is a routine CI maintenance change. The developer rotated a Crowdin translation API key to a new dedicated bot account with fewer permissions and added a comment explaining it. No code behavior changed, and nothing in the commit suggests a security vulnerability.

Security candidatecontrib: android: Dockerfile: fix ownership of COPYby Aaron Fiore · 202ea287 · Feb 11, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Aaron Fiore

contrib: android: Dockerfile: fix ownership of COPY

Resolves:

ERROR: Could not open requirements file: [Errno 13] Permission
denied: '/opt/deterministic-build/requirements-build-base.txt'

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
credential or privilege state
AI analysis · Informational 15/100

This commit fixes a file-permission problem inside the Android build container. Two requirement files were being copied as the root user, so the non-root build user could not read them. The fix makes the files owned by the build user. There is no security vulnerability here—just a broken build step.

Security candidateignore exceptions in process_gossipby ThomasV · b2a3e08a · Feb 9, 2026 · 1 fileMessage 65 · AdequateLow 34Details
Commit message · ThomasV

ignore exceptions in process_gossip

A failing signature verification should not kill the taskgroup

65/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides an explanatory body✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarydefensive validation
AI analysis · Low 34/100

This commit adds error-handling decorators to a Lightning Network gossip message processing function. Previously, a bad or maliciously crafted gossip message that failed signature verification could crash the entire task group, potentially disconnecting the user from a peer or disrupting channel/network discovery. Now such failures are logged and ignored instead of propagating. It is a hardening/DoS-mitigation fix, not a clear remote-code-execution vulnerability.

Security candidatebuild: android: use Java 17, as before debian upgrade :/by SomberNight · 4da7b7f5 · Jan 30, 2026 · 1 fileMessage 93 · StrongInformational 15Details
Commit message · SomberNight

build: android: use Java 17, as before debian upgrade :/

When building on debian 12, we were using Java 17.
On debian 13, Java 17 is not packaged anymore, instead there is Java 21 and 25.
Ideally we should upgrade to Java 21 and just install it from apt.

However old Gradle is not compatible with new Java, so we have to upgrade Gradle for that.
- see https://docs.gradle.org/current/userguide/compatibility.html

Old Gradle is giving build errors with Java 21:
```
Could not compile build file '/home/user/wspace/electrum/.buildozer_qml/android/platform/build-arm64-v8a/dists/Electrum/build.gradle'.
> startup failed:
General error during conversion: Unsupported class file major version 65

java.lang.IllegalArgumentException: Unsupported class file major version 65
```

for our p4a fork, I tried to cherry-pick stuff from upstream:
- https://github.com/kivy/python-for-android/commit/17bf5322791ec8cec85836fbe906e63664a05445
- https://github.com/kivy/python-for-android/pull/3172
https://github.com/kivy/python-for-android/commit/a8f2ca1c5b1bb6696b47fdf2c052285e116e0ebe
- see https://github.com/SomberNight/python-for-android/compare/a01269f7799587ad74ee40e0b642d917b8db7d4e...846a1094874aeb64b623fa746222a41851245271

That seems sufficient to upgrade Gradle as far as p4a is concerned.

However that still did not work yet:
- contrib/android/make_barcode_scanner.sh fails, as
markusfisch/zxing-cpp and markusfisch/CameraView
are also using too old gradle versions for Java 21
- it seems they are intentionally doing this to maintain compat with Android 4:
see https://github.com/markusfisch/zxing-cpp/commit/d98ed5d0be513c4077b4c13d1f7873f141949839

So for now maybe the path of least resistance is to downgrade to Java 17 :(

93/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
update trust
AI analysis · Informational 15/100

This commit changes the Android build environment for the Electrum Bitcoin wallet. Because the newer Debian Linux version no longer includes Java 17, the developers manually download and install old Java 17 packages from an archived Debian snapshot instead of using the newer Java versions available in the operating system. This is a temporary workaround to keep the Android app building, not a fix for a user-facing security bug. The main risk is that relying on an older Java version and manually downloaded packages could eventually miss security updates or break the build process, but there is no direct evidence this introduces an exploitable vulnerability in the wallet app itself.

Security candidateqml: require authentication for message signingby f321x · 5d314012 · Jan 21, 2026 · 2 filesMessage 65 · AdequateModerate 59Details
Commit message · f321x

qml: require authentication for message signing

Requests authentication when trying to sign a message if "Payment
Authentication" is enabled.

65/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Names security-relevant behavior explicitly
Why it was queued
signing boundaryaccess controlsigning or wallet path
AI analysis · Moderate 59/100

This commit fixes a security gap in Electrum's mobile-style QML user interface. Previously, signing a message with one of your wallet's private keys did not ask for the user's payment authentication (PIN/password/biometric). Now it does. Message signing is used to prove you own a Bitcoin address, and an attacker with brief access to an unlocked device could previously forge your signature without re-authenticating.

Security candidateqml: protect Address Private Keys from screenshotsby f321x · 8e5ea8e1 · Jan 21, 2026 · 1 fileMessage 65 · AdequateLow 48Details
Commit message · f321x

qml: protect Address Private Keys from screenshots

Address private keys weren't protected from screenshots.

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
secret or key material
AI analysis · Low 48/100

This commit fixes a privacy gap in Electrum's mobile-style QML user interface. Previously, when you opened the details for a Bitcoin address and viewed its private key, the app window was not marked as 'secure,' meaning another app or the operating system could take a screenshot or screen recording of the private key. The change tells the app controller to protect the window from screenshots whenever a private key is being shown. This reduces the risk that malware or a compromised helper app could steal the key by capturing the screen.

Security candidateqml: remove pin code authenticationby user · 47efb8b1 · Jan 19, 2026 · 11 filesMessage 73 · AdequateLow 45Details
Commit message · user

qml: remove pin code authentication

Completely removes the pin code authentication from qml. The config
option in the wallet preferences has been renamed to "Payment
authentication" and now either asks for the Android system
authentication (Biometric or system pin/password) if enabled or will ask
for the wallet password as fallback.

73/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
access controlsigning or wallet pathauthentication path
AI analysis · Low 45/100

This commit removes the old 6-digit PIN authentication from Electrum's Android/QML interface and replaces it with a single 'Payment authentication' setting. When enabled, the app now uses the phone's built-in biometric or system PIN/password prompt; when disabled, it just asks the user to confirm. The change also tightens Android biometric security by requiring Android 11+ and allowing only strong biometrics or device credentials. It is a feature redesign rather than a clear-cut vulnerability fix, but it likely addresses weaknesses in the previous custom PIN implementation.

Security candidateandroid: implement biometric authenticationby user · 5dd3dda2 · Jan 13, 2026 · 10 filesMessage 55 · ThinLow 35Details
Commit message · user

android: implement biometric authentication

Allows to unlock the android app with the android biometric api (e.g.
fingerprint). Can be enabled in the settings.

55/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body✓ Names security-relevant behavior explicitly
Why it was queued
access controlsigning or wallet path
AI analysis · Low 35/100

This commit adds optional fingerprint unlock to the Electrum Android app. It stores an encrypted copy of the wallet password on the device, protected by Android's built-in biometric/keystore system. The change is a feature addition, not a fix for a known bug or attack. There are some design choices worth reviewing—such as how the encrypted password is stored and what happens if a user adds a new fingerprint—but nothing in the commit itself shows an active vulnerability being exploited.

Security candidatepsbt_nostr: add EventListener comment to CosignerWalletby f321x · e033a5e6 · Jan 5, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · f321x

psbt_nostr: add EventListener comment to CosignerWallet

I got confused how on_event_proxy_set can even work if CosignerWallet
doesn't inherit from EventListener until i figured out its children use
the EventListener too. To avoid this confusion i added two comments.

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 boundarysigning or wallet path
AI analysis · Informational 15/100

This commit only adds two explanatory comments to the code. It does not change any behavior, fix any bug, or alter any security mechanism. One comment clarifies that child classes of CosignerWallet must inherit from EventListener and register callbacks; the other notes that callbacks are registered in child classes. It is a documentation-only change.

Security candidatebug: psbt_nostr: set CosignerWallet.pending on aio loopby f321x · 0d380218 · Jan 5, 2026 · 1 fileMessage 73 · AdequateInformational 17Details
Commit message · f321x

bug: psbt_nostr: set CosignerWallet.pending on aio loop

Fixes:
```
Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/plugins/psbt_nostr/qt.py", line 149, in on_receive
self.mark_pending_event_rcvd(event_id)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/plugins/psbt_nostr/psbt_nostr.py", line 254, in mark_pending_event_rcvd
self.pending.set()
~~~~~~~~~~~~~~~~^^
File "/usr/lib64/python3.14/asyncio/locks.py", line 192, in set
fut.set_result(True)
~~~~~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.14/asyncio/base_events.py", line 829, in call_soon
self._check_thread()
~~~~~~~~~~~~~~~~~~^^
File "/usr/lib64/python3.14/asyncio/base_events.py", line 866, in _check_thread
raise RuntimeError(
"Non-thread-safe operation invoked on an event loop other "
"than the current one")
RuntimeError: Non-thread-safe operation invoked on an event loop other than the current one
```

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundarysigning or wallet path
AI analysis · Informational 17/100

This is a bug-fix patch for a crash in Electrum's optional PSBT-over-Nostr plugin. The plugin helps co-signers exchange partially-signed Bitcoin transactions. The crash happened because a background thread tried to update an asyncio synchronization object on the wrong event loop, triggering a RuntimeError. The fix routes that update to the correct asyncio loop. It is a reliability fix, not a security vulnerability, and there is no evidence it can be exploited by an attacker.

Security candidateqt: trustedcoin: only allow signing with broadcastby f321x · a105c500 · Dec 16, 2025 · 1 fileMessage 73 · AdequateLow 35Details
Commit message · f321x

qt: trustedcoin: only allow signing with broadcast

Only allow signing a transaction if it also gets broadcast by disabling
the signing and broadcast button of the preview dialog when creating a
new tx. Makes it slightly less trivial to cheat with the fees.

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

This change tightens the user interface for Electrum's two-factor authentication (2FA) wallets. When a 2FA wallet user previews a new transaction, the buttons that let them sign or broadcast it are now hidden. The commit message says this makes it 'slightly less trivial to cheat with the fees.' In plain terms, it closes a small UI path that could let a user manipulate transaction fees in a way the trustedcoin two-factor service is meant to prevent.