Electrum

electrum.org
Electrum

Long-standing Python-based Bitcoin wallet with good security features. Private keys are encrypted and do not touch the internet and balance is checked with a watch-only wallet. Compatible with other wallets, so there is no tie-in, and funds can be recovered with your secret seed. It supports proof-checking to verify transactions using SPV, multi-sig, and add-ons for compatibility with hardware wallets. A decentralized server indexes ledger transactions, meaning it's fast and doesn't require much disk space. The potential security issue here would not be with the wallet, but rather your PC - you must ensure your computer is secure and your wallet has a long, strong passphrase to encrypt it with.

Open Source

Electrum Source Code

Author

spesmilo

Description

Electrum Bitcoin Wallet

#bitcoin#bitcoin-wallet#electrum#lightning#lightning-network#python

Homepage

https://electrum.org

License

MIT

Created

02 Aug 12

Last Updated

12 Jul 26

Latest version

seed_v10

Primary Language

Python

Size

71,181 KB

Stars

8,508

Forks

3,448

Watchers

8,508

Language Usage

Language Usage

Star History

Star History

Top Contributors

Recent Commits

  • SomberNight (10 Jul 26)

    contrib/make_download: fix imports not sure why this was not an issue before(?) perhaps due to python version differences ``` $ ./contrib/make_download /home/user/wspace/electrum-web Traceback (most recent call last): File "/home/user/wspace/electrum/./contrib/make_download", line 17, in <module> version_spec = importlib.util.spec_from_file_location('version', 'electrum/version.py') ^^^^^^^^^^^^^^ AttributeError: module 'importlib' has no attribute 'util' ```

  • SomberNight (08 Jul 26)

    release notes: bump 4.8.0 date for second attempt We failed to get a full quorum to reproduce the prior git tag. The android apks were problematic to reproducibly build. should be fixed by https://github.com/spesmilo/electrum/pull/10739 here we go again

  • ghost43 (07 Jul 26)

    Merge pull request #10743 from SomberNight/202607_fresh_clone_vartmp build: move default FRESH_CLONE location from /tmp to /var/tmp

  • ghost43 (07 Jul 26)

    Merge pull request #10739 from SomberNight/202607_android_build android build: use --no-isolation, hash-pin more deps, only one install of setuptools

  • f321x (07 Jul 26)

    android build: patch hostpython3 to not install setuptools Add a patch to the hostpython3 p4a recipe to prevent it from installing setuptools as part of the ensurepip invocation. Setuptools is later installed from a hash-pinned recipe. --- NOTE(ghost43): this is a workaround for reproducible-build issues we ran into during the 4.8.0 release. see https://github.com/spesmilo/electrum/pull/10739#issuecomment-4904680121 Since the last p4a rebase, p4a is installing some python packages using "pip install --target". We noticed that hostpython had two different versions of setuptools installed at the same time (two dist-info folders in site-packages/). This is due to the `--target` option for `pip install`. We are calling it with `--upgrade` too, but even then apparently it does not remove old versions. Indeed, when testing locally in a venv it leaves all .dist-infos there hanging. According to https://github.com/pypa/pip/issues/13763#issuecomment-3783977222, `--target` is not suitable or intended for this usecase at all. Current patch is only focused on setuptools, as a minimal workaround. Ultimately the same issue could arise with any other package. For example, still with ensurepip itself, we could be left with multiple versions of pip installed. Or anything we install via hostpython_prerequisites could have duplicate versions installed...

  • SomberNight (07 Jul 26)

    build: move default FRESH_CLONE location from /tmp to /var/tmp Apparently many distros these days mount /tmp as RAM-disk. Even debian (starting with 13) does this now. The Android build needs to store dozens of gigs, so RAM is often not sufficiently large.

  • SomberNight (04 Jul 26)

    android build: forbid buildozer to install unversioned deps of p4a While p4a itself does not need ninja in our usage, to build Qt6, we need ninja. However instead of installing it from PyPI, I think debian main is much more trustworthy.

  • SomberNight (04 Jul 26)

    android build: build p4a recipes with --no-isolation the core change is https://github.com/spesmilo/python-for-android/commit/8c0fcc9ef2e559918ca96ecde6e09fe521bb1427 the rest here just follow that

  • SomberNight (04 Jul 26)

    release notes: mention increased min android version ref https://github.com/spesmilo/electrum/pull/10485

  • ghost43 (02 Jul 26)

    Merge pull request #10734 from f321x/qml_people qml: add myself to About page

  • f321x (02 Jul 26)

    qml: add myself to About page

  • ThomasV (02 Jul 26)

    update locale

  • ThomasV (02 Jul 26)

    Merge pull request #10719 from f321x/release_v4.8.0 Release v4.8.0

  • ThomasV (02 Jul 26)

    Merge pull request #10727 from SomberNight/202607_deps build: update some dependencies, all over

  • ThomasV (02 Jul 26)

    Merge pull request #10733 from SomberNight/202607_aiohttp_proxyerror util.make_aiohttp_session: wrap aiohttp-socks 0.11+ excs to ClientError

  • SomberNight (02 Jul 26)

    util.make_aiohttp_session: wrap aiohttp-socks 0.11+ excs to ClientError older versions of aiohttp-socks and python-socks used to raise - ProxyConnectionError(OSError) - ProxyTimeoutError(TimeoutError) - ProxyError(Exception) now they raise: - ProxyConnectionError(Exception) - ProxyTimeoutError(Exception) - ProxyError(Exception) In many call sites, we currently handle OSError and TimeoutError, usually by simply logging the error or showing it to the user. Another exceptions our call sites handle similarly is aiohttp.ClientError, which is the aiohttp base class for any client connection error. A simple "fix" for us to restore the old behaviour is converting the new aiohttp_socks exception types to aiohttp.ClientError. ref https://github.com/romis2012/aiohttp-socks/commit/db4235c2b9805f088e47074647c946873a231487 ref https://github.com/romis2012/python-socks/commit/50a3024a8ac10888085f963e44ab3a79d6574703

  • accumulator (02 Jul 26)

    Merge pull request #10731 from accumulator/fix_10714 qetxfinalizer: regex doesn't cover all, invalid Decimal -> 0 in TxFeeSlider.userFeeRate setter.

  • Sander van Grieken (02 Jul 26)

    qetxfinalizer: regex doesn't cover all, invalid Decimal -> 0 in TxFeeSlider.userFeeRate setter. fixes #10714

  • f321x (30 Jun 26)

    increase ELECTRUM_VERSION to 4.8.0

  • f321x (30 Jun 26)

    add release notes for version 4.8.0

  • ghost43 (01 Jul 26)

    Merge pull request #10729 from SomberNight/202606_sighash wallet.check_sighash: don't assume tx.add_info_from_wallet alrdy ran

  • SomberNight (01 Jul 26)

    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.

  • ghost43 (01 Jul 26)

    Merge pull request #10728 from SomberNight/202607_header_checkpoints update block header checkpoints

  • SomberNight (01 Jul 26)

    update block header checkpoints ``` >>> network.export_checkpoints(f"/home/user/wspace/electrum/electrum/chains/{electrum.constants.net.NET_NAME}/checkpoints.json") ```

  • SomberNight (01 Jul 26)

    build: rerun freeze_packages somewhat conservative and paranoid... generated with patch: ``` user@debian:~/wspace/electrum$ git diff diff --git a/contrib/requirements/requirements-binaries-mac.txt b/contrib/requirements/requirements-binaries-mac.txt index ab8bd5f33..dfbd55c2b 100644 --- a/contrib/requirements/requirements-binaries-mac.txt +++ b/contrib/requirements/requirements-binaries-mac.txt @@ -5,3 +5,11 @@ PyQt6<6.7 PyQt6-Qt6<6.7,!=6.6.3 cryptography>=2.6 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +cryptography==46.0.7 +pycparser==2.23 diff --git a/contrib/requirements/requirements-binaries.txt b/contrib/requirements/requirements-binaries.txt index b41089680..5771aef24 100644 --- a/contrib/requirements/requirements-binaries.txt +++ b/contrib/requirements/requirements-binaries.txt @@ -3,3 +3,12 @@ PyQt6 # we need at least cryptography>=2.1 for electrum.crypto, # and at least cryptography>=2.6 for dnspython[DNSSEC] cryptography>=2.6 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +cryptography==46.0.7 +pycparser==2.23 +PyQt6==6.9.1 diff --git a/contrib/requirements/requirements-build-android.txt b/contrib/requirements/requirements-build-android.txt index e9d272837..4bf6cc1fc 100644 --- a/contrib/requirements/requirements-build-android.txt +++ b/contrib/requirements/requirements-build-android.txt @@ -20,3 +20,10 @@ toml # needed for the Qt/QML Android GUI: # TODO double-check this typing-extensions + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +sh==2.2.2 diff --git a/contrib/requirements/requirements-build-appimage.txt b/contrib/requirements/requirements-build-appimage.txt index ee8b4aa89..d79cd93b6 100644 --- a/contrib/requirements/requirements-build-appimage.txt +++ b/contrib/requirements/requirements-build-appimage.txt @@ -7,4 +7,11 @@ wheel # The pinned Cython must be installed before hidapi is built; # otherwise when installing hidapi, pip just downloads the latest Cython. # see https://github.com/spesmilo/electrum/issues/5859 -Cython>=0.27 \ No newline at end of file +Cython>=0.27 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +Cython<3.2 diff --git a/contrib/requirements/requirements-build-base.txt b/contrib/requirements/requirements-build-base.txt index 5bfea96fe..6cc7d303c 100644 --- a/contrib/requirements/requirements-build-base.txt +++ b/contrib/requirements/requirements-build-base.txt @@ -28,3 +28,12 @@ flit_core>=3.4,<4 # aio-libs/frozenlist and aio-libs/propcache needs: # https://github.com/aio-libs/frozenlist/blob/c28f32d6816ca0fa56a5876e84831c46084bb85d/pyproject.toml#L6 expandvars + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 +setuptools-scm<9 + +expandvars==1.0.0 +poetry-core==2.1.3 diff --git a/contrib/requirements/requirements-build-mac.txt b/contrib/requirements/requirements-build-mac.txt index 5504223d3..583c91170 100644 --- a/contrib/requirements/requirements-build-mac.txt +++ b/contrib/requirements/requirements-build-mac.txt @@ -15,3 +15,12 @@ packaging>=22.0 # otherwise when installing hidapi, pip just downloads the latest Cython. # see https://github.com/spesmilo/electrum/issues/5859 Cython>=0.27 + + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +Cython<3.2 +pyinstaller-hooks-contrib==2025.4 diff --git a/contrib/requirements/requirements-build-wine.txt b/contrib/requirements/requirements-build-wine.txt index 80cccba33..647a90acb 100644 --- a/contrib/requirements/requirements-build-wine.txt +++ b/contrib/requirements/requirements-build-wine.txt @@ -9,3 +9,10 @@ altgraph pywin32-ctypes>=0.2.1 pyinstaller-hooks-contrib>=2025.2 packaging>=22.0 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +pyinstaller-hooks-contrib==2025.4 diff --git a/contrib/requirements/requirements-hw.txt b/contrib/requirements/requirements-hw.txt index 5dfb0290e..3c4955eb6 100644 --- a/contrib/requirements/requirements-hw.txt +++ b/contrib/requirements/requirements-hw.txt @@ -30,3 +30,13 @@ pyserial>=3.5.0,<4.0.0 # prefer older urllib3 to avoid needing hatchling # (pulled in via trezor -> requests -> urllib3) urllib3<2 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +cryptography==46.0.7 +pycparser==2.23 +libusb1<3.4 +protobuf==3.20.3 diff --git a/contrib/requirements/requirements.txt b/contrib/requirements/requirements.txt index e9963c12c..da9ab8cde 100644 --- a/contrib/requirements/requirements.txt +++ b/contrib/requirements/requirements.txt @@ -18,3 +18,15 @@ attrs>=20.1.0,<23 # - upper limit to avoid needing hatchling at build-time :/ # (however newer versions should work at runtime) dnspython>=2.2,<2.5 + + +pip==25.1.1 +setuptools==80.9.0 +wheel==0.45.1 + +aiohappyeyeballs<2.7 +jsonpatch==1.33 +jsonpointer==3.0.0 +propcache==0.3.1 +protobuf==3.20.3 +python-socks==2.8.1 ```

  • SomberNight (01 Jul 26)

    android build: bump openssl (3.0.18 -> 3.0.21)

  • SomberNight (01 Jul 26)

    build: bump python versions in binaries note: 3.12 is in security-only status, so can't bump win/mac binaries without switching to 3.13 (as we don't compile our own cpython for those) we should bump those to at least 3.13...

  • ghost43 (01 Jul 26)

    Merge pull request #10722 from f321x/followup_10543 qml/2fa: partially reverse #10543

  • ThomasV (01 Jul 26)

    Merge pull request #10726 from f321x/fix_10724 qt: fix crash through stale pi resolve

  • f321x (01 Jul 26)

    qt: fix crash through stale pi resolve When multiple PIs get resolved consecutively through repeated editing of the PI field, and the `on_resolve_done` callback tries to access a PI that has been cleared by a previous, failed callback an exception is raised. I was able to reproduce this somehow by adding a sleep to `PaymentIdentifier._do_resolve()` and entering lightning addresses. Fixes https://github.com/spesmilo/electrum/issues/10724

