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 48 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 candidatelnpeer: chan_reest: ctn overflow: force-close instead of disconnectby SomberNight · b3e441f8 · Aug 5, 2026 · 2 filesMessage 92 · StrongModerate 60Details
Commit message · SomberNight

lnpeer: chan_reest: ctn overflow: force-close instead of disconnect

(was DC-ing due to assert failing in RevocationStore)

also add a test case

92/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Names security-relevant behavior explicitly
Why it was queued
memory safety
AI analysis · Moderate 60/100

This commit fixes a bug in Electrum's Lightning Network code. Previously, if a malicious or malfunctioning peer sent a channel re-establishment message with extremely large commitment numbers (over 2^48), the local program would hit an internal assertion failure and simply disconnect. Now, it treats this as misbehavior and force-closes the channel instead, which is the safer response. The commit also adds tests to confirm this behavior.

Security candidatewallet: sign_message: strip whitespaces in GUIs, do not strip in CLIby SomberNight · 4c3064f5 · Aug 3, 2026 · 5 filesMessage 96 · StrongInformational 19Details
Commit message · SomberNight

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

- stripping whitespaces leads to better UX for GUIs IMO, but it's counter-productive for CLI
- our previous behaviour was unintentionally inconsistent:
- qt stripped the message in both sign and verify
- qml stripped the message in verify but not in sign (until #10787)
- cli stripped the message in both sign and verify
- qml also stripped the signature in verify, which was not done anywhere else
- now this code is de-duped, and the default becomes stripping both message and signature; with the CLI explicitly opting out of that

ref https://github.com/spesmilo/electrum/issues/4327
closes https://github.com/spesmilo/electrum/pull/10787
closes https://github.com/spesmilo/electrum/pull/10788

96/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarysigning or wallet path
AI analysis · Informational 19/100

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 inconsistently—some trimmed spaces automatically, others did not. The change moves the trimming into the shared wallet code and makes it the default for GUIs, while the command-line tool now explicitly keeps spaces untouched. It is a user-experience and consistency fix, not a patch for an active security vulnerability.

Security candidateqml: strip whitespace from message before signing, as in qt guiby Ferdinando Ametrano · 72507328 · Aug 1, 2026 · 1 fileMessage 96 · StrongInformational 19Details
Commit message · Ferdinando Ametrano

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

The qt gui strips leading/trailing whitespace from the message (and
address) both when signing and when verifying (see #4327). The qml gui
already strips in verifyMessage (qedaemon.py), but not in signMessage:
a message with leading/trailing whitespace signed in the qml gui would
produce a signature that fails verification even in the same dialog.

Strip in signMessage too, replicating the qt gui behaviour.

related: https://github.com/spesmilo/electrum/issues/4327
related: https://github.com/btclib-org/btclib/issues/200

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

96/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
signing boundarydefensive validationsigning or wallet path
AI analysis · Informational 19/100

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 interface already did. Without this fix, a message signed in the QML interface could fail verification because of stray whitespace. It is a usability/reliability fix, not a serious security vulnerability.

Security candidatetrezor: drop session after closing itby f321x · 071b1e24 · Jul 30, 2026 · 1 fileMessage 68 · AdequateLow 25Details
Commit message · f321x

trezor: drop session after closing it

Set `TrezorClientBase._session = None` after closing a session
(e.g. after session timeout) so the next session access will prompt
for the pin on the device instead of throwing an `InvalidSessionError`
when trying to access the device.

E.g. when trying to sign a tx after the session timed out:
```
80.64 | I | plugins.trezor.clientbase.TrezorClientBase | timed out
80.64 | I | plugins.trezor.clientbase.TrezorClientBase | clear session: <electrum.plugins.trezor.clientbase.TrezorClientBase object at 0x7f24cd34f080>
80.64 | I | plugins.trezor.clientbase.TrezorClientBase | locking: <trezorlib.protocol_v1.TrezorClientV1 object at 0x7f24cd34e160>
80.90 | I | plugins.trezor.clientbase.TrezorClientBase | closing: SessionV1(id=d5e6015e501acf4b10b3a3e50f1f9307768e434330568e7d5e7b1babed066438)
112.83 | I | plugin.DeviceMgr | getting client for keystore
112.83 | I | plugin.DeviceMgr | end client for keystore
113.10 | I | plugin.DeviceMgr | getting client for keystore
113.10 | I | plugin.DeviceMgr | end client for keystore
113.11 | E | gui.qt.main_window.[trezor] | on_error
Traceback (most recent call last):
File "/var/home/user/code/code_vm/electrum/electrum/gui/common_qt/util.py", line 165, in run
result = task.task()
File "/var/home/user/code/code_vm/electrum/electrum/wallet.py", line 2822, in sign_transaction
k.sign_transaction(tmp_tx, password)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/var/home/user/code/code_vm/electrum/electrum/plugins/trezor/trezor.py", line 100, in sign_transaction
self.plugin.sign_transaction(self, tx, prev_tx)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/var/home/user/code/code_vm/electrum/electrum/plugin.py", line 1000, in wrapper
return run_in_hwd_thread(partial(func, *args, **kwargs))
File "/var/home/user/code/code_vm/electrum/electrum/plugin.py", line 993, in run_in_hwd_thread
return fut.result()
~~~~~~~~~~^^
File "/usr/lib64/python3.14/concurrent/futures/_base.py", line 454, in result
return self.__get_result()
~~~~~~~~~~~~~~~~~^^
File "/usr/lib64/python3.14/concurrent/futures/_base.py", line 396, in __get_result
raise self._exception
File "/usr/lib64/python3.14/concurrent/futures/thread.py", line 86, in run
result = ctx.run(self.task)
File "/usr/lib64/python3.14/concurrent/futures/thread.py", line 73, in run
return fn(*args, **kwargs)
File "/var/home/user/code/code_vm/electrum/electrum/plugins/trezor/trezor.py", line 344, in sign_transaction
signatures, _ = client.sign_tx(self.get_coin_name(),
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
inputs, outputs,
^^^^^^^^^^^^^^^^
...<3 lines>...
serialize=False,
^^^^^^^^^^^^^^^^
prev_txes=prev_tx)
^^^^^^^^^^^^^^^^^^
File "/var/home/user/code/code_vm/electrum/electrum/plugin.py", line 1000, in wrapper
return run_in_hwd_thread(partial(func, *args, **kwargs))
File "/var/home/user/code/code_vm/electrum/electrum/plugin.py", line 990, in run_in_hwd_thread
return func()
File "/var/home/user/code/code_vm/electrum/electrum/plugins/trezor/clientbase.py", line 356, in sign_tx
return trezorlib.btc.sign_tx(self.session, *args, **kwargs)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/home/user/code/code_vm/electrum/env/lib64/python3.14/site-packages/trezorlib/tools.py", line 379, in wrapper
result = self.func(session, *args, **kwargs)
File "/var/home/user/code/code_vm/electrum/env/lib64/python3.14/site-packages/trezorlib/btc.py", line 329, in sign_tx
res = session.call(signtx, expect=messages.TxRequest)
File "/var/home/user/code/code_vm/electrum/env/lib64/python3.14/site-packages/trezorlib/client.py", line 113, in call
raise exceptions.InvalidSessionError(self.id)
trezorlib.exceptions.InvalidSessionError: b'\xd5\xe6\x01^P\x1a\xcfK\x10\xb3\xa3\xe5\x0f\x1f\x93\x07v\x8eCC0V\x8e}^{\x1b\xab\xed\x06d8'
```

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing boundaryaccess control
AI analysis · Low 25/100

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 transaction would crash with an InvalidSessionError instead of asking the user for their PIN again. It is a usability/reliability fix, not a direct theft-of-funds vulnerability, because the failure mode was a crash rather than an unauthorized transaction.

Security candidateqml: update ConfirmTxDialog onValidChangedby f321x · bd776e24 · Jul 14, 2026 · 1 fileMessage 58 · ThinInformational 18Details
Commit message · f321x

qml: update ConfirmTxDialog onValidChanged

Commit 2de11eac923d51befe44dcc748505714196a7f2c gated the
ConfirmTxDialog amount behind `finalizer.valid`.
When sweeping private keys from the sweep view the resulting
`ConfirmTxDialog` is not valid in the beginning, and after it
turns valid nothing causes it to update. This results in the amount
being displayed as `0` even after it finished fetching the keys balances.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Why it was queued
secret or key material
AI analysis · Informational 18/100

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 transaction became valid. The patch makes the dialog refresh its amount display when validity changes, so users see the correct amount before confirming. There is no security vulnerability here.

Security candidatewallet.check_sighash: don't assume tx.add_info_from_wallet alrdy ranby SomberNight · b57327fb · Jul 1, 2026 · 2 filesMessage 85 · StrongLow 42Details
Commit message · SomberNight

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

Sighash warnings/errors might in theory not be triggered for
inputs owned by the wallet but which are beyond the gap limit.
tx.add_info_from_wallet(wallet) side-effects the wallet state
so that wallet.is_mine() learns derivation paths for beyond-gap-limit addresses.

In practice both GUIs currently call tx.add_info_from_wallet before
check_sighash runs, so this was not exploitable.

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
explicit security languagesigning or wallet path
AI analysis · Low 42/100

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 that this safety check could be skipped for wallet addresses that were beyond the user's configured gap limit, because the wallet had not yet learned those addresses belonged to it. The fix makes the check self-contained by first asking the transaction to teach the wallet about any relevant addresses, using a copy so the original transaction is not changed. The commit message says the current graphical interfaces already performed this step, so the bug was not exploitable in practice through normal use.

Security candidateexchange rate: remove CoinDesk providerby f321x · 6571e479 · Jun 30, 2026 · 2 filesMessage 65 · AdequateInformational 15Details
Commit message · f321x

exchange rate: remove CoinDesk provider

The API is non-functional and their new api requires an authorization
token, so we cannot keep using it.

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

This commit simply removes the CoinDesk exchange-rate provider from Electrum because CoinDesk's old API no longer works and its new API requires a paid authorization token. It is a routine cleanup, not a security fix.

Security candidatehw_wallet/qt: reuse device message dialog across button requestsby Sasha Zykov · 898a4c27 · Jun 30, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Sasha Zykov

hw_wallet/qt: reuse device message dialog across button requests

QtHandlerBase.message_dialog() used to tear down the current dialog
(clear_dialog -> QDialog.accept) and build a brand-new WindowModalDialog
on every device button request. A device emits one button request per
output, so signing a tx with many outputs rebuilt the dialog once per
output. On macOS a window-modal QDialog is shown as an animated "sheet",
so the popup visibly slid closed and reopened for each output, and the
GUI churn also competed with the single hardware-comms thread for the
GIL, adding latency between device prompts.

Reuse the open dialog and just update its label text when one is already
showing (title and on_cancel are stable within a signing flow). This
also smooths Ledger's repeated progress messages, which update the text
on each call.

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 15/100

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 transaction output. Instead, it keeps the existing dialog open and just updates its text. This removes visible flicker/animation on macOS and reduces delays caused by repeatedly creating windows. There is no security vulnerability being fixed here.

Security candidatelnmsg: add new primitive type `bip340sig`, add tlv merkle root calculation and schnorr-sign over tlvs, implicit en/decode utf8 fields, schnorr signature verification.by Sander van Grieken · 759ef10d · Jun 9, 2026 · 1 fileMessage 88 · StrongLow 25Details
Commit message · Sander van Grieken

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

Co-Authored-By: f321x <f@f321x.com>

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 boundarydefensive validation
AI analysis · Low 25/100

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 implicit UTF-8 encoding/decoding for text fields. The changes are a feature addition to support BOLT12-style offers/invoices rather than a fix for a known vulnerability. There is no direct evidence in the commit or supplied references that this patch itself creates or fixes a security bug, but any new cryptographic signing code carries implementation risk.

Security candidatescripts: simplify testnet usageby SomberNight · a395da4e · May 31, 2026 · 4 filesMessage 35 · OpaqueInformational 15Details
Commit message · SomberNight

scripts: simplify testnet usage

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
boot or update path
AI analysis · Informational 15/100

This commit is a small cleanup of internal developer scripts. It replaces direct calls to set the Bitcoin test network with a single call that asks the configuration object which chain to use. There is no user-facing change and no security issue.

Security candidatelnpeer: on_ping: drain out-socket bufferby SomberNight · 9b206576 · May 26, 2026 · 2 filesMessage 68 · AdequateModerate 55Details
Commit message · SomberNight

lnpeer: on_ping: drain out-socket buffer

might help against some memory exhaustion attacks

f321x said:
> maybe a peer could just fill up our sockets outgoing buffer by ~234mb/h
> if they stop reading from their socket and keep sending pings every second.

Co-authored-by: f321x <f@f321x.com>

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
explicit security language
AI analysis · Moderate 55/100

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 confirm it could actually be sent. A malicious peer that accepts data very slowly (or not at all) could trick Electrum into piling up hundreds of megabytes of unsent replies in memory each hour. The patch makes the reply wait until the socket can drain the data, limiting memory growth.

Security candidateci: security review: give more permissions to claudeby f321x · 39cdb23e · May 14, 2026 · 2 filesMessage 100 · StrongInformational 20Details
Commit message · f321x

ci: security review: give more permissions to claude

With `--dangerously-skip-permissions` claude can also execute
commands. I thought the `-p` flag for headless usage already
did that, but apparently not
(looking at https://code.claude.com/docs/en/headless).

As it runs in the isolated CI container this seems fine and
might make it more powerful (e.g. allowing it to run and
modify unittests to verify behavior).

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
credential or privilege state
AI analysis · Informational 20/100

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 an isolated CI container under a non-root user. It is a tooling/configuration change, not a fix for a vulnerability in Electrum wallet software itself.

Security candidatetests: regtest: make test_just_in_time less flakyby f321x · 12547f94 · May 13, 2026 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · f321x

tests: regtest: make test_just_in_time less flaky

The regtest just_in_time is flaky on the CI because it tries to open
two channels right after each other (mining 3 blocks in between).
If the channel opener (LSP/Bob) hasn't caught up yet and is still
on the same height as the previous channel open it will refuse to open
another channel due to the anchor channel key derivation limitation.

This adds a helper to pause the test until bob has caught up to the newly
mined 3 blocks before attempting the second open.

90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
Why it was queued
secret or key material
AI analysis · Informational 15/100

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 are not affected.

Security candidateUpgrade `trezorlib` to 0.20.1by Roman Zeyde · 0f2fa36e · May 11, 2026 · 4 filesMessage 78 · AdequateInformational 24Details
Commit message · Roman Zeyde

Upgrade `trezorlib` to 0.20.1

Trezor plugin is updated for `trezorlib` 0.20.1 release.

Tested the following scenarios with Trezor 1 (with FW 1.14.0), T, Safe 3 and Safe 5 (with FW 2.10.0):
- create a new wallet:
- generate new seed
- recover from backup
- verify an address
- send & RBF flows
- set a PIN & a passphrase
- open an existing wallet file
- locking the device on exit
- flow cancellation

Safe 7 support will be added in a subsequent PR.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
access control
AI analysis · Informational 24/100

This commit updates Electrum's Trezor hardware wallet plugin to work with a newer version of the trezorlib library (0.20.1). It rewrites how Electrum opens sessions with Trezor devices, especially when passphrases are used. The change is a routine dependency upgrade, but it touches sensitive code that handles private keys and device unlocking. There is no direct evidence in the commit that this fixes a known security vulnerability, but any bug in session or passphrase handling could in principle affect wallet security.

Security candidateSECURITY.md: enable "private vuln reports" on GitHubby SomberNight · a271e2f1 · Apr 28, 2026 · 1 fileMessage 86 · StrongInformational 15Details
Commit message · SomberNight

SECURITY.md: enable "private vuln reports" on GitHub

ref https://docs.github.com/en/code-security/how-tos/report-and-fix-vulnerabilities/privately-reporting-a-security-vulnerability

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

This commit only updates the project's SECURITY.md file to add a new preferred way for researchers to privately report security vulnerabilities through GitHub's built-in reporting feature. It does not change any application code, fix a bug, or address an active security issue. It is a documentation/process change only.

Security candidateqml: additional styling updatesby Sander van Grieken · 28f744f7 · Apr 22, 2026 · 25 filesMessage 35 · OpaqueInformational 15Details
Commit message · Sander van Grieken

qml: additional styling updates

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
seed or entropy pathsigning or wallet path
AI analysis · Informational 15/100

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. There is no change to transaction handling, cryptography, wallet logic, networking, or any security-sensitive behavior.

Security candidateandroid: use plain 'build' dependency (using 'venv') instead of 'build[virtualenv]', remove setuptools as its use is now pinned via hostpython_prerequisites where applicable, update depends asserts in pyqt6sip, sip, pyqt_builderby Sander van Grieken · 9d5b4a7c · Apr 22, 2026 · 8 filesMessage 73 · AdequateInformational 14Details
Commit message · Sander van Grieken

android: use plain 'build' dependency (using 'venv') instead of 'build[virtualenv]',
remove setuptools as its use is now pinned via hostpython_prerequisites where applicable,
update depends asserts in pyqt6sip, sip, pyqt_builder

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

This commit updates how Electrum's Android build system installs Python packaging tools. It switches from a feature-rich 'build[virtualenv]' dependency to a simpler 'build' dependency, removes a custom pinned recipe for setuptools, and moves setuptools into a new 'hostpython_prerequisites' mechanism for some recipes. It also updates version assertions for packaging, pyqt6sip, sip, and pyqt_builder to match a newer python-for-android version. There is no direct security fix visible in the diff; it appears to be build-system maintenance.

Security candidateandroid: build pyqt_builder and sip ourselves, hash pin all hostpython_prerequisitesby Sander van Grieken · c8f5798d · Apr 22, 2026 · 6 filesMessage 50 · ThinLow 28Details
Commit message · Sander van Grieken

android: build pyqt_builder and sip ourselves, hash pin all hostpython_prerequisites

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
access control
AI analysis · Low 28/100

This commit updates the Android build setup for the Electrum Bitcoin wallet. It switches to a newer version of the python-for-android build tool, starts building two PyQt-related packages (pyqt_builder and sip) from source instead of relying on pre-built wheels, and adds cryptographic hash checks for build-time Python tools like setuptools and pip. These are supply-chain hardening changes: they make it harder for a malicious or compromised upstream package to sneak bad code into Electrum's Android app during compilation.

Security candidateandroid: pin hostpython3 PyProjectRecipe versions, pin android and pyjnius recipes Cython versionby Sander van Grieken · 74f3c042 · Apr 22, 2026 · 4 filesMessage 65 · AdequateInformational 18Details
Commit message · Sander van Grieken

android: pin hostpython3 PyProjectRecipe versions,
pin android and pyjnius recipes Cython version

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

This commit tightens the Android build process for the Electrum Bitcoin wallet by pinning exact versions of build tools (like Cython, pip, setuptools) and their cryptographic hashes. It also updates the version of python-for-android used. There is no direct vulnerability fix in the application code; instead, it is a supply-chain hardening change to make the build more reproducible and prevent unexpected or malicious tool updates during compilation.

Security candidateqml: add workarounds for issue assigning custom types to QObject propertiesby Sander van Grieken · 9772a6d5 · Apr 22, 2026 · 24 filesMessage 73 · AdequateLow 25Details
Commit message · Sander van Grieken

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

- on the python side, for pyqtProperty's with a setter, the pyqtProperty should be declared as QVariant type
- on the qml side, properties should be declared 'var', not the custom type.

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 25/100

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 Python setters. The stated goal is to work around a Qt/PyQt bug where assigning custom Python types to QML properties fails. The changes are defensive and reduce strict compile-time type safety in favor of runtime checks. There is no direct evidence in the commit that this fixes an exploitable security vulnerability; it appears to be a compatibility/stability fix.

Security candidateqml: styling updates qt6.10by Sander van Grieken · cdb5c0b8 · Apr 22, 2026 · 40 filesMessage 45 · ThinInformational 15Details
Commit message · Sander van Grieken

qml: styling updates qt6.10

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

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 indication it fixes or introduces a vulnerability.

Security candidateqml: wizard styling, password dialog stylingby Sander van Grieken · e99b3023 · Apr 22, 2026 · 3 filesMessage 45 · ThinInformational 15Details
Commit message · Sander van Grieken

qml: wizard styling, password dialog styling

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 commit is purely a user-interface styling update for Electrum's QML (mobile-style) screens. It changes how password prompts and wallet setup wizards look—moving labels into placeholder text, adjusting margins, and making buttons a consistent touch-friendly height. There is no change to security logic, cryptography, or how passwords/seeds are handled.

Security candidateverifier.py: fix CVE-2012-2459: reject left-sibling duplicatesby SomberNight · 3d390742 · Apr 3, 2026 · 2 filesMessage 93 · StrongModerate 62Details
Commit message · SomberNight

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

Due to how the txid-commitment merkle tree used in the block headers is constructed, we need an extra check to be able to validate the *position* of a txid in a block.

I think this is low severity for us.

See https://bitcointalk.org/?topic=102395 :

> The Merkle hash implementation that Bitcoin uses to calculate the Merkle
> root in a block header is flawed in that one can easily construct multiple
> lists of hashes that map to the same Merkle root.
> For example, merkle_hash([a, b, c]) and merkle_hash([a, b, c, c]) yield
> the same result. This is because, at every iteration, the Merkle hash
> function pads its intermediate list of hashes with the last hash if the
> list is of odd length, in order to make it of even length.
>
> And so, the Merkle root function can be effectively preimaged by
> changing the input so that one of the intermediate lists is of even
> length with the last two elements equal (where originally it was
> of odd length with a last element equal to the earlier mentioned two).
> As was later noted, this extends to any input length that is
> not a power of two:
> merkle_hash([a, b, c, d, e, f]) == merkle_hash([a, b, c, d, e, f, e, f]).
> Note that to maintain the same root hash, the only flexibility that
> exists is duplication of elements.

Ported from https://github.com/Electron-Cash/Electron-Cash/commit/165146362b4cb0ad74770b36aca1f9acb2800195

Co-authored-by: bitcoincashautist <80100588+A60AB5450353F40E@users.noreply.github.com>

93/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
Why it was queued
explicit security languagedefensive validation
AI analysis · Moderate 62/100

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 makes a transaction appear to be at a different position than it really is. The patch rejects proofs where a duplicated value appears on the left side of a hash pair, which only happens in forged proofs. The commit also adds tests for the fix and re-labels an existing related defense for CVE-2017-12842.

Security candidatedaemon: set restrictive permission on RPC-server unix domain socketby SomberNight · 9d204abf · Mar 27, 2026 · 1 fileMessage 50 · ThinModerate 65Details
Commit message · SomberNight

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

0600 instead of 0775.

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
credential or privilege state
AI analysis · Moderate 65/100

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. This commit changes the permissions to 0600, so only the wallet's owner can access the socket. The commit itself notes a possible race condition: for a brief moment after the socket is created and before the permissions are tightened, other users might still be able to connect.

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

crypto.py: replace sys.exit with ImportError

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

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

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