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
131commits · 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 4 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.

Lower-priorityci: add GitHub Actions tests workflowby f321x · b3986341 · May 26, 2026 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · f321x

ci: add GitHub Actions tests workflow

Replaces the Cirrus CI tasks (flake8 mandatory, flake8 non-mandatory,
ban-unicode, unittests across Python 3.10-3.14 + 3.14 debug, and
unittests with frozen deps) with a single .github/workflows/tests.yml.

90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit adds a new GitHub Actions configuration file that automatically runs code-quality checks and unit tests when code is pushed or a pull request is opened. It does not change any application code, user-facing behavior, or security-sensitive logic. It is purely an infrastructure change to the project's continuous integration (CI) system.

Lower-prioritysetup.py: "qml_gui" extra: restrict pyqt to "6.10.x"by SomberNight · 33e67fda · May 25, 2026 · 1 fileMessage 81 · StrongInformational 20Details
Commit message · SomberNight

setup.py: "qml_gui" extra: restrict pyqt to "6.10.x"

I had misunderstood how "~=" works.
Previous meant >=6.10, but any 6.x.
While I actually wanted 6.10.0<=v<6.11.

follow-up 96a3345ab5a3c41c89b4b5bac2d8bde12d753392

ref https://peps.python.org/pep-0440/#compatible-release

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

This commit tightens a Python package version pin. The developer had accidentally allowed any PyQt 6.x release (e.g., 6.11, 6.12) to be installed for the optional QML GUI, when they only wanted the 6.10.x line. The change itself is a preventive dependency fix, not a patch for an active vulnerability in Electrum's code. It reduces the risk that a future, incompatible, or buggy PyQt release could break or destabilize the QML GUI.

Lower-priorityci: security review: increase timeout: 20 -> 60 minby f321x · 87ca59e5 · May 25, 2026 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · f321x

ci: security review: increase timeout: 20 -> 60 min

Large diffs or complex contexts can take a long time to review.
If the timeout kicks in too early the ressources Claude used are wasted.

90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
AI analysis · Informational 15/100

This commit simply increases the timeout for an automated security review script from 20 minutes to 60 minutes. It does not change any wallet, networking, or cryptographic code that could affect users. There is no security vulnerability here.

AI review queuedunit tests: do not mock save_dbby ThomasV · f2ece0f4 · May 21, 2026 · 2 filesMessage 78 · AdequateInformational 15Details
Commit message · ThomasV

unit tests: do not mock save_db

Create in-memory wallets instead.

The logic of calling save_db() at specific places is specific to
the current JsonDB backend, and it does not generalize well.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit only changes unit tests. It removes the practice of mocking (faking) the wallet save function and instead creates in-memory wallets that don't touch disk. There is no change to the actual Electrum wallet application or its security behavior.

Lower-prioritylnworker: LNGossip to signal OPTION_ANCHORS_OPTby SomberNight · 2e640c83 · May 20, 2026 · 1 fileMessage 68 · AdequateLow 25Details
Commit message · SomberNight

lnworker: LNGossip to signal OPTION_ANCHORS_OPT

Our LNWallet now sets OPTION_ANCHORS_REQ -- maybe other impls will do this too?
LNGossip does not care about anchors but should still be able to utilise peers that require it.

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

This commit adds a single Lightning Network feature flag to Electrum's gossip subsystem so it can talk to peers that require 'anchor' channel commitments. It is a compatibility/interoperability fix, not a patch for an active attack. The change signals support but does not implement anchor logic, so any security relevance is indirect (avoiding connection failures or protocol confusion with stricter peers).

Lower-prioritytests: try to make "backup" regtest less flakyby SomberNight · 5828b738 · May 20, 2026 · 3 filesMessage 78 · AdequateInformational 12Details
Commit message · SomberNight

tests: try to make "backup" regtest less flaky

Kind of shooting in the dark, but looking at logs, when the "backup" test fails,
Alice logs "Sending CHANNEL_REESTABLISH" and "Sending ERROR", but
Bob never receives them, instead he logs "Disconnecting: LightningPeerConnectionClosed()".
Maybe Alice's TCP socket should just be flushed, as done here.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 12/100