Electrum Security

5.7/10

Repo Security Summary

Updated 29 Jun 26

  • Code-Review 6/10
  • Maintained 10/10
  • Security-Policy 10/10
  • CII-Best-Practices 0/10
  • Dangerous-Workflow 0/10
  • Packaging N/A
  • Token-Permissions 10/10
  • Binary-Artifacts 10/10
  • License 10/10
  • Pinned-Dependencies 5/10
  • Signed-Releases N/A
  • Fuzzing 0/10
  • Branch-Protection N/A
  • SAST 0/10

Security Advisories (5)

  • medium Patched

    GHSA-vw94-r84p-66qf External Plugin authorization bypass: local code execution

  • low Patched

    GHSA-q7m2-785w-r585 Nostr Wallet Connect plugin: daily spending limit bypass

  • medium Patched

    GHSA-8r85-vp7r-hjxf receiving with Lightning: partial MPP might be accepted

  • high Patched

    GHSA-9gpc-prj9-89x7 sending with Lightning: payment_preimage validation is skipped on Android

  • medium Patched

    GHSA-4fh4-hx35-r355 BIP70 payment requests `?r=` field supports `file://` URIs, allowing attacker to trick victim machine to `open()` arbitrary file

Electrum Website

Website

Electrum Bitcoin Wallet

