EL
← All projectsElectrum

Electrum

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

BitcoinSoftware walletsNormal
Repository coverage

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

64security candidates205second-pass queue42AI analyses
55commits · 30 days
108commits · 60 days
454commits · 180 days
924commits · 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.

65/100 average clarity
191Strong · 80–100
409Adequate · 60–79
285Thin · 40–59
39Opaque · 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.
SomberNight3492515063
f321x3712116070
Sander van Grieken98105057
ThomasV7221056
user322062
Roman Zeyde510053
Sasha Zykov411076
Aaron Fiore411068
Ferdinando Ametrano111096
Oren200043
Ilya Artemov200050
Felipe Micaroni Lalli100050
Analysis record

Published AI watches

Last scanned 43 minutes ago

Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: strip whitespaces in GUIs, do not strip in CLI

This commit tidies up how Electrum handles extra spaces around Bitcoin addresses, messages, and signatures when signing or verifying messages. Previously, different parts of the program (desktop GUI, mobile-style GUI, command line) behaved…

Behavior normalization across GUI and CLI interfacesNo cryptographic primitive changedNo privilege boundary crossed
4c3064f5by SomberNight+27−185 files
No security note in commit
Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

qml: strip whitespace from message before signing, as in qt gui

This commit fixes a minor consistency bug in Electrum's newer QML (mobile-style) user interface. When signing a message, the app now removes accidental spaces at the start or end of the message and address, just like the older desktop Qt i…

Behavioral inconsistency between GUI implementations could cause user confusion or failed verificationNo cryptographic weakness introduced; change is input normalizationNo memory-unsafe code, no privilege changes, no network changes
72507328by Ferdinando Ametrano+3−01 file
No security note in commit
Low 25 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

trezor: drop session after closing it

This commit fixes a bug in Electrum's support for Trezor hardware wallets. After a Trezor session times out or is closed, Electrum now forgets the old session ID. Previously it kept the stale session ID, so the next attempt to sign a trans…

Fixes a stale-session reference that caused InvalidSessionError on re-authenticationEnsures PIN re-prompt after session timeout/closureFailure mode was denial-of-service (transaction signing crash), not unauthorized signing
071b1e24by f321x+8−51 file
No security note in commit
Informational 18 AI analysisMessage 58 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

qml: update ConfirmTxDialog onValidChanged

This is a small user-interface fix for the Electrum mobile/QML app. When sweeping private keys, the confirmation dialog that shows how much money will be moved initially displayed an amount of 0 because it did not refresh after the transac…

bd776e24by f321x+3−01 file
No security note in commit
Low 42 AI analysisMessage 85 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

wallet.check_sighash: don't assume tx.add_info_from_wallet alrdy ran

This commit fixes a defensive check in the Electrum Bitcoin wallet. Before signing a transaction, Electrum checks whether the transaction uses unusual 'sighash' flags that could allow someone else to move coins unexpectedly. The bug was th…

Sighash sanity check could be bypassed for beyond-gap-limit wallet inputsFix adds defensive deep-copy and wallet-info population inside check_sighashRegression test demonstrates dangerous sighash is now caught even with gap_limit=2
b57327fbby SomberNight+48−02 files
Vendor flagged security relevance
Informational 15 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

hw_wallet/qt: reuse device message dialog across button requests

This commit is a user-interface performance and polish fix for Electrum's hardware wallet integration. It stops the app from destroying and recreating the same on-screen prompt every time a hardware wallet asks the user to confirm a transa…

898a4c27by Sasha Zykov+15−11 file
No security note in commit
Low 25 AI analysisMessage 88 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

lnmsg: add new primitive type `bip340sig`, add tlv merkle root calculation and schnorr-sign over tlvs, implicit en/decode utf8 fields, schnorr signature verification.

This commit adds new Lightning Network message handling code to Electrum. It introduces a new BIP-340 Schnorr signature field type, computes Merkle roots over TLV (type-length-value) records, signs and verifies those roots, and adds implic…

New cryptographic signing/verification path addedNew BIP-340 tagged-hash Merkle root constructionSignature TLVs excluded from the Merkle root they sign
759ef10dby Sander van Grieken+160−111 file
No security note in commit
Moderate 55 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

lnpeer: on_ping: drain out-socket buffer

This change fixes a potential denial-of-service weakness in Electrum's Lightning network peer handling. Previously, when Electrum replied to a peer's 'ping' message, it would add the reply to the outgoing socket buffer without waiting to c…

memory exhaustion / DoS mitigationunbounded outbound buffer growth preventedbackpressure added to peer ping/pong handling
9b206576by SomberNight+6−12 files
Vendor flagged security relevance
Informational 20 AI analysisMessage 100 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

ci: security review: give more permissions to claude

This commit changes Electrum's automated CI security-review bot so that the Claude AI assistant is allowed to run shell commands and modify files on its own, rather than only answering questions. The change is intentional and runs inside a…

New command-line flag named `--dangerously-skip-permissions` introducedCI script now permits an AI agent to execute commands and modify files without interactive permission checksExecution context changed from root to unprivileged `node` user to satisfy Claude's refusal to run as root
39cdb23eby f321x+4−12 files
No security note in commit
Informational 15 AI analysisMessage 90 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

tests: regtest: make test_just_in_time less flaky