This is a test-only reliability fix for a flaky automated test. The developer noticed that during a backup/restore test, one side (Alice) would send Lightning network messages and then close the connection, but the other side (Bob) sometimes never received those final messages. The change makes Alice explicitly wait for her outgoing messages to actually leave the network socket before closing it. There is no indication this is a security vulnerability or that it affects normal user operations.

Lower-prioritysubmarine_swaps: wait for broadcast in wait_for_htlcs_and_broadcastby f321x · 2a1eda4c · May 20, 2026 · 1 fileMessage 83 · StrongLow 32Details
Commit message · f321x

submarine_swaps: wait for broadcast in wait_for_htlcs_and_broadcast

Wait for broadcast of the funding transaction in
`SwapManager.wait_for_htlcs_and_broadcast` before returning.
Previously it might have returned the swap funding txid before the
funding tx was broadcast.
This caused the regtest `test_swapserver_success_forward` to fail
as it expected the funding tx to be broadcast once the CLI command
returned.

See:
```
.***** test_swapserver_success_forward ******
initializing alice
funding alice
ec354953f96e0de7be4354ab156611da9e31bd85c2d25664bdb995950530c12e
initializing bob
funding bob
1df19a419b5ae5b961bae6cfaf4e7c8e772c6632d30782fab8de6992a8901e4a
mining 1 blocks
starting daemon (PID 7471)
/tmp/alice/regtest/wallets/default_wallet
true
starting daemon (PID 7502)
/tmp/bob/regtest/wallets/default_wallet
true

alice opens channel
mining 3 blocks
wait until alice sees channel open.
wait until alice sees channel open..
wait until alice sees channel open...
alice initiates forward-swap
{
"lightning_amount": "0.01967661",
"onchain_amount": "0.02",
"txid": "b0f9ba48b670ee4a1f182655fe18f3f7d5c310923b7c85ad396b24e0a2f8e0cc"
}
utxo b0f9ba48b670ee4a1f182655fe18f3f7d5c310923b7c85ad396b24e0a2f8e0cc:0 does not exist
FDaemon stopped
Daemon stopped

======================================================================
FAIL: test_swapserver_success_forward (tests.regtest.TestLightningSwapserver.test_swapserver_success_forward)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/cirrus-ci-build/tests/regtest.py", line 105, in test_swapserver_success_forward
self.run_shell(['swapserver_success_forward'])
File "/tmp/cirrus-ci-build/tests/regtest.py", line 19, in run_shell
assert process.returncode == 0
^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
```

Can be reproduced with:
```diff
diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py
index f83d653f9..242aef070 100644
--- a/electrum/submarine_swaps.py
+++ b/electrum/submarine_swaps.py
@@ -1052,6 +1052,7 @@ class SwapManager(Logger):
@log_exceptions
async def broadcast_funding_tx(self, swap: SwapData, tx: Transaction) -> None:
swap.funding_txid = tx.txid()
+ await asyncio.sleep(5)
await self.network.broadcast_transaction(tx)

async def reverse_swap(
```

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Low 32/100

This commit fixes a timing bug in Electrum's submarine swap feature. Previously, when a user initiated a swap, the software could report the swap funding transaction ID back to the caller before the transaction was actually broadcast to the Bitcoin network. This meant a user or automated test might think the swap was funded and proceed, while the transaction had not yet been sent. The fix makes the code wait until the broadcast is complete before returning. There is also a small improvement in error handling when the broadcast fails.

Lower-prioritytests: lnhelpers: (trivial) mark method private, add type hintsby SomberNight · 07c45705 · May 20, 2026 · 2 filesMessage 60 · AdequateInformational 15Details
Commit message · SomberNight

tests: lnhelpers: (trivial) mark method private, add type hints

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

This commit only touches test helper files. It renames a helper function to start with an underscore (a Python convention for 'private'), adds a couple of type hints, and adds blank lines. There is no change to production wallet code, no bug fix, and no security relevance.