Electrum Bitcoin Wallet.

Redirects

Does not redirect

Security Checks

All 65 security checks passed

Server Details

  • IP Address 172.67.179.87
  • Location San Francisco, California, United States of America, NA
  • ISP CloudFlare Inc.
  • ASN AS13335

Associated Countries

  • US US
  • FR FR

Safety Score

Website marked as safe

100%

Blacklist Check

electrum.org was found on 0 blacklists

  • AntiSocial Blacklist
  • Artists Against 419
  • Badbitcoin
  • Bambenek Consulting
  • CERT Polska
  • CoinBlockerLists
  • CRDF
  • CryptoScamDB
  • EtherAddressLookup
  • EtherScamDB
  • Fake Website Buster
  • MetaMask EthPhishing
  • NABP Not Recommended Sites
  • OpenPhish
  • PetScams
  • PhishFeed
  • PhishFort
  • Phishing.Database
  • PhishStats
  • PhishTank
  • Phishunt
  • RPiList Not Serious
  • Scam.Directory
  • SecureReload Phishing List
  • Spam404
  • StopGunScams
  • Suspicious Hosting IP
  • ThreatFox
  • ThreatLog
  • TweetFeed
  • URLhaus
  • ViriBack C2 Tracker

Website Preview

Website preview

Electrum Reviews