This commit only changes a test script. It adds a wait helper so a test that opens two Lightning channels in a row does not fail randomly on continuous integration. There is no change to Electrum's actual wallet or Lightning code, so users…

12547f94by f321x+23−01 file
No security note in commit
Informational 15 AI analysisMessage 45 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

qml: styling updates qt6.10

This commit is a routine user-interface refresh for Electrum's mobile/desktop QML app, adjusting colors, spacing, button containers, and placeholder text to match newer Qt 6.10 styling. There is no security-relevant change and no indicatio…

cdb5c0b8by Sander van Grieken+209−17540 files
No security note in commit
Low 25 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qml: add workarounds for issue assigning custom types to QObject properties

This commit changes how the Electrum mobile/desktop QML GUI passes custom data objects between Python and the user interface. It switches many typed properties to the generic QVariant/'var' type and adds runtime type checks (asserts) in Py…

Type system relaxation: custom typed QML/Python properties changed to generic QVariant/varRuntime type enforcement added via assert statements in Python settersNo explicit security framing in commit message or diff
9772a6d5by Sander van Grieken+86−5924 files
No security note in commit
Informational 15 AI analysisMessage 35 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

qml: additional styling updates

This commit is purely a user-interface styling refresh for Electrum's QML (mobile/desktop) GUI. It swaps some visual components (highlight panes, button containers, padding, colors) and introduces a new shared 'DialogHighlightPane' control…

28f744f7by Sander van Grieken+136−8525 files
No security note in commit
Moderate 62 AI analysisMessage 93 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

verifier.py: fix CVE-2012-2459: reject left-sibling duplicates

This commit fixes a known Bitcoin weakness (CVE-2012-2459) in Electrum's light-client verification. Because Bitcoin's Merkle tree duplicates the last hash when a level has an odd number of items, an attacker can craft a block proof that ma…

Fixes CVE-2012-2459 (Merkle tree duplicate-node weakness)Adds explicit LeftSiblingDuplicate exceptionStrengthens SPV Merkle proof verification
3d390742by SomberNight+106−262 files
Vendor flagged security relevance
Moderate 65 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

daemon: set restrictive permission on RPC-server unix domain socket

Electrum's background daemon runs a local control server using a Unix domain socket. Previously, that socket file was created with permissions 0775, meaning any user in the same group could connect to it and potentially control the wallet.…

permission tightening on local RPC socketacknowledged race condition between socket creation and chmodlocal privilege boundary issue (group-writable socket)
9d204abfby SomberNight+8−11 file
Vendor flagged security relevance
Moderate 62 AI analysisMessage 78 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

in GUI mode, only start a limited minimal RPC server

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 com…

Reduction of RPC attack surface in GUI modeUnencrypted localhost RPC with config-stored passwordWindows localhost TCP exposure of RPC server
d951a3d2by SomberNight+22−102 files
Vendor flagged security relevance
Low 37 AI analysisMessage 97 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

fix: remove negative fee assert from get_tx_fee_warning

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 nega…

assertion replaced with warning lognegative transaction fee handlingPSBT loading robustness
06490657by f321x+2−11 file
No security note in commit
Moderate 63 AI analysisMessage 86 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

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

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…

Authentication bypass via empty RPC passwordIn-flight weakening of daemon security settingsInconsistent security state across daemon restart
0dcef978by SomberNight+16−72 files
Vendor flagged security relevance
Informational 21 AI analysisMessage 71 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

wizard: catch NotLegacySinglesigScriptType

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…

Unhandled exception converted to user-facing errorImproves input validation and error handling in wallet import pathNo memory corruption, privilege escalation, or cryptographic weakness evident
543b73beby f321x+7−21 file
No security note in commit
Informational 15 AI analysisMessage 65 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

transaction: use dummy DER ECDSA sig from descriptor.py

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 …

e9ac3e93by f321x+2−31 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 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 · StrongTriage 18Details
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
Security candidatedeps: bump libsecp256k1 version (0.7.0->0.7.1) and electrum-eccby SomberNight · 9dc725fa · Feb 25, 2026 · 3 filesMessage 50 · ThinTriage 15Details
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
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 · StrongTriage 18Details
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
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 · ThinTriage 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
Security candidateandroid: biometry: catch java import errorsby f321x · f573ab2d · Feb 17, 2026 · 1 fileMessage 76 · AdequateTriage 18Details
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
Security candidateannouncement_signatures: add more early returnsby ThomasV · 95273759 · Feb 17, 2026 · 1 fileMessage 45 · ThinTriage 18Details
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
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 · StrongTriage 18Details
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
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 · AdequateTriage 18Details
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
Security candidateandroid build: switch from "cryptography" to "pycryptodomex"by SomberNight · cfa052bc · Dec 11, 2025 · 2 filesMessage 73 · AdequateTriage 15Details
Commit message · SomberNight

android build: switch from "cryptography" to "pycryptodomex"

We had been using an ancient version of "cryptography" so far in our p4a fork,
however it is not compatible with OpenSSL 3.0. (Previously we were building it with OpenSSL 1.1)

Bumping "cryptography" is difficult, as building new versions of it from source requires a full rust toolchain.

Instead, this commit switches to "pycryptodomex", as a replacement, which is much easier to build from source.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
cryptography-sensitive path