AI review queuedtests: move create_test_channels to lnhelpers.pyby SomberNight · cf91aa86 · May 20, 2026 · 4 filesMessage 55 · ThinInformational 15Details
Commit message · SomberNight

tests: move create_test_channels to lnhelpers.py

55/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit is a simple code cleanup in the project's test suite. It moves a helper function used to create fake Lightning payment channels from one test file into a shared test-utility file, and updates other test files to import it from the new location. No production wallet code is changed, and there is no security fix or vulnerability introduced.

AI review queuedtest_lnwallet: unittest channel rebalancingby f321x · b183a529 · May 20, 2026 · 1 fileMessage 60 · AdequateInformational 15Details
Commit message · f321x

test_lnwallet: unittest channel rebalancing

Add some unittest coverage for the channel rebalance flow.

Co-authored-by: SomberNight <somber.night@protonmail.com>

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Provides an explanatory body✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit only adds new automated tests for an existing Lightning channel rebalancing feature in Electrum. It does not change any production wallet or network code, so it cannot introduce a security vulnerability or directly fix one.

Lower-priorityLNWallet: don't allow rebalancing through frozen channelsby f321x · 784d9665 · May 20, 2026 · 1 fileMessage 73 · AdequateLow 31Details
Commit message · f321x

LNWallet: don't allow rebalancing through frozen channels

Don't allow rebalancing through a channel if it is frozen for the
direction required for the rebalance.
If this is allowed by the gui it creates opaque failures as then
pathfinding potentially fails downstream.

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

This commit fixes a user-experience and reliability bug in Electrum's Lightning rebalancing feature. Previously, the wallet could attempt to rebalance funds through channels that were 'frozen' (disabled for sending or receiving). This didn't cause loss of funds, but led to confusing downstream failures during route finding. The patch now blocks such rebalances early and reports a clear error.

Lower-prioritylnworker: fix rebalance with frozen channelsby f321x · 89a2f1d7 · May 20, 2026 · 1 fileMessage 98 · StrongInformational 22Details
Commit message · f321x

lnworker: fix rebalance with frozen channels

Don't exclude r_tags for frozen channels from the route creation in
create_route_for_single_htlc if the start_node of the routing hint
is unequal to our node id.

When doing a rebalance us (chan_1) -> bob -> us (chan_2, frozen for sending),
we would exclude the invoice r_tag for chan_2 because the chan
is our chan and frozen for sending,
resulting in us being unable to find a route back to us trough bob.

This is a regression from #9692 (964ffbd2).

98/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 22/100

This commit fixes a bug in Electrum's Lightning Network code where the wallet would incorrectly ignore routing hints for channels that are 'frozen' (temporarily blocked from sending). The bug only affected rebalancing payments where the user is both the sender and the receiver. The fix ensures frozen channels are only skipped when the routing hint truly starts at the user's own node, not when it merely passes through one of the user's channels later in the route. There is no direct evidence this is a security vulnerability; it appears to be a functional bug that could cause payment failures.

Lower-prioritytests: ln graph_definition: allow multiple chans between peersby SomberNight · d4de5a9f · May 20, 2026 · 4 filesMessage 60 · AdequateInformational 15Details
Commit message · SomberNight

tests: ln graph_definition: allow multiple chans between peers

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

This commit only changes test code. It updates the test helper that builds simulated Lightning Network graphs so that test scenarios can define multiple channels between the same two peers, instead of just one. All production wallet code is untouched.

Lower-prioritytests: split off helpers from test_lnpeer into new lnhelpers.pyby SomberNight · d86b0c59 · May 20, 2026 · 3 filesMessage 60 · AdequateInformational 15Details
Commit message · SomberNight

tests: split off helpers from test_lnpeer into new lnhelpers.py

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

This commit is a pure test-code refactoring: it moves helper classes and functions used by Lightning Network peer tests from one file into a new shared file. No production wallet or payment logic was changed, so ordinary users are not affected.