More Crypto Wallets

  • BitBox02

    BitBox02

    shiftcrypto.ch

    Open source hardware wallet, supporting secure multisig with the option for making encrypted backups on a MicroSD card.

  • An easy-to-use, super secure Bitcoin hardware wallet, which can be used independently as an air-gapped wallet. ColdCard is based on partially signed Bitcoin transactions following the BIP174 standard. Built specifically for Bitcoin, and with a variety of unique security features, ColdCard is secure, trustless, private, and easy-to-use. Companion products for the ColdCard include: BlockClock, SeedPlate, and ColdPower.

  • A steel plate, with engraved letters which can be permanently screwed - CryptoSteel is a good fire-proof, shock-proof, water-proof, and stainless cryptocurrency backup solution.

  • Sparrow is a Bitcoin wallet for those who value financial self-sovereignty. Sparrow’s emphasis is on security, privacy, and usability. Sparrow does not hide information from you - on the contrary, it attempts to provide as much detail as possible about your transactions and UTXOs, but in a way that is manageable and usable.

  • Open source, cross-platform, offline, crypto wallet, compatible with 1000+ coins. Your private key is generated on the device, and never leaves it, all transactions are signed by the Trezor, which ensures your wallet is safe from theft. There are native apps for Windows, Linux, MacOS, Android, and iOS, but Trezor is also compatible with other wallets, such as Wasabi. You can back the Trezor up, either by writing down the seed, or by duplicating it to another device. It is simple and intuitive to use, but also incredibly customizable with a large range of advanced features.

  • An open source, native desktop wallet for Windows, Linux, and MacOS. Wasabi implements trustless CoinJoins over the Tor network. Neither an observer nor the participants can determine which output belongs to which input. This makes it difficult for outside parties to trace where a particular coin originated from and where it was sent to, which greatly improves privacy. Since it's trustless, the CoinJoin coordinator cannot breach the privacy of the participants. Wasabi is compatible with cold storage and hardware wallets, including OpenCard and Trezor.

About the Data: Electrum

API

You can access Electrum's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/electrum

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Electrum

Help your friends compare Crypto Wallets, and pick privacy-respecting software and services.
Share Electrum and Awesome Privacy with your network!

View Crypto Wallets (7)