├── .cirrus.yml ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── 01_issue.yml │ └── config.yml ├── .gitignore ├── .gitmodules ├── AUTHORS ├── LICENCE ├── MANIFEST.in ├── README.md ├── RELEASE-NOTES ├── SECURITY.md ├── contrib ├── add_cosigner ├── android │ ├── Dockerfile │ ├── Makefile │ ├── Readme.md │ ├── apkdiff.py │ ├── apt.preferences │ ├── apt.sources.list │ ├── bitcoin_intent.xml │ ├── blacklist.txt │ ├── build.sh │ ├── buildozer_qml.spec │ ├── get_apk_versioncode.py │ ├── make_apk.sh │ └── p4a_recipes │ │ ├── README.md │ │ ├── certifi │ │ └── __init__.py │ │ ├── cffi │ │ └── __init__.py │ │ ├── cryptography │ │ └── __init__.py │ │ ├── hostpython3 │ │ └── __init__.py │ │ ├── libffi │ │ └── __init__.py │ │ ├── libiconv │ │ └── __init__.py │ │ ├── libsecp256k1 │ │ └── __init__.py │ │ ├── libzbar │ │ └── __init__.py │ │ ├── openssl │ │ └── __init__.py │ │ ├── packaging │ │ └── __init__.py │ │ ├── ply │ │ └── __init__.py │ │ ├── plyer │ │ └── __init__.py │ │ ├── pycparser │ │ └── __init__.py │ │ ├── pyjnius │ │ └── __init__.py │ │ ├── pyparsing │ │ └── __init__.py │ │ ├── pyqt6 │ │ └── __init__.py │ │ ├── pyqt6sip │ │ └── __init__.py │ │ ├── pyqt_builder │ │ └── __init__.py │ │ ├── python3 │ │ └── __init__.py │ │ ├── qt6 │ │ └── __init__.py │ │ ├── setuptools │ │ └── __init__.py │ │ ├── sip │ │ └── __init__.py │ │ ├── six │ │ └── __init__.py │ │ ├── sqlite3 │ │ └── __init__.py │ │ ├── toml │ │ └── __init__.py │ │ ├── tomli │ │ └── __init__.py │ │ └── util.py ├── apparmor │ ├── README.md │ └── apparmor.d │ │ ├── abstractions │ │ └── electrum │ │ ├── electrum.appimage │ │ └── usr.local.bin.electrum ├── ban_unicode.py ├── build-linux │ ├── appimage │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── apprun.sh │ │ ├── apt.preferences │ │ ├── apt.sources.list │ │ ├── build.sh │ │ ├── make_appimage.sh │ │ └── patches │ │ │ └── python-3.11-reproducible-buildinfo.diff │ └── sdist │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── build.sh │ │ └── make_sdist.sh ├── build-wine │ ├── .dockerignore │ ├── Dockerfile │ ├── README.md │ ├── README_windows.md │ ├── apt.preferences │ ├── apt.sources.list │ ├── build-electrum-git.sh │ ├── build.sh │ ├── deterministic.spec │ ├── electrum.nsi │ ├── gpg_keys │ │ └── 7ED10B6531D7C8E1BC296021FC624643487034E5.asc │ ├── make_win.sh │ ├── prepare-wine.sh │ ├── sign.sh │ └── unsign.sh ├── build_tools_util.sh ├── deterministic-build │ ├── README.md │ ├── check_submodules.sh │ ├── find_restricted_dependencies.py │ ├── requirements-binaries-mac.txt │ ├── requirements-binaries.txt │ ├── requirements-build-android.txt │ ├── requirements-build-appimage.txt │ ├── requirements-build-base.txt │ ├── requirements-build-mac.txt │ ├── requirements-build-wine.txt │ ├── requirements-hw.txt │ └── requirements.txt ├── docker_notes.md ├── freeze_containers_distro.sh ├── freeze_packages.sh ├── generate_payreqpb2.sh ├── locale │ ├── build_cleanlocale.sh │ ├── build_locale.sh │ └── push_locale.py ├── make_download ├── make_libsecp256k1.sh ├── make_libusb.sh ├── make_packages.sh ├── make_plugin ├── make_zbar.sh ├── osx │ ├── README.md │ ├── README_macos.md │ ├── apply_sigs.sh │ ├── cdrkit-deterministic.patch │ ├── compare_dmg │ ├── entitlements.plist │ ├── extract_sigs.sh │ ├── make_osx.sh │ ├── notarize_app.sh │ ├── osx.spec │ ├── package.sh │ └── sign_osx.sh ├── print_electrum_version.py ├── release.sh ├── release_www.sh ├── requirements │ ├── requirements-binaries-mac.txt │ ├── requirements-binaries.txt │ ├── requirements-build-android.txt │ ├── requirements-build-appimage.txt │ ├── requirements-build-base.txt │ ├── requirements-build-mac.txt │ ├── requirements-build-wine.txt │ ├── requirements-ci.txt │ ├── requirements-hw.txt │ └── requirements.txt ├── sign_packages ├── trigger_deploy.sh ├── udev │ ├── 20-hw1.rules │ ├── 51-coinkite.rules │ ├── 51-hid-digitalbitbox.rules │ ├── 51-safe-t.rules │ ├── 51-trezor.rules │ ├── 51-usb-keepkey.rules │ ├── 52-hid-digitalbitbox.rules │ ├── 53-hid-bitbox02.rules │ ├── 54-hid-bitbox02.rules │ ├── 55-usb-jade.rules │ └── README.md └── upload.sh ├── electrum-env ├── electrum.desktop ├── electrum ├── __init__.py ├── _vendor │ ├── __init__.py │ ├── distutils │ │ ├── LICENSE │ │ ├── __init__.py │ │ └── version.py │ └── pyperclip │ │ ├── LICENSE.txt │ │ ├── README.md │ │ └── __init__.py ├── address_synchronizer.py ├── base_crash_reporter.py ├── bip21.py ├── bip32.py ├── bip39_recovery.py ├── bip39_wallet_formats.json ├── bitcoin.py ├── blockchain.py ├── chains │ ├── mainnet │ │ ├── checkpoints.json │ │ ├── fallback_lnnodes.json │ │ └── servers.json │ ├── regtest │ │ └── servers.json │ ├── signet │ │ ├── checkpoints.json │ │ ├── fallback_lnnodes.json │ │ └── servers.json │ ├── testnet │ │ ├── checkpoints.json │ │ ├── fallback_lnnodes.json │ │ └── servers.json │ └── testnet4 │ │ ├── checkpoints.json │ │ └── servers.json ├── channel_db.py ├── coinchooser.py ├── commands.py ├── constants.py ├── contacts.py ├── crypto.py ├── currencies.json ├── daemon.py ├── descriptor.py ├── dns_hacks.py ├── dnssec.py ├── electrum ├── exchange_rate.py ├── fee_policy.py ├── gui │ ├── __init__.py │ ├── common_qt │ │ ├── __init__.py │ │ ├── i18n.py │ │ ├── plugins.py │ │ └── util.py │ ├── default_lang.py │ ├── fonts │ │ ├── PTMono-Bold.ttf │ │ ├── PTMono-Regular.ttf │ │ └── PTMono.LICENSE │ ├── icons │ │ ├── Electrum_512.png │ │ ├── Electrum_square_512.png │ │ ├── add.png │ │ ├── anchor.png │ │ ├── android_electrum_icon_background.png │ │ ├── android_electrum_icon_foreground.png │ │ ├── android_electrum_icon_legacy.png │ │ ├── bitcoin.png │ │ ├── bookmark.png │ │ ├── bookmark.svg │ │ ├── bookmark_add.png │ │ ├── bookmark_add.svg │ │ ├── bookmark_remove.png │ │ ├── bookmark_remove.svg │ │ ├── bug.png │ │ ├── camera_dark.png │ │ ├── camera_white.png │ │ ├── chevron-right.png │ │ ├── clock1.png │ │ ├── clock2.png │ │ ├── clock3.png │ │ ├── clock4.png │ │ ├── clock5.pdn │ │ ├── clock5.png │ │ ├── closebutton.png │ │ ├── cloud_no.png │ │ ├── cloud_yes.png │ │ ├── confirmed.png │ │ ├── confirmed.svg │ │ ├── confirmed_bw.png │ │ ├── copy.png │ │ ├── copy_bw.png │ │ ├── delete.png │ │ ├── electrum.icns │ │ ├── electrum.ico │ │ ├── electrum.png │ │ ├── electrum_dark_icon.png │ │ ├── electrum_darkblue.svg │ │ ├── electrum_darkblue_1.png │ │ ├── electrum_launcher.png │ │ ├── electrum_light_icon.png │ │ ├── electrum_lightblue.svg │ │ ├── electrum_presplash.png │ │ ├── electrum_text.png │ │ ├── electrumb.png │ │ ├── expired.png │ │ ├── eye1.png │ │ ├── file.png │ │ ├── freeze.png │ │ ├── globe.png │ │ ├── hamburger.png │ │ ├── hd.png │ │ ├── hd_white.png │ │ ├── info.png │ │ ├── kangaroo.png │ │ ├── key.png │ │ ├── lightning.png │ │ ├── lightning_disconnected.png │ │ ├── link.png │ │ ├── lock.png │ │ ├── lock.svg │ │ ├── mail_icon.png │ │ ├── menu_vertical.png │ │ ├── menu_vertical_white.png │ │ ├── network.png │ │ ├── nostr.png │ │ ├── offline_tx.png │ │ ├── paste.png │ │ ├── pen.png │ │ ├── picture_in_picture.png │ │ ├── preferences.png │ │ ├── preferences.svg │ │ ├── qr_file.png │ │ ├── qrcode.png │ │ ├── qrcode_white.png │ │ ├── question.png │ │ ├── revealer_c.png │ │ ├── rocket.png │ │ ├── save.png │ │ ├── script.png │ │ ├── script_white.png │ │ ├── seal.png │ │ ├── seed.png │ │ ├── share.png │ │ ├── spinner.gif │ │ ├── status_connected.png │ │ ├── status_connected.svg │ │ ├── status_connected_fork.png │ │ ├── status_connected_proxy.png │ │ ├── status_connected_proxy.svg │ │ ├── status_connected_proxy_fork.png │ │ ├── status_disconnected.png │ │ ├── status_disconnected.svg │ │ ├── status_lagging.png │ │ ├── status_lagging.svg │ │ ├── status_lagging_fork.png │ │ ├── status_waiting.png │ │ ├── status_waiting.svg │ │ ├── sweep.png │ │ ├── tab_addresses.png │ │ ├── tab_coins.png │ │ ├── tab_console.png │ │ ├── tab_contacts.png │ │ ├── tab_history.png │ │ ├── tab_receive.png │ │ ├── tab_send.png │ │ ├── tor_logo.png │ │ ├── unconfirmed.png │ │ ├── unlock.png │ │ ├── unlock.svg │ │ ├── unpaid.png │ │ ├── update.png │ │ ├── wallet.png │ │ ├── warning.png │ │ └── zoom.png │ ├── messages.py │ ├── qml │ │ ├── __init__.py │ │ ├── android_res │ │ │ └── layout │ │ │ │ └── scanner_layout.xml │ │ ├── auth.py │ │ ├── components │ │ │ ├── About.qml │ │ │ ├── AddressDetails.qml │ │ │ ├── Addresses.qml │ │ │ ├── BIP39RecoveryDialog.qml │ │ │ ├── BalanceDetails.qml │ │ │ ├── ChannelDetails.qml │ │ │ ├── ChannelOpenProgressDialog.qml │ │ │ ├── Channels.qml │ │ │ ├── CloseChannelDialog.qml │ │ │ ├── ConfirmTxDialog.qml │ │ │ ├── Constants.qml │ │ │ ├── CpfpBumpFeeDialog.qml │ │ │ ├── ExceptionDialog.qml │ │ │ ├── ExportTxDialog.qml │ │ │ ├── GenericShareDialog.qml │ │ │ ├── History.qml │ │ │ ├── ImportAddressesKeysDialog.qml │ │ │ ├── ImportChannelBackupDialog.qml │ │ │ ├── InvoiceDialog.qml │ │ │ ├── Invoices.qml │ │ │ ├── LightningPaymentDetails.qml │ │ │ ├── LnurlPayRequestDialog.qml │ │ │ ├── LoadingWalletDialog.qml │ │ │ ├── MessageDialog.qml │ │ │ ├── NetworkOverview.qml │ │ │ ├── NewWalletWizard.qml │ │ │ ├── NostrConfigDialog.qml │ │ │ ├── NostrSwapServersDialog.qml │ │ │ ├── NotificationPopup.qml │ │ │ ├── OpenChannelDialog.qml │ │ │ ├── OpenWalletDialog.qml │ │ │ ├── OtpDialog.qml │ │ │ ├── PasswordDialog.qml │ │ │ ├── Pin.qml │ │ │ ├── Preferences.qml │ │ │ ├── ProxyConfigDialog.qml │ │ │ ├── RbfBumpFeeDialog.qml │ │ │ ├── RbfCancelDialog.qml │ │ │ ├── ReceiveDetailsDialog.qml │ │ │ ├── ReceiveDialog.qml │ │ │ ├── ReceiveRequests.qml │ │ │ ├── ScanDialog.qml │ │ │ ├── SendDialog.qml │ │ │ ├── ServerConfigDialog.qml │ │ │ ├── ServerConnectWizard.qml │ │ │ ├── SignVerifyMessageDialog.qml │ │ │ ├── SwapDialog.qml │ │ │ ├── SweepDialog.qml │ │ │ ├── TermsOfUseWizard.qml │ │ │ ├── TxDetails.qml │ │ │ ├── WalletDetails.qml │ │ │ ├── WalletMainView.qml │ │ │ ├── WalletSummary.qml │ │ │ ├── Wallets.qml │ │ │ ├── controls │ │ │ │ ├── AddressDelegate.qml │ │ │ │ ├── BalanceSummary.qml │ │ │ │ ├── BtcField.qml │ │ │ │ ├── ButtonContainer.qml │ │ │ │ ├── ChannelBar.qml │ │ │ │ ├── ChannelDelegate.qml │ │ │ │ ├── CoinDelegate.qml │ │ │ │ ├── ElCheckBox.qml │ │ │ │ ├── ElComboBox.qml │ │ │ │ ├── ElDialog.qml │ │ │ │ ├── ElListView.qml │ │ │ │ ├── ElRadioButton.qml │ │ │ │ ├── ElTextArea.qml │ │ │ │ ├── FeeMethodComboBox.qml │ │ │ │ ├── FeePicker.qml │ │ │ │ ├── FiatField.qml │ │ │ │ ├── FlatButton.qml │ │ │ │ ├── FormattedAmount.qml │ │ │ │ ├── Heading.qml │ │ │ │ ├── HelpButton.qml │ │ │ │ ├── HelpDialog.qml │ │ │ │ ├── HistoryItemDelegate.qml │ │ │ │ ├── InfoBanner.qml │ │ │ │ ├── InfoTextArea.qml │ │ │ │ ├── InvoiceDelegate.qml │ │ │ │ ├── LightningNetworkStatusIndicator.qml │ │ │ │ ├── OnchainNetworkStatusIndicator.qml │ │ │ │ ├── PaneInsetBackground.qml │ │ │ │ ├── PasswordField.qml │ │ │ │ ├── PasswordStrengthIndicator.qml │ │ │ │ ├── Piechart.qml │ │ │ │ ├── PrefsHeading.qml │ │ │ │ ├── ProxyConfig.qml │ │ │ │ ├── QRImage.qml │ │ │ │ ├── QRScan.qml │ │ │ │ ├── RequestExpiryComboBox.qml │ │ │ │ ├── SeedKeyboard.qml │ │ │ │ ├── SeedKeyboardKey.qml │ │ │ │ ├── SeedTextArea.qml │ │ │ │ ├── ServerConfig.qml │ │ │ │ ├── ServerDelegate.qml │ │ │ │ ├── Tag.qml │ │ │ │ ├── TextHighlightPane.qml │ │ │ │ ├── Toaster.qml │ │ │ │ ├── ToggleLabel.qml │ │ │ │ ├── TxInput.qml │ │ │ │ └── TxOutput.qml │ │ │ ├── main.qml │ │ │ └── wizard │ │ │ │ ├── WCConfirmSeed.qml │ │ │ │ ├── WCCosignerKeystore.qml │ │ │ │ ├── WCCreateSeed.qml │ │ │ │ ├── WCHaveMasterKey.qml │ │ │ │ ├── WCHaveSeed.qml │ │ │ │ ├── WCImport.qml │ │ │ │ ├── WCKeystoreType.qml │ │ │ │ ├── WCMultisig.qml │ │ │ │ ├── WCProxyConfig.qml │ │ │ │ ├── WCScriptAndDerivation.qml │ │ │ │ ├── WCServerConfig.qml │ │ │ │ ├── WCShowMasterPubkey.qml │ │ │ │ ├── WCTermsOfUseRequest.qml │ │ │ │ ├── WCWalletName.qml │ │ │ │ ├── WCWalletPassword.qml │ │ │ │ ├── WCWalletType.qml │ │ │ │ ├── WCWelcome.qml │ │ │ │ ├── Wizard.qml │ │ │ │ └── WizardComponent.qml │ │ ├── java_classes │ │ │ └── org │ │ │ │ └── electrum │ │ │ │ └── qr │ │ │ │ └── SimpleScannerActivity.java │ │ ├── qeaddressdetails.py │ │ ├── qeaddresslistmodel.py │ │ ├── qeapp.py │ │ ├── qebip39recovery.py │ │ ├── qebitcoin.py │ │ ├── qechanneldetails.py │ │ ├── qechannellistmodel.py │ │ ├── qechannelopener.py │ │ ├── qeconfig.py │ │ ├── qedaemon.py │ │ ├── qefx.py │ │ ├── qeinvoice.py │ │ ├── qeinvoicelistmodel.py │ │ ├── qelnpaymentdetails.py │ │ ├── qemodelfilter.py │ │ ├── qenetwork.py │ │ ├── qeqr.py │ │ ├── qeqrscanner.py │ │ ├── qerequestdetails.py │ │ ├── qeserverlistmodel.py │ │ ├── qeswaphelper.py │ │ ├── qetransactionlistmodel.py │ │ ├── qetxdetails.py │ │ ├── qetxfinalizer.py │ │ ├── qetypes.py │ │ ├── qewallet.py │ │ ├── qewizard.py │ │ └── util.py │ ├── qt │ │ ├── __init__.py │ │ ├── address_dialog.py │ │ ├── address_list.py │ │ ├── amountedit.py │ │ ├── balance_dialog.py │ │ ├── bip39_recovery_dialog.py │ │ ├── channel_details.py │ │ ├── channels_list.py │ │ ├── completion_text_edit.py │ │ ├── confirm_tx_dialog.py │ │ ├── console.py │ │ ├── contact_list.py │ │ ├── custom_model.py │ │ ├── exception_window.py │ │ ├── fee_slider.py │ │ ├── history_list.py │ │ ├── invoice_list.py │ │ ├── lightning_dialog.py │ │ ├── lightning_tx_dialog.py │ │ ├── locktimeedit.py │ │ ├── main_window.py │ │ ├── my_treeview.py │ │ ├── network_dialog.py │ │ ├── new_channel_dialog.py │ │ ├── password_dialog.py │ │ ├── paytoedit.py │ │ ├── plugins_dialog.py │ │ ├── qrcodewidget.py │ │ ├── qrreader │ │ │ ├── __init__.py │ │ │ └── qtmultimedia │ │ │ │ ├── __init__.py │ │ │ │ ├── camera_dialog.py │ │ │ │ ├── crop_blur_effect.py │ │ │ │ ├── validator.py │ │ │ │ ├── video_overlay.py │ │ │ │ ├── video_surface.py │ │ │ │ └── video_widget.py │ │ ├── qrtextedit.py │ │ ├── qrwindow.py │ │ ├── rate_limiter.py │ │ ├── rbf_dialog.py │ │ ├── rebalance_dialog.py │ │ ├── receive_tab.py │ │ ├── request_list.py │ │ ├── seed_dialog.py │ │ ├── send_tab.py │ │ ├── settings_dialog.py │ │ ├── stylesheet_patcher.py │ │ ├── swap_dialog.py │ │ ├── transaction_dialog.py │ │ ├── update_checker.py │ │ ├── util.py │ │ ├── utxo_dialog.py │ │ ├── utxo_list.py │ │ ├── wallet_info_dialog.py │ │ └── wizard │ │ │ ├── __init__.py │ │ │ ├── server_connect.py │ │ │ ├── terms_of_use.py │ │ │ ├── wallet.py │ │ │ └── wizard.py │ ├── stdio.py │ └── text.py ├── harden_memory_linux.py ├── hw_wallet │ ├── __init__.py │ ├── cmdline.py │ ├── plugin.py │ ├── qt.py │ └── trezor_qt_pinmatrix.py ├── i18n.py ├── interface.py ├── invoices.py ├── json_db.py ├── keystore.py ├── lnaddr.py ├── lnchannel.py ├── lnhtlc.py ├── lnmsg.py ├── lnonion.py ├── lnpeer.py ├── lnrater.py ├── lnrouter.py ├── lnsweep.py ├── lntransport.py ├── lnurl.py ├── lnutil.py ├── lnverifier.py ├── lnwatcher.py ├── lnwire │ ├── README.md │ ├── onion_wire.csv │ └── peer_wire.csv ├── lnworker.py ├── logging.py ├── mnemonic.py ├── mpp_split.py ├── network.py ├── old_mnemonic.py ├── onion_message.py ├── payment_identifier.py ├── paymentrequest.proto ├── paymentrequest.py ├── paymentrequest_pb2.py ├── pem.py ├── plot.py ├── plugin.py ├── plugins │ ├── README │ ├── __init__.py │ ├── audio_modem │ │ ├── __init__.py │ │ ├── manifest.json │ │ ├── microphone.png │ │ ├── qt.py │ │ └── speaker.png │ ├── bitbox02 │ │ ├── __init__.py │ │ ├── bitbox02.png │ │ ├── bitbox02.py │ │ ├── bitbox02_unpaired.png │ │ ├── manifest.json │ │ └── qt.py │ ├── coldcard │ │ ├── README.md │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── coldcard.png │ │ ├── coldcard.py │ │ ├── coldcard.svg │ │ ├── coldcard_unpaired.png │ │ ├── coldcard_unpaired.svg │ │ ├── manifest.json │ │ └── qt.py │ ├── digitalbitbox │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── digitalbitbox.png │ │ ├── digitalbitbox.py │ │ ├── digitalbitbox_unpaired.png │ │ ├── manifest.json │ │ └── qt.py │ ├── jade │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── jade.png │ │ ├── jade.py │ │ ├── jade_unpaired.png │ │ ├── jadepy │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── jade.py │ │ │ ├── jade_error.py │ │ │ ├── jade_serial.py │ │ │ └── jade_tcp.py │ │ ├── manifest.json │ │ └── qt.py │ ├── keepkey │ │ ├── __init__.py │ │ ├── client.py │ │ ├── clientbase.py │ │ ├── cmdline.py │ │ ├── keepkey.png │ │ ├── keepkey.py │ │ ├── keepkey_unpaired.png │ │ ├── manifest.json │ │ └── qt.py │ ├── labels │ │ ├── Labels.qml │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── labels.py │ │ ├── labelsync.png │ │ ├── manifest.json │ │ ├── qml.py │ │ └── qt.py │ ├── ledger │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── ledger.png │ │ ├── ledger.py │ │ ├── ledger_unpaired.png │ │ ├── manifest.json │ │ └── qt.py │ ├── nwc │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ ├── nwc.png │ │ ├── nwcserver.py │ │ └── qt.py │ ├── payserver │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ └── payserver.py │ ├── psbt_nostr │ │ ├── __init__.py │ │ ├── manifest.json │ │ ├── nostr_multisig.png │ │ ├── psbt_nostr.py │ │ ├── qml.py │ │ ├── qml │ │ │ ├── PsbtReceiveDialog.qml │ │ │ └── main.qml │ │ └── qt.py │ ├── revealer │ │ ├── DejaVuSansMono-Bold.ttf │ │ ├── LICENSE_DEJAVU.txt │ │ ├── SIL Open Font License.txt │ │ ├── SourceSans3-Bold.otf │ │ ├── __init__.py │ │ ├── hmac_drbg.py │ │ ├── manifest.json │ │ ├── qt.py │ │ ├── revealer.png │ │ └── revealer.py │ ├── safe_t │ │ ├── __init__.py │ │ ├── client.py │ │ ├── clientbase.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ ├── qt.py │ │ ├── safe-t.png │ │ ├── safe-t_unpaired.png │ │ ├── safe_t.py │ │ └── transport.py │ ├── swapserver │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ ├── server.py │ │ └── swapserver.py │ ├── timelock_recovery │ │ ├── __init__.py │ │ ├── intro.txt │ │ ├── manifest.json │ │ ├── qt.py │ │ ├── timelock_recovery.py │ │ ├── timelock_recovery_60.png │ │ └── timelock_recovery_820.png │ ├── trezor │ │ ├── __init__.py │ │ ├── clientbase.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ ├── qt.py │ │ ├── trezor.png │ │ ├── trezor.py │ │ └── trezor_unpaired.png │ ├── trustedcoin │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── common_qt.py │ │ ├── manifest.json │ │ ├── qml.py │ │ ├── qml │ │ │ ├── ChooseSeed.qml │ │ │ ├── Disclaimer.qml │ │ │ ├── KeepDisable.qml │ │ │ ├── ShowConfirmOTP.qml │ │ │ └── Terms.qml │ │ ├── qt.py │ │ ├── trustedcoin-status-disabled.png │ │ ├── trustedcoin-status.png │ │ ├── trustedcoin-wizard.png │ │ └── trustedcoin.py │ └── watchtower │ │ ├── __init__.py │ │ ├── cmdline.py │ │ ├── manifest.json │ │ ├── server.py │ │ └── watchtower.py ├── qrreader │ ├── __init__.py │ ├── abstract_base.py │ └── zbar.py ├── qrscanner.py ├── ripemd.py ├── rsakey.py ├── scripts │ ├── bip39_recovery.py │ ├── block_headers.py │ ├── bruteforce_pw.py │ ├── estimate_fee.py │ ├── get_history.py │ ├── ln_features.py │ ├── peers.py │ ├── quick_start.py │ ├── servers.py │ ├── txbroadcast.py │ ├── txradar.py │ ├── update_default_servers.py │ └── watch_address.py ├── segwit_addr.py ├── simple_config.py ├── slip39.py ├── sql_db.py ├── storage.py ├── submarine_swaps.py ├── synchronizer.py ├── trampoline.py ├── transaction.py ├── txbatcher.py ├── util.py ├── utils │ ├── __init__.py │ └── stacktracer.py ├── verifier.py ├── version.py ├── wallet.py ├── wallet_db.py ├── wizard.py ├── wordlist │ ├── chinese_simplified.txt │ ├── english.txt │ ├── japanese.txt │ ├── portuguese.txt │ ├── slip39.txt │ └── spanish.txt └── x509.py ├── fastlane └── metadata │ └── android │ └── en-US │ ├── full_description.txt │ ├── images │ ├── icon.png │ └── phoneScreenshots │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ ├── 7.jpg │ │ └── 8.jpg │ ├── short_description.txt │ └── title.txt ├── org.electrum.electrum.metainfo.xml ├── pubkeys ├── Animazing.asc ├── Emzy.asc ├── ThomasV.asc ├── bauerj.asc ├── kyuupichan.asc ├── sombernight.asc ├── sombernight_releasekey.asc └── wozz.asc ├── run_electrum ├── setup.cfg ├── setup.py ├── tests ├── __init__.py ├── anchor-vectors.json ├── bip-0341 │ └── wallet-test-vectors.json ├── blinded-onion-message-onion-test.json ├── cause_carbon_wallet.json ├── qt_util.py ├── regtest.py ├── regtest │ ├── regtest.sh │ ├── run_bitcoind.sh │ └── run_electrumx.sh ├── slip39-vectors.json ├── test_bitcoin.py ├── test_blockchain.py ├── test_bolt11.py ├── test_coinchooser.py ├── test_commands.py ├── test_contacts.py ├── test_daemon.py ├── test_descriptor.py ├── test_fee_policy.py ├── test_interface.py ├── test_invoices.py ├── test_lnchannel.py ├── test_lnhtlc.py ├── test_lnmsg.py ├── test_lnpeer.py ├── test_lnrouter.py ├── test_lntransport.py ├── test_lnurl.py ├── test_lnutil.py ├── test_mnemonic.py ├── test_mpp_split.py ├── test_network.py ├── test_onion_message.py ├── test_payment_identifier.py ├── test_psbt.py ├── test_qml_types.py ├── test_revealer.py ├── test_simple_config.py ├── test_storage_upgrade.py ├── test_storage_upgrade │ ├── client_1_9_8_seeded │ ├── client_2_0_4_importedkeys │ ├── client_2_0_4_multisig │ ├── client_2_0_4_seeded │ ├── client_2_0_4_trezor_multiacc │ ├── client_2_0_4_trezor_singleacc │ ├── client_2_0_4_watchaddresses │ ├── client_2_1_1_importedkeys │ ├── client_2_1_1_multisig │ ├── client_2_1_1_seeded │ ├── client_2_1_1_trezor_multiacc │ ├── client_2_1_1_trezor_singleacc │ ├── client_2_1_1_watchaddresses │ ├── client_2_2_0_importedkeys │ ├── client_2_2_0_multisig │ ├── client_2_2_0_seeded │ ├── client_2_2_0_trezor_multiacc │ ├── client_2_2_0_trezor_singleacc │ ├── client_2_2_0_watchaddresses │ ├── client_2_3_2_importedkeys │ ├── client_2_3_2_multisig │ ├── client_2_3_2_seeded │ ├── client_2_3_2_trezor_multiacc │ ├── client_2_3_2_trezor_singleacc │ ├── client_2_3_2_watchaddresses │ ├── client_2_4_3_importedkeys │ ├── client_2_4_3_multisig │ ├── client_2_4_3_seeded │ ├── client_2_4_3_trezor_multiacc │ ├── client_2_4_3_trezor_singleacc │ ├── client_2_4_3_watchaddresses │ ├── client_2_5_4_importedkeys │ ├── client_2_5_4_multisig │ ├── client_2_5_4_seeded │ ├── client_2_5_4_trezor_multiacc │ ├── client_2_5_4_trezor_singleacc │ ├── client_2_5_4_watchaddresses │ ├── client_2_6_4_importedkeys │ ├── client_2_6_4_multisig │ ├── client_2_6_4_seeded │ ├── client_2_6_4_watchaddresses │ ├── client_2_7_18_importedkeys │ ├── client_2_7_18_multisig │ ├── client_2_7_18_seeded │ ├── client_2_7_18_trezor_singleacc │ ├── client_2_7_18_watchaddresses │ ├── client_2_8_3_importedkeys │ ├── client_2_8_3_importedkeys_flawed_previous_upgrade_from_2_7_18 │ ├── client_2_8_3_multisig │ ├── client_2_8_3_seeded │ ├── client_2_8_3_trezor_singleacc │ ├── client_2_8_3_watchaddresses │ ├── client_2_9_3_importedkeys │ ├── client_2_9_3_importedkeys_keystore_changes │ ├── client_2_9_3_multisig │ ├── client_2_9_3_old_seeded_with_realistic_history │ ├── client_2_9_3_seeded │ ├── client_2_9_3_trezor_singleacc │ ├── client_2_9_3_watchaddresses │ ├── client_3_2_3_ledger_standard_keystore_changes │ ├── client_3_3_8_xpub_with_realistic_history │ └── client_4_5_2_9dk_with_ln ├── test_timelock_recovery.py ├── test_timelock_recovery │ └── default_wallet ├── test_transaction.py ├── test_txbatcher.py ├── test_util.py ├── test_verifier.py ├── test_wallet.py ├── test_wallet_vertical.py ├── test_wizard.py └── test_x509.py └── tox.ini /.dockerignore: -------------------------------------------------------------------------------- 1 | .gitignore -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # see https://EditorConfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | trim_trailing_whitespace = true 8 | end_of_line = lf 9 | charset = utf-8 10 | 11 | [*.py] 12 | indent_size = 4 13 | insert_final_newline = true 14 | 15 | [*.sh] 16 | indent_size = 4 17 | insert_final_newline = true 18 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform end-of-line normalization (to LF) 2 | * text=auto 3 | 4 | # These Windows files should have CRLF line endings in checkout 5 | *.bat text eol=crlf 6 | *.ps1 text eol=crlf 7 | 8 | # Never perform LF normalization on these files 9 | *.ico binary 10 | *.jar binary 11 | *.png binary 12 | *.zip binary 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/01_issue.yml: -------------------------------------------------------------------------------- 1 | name: Issue 2 | description: Submit a new issue. 3 | #labels: [bug] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | ## Read this first! 9 | 10 | * This issue tracker is for bug reports and development, not general questions. 11 | * There is no private support! Scammers will reply to you here and tell you to go to their external website or contact them privately in email/telegram/whatsapp/etc. 12 | They will try to **steal** your coins! 13 | Be extremely suspicious of anyone offering help in a non-public way. Scammers will want to chat with you in private as then other people will not get a chance to point out the scam. 14 | * Do not post issues about non-**Bitcoin** versions of Electrum. 15 | 16 | ---- 17 | #- type: checkboxes 18 | # attributes: 19 | # label: Is there an existing issue for this already? 20 | # #description: Please search to see if this issue is already being tracked. 21 | # options: 22 | # - label: I have searched the existing issues 23 | # required: true 24 | - type: textarea 25 | id: main-text-body 26 | attributes: 27 | label: Description 28 | #description: Tell us what went wrong 29 | placeholder: Please search existing issues for duplicates. 30 | validations: 31 | required: true 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | # - name: Electrum Security Policy 4 | # url: https://github.com/spesmilo/electrum/blob/master/SECURITY.md 5 | # about: View security policy 6 | - name: Community Forum 7 | url: https://bitcointalk.org/index.php?board=98.0 8 | about: Ask non-development-related questions here 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | ####-*.patch 3 | **/*.pyc 4 | *.swp 5 | build/ 6 | dist/ 7 | *.egg/ 8 | Electrum.egg-info/ 9 | .devlocaltmp/ 10 | *_trial_temp 11 | packages 12 | env/ 13 | .buildozer 14 | .buildozer_*/ 15 | bin/ 16 | /app.fil 17 | .idea 18 | .mypy_cache 19 | .vscode 20 | electrum_data 21 | .DS_Store 22 | contrib/trigger_website 23 | contrib/trigger_binaries 24 | 25 | # tests/tox 26 | .tox/ 27 | .cache/ 28 | .coverage 29 | .pytest_cache 30 | 31 | # build workspaces 32 | contrib/build-wine/tmp/ 33 | contrib/build-wine/build/ 34 | contrib/build-wine/.cache/ 35 | contrib/build-wine/dist/ 36 | contrib/build-wine/signed/ 37 | contrib/build-linux/appimage/build/ 38 | contrib/build-linux/appimage/.cache/ 39 | contrib/osx/.cache/ 40 | contrib/osx/build-venv/ 41 | contrib/android/android_debug.keystore 42 | contrib/secp256k1/ 43 | contrib/zbar/ 44 | contrib/libusb/ 45 | contrib/.venv_make_packages/ 46 | 47 | # shared objects 48 | electrum/*.so 49 | electrum/*.so.* 50 | electrum/*.dll 51 | electrum/*.dylib 52 | contrib/osx/*.dylib 53 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "electrum/locale"] 2 | path = electrum/locale 3 | url = https://github.com/spesmilo/electrum-locale 4 | [submodule "electrum/www"] 5 | path = electrum/plugins/payserver/www 6 | url = https://github.com/spesmilo/electrum-http.git 7 | [submodule "electrum/plugins/keepkey/keepkeylib"] 8 | path = electrum/plugins/keepkey/keepkeylib 9 | url = https://github.com/spesmilo/electrum-keepkeylib.git 10 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | ThomasV - Creator and maintainer. 2 | Animazing / Tachikoma - Styled the new GUI. Mac version. 3 | Azelphur - GUI stuff. 4 | Coblee - Alternate coin support and py2app support. 5 | Deafboy - Ubuntu packages. 6 | Soren Stoutner - Debian packages and some Qt GUI layout. 7 | EagleTM - Bugfixes. 8 | ErebusBat - Mac distribution. 9 | Genjix - Porting pro-mode functionality to lite-gui and worked on server 10 | Slush - Work on the server. Designed the original Stratum spec. 11 | Julian Toash (Tuxavant) - Various fixes to the client. 12 | rdymac - Website and translations. 13 | kyuupichan - Miscellaneous. 14 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2024 The Electrum developers 4 | Copyright (c) 2011-2024 Thomas Voegtlin 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining 7 | a copy of this software and associated documentation files (the 8 | "Software"), to deal in the Software without restriction, including 9 | without limitation the rights to use, copy, modify, merge, publish, 10 | distribute, sublicense, and/or sell copies of the Software, and to 11 | permit persons to whom the Software is furnished to do so, subject to 12 | the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENCE RELEASE-NOTES AUTHORS 2 | include README.md 3 | include electrum.desktop 4 | include *.py 5 | include run_electrum 6 | include org.electrum.electrum.metainfo.xml 7 | recursive-include packages *.py 8 | recursive-include packages cacert.pem 9 | 10 | include contrib/requirements/requirements*.txt 11 | include contrib/deterministic-build/requirements*.txt 12 | include contrib/*.sh 13 | 14 | graft electrum 15 | graft tests 16 | graft contrib/udev 17 | 18 | exclude electrum/*.so 19 | exclude electrum/*.so.0 20 | exclude electrum/*.dll 21 | exclude electrum/*.dylib 22 | 23 | global-exclude __pycache__ 24 | global-exclude *.py[co~] 25 | global-exclude *.py.orig 26 | global-exclude *.py.rej 27 | global-exclude .git 28 | 29 | # We include both source (.po) and compiled (.mo) locale files (if present). 30 | # When building the "sourceonly" tar.gz, the build script explicitly deletes the compiled files. 31 | # exclude electrum/locale/locale/*/LC_MESSAGES/electrum.mo 32 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | To report security issues, send an email to the addresses listed below. 6 | (Not for support. Support requests will be *ignored*.) 7 | 8 | Please send any report to *all* emails listed here. 9 | 10 | The following GPG keys may be used to communicate sensitive information. 11 | 12 | 13 | | Name | Email | GPG fingerprint | 14 | |-------------|----------------------------------------|---------------------------------------------------| 15 | | ThomasV | thomasv [AT] electrum [DOT] org | 6694 D8DE 7BE8 EE56 31BE D950 2BD5 824B 7F94 70E6 | 16 | | SomberNight | somber.night [AT] protonmail [DOT] com | 4AD6 4339 DFA0 5E20 B3F6 AD51 E7B7 48CD AF5E 5ED9 | 17 | 18 | 19 | #### Where to find GPG keys 20 | 21 | You can import a key by running the following command with that 22 | individual’s fingerprint: `gpg --recv-keys ""` 23 | 24 | These public keys can also be found in the Electrum git repository, 25 | in the top-level `pubkeys` folder. 26 | -------------------------------------------------------------------------------- /contrib/android/apt.preferences: -------------------------------------------------------------------------------- 1 | Package: * 2 | Pin: origin "snapshot.debian.org" 3 | Pin-Priority: 1001 4 | -------------------------------------------------------------------------------- /contrib/android/apt.sources.list: -------------------------------------------------------------------------------- 1 | deb https://snapshot.debian.org/archive/debian/20230629T090352Z/ bookworm main 2 | deb-src https://snapshot.debian.org/archive/debian/20230629T090352Z/ bookworm main 3 | -------------------------------------------------------------------------------- /contrib/android/bitcoin_intent.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/README.md: -------------------------------------------------------------------------------- 1 | python-for-android local recipes 2 | -------------------------------- 3 | 4 | These folders are recipes (build scripts) for most of our direct and transitive 5 | dependencies for the Android app. python-for-android has recipes built-in for 6 | many packages but it also allows users to specify their "local" recipes. 7 | Local recipes have precedence over the built-in recipes. 8 | 9 | The local recipes we have here are mostly just used to pin down specific 10 | versions and hashes for reproducibility. The hashes are updated manually. 11 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/certifi/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipe import PythonRecipe 2 | 3 | 4 | assert PythonRecipe.depends == ['python3'] 5 | assert PythonRecipe.python_depends == [] 6 | 7 | 8 | class CertifiRecipePinned(PythonRecipe): 9 | version = "2023.11.17" 10 | sha512sum = "e359b4062d42e19ce6d16b25c17696f09ff5c35e7c92626b4eb15130cfa55941817db456d1c27d1188e0a6ff5f52db37607c0b15c1e438da3ea6d514c0d3443e" 11 | url = "https://pypi.python.org/packages/source/c/certifi/certifi-{version}.tar.gz" 12 | depends = ["setuptools"] 13 | 14 | 15 | recipe = CertifiRecipePinned() 16 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/cffi/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.cffi import CffiRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert CffiRecipe._version == "1.15.1" 10 | assert CffiRecipe.depends == ['setuptools', 'pycparser', 'libffi', 'python3'] 11 | assert CffiRecipe.python_depends == [] 12 | 13 | 14 | class CffiRecipePinned(util.InheritedRecipeMixin, CffiRecipe): 15 | sha512sum = "e99cafcb029076abc29e435b490fa0573ee2856f4051b7ca8a5b38cd125d56dd9dae8b189f59ceb3d728a675da8ee83239e09e19f8b0feeddea4b186ab5173a5" 16 | 17 | 18 | recipe = CffiRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/cryptography/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.cryptography import CryptographyRecipe 2 | 3 | 4 | assert CryptographyRecipe._version == "2.8" 5 | assert CryptographyRecipe.depends == ['openssl', 'six', 'setuptools', 'cffi', 'python3'] 6 | assert CryptographyRecipe.python_depends == [] 7 | 8 | 9 | class CryptographyRecipePinned(CryptographyRecipe): 10 | sha512sum = "000816a5513691bfbb01c5c65d96fb3567a5ff25300da4b485e716b6d4dc789aec05ed0fe65df9c5e3e60127aa9110f04e646407db5b512f88882b0659f7123f" 11 | 12 | 13 | recipe = CryptographyRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/hostpython3/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.hostpython3 import HostPython3Recipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert HostPython3Recipe.depends == [] 10 | assert HostPython3Recipe.python_depends == [] 11 | 12 | 13 | class HostPython3RecipePinned(util.InheritedRecipeMixin, HostPython3Recipe): 14 | version = "3.10.14" 15 | sha512sum = "113d8faf2685a7a9e868e4c0ecb2767aae3e54a8d3722a2de5ca00049b336c8728a6a6506b282326d94acc71a5c534ea706ad7b886a6ec7d15eaf46505ef233b" 16 | 17 | 18 | recipe = HostPython3RecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/libffi/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.libffi import LibffiRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert LibffiRecipe._version == "v3.4.2" 10 | assert LibffiRecipe.depends == [] 11 | assert LibffiRecipe.python_depends == [] 12 | 13 | 14 | class LibffiRecipePinned(util.InheritedRecipeMixin, LibffiRecipe): 15 | sha512sum = "d399319efcca375fe901b05722e25eca31d11a4261c6a5d5079480bbc552d4e4b42de2026912689d3b2f886ebb3c8bebbea47102e38a2f6acbc526b8d5bba388" 16 | 17 | 18 | recipe = LibffiRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/libiconv/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.libiconv import LibIconvRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert LibIconvRecipe._version == "1.16" 10 | assert LibIconvRecipe.depends == [] 11 | assert LibIconvRecipe.python_depends == [] 12 | 13 | 14 | class LibIconvRecipePinned(util.InheritedRecipeMixin, LibIconvRecipe): 15 | sha512sum = "365dac0b34b4255a0066e8033a8b3db4bdb94b9b57a9dca17ebf2d779139fe935caf51a465d17fd8ae229ec4b926f3f7025264f37243432075e5583925bb77b7" 16 | 17 | 18 | recipe = LibIconvRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/libsecp256k1/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.libsecp256k1 import LibSecp256k1Recipe 2 | 3 | 4 | assert LibSecp256k1Recipe.depends == [] 5 | assert LibSecp256k1Recipe.python_depends == [] 6 | 7 | 8 | class LibSecp256k1RecipePinned(LibSecp256k1Recipe): 9 | version = "642c885b6102725e25623738529895a95addc4f4" 10 | url = "https://github.com/bitcoin-core/secp256k1/archive/{version}.zip" 11 | sha512sum = "81c0048630e4b2ab24a71fc2156ff9f15bc6d379106cbe4724acd18a48269d07df51660662bcea4df167578a43837a8bc27af380f3a37b4c69e30cdd72f2b3fb" 12 | 13 | 14 | recipe = LibSecp256k1RecipePinned() 15 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/libzbar/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.libzbar import LibZBarRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert LibZBarRecipe.depends == ['libiconv'] 10 | assert LibZBarRecipe.python_depends == [] 11 | 12 | 13 | class LibZBarRecipePinned(util.InheritedRecipeMixin, LibZBarRecipe): 14 | version = "bb05ec54eec57f8397cb13fb9161372a281a1219" 15 | url = "https://github.com/mchehab/zbar/archive/{version}.zip" 16 | sha512sum = "186312ef0a50404efef79a5fbed34534569fab2873a6bb6d2e3d8ea64fa461c5537ca4fb0e659670d72b021e514f8fd4651b1e85954bf987015d8eb2e6f68375" 17 | patches = [] # werror.patch not needed for modern zbar 18 | 19 | 20 | recipe = LibZBarRecipePinned() 21 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/openssl/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.openssl import OpenSSLRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert OpenSSLRecipe.depends == [] 10 | assert OpenSSLRecipe.python_depends == [] 11 | 12 | 13 | class OpenSSLRecipePinned(util.InheritedRecipeMixin, OpenSSLRecipe): 14 | url_version = "1.1.1w" 15 | sha512sum = "b4c625fe56a4e690b57b6a011a225ad0cb3af54bd8fb67af77b5eceac55cc7191291d96a660c5b568a08a2fbf62b4612818e7cca1bb95b2b6b4fc649b0552b6d" 16 | 17 | 18 | recipe = OpenSSLRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/packaging/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.packaging import PackagingRecipe 2 | 3 | 4 | assert PackagingRecipe._version == "21.3" 5 | assert PackagingRecipe.depends == ["setuptools", "pyparsing", "python3"] 6 | assert PackagingRecipe.python_depends == [] 7 | 8 | 9 | class PackagingRecipePinned(PackagingRecipe): 10 | sha512sum = "2e3aa276a4229ac7dc0654d586799473ced9761a83aa4159660d37ae1a2a8f30e987248dd0e260e2834106b589f259a57ce9936eef0dcc3c430a99ac6b663e05" 11 | 12 | 13 | recipe = PackagingRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/ply/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.ply import PlyRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert PlyRecipe._version == "3.11" 10 | assert PlyRecipe.depends == ['packaging', 'python3'] 11 | assert PlyRecipe.python_depends == [] 12 | 13 | 14 | class PlyRecipePinned(util.InheritedRecipeMixin, PlyRecipe): 15 | sha512sum = "37e39a4f930874933223be58a3da7f259e155b75135f1edd47069b3b40e5e96af883ebf1c8a1bbd32f914a9e92cfc12e29fec05cf61b518f46c1d37421b20008" 16 | 17 | 18 | recipe = PlyRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/plyer/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipe import PythonRecipe 2 | 3 | 4 | assert PythonRecipe.depends == ['python3'] 5 | assert PythonRecipe.python_depends == [] 6 | 7 | 8 | class PlyerRecipePinned(PythonRecipe): 9 | version = "5262087c85b2c82c69e702fe944069f1d8465fdf" 10 | url = "git+https://github.com/SomberNight/plyer" 11 | depends = ["setuptools"] 12 | 13 | 14 | recipe = PlyerRecipePinned() 15 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pycparser/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.pycparser import PycparserRecipe 2 | 3 | 4 | assert PycparserRecipe._version == "2.14" 5 | assert PycparserRecipe.depends == ['setuptools', 'python3'] 6 | assert PycparserRecipe.python_depends == [] 7 | 8 | 9 | class PycparserRecipePinned(PycparserRecipe): 10 | sha512sum = "d5b9ab434a8944898ac23a4f51189db77b02b993bf3e3ca018852b117fc0eb43e460b156beaa5c1d631ad71c81e1649113e9fff7e33506b1e7d4de24d8b464c6" 11 | 12 | 13 | recipe = PycparserRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pyjnius/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.pyjnius import PyjniusRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert PyjniusRecipe._version == "1.5.0" 10 | assert PyjniusRecipe.depends == [('genericndkbuild', 'sdl2', 'qt6'), 'six', 'python3'] 11 | assert PyjniusRecipe.python_depends == [] 12 | 13 | 14 | class PyjniusRecipePinned(util.InheritedRecipeMixin, PyjniusRecipe): 15 | sha512sum = "e47ff08bdcda8fc9ef9617fc84515a85404d77cfce3ede3e190ae21221837a4275840e14976271f38eb5d514682d22eab5d83d8ca94dbf3a6b47d4effa109790" 16 | 17 | 18 | recipe = PyjniusRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pyparsing/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.pyparsing import PyparsingRecipe 2 | 3 | 4 | assert PyparsingRecipe._version == "3.0.7" 5 | assert PyparsingRecipe.depends == ["setuptools", "python3"] 6 | assert PyparsingRecipe.python_depends == [] 7 | 8 | 9 | class PyparsingRecipePinned(PyparsingRecipe): 10 | sha512sum = "1e692f4cdaa6b6e8ca2729d0a3e2ba16d978f1957c538b6de3a4220ec7d996bdbe87c41c43abab851fffa3b0498a05841373e435602917b8c095042e273badb5" 11 | 12 | 13 | recipe = PyparsingRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pyqt6/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.pyqt6 import PyQt6Recipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert PyQt6Recipe._version == "6.4.2" 10 | assert PyQt6Recipe.depends == ['qt6', 'pyjnius', 'setuptools', 'pyqt6sip', 'hostpython3', 'pyqt_builder'] 11 | assert PyQt6Recipe.python_depends == [] 12 | 13 | 14 | class PyQt6RecipePinned(util.InheritedRecipeMixin, PyQt6Recipe): 15 | sha512sum = "51e5f0d028ee7984876da1653cb135d61e2c402f18b939a92477888cc7c86d3bc2889477403dee6b3d9f66519ee3236d344323493b4c2c2e658e1637b10e53bf" 16 | 17 | 18 | recipe = PyQt6RecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pyqt6sip/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.pyqt6sip import PyQt6SipRecipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert PyQt6SipRecipe._version == "13.5.1" 10 | assert PyQt6SipRecipe.depends == ['setuptools', 'python3'] 11 | assert PyQt6SipRecipe.python_depends == [] 12 | 13 | 14 | class PyQt6SipRecipePinned(util.InheritedRecipeMixin, PyQt6SipRecipe): 15 | sha512sum = "1e4170d167a326afe6df86e4a35e209299548054981cb2e5d56da234ef9db4d8594bcb05b6be363c3bc6252776ae9de63d589a3d9f33fba8250d39cdb5e9061a" 16 | 17 | 18 | recipe = PyQt6SipRecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/pyqt_builder/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.pyqt_builder import PyQtBuilderRecipe 2 | 3 | 4 | assert PyQtBuilderRecipe._version == "1.15.1" 5 | assert PyQtBuilderRecipe.depends == ["sip", "packaging", "python3"] 6 | assert PyQtBuilderRecipe.python_depends == [] 7 | 8 | 9 | class PyQtBuilderRecipePinned(PyQtBuilderRecipe): 10 | sha512sum = "61ee73b6bb922c04739da60025ab50d35d345d2e298943305fcbd3926cda31d732cc5e5b0dbfc39f5eb85c0f0b091b8c3f5fee00dcc240d7849c5c4191c1368a" 11 | 12 | 13 | recipe = PyQtBuilderRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/python3/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.python3 import Python3Recipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert Python3Recipe.depends == ['hostpython3', 'sqlite3', 'openssl', 'libffi'] 10 | assert Python3Recipe.python_depends == [] 11 | 12 | 13 | class Python3RecipePinned(util.InheritedRecipeMixin, Python3Recipe): 14 | version = "3.10.14" 15 | sha512sum = "113d8faf2685a7a9e868e4c0ecb2767aae3e54a8d3722a2de5ca00049b336c8728a6a6506b282326d94acc71a5c534ea706ad7b886a6ec7d15eaf46505ef233b" 16 | 17 | 18 | recipe = Python3RecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/qt6/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.qt6 import Qt6Recipe 4 | 5 | from pythonforandroid.util import load_source 6 | 7 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 8 | 9 | assert Qt6Recipe._version == "6.4.3" 10 | # assert Qt6Recipe._version == "6.5.3" 11 | assert Qt6Recipe.depends == ['python3', 'hostqt6'] 12 | assert Qt6Recipe.python_depends == [] 13 | 14 | class Qt6RecipePinned(util.InheritedRecipeMixin, Qt6Recipe): 15 | sha512sum = "0bdbe8b9a43390c98cf19e851ec5394bc78438d227cf9d0d7a3748aee9a32a7f14fc46f52d4fa283819f21413567080aee7225c566af5278557f5e1992674da3" 16 | # sha512sum = "ca8ea3b81c121886636988275f7fa8ae6d19f7be02669e63ab19b4285b611057a41279db9532c25ae87baa3904b010e1db68b899cd0eda17a5a8d3d87098b4d5" 17 | 18 | 19 | recipe = Qt6RecipePinned() 20 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/setuptools/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.setuptools import SetuptoolsRecipe 2 | 3 | 4 | assert SetuptoolsRecipe._version == "51.3.3" 5 | assert SetuptoolsRecipe.depends == ['python3'] 6 | assert SetuptoolsRecipe.python_depends == [] 7 | 8 | 9 | class SetuptoolsRecipePinned(SetuptoolsRecipe): 10 | sha512sum = "5a3572466a68c6f650111448ce3343f64c62044650bb8635edbff97e2bc7b216b8bbe3b4e3bccf34e6887f3bedc911b27ca5f9a515201cae49cf44fbacf03345" 11 | 12 | 13 | recipe = SetuptoolsRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/sip/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.sip import SipRecipe 2 | 3 | 4 | assert SipRecipe._version == "6.7.9" 5 | assert SipRecipe.depends == ["setuptools", "packaging", "tomli", "ply", "python3"], SipRecipe.depends 6 | assert SipRecipe.python_depends == [] 7 | 8 | 9 | class SipRecipePinned(SipRecipe): 10 | sha512sum = "bb9d0d0d92002b6fd33f7e8ebe8cd62456dacc16b5734b73760b1ba14fb9b1f2b9b6640b40196c6cf5f345e1afde48bdef39675c4d3480041771325d4cf3c233" 11 | 12 | 13 | recipe = SipRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/six/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.six import SixRecipe 2 | 3 | 4 | assert SixRecipe._version == "1.15.0" 5 | assert SixRecipe.depends == ['setuptools', 'python3'] 6 | assert SixRecipe.python_depends == [] 7 | 8 | 9 | class SixRecipePinned(SixRecipe): 10 | sha512sum = "eb840ac17f433f1fc4af56de75cfbfe0b54e6a737bb23c453bf09a4a13d768d153e46064880dc763f4c5cc2785b78ea6d3d3b4a41fed181cb9064837e3f699a9" 11 | 12 | 13 | recipe = SixRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/sqlite3/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pythonforandroid.recipes.sqlite3 import Sqlite3Recipe 4 | from pythonforandroid.util import load_source 5 | 6 | util = load_source('util', os.path.join(os.path.dirname(os.path.dirname(__file__)), 'util.py')) 7 | 8 | 9 | assert Sqlite3Recipe._version == "3.35.5" 10 | assert Sqlite3Recipe.depends == [] 11 | assert Sqlite3Recipe.python_depends == [] 12 | 13 | 14 | class Sqlite3RecipePinned(util.InheritedRecipeMixin, Sqlite3Recipe): 15 | sha512sum = "9684fee89224f0c975c280cb6b2c64adb040334bc5517dfe0e354b0557459fa3ae642c4289a7a5265f65b3ad5b6747db8068a1e5172fbb8edec7f6d964ecbb20" 16 | 17 | 18 | recipe = Sqlite3RecipePinned() 19 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/toml/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.toml import TomlRecipe 2 | 3 | 4 | assert TomlRecipe._version == "0.10.2" 5 | assert TomlRecipe.depends == ["setuptools", "python3"] 6 | assert TomlRecipe.python_depends == [] 7 | 8 | 9 | class TomlRecipePinned(TomlRecipe): 10 | sha512sum = "ede2c8fed610a3827dba828f6e7ab7a8dbd5745e8ef7c0cd955219afdc83b9caea714deee09e853627f05ad1c525dc60426a6e9e16f58758aa028cb4d3db4b39" 11 | 12 | 13 | recipe = TomlRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/tomli/__init__.py: -------------------------------------------------------------------------------- 1 | from pythonforandroid.recipes.tomli import TomliRecipe 2 | 3 | 4 | assert TomliRecipe._version == "2.0.1" 5 | assert TomliRecipe.depends == ["setuptools", "python3"] 6 | assert TomliRecipe.python_depends == [] 7 | 8 | 9 | class TomliRecipePinned(TomliRecipe): 10 | sha512sum = "fd410039e255e2b3359e999d69a5a2d38b9b89b77e8557f734f2621dfbd5e1207e13aecc11589197ec22594c022f07f41b4cfe486a3a719281a595c95fd19ecf" 11 | 12 | 13 | recipe = TomliRecipePinned() 14 | -------------------------------------------------------------------------------- /contrib/android/p4a_recipes/util.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | class InheritedRecipeMixin: 5 | 6 | def get_recipe_dir(self): 7 | """This is used to replace pythonforandroid.recipe.Recipe.get_recipe_dir. 8 | If one of our local recipes inherits from a built-in p4a recipe, this override 9 | ensures that potential patches and other local files used by the recipe will 10 | be looked for in the built-in recipe's folder. 11 | """ 12 | return os.path.join(self.ctx.root_dir, 'recipes', self.name) 13 | -------------------------------------------------------------------------------- /contrib/apparmor/README.md: -------------------------------------------------------------------------------- 1 | # Electrum AppArmor Profiles 2 | AppArmor is a Mandatory Access Control (MAC) system which confines programs to a limited set of resources. 3 | AppArmor confinement is provided via profiles loaded into the kernel. 4 | 5 | ## Installation 6 | 7 | Copy the AppArmor profile from `contrib/apparmor/apparmor.d/` to `/etc/apparmor.d/`: 8 | ``` 9 | sudo cp -R -L contrib/apparmor/apparmor.d/* /etc/apparmor.d 10 | ``` 11 | Reload the AppArmor profiles to apply the changes: 12 | ``` 13 | sudo systemctl reload apparmor 14 | ``` 15 | Verify that the profile is loaded: 16 | ``` 17 | sudo apparmor_status 18 | ``` 19 | Look for the entry corresponding to `electrum` 20 | 21 | ## Usage 22 | After installing the AppArmor profile, electrum will be restricted to the permissions specified in the profile. 23 | 24 | ## Compatibility 25 | The help tab may not function as expected as browser permissions can be tricky (Tarball Binaries) 26 | 27 | These AppArmor profiles have been tested on the following operating systems: 28 | ``` 29 | Debian 12 30 | Ubuntu 23.10 31 | Kali Linux 6.6 32 | ``` 33 | -------------------------------------------------------------------------------- /contrib/apparmor/apparmor.d/electrum.appimage: -------------------------------------------------------------------------------- 1 | # Credits : Mikhail Morfikov 2 | abi , 3 | 4 | include 5 | 6 | @{exec_path} = /{usr/,}bin/fusermount{,3} 7 | profile fusermount @{exec_path} { 8 | include 9 | include 10 | 11 | # To mount anything: 12 | # fusermount: mount failed: Operation not permitted 13 | capability sys_admin, 14 | 15 | # For jmtpfs 16 | capability dac_read_search, 17 | 18 | @{exec_path} mr, 19 | 20 | # Where to mount ISO files 21 | owner @{HOME}/*/ rw, 22 | owner @{HOME}/*/*/ rw, 23 | owner @{HOME}/.cache/**/ rw, 24 | 25 | # Be able to mount ISO images 26 | mount fstype={fuse,fuse.*}, 27 | unmount fstype={fuse,fuse.*}, 28 | 29 | /etc/fuse.conf r, 30 | 31 | /dev/fuse rw, 32 | 33 | @{PROC}/@{pid}/mounts r, 34 | 35 | include if exists 36 | } 37 | -------------------------------------------------------------------------------- /contrib/apparmor/apparmor.d/usr.local.bin.electrum: -------------------------------------------------------------------------------- 1 | #Credits: Anton Nesterov 2 | abi , 3 | 4 | include 5 | 6 | @{electrum_exec_path} = /{usr/,usr/local/,*/*/.local/,}bin/electrum 7 | 8 | profile electrum @{electrum_exec_path} { 9 | include 10 | 11 | @{electrum_exec_path} mr, 12 | owner @{HOME}/.electrum/{**,} rw, 13 | owner @{HOME}/.local/{**,} mrw, 14 | 15 | } 16 | -------------------------------------------------------------------------------- /contrib/build-linux/appimage/.dockerignore: -------------------------------------------------------------------------------- 1 | build/ 2 | .cache/ 3 | -------------------------------------------------------------------------------- /contrib/build-linux/appimage/apprun.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | APPDIR="$(dirname "$(readlink -e "$0")")" 6 | 7 | export LD_LIBRARY_PATH="${APPDIR}/usr/lib/:${APPDIR}/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}" 8 | export PATH="${APPDIR}/usr/bin:${PATH}" 9 | export LDFLAGS="-L${APPDIR}/usr/lib/x86_64-linux-gnu -L${APPDIR}/usr/lib" 10 | 11 | exec "${APPDIR}/usr/bin/python3" -s "${APPDIR}/usr/bin/electrum" "$@" 12 | -------------------------------------------------------------------------------- /contrib/build-linux/appimage/apt.preferences: -------------------------------------------------------------------------------- 1 | Package: * 2 | Pin: origin "snapshot.debian.org" 3 | Pin-Priority: 1001 4 | -------------------------------------------------------------------------------- /contrib/build-linux/appimage/apt.sources.list: -------------------------------------------------------------------------------- 1 | deb https://snapshot.debian.org/archive/debian/20230317T205011Z/ buster main 2 | deb-src https://snapshot.debian.org/archive/debian/20230317T205011Z/ buster main -------------------------------------------------------------------------------- /contrib/build-linux/appimage/patches/python-3.11-reproducible-buildinfo.diff: -------------------------------------------------------------------------------- 1 | Description: Build reproduceable date and time into build info 2 | Build information is encoded into getbuildinfo.o at build time. 3 | Use the date and time from the debian changelog, to make this reproduceable. 4 | 5 | Forwarded: no 6 | 7 | --- a/Makefile.pre.in 8 | +++ b/Makefile.pre.in 9 | @@ -1248,6 +1248,8 @@ 10 | -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ 11 | -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ 12 | -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ 13 | + $(if $(BUILD_DATE),-DDATE='"$(BUILD_DATE)"') \ 14 | + $(if $(BUILD_TIME),-DTIME='"$(BUILD_TIME)"') \ 15 | -o $@ $(srcdir)/Modules/getbuildinfo.c 16 | 17 | Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS) 18 | -------------------------------------------------------------------------------- /contrib/build-linux/sdist/.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/contrib/build-linux/sdist/.dockerignore -------------------------------------------------------------------------------- /contrib/build-linux/sdist/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bookworm@sha256:b877a1a3fdf02469440f1768cf69c9771338a875b7add5e80c45b756c92ac20a 2 | 3 | ENV LC_ALL=C.UTF-8 LANG=C.UTF-8 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | 6 | RUN apt-get update -q && \ 7 | apt-get install -qy \ 8 | git \ 9 | gettext \ 10 | python3 \ 11 | python3-pip \ 12 | python3-setuptools \ 13 | python3-venv \ 14 | && \ 15 | rm -rf /var/lib/apt/lists/* && \ 16 | apt-get autoremove -y && \ 17 | apt-get clean 18 | 19 | # create new user to avoid using root; but with sudo access and no password for convenience. 20 | ARG UID=1000 21 | ENV USER="user" 22 | ENV HOME_DIR="/home/${USER}" 23 | ENV WORK_DIR="${HOME_DIR}/wspace" \ 24 | PATH="${HOME_DIR}/.local/bin:${PATH}" 25 | RUN useradd --uid $UID --create-home --shell /bin/bash ${USER} 26 | RUN usermod -append --groups sudo ${USER} 27 | RUN echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 28 | WORKDIR ${WORK_DIR} 29 | RUN chown --recursive ${USER} ${WORK_DIR} 30 | USER ${USER} 31 | -------------------------------------------------------------------------------- /contrib/build-wine/.dockerignore: -------------------------------------------------------------------------------- 1 | tmp/ 2 | build/ 3 | .cache/ 4 | dist/ 5 | signed/ 6 | -------------------------------------------------------------------------------- /contrib/build-wine/apt.preferences: -------------------------------------------------------------------------------- 1 | Package: * 2 | Pin: origin "snapshot.debian.org" 3 | Pin-Priority: 1001 4 | -------------------------------------------------------------------------------- /contrib/build-wine/apt.sources.list: -------------------------------------------------------------------------------- 1 | deb https://snapshot.debian.org/archive/debian/20240419T084725Z/ bookworm main 2 | deb-src https://snapshot.debian.org/archive/debian/20240419T084725Z/ bookworm main -------------------------------------------------------------------------------- /contrib/build-wine/sign.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | here=$(dirname "$0") 4 | if [ -z "$WIN_SIGNING_PASSWORD" ]; then 5 | echo "password missing" 6 | exit 1 7 | fi 8 | 9 | test -n "$here" -a -d "$here" || exit 10 | cd $here 11 | 12 | CERT_FILE=${CERT_FILE:-~/codesigning/cert.pem} 13 | KEY_FILE=${KEY_FILE:-~/codesigning/key.pem} 14 | if [[ ! -f "$CERT_FILE" ]]; then 15 | ls "$CERT_FILE" 16 | echo "Make sure that $CERT_FILE and $KEY_FILE exist" 17 | fi 18 | 19 | if ! which osslsigncode > /dev/null 2>&1; then 20 | echo "Please install osslsigncode" 21 | fi 22 | 23 | rm -rf signed 24 | mkdir -p signed >/dev/null 2>&1 25 | 26 | cd dist 27 | echo "Found $(ls *.exe | wc -w) files to sign." 28 | 29 | for f in $(ls *.exe); do 30 | echo "Signing $f..." 31 | osslsigncode sign \ 32 | -pass "$WIN_SIGNING_PASSWORD" \ 33 | -h sha256 \ 34 | -certs "$CERT_FILE" \ 35 | -key "$KEY_FILE" \ 36 | -n "Electrum" \ 37 | -i "https://electrum.org/" \ 38 | -t "http://timestamp.digicert.com/" \ 39 | -in "$f" \ 40 | -out "../signed/$f" 41 | ls "../signed/$f" -lah 42 | done 43 | -------------------------------------------------------------------------------- /contrib/build-wine/unsign.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PROJECT_ROOT="$(dirname "$(readlink -e "$0")")/../.." 4 | CONTRIB="$PROJECT_ROOT/contrib" 5 | here=$(dirname "$0") 6 | test -n "$here" -a -d "$here" || exit 7 | cd $here 8 | 9 | if ! which osslsigncode > /dev/null 2>&1; then 10 | echo "Please install osslsigncode" 11 | exit 12 | fi 13 | 14 | # exit if command fails 15 | set -e 16 | 17 | rm -rf signed/stripped 18 | mkdir -p signed >/dev/null 2>&1 19 | mkdir -p signed/stripped >/dev/null 2>&1 20 | 21 | version=$("$CONTRIB"/print_electrum_version.py) 22 | 23 | echo "Found $(ls dist/*.exe | wc -w) files to verify." 24 | 25 | for mine in $(ls dist/*.exe); do 26 | echo "---------------" 27 | f="$(basename $mine)" 28 | if test -f "signed/$f"; then 29 | echo "Found file at signed/$f" 30 | else 31 | echo "Downloading https://download.electrum.org/$version/$f" 32 | wget -q "https://download.electrum.org/$version/$f" -O "signed/$f" 33 | fi 34 | out="signed/stripped/$f" 35 | # Remove PE signature from signed binary 36 | osslsigncode remove-signature -in "signed/$f" -out "$out" > /dev/null 2>&1 37 | chmod +x "$out" 38 | if cmp -s "$out" "$mine"; then 39 | echo "Success: $f" 40 | #gpg --sign --armor --detach signed/$f 41 | else 42 | echo "Failure: $f" 43 | exit 1 44 | fi 45 | done 46 | 47 | exit 0 48 | -------------------------------------------------------------------------------- /contrib/deterministic-build/README.md: -------------------------------------------------------------------------------- 1 | # Notes 2 | 3 | The frozen dependency lists in this folder are *generated* files. 4 | 5 | - Starting from `contrib/requirements/requirements*.txt`, 6 | - we use the `contrib/freeze_packages.sh` script, 7 | - to generate `contrib/deterministic-build/requirements*.txt`. 8 | 9 | The source files list direct dependencies with loose version requirements, 10 | while the output files list all transitive dependencies with exact version+hash pins. 11 | 12 | The build scripts only use these hash pinned requirement files. 13 | -------------------------------------------------------------------------------- /contrib/deterministic-build/check_submodules.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | here=$(dirname "$0") 4 | test -n "$here" -a -d "$here" || exit 5 | 6 | cd ${here}/../.. 7 | 8 | git submodule init 9 | git submodule update 10 | 11 | function get_git_mtime { 12 | if [ $# -eq 1 ]; then 13 | git log --pretty=%at -n1 -- $1 14 | else 15 | git log --pretty=%ar -n1 -- $2 16 | fi 17 | } 18 | 19 | fail=0 20 | 21 | 22 | if [ $(date +%s -d "2 weeks ago") -gt $(get_git_mtime "contrib/deterministic-build/electrum-locale/") ]; then 23 | echo "Last update from electrum-locale is older than 2 weeks."\ 24 | "Please update it to incorporate the latest translations from crowdin." 25 | fail=1 26 | fi 27 | 28 | exit ${fail} 29 | -------------------------------------------------------------------------------- /contrib/deterministic-build/requirements-build-appimage.txt: -------------------------------------------------------------------------------- 1 | Cython==0.29.37 \ 2 | --hash=sha256:f813d4a6dd94adee5d4ff266191d1d95bf6d4164a4facc535422c021b2504cfb 3 | pip==22.3.1 \ 4 | --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 5 | setuptools==65.5.1 \ 6 | --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f 7 | wheel==0.38.4 \ 8 | --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac -------------------------------------------------------------------------------- /contrib/deterministic-build/requirements-build-mac.txt: -------------------------------------------------------------------------------- 1 | altgraph==0.17.4 \ 2 | --hash=sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406 3 | Cython==0.29.37 \ 4 | --hash=sha256:f813d4a6dd94adee5d4ff266191d1d95bf6d4164a4facc535422c021b2504cfb 5 | importlib-metadata==7.0.1 \ 6 | --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc 7 | macholib==1.16.3 \ 8 | --hash=sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30 9 | packaging==23.2 \ 10 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 11 | pip==22.3.1 \ 12 | --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 13 | pyinstaller-hooks-contrib==2024.1 \ 14 | --hash=sha256:51a51ea9e1ae6bd5ffa7ec45eba7579624bf4f2472ff56dba0edc186f6ed46a6 15 | setuptools==65.5.1 \ 16 | --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f 17 | wheel==0.38.4 \ 18 | --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac 19 | zipp==3.17.0 \ 20 | --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 -------------------------------------------------------------------------------- /contrib/deterministic-build/requirements-build-wine.txt: -------------------------------------------------------------------------------- 1 | altgraph==0.17.4 \ 2 | --hash=sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406 3 | importlib-metadata==7.0.1 \ 4 | --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc 5 | packaging==23.2 \ 6 | --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 7 | pefile==2023.2.7 \ 8 | --hash=sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc 9 | pip==22.3.1 \ 10 | --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 11 | pyinstaller-hooks-contrib==2024.1 \ 12 | --hash=sha256:51a51ea9e1ae6bd5ffa7ec45eba7579624bf4f2472ff56dba0edc186f6ed46a6 13 | pywin32-ctypes==0.2.2 \ 14 | --hash=sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60 15 | setuptools==65.5.1 \ 16 | --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f 17 | wheel==0.38.4 \ 18 | --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac 19 | zipp==3.17.0 \ 20 | --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 -------------------------------------------------------------------------------- /contrib/generate_payreqpb2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Generates the file paymentrequest_pb2.py 3 | 4 | CONTRIB="$(dirname "$(readlink -e "$0")")" 5 | EL="$CONTRIB"/../electrum 6 | 7 | if ! which protoc > /dev/null 2>&1; then 8 | echo "Please install 'protoc'" 9 | echo "If you're on Debian, try 'sudo apt install protobuf-compiler'?" 10 | exit 1 11 | fi 12 | 13 | protoc --proto_path="$EL" --python_out="$EL" "$EL"/paymentrequest.proto 14 | -------------------------------------------------------------------------------- /contrib/locale/build_cleanlocale.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | CONTRIB_LOCALE="$(dirname "$(realpath "$0" 2> /dev/null || grealpath "$0")")" 6 | CONTRIB="$CONTRIB_LOCALE"/.. 7 | PROJECT_ROOT="$CONTRIB"/.. 8 | 9 | cd "$PROJECT_ROOT" 10 | git submodule update --init 11 | 12 | LOCALE="$PROJECT_ROOT/electrum/locale/" 13 | cd "$LOCALE" 14 | git clean -ffxd 15 | git reset --hard 16 | "$CONTRIB_LOCALE/build_locale.sh" "$LOCALE/locale" "$LOCALE/locale" 17 | -------------------------------------------------------------------------------- /contrib/locale/build_locale.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # This script converts human-readable (.po) locale files to compiled (.mo) locale files. 4 | 5 | set -e 6 | 7 | if [[ ! -d "$1" || -z "$2" ]]; then 8 | echo "usage: $0 locale_source_dir locale_dest_dir" 9 | echo " The dirs can match, to build in place." 10 | # ^ note: these are the paths to the "inner" locale/ dir 11 | exit 1 12 | fi 13 | 14 | # convert $1 and $2 to abs paths 15 | SRC_DIR="$(realpath "$1" 2> /dev/null || grealpath "$1")" 16 | DST_DIR="$(realpath "$2" 2> /dev/null || grealpath "$2")" 17 | 18 | if ! which msgfmt > /dev/null 2>&1; then 19 | echo "Please install gettext" 20 | exit 1 21 | fi 22 | 23 | cd "$SRC_DIR" 24 | mkdir -p "$DST_DIR" 25 | 26 | for i in *; do 27 | dir="$DST_DIR/$i/LC_MESSAGES" 28 | mkdir -p "$dir" 29 | (msgfmt --output-file="$dir/electrum.mo" "$i/electrum.po" || true) 30 | done 31 | -------------------------------------------------------------------------------- /contrib/osx/README_macos.md: -------------------------------------------------------------------------------- 1 | # Running Electrum from source on macOS (development version) 2 | 3 | ## Prerequisites 4 | 5 | - [brew](https://brew.sh/) 6 | - python3 7 | - git 8 | 9 | ## Main steps 10 | 11 | ### 1. Check out the code from GitHub: 12 | ``` 13 | $ git clone https://github.com/spesmilo/electrum.git 14 | $ cd electrum 15 | $ git submodule update --init 16 | ``` 17 | 18 | ### 2. Prepare for compiling libsecp256k1 19 | 20 | To be able to build the `electrum-ecc` package from source 21 | (which is pulled in when installing Electrum in the next step), 22 | you need: 23 | ``` 24 | $ brew install autoconf automake libtool coreutils 25 | ``` 26 | 27 | ### 3. Install Electrum 28 | 29 | Run install (this should install the dependencies): 30 | ``` 31 | $ python3 -m pip install --user -e ".[gui,crypto]" 32 | ``` 33 | 34 | ### 4. Run electrum: 35 | ``` 36 | $ ./run_electrum 37 | ``` 38 | -------------------------------------------------------------------------------- /contrib/osx/entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | com.apple.security.cs.allow-unsigned-executable-memory 8 | 9 | com.apple.security.cs.disable-library-validation 10 | 11 | 12 | 13 | 14 | com.apple.security.cs.allow-dyld-environment-variables 15 | 16 | com.apple.security.cs.allow-jit 17 | 18 | 19 | 20 | com.apple.security.device.camera 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /contrib/print_electrum_version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | # For usage in shell, to get the version of electrum, without needing electrum installed. 3 | # usage: ./print_electrum_version.py [] 4 | # 5 | # For example: 6 | # $ VERSION=$("$CONTRIB"/print_electrum_version.py) 7 | # instead of 8 | # $ VERSION=$(python3 -c "import electrum; print(electrum.version.ELECTRUM_VERSION)") 9 | 10 | import importlib.util 11 | import os 12 | import sys 13 | 14 | 15 | if __name__ == '__main__': 16 | if len(sys.argv) >= 2: 17 | attr_name = sys.argv[1] 18 | else: 19 | attr_name = "ELECTRUM_VERSION" 20 | 21 | project_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) 22 | version_file_path = os.path.join(project_root, "electrum", "version.py") 23 | 24 | # load version.py; needlessly complicated alternative to "imp.load_source": 25 | version_spec = importlib.util.spec_from_file_location('version', version_file_path) 26 | version_module = version = importlib.util.module_from_spec(version_spec) 27 | version_spec.loader.exec_module(version_module) 28 | 29 | attr_val = getattr(version, attr_name) 30 | print(attr_val, file=sys.stdout) 31 | 32 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-binaries-mac.txt: -------------------------------------------------------------------------------- 1 | PyQt6 2 | cryptography>=2.6 3 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-binaries.txt: -------------------------------------------------------------------------------- 1 | PyQt6 2 | 3 | # we need at least cryptography>=2.1 for electrum.crypto, 4 | # and at least cryptography>=2.6 for dnspython[DNSSEC] 5 | cryptography>=2.6 6 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-build-android.txt: -------------------------------------------------------------------------------- 1 | pip 2 | setuptools 3 | wheel 4 | cython 5 | 6 | # needed by buildozer: 7 | pexpect 8 | sh 9 | 10 | # needed by python-for-android: 11 | appdirs 12 | # colorama upper bound to avoid needing hatchling 13 | colorama>=0.3.3,<0.4.6 14 | jinja2 15 | sh>=1.10 16 | pep517 17 | toml 18 | 19 | # needed for the Qt/QML Android GUI: 20 | # TODO double-check this 21 | typing-extensions 22 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-build-appimage.txt: -------------------------------------------------------------------------------- 1 | pip 2 | setuptools 3 | wheel 4 | 5 | # Note: hidapi requires Cython at build-time (not needed at runtime). 6 | # For reproducible builds, the version of Cython must be pinned down. 7 | # The pinned Cython must be installed before hidapi is built; 8 | # otherwise when installing hidapi, pip just downloads the latest Cython. 9 | # see https://github.com/spesmilo/electrum/issues/5859 10 | Cython>=0.27 11 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-build-base.txt: -------------------------------------------------------------------------------- 1 | # This file contains build-time dependencies needed to build other higher level build-time dependencies 2 | # and runtime dependencies. 3 | # For reproducibility, some build-time deps, most notably "wheel", need to be pinned. (see #7640) 4 | # By default, when doing e.g. "pip install", pip downloads the latest version of wheel (and setuptools, etc), 5 | # regardless whether a sufficiently recent version of wheel is already installed locally... 6 | # The only way I have found to avoid this, is to use the "--no-build-isolation" flag, 7 | # in which case it becomes our responsibility to install *all* build time deps... 8 | 9 | pip 10 | setuptools 11 | wheel 12 | 13 | # importlib_metadata also needs: 14 | # https://github.com/python/importlib_metadata/blob/1e2381fe101fd70742a0171e51c1be82aedf519b/pyproject.toml#L2 15 | setuptools_scm[toml]>=3.4.1 16 | 17 | # dnspython also needs: 18 | # https://github.com/rthalley/dnspython/blob/1a7c14fb6c200be02ef5c2f3bb9fd84b85004459/pyproject.toml#L64 19 | poetry-core 20 | 21 | # typing-extensions also needs: 22 | # https://github.com/python/typing/blob/a2371460d184c96aab7a69acc47fd059f875e3b4/typing_extensions/pyproject.toml#L3 23 | flit_core>=3.4,<4 24 | 25 | # aio-libs/frozenlist and aio-libs/propcache needs: 26 | # https://github.com/aio-libs/frozenlist/blob/c28f32d6816ca0fa56a5876e84831c46084bb85d/pyproject.toml#L6 27 | expandvars 28 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-build-mac.txt: -------------------------------------------------------------------------------- 1 | pip 2 | setuptools 3 | wheel 4 | 5 | # needed by pyinstaller: 6 | macholib>=1.8 7 | altgraph 8 | pyinstaller-hooks-contrib>=2020.6 9 | 10 | # Note: hidapi requires Cython at build-time (not needed at runtime). 11 | # For reproducible builds, the version of Cython must be pinned down. 12 | # The pinned Cython must be installed before hidapi is built; 13 | # otherwise when installing hidapi, pip just downloads the latest Cython. 14 | # see https://github.com/spesmilo/electrum/issues/5859 15 | Cython>=0.27 16 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-build-wine.txt: -------------------------------------------------------------------------------- 1 | pip 2 | setuptools 3 | wheel 4 | 5 | # needed by pyinstaller: 6 | pefile>=2017.8.1 7 | altgraph 8 | pywin32-ctypes>=0.2.0 9 | pyinstaller-hooks-contrib>=2020.11 10 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-ci.txt: -------------------------------------------------------------------------------- 1 | tox 2 | coveralls 3 | -------------------------------------------------------------------------------- /contrib/requirements/requirements-hw.txt: -------------------------------------------------------------------------------- 1 | hidapi 2 | 3 | # device plugin: trezor 4 | trezor[hidapi]>=0.13.0,<0.14 5 | 6 | # device plugin: safe_t 7 | safet>=0.1.5 8 | 9 | # device plugin: keepkey 10 | ecdsa>=0.9 11 | protobuf>=3.20 12 | mnemonic>=0.8 13 | hidapi>=0.7.99.post15 14 | libusb1>=1.6 15 | 16 | # device plugin: ledger 17 | ledger-bitcoin>=0.2.0,<1.0 18 | hidapi 19 | 20 | # device plugin: coldcard 21 | ckcc-protocol>=0.7.7 22 | 23 | # device plugin: bitbox02 24 | bitbox02>=6.2.0 25 | 26 | # device plugin: jade 27 | cbor2>=5.4.6,<6.0.0 28 | pyserial>=3.5.0,<4.0.0 29 | 30 | # prefer older colorama to avoid needing hatchling 31 | # (pulled in via trezor -> click -> colorama) 32 | # (pulled in via safet -> click -> colorama) 33 | colorama<0.4.6 34 | -------------------------------------------------------------------------------- /contrib/requirements/requirements.txt: -------------------------------------------------------------------------------- 1 | qrcode 2 | protobuf>=3.20 3 | qdarkstyle>=3.2 4 | aiorpcx>=0.25.0,<0.26 5 | aiohttp>=3.11.0,<4.0.0 6 | aiohttp_socks>=0.9.2 7 | certifi 8 | attrs>=20.1.0 9 | jsonpatch 10 | electrum_ecc>=0.0.4,<0.1 11 | electrum_aionostr>=0.0.8,<0.1 12 | 13 | # Note that we also need the dnspython[DNSSEC] extra which pulls in cryptography, 14 | # but as that is not pure-python it cannot be listed in this file! 15 | dnspython>=2.2 16 | -------------------------------------------------------------------------------- /contrib/sign_packages: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os, sys 3 | 4 | if __name__ == '__main__': 5 | username = sys.argv[1] 6 | os.chdir("dist") 7 | for fname in os.listdir('.'): 8 | if fname.endswith('asc'): 9 | continue 10 | sig_name = fname + '.' + username + '.asc' 11 | os.system(f"gpg --sign --armor --detach --output {sig_name} {fname}") 12 | os.chdir("..") 13 | -------------------------------------------------------------------------------- /contrib/trigger_deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Triggers deploy.sh to maybe update the website or move binaries. 3 | # uploadserver needs to be defined in /etc/hosts 4 | 5 | SSHUSER=$1 6 | TRIGGERVERSION=$2 7 | if [ -z "$SSHUSER" ] || [ -z "$TRIGGERVERSION" ]; then 8 | echo "usage: $0 SSHUSER TRIGGERVERSION" 9 | echo "e.g. $0 thomasv 3.0.0" 10 | echo "e.g. $0 thomasv website" 11 | exit 1 12 | fi 13 | set -ex 14 | cd "$(dirname "$0")" 15 | 16 | if [ "$TRIGGERVERSION" == "website" ]; then 17 | rm -f trigger_website 18 | touch trigger_website 19 | echo "uploading file: trigger_website..." 20 | sftp -oBatchMode=no -b - "$SSHUSER@uploadserver" << ! 21 | cd electrum-downloads-airlock 22 | mput trigger_website 23 | bye 24 | ! 25 | else 26 | rm -f trigger_binaries 27 | printf "$TRIGGERVERSION" > trigger_binaries 28 | echo "uploading file: trigger_binaries..." 29 | sftp -oBatchMode=no -b - "$SSHUSER@uploadserver" << ! 30 | cd electrum-downloads-airlock 31 | mput trigger_binaries 32 | bye 33 | ! 34 | fi 35 | 36 | -------------------------------------------------------------------------------- /contrib/udev/20-hw1.rules: -------------------------------------------------------------------------------- 1 | # HW.1, Nano 2 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="1b7c|2b7c|3b7c|4b7c", TAG+="uaccess", TAG+="udev-acl" 3 | 4 | # Blue, NanoS, Aramis, HW.2, Nano X, NanoSP, Stax, Ledger Test, 5 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", TAG+="uaccess", TAG+="udev-acl" 6 | 7 | # Same, but with hidraw-based library (instead of libusb) 8 | KERNEL=="hidraw*", ATTRS{idVendor}=="2c97", MODE="0666" 9 | -------------------------------------------------------------------------------- /contrib/udev/51-coinkite.rules: -------------------------------------------------------------------------------- 1 | # Linux udev support file. 2 | # 3 | # This is a example udev file for HIDAPI devices which changes the permissions 4 | # to 0666 (world readable/writable) for a specific device on Linux systems. 5 | # 6 | # - Copy this file into /etc/udev/rules.d and unplug and re-plug your Coldcard. 7 | # - Udev does not have to be restarted. 8 | # 9 | 10 | # probably not needed: 11 | SUBSYSTEMS=="usb", ATTRS{idVendor}=="d13e", ATTRS{idProduct}=="cc10", GROUP="plugdev", MODE="0666" 12 | 13 | # required: 14 | # from 15 | KERNEL=="hidraw*", ATTRS{idVendor}=="d13e", ATTRS{idProduct}=="cc10", GROUP="plugdev", MODE="0666" 16 | 17 | -------------------------------------------------------------------------------- /contrib/udev/51-hid-digitalbitbox.rules: -------------------------------------------------------------------------------- 1 | SUBSYSTEM=="usb", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="dbb%n", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2402" 2 | -------------------------------------------------------------------------------- /contrib/udev/51-safe-t.rules: -------------------------------------------------------------------------------- 1 | # Put this file into /usr/lib/udev/rules.d or /etc/udev/rules.d 2 | 3 | # Archos Safe-T mini 4 | SUBSYSTEM=="usb", ATTR{idVendor}=="0e79", ATTR{idProduct}=="6000", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="safe-tr%n" 5 | KERNEL=="hidraw*", ATTRS{idVendor}=="0e79", ATTRS{idProduct}=="6000", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 6 | 7 | # Archos Safe-T mini Bootloader 8 | SUBSYSTEM=="usb", ATTR{idVendor}=="0e79", ATTR{idProduct}=="6001", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="safe-t%n" 9 | KERNEL=="hidraw*", ATTRS{idVendor}=="0e79", ATTRS{idProduct}=="6001", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 10 | 11 | -------------------------------------------------------------------------------- /contrib/udev/51-trezor.rules: -------------------------------------------------------------------------------- 1 | # Trezor: The Original Hardware Wallet 2 | # https://trezor.io/ 3 | # 4 | # Put this file into /etc/udev/rules.d 5 | # 6 | # If you are creating a distribution package, 7 | # put this into /usr/lib/udev/rules.d or /lib/udev/rules.d 8 | # depending on your distribution 9 | 10 | # Trezor 11 | SUBSYSTEM=="usb", ATTR{idVendor}=="534c", ATTR{idProduct}=="0001", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="trezor%n" 12 | KERNEL=="hidraw*", ATTRS{idVendor}=="534c", ATTRS{idProduct}=="0001", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 13 | 14 | # Trezor v2 15 | SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="53c0", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="trezor%n" 16 | SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="53c1", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="trezor%n" 17 | KERNEL=="hidraw*", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="53c1", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 18 | -------------------------------------------------------------------------------- /contrib/udev/51-usb-keepkey.rules: -------------------------------------------------------------------------------- 1 | # KeepKey: Your Private Bitcoin Vault 2 | # http://www.keepkey.com/ 3 | # Put this file into /usr/lib/udev/rules.d or /etc/udev/rules.d 4 | 5 | # KeepKey HID Firmware/Bootloader 6 | SUBSYSTEM=="usb", ATTR{idVendor}=="2b24", ATTR{idProduct}=="0001", MODE="0666", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="keepkey%n" 7 | KERNEL=="hidraw*", ATTRS{idVendor}=="2b24", ATTRS{idProduct}=="0001", MODE="0666", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 8 | 9 | # KeepKey WebUSB Firmware/Bootloader 10 | SUBSYSTEM=="usb", ATTR{idVendor}=="2b24", ATTR{idProduct}=="0002", MODE="0666", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="keepkey%n" 11 | KERNEL=="hidraw*", ATTRS{idVendor}=="2b24", ATTRS{idProduct}=="0002", MODE="0666", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" 12 | -------------------------------------------------------------------------------- /contrib/udev/52-hid-digitalbitbox.rules: -------------------------------------------------------------------------------- 1 | KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2402", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="dbbf%n" 2 | -------------------------------------------------------------------------------- /contrib/udev/53-hid-bitbox02.rules: -------------------------------------------------------------------------------- 1 | SUBSYSTEM=="usb", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="bitbox02_%n", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2403" 2 | -------------------------------------------------------------------------------- /contrib/udev/54-hid-bitbox02.rules: -------------------------------------------------------------------------------- 1 | KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2403", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="bitbox02-%n" 2 | -------------------------------------------------------------------------------- /contrib/udev/55-usb-jade.rules: -------------------------------------------------------------------------------- 1 | KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="jade%n" 2 | KERNEL=="ttyACM*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl", SYMLINK+="jade%n" 3 | -------------------------------------------------------------------------------- /contrib/upload.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # uploadserver is set in /etc/hosts 3 | # 4 | # env vars: 5 | # - ELECBUILD_UPLOADFROM 6 | # - SSHUSER 7 | 8 | set -ex 9 | 10 | PROJECT_ROOT="$(dirname "$(readlink -e "$0")")/.." 11 | CONTRIB="$PROJECT_ROOT/contrib" 12 | 13 | if [ -z "$SSHUSER" ]; then 14 | SSHUSER=thomasv 15 | fi 16 | 17 | cd "$PROJECT_ROOT" 18 | 19 | VERSION=$("$CONTRIB"/print_electrum_version.py) 20 | echo "$VERSION" 21 | 22 | if [ -z "$ELECBUILD_UPLOADFROM" ]; then 23 | cd "$PROJECT_ROOT/dist" 24 | else 25 | cd "$ELECBUILD_UPLOADFROM" 26 | fi 27 | 28 | 29 | # do not fail sftp if directory exists 30 | # see https://stackoverflow.com/questions/51437924/bash-shell-sftp-check-if-directory-exists-before-creating 31 | 32 | sftp -oBatchMode=no -b - "$SSHUSER@uploadserver" << ! 33 | cd electrum-downloads-airlock 34 | -mkdir "$VERSION" 35 | -chmod 777 "$VERSION" 36 | cd "$VERSION" 37 | -mput * 38 | -chmod 444 * # this prevents future re-uploads of same file 39 | bye 40 | ! 41 | 42 | "$CONTRIB/trigger_deploy.sh" "$SSHUSER" "$VERSION" 43 | -------------------------------------------------------------------------------- /electrum-env: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # This script creates a virtualenv named 'env' and installs all 4 | # python dependencies before activating the env and running Electrum. 5 | # If 'env' already exists, it is activated and Electrum is started 6 | # without any installations. Additionally, the PYTHONPATH environment 7 | # variable is set so that system packages such as e.g. apt installed 8 | # PyQt will also be visible. 9 | # 10 | # By default, only pure python dependencies are installed. 11 | # If you would like more extras to be installed, do e.g.: 12 | # $ source ./env/bin/activate 13 | # $ pip install -e '.[crypto,gui,hardware]' 14 | # $ deactivate 15 | 16 | set -e 17 | 18 | PYTHON_VER="$(python3 -c 'import sys; print(sys.version[:3])')" 19 | 20 | cd $(dirname $0) 21 | if [ -e ./env/bin/activate ]; then 22 | source ./env/bin/activate 23 | # FIXME what if this is an old directory and our requirements 24 | # changed in the meantime? should run "pip install -e . --upgrade" 25 | else 26 | python3 -m venv env 27 | source ./env/bin/activate 28 | pip install -e . 29 | fi 30 | 31 | export PYTHONPATH="$PYTHONPATH:"\ 32 | "/usr/local/lib/python${PYTHON_VER}/site-packages:"\ 33 | "/usr/local/lib/python${PYTHON_VER}/dist-packages:"\ 34 | "/usr/lib/python3/dist-packages:"\ 35 | "/usr/lib/python${PYTHON_VER}/site-packages:" 36 | 37 | 38 | ./run_electrum "$@" 39 | -------------------------------------------------------------------------------- /electrum.desktop: -------------------------------------------------------------------------------- 1 | # If you want Electrum to appear in a Linux app launcher ("start menu"), install this by doing: 2 | # sudo desktop-file-install electrum.desktop 3 | # Note: This assumes $HOME/.local/bin is in your $PATH 4 | 5 | [Desktop Entry] 6 | Comment=Lightweight Bitcoin Client 7 | Exec=electrum %u 8 | GenericName[en_US]=Bitcoin Wallet 9 | GenericName=Bitcoin Wallet 10 | Icon=electrum 11 | Name[en_US]=Electrum Bitcoin Wallet 12 | Name=Electrum Bitcoin Wallet 13 | Categories=Finance;Network; 14 | StartupNotify=true 15 | StartupWMClass=electrum 16 | Terminal=false 17 | Type=Application 18 | MimeType=x-scheme-handler/bitcoin;x-scheme-handler/lightning; 19 | Actions=Testnet; 20 | Keywords=crypto;currency;BTC 21 | 22 | [Desktop Action Testnet] 23 | Exec=electrum --testnet %u 24 | Name=Testnet mode 25 | -------------------------------------------------------------------------------- /electrum/_vendor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/_vendor/__init__.py -------------------------------------------------------------------------------- /electrum/_vendor/distutils/__init__.py: -------------------------------------------------------------------------------- 1 | """(part of) distutils, taken from the cpython standard library 2 | 3 | at commit https://github.com/python/cpython/tree/9d38120e335357a3b294277fd5eff0a10e46e043/Lib/distutils 4 | """ 5 | -------------------------------------------------------------------------------- /electrum/_vendor/pyperclip/README.md: -------------------------------------------------------------------------------- 1 | 2 | This is a stripped-down copy of the 3rd-party `pyperclip` package. 3 | 4 | It is used by the "text" GUI. 5 | 6 | At revision https://github.com/asweigart/pyperclip/blob/781603ea491eefce3b58f4f203bf748dbf9ff003/src/pyperclip/__init__.py 7 | (version 1.8.2) 8 | 9 | Modifications: 10 | - excluded most files 11 | - added support for pyqt6 12 | -------------------------------------------------------------------------------- /electrum/chains/regtest/servers.json: -------------------------------------------------------------------------------- 1 | { 2 | "127.0.0.1": { 3 | "pruning": "-", 4 | "s": "51002", 5 | "t": "51001", 6 | "version": "1.4" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /electrum/chains/signet/servers.json: -------------------------------------------------------------------------------- 1 | { 2 | "signet-electrumx.wakiyamap.dev": { 3 | "pruning": "-", 4 | "s": "50002", 5 | "t": "50001", 6 | "version": "1.4" 7 | }, 8 | "electrum.emzy.de": { 9 | "pruning": "-", 10 | "s": "53002", 11 | "version": "1.4" 12 | }, 13 | "mempool.space": { 14 | "pruning": "-", 15 | "s": "60602", 16 | "version": "1.4" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /electrum/chains/testnet/servers.json: -------------------------------------------------------------------------------- 1 | { 2 | "blackie.c3-soft.com": { 3 | "pruning": "-", 4 | "s": "57006", 5 | "t": "57005", 6 | "version": "1.4.5" 7 | }, 8 | "blockstream.info": { 9 | "pruning": "-", 10 | "s": "993", 11 | "t": "143", 12 | "version": "1.4" 13 | }, 14 | "electrum.blockstream.info": { 15 | "pruning": "-", 16 | "s": "60002", 17 | "t": "60001", 18 | "version": "1.4" 19 | }, 20 | "explorerzydxu5ecjrkwceayqybizmpjjznk5izmitf2modhcusuqlid.onion": { 21 | "pruning": "-", 22 | "t": "143", 23 | "version": "1.4" 24 | }, 25 | "testnet.aranguren.org": { 26 | "pruning": "-", 27 | "s": "51002", 28 | "t": "51001", 29 | "version": "1.4.2" 30 | }, 31 | "testnet.hsmiths.com": { 32 | "pruning": "-", 33 | "s": "53012", 34 | "version": "1.4.2" 35 | }, 36 | "testnet.qtornado.com": { 37 | "pruning": "-", 38 | "s": "51002", 39 | "t": "51001", 40 | "version": "1.5" 41 | }, 42 | "tn.not.fyi": { 43 | "pruning": "-", 44 | "s": "55002", 45 | "t": "55001", 46 | "version": "1.4" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /electrum/chains/testnet4/servers.json: -------------------------------------------------------------------------------- 1 | { 2 | "testnet4-electrumx.wakiyamap.dev": { 3 | "pruning": "-", 4 | "s": "51002", 5 | "t": "51001", 6 | "version": "1.4" 7 | }, 8 | "blackie.c3-soft.com": { 9 | "pruning": "-", 10 | "s": "57010", 11 | "t": "57009", 12 | "version": "1.4" 13 | }, 14 | "mempool.space": { 15 | "pruning": "-", 16 | "s": "40002", 17 | "version": "1.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /electrum/electrum: -------------------------------------------------------------------------------- 1 | ../run_electrum -------------------------------------------------------------------------------- /electrum/gui/__init__.py: -------------------------------------------------------------------------------- 1 | # To create a new GUI, please add its code to this directory. 2 | # Three objects are passed to the ElectrumGui: config, daemon and plugins 3 | # The Wallet object is instantiated by the GUI 4 | 5 | # Notifications about network events are sent to the GUI by using network.register_callback() 6 | 7 | from typing import TYPE_CHECKING, Mapping, Optional 8 | 9 | if TYPE_CHECKING: 10 | from . import qt 11 | from electrum.simple_config import SimpleConfig 12 | from electrum.daemon import Daemon 13 | from electrum.plugin import Plugins 14 | 15 | 16 | class BaseElectrumGui: 17 | def __init__(self, *, config: 'SimpleConfig', daemon: 'Daemon', plugins: 'Plugins'): 18 | self.config = config 19 | self.daemon = daemon 20 | self.plugins = plugins 21 | 22 | def main(self) -> None: 23 | raise NotImplementedError() 24 | 25 | def stop(self) -> None: 26 | """Stops the GUI. 27 | This method must be thread-safe. 28 | """ 29 | pass 30 | 31 | @classmethod 32 | def version_info(cls) -> Mapping[str, Optional[str]]: 33 | return {} 34 | -------------------------------------------------------------------------------- /electrum/gui/common_qt/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2023 The Electrum developers 2 | # Distributed under the MIT software license, see the accompanying 3 | # file LICENCE or http://www.opensource.org/licenses/mit-license.php 4 | 5 | -------------------------------------------------------------------------------- /electrum/gui/common_qt/i18n.py: -------------------------------------------------------------------------------- 1 | from PyQt6.QtCore import QTranslator 2 | 3 | from electrum.i18n import _ 4 | 5 | 6 | class ElectrumTranslator(QTranslator): 7 | """Delegator for Qt translations to gettext""" 8 | def __init__(self, parent=None): 9 | super().__init__(parent) 10 | 11 | # explicit enumeration of translatable strings from Qt standard library, so these 12 | # will be included in the electrum gettext translation template 13 | self._strings = [_('&Undo'), _('&Redo'), _('Cu&t'), _('&Copy'), _('&Paste'), _('Select All'), 14 | _('Copy &Link Location')] 15 | 16 | def translate(self, context, source_text: str, disambiguation, n): 17 | return _(source_text, context=context) 18 | -------------------------------------------------------------------------------- /electrum/gui/default_lang.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2023 The Electrum developers 2 | # Distributed under the MIT software license, see the accompanying 3 | # file LICENCE or http://www.opensource.org/licenses/mit-license.php 4 | # 5 | # Note: try not to import modules from electrum, or at least from GUIs. 6 | # This is to avoid evaluating module-level string-translations before we get 7 | # a chance to set the default language. 8 | 9 | import os 10 | from typing import Optional 11 | 12 | from electrum.i18n import languages 13 | 14 | 15 | jLocale = None 16 | if "ANDROID_DATA" in os.environ: 17 | from jnius import autoclass, cast 18 | jLocale = autoclass("java.util.Locale") 19 | 20 | 21 | def get_default_language(*, gui_name: Optional[str] = None) -> str: 22 | if gui_name == "qt": 23 | from PyQt6.QtCore import QLocale 24 | name = QLocale.system().name() 25 | return name if name in languages else "en_UK" 26 | elif gui_name == "qml": 27 | from PyQt6.QtCore import QLocale 28 | # On Android QLocale does not return the system locale 29 | try: 30 | name = str(jLocale.getDefault().toString()) 31 | except Exception: 32 | name = QLocale.system().name() 33 | return name if name in languages else "en_GB" 34 | return "" 35 | -------------------------------------------------------------------------------- /electrum/gui/fonts/PTMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/fonts/PTMono-Bold.ttf -------------------------------------------------------------------------------- /electrum/gui/fonts/PTMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/fonts/PTMono-Regular.ttf -------------------------------------------------------------------------------- /electrum/gui/icons/Electrum_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/Electrum_512.png -------------------------------------------------------------------------------- /electrum/gui/icons/Electrum_square_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/Electrum_square_512.png -------------------------------------------------------------------------------- /electrum/gui/icons/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/add.png -------------------------------------------------------------------------------- /electrum/gui/icons/anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/anchor.png -------------------------------------------------------------------------------- /electrum/gui/icons/android_electrum_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/android_electrum_icon_background.png -------------------------------------------------------------------------------- /electrum/gui/icons/android_electrum_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/android_electrum_icon_foreground.png -------------------------------------------------------------------------------- /electrum/gui/icons/android_electrum_icon_legacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/android_electrum_icon_legacy.png -------------------------------------------------------------------------------- /electrum/gui/icons/bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/bitcoin.png -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/bookmark.png -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/bookmark_add.png -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark_add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/bookmark_remove.png -------------------------------------------------------------------------------- /electrum/gui/icons/bookmark_remove.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /electrum/gui/icons/bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/bug.png -------------------------------------------------------------------------------- /electrum/gui/icons/camera_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/camera_dark.png -------------------------------------------------------------------------------- /electrum/gui/icons/camera_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/camera_white.png -------------------------------------------------------------------------------- /electrum/gui/icons/chevron-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/chevron-right.png -------------------------------------------------------------------------------- /electrum/gui/icons/clock1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock1.png -------------------------------------------------------------------------------- /electrum/gui/icons/clock2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock2.png -------------------------------------------------------------------------------- /electrum/gui/icons/clock3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock3.png -------------------------------------------------------------------------------- /electrum/gui/icons/clock4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock4.png -------------------------------------------------------------------------------- /electrum/gui/icons/clock5.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock5.pdn -------------------------------------------------------------------------------- /electrum/gui/icons/clock5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/clock5.png -------------------------------------------------------------------------------- /electrum/gui/icons/closebutton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/closebutton.png -------------------------------------------------------------------------------- /electrum/gui/icons/cloud_no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/cloud_no.png -------------------------------------------------------------------------------- /electrum/gui/icons/cloud_yes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/cloud_yes.png -------------------------------------------------------------------------------- /electrum/gui/icons/confirmed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/confirmed.png -------------------------------------------------------------------------------- /electrum/gui/icons/confirmed_bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/confirmed_bw.png -------------------------------------------------------------------------------- /electrum/gui/icons/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/copy.png -------------------------------------------------------------------------------- /electrum/gui/icons/copy_bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/copy_bw.png -------------------------------------------------------------------------------- /electrum/gui/icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/delete.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum.icns -------------------------------------------------------------------------------- /electrum/gui/icons/electrum.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum.ico -------------------------------------------------------------------------------- /electrum/gui/icons/electrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_dark_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_dark_icon.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_darkblue_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_darkblue_1.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_launcher.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_light_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_light_icon.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_presplash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_presplash.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrum_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrum_text.png -------------------------------------------------------------------------------- /electrum/gui/icons/electrumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/electrumb.png -------------------------------------------------------------------------------- /electrum/gui/icons/expired.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/expired.png -------------------------------------------------------------------------------- /electrum/gui/icons/eye1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/eye1.png -------------------------------------------------------------------------------- /electrum/gui/icons/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/file.png -------------------------------------------------------------------------------- /electrum/gui/icons/freeze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/freeze.png -------------------------------------------------------------------------------- /electrum/gui/icons/globe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/globe.png -------------------------------------------------------------------------------- /electrum/gui/icons/hamburger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/hamburger.png -------------------------------------------------------------------------------- /electrum/gui/icons/hd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/hd.png -------------------------------------------------------------------------------- /electrum/gui/icons/hd_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/hd_white.png -------------------------------------------------------------------------------- /electrum/gui/icons/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/info.png -------------------------------------------------------------------------------- /electrum/gui/icons/kangaroo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/kangaroo.png -------------------------------------------------------------------------------- /electrum/gui/icons/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/key.png -------------------------------------------------------------------------------- /electrum/gui/icons/lightning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/lightning.png -------------------------------------------------------------------------------- /electrum/gui/icons/lightning_disconnected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/lightning_disconnected.png -------------------------------------------------------------------------------- /electrum/gui/icons/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/link.png -------------------------------------------------------------------------------- /electrum/gui/icons/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/lock.png -------------------------------------------------------------------------------- /electrum/gui/icons/mail_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/mail_icon.png -------------------------------------------------------------------------------- /electrum/gui/icons/menu_vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/menu_vertical.png -------------------------------------------------------------------------------- /electrum/gui/icons/menu_vertical_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/menu_vertical_white.png -------------------------------------------------------------------------------- /electrum/gui/icons/network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/network.png -------------------------------------------------------------------------------- /electrum/gui/icons/nostr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/nostr.png -------------------------------------------------------------------------------- /electrum/gui/icons/offline_tx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/offline_tx.png -------------------------------------------------------------------------------- /electrum/gui/icons/paste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/paste.png -------------------------------------------------------------------------------- /electrum/gui/icons/pen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/pen.png -------------------------------------------------------------------------------- /electrum/gui/icons/picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/picture_in_picture.png -------------------------------------------------------------------------------- /electrum/gui/icons/preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/preferences.png -------------------------------------------------------------------------------- /electrum/gui/icons/qr_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/qr_file.png -------------------------------------------------------------------------------- /electrum/gui/icons/qrcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/qrcode.png -------------------------------------------------------------------------------- /electrum/gui/icons/qrcode_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/qrcode_white.png -------------------------------------------------------------------------------- /electrum/gui/icons/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/question.png -------------------------------------------------------------------------------- /electrum/gui/icons/revealer_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/revealer_c.png -------------------------------------------------------------------------------- /electrum/gui/icons/rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/rocket.png -------------------------------------------------------------------------------- /electrum/gui/icons/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/save.png -------------------------------------------------------------------------------- /electrum/gui/icons/script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/script.png -------------------------------------------------------------------------------- /electrum/gui/icons/script_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/script_white.png -------------------------------------------------------------------------------- /electrum/gui/icons/seal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/seal.png -------------------------------------------------------------------------------- /electrum/gui/icons/seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/seed.png -------------------------------------------------------------------------------- /electrum/gui/icons/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/share.png -------------------------------------------------------------------------------- /electrum/gui/icons/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/spinner.gif -------------------------------------------------------------------------------- /electrum/gui/icons/status_connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_connected.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_connected_fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_connected_fork.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_connected_proxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_connected_proxy.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_connected_proxy_fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_connected_proxy_fork.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_disconnected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_disconnected.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_lagging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_lagging.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_lagging_fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_lagging_fork.png -------------------------------------------------------------------------------- /electrum/gui/icons/status_waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/status_waiting.png -------------------------------------------------------------------------------- /electrum/gui/icons/sweep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/sweep.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_addresses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_addresses.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_coins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_coins.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_console.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_contacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_contacts.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_history.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_receive.png -------------------------------------------------------------------------------- /electrum/gui/icons/tab_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tab_send.png -------------------------------------------------------------------------------- /electrum/gui/icons/tor_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/tor_logo.png -------------------------------------------------------------------------------- /electrum/gui/icons/unconfirmed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/unconfirmed.png -------------------------------------------------------------------------------- /electrum/gui/icons/unlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/unlock.png -------------------------------------------------------------------------------- /electrum/gui/icons/unpaid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/unpaid.png -------------------------------------------------------------------------------- /electrum/gui/icons/update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/update.png -------------------------------------------------------------------------------- /electrum/gui/icons/wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/wallet.png -------------------------------------------------------------------------------- /electrum/gui/icons/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/warning.png -------------------------------------------------------------------------------- /electrum/gui/icons/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spesmilo/electrum/468f496f347860253d5700a0849927a268b3ce90/electrum/gui/icons/zoom.png -------------------------------------------------------------------------------- /electrum/gui/qml/android_res/layout/scanner_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | 14 | 28 | 29 |