AI review queuedlnwatcher: introduce loop to trigger callbacksby f321x · 2460b030 · May 20, 2026 · 3 filesMessage 68 · AdequateInformational 24Details
Commit message · f321x

lnwatcher: introduce loop to trigger callbacks

Introduce a taskgroup and polling loop to LNWatcher to guarantee
the callbacks get called at least once every
LNWatcher.MAX_CALLBACK_TRIGGER_DELAY_SEC (10 min).
This should prevent callbacks that operate on time instead of
blockheight from becoming (very) stale if there are no blockchain
events triggering the callbacks for a longer time.
Not entirely set about the 10 min delay, might as well be 5/2/1 min?

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

This commit adds a background polling loop to Electrum's Lightning watcher so that time-sensitive callbacks still run even when no new blockchain events occur for a while. It is a defensive reliability fix, not an obvious security patch, but stale watcher callbacks could in theory delay detection of channel problems. The change itself does not introduce a known vulnerability.

Lower-priorityutil: dedup now() helper functionby f321x · 98b36662 · May 19, 2026 · 4 filesMessage 68 · AdequateInformational 15Details
Commit message · f321x

util: dedup now() helper function

Deduplicate the now() helper function declared in 3 different modules
into electrum.util.
Use it consistently in submarine_swaps.py.
Cleanup imports of lnchannel.py.

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

This commit is a routine code cleanup: it removes three separate copies of a small helper function called now() and puts a single shared copy in a common utilities file. It does not change what the function does or fix any security issue.

Lower-priorityLNGossip: put maintain_db on threadby f321x · 62656fa0 · May 19, 2026 · 2 filesMessage 68 · AdequateInformational 19Details
Commit message · f321x

LNGossip: put maintain_db on thread

I regularly see asyncio (debug) warnings that maintain_db
is blocking the event loop on my relatively fast laptop.

E.g. 3 warnings during a single session:
```
2.41 | I | channel_db.ChannelDB | Deleting 903 old policies
2.68 | I | channel_db.ChannelDB | Deleting 3954 orphaned channels
2.68 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 0.335 seconds
...
242.71 | I | channel_db.ChannelDB | Deleting 151 old policies
243.69 | I | channel_db.ChannelDB | Deleting 11819 orphaned channels
243.69 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 1.010 seconds
...
363.72 | I | channel_db.ChannelDB | Deleting 108 old policies
363.90 | I | channel_db.ChannelDB | Deleting 2922 orphaned channels
363.90 | W | asyncio | Executing <Task pending name='Task-22' coro=<LNGossip.maintain_db() running at /var/home/user/code/vibecoding_vm/electrum/electrum/lnworker.py:728> wait_for=<Future pending cb=[Task.task_wakeup()] created at /usr/lib64/python3.14/asyncio/base_events.py:459> cb=[set.discard(), TaskGroup._on_done()] created at /var/home/user/code/vibecoding_vm/electrum/electrum/util.py:1756> took 0.205 seconds
```

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

This commit moves two database cleanup tasks in Electrum's Lightning Network gossip code onto a separate thread so they no longer freeze the main asyncio event loop. It is a performance and responsiveness fix, not a security patch. There is no indication it fixes a vulnerability or was triggered by a security report.

Lower-prioritytests: lnchannel: also test with SRK chan typeby SomberNight · e8551d64 · May 18, 2026 · 1 fileMessage 86 · StrongInformational 15Details
Commit message · SomberNight

tests: lnchannel: also test with SRK chan type

fix regression from https://github.com/spesmilo/electrum/pull/10622,
where the default for `TEST_ANCHOR_CHANNELS` was flipped from False to True.

86/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 15/100

This commit only changes test code. It renames several test classes from testing anchor channels to testing non-anchor channels, because a previous change had flipped the default test setting to use anchor channels. There is no change to the actual Electrum wallet or Lightning code that users run.

Lower-prioritytest_lnchannel: unittest should_be_closed_due_to_expiring_htlcsby f321x · 0066b684 · May 18, 2026 · 1 fileMessage 40 · ThinInformational 12Details
Commit message · f321x

test_lnchannel: unittest should_be_closed_due_to_expiring_htlcs

40/100 · ThinMessage clarity
✓ Specific, descriptive subject! No meaningful explanatory body
AI analysis · Informational 12/100

This commit only adds new automated tests for an existing Lightning Network channel safety feature. It does not change any production code, so it cannot introduce a security vulnerability or directly fix one in the shipped software. The tests verify that Electrum will automatically close a Lightning channel when certain time-sensitive payment promises (HTLCs) are about to expire or have expired without proper resolution.

Lower-prioritylnchannel: give offered htlcs some time to fail on restartby f321x · 77d14d42 · May 18, 2026 · 3 filesMessage 85 · StrongLow 30Details
Commit message · f321x

lnchannel: give offered htlcs some time to fail on restart

Wait for 30 seconds after restart before force closing channels
due to timed-out htlcs we offered to the peer. Maybe the peer
will fail them offchain once we reestablished the connection.
This should prevent some unnecessary force closes.
We could skip the whole loop but this seems more readable.

Note: it might take some time until the lnwatcher callback calls
should_be_closed_due_to_expiring_htlcs again, however the same issue
affects the existing 30sec timeout above as well.

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

This commit changes Electrum's Lightning code so that, after the wallet restarts, it waits 30 seconds before force-closing a payment channel just because an outgoing timed payment (HTLC) looks expired. The goal is to avoid unnecessary on-chain channel closures when the peer would have cancelled the payment off-chain once the connection came back. It is a robustness/usability fix, not a clear security patch, and it does not claim to fix a known vulnerability.

Lower-priorityadd builder keys for svanstaaby Sebastian van Staa · 73e1e18f · May 16, 2026 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · Sebastian van Staa

add builder keys for svanstaa

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

This commit simply adds a new PGP public key file for a person named Sebastian van Staa (username 'svanstaa') to the Electrum repository's list of builder public keys. A public key is like a published lock that lets others verify digital signatures; adding it by itself does not create a security vulnerability and does not change any code, wallet logic, or release process.

AI review queuednew 'stored_at' syntaxby ThomasV · 5f6a491f · May 14, 2026 · 7 filesMessage 28 · OpaqueInformational 12Details
Commit message · ThomasV

new 'stored_at' syntax

backported from levelDB branch

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: opaque commit messagesecond-pass: security-sensitive path
AI analysis · Informational 12/100

This commit is a pure internal refactoring of how Electrum marks which Python classes correspond to which parts of the wallet database. It replaces two old decorators (`stored_in` and `stored_as`) with a single new decorator (`stored_at`) and updates the registration tables that convert database keys and values. There is no user-facing change, no new feature, and no obvious security fix or vulnerability introduced in the diff itself.

Lower-priorityci: security review: log effort levelby f321x · de7a8bdb · May 14, 2026 · 1 fileMessage 77 · AdequateInformational 15Details
Commit message · f321x

ci: security review: log effort level

If the model is logged it makes sense to log the effort level as well.

77/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Names security-relevant behavior explicitly
AI analysis · Informational 15/100

This commit only changes two log/comment messages in a CI security-review script so they include the configured 'effort level' alongside the model name. It does not alter application logic, cryptography, networking, wallet handling, or any user-facing behavior. There is no security issue here.

Lower-priorityci: security review: pass prompt as system promptby f321x · a6cfdc5b · May 14, 2026 · 2 filesMessage 85 · StrongInformational 15Details
Commit message · f321x

ci: security review: pass prompt as system prompt

By appending the prompt to the system prompt it is prioritized over
the actual user prompt (the diff), so it apparently is more persistent
in the context. This e.g. could improve the output if a large diff
is provided as the actual task (system prompt) is treated with higher
priority than the large diff itself.

85/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
AI analysis · Informational 15/100

This commit only changes an internal CI helper script that runs an AI security review on pull requests. It moves the review instructions from the user message to the system prompt so the AI prioritizes them over large diffs. There is no change to Electrum wallet code, cryptography, networking, or any user-facing behavior.

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.