Full Code of BTCPrivate/electrum-btcp for AI

master 709449fc32f4 cached
257 files
1.8 MB
555.2k tokens
2958 symbols
1 requests
Download .txt
Showing preview only (1,982K chars total). Download the full file or copy to clipboard to get everything.
Repository: BTCPrivate/electrum-btcp
Branch: master
Commit: 709449fc32f4
Files: 257
Total size: 1.8 MB

Directory structure:
gitextract_plcqy8dy/

├── .gitignore
├── .idea/
│   ├── electrum.iml
│   ├── misc.xml
│   ├── modules.xml
│   └── vcs.xml
├── .travis.yml
├── AUTHORS
├── Dockerfile
├── Info.plist
├── LICENCE
├── MANIFEST.in
├── README.rst
├── RELEASE-NOTES
├── app.fil
├── brewfile
├── build-docker.sh
├── clean.sh
├── config
├── contrib/
│   ├── build-wine/
│   │   ├── README.md
│   │   ├── build-electrum-git.sh
│   │   ├── build.sh
│   │   ├── deterministic.spec
│   │   ├── electrum.nsi
│   │   ├── prepare-hw.sh
│   │   ├── prepare-pyinstaller.sh
│   │   └── prepare-wine.sh
│   ├── freeze_packages.sh
│   ├── make_apk
│   ├── make_download
│   ├── make_locale
│   ├── make_packages
│   ├── requirements.txt
│   └── sign_packages
├── create-dmg.sh
├── docs/
│   └── release-tests.md
├── electrum-btcp
├── electrum-env
├── electrum.conf.sample
├── electrum.desktop
├── gui/
│   ├── __init__.py
│   ├── kivy/
│   │   ├── Makefile
│   │   ├── Readme.txt
│   │   ├── __init__.py
│   │   ├── data/
│   │   │   ├── fonts/
│   │   │   │   └── tron/
│   │   │   │       ├── License.txt
│   │   │   │       └── Readme.txt
│   │   │   ├── glsl/
│   │   │   │   ├── default.fs
│   │   │   │   ├── default.vs
│   │   │   │   ├── header.fs
│   │   │   │   └── header.vs
│   │   │   ├── images/
│   │   │   │   └── defaulttheme.atlas
│   │   │   ├── java-classes/
│   │   │   │   └── org/
│   │   │   │       └── electrum/
│   │   │   │           └── qr/
│   │   │   │               └── SimpleScannerActivity.java
│   │   │   └── style.kv
│   │   ├── i18n.py
│   │   ├── main.kv
│   │   ├── main_window.py
│   │   ├── nfc_scanner/
│   │   │   ├── __init__.py
│   │   │   ├── scanner_android.py
│   │   │   └── scanner_dummy.py
│   │   ├── tools/
│   │   │   ├── bitcoin_intent.xml
│   │   │   ├── blacklist.txt
│   │   │   └── buildozer.spec
│   │   └── uix/
│   │       ├── __init__.py
│   │       ├── combobox.py
│   │       ├── context_menu.py
│   │       ├── dialogs/
│   │       │   ├── __init__.py
│   │       │   ├── amount_dialog.py
│   │       │   ├── bump_fee_dialog.py
│   │       │   ├── checkbox_dialog.py
│   │       │   ├── choice_dialog.py
│   │       │   ├── fee_dialog.py
│   │       │   ├── fx_dialog.py
│   │       │   ├── installwizard.py
│   │       │   ├── label_dialog.py
│   │       │   ├── nfc_transaction.py
│   │       │   ├── password_dialog.py
│   │       │   ├── qr_dialog.py
│   │       │   ├── qr_scanner.py
│   │       │   ├── question.py
│   │       │   ├── seed_options.py
│   │       │   ├── settings.py
│   │       │   ├── tx_dialog.py
│   │       │   └── wallets.py
│   │       ├── drawer.py
│   │       ├── gridview.py
│   │       ├── menus.py
│   │       ├── qrcodewidget.py
│   │       ├── screens.py
│   │       └── ui_screens/
│   │           ├── about.kv
│   │           ├── address.kv
│   │           ├── history.kv
│   │           ├── invoice.kv
│   │           ├── invoices.kv
│   │           ├── network.kv
│   │           ├── proxy.kv
│   │           ├── receive.kv
│   │           ├── requests.kv
│   │           ├── send.kv
│   │           ├── server.kv
│   │           └── status.kv
│   ├── qt/
│   │   ├── __init__.py
│   │   ├── address_dialog.py
│   │   ├── address_list.py
│   │   ├── amountedit.py
│   │   ├── console.py
│   │   ├── contact_list.py
│   │   ├── fee_slider.py
│   │   ├── history_list.py
│   │   ├── installwizard.py
│   │   ├── invoice_list.py
│   │   ├── main_window.py
│   │   ├── network_dialog.py
│   │   ├── password_dialog.py
│   │   ├── paytoedit.py
│   │   ├── qrcodewidget.py
│   │   ├── qrtextedit.py
│   │   ├── qrwindow.py
│   │   ├── request_list.py
│   │   ├── seed_dialog.py
│   │   ├── transaction_dialog.py
│   │   ├── util.py
│   │   └── utxo_list.py
│   ├── stdio.py
│   └── text.py
├── icns-from-vector.sh
├── icons/
│   └── electrum.icns
├── icons.qrc
├── lib/
│   ├── __init__.py
│   ├── base_wizard.py
│   ├── bitcoin.py
│   ├── blockchain.py
│   ├── checkpoints.json
│   ├── checkpoints_testnet.json
│   ├── coinchooser.py
│   ├── commands.py
│   ├── contacts.py
│   ├── currencies.json
│   ├── daemon.py
│   ├── dnssec.py
│   ├── equihash.py
│   ├── exchange_rate.py
│   ├── i18n.py
│   ├── interface.py
│   ├── jsonrpc.py
│   ├── keystore.py
│   ├── mnemonic.py
│   ├── msqr.py
│   ├── network.py
│   ├── old_mnemonic.py
│   ├── paymentrequest.proto
│   ├── paymentrequest.py
│   ├── paymentrequest_pb2.py
│   ├── pem.py
│   ├── plot.py
│   ├── plugins.py
│   ├── qrscanner.py
│   ├── ripemd.py
│   ├── rsakey.py
│   ├── segwit_addr.py
│   ├── servers-orig.json
│   ├── servers.json
│   ├── servers_testnet.json
│   ├── simple_config.py
│   ├── storage.py
│   ├── synchronizer.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_bitcoin.py
│   │   ├── test_interface.py
│   │   ├── test_mnemonic.py
│   │   ├── test_simple_config.py
│   │   ├── test_storage_upgrade.py
│   │   ├── test_transaction.py
│   │   ├── test_util.py
│   │   ├── test_wallet.py
│   │   └── test_wallet_vertical.py
│   ├── transaction.py
│   ├── util.py
│   ├── verifier.py
│   ├── version.py
│   ├── wallet.py
│   ├── websockets.py
│   ├── wordlist/
│   │   ├── chinese_simplified.txt
│   │   ├── english.txt
│   │   ├── japanese.txt
│   │   ├── portuguese.txt
│   │   └── spanish.txt
│   └── x509.py
├── packages.txt
├── plugins/
│   ├── README
│   ├── __init__.py
│   ├── audio_modem/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── cosigner_pool/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── digitalbitbox/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── digitalbitbox.py
│   │   └── qt.py
│   ├── email_requests/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── greenaddress_instant/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── hw_wallet/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── plugin.py
│   │   └── qt.py
│   ├── keepkey/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── clientbase.py
│   │   ├── cmdline.py
│   │   ├── keepkey.py
│   │   ├── plugin.py
│   │   ├── qt.py
│   │   └── qt_generic.py
│   ├── labels/
│   │   ├── __init__.py
│   │   ├── kivy.py
│   │   ├── labels.py
│   │   └── qt.py
│   ├── ledger/
│   │   ├── __init__.py
│   │   ├── auth2fa.py
│   │   ├── cmdline.py
│   │   ├── ledger.py
│   │   └── qt.py
│   ├── trezor/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── clientbase.py
│   │   ├── cmdline.py
│   │   ├── plugin.py
│   │   ├── qt.py
│   │   ├── qt_generic.py
│   │   └── trezor.py
│   ├── trustedcoin/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── qt.py
│   │   └── trustedcoin.py
│   └── virtualkeyboard/
│       ├── __init__.py
│       └── qt.py
├── pubkeys/
│   ├── Animazing.asc
│   ├── ThomasV.asc
│   ├── kyuupichan.asc
│   └── wozz.asc
├── requirements.txt
├── requirements_travis.txt
├── run-docker.sh
├── scripts/
│   ├── bip70
│   ├── block_headers
│   ├── estimate_fee
│   ├── get_history
│   ├── peers
│   ├── servers
│   ├── txradar
│   ├── util.py
│   └── watch_address
├── setup-mac.sh
├── setup-release.py
├── setup.py
├── snap/
│   └── snapcraft.yaml
└── tox.ini

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
####-*.patch
*.pyc
*.swp
build/
dist/
*.egg/
/electrum.py
.DS_Store
contrib/pyinstaller/
Electrum_BTCP.egg-info/
gui/qt/icons_rc.py
locale/
.devlocaltmp/
*_trial_temp
packages
env/
.tox/
.buildozer/
bin/

# tox files
.cache/
.coverage

# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries


================================================
FILE: .idea/electrum.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
  <component name="NewModuleRootManager">
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/pkg" isTestSource="false" />
    </content>
    <orderEntry type="jdk" jdkName="Python 3.6 (electrum)" jdkType="Python SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
  <component name="TestRunnerService">
    <option name="PROJECT_TEST_RUNNER" value="Unittests" />
  </component>
</module>

================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6 (electrum)" project-jdk-type="Python SDK" />
</project>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/electrum.iml" filepath="$PROJECT_DIR$/.idea/electrum.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: .travis.yml
================================================
sudo: false
language: python
python:
    - 3.5
    - 3.6
install:
  - pip install -r requirements_travis.txt
cache:
  - pip
script:
    - tox
after_success:
    - if [ "$TRAVIS_BRANCH" = "master" ]; then pip install pycurl requests && contrib/make_locale; fi
    - coveralls


================================================
FILE: AUTHORS
================================================
ThomasV - Creator and maintainer.
Animazing / Tachikoma - Styled the new GUI. Mac version.
Azelphur - GUI stuff.
Coblee - Alternate coin support and py2app support.
Deafboy - Ubuntu packages.
EagleTM - Bugfixes.
ErebusBat - Mac distribution.
Genjix - Porting pro-mode functionality to lite-gui and worked on server
Slush - Work on the server. Designed the original Stratum spec.
Julian Toash (Tuxavant) - Various fixes to the client.
rdymac - Website and translations.
kyuupichan - Miscellaneous.

================================================
FILE: Dockerfile
================================================
FROM ubuntu:18.04

ENV VERSION 1.0.0

RUN set -x \
    && apt-get update \
    && apt-get install -y curl \
    && curl -sL https://github.com/BTCPrivate/electrum-btcp/archive/P!${VERSION}.tar.gz |tar xvz \
    && mv electrum-btcp-P-${VERSION} electrum-btcp \
    && cd electrum-btcp \
    && apt-get install -y $(grep -vE "^\s*#" packages.txt  | tr "\n" " ") \
    && pip3 install -r requirements.txt \
    && pip3 install pyblake2 \
    && protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto \
    && pyrcc5 icons.qrc -o gui/qt/icons_rc.py \
    && ./contrib/make_locale

WORKDIR /electrum-btcp

ENV DISPLAY :0

CMD ./electrum




================================================
FILE: Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleURLTypes</key>
  <array>
    <dict>
      <key>CFBundleURLName</key>
      <string>bitcoinprivate</string>
      <key>CFBundleURLSchemes</key>
      <array>
        <string>bitcoinprivate</string>
      </array>
    </dict>
  </array>
  <key>LSArchitecturePriority</key>
  <array>
    <string>x86_64</string>
    <string>i386</string>
  </array>
</dict>
</plist>


================================================
FILE: LICENCE
================================================
The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: MANIFEST.in
================================================
include LICENCE RELEASE-NOTES AUTHORS
include README.rst
include electrum.conf.sample
include electrum.desktop
include *.py
include electrum
recursive-include lib *.py
recursive-include gui *.py
recursive-include plugins *.py
recursive-include packages *.py
recursive-include packages cacert.pem
include app.fil
include icons.qrc
recursive-include icons *
recursive-include scripts *



================================================
FILE: README.rst
================================================
BTCP Electrum - Lightweight Bitcoin Private Wallet
==========================================
.. image:: https://opencollective.com/electrum-btcp/backers/badge.svg

    :alt: Backers on Open Collective

    :target: #backers

.. image:: https://opencollective.com/electrum-btcp/sponsors/badge.svg

    :alt: Sponsors on Open Collective

    :target: #sponsors



Download the current Release: https://github.com/BTCPrivate/electrum-btcp/releases/


Viewing & Sending from Z addresses is not yet supported on this wallet.


Know about your data directory:

    Linux & Mac: ~/.electrum-btcp/
    Windows: C:\Users\YourUserName\AppData\Roaming\Electrum-btcp\

    ~/.electrum-btcp/wallets/ has your wallet files - BACK UP THIS FOLDER

You can also use the 'Export Private Keys' and 'Show Seed' functions from inside the application to write down and safely store your the keys to your funds.

Please use the issue tracker for bug reports, feature requests, and other mission-critical information. It is actively monitored by the Zclassic development team. For general support, please visit our Discord: https://discord.gg/2PRZ5q

Development Version
===================

First, clone from Github::

    git clone git://github.com/BTCPrivate/electrum-btcp.git
    cd electrum-btcp

For Mac:
--------

Using Homebrew::

    # Setup Homebrew
    ./setup-mac

    # Install Homebrew dependencies
    brew bundle

    # Install Python dependencies
    pip3 install -r requirements.txt

    # Build icons
    pyrcc5 icons.qrc -o gui/qt/icons_rc.py

    # Compile the protobuf description file
    protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto

    # Build .app, .dmg
    ./create-dmg

    # Run
    ./electrum-btcp


For Linux:
----------

Install Dependencies::

  sudo apt-get install $(grep -vE "^\s*#" packages.txt  | tr "\n" " ")

  pip install -r requirements.txt

  // ^ pip3 for newer version

  (Ubuntu with ledger wallet)
  ln -s /lib/x86_64-linux-gnu/libudev.so.1 /lib/x86_64-linux-gnu/libudev.so

  # For yum installations (no apt-get), or for a clean python env, use Anaconda with Python 3:

  #https://poweruphosting.com/blog/install-anaconda-python-ubuntu-16-04/


Compile the icons file for Qt::

    pyrcc5 icons.qrc -o gui/qt/icons_rc.py

For the Linux app launcher (start menu) icon::

    sudo desktop-file-install electrum.desktop

Compile the protobuf description file::

    protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto

Create translations (optional)::

    ./contrib/make_locale

Run::

    ./electrum-btcp

For Ubuntu 18.04 including Docker install:
----------------------

Update apt package index and upgrade packages as needed

    sudo apt-get update && apt-get upgrade

Install Docker package from Ubuntu repository

    sudo apt install docker.io

Build the docker image::

    sudo ./build-docker.sh

Run the docker image::

    ./run-docker.sh


For Linux with docker:
----------------------

Build the docker image::

    ./build-docker.sh

Run the docker image::

    ./run-docker.sh


Building Releases
=================


MacOS
------

Simply - ::

    ./setup-mac.sh

    sudo ./create-dmg.sh

Windows
-------

See `contrib/build-wine/README` file.


Android
-------

See `gui/kivy/Readme.txt` file.
UPSTREAM PATCH: https://github.com/spesmilo/electrum/blob/master/gui/kivy/Readme.md

---

To just create binaries, create the 'packages/' directory::

    ./contrib/make_packages

(This directory contains the Python dependencies used by Electrum.)


BTCP Hints and Debug
===================

There are several useful scripts in:

    scripts

This is a good initial check to determine whether things are working:

    cd scripts
    python3 block_headers

--

The Zclassic Wiki is located at: https://github.com/z-classic/zclassic/wiki. Please use this as a reference and feel free to contribute.

    ~/.electrum-btcp/

    ~/.electrum-btcp/wallets/ has your wallet files - ** back up this folder **

    ~/.electrum-btcp/config has your Electrum connection object.

Credits

+++++++

Contributors

------------

This project exists thanks to all the people who contribute! 

.. image:: https://opencollective.com/electrum-btcp/contributors.svg?width=890&button=false

Backers

-------

Thank you to all our backers! `Become a backer`__.

.. image:: https://opencollective.com/electrum-btcp/backers.svg?width=890

    :target: https://opencollective.com/electrum-btcp#backers

__ Backer_

.. _Backer: https://opencollective.com/electrum-btcp#backer

Sponsors

--------

Support us by becoming a sponsor. Your logo will show up here with a link to your website. `Become a sponsor`__.

.. image:: https://opencollective.com/electrum-btcp/sponsor/0/avatar.svg

    :target: https://opencollective.com/electrum-btcp/sponsor/0/website

__ Sponsor_

.. _Sponsor: https://opencollective.com/electrum-btcp#sponsor



Original Project Info
---------------------
::

  Forked from **spesmilo/electrum**: https://github.com/spesmilo/electrum

  Licence: MIT Licence
  Author: Thomas Voegtlin
  Language: Python (GUI: Qt, Kivy)
  Platforms: Windows, Mac, Linux, Android
  Homepage: https://electrum.org/


.. image:: https://travis-ci.org/spesmilo/electrum.svg?branch=master
    :target: https://travis-ci.org/spesmilo/electrum
    :alt: Build Status
.. image:: https://coveralls.io/repos/github/spesmilo/electrum/badge.svg?branch=master
    :target: https://coveralls.io/github/spesmilo/electrum?branch=master
    :alt: Test coverage statistics


---

The Bitcoin Private Team


================================================
FILE: RELEASE-NOTES
================================================
# Release 3.0.5 : (Security update)

This is a follow-up to the 3.0.4 release, which did not completely fix
issue #3374. Users should upgrade to 3.0.5.

 * The JSONRPC interface is password protected
 * JSONRPC commands are disabled if the GUI is running, except 'ping',
   which is used to determine if a GUI is already running


# Release 3.0.4 : (Security update)

 * Fix a vulnerability caused by Cross-Origin Resource Sharing (CORS)
   in the JSONRPC interface. Previous versions of Electrum are
   vulnerable to port scanning and deanonimization attacks from
   malicious websites. Wallets that are not password-protected are
   vulnerable to theft.
 * Bundle QR scanner with Android app
 * Minor bug fixes

# Release 3.0.3
  * Qt GUI: sweeping now uses the Send tab, allowing fees to be set
  * Windows: if using the installer binary, there is now a separate shortcut
    for "Electrum Testnet"
  * Digital Bitbox: added suport for p2sh-segwit
  * OS notifications for incoming transactions
  * better transaction size estimation:
    - fees for segwit txns were somewhat underestimated (#3347)
    - some multisig txns were underestimated
    - handle uncompressed pubkeys
  * fix #3321: testnet for Windows binaries
  * fix #3264: Ledger/dbb signing on some platforms
  * fix #3407: KeepKey sending to p2sh output
  * other minor fixes and usability improvements

# Release 3.0.2
  * Android: replace requests tab with address tab, with access to
    private keys
  * sweeping minikeys: search for both compressed and uncompressed
    pubkeys
  * fix wizard crash when attempting to reset Google Authenticator
  * fix #3248: fix Ledger+segwit signing
  * fix #3262: fix SSL payment request signing
  * other minor fixes.

# Release 3.0.1
  * minor bug and usability fixes

# Release 3.0 - Uncanny Valley (November 1st, 2017)

  * The project was migrated to Python3 and Qt5. Python2 is no longer
    supported. If you cloned the source repository, you will need to
    run "python3 setup.py install" in order to install the new
    dependencies.

  * Segwit support: 

    - Native segwit scripts are supported using a new type of
      seed. The version number for segwit seeds is 0x100. The install
      wizard will not create segwit seeds by default; users must
      opt-in with the segwit option.

    - Native segwit scripts are represented using bech32 addresses,
      following BIP173. Please note that BIP173 is still in draft
      status, and that other wallets/websites may not support
      it. Thus, you should keep a non-segwit wallet in order to be
      able to receive bitcoins during the transition period. If BIP173
      ends up being rejected or substantially modified, your wallet
      may have to be restored from seed. This will not affect funds
      sent to bech32 addresses, and it will not affect the capacity of
      Electrum to spend these funds.

    - Segwit scripts embedded in p2sh are supported with hardware
      wallets or bip39 seeds. To create a segwit-in-p2sh wallet,
      trezor/ledger users will need to enter a BIP49 derivation path.

    - The BIP32 master keys of segwit wallets are serialized using new
      version numbers. The new version numbers encode the script type,
      and they result in the following prefixes:

         * xpub/xprv : p2pkh or p2sh
         * ypub/yprv : p2wpkh-in-p2sh
         * Ypub/Yprv : p2wsh-in-p2sh
         * zpub/zprv : p2wpkh
         * Zpub/Zprv : p2wsh

      These values are identical for mainnet and testnet; tpub/tprv
      prefixes are no longer used in testnet wallets.

    - The Wallet Import Format (WIF) is similarly extended for segwit
      scripts. After a base58-encoded key is decoded to binary, its
      first byte encodes the script type:

         * 128 + 0: p2pkh
         * 128 + 1: p2wpkh
         * 128 + 2: p2wpkh-in-p2sh
         * 128 + 5: p2sh
         * 128 + 6: p2wsh
         * 128 + 7: p2wsh-in-p2sh

      The distinction between p2sh and p2pkh in private key means that
      it is not possible to import a p2sh private key and associate it
      to a p2pkh address.

  * A new version of the Electrum protocol is required by the client
    (version 1.1). Servers using older versions of the protocol will
    not be displayed in the GUI.

  * By default, transactions are time-locked to the height of the
    current block. Other values of locktime may be passed using the
    command line.


# Release 2.9.3
  * fix configuration file issue #2719
  * fix ledger signing of non-RBF transactions
  * disable 'spend confirmed only' option by default

# Release 2.9.2
  * force headers download if headers file is corrupted
  * add websocket to windows builds

# Release 2.9.1
  * fix initial headers download
  * validate contacts on import
  * command-line option for locktime

# Release 2.9 - Independence (July 27th, 2017)
  * Multiple Chain Validation: Electrum will download and validate
    block headers sent by servers that may follow different branches
    of a fork in the Bitcoin blockchain. Instead of a linear sequence,
    block headers are organized in a tree structure. Branching points
    are located efficiently using binary search. The purpose of MCV is
    to detect and handle blockchain forks that are invisible to the
    classical SPV model.
  * The desired branch of a blockchain fork can be selected using the
    network dialog. Branches are identified by the hash and height of
    the diverging block. Coin splitting is possible using RBF
    transaction (a tutorial will be added).
  * Multibit support: If the user enters a BIP39 seed (or uses a
    hardware wallet), the full derivation path is configurable in the
    install wizard.
  * Option to send only confirmed coins
  * Qt GUI:
    - Network dialog uses tabs and gets updated by network events.
    - The gui tabs use icons
  * Kivy GUI:
    - separation between network dialog and wallet settings dialog.
    - option for manual server entry
    - proxy configuration
  * Daemon: The wallet password can be passed as parameter to the
    JSONRPC API.
  * Various other bugfixes and improvements.


# Release 2.8.3
  * Fix crash on reading older wallet formats.
  * TrustedCoin: remove pay-per-tx option

# Release 2.8.2
  * show paid invoices in history tab
  * improve CPFP dialog
  * fixes for trezor, keepkey
  * other minor bugfixes

# Release 2.8.1
  * fix Digital Bitbox plugin
  * fix daemon jsonrpc
  * fix trustedcoin wallet creation
  * other minor bugfixes

# Release 2.8.0 (March 9, 2017)
  * Wallet file encryption using ECIES: A keypair is derived from the
    wallet password. Once the wallet is decrypted, only the public key
    is retained in memory, in order to save the encrypted file.
  * The daemon requires wallets to be explicitly loaded before
    commands can use them. Wallets can be loaded using: 'electrum
    daemon load_wallet [-w path]'. This command will require a
    password if the wallet is encrypted.
  * Invoices and contacts are stored in the wallet file and are no
    longer shared between wallets. Previously created invoices and
    contacts files may be imported from the menu.
  * Fees improvements:
    - Dynamic fees are enabled by default.
    - Child Pays For Parent (CPFP) dialog in the GUI.
    - RBF is automatically proposed for low fee transactions.
  * Support for Segregated Witness (testnet only).
  * Support for Digital Bitbox hardware wallet.
  * The GUI shows a blue icon when connected using a proxy.

# Release 2.7.18
  * enforce https on exchange rate APIs
  * use hardcoded list of exchanges
  * move 'Freeze' menu to Coins (utxo) tab
  * various bugfixes

# Release 2.7.17
  * fix a few minor regressions in the Qt GUI

# Release 2.7.16
  * add Testnet support (fix #541)
  * allow daemon to be launched in the foreground (fix #1873)
  * Qt: use separate tabs for addresses and UTXOs
  * Qt: update fee slider with a network callback
  * Ledger: new ui and mobile 2fa validation (neocogent)

# Release 2.7.15
  * Use fee slider for both static and dynamic fees.
  * Add fee slider to RBF dialog (fix #2083).
  * Simplify fee preferences.
  * Critical: Fix password update issue (#2097). This bug prevents
    password updates in multisig and 2FA wallets. It may also cause
    wallet corruption if the wallet contains several master private
    keys (such as 2FA wallets that have been restored from
    seed). Affected wallets will need to be restored again.

# Release 2.7.14
  * Merge exchange_rate plugin with main code
  * Faster synchronization and transaction creation
  * Fix bugs #2096, #2016

# Release 2.7.13
  * fix message signing with imported keys
  * add size to transaction details window
  * move plot plugin to main code
  * minor bugfixes

# Release 2.7.12
  various bugfixes

# Release 2.7.11
  * fix offline signing (issue #195)
  * fix android crashes caused by threads

# Release 2.7.10
  * various fixes for hardware wallets
  * improve fee bumping
  * separate sign and broadcast buttons in Qt tx dialog
  * allow spaces in private keys

# Release 2.7.9
  * Fix a bug with the ordering of pubkeys in recent multisig wallets.
    Affected wallets will regenerate their public keys when opened for
    the first time. This bug does not affect address generation.
  * Fix hardware wallet issues #1975, #1976

# Release 2.7.8
  * Fix a bug with fee bumping
  * Fix crash when parsing request (issue #1969)

# Release 2.7.7
  * Fix utf8 encoding bug with old wallet seeds (issue #1967)
  * Fix delete request from menu (isue #1968)

# Release 2.7.6
 * Fixes a critical bug with imported private keys (issue #1966). Keys
   imported in Electrum 2.7.x were not encrypted, even if the wallet
   had a password. If you imported private keys using Electrum 2.7.x,
   you will need to import those keys again. If you imported keys in
   2.6 and converted with 2.7.x, you don't need to do anything, but
   you still need to upgrade in order to be able to spend.
 * Wizard: Hide seed options in a popup dialog.

# Release 2.7.5
 * Add number of confirmations to request status. (issue #1757)
 * In the GUI, refer to passphrase as 'seed extension'.
 * Fix bug with utf8 encoded passphrases.
 * Kivy wizard: add a dialog for seed options.
 * Kivy wizard: add current word to suggestions, because some users
   don't see the space key.

# Release 2.7.4
 * Fix private key import in wizard
 * Fix Ledger display (issue #1961)
 * Fix old watching-only wallets (issue #1959)
 * Fix Android compatibility (issue #1947)

# Release 2.7.3
 * fix Trezor and Keepkey support in Windows builds
 * fix sweep private key dialog
 * minor fixes: #1958, #1959

# Release 2.7.2
 * fix bug in password update (issue #1954)
 * fix fee slider (issue #1953)

# Release 2.7.1
 * fix wizard crash with old seeds
 * fix issue #1948: fee slider

# Release 2.7.0 (Oct 2 2016)

 * The wallet file format has been upgraded. This upgrade is not
   backward compatible, which means that a wallet upgraded to the 2.7
   format will not be readable by earlier versions of
   Electrum. Multiple accounts inside the same wallet are not
   supported in the new format; the Qt GUI will propose to split any
   wallet that has several accounts. Make sure that you have saved
   your seed phrase before you upgrade Electrum.
 * This version introduces a separation between wallets types and
   keystores types. 'Wallet type' defines the type of Bitcoin contract
   used in the wallet, while 'keystore type' refers to the method used
   to store private keys. Therefore, so-called 'hardware wallets' will
   be referred to as 'hardware keystores'.
 * Hardware keystores:
   - The Ledger Nano S is supported.
   - Hardware keystores can be used as cosigners in multi-signature
     wallets.
   - Multiple hardware cosigners can be used in the same multisig
     wallet. One icon per keystore is displayed in the satus bar. Each
     connected device will co-sign the transaction.
 * Replace-By-Fee: RBF transactions are supported in both Qt and
   Android. A warning is displayed in the history for transactions
   that are replaceable, have unconfirmed parents, or that have very
   low fees.
 * Dynamic fees: Dynamic fees are enabled by default. A slider allows
   the user to select the expected confirmation time of their
   transaction. The expected confirmation times of incoming
   transactions is also displayed in the history.
 * The install wizards of Qt and Kivy have been unified.
 * Qt GUI (Desktop):
   - A fee slider is visible in the in send tab
   - The Address tab is hidden by default, can be shown with Ctrl-A
   - UTXOs are displayed in the Address tab
 * Kivy GUI (Android):
   - The GUI displays the complete transaction history.
   - Multisig wallets are supported.
   - Wallets can be created and deleted in the GUI.
 * Seed phrases can be extended with a user-chosen passphrase. The
   length of seed phrases is standardized to 12 words, using 132 bits
   of entropy (including 2FA seeds). In the wizard, the type of the
   seed is displayed in the seed input dialog.
 * TrustedCoin users can request a reset of their Google Authenticator
   account, if they still have their seed.


# Release 2.6.4 (bugfixes)
 * fix coinchooser bug (#1703)
 * fix daemon JSONRPC (#1731)
 * fix command-line broadcast (#1728)
 * QT: add colors to labels

# Release 2.6.3 (bugfixes)
 * fix command line parsing of transactions
 * fix signtransaction --privkey (#1715)

# Release 2.6.2 (bugfixes)
 * fix Trustedcoin restore from seed (bug #1704)
 * small improvements to kivy GUI

# Release 2.6.1 (bugfixes)
 * fix broadcast command (bug #1688)
 * fix tx dialog (bug #1690)
 * kivy: support old-type seed phrases in wizard

# Release 2.6
 * The source code is relicensed under the MIT Licence
 * First official release of the Kivy GUI, with android APK
 * The old 'android' and 'gtk' GUIs are deprecated
 * Separation between plugins and GUIs
 * The command line uses jsonrpc to communicate with the daemon
 * New command: 'notify <address> <url>'
 * Alternative coin selection policy, designed to help preserve user
   privacy. Enable it by setting the Coin Selection preference to
   Privacy.
 * The install wizard has been rewritten and improved
 * Support minikeys as used in Casascius coins for private key import
   and sweeping
 * Much improved support for TREZOR and KeepKey devices:
   - full device information display
   - initialize a new or wiped device in 4 ways:
     1) device generates a new wallet
     2) you enter a seed
     3) you enter a BIP39 mnemonic to generate the seed
     4) you enter a master private key
   - KeepKey secure seed recovery (KeepKey only)
   - change / set / disable PIN
   - set homescreen (TREZOR only)
   - set a session timeout.  Once a session has timed out, further use
     of the device requires your PIN and passhphrase to be re-entered
   - enable / disable passphrases
   - device wipe
   - multiple device support

# Release 2.5.4
 * increase MIN_RELAY_TX_FEE to avoid dust transactions

# Release 2.5.3 (bugfixes)
 * installwizard: do not allow direct copy-paste of the seed
 * installwizard: fix bug #1531 (starting offline)

# Release 2.5.2 (bugfixes)
 * fix bug #1513 (client tries to broadcast transaction while not connected)
 * fix synchronization bug (#1520)
 * fix command line bug (#1494)
 * fixes for exchange rate plugin

# Release 2.5.1 (bugfixes)
 * signatures in transactions were still using the old class
 * make sure that setup.py uses python2
 * fix wizard crash with trustedcoin plugin
 * fix socket infinite loop
 * fix history bug #1479

# Release 2.5
 * Low-S values are used in signatures (BIP 62).
 * The Kivy GUI has been merged into master.
 * The Qt GUI supports multiple windows in the same process. When a
   new Electrum instance is started, it checks for an already running
   Electrum process, and connects to it.
 * The network layer uses select(), so all server communication is
   handled by a single thread. Moreover, the synchronizer, verifier,
   and exchange rate plugin now run as separate jobs within the
   networking thread instead of as their own threads.
 * Plugins are revamped, particularly the exchange rate plugin.

# Release 2.4.4
 * Fix bug with TrustedCoin plugin

# Release 2.4.3
 * Support for KeepKey hardware wallet
 * Simplified Chinese wordlist
 * Minor bugfixes and GUI tweaks

# Release 2.4.2
 * Command line can read arguments from stdin (pipe)
 * Speedup fee computation for large transactions
 * Various bugfixes

# Release 2.4.1
 * Use ssl.PROTOCOL_TLSv1
 * Fix DNSSEC issues with ECDSA signatures
 * Replace TLSLite dependency with minimal RSA implementation
 * Dynamic Fees: using estimatefee value returned by server
 * Various GUI improvements

# Release 2.4
 * Payment to DNS names storing a Bitcoin addresses (OpenAlias) is
   supported directly, without activating a plugin. The verification
   uses DNSSEC.
 * The DNSSEC verification code was rewritten. The previous code,
   which was part of the OpenAlias plugin, is vulnerable and should
   not be trusted (Electrum 2.0 to 2.3).
 * Payment requests can be signed using Bitcoin addresses stored
   in DNS (OpenAlias). The identity of the requestor is verified using
   DNSSEC.
 * Payment requests signed with OpenAlias keys can be shared as
   bitcoin: URIs, if they are simple (a single address-type
   output). The BIP21 URI scheme is extended with 'name', 'sig',
   'time', 'exp'.
 * Arbitrary m-of-n multisig wallets are supported (n<=15).
 * Multisig transactions can be signed with TREZOR. When you create
   the multisig wallet, just enter the xpub of your existing TREZOR
   wallet.
 * Transaction fees set manually in the GUI are retained, including
   when the user uses the '!' shortcut.
 * New 'email' plugin, that enables sending and receiving payment
   requests by email.
 * The daemon supports Websocket notifications of payments.

# Release 2.3.3
 * fix proxy settings (issue #1309)
 * improvements to the transaction dialog:
    - request password after showing transaction
    - show change addresses in yellow color

# Release 2.3.2
 * minor bugfixes
 * updated ledger plugin
 * sort inputs/outputs lexicographically (BIP-LI01)

# Release 2.3.1
 * patch a bug with payment requests

# Release 2.3
 * Improved logic for the network layer.
 * More efficient coin selection. Spend oldest coins first, and
   minimize the number of transaction inputs.
 * Plugins are loaded independently of the GUI. As a result, Openalias,
   TrustedCoin and TREZOR wallets can be used with the command
   line. Example: 'electrum payto <openalias> <amount>'
 * The command line has been refactored:
  - Arguments are parsed with argparse.
  - The inline help includes a description of options.
  - Some commands have been renamed. Notably, 'mktx' and 'payto' have
    been merged into a single command, with a --broadcast option.
   Type 'electrum --help' for a complete overview.
 * The command line accepts the '!' syntax to send the maximum
   amount available. It can be combined with the '--from' option.
   Example: 'payto <destination> ! --from <from_address>'
 * The command line also accepts a '?' shortcut for private keys
   arguments, that triggers a prompt.
 * Payment requests can be managed with the command line, using the
   following commands: 'addrequest', 'rmrequest', 'listrequests'.
   Payment requests can be signed with a SSL certificate, and published
   as bip70 files in a public web directory. To see the relevant
   configuration variables, type 'electrum addrequest --help'
 * Commands can be called with jsonrpc, using the 'jsonrpc' gui. The
   jsonrpc interface may be called by php.

# Release 2.2
 * Show amounts (thousands separators and decimal point)
   according to locale in GUI
 * Show unmatured coins in balance
 * Fix exchange rates plugin
 * Network layer: refactoring and fixes

# Release 2.1.1
 * patch a bug that prevents new wallet creation.
 * fix connection issue on osx binaries

# Release 2.1
 * Faster startup, thanks to the following optimizations:
   1. Transaction input/outputs are cached in the wallet file
   2. Fast X509 certificate parser, not using pyasn1 anymore.
   3. The Label Sync plugin only requests modified labels.
 * The 'Invoices' and 'Send' tabs have been merged.
 * Contacts are stored in a separate file, shared between wallets.
 * A Search Box is available in the GUI (Ctrl-S)
 * Payment requests have an expiration date and can be exported to
   BIP70 files.
 * file: scheme support in BIP72 URIs: "bitcoin:?r=file:///..."
 * Own addresses are shown in green in the Transaction dialog.
 * Address History dialog.
 * The OpenAlias plugin was improved.
 * Various bug fixes and GUI improvements.
 * A new LabelSync backend is being used an import of the old
   database was made but since the release came later it's
   recommended that you do a full push when you upgrade.

# Release 2.0.4 - Minor GUI improvements
 * The password dialog will ask for password again if the user enters
   a wrong password
 * The Master Public Key dialog displays which keys belong to the
   wallet, and which are cosigners
 * The transaction dialog will ask to save unsaved transaction
   received from cosigner pool, when user clicks on 'Close'
 * The multisig restore dialog accepts xprv keys.
 * The network daemon must be started explicitly before using commands
   that require a connection
   Example:
     electrum daemon start
     electrum getaddressunspent <addr>
     electrum daemon status
     electrum daemon stop
   If a daemon is running, the GUI will use it.

# Release 2.0.3 - bugfixes and minor GUI improvements
 * Do not use daemon threads (fix #960)
 * Add a zoom button to receive tab
 * Add exchange rate conversion to receive tab
 * Use Tor's default port number in default proxy config

# Release 2.0.2 - bugfixes
 * Fix transaction sweep (#1066)
 * Fix thread timing bug (#1054)

# Release 2.0.1 - bugfixes
 * Fix critical bug in TREZOR address derivation: passphrases were not
   NFKD normalized. TREZOR users who created a wallet protected by a
   passphrase containing utf-8 characters with diacritics are
   affected. These users will have to open their wallet with version
   2.0 and to move their funds to a new wallet.
 * Use a file socket for the daemon (fixes network dialog issues)
 * Fix crash caused by QR scanner icon when zbar not installed.
 * Fix CosignerPool plugin
 * Label Sync plugin: Fix label sharing between multisig wallets


# Release 2.0

 * Before you upgrade, make sure you have saved your wallet seed on
   paper.

 * Documentation is now hosted on a wiki: http://electrum.orain.org

 * New seed derivation method (not compatible with BIP39). The seed
   phrase includes a version number, that refers to the wallet
   structure. The version number also serves as a checksum, and it
   will prevent the import of seeds from incompatible wallets. Old
   Electrum seeds are still supported.

 * New address derivation (BIP32). Standard wallets are single account
   and use a gap limit of 20.

 * Support for Multisig wallets using parallel BIP32 derivations and
   P2SH addresses ("2 of 2", "2 of 3").

 * Compact serialization format for unsigned or partially signed
   transactions, that includes the BIP32 master public key and
   derivation needed to sign inputs. Serialized transactions can be
   sent to cosigners or to cold storage using QR codes (using Andreas
   Schildbach's base 43 idea).

 * Support for BIP70 payment requests:
   - Verification of the chain of signatures uses tlslite.
   - In the GUI, payment requests are shown in the 'Invoices' tab.

 * Support for hardware wallets: TREZOR (SatoshiLabs) and Btchip (Ledger).

 * Two-factor authentication service by TrustedCoin. This service uses
   "2 of 3" multisig wallets and Google Authenticator. Note that
   wallets protected by this service can be deterministically restored
   from seed, without Trustedcoin's server.

 * Cosigner Pool plugin: encrypted communication channel for multisig
   wallets, to send and receive partially signed transactions.

 * Audio Modem plugin: send and receive transactions by sound.

 * OpenAlias plugin: send bitcoins to aliases verified using DNSSEC.

 * New 'Receive' tab in the GUI:
   - create and manage payment requests, with QR Codes
   - the former 'Receive' tab was renamed to 'Addresses'
   - the former Point of Sale plugin is replaced by a resizeable
     window that pops up if you click on the QR code

 * The 'Send' tab in the Qt GUI supports transactions with multiple
   outputs, and raw hexadecimal scripts.

 * The GUI can connect to the Electrum daemon: "electrum -d" will
   start the daemon if it is not already running, and the GUI will
   connect to it. The daemon can serve several clients. It times out
   if no client uses if for more than 5 minutes.

 * The install wizard can be used to import addresses or private
   keys. A watching-only wallet is created by entering a list of
   addresses in the wizard dialog.

 * New file format: Wallets files are saved as JSON. Note that new
   wallet files cannot be read by older versions of Electrum. Old
   wallet files will be converted to the new format; this operation
   may take some time, because public keys will be derived for each
   address of your wallet.

 * The client accepts servers with a CA-signed SSL certificate.

 * ECIES encrypt/decrypt methods, availabe in the GUI and using
   the command line:
      encrypt <pubkey> <message>
      decrypt <pubkey> <message>

 * The Android GUI has received various updates and it is much more
   stable. Another script was added to Android, called Authenticator,
   that works completely offline: it reads an unsigned transaction
   shown as QR code, signs it and shows the result as a QR code.


# Release 1.9.8

* Electrum servers were upgraded to version 0.9. The new server stores
  a Patrica tree of all UTXOs, an idea proposed by Alan Reiner in the
  bitcointalk forum. This property allows the client to directly
  request the balance of any address. The new commands are:
     1. getaddressbalance <address>
     2. getaddressunspent <address>
     3. getutxoaddress <txid> <pos>

* Command-line commands that require a connection to the network spawn
  a daemon, that remains connected and handles subsequent
  commands. The daemon terminates itself if it remains unused for more
  than one minute. The purpose of this is to make scripting more
  efficient. For example, a bash script using many electrum commands
  will open only one connection.

# Release 1.9.7
* Fix for offline signing
* Various bugfixes
* GUI usability improvements
* Coinbase Buyback plugin

# Release 1.9.6
* During wallet creation, do not write seed to disk until it is encrypted.
* Confirmation dialog if the transaction fee is higher than 1mBTC.
* bugfixes

# Release 1.9.5

* Coin control: select addresses to send from
* Put addresses that have been used in a minimized section (Qt GUI)
* Allow non ascii chars in passwords


# Release 1.9.4
bugfixes: offline transactions

# Release 1.9.3
bugfixes: connection problems, transactions staying unverified

# Release 1.9.2
* fix a syntax error

# Release 1.9.1
* fix regression with --offline mode
* fix regression with --portable mode: use a dedicated directory

# Release 1.9

* The client connects to multiple servers in order to retrieve block headers and find the longest chain
* SSL certificate validation (to prevent MITM)
* Deterministic signatures (RFC 6979)
* Menu to create/restore/open wallets
* Create transactions with multiple outputs from CSV (comma separated values)
* New text gui: stdio
* Plugins are no longer tied to the qt GUI, they can reach all GUIs
* Proxy bugs have been fixed


# Release 1.8.1

* Notification option when receiving new tranactions
* Confirm dialogue before sending large amounts
* Alternative datafile location for non-windows systems
* Fix offline wallet creation
* Remove enforced tx fee
* Tray icon improvements
* Various bugfixes


# Release 1.8

* Menubar in classic gui
* Updated the QR Code plugin to enable offline/online wallets to transmit unsigned/signed transactions via QR code.
* Fixed bug where never-confirmed transactions prevented further spending


# Release 1.7.4

* Increase default fee
* fix create and restore in command line
* fix verify message in the gui


# Release 1.7.3:

* Classic GUI can display amounts in mBTC
* Account selector in the classic GUI
* Changed the way the portable flag uses without supplying a -w argument
* Classic GUI asks users to enter their seed on wallet creation


# Release 1.7.2:

* Transactions that are in the same block are displayed in chronological order in the history.
* The client computes transaction priority and rejects zero-fee transactions that need a fee.
* The default fee was lowered to 200 uBTC per kb.
* Due to an internal format change, your history may be pruned when
  you open your wallet for the first time after upgrading to 1.7.2. If
  this is the case, please visit a full server to restore your full
  history. You will only need to do that once.


# Release 1.7.1:  bugfixes.


# Release 1.7

* The Classic GUI can be extended with plugins. Developers who want to
add new features or third-party services to Electrum are invited to
write plugins. Some previously existing and non-essential features of
Electrum (point-of-sale mode, qrcode scanner) were removed from the
core and are now available as plugins.

* The wallet waits for 2 confirmations before creating new
addresses. This makes recovery from seed more robust. Note that it
might create unwanted gaps if you use Electrum 1.7 together with older
versions of Electrum.

* An interactive Python console replaces the 'Wall' tab. The provided
python environment gives users access to the wallet and gui. Most
electrum commands are available as python function in the
console. Custom scripts an be loaded with a "run(filename)"
command. Tab-completions are available.

* The location of the Electrum folder in Windows changed from
LOCALAPPDATA to APPDATA. Discussion on this topic can be found here:
https://bitcointalk.org/index.php?topic=144575.0

* Private keys can be exported from within the classic GUI:
  For a single address, use the address menu (right-click).
  To export the keys of your entire wallet, use the settings dialog (import/export tab).

* It is possible to create, sign and redeem multisig transaction using the
command line interface.  This is made possible by the following new commands:
    dumpprivkey, listunspent, createmultisig, createrawtransaction, decoderawtransaction, signrawtransaction
The syntax of these commands is similar to their bitcoind counterpart.
For an example, see Gavin's tutorial: https://gist.github.com/gavinandresen/3966071

* Offline wallets now work in a way similar to Armory:
  1. user creates an unsigned transaction using the online (watching-only) wallet.
  2. unsigned transaction is copied to the offline computer, and signed by the offline wallet.
  3. signed transaction is copied to the online computer, broadcasted by the online client.
  4. All these steps can be done via the command line interface or the classic GUI.

* Many command line commands have been renamed in order to make the syntax consistent with bitcoind.

# Release 1.6.2

== Classic GUI
* Added new version notification

# Release 1.6.1 (11-01-2013)

== Core
* It is now possible to restore a wallet from MPK (this will create a watching-only wallet)
* A switch button allows to easily switch between Lite and Classic GUI.

== Classic GUI
* Seed and MPK help dialogs were rewritten
* Point of Sale: requested amounts can be expressed in other currencies and are converted to bitcoin.

== Lite GUI
* The receiving button was removed in favor of a menu item to keep it consistent with the history toggle.

# Release 1.6.0 (07-01-2013)

== Core
* (Feature) Add support for importing, signing and verifiying compressed keys
* (Feature) Auto reconnect to random server on disconnect
* (Feature) Ultimate fallback to HTTP port 80 if TCP doesn't work on any server
* (Bug) Under rare circumstances changing password with incorrect password could damage wallet

== Lite GUI
* (Chore) Use blockchain.info for exchange rate data
* (Feature) added currency conversion for BRL, CNY, RUB
* (Feature) Saraha theme
* (Feature) csv import/export for transactions including labels

== Classic GUI
* (Chore) pruning servers now called "p", full servers "f" to avoid confusion with terms
* (Feature) Debits in history shown in red
* (Feature) csv import/export for transactions including labels

# Release 1.5.8 (02-01-2013)

== Core
* (Bug) Fix pending address balance on received coins for pruning servers
* (Bug) Fix history command line option to show output again (regression by SPV)
* (Chore) Add timeout to blockchain headers file download by HTTP
* (Feature) new option: -L, --language: default language used in GUI.

== Lite GUI
* (Bug) Sending to auto-completed contacts works again
* (Chore) Added version number to title bar

== Classic GUI
* (Feature) Language selector in options.

# Release 1.5.7 (18-12-2012)

== Core
* The blockchain headers file is no longer included in the packages, it is downloaded on startup.
* New command line option: -P or --portable, for portable wallets. With this flag, all preferences are saved to the wallet file, and the blockchain headers file is in the same directory as the wallet

== Lite GUI
* (Feature) Added the ability to export your transactions to a CSV file.
* (Feature) Added a label dialog after sending a transaction.
* (Feature) Reworked receiving addresses; instead of a random selection from one of your receiving addresses a new widget will show listing unused addresses.
* (Chore)   Removed server selection. With all the new server options a simple menu item does not suffice anymore.


================================================
FILE: app.fil
================================================
gui/qt/__init__.py
gui/qt/main_window.py
gui/qt/history_list.py
gui/qt/contact_list.py
gui/qt/invoice_list.py
gui/qt/request_list.py
gui/qt/installwizard.py
gui/qt/network_dialog.py
gui/qt/password_dialog.py
gui/qt/util.py
gui/qt/seed_dialog.py
gui/qt/transaction_dialog.py
gui/qt/address_dialog.py
gui/qt/qrcodewidget.py
gui/qt/qrtextedit.py
gui/qt/qrwindow.py
gui/kivy/main.kv
gui/kivy/main_window.py
gui/kivy/uix/dialogs/__init__.py
gui/kivy/uix/dialogs/fee_dialog.py
gui/kivy/uix/dialogs/installwizard.py
gui/kivy/uix/dialogs/settings.py
gui/kivy/uix/dialogs/wallets.py
gui/kivy/uix/ui_screens/history.kv
gui/kivy/uix/ui_screens/receive.kv
gui/kivy/uix/ui_screens/send.kv
plugins/labels/qt.py
plugins/trezor/qt.py
plugins/virtualkeyboard/qt.py


================================================
FILE: brewfile
================================================
tap "caskroom/cask"
brew "python3"
brew  "protobuf"
# brew "zbar" -
brew "gmp"
# required by gmpy
brew "gettext"
tap "brewsci/science"
brew "matplotlib"
# required for matplotlib used in Plot History
brew "libusb-compat"
# ledger wallet


================================================
FILE: build-docker.sh
================================================
#!/bin/bash

docker build -t electrum-btcp:latest .


================================================
FILE: clean.sh
================================================
#!/bin/bash

sudo rm -rf build/
sudo rm -rf dist/
sudo rm -rf __pycache__
sudo rm -rf Electrum_BTCP.egg-info
sudo rm -rf /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Electrum_BTCP-*



================================================
FILE: config
================================================
{
    "server": "35.224.186.7:50001:t" 
 }


================================================
FILE: contrib/build-wine/README.md
================================================
Windows Binary Builds
=====================

These scripts can be used for cross-compilation of Windows Electrum executables from Linux/Wine.
Produced binaries are deterministic so you should be able to generate binaries that match the official releases.


Usage:


1. Install the following dependencies:

 - dirmngr
 - gpg
 - Wine (>= v2)


For example:


```
$ sudo apt-get install wine-development dirmngr gnupg2
$ sudo ln -sf /usr/bin/wine-development /usr/local/bin/wine
$ wine --version
 wine-2.0 (Debian 2.0-3+b2)
```

or

```
$ pacman -S wine gnupg
$ wine --version
 wine-2.21
```

2. Make sure `/opt` is writable by the current user.
3. Run `build.sh`.
4. The generated binaries are in `./dist`.


================================================
FILE: contrib/build-wine/build-electrum-git.sh
================================================
#!/bin/bash

NAME_ROOT=electrum
PYTHON_VERSION=3.5.4

# These settings probably don't need any change
export WINEPREFIX=/opt/wine64
export PYTHONDONTWRITEBYTECODE=1
export PYTHONHASHSEED=22

PYHOME=c:/python$PYTHON_VERSION
PYTHON="wine $PYHOME/python.exe -OO -B"


# Let's begin!
cd `dirname $0`
set -e

cd tmp

for repo in electrum electrum-locale electrum-icons; do
    if [ -d $repo ]; then
	cd $repo
	git pull
	git checkout master
	cd ..
    else
	URL=https://github.com/spesmilo/$repo.git
	git clone -b master $URL $repo
    fi
done

pushd electrum-locale
for i in ./locale/*; do
    dir=$i/LC_MESSAGES
    mkdir -p $dir
    msgfmt --output-file=$dir/electrum.mo $i/electrum.po || true
done
popd

pushd electrum
if [ ! -z "$1" ]; then
    git checkout $1
fi

VERSION=`git describe --tags`
echo "Last commit: $VERSION"
find -exec touch -d '2000-11-11T11:11:11+00:00' {} +
popd

rm -rf $WINEPREFIX/drive_c/electrum
cp -r electrum $WINEPREFIX/drive_c/electrum
cp electrum/LICENCE .
cp -r electrum-locale/locale $WINEPREFIX/drive_c/electrum/lib/
cp electrum-icons/icons_rc.py $WINEPREFIX/drive_c/electrum/gui/qt/

# Install frozen dependencies
$PYTHON -m pip install -r ../../requirements.txt

pushd $WINEPREFIX/drive_c/electrum
$PYTHON setup.py install
popd

cd ..

rm -rf dist/

# build standalone and portable versions
wine "C:/python$PYTHON_VERSION/scripts/pyinstaller.exe" --noconfirm --ascii --name $NAME_ROOT-$VERSION -w deterministic.spec

# set timestamps in dist, in order to make the installer reproducible
pushd dist
find -exec touch -d '2000-11-11T11:11:11+00:00' {} +
popd

# build NSIS installer
# $VERSION could be passed to the electrum.nsi script, but this would require some rewriting in the script iself.
wine "$WINEPREFIX/drive_c/Program Files (x86)/NSIS/makensis.exe" /DPRODUCT_VERSION=$VERSION electrum.nsi

cd dist
mv electrum-setup.exe $NAME_ROOT-$VERSION-setup.exe
cd ..

echo "Done."
md5sum dist/electrum*exe


================================================
FILE: contrib/build-wine/build.sh
================================================
#!/bin/bash
# Lucky number
export PYTHONHASHSEED=22

if [ ! -z "$1" ]; then
    to_build="$1"
fi

here=$(dirname "$0")

echo "Clearing $here/build and $here/dist..."
rm $here/build/* -rf
rm $here/dist/* -rf

$here/prepare-wine.sh && \
$here/prepare-pyinstaller.sh && \
$here/prepare-hw.sh || exit 1

echo "Resetting modification time in C:\Python..."
# (Because of some bugs in pyinstaller)
pushd /opt/wine64/drive_c/python*
find -exec touch -d '2000-11-11T11:11:11+00:00' {} +
popd
ls -l /opt/wine64/drive_c/python*

$here/build-electrum-git.sh $to_build && \
echo "Done."


================================================
FILE: contrib/build-wine/deterministic.spec
================================================
# -*- mode: python -*-

from PyInstaller.utils.hooks import collect_data_files, collect_submodules

import sys
import os
for i, x in enumerate(sys.argv):
    if x == '--name':
        cmdline_name = sys.argv[i+1]
        break
else:
    raise BaseException('no name')

home = os.getcwd()+'\\'

# see https://github.com/pyinstaller/pyinstaller/issues/2005
hiddenimports = []
# hiddenimports += collect_submodules('trezorlib')
# hiddenimports += collect_submodules('btchip')
# hiddenimports += collect_submodules('keepkeylib')

datas = [
    (home+'lib/currencies.json', 'electrum'),
    (home+'lib/servers.json', 'electrum'),
    (home+'lib/checkpoints.json', 'electrum'),
    (home+'lib/servers_testnet.json', 'electrum'),
    (home+'lib/checkpoints_testnet.json', 'electrum'),
    (home+'lib/wordlist/english.txt', 'electrum/wordlist'),
#    (home+'lib/locale', 'electrum/locale'),
    (home+'plugins', 'electrum_plugins'),
]
# datas += collect_data_files('trezorlib')
# datas += collect_data_files('btchip')
# datas += collect_data_files('keepkeylib')

# We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports
a = Analysis([home+'electrum-btcp',
              home+'gui/qt/main_window.py',
              home+'gui/text.py',
              home+'lib/util.py',
              home+'lib/wallet.py',
              home+'lib/simple_config.py',
              home+'lib/bitcoin.py',
              home+'lib/dnssec.py',
              home+'lib/commands.py',
              home+'plugins/cosigner_pool/qt.py',
              home+'plugins/email_requests/qt.py',
              #home+'plugins/trezor/client.py',
              #home+'plugins/trezor/qt.py',
              #home+'plugins/keepkey/qt.py',
              #home+'plugins/ledger/qt.py',
              #home+'packages/requests/utils.py'
              ],
             datas=datas,
             #pathex=[home+'lib', home+'gui', home+'plugins'],
             hiddenimports=hiddenimports,
             hookspath=[])


# http://stackoverflow.com/questions/19055089/pyinstaller-onefile-warning-pyconfig-h-when-importing-scipy-or-scipy-signal
for d in a.datas:
    if 'pyconfig' in d[0]: 
        a.datas.remove(d)
        break

# hotfix for #3171 (pre-Win10 binaries)
a.binaries = [x for x in a.binaries if not x[1].lower().startswith(r'c:\windows')]

pyz = PYZ(a.pure)


#####
# "standalone" exe with all dependencies packed into it

exe_standalone = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas, 
    name=os.path.join('build\\pyi.win32\\electrum-btcp', cmdline_name + ".exe"),
    debug=False,
    strip=None,
    upx=False,
    icon=home+'icons/electrum.ico',
    console=False)
    # console=True makes an annoying black box pop up, but it does make Electrum output command line commands, with this turned off no output will be given but commands can still be used

# exe_portable = EXE(
    # pyz,
    # a.scripts,
    # a.binaries,
    # a.datas,
    # name=os.path.join('build\\pyi.win32\\electrum', cmdline_name + "-portable.exe"),
    # debug=False,
    # strip=None,
    # upx=False,
    # icon=home+'icons/electrum.ico',
    # console=False)

# #####
# # exe and separate files that NSIS uses to build installer "setup" exe

# exe_dependent = EXE(
    # pyz,
    # a.scripts,
    # exclude_binaries=True,
    # name=os.path.join('build\\pyi.win32\\electrum', cmdline_name),
    # debug=False,
    # strip=None,
    # upx=False,
    # icon=home+'icons/electrum.ico',
    # console=False)

# coll = COLLECT(
    # exe_dependent,
    # a.binaries,
    # a.zipfiles,
    # a.datas,
    # strip=None,
    # upx=True,
    # debug=False,
    # icon=home+'icons/electrum.ico',
    # console=False,
    # name=os.path.join('dist', 'electrum'))


================================================
FILE: contrib/build-wine/electrum.nsi
================================================
;--------------------------------
;Include Modern UI
  !include "TextFunc.nsh" ;Needed for the $GetSize fuction. I know, doesn't sound logical, it isn't.
  !include "MUI2.nsh"
  
;--------------------------------
;Variables

  !define PRODUCT_NAME "Electrum"
  !define PRODUCT_WEB_SITE "https://github.com/spesmilo/electrum"
  !define PRODUCT_PUBLISHER "Electrum Technologies GmbH"
  !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

;--------------------------------
;General

  ;Name and file
  Name "${PRODUCT_NAME}"
  OutFile "dist/electrum-setup.exe"

  ;Default installation folder
  InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

  ;Get installation folder from registry if available
  InstallDirRegKey HKCU "Software\${PRODUCT_NAME}" ""

  ;Request application privileges for Windows Vista
  RequestExecutionLevel admin

  ;Specifies whether or not the installer will perform a CRC on itself before allowing an install
  CRCCheck on
  
  ;Sets whether or not the details of the install are shown. Can be 'hide' (the default) to hide the details by default, allowing the user to view them, or 'show' to show them by default, or 'nevershow', to prevent the user from ever seeing them.
  ShowInstDetails show
  
  ;Sets whether or not the details of the uninstall  are shown. Can be 'hide' (the default) to hide the details by default, allowing the user to view them, or 'show' to show them by default, or 'nevershow', to prevent the user from ever seeing them.
  ShowUninstDetails show
  
  ;Sets the colors to use for the install info screen (the default is 00FF00 000000. Use the form RRGGBB (in hexadecimal, as in HTML, only minus the leading '#', since # can be used for comments). Note that if "/windows" is specified as the only parameter, the default windows colors will be used.
  InstallColors /windows
  
  ;This command sets the compression algorithm used to compress files/data in the installer. (http://nsis.sourceforge.net/Reference/SetCompressor)
  SetCompressor /SOLID lzma
  
  ;Sets the dictionary size in megabytes (MB) used by the LZMA compressor (default is 8 MB).
  SetCompressorDictSize 64
  
  ;Sets the text that is shown (by default it is 'Nullsoft Install System vX.XX') in the bottom of the install window. Setting this to an empty string ("") uses the default; to set the string to blank, use " " (a space).
  BrandingText "${PRODUCT_NAME} Installer v${PRODUCT_VERSION}" 
  
  ;Sets what the titlebars of the installer will display. By default, it is 'Name Setup', where Name is specified with the Name command. You can, however, override it with 'MyApp Installer' or whatever. If you specify an empty string (""), the default will be used (you can however specify " " to achieve a blank string)
  Caption "${PRODUCT_NAME}"

  ;Adds the Product Version on top of the Version Tab in the Properties of the file.
  VIProductVersion 1.0.0.0
  
  ;VIAddVersionKey - Adds a field in the Version Tab of the File Properties. This can either be a field provided by the system or a user defined field.
  VIAddVersionKey ProductName "${PRODUCT_NAME} Installer"
  VIAddVersionKey Comments "The installer for ${PRODUCT_NAME}"
  VIAddVersionKey CompanyName "${PRODUCT_NAME}"
  VIAddVersionKey LegalCopyright "2013-2016 ${PRODUCT_PUBLISHER}"
  VIAddVersionKey FileDescription "${PRODUCT_NAME} Installer"
  VIAddVersionKey FileVersion ${PRODUCT_VERSION}
  VIAddVersionKey ProductVersion ${PRODUCT_VERSION}
  VIAddVersionKey InternalName "${PRODUCT_NAME} Installer"
  VIAddVersionKey LegalTrademarks "${PRODUCT_NAME} is a trademark of ${PRODUCT_PUBLISHER}" 
  VIAddVersionKey OriginalFilename "${PRODUCT_NAME}.exe"

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING
  !define MUI_ABORTWARNING_TEXT "Are you sure you wish to abort the installation of ${PRODUCT_NAME}?"
  
  !define MUI_ICON "tmp\electrum\icons\electrum.ico"
  
;--------------------------------
;Pages

  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

;Check if we have Administrator rights
Function .onInit
	UserInfo::GetAccountType
	pop $0
	${If} $0 != "admin" ;Require admin rights on NT4+
		MessageBox mb_iconstop "Administrator rights required!"
		SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
		Quit
	${EndIf}
FunctionEnd

Section
  SetOutPath $INSTDIR

  ;Uninstall previous version files
  RMDir /r "$INSTDIR\*.*"
  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*"
  
  ;Files to pack into the installer
  File /r "dist\electrum\*.*"
  File "..\..\icons\electrum.ico"

  ;Store installation folder
  WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR

  ;Create uninstaller
  DetailPrint "Creating uninstaller..."
  WriteUninstaller "$INSTDIR\Uninstall.exe"

  ;Create desktop shortcut
  DetailPrint "Creating desktop shortcut..."
  CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" ""

  ;Create start-menu items
  DetailPrint "Creating start-menu items..."
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\Uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" "" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" 0
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} Testnet.lnk" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" "--testnet" "$INSTDIR\electrum-${PRODUCT_VERSION}.exe" 0


  ;Links bitcoinprivate: URI's to Electrum
  WriteRegStr HKCU "Software\Classes\bitcoin" "" "URL:bitcoinprivate Protocol"
  WriteRegStr HKCU "Software\Classes\bitcoin" "URL Protocol" ""
  WriteRegStr HKCU "Software\Classes\bitcoin" "DefaultIcon" "$\"$INSTDIR\electrum.ico, 0$\""
  WriteRegStr HKCU "Software\Classes\bitcoin\shell\open\command" "" "$\"$INSTDIR\electrum-${PRODUCT_VERSION}.exe$\" $\"%1$\""

  ;Adds an uninstaller possibilty to Windows Uninstall or change a program section
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
  WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\electrum.ico"

  ;Fixes Windows broken size estimates
  ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
  IntFmt $0 "0x%08X" $0
  WriteRegDWORD HKCU "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0"
SectionEnd

;--------------------------------
;Descriptions

;--------------------------------
;Uninstaller Section

Section "Uninstall"
  RMDir /r "$INSTDIR\*.*"

  RMDir "$INSTDIR"

  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*"
  RMDir  "$SMPROGRAMS\${PRODUCT_NAME}"
  
  DeleteRegKey HKCU "Software\Classes\bitcoin"
  DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
  DeleteRegKey HKCU "${PRODUCT_UNINST_KEY}"
SectionEnd


================================================
FILE: contrib/build-wine/prepare-hw.sh
================================================
#!/bin/bash

TREZOR_GIT_URL=https://github.com/trezor/python-trezor.git
KEEPKEY_GIT_URL=https://github.com/keepkey/python-keepkey.git
BTCHIP_GIT_URL=https://github.com/LedgerHQ/btchip-python.git

BRANCH=master

PYTHON_VERSION=3.5.4

# These settings probably don't need any change
export WINEPREFIX=/opt/wine64

PYHOME=c:/python$PYTHON_VERSION
PYTHON="wine $PYHOME/python.exe -OO -B"

# Let's begin!
cd `dirname $0`
set -e

cd tmp

$PYTHON -m pip install setuptools --upgrade
$PYTHON -m pip install cython --upgrade
$PYTHON -m pip install trezor==0.7.16 --upgrade
$PYTHON -m pip install keepkey==4.0.0 --upgrade
$PYTHON -m pip install btchip-python==0.1.23 --upgrade



================================================
FILE: contrib/build-wine/prepare-pyinstaller.sh
================================================
#!/bin/bash
PYTHON_VERSION=3.5.4

PYINSTALLER_GIT_URL=https://github.com/ecdsa/pyinstaller.git
BRANCH=fix_2952

export WINEPREFIX=/opt/wine64
PYHOME=c:/python$PYTHON_VERSION
PYTHON="wine $PYHOME/python.exe -OO -B"

cd `dirname $0`
set -e
cd tmp
if [ ! -d "pyinstaller" ]; then
    git clone -b $BRANCH $PYINSTALLER_GIT_URL pyinstaller
fi

cd pyinstaller
git pull
git checkout $BRANCH
$PYTHON setup.py install
cd ..

wine "C:/python$PYTHON_VERSION/scripts/pyinstaller.exe" -v


================================================
FILE: contrib/build-wine/prepare-wine.sh
================================================
#!/bin/bash

# Please update these carefully, some versions won't work under Wine
NSIS_URL=https://prdownloads.sourceforge.net/nsis/nsis-3.02.1-setup.exe?download
NSIS_SHA256=736c9062a02e297e335f82252e648a883171c98e0d5120439f538c81d429552e
PYTHON_VERSION=3.5.4

## These settings probably don't need change
export WINEPREFIX=/opt/wine64
#export WINEARCH='win32'

PYHOME=c:/python$PYTHON_VERSION
PYTHON="wine $PYHOME/python.exe -OO -B"


# based on https://superuser.com/questions/497940/script-to-verify-a-signature-with-gpg
verify_signature() {
    local file=$1 keyring=$2 out=
    if out=$(gpg --no-default-keyring --keyring "$keyring" --status-fd 1 --verify "$file" 2>/dev/null) &&
       echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG "; then
        return 0
    else
        echo "$out" >&2
        exit 0
    fi
}

verify_hash() {
    local file=$1 expected_hash=$2 out=
    actual_hash=$(sha256sum $file | awk '{print $1}')
    if [ "$actual_hash" == "$expected_hash" ]; then
        return 0
    else
        echo "$file $actual_hash (unexpected hash)" >&2
        exit 0
    fi
}

# Let's begin!
cd `dirname $0`
set -e

# Clean up Wine environment
echo "Cleaning $WINEPREFIX"
rm -rf $WINEPREFIX
echo "done"

wine 'wineboot'

echo "Cleaning tmp"
rm -rf tmp
mkdir -p tmp
echo "done"

cd tmp

# Install Python
# note: you might need "sudo apt-get install dirmngr" for the following
# keys from https://www.python.org/downloads/#pubkeys
KEYRING_PYTHON_DEV=keyring-electrum-build-python-dev.gpg
gpg --no-default-keyring --keyring $KEYRING_PYTHON_DEV --recv-keys 531F072D39700991925FED0C0EDDC5F26A45C816 26DEA9D4613391EF3E25C9FF0A5B101836580288 CBC547978A3964D14B9AB36A6AF053F07D9DC8D2 C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF 12EF3DC38047DA382D18A5B999CDEA9DA4135B38 8417157EDBE73D9EAC1E539B126EB563A74B06BF DBBF2EEBF925FAADCF1F3FFFD9866941EA5BBD71 2BA0DB82515BBB9EFFAC71C5C9BE28DEE6DF025C 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D C9B104B3DD3AA72D7CCB1066FB9921286F5E1540 97FC712E4C024BBEA48A61ED3A5CA953F73C700D 7ED10B6531D7C8E1BC296021FC624643487034E5
for msifile in core dev exe lib pip tools; do
    echo "Installing $msifile..."
    wget "https://www.python.org/ftp/python/$PYTHON_VERSION/win32/${msifile}.msi"
    wget "https://www.python.org/ftp/python/$PYTHON_VERSION/win32/${msifile}.msi.asc"
    verify_signature "${msifile}.msi.asc" $KEYRING_PYTHON_DEV
    wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/python$PYTHON_VERSION
done

# upgrade pip
$PYTHON -m pip install pip --upgrade

# Install PyWin32
$PYTHON -m pip install pypiwin32

# Install PyQt
$PYTHON -m pip install PyQt5

## Install pyinstaller
#$PYTHON -m pip install pyinstaller==3.3


# Install ZBar
#wget -q -O zbar.exe "https://sourceforge.net/projects/zbar/files/zbar/0.10/zbar-0.10-setup.exe/download"
#wine zbar.exe

# install Cryptodome
$PYTHON -m pip install pycryptodomex

# install PySocks
$PYTHON -m pip install win_inet_pton

# install websocket (python2)
$PYTHON -m pip install websocket-client

# Upgrade setuptools (so Electrum can be installed later)
$PYTHON -m pip install setuptools --upgrade

# Install NSIS installer
wget -q -O nsis.exe "$NSIS_URL"
verify_hash nsis.exe $NSIS_SHA256
wine nsis.exe /S

# Install UPX
#wget -O upx.zip "https://downloads.sourceforge.net/project/upx/upx/3.08/upx308w.zip"
#unzip -o upx.zip
#cp upx*/upx.exe .

# add dlls needed for pyinstaller:
cp $WINEPREFIX/drive_c/python$PYTHON_VERSION/Lib/site-packages/PyQt5/Qt/bin/* $WINEPREFIX/drive_c/python$PYTHON_VERSION/


echo "Wine is configured. Please run prepare-pyinstaller.sh"


================================================
FILE: contrib/freeze_packages.sh
================================================
#!/bin/bash
# Run this after a new release to update dependencies

venv_dir=~/.electrum-venv
contrib=$(dirname "$0")

which virtualenv > /dev/null 2>&1 || { echo "Please install virtualenv" && exit 1; }

rm $venv_dir -rf
virtualenv $venv_dir

source $venv_dir/bin/activate

echo "Installing dependencies"

pushd $contrib/..
python setup.py install
popd

pip freeze | sed '/^Electrum/ d' > $contrib/requirements.txt

echo "Updated requirements"


================================================
FILE: contrib/make_apk
================================================
#!/bin/bash
pushd lib
VERSION=$(python -c "import version; print version.ELECTRUM_VERSION")".0"
popd
echo $VERSION
echo $VERSION > contrib/apk_version
pushd ./gui/kivy/; make apk; popd


================================================
FILE: contrib/make_download
================================================
#!/usr/bin/python2
import re
import os

from versions import version, version_win, version_mac, version_android, version_apk
from versions import download_template, download_page

with open(download_template) as f:
    string = f.read()

string = string.replace("##VERSION##", version)
string = string.replace("##VERSION_WIN##", version_win)
string = string.replace("##VERSION_MAC##", version_mac)
string = string.replace("##VERSION_ANDROID##", version_android)
string = string.replace("##VERSION_APK##", version_apk)

files = {
    'tgz': "Electrum-%s.tar.gz" % version,
    'zip': "Electrum-%s.zip" % version,
    'mac': "electrum-%s.dmg" % version_mac,
    'win': "electrum-%s.exe" % version_win,
    'win_setup': "electrum-%s-setup.exe" % version_win,
    'win_portable': "electrum-%s-portable.exe" % version_win,
}

for k, n in files.items():
    path = "dist/%s"%n
    link = "https://download.electrum.org/%s/%s"%(version,n)
    if not os.path.exists(path):
        os.system("wget -q %s -O %s" % (link, path))
    if not os.path.getsize(path):
        os.unlink(path)
        string = re.sub("<div id=\"%s\">(.*?)</div>"%k, '', string, flags=re.DOTALL + re.MULTILINE)
        continue
    sigpath = path + '.asc'
    siglink = link + '.asc'
    if not os.path.exists(sigpath):
        os.system("wget -q %s -O %s" % (siglink, sigpath))
    if not os.path.getsize(sigpath):
        os.unlink(sigpath)
        string = re.sub("<div id=\"%s\">(.*?)</div>"%k, '', string, flags=re.DOTALL + re.MULTILINE)
        continue
    if os.system("gpg --verify %s"%sigpath) != 0:
        raise BaseException(sigpath)
    string = string.replace("##link_%s##"%k, link)


with open(download_page,'w') as f:
    f.write(string)




================================================
FILE: contrib/make_locale
================================================
#!/usr/bin/env python3
import os
import io
import zipfile
import requests

os.chdir(os.path.dirname(os.path.realpath(__file__)))
os.chdir('..')

# Generate fresh translation template
if not os.path.exists('lib/locale'):
    os.mkdir('lib/locale')
cmd = 'xgettext -s --no-wrap -f app.fil --output=lib/locale/messages.pot'
print('Generate template')
os.system(cmd)

os.chdir('lib')

crowdin_identifier = 'electrum'
crowdin_file_name = 'electrum-client/messages.pot'
locale_file_name = 'locale/messages.pot'
crowdin_api_key = None

filename = '~/.crowdin_api_key'
if os.path.exists(filename):
    with open(filename) as f:
        crowdin_api_key = f.read().strip()

if "crowdin_api_key" in os.environ:
    crowdin_api_key = os.environ["crowdin_api_key"]

if crowdin_api_key:
    # Push to Crowdin
    print('Push to Crowdin')
    url = ('https://api.crowdin.com/api/project/' + crowdin_identifier + '/update-file?key=' + crowdin_api_key)
    with open(locale_file_name,'rb') as f:
        files = {crowdin_file_name: f}
        requests.request('POST', url, files=files)
    # Build translations
    print('Build translations')
    response = requests.request('GET', 'https://api.crowdin.com/api/project/' + crowdin_identifier + '/export?key=' + crowdin_api_key).content
    print(response)

# Download & unzip
print('Download translations')
s = requests.request('GET', 'https://crowdin.com/download/project/' + crowdin_identifier + '.zip').content
zfobj = zipfile.ZipFile(io.BytesIO(s))

print('Unzip translations')
for name in zfobj.namelist():
    if not name.startswith('electrum-client/locale'):
        continue
    if name.endswith('/'):
        if not os.path.exists(name[16:]):
            os.mkdir(name[16:])
    else:
        with open(name[16:], 'wb') as output:
            output.write(zfobj.read(name))

# Convert .po to .mo
print('Installing')
for lang in os.listdir('locale'):
    if lang.startswith('messages'):
        continue
    # Check LC_MESSAGES folder
    mo_dir = 'locale/%s/LC_MESSAGES' % lang
    if not os.path.exists(mo_dir):
        os.mkdir(mo_dir)
    cmd = 'msgfmt --output-file="%s/electrum.mo" "locale/%s/electrum.po"' % (mo_dir,lang)
    print('Installing', lang)
    os.system(cmd)


================================================
FILE: contrib/make_packages
================================================
#!/bin/bash

contrib=$(dirname "$0")

whereis pip3
if [ $? -ne 0 ] ; then echo "Install pip3" ; exit ; fi

rm $contrib/../packages/ -r

#Install pure python modules in electrum directory
pip3 install -r $contrib/requirements.txt -t $contrib/../packages



================================================
FILE: contrib/requirements.txt
================================================
certifi==2017.11.5
chardet==3.0.4
dnspython==1.15.0
ecdsa==0.13.3
idna==2.6
jsonrpclib-pelix==0.3.1
pbkdf2==1.3
protobuf==3.5.0.post1
pyaes==1.6.1
PySocks==1.6.7
qrcode==5.3
requests==2.18.4
six==1.11.0
urllib3==1.22


================================================
FILE: contrib/sign_packages
================================================
#!/usr/bin/python2

import os
import getpass

if __name__ == '__main__':

    os.chdir("dist")
    password = getpass.getpass("Password:")
    for f in os.listdir('.'):
        if f.endswith('asc'):
            continue
        os.system( "gpg --sign --armor --detach --passphrase \"%s\" %s"%(password, f) )

    os.chdir("..")





================================================
FILE: create-dmg.sh
================================================
#!/bin/sh

echo "Cleaning..."
sudo sh ./clean.sh
VERSION=$(python3 -c "from lib import version; print(version.ELECTRUM_VERSION)")
VERSION=${VERSION//ELECTRUM_VERSION=/}

echo "Creating package $VERSION"

echo "Running brew install"
brew bundle

echo "Running pip3 install"
pip3 install -r requirements.txt

echo "Building icons"
pyrcc5 icons.qrc -o gui/qt/icons_rc.py

echo "Compiling the protobuf description file"
protoc --proto_path=lib/ --python_out=lib/ lib/paymentrequest.proto

echo "Compiling translations"
./contrib/make_locale

echo "Creating package $VERSION"
sudo python3 setup.py sdist

echo "Creating .app from python using py2app"
sudo ARCHFLAGS="-arch i386 -arch x86_64" sudo python3 setup-release.py py2app --includes sip

sudo mkdir dist/installer-mac/
sudo mv "dist/Electrum BTCP.app" "dist/installer-mac/"
sudo touch "dist/installer-mac/To install, copy it into Applications"

echo "Creating .dmg"
sudo hdiutil create -fs HFS+ -volname "Electrum BTCP - Installer" -srcfolder "dist/installer-mac" dist/electrum-btcp-$VERSION-macosx.dmg

echo "Done! .dmg and .app are in dist/"



================================================
FILE: docs/release-tests.md
================================================
## BTCP Electrum Wallet

**Tests to perform before each release**

### 1. Connection
	1. User can connect for the first time (Green Dot).
		1. User can connect without having a BTCPrivate directory
		2. User can connect having an existing, matching, BTCPrivate directory
	2. User can connect consecutively. This includes being able to resume from previous blockchain headers sync

### 2. User can import b addr private key
	1. User can import b addr private key (from ZCL, BTC, and BTCP)
	2. User can export b addr private key (from ZCL, BTC, and BTCP)
	3. User can Sweep from a b addr private key (from ZCL, BTC, and BTCP)

### 3. Transactions
	1. User can send from b->b
	2. User can receive from z->b
	3. User can receive from b->b
  4. User can send from bx (multisig)
  5. User can send to bx (multisig)
  6. All transactions become Verified
	7. Coinbase transaction error handling is correctly done ('e.g. needs to send full amount to Z').



================================================
FILE: electrum-btcp
================================================
#!/usr/bin/env python3
# -*- mode: python -*-
#
# Electrum - lightweight Bitcoin client
# Copyright (C) 2011 thomasv@gitorious
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import os
import sys

# from https://gist.github.com/tito/09c42fb4767721dc323d
import threading
try:
    import jnius
except:
    jnius = None
if jnius:
    orig_thread_run = threading.Thread.run
    def thread_check_run(*args, **kwargs):
        try:
            return orig_thread_run(*args, **kwargs)
        finally:
            jnius.detach()
    threading.Thread.run = thread_check_run

script_dir = os.path.dirname(os.path.realpath(__file__))
is_bundle = getattr(sys, 'frozen', False)
is_local = not is_bundle and os.path.exists(os.path.join(script_dir, "electrum.desktop"))
is_android = 'ANDROID_DATA' in os.environ
is_macOS = sys.platform == 'darwin'

# move this back to gui/kivy/__init.py once plugins are moved
os.environ['KIVY_DATA_DIR'] = os.path.abspath(os.path.dirname(__file__)) + '/gui/kivy/data/'

if is_local or is_android:
    sys.path.insert(0, os.path.join(script_dir, 'packages'))


def check_imports():
    # pure-python dependencies need to be imported here for pyinstaller
    try:
        import dns
        import pyaes
        import ecdsa
        import requests
        import qrcode
        import pbkdf2
        import google.protobuf
        import jsonrpclib
    except ImportError as e:
        sys.exit("Error: %s. Try 'sudo pip install <module-name>'"%str(e))
    # the following imports are for pyinstaller
    from google.protobuf import descriptor
    from google.protobuf import message
    from google.protobuf import reflection
    from google.protobuf import descriptor_pb2
    from jsonrpclib import SimpleJSONRPCServer
    # make sure that certificates are here
    if is_bundle and is_macOS:
        requests.utils.DEFAULT_CA_BUNDLE_PATH = os.path.join(os.path.dirname(__file__), 'cacert.pem')
    assert os.path.exists(requests.utils.DEFAULT_CA_BUNDLE_PATH)


if not is_android:
    check_imports()

# load local module as electrum
if is_local or is_android or is_macOS:
    import imp
    imp.load_module('electrum', *imp.find_module('lib'))
    imp.load_module('electrum_gui', *imp.find_module('gui'))
    imp.load_module('electrum_plugins', *imp.find_module('plugins'))


from electrum import bitcoin
from electrum import SimpleConfig, Network
from electrum.wallet import Wallet, Imported_Wallet
from electrum.storage import WalletStorage
from electrum.util import print_msg, print_stderr, json_encode, json_decode
from electrum.util import set_verbosity, InvalidPassword
from electrum.commands import get_parser, known_commands, Commands, config_variables
from electrum import daemon
from electrum import keystore
from electrum.mnemonic import Mnemonic
import electrum_plugins

# get password routine
def prompt_password(prompt, confirm=True):
    import getpass
    password = getpass.getpass(prompt, stream=None)
    if password and confirm:
        password2 = getpass.getpass("Confirm: ")
        if password != password2:
            sys.exit("Error: Passwords do not match.")
    if not password:
        password = None
    return password



def run_non_RPC(config):
    cmdname = config.get('cmd')

    storage = WalletStorage(config.get_wallet_path())
    if storage.file_exists():
        sys.exit("Error: Remove the existing wallet first!")

    def password_dialog():
        return prompt_password("Password (hit return if you do not wish to encrypt your wallet):")

    if cmdname == 'restore':
        text = config.get('text').strip()
        passphrase = config.get('passphrase', '')
        password = password_dialog() if keystore.is_private(text) else None
        if keystore.is_address_list(text):
            wallet = Imported_Wallet(storage)
            for x in text.split():
                wallet.import_address(x)
        elif keystore.is_private_key_list(text):
            k = keystore.Imported_KeyStore({})
            storage.put('keystore', k.dump())
            storage.put('use_encryption', bool(password))
            wallet = Imported_Wallet(storage)
            for x in text.split():
                wallet.import_private_key(x, password)
            storage.write()
        else:
            if keystore.is_seed(text):
                k = keystore.from_seed(text, passphrase, False)
            elif keystore.is_master_key(text):
                k = keystore.from_master_key(text)
            else:
                sys.exit("Error: Seed or key not recognized")
            if password:
                k.update_password(None, password)
            storage.put('keystore', k.dump())
            storage.put('wallet_type', 'standard')
            storage.put('use_encryption', bool(password))
            storage.write()
            wallet = Wallet(storage)
        if not config.get('offline'):
            network = Network(config)
            network.start()
            wallet.start_threads(network)
            print_msg("Recovering wallet...")
            wallet.synchronize()
            wallet.wait_until_synchronized()
            msg = "Recovery successful" if wallet.is_found() else "Found no history for this wallet"
        else:
            msg = "This wallet was restored offline. It may contain more addresses than displayed."
        print_msg(msg)

    elif cmdname == 'create':
        password = password_dialog()
        passphrase = config.get('passphrase', '')
        seed_type = 'segwit' if config.get('segwit') else 'standard'
        seed = Mnemonic('en').make_seed(seed_type)
        k = keystore.from_seed(seed, passphrase, False)
        storage.put('keystore', k.dump())
        storage.put('wallet_type', 'standard')
        wallet = Wallet(storage)
        wallet.update_password(None, password, True)
        wallet.synchronize()
        print_msg("Your wallet generation seed is:\n\"%s\"" % seed)
        print_msg("Please keep it in a safe place; if you lose it, you will not be able to restore your wallet.")

    wallet.storage.write()
    print_msg("Wallet saved in '%s'" % wallet.storage.path)
    sys.exit(0)


def init_daemon(config_options):
    config = SimpleConfig(config_options)
    storage = WalletStorage(config.get_wallet_path())
    if not storage.file_exists():
        print_msg("Error: Wallet file not found.")
        print_msg("Type 'electrum create' to create a new wallet, or provide a path to a wallet with the -w option")
        sys.exit(0)
    if storage.is_encrypted():
        if config.get('password'):
            password = config.get('password')
        else:
            password = prompt_password('Password:', False)
            if not password:
                print_msg("Error: Password required")
                sys.exit(1)
    else:
        password = None
    config_options['password'] = password


def init_cmdline(config_options, server):
    config = SimpleConfig(config_options)
    cmdname = config.get('cmd')
    cmd = known_commands[cmdname]

    if cmdname == 'signtransaction' and config.get('privkey'):
        cmd.requires_wallet = False
        cmd.requires_password = False

    if cmdname in ['payto', 'paytomany'] and config.get('unsigned'):
        cmd.requires_password = False

    if cmdname in ['payto', 'paytomany'] and config.get('broadcast'):
        cmd.requires_network = True

    # instanciate wallet for command-line
    storage = WalletStorage(config.get_wallet_path())

    if cmd.requires_wallet and not storage.file_exists():
        print_msg("Error: Wallet file not found.")
        print_msg("Type 'electrum create' to create a new wallet, or provide a path to a wallet with the -w option")
        sys.exit(0)

    # important warning
    if cmd.name in ['getprivatekeys']:
        print_stderr("WARNING: ALL your private keys are secret.")
        print_stderr("Exposing a single private key can compromise your entire wallet!")
        print_stderr("In particular, DO NOT use 'redeem private key' services proposed by third parties.")

    # commands needing password
    if (cmd.requires_wallet and storage.is_encrypted() and server is None)\
       or (cmd.requires_password and (storage.get('use_encryption') or storage.is_encrypted())):
        if config.get('password'):
            password = config.get('password')
        else:
            password = prompt_password('Password:', False)
            if not password:
                print_msg("Error: Password required")
                sys.exit(1)
    else:
        password = None

    config_options['password'] = password

    if cmd.name == 'password':
        new_password = prompt_password('New password:')
        config_options['new_password'] = new_password

    return cmd, password


def run_offline_command(config, config_options):
    cmdname = config.get('cmd')
    cmd = known_commands[cmdname]
    password = config_options.get('password')
    if cmd.requires_wallet:
        storage = WalletStorage(config.get_wallet_path())
        if storage.is_encrypted():
            storage.decrypt(password)
        wallet = Wallet(storage)
    else:
        wallet = None
    # check password
    if cmd.requires_password and storage.get('use_encryption'):
        try:
            seed = wallet.check_password(password)
        except InvalidPassword:
            print_msg("Error: This password does not decode this wallet.")
            sys.exit(1)
    if cmd.requires_network:
        print_msg("Warning: running command offline")
    # arguments passed to function
    args = [config.get(x) for x in cmd.params]
    # decode json arguments
    args = list(map(json_decode, args))
    # options
    kwargs = {}
    for x in cmd.options:
        kwargs[x] = (config_options.get(x) if x in ['password', 'new_password'] else config.get(x))
    cmd_runner = Commands(config, wallet, None)
    func = getattr(cmd_runner, cmd.name)
    result = func(*args, **kwargs)
    # save wallet
    if wallet:
        wallet.storage.write()
    return result

def init_plugins(config, gui_name):
    from electrum.plugins import Plugins
    return Plugins(config, is_local or is_android, gui_name)

if __name__ == '__main__':

    # on osx, delete Process Serial Number arg generated for apps launched in Finder
    sys.argv = list(filter(lambda x: not x.startswith('-psn'), sys.argv))

    # old 'help' syntax
    if len(sys.argv) > 1 and sys.argv[1] == 'help':
        sys.argv.remove('help')
        sys.argv.append('-h')

    # read arguments from stdin pipe and prompt
    for i, arg in enumerate(sys.argv):
        if arg == '-':
            if not sys.stdin.isatty():
                sys.argv[i] = sys.stdin.read()
                break
            else:
                raise BaseException('Cannot get argument from stdin')
        elif arg == '?':
            sys.argv[i] = input("Enter argument:")
        elif arg == ':':
            sys.argv[i] = prompt_password('Enter argument (will not echo):', False)

    # parse command line
    parser = get_parser()
    args = parser.parse_args()

    # config is an object passed to the various constructors (wallet, interface, gui)
    if is_android:
        config_options = {
            'verbose': True,
            'cmd': 'gui',
            'gui': 'kivy',
        }
    else:
        config_options = args.__dict__
        f = lambda key: config_options[key] is not None and key not in config_variables.get(args.cmd, {}).keys()
        config_options = {key: config_options[key] for key in filter(f, config_options.keys())}
        if config_options.get('server'):
            config_options['auto_connect'] = False

    config_options['cwd'] = os.getcwd()

    # fixme: this can probably be achieved with a runtime hook (pyinstaller)
    if is_bundle and hasattr(sys, '_MEIPASS') and os.path.exists(os.path.join(sys._MEIPASS, 'is_portable')):
        config_options['portable'] = True

    if config_options.get('portable'):
        config_options['electrum_path'] = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'electrum_data')

    # kivy sometimes freezes when we write to sys.stderr
    set_verbosity(config_options.get('verbose') and config_options.get('gui')!='kivy')

    # check uri
    uri = config_options.get('url')
    if uri:
        if not uri.startswith('bitcoin:'):
            print_stderr('unknown command:', uri)
            sys.exit(1)
        config_options['url'] = uri

    # todo: defer this to gui
    config = SimpleConfig(config_options)
    cmdname = config.get('cmd')

    if config.get('testnet'):
        bitcoin.NetworkConstants.set_testnet()

    # run non-RPC commands separately
    if cmdname in ['create', 'restore']:
        run_non_RPC(config)
        sys.exit(0)

    if cmdname == 'gui':
        fd, server = daemon.get_fd_or_server(config)
        if fd is not None:
            plugins = init_plugins(config, config.get('gui', 'qt'))
            d = daemon.Daemon(config, fd, True)
            d.start()
            d.init_gui(config, plugins)
            sys.exit(0)
        else:
            result = server.gui(config_options)

    elif cmdname == 'daemon':
        subcommand = config.get('subcommand')
        if subcommand in ['load_wallet']:
            init_daemon(config_options)

        if subcommand in [None, 'start']:
            fd, server = daemon.get_fd_or_server(config)
            if fd is not None:
                if subcommand == 'start':
                    pid = os.fork()
                    if pid:
                        print_stderr("starting daemon (PID %d)" % pid)
                        sys.exit(0)
                init_plugins(config, 'cmdline')
                d = daemon.Daemon(config, fd, False)
                d.start()
                if config.get('websocket_server'):
                    from electrum import websockets
                    websockets.WebSocketServer(config, d.network).start()
                if config.get('requests_dir'):
                    path = os.path.join(config.get('requests_dir'), 'index.html')
                    if not os.path.exists(path):
                        print("Requests directory not configured.")
                        print("You can configure it using https://github.com/spesmilo/electrum-merchant")
                        sys.exit(1)
                d.join()
                sys.exit(0)
            else:
                result = server.daemon(config_options)
        else:
            server = daemon.get_server(config)
            if server is not None:
                result = server.daemon(config_options)
            else:
                print_msg("Daemon not running")
                sys.exit(1)
    else:
        # command line
        server = daemon.get_server(config)
        init_cmdline(config_options, server)
        if server is not None:
            result = server.run_cmdline(config_options)
        else:
            cmd = known_commands[cmdname]
            if cmd.requires_network:
                print_msg("Daemon not running; try 'electrum daemon start'")
                sys.exit(1)
            else:
                init_plugins(config, 'cmdline')
                result = run_offline_command(config, config_options)
                # print result
    if isinstance(result, str):
        print_msg(result)
    elif type(result) is dict and result.get('error'):
        print_stderr(result.get('error'))
    elif result is not None:
        print_msg(json_encode(result))
    sys.exit(0)


================================================
FILE: electrum-env
================================================
#!/bin/bash
#
# This script creates a virtualenv named 'env' and installs all
# python dependencies before activating the env and running Electrum.
# If 'env' already exists, it is activated and Electrum is started
# without any installations. Additionally, the PYTHONPATH environment
# variable is set properly before running Electrum.
#
# python-qt and its dependencies will still need to be installed with
# your package manager.

if [ -e ./env/bin/activate ]; then
    source ./env/bin/activate
else
    virtualenv env -p `which python3`
    source ./env/bin/activate
    python3 setup.py install
fi

export PYTHONPATH="/usr/local/lib/python3.5/site-packages:$PYTHONPATH"

./electrum-btcp "$@"

deactivate


================================================
FILE: electrum.conf.sample
================================================
# Configuration file for the electrum client
# Settings defined here are shared across wallets
#
# copy this file to /etc/electrum.conf if you want read-only settings

[client]
server = electrum.novit.ro:50001:t
proxy = None
gap_limit = 5
# booleans use python syntax
use_change = True
gui = qt
num_zeros = 2
# default transaction fee is in Satoshis
fee = 10000
winpos-qt = [799, 226, 877, 435]


================================================
FILE: electrum.desktop
================================================
# If you want electrum to appear in a linux app launcher ("start menu"), install this by doing:
# sudo desktop-file-install electrum.desktop

[Desktop Entry]
Comment=Lightweight Bitcoin Private Client
Exec=electrum-btcp %u
GenericName[en_US]=Bitcoin Private Wallet
GenericName=Bitcoin Private Wallet
Icon=electrum
Name[en_US]=Bitcoin Private Electrum Wallet
Name=Bitcoin Private Electrum Wallet
Categories=Finance;Network;
StartupNotify=false
Terminal=false
Type=Application
MimeType=x-scheme-handler/bitcoin;



================================================
FILE: gui/__init__.py
================================================
# To create a new GUI, please add its code to this directory.
# Three objects are passed to the ElectrumGui: config, daemon and plugins
# The Wallet object is instanciated by the GUI

# Notifications about network events are sent to the GUI by using network.register_callback()


================================================
FILE: gui/kivy/Makefile
================================================
PYTHON = python3

# needs kivy installed or in PYTHONPATH

.PHONY: theming apk clean

theming:
	$(PYTHON) -m kivy.atlas theming/light 1024 theming/light/*.png
prepare:
	# running pre build setup
	@cp tools/buildozer.spec ../../buildozer.spec
	# copy electrum to main.py
	@cp ../../electrum ../../main.py
	@-if [ ! -d "../../.buildozer" ];then \
		cd ../..; buildozer android debug;\
		cp -f gui/kivy/tools/blacklist.txt .buildozer/android/platform/python-for-android/src/blacklist.txt;\
		rm -rf ./.buildozer/android/platform/python-for-android/dist;\
	fi
apk:
	@make prepare
	@-cd ../..; buildozer android debug deploy run
	@make clean
release:
	@make prepare
	@-cd ../..; buildozer android release
	@make clean
clean:
	# Cleaning up
	# rename main.py to electrum
	@-rm ../../main.py
	# remove buildozer.spec
	@-rm ../../buildozer.spec


================================================
FILE: gui/kivy/Readme.txt
================================================
Before compiling, create packages: `contrib/make_packages`

Commands::

    `make theming` to make a atlas out of a list of pngs

    `make apk` to make a apk


If something in included modules like kivy or any other module changes
then you need to rebuild the distribution. To do so:

  rm -rf .buildozer/android/platform/python-for-android/dist


how to build with ssl:

  rm -rf .buildozer/android/platform/build/
  ./contrib/make_apk
  pushd /opt/electrum/.buildozer/android/platform/build/build/libs_collections/Electrum/armeabi-v7a
  cp libssl1.0.2g.so /opt/crystax-ndk-10.3.2/sources/openssl/1.0.2g/libs/armeabi-v7a/libssl.so
  cp libcrypto1.0.2g.so /opt/crystax-ndk-10.3.2/sources/openssl/1.0.2g/libs/armeabi-v7a/libcrypto.so
  popd
  ./contrib/make_apk


================================================
FILE: gui/kivy/__init__.py
================================================
#!/usr/bin/env python
#
# Electrum - lightweight Bitcoin client
# Copyright (C) 2012 thomasv@gitorious
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Kivy GUI

import sys
import os

try:
    sys.argv = ['']
    import kivy
except ImportError:
    # This error ideally shouldn't raised with pre-built packages
    sys.exit("Error: Could not import kivy. Please install it using the" + \
             "instructions mentioned here `http://kivy.org/#download` .")

# minimum required version for kivy
kivy.require('1.8.0')
from kivy.logger import Logger




class ElectrumGui:

    def __init__(self, config, daemon, plugins):
        Logger.debug('ElectrumGUI: initialising')
        self.daemon = daemon
        self.network = daemon.network
        self.config = config
        self.plugins = plugins

    def main(self):
        from .main_window import ElectrumWindow
        self.config.open_last_wallet()
        w = ElectrumWindow(config=self.config,
                           network=self.network,
                           plugins = self.plugins,
                           gui_object=self)
        w.run()
        if w.wallet:
            self.config.save_last_wallet(w.wallet)


================================================
FILE: gui/kivy/data/fonts/tron/License.txt
================================================
Copyright (c) 2010-2011, Jeff Bell [www.randombell.com] | [jeffbell@randombell.com].
This font may be distributed freely however must retain this document as well as the Readme.txt file.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is available with a FAQ at: http://scripts.sil.org/OFL

================================================
FILE: gui/kivy/data/fonts/tron/Readme.txt
================================================
TR2N v1.3

ABOUT THE FONT:
A font based upon the poster text for TRON LEGACY.

The font is different from the pre-existing TRON font currently on the web.  Similar in minor aspects but different in most.  Style based upon text from different region posters.

UPDATE HISTORY:
3/7/11 - Adjusted the letter B (both lowercase and uppercase), capped off the ends of T, P and R, added a few more punctuation marks, as well as added the TR and TP ligature to allow for the solid bar connect as in the poster art.

1/22/11 - Made minor corrections to all previous letters and punctuation.  Corrected issue with number 8's top filling in.

ABOUT THE AUTHOR:
Jeff Bell has produced fonts before, but this is the first one in over 10 years.  His original 3 fonts were under the name DJ-JOHNNYRKA and include "CASPER", "BEVERLY HILLS COP", "THE GODFATHER" and "FIDDUMS FAMILY".

For more information on Jeff Bell and his work can be found online:

www.randombell.com
www.damovieman.deviantart.com
http://www.imdb.com/name/nm3983081/
http://www.vimeo.com/user4004969/videos

================================================
FILE: gui/kivy/data/glsl/default.fs
================================================
$HEADER$
void main (void){
    gl_FragColor = frag_color * texture2D(texture0, tex_coord0);
}


================================================
FILE: gui/kivy/data/glsl/default.vs
================================================
$HEADER$
void main (void) {
  frag_color = color * vec4(1.0, 1.0, 1.0, opacity);
  tex_coord0 = vTexCoords0;
  gl_Position = projection_mat * modelview_mat * vec4(vPosition.xy, 0.0, 1.0);
}


================================================
FILE: gui/kivy/data/glsl/header.fs
================================================
#ifdef GL_ES
    precision highp float;
#endif

/* Outputs from the vertex shader */
varying vec4 frag_color;
varying vec2 tex_coord0;

/* uniform texture samplers */
uniform sampler2D texture0;


================================================
FILE: gui/kivy/data/glsl/header.vs
================================================
#ifdef GL_ES
    precision highp float;
#endif

/* Outputs to the fragment shader */
varying vec4 frag_color;
varying vec2 tex_coord0;

/* vertex attributes */
attribute vec2     vPosition;
attribute vec2     vTexCoords0;

/* uniform variables */
uniform mat4       modelview_mat;
uniform mat4       projection_mat;
uniform vec4       color;
uniform float      opacity;


================================================
FILE: gui/kivy/data/images/defaulttheme.atlas
================================================
{"defaulttheme-0.png": {"progressbar_background": [391, 227, 24, 24], "tab_btn_disabled": [264, 137, 32, 32], "tab_btn_pressed": [366, 137, 32, 32], "image-missing": [152, 171, 48, 48], "splitter_h": [174, 123, 32, 7], "splitter_down": [501, 253, 7, 32], "splitter_disabled_down": [503, 291, 7, 32], "vkeyboard_key_down": [468, 137, 32, 32], "vkeyboard_disabled_key_down": [400, 137, 32, 32], "selector_right": [248, 223, 55, 62], "player-background": [2, 287, 103, 103], "selector_middle": [191, 223, 55, 62], "spinner": [235, 82, 29, 37], "tab_btn_disabled_pressed": [298, 137, 32, 32], "switch-button_disabled": [277, 291, 43, 32], "textinput_disabled_active": [372, 326, 64, 64], "splitter_grip": [36, 50, 12, 26], "vkeyboard_key_normal": [2, 44, 32, 32], "button_disabled": [80, 82, 29, 37], "media-playback-stop": [302, 171, 48, 48], "splitter": [501, 87, 7, 32], "splitter_down_h": [140, 123, 32, 7], "sliderh_background_disabled": [72, 132, 41, 37], "modalview-background": [464, 456, 45, 54], "button": [142, 82, 29, 37], "splitter_disabled": [502, 137, 7, 32], "checkbox_radio_disabled_on": [433, 87, 32, 32], "slider_cursor": [402, 171, 48, 48], "vkeyboard_disabled_background": [68, 221, 64, 64], "checkbox_disabled_on": [297, 87, 32, 32], "sliderv_background_disabled": [2, 78, 37, 41], "button_disabled_pressed": [111, 82, 29, 37], "audio-volume-muted": [102, 171, 48, 48], "close": [417, 231, 20, 20], "action_group_disabled": [452, 171, 33, 48], "vkeyboard_background": [2, 221, 64, 64], "checkbox_off": [331, 87, 32, 32], "tab_disabled": [305, 253, 96, 32], "sliderh_background": [115, 132, 41, 37], "switch-button": [322, 291, 43, 32], "tree_closed": [439, 231, 20, 20], "bubble_btn_pressed": [435, 291, 32, 32], "selector_left": [134, 223, 55, 62], "filechooser_file": [174, 326, 64, 64], "checkbox_radio_disabled_off": [399, 87, 32, 32], "checkbox_radio_on": [196, 137, 32, 32], "checkbox_on": [365, 87, 32, 32], "button_pressed": [173, 82, 29, 37], "audio-volume-high": [464, 406, 48, 48], "audio-volume-low": [2, 171, 48, 48], "progressbar": [305, 227, 32, 24], "previous_normal": [487, 187, 19, 32], "separator": [504, 342, 5, 48], "filechooser_folder": [240, 326, 64, 64], "checkbox_radio_off": [467, 87, 32, 32], "textinput_active": [306, 326, 64, 64], "textinput": [438, 326, 64, 64], "player-play-overlay": [122, 395, 117, 115], "media-playback-pause": [202, 171, 48, 48], "sliderv_background": [41, 78, 37, 41], "ring": [354, 402, 108, 108], "bubble_arrow": [487, 175, 16, 10], "slider_cursor_disabled": [352, 171, 48, 48], "checkbox_disabled_off": [469, 291, 32, 32], "action_group_down": [2, 121, 33, 48], "spinner_disabled": [204, 82, 29, 37], "splitter_disabled_h": [106, 123, 32, 7], "bubble": [107, 325, 65, 65], "media-playback-start": [252, 171, 48, 48], "vkeyboard_disabled_key_normal": [434, 137, 32, 32], "overflow": [230, 137, 32, 32], "tree_opened": [461, 231, 20, 20], "action_item": [339, 227, 24, 24], "bubble_btn": [401, 291, 32, 32], "audio-volume-medium": [52, 171, 48, 48], "action_group": [37, 121, 33, 48], "spinner_pressed": [266, 82, 29, 37], "filechooser_selected": [2, 392, 118, 118], "tab": [403, 253, 96, 32], "action_bar": [158, 133, 36, 36], "action_view": [365, 227, 24, 24], "tab_btn": [332, 137, 32, 32], "switch-background": [192, 291, 83, 32], "splitter_disabled_down_h": [72, 123, 32, 7], "action_item_down": [367, 291, 32, 32], "switch-background_disabled": [107, 291, 83, 32], "textinput_disabled": [241, 399, 111, 111], "splitter_grip_h": [483, 239, 26, 12]}}

================================================
FILE: gui/kivy/data/java-classes/org/electrum/qr/SimpleScannerActivity.java
================================================
package org.electrum.qr;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.content.Intent;

import java.util.Arrays;

import me.dm7.barcodescanner.zxing.ZXingScannerView;

import com.google.zxing.Result;
import com.google.zxing.BarcodeFormat;

public class SimpleScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
    private ZXingScannerView mScannerView;
    final String TAG = "org.electrum.SimpleScannerActivity";

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        mScannerView = new ZXingScannerView(this);   // Programmatically initialize the scanner view
        mScannerView.setFormats(Arrays.asList(BarcodeFormat.QR_CODE));
        setContentView(mScannerView);                // Set the scanner view as the content view
    }

    @Override
    public void onResume() {
        super.onResume();
        mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
        mScannerView.startCamera();          // Start camera on resume
    }

    @Override
    public void onPause() {
        super.onPause();
        mScannerView.stopCamera();           // Stop camera on pause
    }

    @Override
    public void handleResult(Result rawResult) {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("text", rawResult.getText());
        resultIntent.putExtra("format", rawResult.getBarcodeFormat().toString());
        setResult(Activity.RESULT_OK, resultIntent);
        this.finish();
    }
}


================================================
FILE: gui/kivy/data/style.kv
================================================
#:kivy 1.0

<Label>:
    canvas:
        Color:
            rgba: self.disabled_color if self.disabled else (self.color if not self.markup else (1, 1, 1, 1))
        Rectangle:
            texture: self.texture
            size: self.texture_size
            pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.)

<-Button,-ToggleButton>:
    state_image: self.background_normal if self.state == 'normal' else self.background_down
    disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            border: self.border
            pos: self.pos
            size: self.size
            source: self.disabled_image if self.disabled else self.state_image
        Color:
            rgba: self.disabled_color if self.disabled else self.color
        Rectangle:
            texture: self.texture
            size: self.texture_size
            pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.)

<BubbleContent>
    opacity: .7 if self.disabled else 1
    rows: 1
    canvas:
        Color:
            rgba: self.parent.background_color if self.parent else (1, 1, 1, 1)
        BorderImage:
            border: self.parent.border if self.parent else (16, 16, 16, 16)
            texture: root.parent._bk_img.texture if root.parent else None
            size: self.size
            pos: self.pos

<BubbleButton>:
    background_normal: 'atlas://data/images/defaulttheme/bubble_btn'
    background_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed'
    background_disabled_normal: 'atlas://data/images/defaulttheme/bubble_btn'
    background_disabled_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed'
    border: (0, 0, 0, 0)

<Slider>:
    canvas:
        Color:
            rgb: 1, 1, 1
        BorderImage:
            border: (0, 18, 0, 18) if self.orientation == 'horizontal' else (18, 0, 18, 0)
            pos: (self.x + self.padding, self.center_y - sp(18)) if self.orientation == 'horizontal' else (self.center_x - 18, self.y + self.padding)
            size: (self.width - self.padding * 2, sp(36)) if self.orientation == 'horizontal' else (sp(36), self.height - self.padding * 2)
            source: 'atlas://data/images/defaulttheme/slider{}_background{}'.format(self.orientation[0], '_disabled' if self.disabled else '')
        Rectangle:
            pos: (self.value_pos[0] - sp(16), self.center_y - sp(17)) if self.orientation == 'horizontal' else (self.center_x - (16), self.value_pos[1] - sp(16))
            size: (sp(32), sp(32))
            source: 'atlas://data/images/defaulttheme/slider_cursor{}'.format('_disabled' if self.disabled else '')

<RelativeLayout>:
    canvas.before:
        PushMatrix
        Translate:
            xy: self.pos
    canvas.after:
        PopMatrix

<Image,AsyncImage>:
    canvas:
        Color:
            rgba: self.color
        Rectangle:
            texture: self.texture
            size: self.norm_image_size
            pos: self.center_x - self.norm_image_size[0] / 2., self.center_y - self.norm_image_size[1] / 2.

<TabbedPanelContent>
    rows: 1
    padding: 3
    canvas:
        Color:
            rgba: self.parent.background_color if self.parent else (1, 1, 1, 1)
        BorderImage:
            border: self.parent.border if self.parent else (16, 16, 16, 16)
            source: (root.parent.background_disabled_image if self.disabled else root.parent.background_image) if root.parent else None
            size: self.size
            pos: self.pos

<TabbedPanelStrip>
    rows: 1

<StripLayout>
    padding: '2dp', '2dp', '2dp', '2dp'
    canvas.before:
        BorderImage:
            pos: self.pos
            size: self.size
            border: root.border
            source: root.background_image

<TabbedPanelHeader>:
    halign: 'center'
    valign: 'middle'
    background_normal: 'atlas://data/images/defaulttheme/tab_btn'
    background_disabled_normal: 'atlas://data/images/defaulttheme/tab_btn_disabled'
    background_down: 'atlas://data/images/defaulttheme/tab_btn_pressed'
    background_disabled_down: 'atlas://data/images/defaulttheme/tab_btn_pressed'
    border: (8, 8, 8, 8)
    font_size: '15sp'

<Selector>
    allow_stretch: True

<TextInput>:
    canvas.before:
        Color:
            rgba: self.background_color
        BorderImage:
            border: self.border
            pos: self.pos
            size: self.size
            source: (self.background_disabled_active if self.disabled else self.background_active) if self.focus else (self.background_disabled_normal if self.disabled else self.background_normal)
        Color:
            rgba: (self.cursor_color if self.focus and not self.cursor_blink else (0, 0, 0, 0))
        Rectangle:
            pos: [int(x) for x in self.cursor_pos]
            size: 1, -self.line_height
        Color:
            rgba: self.disabled_foreground_color if self.disabled else (self.hint_text_color if not self.text and not self.focus else self.foreground_color)

<TextInputCutCopyPaste>:
    but_cut: cut.__self__
    but_copy: copy.__self__
    but_paste: paste.__self__
    but_selectall: selectall.__self__

    size_hint: None, None
    size: '150sp', '50sp'
    BubbleButton:
        id: cut
        text: 'Cut'
        on_release: root.do('cut')
    BubbleButton:
        id: copy
        text: 'Copy'
        on_release: root.do('copy')
    BubbleButton:
        id: paste
        text: 'Paste'
        on_release: root.do('paste')
    BubbleButton:
        id: selectall
        text: 'Select All'
        on_release: root.do('selectall')

<CodeInput>:
    font_name: 'data/fonts/RobotoMono-Regular.ttf'


<TreeViewNode>:
    canvas.before:
        Color:
            rgba: self.color_selected if self.is_selected else self.odd_color if self.odd else self.even_color
        Rectangle:
            pos: [self.parent.x, self.y] if self.parent else [0, 0]
            size: [self.parent.width, self.height] if self.parent else [1, 1]
        Color:
            rgba: 1, 1, 1, int(not self.is_leaf)
        Rectangle:
            source: 'atlas://data/images/defaulttheme/tree_%s' % ('opened' if self.is_open else 'closed')
            size: 16, 16
            pos: self.x - 20, self.center_y - 8
    canvas.after:
        Color:
            rgba: .5, .5, .5, .2
        Line:
            points: [self.parent.x, self.y, self.parent.right, self.y] if self.parent else []


<TreeViewLabel>:
    width: self.texture_size[0]
    height: max(self.texture_size[1] + dp(10), dp(24))
    text_size: self.width, None


<StencilView>:
    canvas.before:
        StencilPush
        Rectangle:
            pos: self.pos
            size: self.size
        StencilUse

    canvas.after:
        StencilUnUse
        Rectangle:
            pos: self.pos
            size: self.size
        StencilPop


<FileChooserListLayout>:
    on_entry_added: treeview.add_node(args[1])
    on_entries_cleared: treeview.root.nodes = []
    on_subentry_to_entry: not args[2].locked and treeview.add_node(args[1], args[2])
    on_remove_subentry: args[2].nodes = []
    BoxLayout:
        pos: root.pos
        size: root.size
        size_hint: None, None
        orientation: 'vertical'
        BoxLayout:
            size_hint_y: None
            height: 30
            orientation: 'horizontal'
            Widget:
                # Just for spacing
                width: 10
                size_hint_x: None
            Label:
                text: 'Name'
                text_size: self.size
                halign: 'left'
                bold: True
            Label:
                text: 'Size'
                text_size: self.size
                size_hint_x: None
                halign: 'right'
                bold: True
            Widget:
                # Just for spacing
                width: 10
                size_hint_x: None
        ScrollView:
            id: scrollview
            do_scroll_x: False
            Scatter:
                do_rotation: False
                do_scale: False
                do_translation: False
                size: treeview.size
                size_hint_y: None
                TreeView:
                    id: treeview
                    hide_root: True
                    size_hint_y: None
                    width: scrollview.width
                    height: self.minimum_height
                    on_node_expand: root.controller.entry_subselect(args[1])
                    on_node_collapse: root.controller.close_subselection(args[1])

<FileChooserListView>:
    layout: layout
    FileChooserListLayout:
        id: layout
        controller: root

[FileListEntry@FloatLayout+TreeViewNode]:
    locked: False
    entries: []
    path: ctx.path
    # FIXME: is_selected is actually a read_only treeview property. In this
    # case, however, we're doing this because treeview only has single-selection
    # hardcoded in it. The fix to this would be to update treeview to allow
    # multiple selection.
    is_selected: self.path in ctx.controller().selection

    orientation: 'horizontal'
    size_hint_y: None
    height: '48dp' if dp(1) > 1 else '24dp'
    # Don't allow expansion of the ../ node
    is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked
    on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
    on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
    BoxLayout:
        pos: root.pos
        Label:
            id: filename
            text_size: self.width, None
            halign: 'left'
            shorten: True
            text: ctx.name
        Label:
            text_size: self.width, None
            size_hint_x: None
            halign: 'right'
            text: '{}'.format(ctx.get_nice_size())


<FileChooserIconLayout>:
    on_entry_added: stacklayout.add_widget(args[1])
    on_entries_cleared: stacklayout.clear_widgets()
    ScrollView:
        id: scrollview
        pos: root.pos
        size: root.size
        size_hint: None, None
        do_scroll_x: False
        Scatter:
            do_rotation: False
            do_scale: False
            do_translation: False
            size_hint_y: None
            height: stacklayout.height
            StackLayout:
                id: stacklayout
                width: scrollview.width
                size_hint_y: None
                height: self.minimum_height
                spacing: '10dp'
                padding: '10dp'

<FileChooserIconView>:
    layout: layout
    FileChooserIconLayout:
        id: layout
        controller: root

[FileIconEntry@Widget]:
    locked: False
    path: ctx.path
    selected: self.path in ctx.controller().selection
    size_hint: None, None

    on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
    on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
    size: '100dp', '100dp'

    canvas:
        Color:
            rgba: 1, 1, 1, 1 if self.selected else 0
        BorderImage:
            border: 8, 8, 8, 8
            pos: root.pos
            size: root.size
            source: 'atlas://data/images/defaulttheme/filechooser_selected'

    Image:
        size: '48dp', '48dp'
        source: 'atlas://data/images/defaulttheme/filechooser_%s' % ('folder' if ctx.isdir else 'file')
        pos: root.x + dp(24), root.y + dp(40)
    Label:
        text: ctx.name
        text_size: (root.width, self.height)
        halign: 'center'
        shorten: True
        size: '100dp', '16dp'
        pos: root.x, root.y + dp(16)

    Label:
        text: '{}'.format(ctx.get_nice_size())
        font_size: '11sp'
        color: .8, .8, .8, 1
        size: '100dp', '16sp'
        pos: root.pos
        halign: 'center'

<FileChooserProgress>:
    pos_hint: {'x': 0, 'y': 0}
    canvas:
        Color:
            rgba: 0, 0, 0, .8
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        pos_hint: {'x': .2, 'y': .6}
        size_hint: .6, .2
        text: 'Opening %s' % root.path
    FloatLayout:
        pos_hint: {'x': .2, 'y': .4}
        size_hint: .6, .2
        ProgressBar:
            id: pb
            pos_hint: {'x': 0, 'center_y': .5}
            max: root.total
            value: root.index
        Label:
            pos_hint: {'x': 0}
            text: '%d / %d' % (root.index, root.total)
            size_hint_y: None
            height: self.texture_size[1]
            y: pb.center_y - self.height - 8
            font_size: '13sp'
            color: (.8, .8, .8, .8)

    AnchorLayout:
        pos_hint: {'x': .2, 'y': .2}
        size_hint: .6, .2

        Button:
            text: 'Cancel'
            size_hint: None, None
            size: 150, 44
            on_release: root.cancel()



# Switch widget
<Switch>:
    active_norm_pos: max(0., min(1., (int(self.active) + self.touch_distance / sp(41))))
    canvas:
        Color:
            rgb: 1, 1, 1
        Rectangle:
            source: 'atlas://data/images/defaulttheme/switch-background{}'.format('_disabled' if self.disabled else '')
            size: sp(83), sp(32)
            pos: int(self.center_x - sp(41)), int(self.center_y - sp(16))
        Rectangle:
            source: 'atlas://data/images/defaulttheme/switch-button{}'.format('_disabled' if self.disabled else '')
            size: sp(43), sp(32)
            pos: int(self.center_x - sp(41) + self.active_norm_pos * sp(41)), int(self.center_y - sp(16))


# ModalView widget
<ModalView>:
    canvas:
        Color:
            rgba: root.background_color[:3] + [root.background_color[-1] * self._anim_alpha]
        Rectangle:
            size: self._window.size if self._window else (0, 0)

        Color:
            rgb: 1, 1, 1
        BorderImage:
            source: root.background
            border: root.border
            pos: self.pos
            size: self.size


# Popup widget
<Popup>:
    _container: container
    GridLayout:
        padding: '12dp'
        cols: 1
        size_hint: None, None
        pos: root.pos
        size: root.size

        Label:
            text: root.title
            color: root.title_color
            size_hint_y: None
            height: self.texture_size[1] + dp(16)
            text_size: self.width - dp(16), None
            font_size: root.title_size
            font_name: root.title_font
            halign: root.title_align

        Widget:
            size_hint_y: None
            height: dp(4)
            canvas:
                Color:
                    rgba: root.separator_color
                Rectangle:
                    pos: self.x, self.y + root.separator_height / 2.
                    size: self.width, root.separator_height

        BoxLayout:
            id: container

# =============================================================================
# Spinner widget
# =============================================================================

<SpinnerOption>:
    size_hint_y: None
    height: '48dp'

<Spinner>:
    background_normal: 'atlas://data/images/defaulttheme/spinner'
    background_disabled_normal: 'atlas://data/images/defaulttheme/spinner_disabled'
    background_down: 'atlas://data/images/defaulttheme/spinner_pressed'

# =============================================================================
# ActionBar widget
# =============================================================================

<ActionBar>:
    height: '48dp'
    size_hint_y: None
    spacing: '4dp'
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            border: root.border
            pos: self.pos
            size: self.size
            source: self.background_image

<ActionView>:
    orientation: 'horizontal'
    canvas:
        Color:
            rgba: self.background_color
        BorderImage:
            pos: self.pos
            size: self.size
            source: self.background_image

<ActionSeparator>:
    size_hint_x: None
    minimum_width: '2sp'
    width: self.minimum_width
    canvas:
        Rectangle:
            pos: self.x, self.y + sp(4)
            size: self.width, self.height - sp(8)
            source: self.background_image

<ActionButton,ActionToggleButton>:
    background_normal: 'atlas://data/images/defaulttheme/' + ('action_bar' if self.inside_group else 'action_item')
    background_down: 'atlas://data/images/defaulttheme/action_item_down'
    size_hint_x: None if not root.inside_group else 1
    width: [dp(48) if (root.icon and not root.inside_group) else max(dp(48), (self.texture_size[0] + dp(32))), self.size_hint_x][0]
    color: self.color[:3] + [0 if (root.icon and not root.inside_group) else 1]

    Image:
        allow_stretch: True
        opacity: 1 if (root.icon and not root.inside_group) else 0
        source: root.icon
        mipmap: root.mipmap
        pos: root.x + dp(4), root.y + dp(4)
        size: root.width - dp(8), root.height - sp(8)

<ActionLabel>:
    size_hint_x: None if not root.inside_group else 1
    width: self.texture_size[0] + dp(32)

<ActionGroup>:
    size_hint_x: None
    width: self.texture_size[0] + dp(32)

<ActionCheck>:
    background_normal: 'atlas://data/images/defaulttheme/action_bar' if self.inside_group else 'atlas://data/images/defaulttheme/action_item'

<ActionPreviousImage@Image>:
    temp_width: 0
    temp_height: 0

<ActionPreviousButton@Button>:
    background_normal: 'atlas://data/images/defaulttheme/action_item'
    background_down: 'atlas://data/images/defaulttheme/action_item_down'

<ActionPrevious>:
    size_hint_x: 1
    minimum_width: layout.minimum_width + min(sp(100), title.width)
    important: True
    GridLayout:
        id: layout
        rows: 1
        pos: root.pos
        size_hint_x: None
        width: self.minimum_width
        ActionPreviousButton:
            on_press: root.dispatch('on_press')
            on_release: root.dispatch('on_release')
            size_hint_x: None
            width: prevlayout.width
            GridLayout:
                id: prevlayout
                rows: 1
                width: self.minimum_width
                height: self.parent.height
                pos: self.parent.pos
                ActionPreviousImage:
                    id: prev_icon_image
                    source: root.previous_image
                    opacity: 1 if root.with_previous else 0
                    allow_stretch: True
                    size_hint_x: None
                    temp_width: root.previous_image_width or dp(prev_icon_image.texture_size[0])
                    temp_height: root.previous_image_height or dp(prev_icon_image.texture_size[1])
                    width:
                        (self.temp_width if self.temp_height <= self.height else \
                        self.temp_width * (self.height / self.temp_height)) \
                        if self.texture else dp(8)
                    mipmap: root.mipmap
                ActionPreviousImage:
                    id: app_icon_image
                    source: root.app_icon
                    allow_stretch: True
                    size_hint_x: None
                    temp_width: root.app_icon_width or dp(app_icon_image.texture_size[0])
                    temp_height: root.app_icon_height or dp(app_icon_image.texture_size[1])
                    width:
                        (self.temp_width if self.temp_height <= self.height else \
                        self.temp_width * (self.height / self.temp_height)) \
                        if self.texture else dp(8)
                    mipmap: root.mipmap
                Widget:
                    size_hint_x: None
                    width: '5sp'
    Label:
        id: title
        text: root.title
        text_size: self.size
        color: root.color
        shorten: True
        shorten_from: 'right'
        halign: 'left'
        valign: 'middle'

<ActionGroup>:
    background_normal: 'atlas://data/images/defaulttheme/action_group'
    background_down: 'atlas://data/images/defaulttheme/action_group_down'
    background_disabled_normal: 'atlas://data/images/defaulttheme/action_group_disabled'
    border: 30, 30, 3, 3
    ActionSeparator:
        pos: root.pos
        size: root.separator_width, root.height
        opacity: 1 if root.use_separator else 0
        background_image: root.separator_image if root.use_separator else 'action_view'

<ActionOverflow>:
    border: 3, 3, 3, 3
    background_normal: 'atlas://data/images/defaulttheme/action_item'
    background_down: 'atlas://data/images/defaulttheme/action_item_down'
    background_disabled_normal: 'atlas://data/images/defaulttheme/button_disabled'
    size_hint_x: None
    minimum_width: '48sp'
    width: self.texture_size[0] if self.texture else self.minimum_width
    canvas.after:
        Color:
            rgb: 1, 1, 1
        Rectangle:
            pos: root.center_x - sp(16), root.center_y - sp(16)
            size: sp(32), sp(32)
            source: root.overflow_image

<ActionDropDown>:
    auto_width: False


# =============================================================================
# Accordion widget
# =============================================================================

[AccordionItemTitle@Label]:
    text: ctx.title
    normal_background: ctx.item.background_normal if ctx.item.collapse else ctx.item.background_selected
    disabled_background: ctx.item.background_disabled_normal if ctx.item.collapse else ctx.item.background_disabled_selected
    canvas.before:
        Color:
            rgba: self.disabled_color if self.disabled else self.color
        BorderImage:
            source: self.disabled_background if self.disabled else self.normal_background
            pos: self.pos
            size: self.size
        PushMatrix
        Translate:
            xy: self.center_x, self.center_y
        Rotate:
            angle: 90 if ctx.item.orientation == 'horizontal' else 0
            axis: 0, 0, 1
        Translate:
            xy: -self.center_x, -self.center_y
    canvas.after:
        PopMatrix


<AccordionItem>:
    container: container
    container_title: container_title

    BoxLayout:
        orientation: root.orientation
        pos: root.pos
        BoxLayout:
            size_hint_x: None if root.orientation == 'horizontal' else 1
            size_hint_y: None if root.orientation == 'vertical' else 1
            width: root.min_space if root.orientation == 'horizontal' else 100
            height: root.min_space if root.orientation == 'vertical' else 100
            id: container_title

        StencilView:
            id: sv

            BoxLayout:
                id: container
                pos: sv.pos
                size: root.content_size


<ScrollView>:
    canvas.after:
        Color:
            rgba: self._bar_color if (self.do_scroll_y and self.viewport_size[1] > self.height) else [0, 0, 0, 0]
        Rectangle:
            pos: (self.right - self.bar_width - self.bar_margin) if self.bar_pos_y == 'right' else (self.x + self.bar_margin), self.y + self.height * self.vbar[0]
            size: min(self.bar_width, self.width), self.height * self.vbar[1]
        Color:
            rgba: self._bar_color if (self.do_scroll_x and self.viewport_size[0] > self.width) else [0, 0, 0, 0]
        Rectangle:
            pos: self.x + self.width * self.hbar[0], (self.y + self.bar_margin) if self.bar_pos_x == 'bottom' else (self.top - self.bar_margin - self.bar_width)
            size: self.width * self.hbar[1], min(self.bar_width, self.height)


<CheckBox>:
    _checkbox_state_image:
        self.background_checkbox_down \
        if self.active else self.background_checkbox_normal
    _checkbox_disabled_image:
        self.background_checkbox_disabled_down \
        if self.active else self.background_checkbox_disabled_normal
    _radio_state_image:
        self.background_radio_down \
        if self.active else self.background_radio_normal
    _radio_disabled_image:
        self.background_radio_disabled_down \
        if self.active else self.background_radio_disabled_normal
    _checkbox_image:
        self._checkbox_disabled_image \
        if self.disabled else self._checkbox_state_image
    _radio_image:
        self._radio_disabled_image \
        if self.disabled else self._radio_state_image
    canvas:
        Color:
            rgb: 1, 1, 1
        Rectangle:
            source: self._radio_image if self.group else self._checkbox_image
            size: sp(32), sp(32)
            pos: int(self.center_x - sp(16)), int(self.center_y - sp(16))

# =============================================================================
# Screen Manager
# =============================================================================

<ScreenManager>:
    canvas.before:
        StencilPush
        Rectangle:
            pos: self.pos
            size: self.size
        StencilUse
    canvas.after:
        StencilUnUse
        Rectangle:
            pos: self.pos
            size: self.size
        StencilPop


================================================
FILE: gui/kivy/i18n.py
================================================
import gettext

class _(str):

    observers = set()
    lang = None

    def __new__(cls, s, *args, **kwargs):
        if _.lang is None:
            _.switch_lang('en')
        t = _.translate(s, *args, **kwargs)
        o = super(_, cls).__new__(cls, t)
        o.source_text = s
        return o

    @staticmethod
    def translate(s, *args, **kwargs):
        return _.lang(s).format(args, kwargs)

    @staticmethod
    def bind(label):
        try:
            _.observers.add(label)
        except:
            pass
        # garbage collection
        new = set()
        for label in _.observers:
            try:
                new.add(label)
            except:
                pass
        _.observers = new

    @staticmethod
    def switch_lang(lang):
        # get the right locales directory, and instanciate a gettext
        from electrum.i18n import LOCALE_DIR
        locales = gettext.translation('electrum', LOCALE_DIR, languages=[lang], fallback=True)
        _.lang = locales.gettext
        for label in _.observers:
            try:
                label.text = _(label.text.source_text)
            except:
                pass


================================================
FILE: gui/kivy/main.kv
================================================
#:import Clock kivy.clock.Clock
#:import Window kivy.core.window.Window
#:import Factory kivy.factory.Factory
#:import _ electrum_gui.kivy.i18n._


###########################
#     Global Defaults
###########################

<Label>
    markup: True
    font_name: 'Roboto'
    font_size: '16sp'
    bound: False
    on_text: if isinstance(self.text, _) and not self.bound: self.bound=True; _.bind(self)

<TextInput>
    on_focus: app._focused_widget = root
    font_size: '18sp'

<Button>
    on_parent: self.MIN_STATE_TIME = 0.1

<ListItemButton>
    font_size: '12sp'

<Carousel>:
    canvas.before:
        Color:
            rgba: 0.1, 0.1, 0.1, 1
        Rectangle:
            size: self.size
            pos: self.pos

<ActionView>:
    canvas.before:
        Color:
            rgba: 0.1, 0.1, 0.1, 1
        Rectangle:
            size: self.size
            pos: self.pos


# Custom Global Widgets

<TopLabel@Label>
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]

<EmptyLabel@Label>
    color: (0.8, 0.8, 0.8, 1)
    size_hint_y: None
    text_size: self.width, None
    height: self.texture_size[1]

<VGridLayout@GridLayout>:
    rows: 1
    size_hint: 1, None
    height: self.minimum_height



<IconButton@Button>:
    icon: ''
    AnchorLayout:
        pos: self.parent.pos
        size: self.parent.size
        orientation: 'lr-tb'
        Image:
            source: self.parent.parent.icon
            size_hint_x: None
            size: '30dp', '30dp'



#########################
#       Dialogs
#########################
<BoxLabel@BoxLayout>
    text: ''
    value: ''
    size_hint_y: None
    height: max(lbl1.height, lbl2.height)
    TopLabel
        id: lbl1
        text: root.text
        pos_hint: {'top':1}
    TopLabel
        id: lbl2
        text: root.value

<OutputItem>
    address: ''
    value: ''
    size_hint_y: None
    height: max(lbl1.height, lbl2.height)
    TopLabel
        id: lbl1
        text: '[ref=%s]%s[/ref]'%(root.address, root.address)
        font_size: '6pt'
        shorten: True
        size_hint_x: 0.65
        on_ref_press:
            app._clipboard.copy(root.address)
            app.show_info(_('Address copied to clipboard') + ' ' + root.address)
    TopLabel
        id: lbl2
        text: root.value
        font_size: '6pt'
        size_hint_x: 0.35
        halign: 'right'


<OutputList>
    height: self.minimum_height
    size_hint_y: None
    cols: 1
    spacing: '10dp'
    padding: '10dp'
    canvas.before:
        Color:
            rgb: .3, .3, .3
        Rectangle:
            size: self.size
            pos: self.pos

<RefLabel@TopLabel>
    font_size: '6pt'
    name: ''
    data: ''
    text: self.data
    touched: False
    padding: '10dp', '10dp'
    on_touch_down:
        touch = args[1]
        if self.collide_point(*touch.pos): app.on_ref_label(self, touch)
        else: self.touched = False
    canvas.before:
        Color:
            rgb: .3, .3, .3
        Rectangle:
            size: self.size
            pos: self.pos

<TxHashLabel@RefLabel>
    data: ''
    text: ' '.join(map(''.join, zip(*[iter(self.data)]*4))) if self.data else ''

<InfoBubble>
    size_hint: None, None
    width: '270dp' if root.fs else min(self.width, dp(270))
    height: self.width if self.fs else (lbl.texture_size[1] + dp(27))
    BoxLayout:
        padding: '5dp' if root.fs else 0
        Widget:
            size_hint: None, 1
            width: '4dp' if root.fs else '2dp'
        Image:
            id: img
            source: root.icon
            mipmap: True
            size_hint: None, 1
            width: (root.width - dp(20)) if root.fs  else (0 if not root.icon else '32dp')
        Widget:
            size_hint_x: None
            width: '5dp'
        Label:
            id: lbl
            markup: True
            font_size: '12sp'
            text: root.message
            text_size: self.width, None
            valign: 'middle'
            size_hint: 1, 1
            width: 0 if root.fs else (root.width - img.width)


<SendReceiveBlueBottom@GridLayout>
    item_height: dp(42)
    foreground_color: .843, .914, .972, 1
    cols: 1
    padding: '12dp', 0
    canvas.before:
        Color:
            rgba: 0.192, .498, 0.745, 1
        BorderImage:
            source: 'atlas://gui/kivy/theming/light/card_bottom'
            size: self.size
            pos: self.pos


<AddressFilter@GridLayout>
	item_height: dp(42)
	item_width: dp(60)
	foreground_color: .843, .914, .972, 1
	cols: 1
	canvas.before:
		Color:
			rgba: 0.192, .498, 0.745, 1
		BorderImage:
			source: 'atlas://gui/kivy/theming/light/card_bottom'
			size: self.size
			pos: self.pos

<SearchBox@GridLayout>
	item_height: dp(42)
	foreground_color: .843, .914, .972, 1
	cols: 1
	padding: '12dp', 0
	canvas.before:
		Color:
			rgba: 0.192, .498, 0.745, 1
        BorderImage:
            source: 'atlas://gui/kivy/theming/light/card_bottom'
            size: self.size
            pos: self.pos

<CardSeparator@Widget>
    size_hint: 1, None
    height: dp(1)
    color: .909, .909, .909, 1
    canvas:
        Color:
            rgba: root.color if root.color else (0, 0, 0, 0)
        Rectangle:
            size: self.size
            pos: self.pos

<CardItem@ToggleButtonBehavior+BoxLayout>
    size_hint: 1, None
    height: '65dp'
    group: 'requests'
    padding: dp(12)
    spacing: dp(5)
    screen: None
    on_release:
        self.screen.show_menu(args[0]) if self.state == 'down' else self.screen.hide_menu()
    canvas.before:
        Color:
            rgba: (0.192, .498, 0.745, 1) if self.state == 'down' else (0.3, 0.3, 0.3, 1)
        Rectangle:
            size: self.size
            pos: self.pos

<BlueButton@Button>:
    background_color: 1, .585, .878, 0
    halign: 'left'
    text_size: (self.width-10, None)
    size_hint: 0.5, None
    default_text: ''
    text: self.default_text
    padding: '5dp', '5dp'
    height: '40dp'
    text_color: self.foreground_color
    disabled_color: 1, 1, 1, 1
    foreground_color: 1, 1, 1, 1
    canvas.before:
        Color:
            rgba: (0.9, .498, 0.745, 1) if self.state == 'down' else self.background_color
        Rectangle:
            size: self.size
            pos: self.pos

<AddressButton@Button>:
	background_color: 1, .585, .878, 0
	halign: 'center'
	text_size: (self.width, None)
	shorten: True
	size_hint: 0.5, None
	default_text: ''
	text: self.default_text
	padding: '5dp', '5dp'
	height: '40dp'
	text_color: self.foreground_color
	disabled_color: 1, 1, 1, 1
	foreground_color: 1, 1, 1, 1
	canvas.before:
		Color:
			rgba: (0.9, .498, 0.745, 1) if self.state == 'down' else self.background_color
		Rectangle:
			size: self.size
			pos: self.pos

<KButton@Button>:
    size_hint: 1, None
    height: '48dp'
    on_release:
        self.parent.update_amount(self.text)


<StripLayout>
    padding: 0, 0, 0, 0

<TabbedPanelStrip>:
    on_parent:
        if self.parent: self.parent.bar_width = 0
        if self.parent: self.parent.scroll_x = 0.5


<TabbedCarousel>
    carousel: carousel
    do_default_tab: False
    Carousel:
        scroll_timeout: 250
        scroll_distance: '100dp'
        anim_type: 'out_quart'
        min_move: .05
        anim_move_duration: .1
        anim_cancel_duration: .54
        on_index: root.on_index(*args)
        id: carousel



<CleanHeader@TabbedPanelHeader>
    border: 16, 0, 16, 0
    markup: False
    text_size: self.size
    halign: 'center'
    valign: 'middle'
    bold: True
    font_size: '12.5sp'
    background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
    background_down: 'atlas://gui/kivy/theming/light/tab_btn_pressed'


<ColoredLabel@Label>:
    font_size: '48sp'
    color: (.6, .6, .6, 1)
    canvas.before:
        Color:
            rgb: (.9, .9, .9)
        Rectangle:
            pos: self.x + sp(2), self.y + sp(2)
            size: self.width - sp(4), self.height - sp(4)


<SettingsItem@ButtonBehavior+BoxLayout>
    orientation: 'vertical'
    title: ''
    description: ''
    size_hint: 1, None
    height: '60dp'
    canvas.before:
        Color:
            rgba: (0.192, .498, 0.745, 1) if self.state == 'down' else (0.3, 0.3, 0.3, 0)
        Rectangle:
            size: self.size
            pos: self.pos
    on_release:
        Clock.schedule_once(self.action)
    Widget
    TopLabel:
        id: title
        text: self.parent.title
        bold: True
        halign: 'left'
    TopLabel:
        text: self.parent.description
        color: 0.8, 0.8, 0.8, 1
        halign: 'left'
    Widget




<ScreenTabs@Screen>
    TabbedCarousel:
        id: panel
        tab_height: '48dp'
        tab_width: panel.width/3
        strip_border: 0, 0, 0, 0
        InvoicesScreen:
            id: invoices_screen
            tab: invoices_tab
        SendScreen:
            id: send_screen
            tab: send_tab
        HistoryScreen:
            id: history_screen
            tab: history_tab
        ReceiveScreen:
            id: receive_screen
            tab: receive_tab
        AddressScreen:
            id: address_screen
            tab: address_tab
        CleanHeader:
            id: invoices_tab
            text: _('Invoices')
            slide: 0
        CleanHeader:
            id: send_tab
            text: _('Send')
            slide: 1
        CleanHeader:
            id: history_tab
            text: _('History')
            slide: 2
        CleanHeader:
            id: receive_tab
            text: _('Receive')
            slide: 3
        CleanHeader:
            id: address_tab
            text: _('Addresses')
            slide: 4


<ActionOvrButton@ActionButton>
    #on_release:
        # fixme: the following line was commented out because it does no seem to do what it is intended
        # Clock.schedule_once(lambda dt: self.parent.parent.dismiss() if self.parent else None, 0.05)
    on_press:
        Clock.schedule_once(lambda dt: app.popup_dialog(self.name), 0.05)
        self.state = 'normal'


BoxLayout:
    orientation: 'vertical'

    canvas.before:
        Color:
            rgb: .6, .6, .6
        Rectangle:
            size: self.size
            source: 'gui/kivy/data/background.png'

    ActionBar:

        ActionView:
            id: av
            ActionPrevious:
                app_icon: 'atlas://gui/kivy/theming/light/logo'
                app_icon_width: '100dp'
                with_previous: False
                size_hint_x: None
                on_release: app.popup_dialog('network')

            ActionButton:
                id: action_status
                important: True
                size_hint: 1, 1
                bold: True
                color: 0.7, 0.7, 0.7, 1
                text: app.status
                font_size: '22dp'
                #minimum_width: '1dp'
                on_release: app.popup_dialog('status')

            ActionOverflow:
                id: ao
                ActionOvrButton:
                    name: 'about'
                    text: _('About')
                ActionOvrButton:
                    name: 'wallets'
                    text: _('Wallets')
                ActionOvrButton:
                    name: 'network'
                    text: _('Network')
                ActionOvrButton:
                    name: 'settings'
                    text: _('Settings')
                    on_parent:
                        # when widget overflow drop down is shown, adjust the width
                        parent = args[1]
                        if parent: ao._dropdown.width = sp(200)
    ScreenManager:
        id: manager
        ScreenTabs:
            id: tabs


================================================
FILE: gui/kivy/main_window.py
================================================
import re
import os
import sys
import time
import datetime
import traceback
from decimal import Decimal
import threading

import electrum
from electrum.bitcoin import TYPE_ADDRESS
from electrum import WalletStorage, Wallet
from electrum_gui.kivy.i18n import _
from electrum.paymentrequest import InvoiceStore
from electrum.util import profiler, InvalidPassword
from electrum.plugins import run_hook
from electrum.util import format_satoshis, format_satoshis_plain
from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED

from kivy.app import App
from kivy.core.window import Window
from kivy.logger import Logger
from kivy.utils import platform
from kivy.properties import (OptionProperty, AliasProperty, ObjectProperty,
                             StringProperty, ListProperty, BooleanProperty, NumericProperty)
from kivy.cache import Cache
from kivy.clock import Clock
from kivy.factory import Factory
from kivy.metrics import inch
from kivy.lang import Builder

## lazy imports for factory so that widgets can be used in kv
#Factory.register('InstallWizard', module='electrum_gui.kivy.uix.dialogs.installwizard')
#Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs')
#Factory.register('OutputList', module='electrum_gui.kivy.uix.dialogs')
#Factory.register('OutputItem', module='electrum_gui.kivy.uix.dialogs')

from .uix.dialogs.installwizard import InstallWizard
from .uix.dialogs import InfoBubble
from .uix.dialogs import OutputList, OutputItem

#from kivy.core.window import Window
#Window.softinput_mode = 'below_target'

# delayed imports: for startup speed on android
notification = app = ref = None
util = False

# register widget cache for keeping memory down timeout to forever to cache
# the data
Cache.register('electrum_widgets', timeout=0)

from kivy.uix.screenmanager import Screen
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.label import Label
from kivy.core.clipboard import Clipboard

Factory.register('TabbedCarousel', module='electrum_gui.kivy.uix.screens')

# Register fonts without this you won't be able to use bold/italic...
# inside markup.
from kivy.core.text import Label
Label.register('Roboto',
               'gui/kivy/data/fonts/Roboto.ttf',
               'gui/kivy/data/fonts/Roboto.ttf',
               'gui/kivy/data/fonts/Roboto-Bold.ttf',
               'gui/kivy/data/fonts/Roboto-Bold.ttf')


from electrum.util import base_units


class ElectrumWindow(App):

    electrum_config = ObjectProperty(None)
    language = StringProperty('en')

    # properties might be updated by the network
    num_blocks = NumericProperty(0)
    num_nodes = NumericProperty(0)
    server_host = StringProperty('')
    server_port = StringProperty('')
    num_chains = NumericProperty(0)
    blockchain_name = StringProperty('')
    blockchain_checkpoint = NumericProperty(0)

    auto_connect = BooleanProperty(False)
    def on_auto_connect(self, instance, x):
        host, port, protocol, proxy, auto_connect = self.network.get_parameters()
        self.network.set_parameters(host, port, protocol, proxy, self.auto_connect)
    def toggle_auto_connect(self, x):
        self.auto_connect = not self.auto_connect

    def choose_server_dialog(self, popup):
        from .uix.dialogs.choice_dialog import ChoiceDialog
        protocol = 's'
        def cb2(host):
            from electrum.bitcoin import NetworkConstants
            pp = servers.get(host, NetworkConstants.DEFAULT_PORTS)
            port = pp.get(protocol, '')
            popup.ids.host.text = host
            popup.ids.port.text = port
        servers = self.network.get_servers()
        ChoiceDialog(_('Choose a server'), sorted(servers), popup.ids.host.text, cb2).open()

    def choose_blockchain_dialog(self, dt):
        from .uix.dialogs.choice_dialog import ChoiceDialog
        chains = self.network.get_blockchains()
        def cb(name):
            for index, b in self.network.blockchains.items():
                if name == self.network.get_blockchain_name(b):
                    self.network.follow_chain(index)
                    #self.block
        names = [self.network.blockchains[b].get_name() for b in chains]
        if len(names) >1:
            ChoiceDialog(_('Choose your chain'), names, '', cb).open()

    use_rbf = BooleanProperty(False)
    def on_use_rbf(self, instance, x):
        self.electrum_config.set_key('use_rbf', self.use_rbf, True)

    use_change = BooleanProperty(False)
    def on_use_change(self, instance, x):
        self.electrum_config.set_key('use_change', self.use_change, True)

    use_unconfirmed = BooleanProperty(False)
    def on_use_unconfirmed(self, instance, x):
        self.electrum_config.set_key('confirmed_only', not self.use_unconfirmed, True)

    def set_URI(self, uri):
        self.switch_to('send')
        self.send_screen.set_URI(uri)

    def on_new_intent(self, intent):
        if intent.getScheme() != 'bitcoin':
            return
        uri = intent.getDataString()
        self.set_URI(uri)

    def on_language(self, instance, language):
        Logger.info('language: {}'.format(language))
        _.switch_lang(language)

    def update_history(self, *dt):
        if self.history_screen:
            self.history_screen.update()

    def on_quotes(self, d):
        Logger.info("on_quotes")
        self._trigger_update_history()

    def on_history(self, d):
        Logger.info("on_history")
        self._trigger_update_history()

    def _get_bu(self):
        return self.electrum_config.get('base_unit', 'BTCP')

    def _set_bu(self, value):
        assert value in base_units.keys()
        self.electrum_config.set_key('base_unit', value, True)
        self._trigger_update_status()
        self._trigger_update_history()

    base_unit = AliasProperty(_get_bu, _set_bu)
    status = StringProperty('')
    fiat_unit = StringProperty('')

    def on_fiat_unit(self, a, b):
        self._trigger_update_history()

    def decimal_point(self):
        return base_units[self.base_unit]

    def btc_to_fiat(self, amount_str):
        if not amount_str:
            return ''
        rate = self.fx.exchange_rate()
        if not rate:
            return ''
        fiat_amount = self.get_amount(amount_str + ' ' + self.base_unit) * rate / pow(10, 8)
        return "{:.2f}".format(fiat_amount).rstrip('0').rstrip('.')

    def fiat_to_btc(self, fiat_amount):
        if not fiat_amount:
            return ''
        rate = self.fx.exchange_rate()
        if not rate:
            return ''
        satoshis = int(pow(10,8) * Decimal(fiat_amount) / Decimal(rate))
        return format_satoshis_plain(satoshis, self.decimal_point())

    def get_amount(self, amount_str):
        a, u = amount_str.split()
        assert u == self.base_unit
        try:
            x = Decimal(a)
        except:
            return None
        p = pow(10, self.decimal_point())
        return int(p * x)


    _orientation = OptionProperty('landscape',
                                 options=('landscape', 'portrait'))

    def _get_orientation(self):
        return self._orientation

    orientation = AliasProperty(_get_orientation,
                                None,
                                bind=('_orientation',))
    '''Tries to ascertain the kind of device the app is running on.
    Cane be one of `tablet` or `phone`.

    :data:`orientation` is a read only `AliasProperty` Defaults to 'landscape'
    '''

    _ui_mode = OptionProperty('phone', options=('tablet', 'phone'))

    def _get_ui_mode(self):
        return self._ui_mode

    ui_mode = AliasProperty(_get_ui_mode,
                            None,
                            bind=('_ui_mode',))
    '''Defines tries to ascertain the kind of device the app is running on.
    Cane be one of `tablet` or `phone`.

    :data:`ui_mode` is a read only `AliasProperty` Defaults to 'phone'
    '''

    def __init__(self, **kwargs):
        # initialize variables
        self._clipboard = Clipboard
        self.info_bubble = None
        self.nfcscanner = None
        self.tabs = None
        self.is_exit = False
        self.wallet = None

        App.__init__(self)#, **kwargs)

        title = _('Bitcoin Private Electrum')
        self.electrum_config = config = kwargs.get('config', None)
        self.language = config.get('language', 'en')
        self.network = network = kwargs.get('network', None)
        if self.network:
            self.num_blocks = self.network.get_local_height()
            self.num_nodes = len(self.network.get_interfaces())
            host, port, protocol, proxy_config, auto_connect = self.network.get_parameters()
            self.server_host = host
            self.server_port = port
            self.auto_connect = auto_connect
            self.proxy_config = proxy_config if proxy_config else {}

        self.plugins = kwargs.get('plugins', [])
        self.gui_object = kwargs.get('gui_object', None)
        self.daemon = self.gui_object.daemon
        self.fx = self.daemon.fx

        self.use_rbf = config.get('use_rbf', True)
        self.use_change = config.get('use_change', True)
        self.use_unconfirmed = not config.get('confirmed_only', False)

        # create triggers so as to minimize updation a max of 2 times a sec
        self._trigger_update_wallet = Clock.create_trigger(self.update_wallet, .5)
        self._trigger_update_status = Clock.create_trigger(self.update_status, .5)
        self._trigger_update_history = Clock.create_trigger(self.update_history, .5)
        self._trigger_update_interfaces = Clock.create_trigger(self.update_interfaces, .5)
        # cached dialogs
        self._settings_dialog = None
        self._password_dialog = None

    def wallet_name(self):
        return os.path.basename(self.wallet.storage.path) if self.wallet else ' '

    def on_pr(self, pr):
        if pr.verify(self.wallet.contacts):
            key = self.wallet.invoices.add(pr)
            if self.invoices_screen:
                self.invoices_screen.update()
            status = self.wallet.invoices.get_status(key)
            if status == PR_PAID:
                self.show_error("Invoice already paid")
                self.send_screen.do_clear()
            else:
                if pr.has_expired():
                    self.show_error(_('Payment request has expired.'))
                else:
                    self.switch_to('send')
                    self.send_screen.set_request(pr)
        else:
            self.show_error("Invoice error:" + pr.error)
            self.send_screen.do_clear()

    def on_qr(self, data):
        from electrum.bitcoin import base_decode, is_address
        data = data.strip()
        if is_address(data):
            self.set_URI(data)
            return
        if data.startswith('bitcoin:'):
            self.set_URI(data)
            return
        # try to decode transaction
        from electrum.transaction import Transaction
        from electrum.util import bh2u
        try:
            text = bh2u(base_decode(data, None, base=43))
            tx = Transaction(text)
            tx.deserialize()
        except:
            tx = None
        if tx:
            self.tx_dialog(tx)
            return
        # show error
        self.show_error("Unable to decode QR data")

    def update_tab(self, name):
        s = getattr(self, name + '_screen', None)
        if s:
            s.update()

    @profiler
    def update_tabs(self):
        for tab in ['invoices', 'send', 'history', 'receive', 'address']:
            self.update_tab(tab)

    def switch_to(self, name):
        s = getattr(self, name + '_screen', None)
        if s is None:
            s = self.tabs.ids[name + '_screen']
            s.load_screen()
        panel = self.tabs.ids.panel
        tab = self.tabs.ids[name + '_tab']
        panel.switch_to(tab)

    def show_request(self, addr):
        self.switch_to('receive')
        self.receive_screen.screen.address = addr

    def show_pr_details(self, req, status, is_invoice):
        from electrum.util import format_time
        requestor = req.get('requestor')
        exp = req.get('exp')
        memo = req.get('memo')
        amount = req.get('amount')
        fund = req.get('fund')
        popup = Builder.load_file('gui/kivy/uix/ui_screens/invoice.kv')
        popup.is_invoice = is_invoice
        popup.amount = amount
        popup.requestor = requestor if is_invoice else req.get('address')
        popup.exp = format_time(exp) if exp else ''
        popup.description = memo if memo else ''
        popup.signature = req.get('signature', '')
        popup.status = status
        popup.fund = fund if fund else 0
        txid = req.get('txid')
        popup.tx_hash = txid or ''
        popup.on_open = lambda: popup.ids.output_list.update(req.get('outputs', []))
        popup.export = self.export_private_keys
        popup.open()

    def show_addr_details(self, req, status):
        from electrum.util import format_time
        fund = req.get('fund')
        isaddr = 'y'
        popup = Builder.load_file('gui/kivy/uix/ui_screens/invoice.kv')
        popup.isaddr = isaddr
        popup.is_invoice = False
        popup.status = status
        popup.requestor = req.get('address')
        popup.fund = fund if fund else 0
        popup.export = self.export_private_keys
        popup.open()

    def qr_dialog(self, title, data, show_text=False):
        from .uix.dialogs.qr_dialog import QRDialog
        popup = QRDialog(title, data, show_text)
        popup.open()

    def scan_qr(self, on_complete):
        if platform != 'android':
            return
        from jnius import autoclass, cast
        from android import activity
        PythonActivity = autoclass('org.kivy.android.PythonActivity')
        SimpleScannerActivity = autoclass("org.electrum.qr.SimpleScannerActivity")
        Intent = autoclass('android.content.Intent')
        intent = Intent(PythonActivity.mActivity, SimpleScannerActivity)

        def on_qr_result(requestCode, resultCode, intent):
            if resultCode == -1:  # RESULT_OK:
                #  this doesn't work due to some bug in jnius:
                # contents = intent.getStringExtra("text")
                String = autoclass("java.lang.String")
                contents = intent.getStringExtra(String("text"))
                on_complete(contents)
        activity.bind(on_activity_result=on_qr_result)
        PythonActivity.mActivity.startActivityForResult(intent, 0)

    def do_share(self, data, title):
        if platform != 'android':
            return
        from jnius import autoclass, cast
        JS = autoclass('java.lang.String')
        Intent = autoclass('android.content.Intent')
        sendIntent = Intent()
        sendIntent.setAction(Intent.ACTION_SEND)
        sendIntent.setType("text/plain")
        sendIntent.putExtra(Intent.EXTRA_TEXT, JS(data))
        PythonActivity = autoclass('org.kivy.android.PythonActivity')
        currentActivity = cast('android.app.Activity', PythonActivity.mActivity)
        it = Intent.createChooser(sendIntent, cast('java.lang.CharSequence', JS(title)))
        currentActivity.startActivity(it)

    def build(self):
        return Builder.load_file('gui/kivy/main.kv')

    def _pause(self):
        if platform == 'android':
            # move activity to back
            from jnius import autoclass
            python_act = autoclass('org.kivy.android.PythonActivity')
            mActivity = python_act.mActivity
            mActivity.moveTaskToBack(True)

    def on_start(self):
        ''' This is the start point of the kivy ui
        '''
        import time
        Logger.info('Time to on_start: {} <<<<<<<<'.format(time.clock()))
        win = Window
        win.bind(size=self.on_size, on_keyboard=self.on_keyboard)
        win.bind(on_key_down=self.on_key_down)
        #win.softinput_mode = 'below_target'
        self.on_size(win, win.size)
        self.init_ui()
        self.load_wallet_by_name(self.electrum_config.get_wallet_path())
        # init plugins
        run_hook('init_kivy', self)
        # fiat currency
        self.fiat_unit = self.fx.ccy if self.fx.is_enabled() else ''
        # default tab
        self.switch_to('history')
        # bind intent for bitcoin: URI scheme
        if platform == 'android':
            from android import activity
            from jnius import autoclass
            PythonActivity = autoclass('org.kivy.android.PythonActivity')
            mactivity = PythonActivity.mActivity
            self.on_new_intent(mactivity.getIntent())
            activity.bind(on_new_intent=self.on_new_intent)
        # connect callbacks
        if self.network:
            interests = ['updated', 'status', 'new_transaction', 'verified', 'interfaces']
            self.network.register_callback(self.on_network_event, interests)
            self.network.register_callback(self.on_quotes, ['on_quotes'])
            self.network.register_callback(self.on_history, ['on_history'])
        # URI passed in config
        uri = self.electrum_config.get('url')
        if uri:
            self.set_URI(uri)


    def get_wallet_path(self):
        if self.wallet:
            return self.wallet.storage.path
        else:
            return ''

    def on_wizard_complete(self, instance, wallet):
        if wallet:
            wallet.start_threads(self.daemon.network)
            self.daemon.add_wallet(wallet)
            self.load_wallet(wallet)
        self.on_resume()

    def load_wallet_by_name(self, path):
        if not path:
            return
        wallet = self.daemon.load_wallet(path, None)
        if wallet:
            if wallet != self.wallet:
                self.stop_wallet()
                self.load_wallet(wallet)
                self.on_resume()
        else:
            Logger.debug('Electrum: Wallet not found. Launching install wizard')
            storage = WalletStorage(path)
            wizard = Factory.InstallWizard(self.electrum_config, storage)
            wizard.bind(on_wizard_complete=self.on_wizard_complete)
            action = wizard.storage.get_action()
            wizard.run(action)

    def on_stop(self):
        self.stop_wallet()

    def stop_wallet(self):
        if self.wallet:
            self.daemon.stop_wallet(self.wallet.storage.path)
            self.wallet = None

    def on_key_down(self, instance, key, keycode, codepoint, modifiers):
        if 'ctrl' in modifiers:
            # q=24 w=25
            if keycode in (24, 25):
                self.stop()
            elif keycode == 27:
                # r=27
                # force update wallet
                self.update_wallet()
            elif keycode == 112:
                # pageup
                #TODO move to next tab
                pass
            elif keycode == 117:
                # pagedown
                #TODO move to prev tab
                pass
        #TODO: alt+tab_number to activate the particular tab

    def on_keyboard(self, instance, key, keycode, codepoint, modifiers):
        if key == 27 and self.is_exit is False:
            self.is_exit = True
            self.show_info(_('Press again to exit'))
            return True
        # override settings button
        if key in (319, 282): #f1/settings button on android
            #self.gui.main_gui.toggle_settings(self)
            return True

    def settings_dialog(self):
        from .uix.dialogs.settings import SettingsDialog
        if self._settings_dialog is None:
            self._settings_dialog = SettingsDialog(self)
        self._settings_dialog.update()
        self._settings_dialog.open()

    def popup_dialog(self, name):
        if name == 'settings':
            self.settings_dialog()
        elif name == 'wallets':
            from .uix.dialogs.wallets import WalletDialog
            d = WalletDialog()
            d.open()
        else:
            popup = Builder.load_file('gui/kivy/uix/ui_screens/'+name+'.kv')
            popup.open()

    @profiler
    def init_ui(self):
        ''' Initialize The Ux part of electrum. This function performs the basic
        tasks of setting up the ui.
        '''
        #from weakref import ref

        self.funds_error = False
        # setup UX
        self.screens = {}

        #setup lazy imports for mainscreen
        Factory.register('AnimatedPopup',
                         module='electrum_gui.kivy.uix.dialogs')
        Factory.register('QRCodeWidget',
                         module='electrum_gui.kivy.uix.qrcodewidget')

        # preload widgets. Remove this if you want to load the widgets on demand
        #Cache.append('electrum_widgets', 'AnimatedPopup', Factory.AnimatedPopup())
        #Cache.append('electrum_widgets', 'QRCodeWidget', Factory.QRCodeWidget())

        # load and focus the ui
        self.root.manager = self.root.ids['manager']

        self.history_screen = None
        self.contacts_screen = None
        self.send_screen = None
        self.invoices_screen = None
        self.receive_screen = None
        self.requests_screen = None
        self.address_screen = None
        self.icon = "icons/electrum.png"
        self.tabs = self.root.ids['tabs']

    def update_interfaces(self, dt):
        self.num_nodes = len(self.network.get_interfaces())
        self.num_chains = len(self.network.get_blockchains())
        chain = self.network.blockchain()
        self.blockchain_checkpoint = chain.get_checkpoint()
        self.blockchain_name = chain.get_name()
        if self.network.interface:
            self.server_host = self.network.interface.host

    def on_network_event(self, event, *args):
        Logger.info('network event: '+ event)
        if event == 'interfaces':
            self._trigger_update_interfaces()
        elif event == 'updated':
            self._trigger_update_wallet()
            self._trigger_update_status()
        elif event == 'status':
            self._trigger_update_status()
        elif event == 'new_transaction':
            self._trigger_update_wallet()
        elif event == 'verified':
            self._trigger_update_wallet()

    @profiler
    def load_wallet(self, wallet):
        self.wallet = wallet
        self.update_wallet()
        # Once GUI has been initialized check if we want to announce something
        # since the callback has been called before the GUI was initialized
        if self.receive_screen:
            self.receive_screen.clear()
        self.update_tabs()
        run_hook('load_wallet', wallet, self)

    def update_status(self, *dt):
        self.num_blocks = self.network.get_local_height()
        if not self.wallet:
            self.status = _("No Wallet")
            return
        if self.network is None or not self.network.is_running():
            status = _("Offline")
        elif self.network.is_connected():
            server_height = self.network.get_server_height()
            server_lag = self.network.get_local_height() - server_height
            if not self.wallet.up_to_date or server_height == 0:
                status = _("Synchronizing...")
            elif server_lag > 1:
                status = _("Server lagging (%d blocks)"%server_lag)
            else:
                c, u, x = self.wallet.get_balance()
                text = self.format_amount(c+x+u)
                status = str(text.strip() + ' ' + self.base_unit)
        else:
            status = _("Disconnected")

        n = self.wallet.basename()
        self.status = '[size=15dp]%s[/size]\n%s' %(n, status)
        #fiat_balance = self.fx.format_amount_and_units(c+u+x) or ''

    def get_max_amount(self):
        inputs = self.wallet.get_spendable_coins(None, self.electrum_config)
        addr = str(self.send_screen.screen.address) or self.wallet.dummy_address()
        outputs = [(TYPE_ADDRESS, addr, '!')]
        tx = self.wallet.make_unsigned_transaction(inputs, outputs, self.electrum_config)
        amount = tx.output_value()
        return format_satoshis_plain(amount, self.decimal_point())

    def format_amount(self, x, is_diff=False, whitespaces=False):
        return format_satoshis(x, is_diff, 0, self.decimal_point(), whitespaces)

    def format_amount_and_units(self, x):
        return format_satoshis_plain(x, self.decimal_point()) + ' ' + self.base_unit

    #@profiler
    def update_wallet(self, *dt):
        self._trigger_update_status()
        if self.wallet and (self.wallet.up_to_date or not self.network or not self.network.is_connected()):
            self.update_tabs()

    def notify(self, message):
        try:
            global notification, os
            if not notification:
                from plyer import notification
            icon = (os.path.dirname(os.path.realpath(__file__))
                    + '/../../' + self.icon)
            notification.notify('Electrum', message,
                            app_icon=icon, app_name='Electrum')
        except ImportError:
            Logger.Error('Notification: needs plyer; `sudo pip install plyer`')

    def on_pause(self):
        # pause nfc
        if self.nfcscanner:
            self.nfcscanner.nfc_disable()
        return True

    def on_resume(self):
        if self.nfcscanner:
            self.nfcscanner.nfc_enable()
        # workaround p4a bug:
        # show an empty info bubble, to refresh the display
        self.show_info_bubble('', duration=0.1, pos=(0,0), width=1, arrow_pos=None)

    def on_size(self, instance, value):
        width, height = value
        self._orientation = 'landscape' if width > height else 'portrait'
        self._ui_mode = 'tablet' if min(width, height) > inch(3.51) else 'phone'

    def on_ref_label(self, label, touch):
        if label.touched:
            label.touched = False
            self.qr_dialog(label.name, label.data, True)
        else:
            label.touched = True
            self._clipboard.copy(label.data)
            Clock.schedule_once(lambda dt: self.show_info(_('Text copied to clipboard.\nTap again to display it as QR code.')))

    def set_send(self, address, amount, label, message):
        self.send_payment(address, amount=amount, label=label, message=message)

    def show_error(self, error, width='200dp', pos=None, arrow_pos=None,
        exit=False, icon='atlas://gui/kivy/theming/light/error', duration=0,
        modal=False):
        ''' Show a error Message Bubble.
        '''
        self.show_info_bubble( text=error, icon=icon, width=width,
            pos=pos or Window.center, arrow_pos=arrow_pos, exit=exit,
            duration=duration, modal=modal)

    def show_info(self, error, width='200dp', pos=None, arrow_pos=None,
        exit=False, duration=0, modal=False):
        ''' Show a Info Message Bubble.
        '''
        self.show_error(error, icon='atlas://gui/kivy/theming/light/important',
            duration=duration, modal=modal, exit=exit, pos=pos,
            arrow_pos=arrow_pos)

    def show_info_bubble(self, text=_('Hello World'), pos=None, duration=0,
        arrow_pos='bottom_mid', width=None, icon='', modal=False, exit=False):
        '''Method to show a Information Bubble

        .. parameters::
            text: Message to be displayed
            pos: position for the bubble
            duration: duration the bubble remains on screen. 0 = click to hide
            width: width of the Bubble
            arrow_pos: arrow position for the bubble
        '''
        info_bubble = self.info_bubble
        if not info_bubble:
            info_bubble = self.info_bubble = Factory.InfoBubble()

        win = Window
        if info_bubble.parent:
            win.remove_widget(info_bubble
                                 if not info_bubble.modal else
                                 info_bubble._modal_view)

        if not arrow_pos:
            info_bubble.show_arrow = False
        else:
            info_bubble.show_arrow = True
            info_bubble.arrow_pos = arrow_pos
        img = info_bubble.ids.img
        if text == 'texture':
            # icon holds a texture not a source image
            # display the texture in full screen
            text = ''
            img.texture = icon
            info_bubble.fs = True
            info_bubble.show_arrow = False
            img.allow_stretch = True
            info_bubble.dim_background = True
            info_bubble.background_image = 'atlas://gui/kivy/theming/light/card'
        else:
            info_bubble.fs = False
            info_bubble.icon = icon
            #if img.texture and img._coreimage:
            #    img.reload()
            img.allow_stretch = False
            info_bubble.dim_background = False
            info_bubble.background_image = 'atlas://data/images/defaulttheme/bubble'
        info_bubble.message = text
        if not pos:
            pos = (win.center[0], win.center[1] - (info_bubble.height/2))
        info_bubble.show(pos, duration, width, modal=modal, exit=exit)

    def tx_dialog(self, tx):
        from .uix.dialogs.tx_dialog import TxDialog
        d = TxDialog(self, tx)
        d.open()

    def sign_tx(self, *args):
        threading.Thread(target=self._sign_tx, args=args).start()

    def _sign_tx(self, tx, password, on_success, on_failure):
        try:
            self.wallet.sign_transaction(tx, password)
        except InvalidPassword:
            Clock.schedule_once(lambda dt: on_failure(_("Invalid PIN")))
            return
        Clock.schedule_once(lambda dt: on_success(tx))

    def _broadcast_thread(self, tx, on_complete):
        ok, txid = self.network.broadcast(tx)
        Clock.schedule_once(lambda dt: on_complete(ok, txid))

    def broadcast(self, tx, pr=None):
        def on_complete(ok, msg):
            if ok:
                self.show_info(_('Payment sent.'))
                if self.send_screen:
                    self.send_screen.do_clear()
                if pr:
                    self.wallet.invoices.set_paid(pr, tx.txid())
                    self.wallet.invoices.save()
                    self.update_tab('invoices')
            else:
                self.show_error(msg)

        if self.network and self.network.is_connected():
            self.show_info(_('Sending'))
            threading.Thread(target=self._broadcast_thread, args=(tx, on_complete)).start()
        else:
            self.show_info(_('Cannot broadcast transaction') + ':\n' + _('Not connected'))

    def description_dialog(self, screen):
        from .uix.dialogs.label_dialog import LabelDialog
        text = screen.message
        def callback(text):
            screen.message = text
        d = LabelDialog(_('Enter description'), text, callback)
        d.open()

    @profiler
    def amount_dialog(self, screen, show_max):
        from .uix.dialogs.amount_dialog import AmountDialog
        amount = screen.amount
        if amount:
            amount, u = str(amount).split()
            assert u == self.base_unit
        def cb(amount):
            screen.amount = amount
        popup = AmountDialog(show_max, amount, cb)
        popup.open()

    def protected(self, msg, f, args):
        if self.wallet.has_password():
            self.password_dialog(msg, f, args)
        else:
            f(*(args + (None,)))

    def delete_wallet(self):
        from .uix.dialogs.question import Question
        basename = os.path.basename(self.wallet.storage.path)
        d = Question(_('Delete wallet?') + '\n' + basename, self._delete_wallet)
        d.open()

    def _delete_wallet(self, b):
        if b:
            basename = os.path.basename(self.wallet.storage.path)
            self.protected(_("Enter your PIN code to confirm deletion of %s") % basename, self.__delete_wallet, ())

    def __delete_wallet(self, pw):
        wallet_path = self.get_wallet_path()
        dirname = os.path.dirname(wallet_path)
        basename = os.path.basename(wallet_path)
        if self.wallet.has_password():
            try:
                self.wallet.check_password(pw)
            except:
                self.show_error("Invalid PIN")
                return
        self.stop_wallet()
        os.unlink(wallet_path)
        self.show_error("Wallet removed:" + basename)
        d = os.listdir(dirname)
        name = 'default_wallet'
        new_path = os.path.join(dirname, name)
        self.load_wallet_by_name(new_path)

    def show_seed(self, label):
        self.protected(_("Enter your PIN code in order to decrypt your seed"), self._show_seed, (label,))

    def _show_seed(self, label, password):
        if self.wallet.has_password() and password is None:
            return
        keystore = self.wallet.keystore
        try:
            seed = keystore.get_seed(password)
            passphrase = keystore.get_passphrase(password)
        except:
            self.show_error("Invalid PIN")
            return
        label.text = _('Seed') + ':\n' + seed
        if passphrase:
            label.text += '\n\n' + _('Passphrase') + ': ' + passphrase

    def change_password(self, cb):
        if self.wallet.has_password():
            self.protected(_("Changing PIN code.") + '\n' + _("Enter your current PIN:"), self._change_password, (cb,))
        else:
            self._change_password(cb, None)

    def _change_password(self, cb, old_password):
        if self.wallet.has_password():
            if old_password is None:
                return
            try:
                self.wallet.check_password(old_password)
            except InvalidPassword:
                self.show_error("Invalid PIN")
                return
        self.password_dialog(_('Enter new PIN'), self._change_password2, (cb, old_password,))

    def _change_password2(self, cb, old_password, new_password):
        self.password_dialog(_('Confirm new PIN'), self._change_password3, (cb, old_password, new_password))

    def _change_password3(self, cb, old_password, new_password, confirmed_password):
        if new_password == confirmed_password:
            self.wallet.update_password(old_password, new_password)
            cb()
        else:
            self.show_error("PIN numbers do not match")

    def password_dialog(self, msg, f, args):
        from .uix.dialogs.password_dialog import PasswordDialog
        def callback(pw):
            Clock.schedule_once(lambda x: f(*(args + (pw,))), 0.1)
        if self._password_dialog is None:
            self._password_dialog = PasswordDialog()
        self._password_dialog.init(msg, callback)
        self._password_dialog.open()

    def export_private_keys(self, pk_label, addr):
        if self.wallet.is_watching_only():
            self.show_info(_('This is a watching-only wallet. It does not contain private keys.'))
            return
        def show_private_key(addr, pk_label, password):
            if self.wallet.has_password() and password is None:
                return
            if not self.wallet.can_export():
                return
            key = str(self.wallet.export_private_key(addr, password)[0])
            pk_label.data = key
        self.protected(_("Enter your PIN code in order to decrypt your private key"), show_private_key, (addr, pk_label))


================================================
FILE: gui/kivy/nfc_scanner/__init__.py
================================================
__all__ = ('NFCBase', 'NFCScanner')

class NFCBase(Widget):
    ''' This is the base Abstract definition class that the actual hardware dependent
    implementations would be based on. If you want to define a feature that is
    accissible and implemented by every platform implementation then define that
    method in this class.
    '''

    payload = ObjectProperty(None)
    '''This is the data gotten from the tag. 
    '''

    def nfc_init(self):
        ''' Initialize the adapter.
        '''
        pass

    def nfc_disable(self):
        ''' Disable scanning
        '''
        pass

    def nfc_enable(self):
        ''' Enable Scanning
        '''
        pass

    def nfc_enable_exchange(self, data):
        ''' Enable P2P Ndef exchange
        '''
        pass

    def nfc_disable_exchange(self):
        ''' Disable/Stop P2P Ndef exchange
        '''
        pass

# load NFCScanner implementation

NFCScanner = core_select_lib('nfc_manager', (
    # keep the dummy implementtation as the last one to make it the fallback provider.NFCScanner = core_select_lib('nfc_scanner', (
    ('android', 'scanner_android', 'ScannerAndroid'),
    ('dummy', 'scanner_dummy', 'ScannerDummy')), True, 'electrum_gui.kivy')


================================================
FILE: gui/kivy/nfc_scanner/scanner_android.py
================================================
'''This is the Android implementatoin of NFC Scanning using the
built in NFC adapter of some android phones.
'''

from kivy.app import App
from kivy.clock import Clock
#Detect which platform we are on
from kivy.utils import platform
if platform != 'android':
    raise ImportError
import threading

from electrum_gui.kivy.nfc_scanner import NFCBase
from jnius import autoclass, cast
from android.runnable import run_on_ui_thread
from android import activity

BUILDVERSION = autoclass('android.os.Build$VERSION').SDK_INT
NfcAdapter = autoclass('android.nfc.NfcAdapter')
PythonActivity = autoclass('org.kivy.android.PythonActivity')
JString = autoclass('java.lang.String')
Charset = autoclass('java.nio.charset.Charset')
locale = autoclass('java.util.Locale')
Intent = autoclass('android.content.Intent')
IntentFilter = autoclass('android.content.IntentFilter')
PendingIntent = autoclass('android.app.PendingIntent')
Ndef = autoclass('android.nfc.tech.Ndef')
NdefRecord = autoclass('android.nfc.NdefRecord')
NdefMessage = autoclass('android.nfc.NdefMessage')

app = None



class ScannerAndroid(NFCBase):
    ''' This is the class responsible for handling the interace with the
    Android NFC adapter. See Module Documentation for deatils.
    '''

    name = 'NFCAndroid'

    def nfc_init(self):
        ''' This is where we initialize NFC adapter.
        '''
        # Initialize NFC
        global app
        app = App.get_running_app()

        # Make sure we are listening to new intent 
        activity.bind(on_new_intent=self.on_new_intent)

        # Configure nfc
        self.j_context = context = PythonActivity.mActivity
        self.nfc_adapter = NfcAdapter.getDefaultAdapter(context)
        # Check if adapter exists
        if not self.nfc_adapter:
            return False
        
        # specify that we want our activity to remain on top whan a new intent
        # is fired
        self.nfc_pending_intent = PendingIntent.getActivity(context, 0,
            Intent(context, context.getClass()).addFlags(
                Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)

        # Filter for different types of action, by default we enable all.
        # These are only for handling different NFC technologies when app is in foreground
        self.ndef_detected = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED)
        #self.tech_detected = IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)
        #self.tag_detected = IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED)

        # setup tag discovery for ourt tag type
        try:
            self.ndef_detected.addCategory(Intent.CATEGORY_DEFAULT)
            # setup the foreground dispatch to detect all mime types
            self.ndef_detected.addDataType('*/*')

            self.ndef_exchange_filters = [self.ndef_detected]
        except Exception as err:
            raise Exception(repr(err))
        return True

    def get_ndef_details(self, tag):
        ''' Get all the details from the tag.
        '''
        details = {}

        try:
            #print 'id'
            details['uid'] = ':'.join(['{:02x}'.format(bt & 0xff) for bt in tag.getId()])
            #print 'technologies'
            details['Technologies'] = tech_list = [tech.split('.')[-1] for tech in tag.getTechList()]
            #print 'get NDEF tag details'
            ndefTag = cast('android.nfc.tech.Ndef', Ndef.get(tag))
            #print 'tag size'
            details['MaxSize'] = ndefTag.getMaxSize()
            #details['usedSize'] = '0'
            #print 'is tag writable?'
            details['writable'] = ndefTag.isWritable()
            #print 'Data format'
            # Can be made readonly
            # get NDEF message details
            ndefMesg = ndefTag.getCachedNdefMessage()
            # get size of current records
            details['consumed'] = len(ndefMesg.toByteArray())
            #print 'tag type'
            details['Type'] = ndefTag.getType()

            # check if tag is empty
            if not ndefMesg:
                details['Message'] = None
                return details

            ndefrecords =  ndefMesg.getRecords()
            length = len(ndefrecords)
            #print 'length', length
            # will contain the NDEF record types
            recTypes = []
            for record in ndefrecords:
                recTypes.append({
                    'type': ''.join(map(unichr, record.getType())),
                    'payload': ''.join(map(unichr, record.getPayload()))
                    })

            details['recTypes'] = recTypes
        except Exception as err:
            print(str(err))

        return details

    def on_new_intent(self, intent):
        ''' This functions is called when the application receives a
        new intent, for the ones the application has registered previously,
        either in the manifest or in the foreground dispatch setup in the
        nfc_init function above. 
        '''

        action_list = (NfcAdapter.ACTION_NDEF_DISCOVERED,)
        # get TAG
        #tag = cast('android.nfc.Tag', intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))

        #details = self.get_ndef_details(tag)

        if intent.getAction() not in action_list:
            print('unknow action, avoid.')
            return

        rawmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
        if not rawmsgs:
            return
        for message in rawmsgs:
            message = cast(NdefMessage, message)
            payload = message.getRecords()[0].getPayload()
            print('payload: {}'.format(''.join(map(chr, payload))))

    def nfc_disable(self):
        '''Disable app from handling tags.
        '''
        self.disable_foreground_dispatch()

    def nfc_enable(self):
        '''Enable app to handle tags when app in foreground.
        '''
        self.enable_foreground_dispatch()

    def create_AAR(self):
        '''Create the record responsible for linking our application to the tag.
        '''
        return NdefRecord.createApplicationRecord(JString("org.electrum.kivy"))

    def create_TNF_EXTERNAL(self, data):
        '''Create our actual payload record.
        '''
        if BUILDVERSION >= 14:
            domain = "org.electrum"
            stype = "externalType"
            extRecord = NdefRecord.createExternal(domain, stype, data)
        else:
            # Creating the NdefRecord manually:
            extRecord = NdefRecord(
                NdefRecord.TNF_EXTERNAL_TYPE,
                "org.electrum:externalType",
                '',
                data)
        return extRecord

    def create_ndef_message(self, *recs):
        ''' Create the Ndef message that will written to tag
        '''
        records = []
        for record in recs:
            if record:
                records.append(record)

        return NdefMessage(records)


    @run_on_ui_thread
    def disable_foreground_dispatch(self):
        '''Disable foreground dispatch when app is paused.
        '''
        self.nfc_adapter.disableForegroundDispatch(self.j_context)

    @run_on_ui_thread
    def enable_foreground_dispatch(self):
        '''Start listening for new tags
        '''
        self.nfc_adapter.enableForegroundDispatch(self.j_context,
                self.nfc_pending_intent, self.ndef_exchange_filters, self.ndef_tech_list)

    @run_on_ui_thread
    def _nfc_enable_ndef_exchange(self, data):
        # Enable p2p exchange
        # Create record
        ndef_record = NdefRecord(
                NdefRecord.TNF_MIME_MEDIA,
                'org.electrum.kivy', '', data)
        
        # Create message
        ndef_message = NdefMessage([ndef_record])

        # Enable ndef push
        self.nfc_adapter.enableForegroundNdefPush(self.j_context, ndef_message)

        # Enable dispatch
        self.nfc_adapter.enableForegroundDispatch(self.j_context,
                self.nfc_pending_intent, self.ndef_exchange_filters, [])

    @run_on_ui_thread
    def _nfc_disable_ndef_exchange(self):
        # Disable p2p exchange
        self.nfc_adapter.disableForegroundNdefPush(self.j_context)
        self.nfc_adapter.disableForegroundDispatch(self.j_context)

    def nfc_enable_exchange(self, data):
        '''Enable Ndef exchange for p2p
        '''
        self._nfc_enable_ndef_exchange()

    def nfc_disable_exchange(self):
        ''' Disable Ndef exchange for p2p
        '''
        self._nfc_disable_ndef_exchange()


================================================
FILE: gui/kivy/nfc_scanner/scanner_dummy.py
================================================
''' Dummy NFC Provider to be used on desktops in case no other provider is found
'''
from electrum_gui.kivy.nfc_scanner import NFCBase
from kivy.clock import Clock
from kivy.logger import Logger

class ScannerDummy(NFCBase):
    '''This is the dummy interface that gets selected in case any other
    hardware interface to NFC is not available.
    '''

    _initialised = False

    name = 'NFCDummy'

    def nfc_init(self):
        # print 'nfc_init()'

        Logger.debug('NFC: configure nfc')
        self._initialised = True
        self.nfc_enable()
        return True

    def on_new_intent(self, dt):
        tag_info = {'type': 'dymmy',
                    'message': 'dummy',
                    'extra details': None}

        # let Main app know that a tag has been detected
        app = App.get_running_app()
        app.tag_discovered(tag_info)
        app.show_info('New tag detected.', duration=2)
        Logger.debug('NFC: got new dummy tag')

    def nfc_enable(self):
        Logger.debug('NFC: enable')
        if self._initialised:
            Clock.schedule_interval(self.on_new_intent, 22)

    def nfc_disable(self):
        # print 'nfc_enable()'
        Clock.unschedule(self.on_new_intent)

    def nfc_enable_exchange(self, data):
        ''' Start sending data
        '''
        Logger.debug('NFC: sending data {}'.format(data))

    def nfc_disable_exchange(self):
        ''' Disable/Stop ndef exchange
        '''
        Logger.debug('NFC: disable nfc exchange')


================================================
FILE: gui/kivy/tools/bitcoin_intent.xml
================================================
<intent-filter >
  <action android:name="android.intent.action.VIEW" />
  <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="bitcoin" />
</intent-filter>


================================================
FILE: gui/kivy/tools/blacklist.txt
================================================
# eggs
*.egg-info

# unit test
unittest/*

# python config
config/makesetup

# unused pygame files
pygame/_camera_*
pygame/camera.pyo
pygame/*.html
pygame/*.bmp
pygame/*.svg
pygame/cdrom.so
pygame/pygame_icon.icns
pygame/LGPL
pygame/threads/Py25Queue.pyo
pygame/*.ttf
pygame/mac*
pygame/_numpy*
pygame/sndarray.pyo
pygame/surfarray.pyo
pygame/_arraysurfarray.pyo

# unused kivy files (platform specific)
kivy/input/providers/wm_*
kivy/input/providers/mactouch*
kivy/input/providers/probesysfs*
kivy/input/providers/mtdev*
kivy/input/providers/hidinput*
kivy/core/camera/camera_videocapture*
kivy/core/spelling/*osx*
kivy/core/video/video_pyglet*

kivy/adapters
kivy/modules
kivy/uix/sandbox
kivy/uix/pagelayout
kivy/uix/video
kivy/uix/vkeyboard
kivy/uix/videoplayer

# unused encodings
lib-dynload/*codec*
encodings/cp*.pyo
encodings/tis*
encodings/shift*
encodings/bz2*
encodings/iso*
encodings/undefined*
encodings/johab*
encodings/p*
encodings/m*
encodings/euc*
encodings/k*
encodings/unicode_internal*
encodings/quo*
encodings/gb*
encodings/big5*
encodings/hp*
encodings/hz*

# unused python modules
bsddb/*
wsgiref/*
hotshot/*
pydoc_data/*
tty.pyo
#anydbm.pyo
nturl2path.pyo
LICENCE.txt
macurl2path.pyo
dummy_threading.pyo
audiodev.pyo
antigravity.pyo
#dumbdbm.pyo
sndhdr.pyo
__phello__.foo.pyo
sunaudio.pyo
os2emxpath.pyo
multiprocessing/dummy*

# unused binaries python modules
lib-dynload/termios.so
lib-dynload/_lsprof.so
lib-dynload/*audioop.so
#lib-dynload/mmap.so
lib-dynload/_hotshot.so
#lib-dynload/_csv.so
lib-dynload/future_builtins.so
lib-dynload/_heapq.so
lib-dynload/_json.so
lib-dynload/grp.so
lib-dynload/resource.so
lib-dynload/pyexpat.so

# odd files
plat-linux3/regen

#>sqlite3
# conditionnal include depending if some recipes are included or not.
#sqlite3/*
#lib-dynload/_sqlite3.so
#<sqlite3



================================================
FILE: gui/kivy/tools/buildozer.spec
================================================
[app]

# (str) Title of your application
title = Electrum

# (str) Package name
package.name = Electrum

# (str) Package domain (needed for android/ios packaging)
package.domain = org.electrum

# (str) Source code where the main.py live
source.dir = .

# (list) Source files to include (let empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas,ttf,txt,gif,pem,mo,vs,fs,json

# (list) Source files to exclude (let empty to not exclude anything)
source.exclude_exts = spec

# (list) List of directory to exclude (let empty to not exclude anything)
source.exclude_dirs = bin, build, dist, contrib, gui/qt, gui/kivy/tools, gui/kivy/theming/light
# (list) List of exclusions using pattern matching
source.exclude_patterns = Makefile,setup*

# (str) Application versioning (method 1)
version.regex = version_apk = '(.*)'
version.filename = %(source.dir)s/contrib/versions.py

# (str) Application versioning (method 2)
#version = 1.9.8

# (list) Application requirements
requirements = python3crystax, android, openssl, plyer, kivy==master

# (str) Presplash of the application
#presplash.filename = %(source.dir)s/gui/kivy/theming/splash.png
presplash.filename = %(source.dir)s/icons/electrum_presplash.png

# (str) Icon of the application
icon.filename = %(source.dir)s/icons/electrum_launcher.png

# (str) Supported orientation (one of landscape, portrait or all)
orientation = portrait

# (bool) Indicate if the application should be fullscreen or not
fullscreen = False


#
# Android specific
#

# (list) Permissions
android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, CAMERA

# (int) Android API to use
#android.api = 14

# (int) Minimum API required (8 = Android 2.2 devices)
#android.minapi = 8

# (int) Android SDK version to use
#android.sdk = 21

# (str) Android NDK version to use
#android.ndk = 9

# (bool) Use --private data storage (True) or --dir public storage (False)
android.private_storage = True

# (str) Android NDK directory (if empty, it will be automatically downloaded.)
android.ndk_path = /opt/crystax-ndk-10.3.2

# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path =

# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.renpy.android.PythonActivity

# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar
#android.add_jars = lib/android/zbar.jar

# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
android.add_src = gui/kivy/data/java-classes/

android.gradle_dependencies = me.dm7.barcodescanner:zxing:1.9.8

android.add_activities = org.electrum.qr.SimpleScannerActivity

# (str) python-for-android branch to use, if not master, useful to try
# not yet merged features.
#android.branch = master

# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME

# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

# (str) XML file to include as an intent filters in <activity> tag
android.manifest.intent_filters = gui/kivy/tools/bitcoin_intent.xml

# (list) Android additionnal libraries to copy into libs/armeabi
#android.add_libs_armeabi = lib/android/*.so

# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wak
Download .txt
gitextract_plcqy8dy/

├── .gitignore
├── .idea/
│   ├── electrum.iml
│   ├── misc.xml
│   ├── modules.xml
│   └── vcs.xml
├── .travis.yml
├── AUTHORS
├── Dockerfile
├── Info.plist
├── LICENCE
├── MANIFEST.in
├── README.rst
├── RELEASE-NOTES
├── app.fil
├── brewfile
├── build-docker.sh
├── clean.sh
├── config
├── contrib/
│   ├── build-wine/
│   │   ├── README.md
│   │   ├── build-electrum-git.sh
│   │   ├── build.sh
│   │   ├── deterministic.spec
│   │   ├── electrum.nsi
│   │   ├── prepare-hw.sh
│   │   ├── prepare-pyinstaller.sh
│   │   └── prepare-wine.sh
│   ├── freeze_packages.sh
│   ├── make_apk
│   ├── make_download
│   ├── make_locale
│   ├── make_packages
│   ├── requirements.txt
│   └── sign_packages
├── create-dmg.sh
├── docs/
│   └── release-tests.md
├── electrum-btcp
├── electrum-env
├── electrum.conf.sample
├── electrum.desktop
├── gui/
│   ├── __init__.py
│   ├── kivy/
│   │   ├── Makefile
│   │   ├── Readme.txt
│   │   ├── __init__.py
│   │   ├── data/
│   │   │   ├── fonts/
│   │   │   │   └── tron/
│   │   │   │       ├── License.txt
│   │   │   │       └── Readme.txt
│   │   │   ├── glsl/
│   │   │   │   ├── default.fs
│   │   │   │   ├── default.vs
│   │   │   │   ├── header.fs
│   │   │   │   └── header.vs
│   │   │   ├── images/
│   │   │   │   └── defaulttheme.atlas
│   │   │   ├── java-classes/
│   │   │   │   └── org/
│   │   │   │       └── electrum/
│   │   │   │           └── qr/
│   │   │   │               └── SimpleScannerActivity.java
│   │   │   └── style.kv
│   │   ├── i18n.py
│   │   ├── main.kv
│   │   ├── main_window.py
│   │   ├── nfc_scanner/
│   │   │   ├── __init__.py
│   │   │   ├── scanner_android.py
│   │   │   └── scanner_dummy.py
│   │   ├── tools/
│   │   │   ├── bitcoin_intent.xml
│   │   │   ├── blacklist.txt
│   │   │   └── buildozer.spec
│   │   └── uix/
│   │       ├── __init__.py
│   │       ├── combobox.py
│   │       ├── context_menu.py
│   │       ├── dialogs/
│   │       │   ├── __init__.py
│   │       │   ├── amount_dialog.py
│   │       │   ├── bump_fee_dialog.py
│   │       │   ├── checkbox_dialog.py
│   │       │   ├── choice_dialog.py
│   │       │   ├── fee_dialog.py
│   │       │   ├── fx_dialog.py
│   │       │   ├── installwizard.py
│   │       │   ├── label_dialog.py
│   │       │   ├── nfc_transaction.py
│   │       │   ├── password_dialog.py
│   │       │   ├── qr_dialog.py
│   │       │   ├── qr_scanner.py
│   │       │   ├── question.py
│   │       │   ├── seed_options.py
│   │       │   ├── settings.py
│   │       │   ├── tx_dialog.py
│   │       │   └── wallets.py
│   │       ├── drawer.py
│   │       ├── gridview.py
│   │       ├── menus.py
│   │       ├── qrcodewidget.py
│   │       ├── screens.py
│   │       └── ui_screens/
│   │           ├── about.kv
│   │           ├── address.kv
│   │           ├── history.kv
│   │           ├── invoice.kv
│   │           ├── invoices.kv
│   │           ├── network.kv
│   │           ├── proxy.kv
│   │           ├── receive.kv
│   │           ├── requests.kv
│   │           ├── send.kv
│   │           ├── server.kv
│   │           └── status.kv
│   ├── qt/
│   │   ├── __init__.py
│   │   ├── address_dialog.py
│   │   ├── address_list.py
│   │   ├── amountedit.py
│   │   ├── console.py
│   │   ├── contact_list.py
│   │   ├── fee_slider.py
│   │   ├── history_list.py
│   │   ├── installwizard.py
│   │   ├── invoice_list.py
│   │   ├── main_window.py
│   │   ├── network_dialog.py
│   │   ├── password_dialog.py
│   │   ├── paytoedit.py
│   │   ├── qrcodewidget.py
│   │   ├── qrtextedit.py
│   │   ├── qrwindow.py
│   │   ├── request_list.py
│   │   ├── seed_dialog.py
│   │   ├── transaction_dialog.py
│   │   ├── util.py
│   │   └── utxo_list.py
│   ├── stdio.py
│   └── text.py
├── icns-from-vector.sh
├── icons/
│   └── electrum.icns
├── icons.qrc
├── lib/
│   ├── __init__.py
│   ├── base_wizard.py
│   ├── bitcoin.py
│   ├── blockchain.py
│   ├── checkpoints.json
│   ├── checkpoints_testnet.json
│   ├── coinchooser.py
│   ├── commands.py
│   ├── contacts.py
│   ├── currencies.json
│   ├── daemon.py
│   ├── dnssec.py
│   ├── equihash.py
│   ├── exchange_rate.py
│   ├── i18n.py
│   ├── interface.py
│   ├── jsonrpc.py
│   ├── keystore.py
│   ├── mnemonic.py
│   ├── msqr.py
│   ├── network.py
│   ├── old_mnemonic.py
│   ├── paymentrequest.proto
│   ├── paymentrequest.py
│   ├── paymentrequest_pb2.py
│   ├── pem.py
│   ├── plot.py
│   ├── plugins.py
│   ├── qrscanner.py
│   ├── ripemd.py
│   ├── rsakey.py
│   ├── segwit_addr.py
│   ├── servers-orig.json
│   ├── servers.json
│   ├── servers_testnet.json
│   ├── simple_config.py
│   ├── storage.py
│   ├── synchronizer.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_bitcoin.py
│   │   ├── test_interface.py
│   │   ├── test_mnemonic.py
│   │   ├── test_simple_config.py
│   │   ├── test_storage_upgrade.py
│   │   ├── test_transaction.py
│   │   ├── test_util.py
│   │   ├── test_wallet.py
│   │   └── test_wallet_vertical.py
│   ├── transaction.py
│   ├── util.py
│   ├── verifier.py
│   ├── version.py
│   ├── wallet.py
│   ├── websockets.py
│   ├── wordlist/
│   │   ├── chinese_simplified.txt
│   │   ├── english.txt
│   │   ├── japanese.txt
│   │   ├── portuguese.txt
│   │   └── spanish.txt
│   └── x509.py
├── packages.txt
├── plugins/
│   ├── README
│   ├── __init__.py
│   ├── audio_modem/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── cosigner_pool/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── digitalbitbox/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── digitalbitbox.py
│   │   └── qt.py
│   ├── email_requests/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── greenaddress_instant/
│   │   ├── __init__.py
│   │   └── qt.py
│   ├── hw_wallet/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── plugin.py
│   │   └── qt.py
│   ├── keepkey/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── clientbase.py
│   │   ├── cmdline.py
│   │   ├── keepkey.py
│   │   ├── plugin.py
│   │   ├── qt.py
│   │   └── qt_generic.py
│   ├── labels/
│   │   ├── __init__.py
│   │   ├── kivy.py
│   │   ├── labels.py
│   │   └── qt.py
│   ├── ledger/
│   │   ├── __init__.py
│   │   ├── auth2fa.py
│   │   ├── cmdline.py
│   │   ├── ledger.py
│   │   └── qt.py
│   ├── trezor/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── clientbase.py
│   │   ├── cmdline.py
│   │   ├── plugin.py
│   │   ├── qt.py
│   │   ├── qt_generic.py
│   │   └── trezor.py
│   ├── trustedcoin/
│   │   ├── __init__.py
│   │   ├── cmdline.py
│   │   ├── qt.py
│   │   └── trustedcoin.py
│   └── virtualkeyboard/
│       ├── __init__.py
│       └── qt.py
├── pubkeys/
│   ├── Animazing.asc
│   ├── ThomasV.asc
│   ├── kyuupichan.asc
│   └── wozz.asc
├── requirements.txt
├── requirements_travis.txt
├── run-docker.sh
├── scripts/
│   ├── bip70
│   ├── block_headers
│   ├── estimate_fee
│   ├── get_history
│   ├── peers
│   ├── servers
│   ├── txradar
│   ├── util.py
│   └── watch_address
├── setup-mac.sh
├── setup-release.py
├── setup.py
├── snap/
│   └── snapcraft.yaml
└── tox.ini
Download .txt
Showing preview only (217K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2958 symbols across 138 files)

FILE: gui/kivy/__init__.py
  class ElectrumGui (line 46) | class ElectrumGui:
    method __init__ (line 48) | def __init__(self, config, daemon, plugins):
    method main (line 55) | def main(self):

FILE: gui/kivy/data/java-classes/org/electrum/qr/SimpleScannerActivity.java
  class SimpleScannerActivity (line 15) | public class SimpleScannerActivity extends Activity implements ZXingScan...
    method onCreate (line 19) | @Override
    method onResume (line 27) | @Override
    method onPause (line 34) | @Override
    method handleResult (line 40) | @Override

FILE: gui/kivy/i18n.py
  class _ (line 3) | class _(str):
    method __new__ (line 8) | def __new__(cls, s, *args, **kwargs):
    method translate (line 17) | def translate(s, *args, **kwargs):
    method bind (line 21) | def bind(label):
    method switch_lang (line 36) | def switch_lang(lang):

FILE: gui/kivy/main_window.py
  class ElectrumWindow (line 73) | class ElectrumWindow(App):
    method on_auto_connect (line 88) | def on_auto_connect(self, instance, x):
    method toggle_auto_connect (line 91) | def toggle_auto_connect(self, x):
    method choose_server_dialog (line 94) | def choose_server_dialog(self, popup):
    method choose_blockchain_dialog (line 106) | def choose_blockchain_dialog(self, dt):
    method on_use_rbf (line 119) | def on_use_rbf(self, instance, x):
    method on_use_change (line 123) | def on_use_change(self, instance, x):
    method on_use_unconfirmed (line 127) | def on_use_unconfirmed(self, instance, x):
    method set_URI (line 130) | def set_URI(self, uri):
    method on_new_intent (line 134) | def on_new_intent(self, intent):
    method on_language (line 140) | def on_language(self, instance, language):
    method update_history (line 144) | def update_history(self, *dt):
    method on_quotes (line 148) | def on_quotes(self, d):
    method on_history (line 152) | def on_history(self, d):
    method _get_bu (line 156) | def _get_bu(self):
    method _set_bu (line 159) | def _set_bu(self, value):
    method on_fiat_unit (line 169) | def on_fiat_unit(self, a, b):
    method decimal_point (line 172) | def decimal_point(self):
    method btc_to_fiat (line 175) | def btc_to_fiat(self, amount_str):
    method fiat_to_btc (line 184) | def fiat_to_btc(self, fiat_amount):
    method get_amount (line 193) | def get_amount(self, amount_str):
    method _get_orientation (line 207) | def _get_orientation(self):
    method _get_ui_mode (line 221) | def _get_ui_mode(self):
    method __init__ (line 233) | def __init__(self, **kwargs):
    method wallet_name (line 275) | def wallet_name(self):
    method on_pr (line 278) | def on_pr(self, pr):
    method on_qr (line 297) | def on_qr(self, data):
    method update_tab (line 321) | def update_tab(self, name):
    method update_tabs (line 327) | def update_tabs(self):
    method switch_to (line 331) | def switch_to(self, name):
    method show_request (line 340) | def show_request(self, addr):
    method show_pr_details (line 344) | def show_pr_details(self, req, status, is_invoice):
    method show_addr_details (line 366) | def show_addr_details(self, req, status):
    method qr_dialog (line 379) | def qr_dialog(self, title, data, show_text=False):
    method scan_qr (line 384) | def scan_qr(self, on_complete):
    method do_share (line 404) | def do_share(self, data, title):
    method build (line 419) | def build(self):
    method _pause (line 422) | def _pause(self):
    method on_start (line 430) | def on_start(self):
    method get_wallet_path (line 468) | def get_wallet_path(self):
    method on_wizard_complete (line 474) | def on_wizard_complete(self, instance, wallet):
    method load_wallet_by_name (line 481) | def load_wallet_by_name(self, path):
    method on_stop (line 498) | def on_stop(self):
    method stop_wallet (line 501) | def stop_wallet(self):
    method on_key_down (line 506) | def on_key_down(self, instance, key, keycode, codepoint, modifiers):
    method on_keyboard (line 525) | def on_keyboard(self, instance, key, keycode, codepoint, modifiers):
    method settings_dialog (line 535) | def settings_dialog(self):
    method popup_dialog (line 542) | def popup_dialog(self, name):
    method init_ui (line 554) | def init_ui(self):
    method update_interfaces (line 587) | def update_interfaces(self, dt):
    method on_network_event (line 596) | def on_network_event(self, event, *args):
    method load_wallet (line 611) | def load_wallet(self, wallet):
    method update_status (line 621) | def update_status(self, *dt):
    method get_max_amount (line 646) | def get_max_amount(self):
    method format_amount (line 654) | def format_amount(self, x, is_diff=False, whitespaces=False):
    method format_amount_and_units (line 657) | def format_amount_and_units(self, x):
    method update_wallet (line 661) | def update_wallet(self, *dt):
    method notify (line 666) | def notify(self, message):
    method on_pause (line 678) | def on_pause(self):
    method on_resume (line 684) | def on_resume(self):
    method on_size (line 691) | def on_size(self, instance, value):
    method on_ref_label (line 696) | def on_ref_label(self, label, touch):
    method set_send (line 705) | def set_send(self, address, amount, label, message):
    method show_error (line 708) | def show_error(self, error, width='200dp', pos=None, arrow_pos=None,
    method show_info (line 717) | def show_info(self, error, width='200dp', pos=None, arrow_pos=None,
    method show_info_bubble (line 725) | def show_info_bubble(self, text=_('Hello World'), pos=None, duration=0,
    method tx_dialog (line 775) | def tx_dialog(self, tx):
    method sign_tx (line 780) | def sign_tx(self, *args):
    method _sign_tx (line 783) | def _sign_tx(self, tx, password, on_success, on_failure):
    method _broadcast_thread (line 791) | def _broadcast_thread(self, tx, on_complete):
    method broadcast (line 795) | def broadcast(self, tx, pr=None):
    method description_dialog (line 814) | def description_dialog(self, screen):
    method amount_dialog (line 823) | def amount_dialog(self, screen, show_max):
    method protected (line 834) | def protected(self, msg, f, args):
    method delete_wallet (line 840) | def delete_wallet(self):
    method _delete_wallet (line 846) | def _delete_wallet(self, b):
    method __delete_wallet (line 851) | def __delete_wallet(self, pw):
    method show_seed (line 869) | def show_seed(self, label):
    method _show_seed (line 872) | def _show_seed(self, label, password):
    method change_password (line 886) | def change_password(self, cb):
    method _change_password (line 892) | def _change_password(self, cb, old_password):
    method _change_password2 (line 903) | def _change_password2(self, cb, old_password, new_password):
    method _change_password3 (line 906) | def _change_password3(self, cb, old_password, new_password, confirmed_...
    method password_dialog (line 913) | def password_dialog(self, msg, f, args):
    method export_private_keys (line 922) | def export_private_keys(self, pk_label, addr):

FILE: gui/kivy/nfc_scanner/__init__.py
  class NFCBase (line 3) | class NFCBase(Widget):
    method nfc_init (line 14) | def nfc_init(self):
    method nfc_disable (line 19) | def nfc_disable(self):
    method nfc_enable (line 24) | def nfc_enable(self):
    method nfc_enable_exchange (line 29) | def nfc_enable_exchange(self, data):
    method nfc_disable_exchange (line 34) | def nfc_disable_exchange(self):

FILE: gui/kivy/nfc_scanner/scanner_android.py
  class ScannerAndroid (line 35) | class ScannerAndroid(NFCBase):
    method nfc_init (line 42) | def nfc_init(self):
    method get_ndef_details (line 82) | def get_ndef_details(self, tag):
    method on_new_intent (line 130) | def on_new_intent(self, intent):
    method nfc_disable (line 155) | def nfc_disable(self):
    method nfc_enable (line 160) | def nfc_enable(self):
    method create_AAR (line 165) | def create_AAR(self):
    method create_TNF_EXTERNAL (line 170) | def create_TNF_EXTERNAL(self, data):
    method create_ndef_message (line 186) | def create_ndef_message(self, *recs):
    method disable_foreground_dispatch (line 198) | def disable_foreground_dispatch(self):
    method enable_foreground_dispatch (line 204) | def enable_foreground_dispatch(self):
    method _nfc_enable_ndef_exchange (line 211) | def _nfc_enable_ndef_exchange(self, data):
    method _nfc_disable_ndef_exchange (line 229) | def _nfc_disable_ndef_exchange(self):
    method nfc_enable_exchange (line 234) | def nfc_enable_exchange(self, data):
    method nfc_disable_exchange (line 239) | def nfc_disable_exchange(self):

FILE: gui/kivy/nfc_scanner/scanner_dummy.py
  class ScannerDummy (line 7) | class ScannerDummy(NFCBase):
    method nfc_init (line 16) | def nfc_init(self):
    method on_new_intent (line 24) | def on_new_intent(self, dt):
    method nfc_enable (line 35) | def nfc_enable(self):
    method nfc_disable (line 40) | def nfc_disable(self):
    method nfc_enable_exchange (line 44) | def nfc_enable_exchange(self, data):
    method nfc_disable_exchange (line 49) | def nfc_disable_exchange(self):

FILE: gui/kivy/uix/combobox.py
  class ComboBoxOption (line 29) | class ComboBoxOption(Button):
  class ComboBox (line 33) | class ComboBox(Button):
    method __init__ (line 43) | def __init__(self, **kwargs):
    method _update_text (line 56) | def _update_text(self, *largs):
    method _build_dropdown (line 62) | def _build_dropdown(self, *largs):
    method _update_dropdown (line 71) | def _update_dropdown(self, *largs):
    method _toggle_dropdown (line 82) | def _toggle_dropdown(self, *largs):
    method _on_dropdown_select (line 85) | def _on_dropdown_select(self, instance, data, *largs):
    method on_is_open (line 89) | def on_is_open(self, instance, value):

FILE: gui/kivy/uix/context_menu.py
  class MenuItem (line 38) | class MenuItem(Factory.Button):
  class ContextMenu (line 41) | class ContextMenu(Bubble):
    method __init__ (line 43) | def __init__(self, obj, action_list):
    method hide (line 55) | def hide(self):

FILE: gui/kivy/uix/dialogs/__init__.py
  class AnimatedPopup (line 11) | class AnimatedPopup(Factory.Popup):
    method on_activate (line 22) | def on_activate(self):
    method on_deactivate (line 28) | def on_deactivate(self):
    method open (line 34) | def open(self):
    method dismiss (line 47) | def dismiss(self):
  class EventsDialog (line 59) | class EventsDialog(Factory.Popup):
    method __init__ (line 68) | def __init__(self, **kwargs):
    method on_release (line 71) | def on_release(self, instance):
    method on_press (line 74) | def on_press(self, instance):
    method close (line 77) | def close(self):
  class SelectionDialog (line 81) | class SelectionDialog(EventsDialog):
    method add_widget (line 83) | def add_widget(self, widget, index=0):
  class InfoBubble (line 90) | class InfoBubble(Factory.Bubble):
    method on_touch_down (line 126) | def on_touch_down(self, touch):
    method show (line 133) | def show(self, pos, duration, width=None, modal=False, exit=False):
    method _show (line 149) | def _show(self, pos, duration):
    method hide (line 170) | def hide(self, now=False):
  class OutputItem (line 196) | class OutputItem(Factory.BoxLayout):
  class OutputList (line 199) | class OutputList(Factory.GridLayout):
    method __init__ (line 201) | def __init__(self, **kwargs):
    method update (line 205) | def update(self, outputs):
    method add_output (line 210) | def add_output(self, address, amount):

FILE: gui/kivy/uix/dialogs/amount_dialog.py
  class AmountDialog (line 111) | class AmountDialog(Factory.Popup):
    method __init__ (line 113) | def __init__(self, show_max, amount, cb):
    method toggle_fiat (line 120) | def toggle_fiat(self, a):
    method update_amount (line 123) | def update_amount(self, c):

FILE: gui/kivy/uix/dialogs/bump_fee_dialog.py
  class BumpFeeDialog (line 66) | class BumpFeeDialog(Factory.Popup):
    method __init__ (line 68) | def __init__(self, app, fee, size, callback):
    method update_text (line 81) | def update_text(self):
    method update_slider (line 88) | def update_slider(self):
    method get_fee (line 100) | def get_fee(self):
    method on_ok (line 109) | def on_ok(self):
    method on_slider (line 114) | def on_slider(self, value):
    method on_checkbox (line 117) | def on_checkbox(self, b):

FILE: gui/kivy/uix/dialogs/checkbox_dialog.py
  class CheckBoxDialog (line 46) | class CheckBoxDialog(Factory.Popup):
    method __init__ (line 47) | def __init__(self, title, text, status, callback):

FILE: gui/kivy/uix/dialogs/choice_dialog.py
  class ChoiceDialog (line 45) | class ChoiceDialog(Factory.Popup):
    method __init__ (line 47) | def __init__(self, title, choices, key, callback):

FILE: gui/kivy/uix/dialogs/fee_dialog.py
  class FeeDialog (line 55) | class FeeDialog(Factory.Popup):
    method __init__ (line 57) | def __init__(self, app, config, callback):
    method update_text (line 68) | def update_text(self):
    method update_slider (line 72) | def update_slider(self):
    method get_fee_text (line 83) | def get_fee_text(self, value):
    method on_ok (line 97) | def on_ok(self):
    method on_slider (line 106) | def on_slider(self, value):
    method on_checkbox (line 109) | def on_checkbox(self, b):

FILE: gui/kivy/uix/dialogs/fx_dialog.py
  class FxDialog (line 72) | class FxDialog(Factory.Popup):
    method __init__ (line 74) | def __init__(self, app, plugins, config, callback):
    method add_exchanges (line 83) | def add_exchanges(self):
    method on_exchange (line 90) | def on_exchange(self, text):
    method add_currencies (line 96) | def add_currencies(self):
    method on_currency (line 102) | def on_currency(self, ccy):

FILE: gui/kivy/uix/dialogs/installwizard.py
  class WizardDialog (line 425) | class WizardDialog(EventsDialog):
    method __init__ (line 430) | def __init__(self, wizard, **kwargs):
    method _size_dialog (line 442) | def _size_dialog(self, dt):
    method add_widget (line 454) | def add_widget(self, widget, index=0):
    method on_dismiss (line 460) | def on_dismiss(self):
    method get_params (line 465) | def get_params(self, button):
    method on_release (line 468) | def on_release(self, button):
  class WizardMultisigDialog (line 481) | class WizardMultisigDialog(WizardDialog):
    method get_params (line 483) | def get_params(self, button):
  class WizardChoiceDialog (line 488) | class WizardChoiceDialog(WizardDialog):
    method __init__ (line 490) | def __init__(self, wizard, **kwargs):
    method on_parent (line 503) | def on_parent(self, instance, value):
    method get_params (line 508) | def get_params(self, button):
  class LineDialog (line 513) | class LineDialog(WizardDialog):
    method __init__ (line 518) | def __init__(self, wizard, **kwargs):
    method get_params (line 522) | def get_params(self, b):
  class ShowSeedDialog (line 525) | class ShowSeedDialog(WizardDialog):
    method __init__ (line 530) | def __init__(self, wizard, **kwargs):
    method on_parent (line 534) | def on_parent(self, instance, value):
    method options_dialog (line 539) | def options_dialog(self):
    method get_params (line 546) | def get_params(self, b):
  class WordButton (line 550) | class WordButton(Button):
  class WizardButton (line 553) | class WizardButton(Button):
  class RestoreSeedDialog (line 557) | class RestoreSeedDialog(WizardDialog):
    method __init__ (line 559) | def __init__(self, wizard, **kwargs):
    method options_dialog (line 570) | def options_dialog(self):
    method get_suggestions (line 577) | def get_suggestions(self, prefix):
    method on_text (line 582) | def on_text(self, dt):
    method on_word (line 620) | def on_word(self, w):
    method get_text (line 628) | def get_text(self):
    method update_text (line 632) | def update_text(self, c):
    method on_parent (line 641) | def on_parent(self, instance, value):
    method on_key_down (line 650) | def on_key_down(self, keyboard, keycode, key, modifiers):
    method on_enter (line 655) | def on_enter(self):
    method _remove_keyboard (line 662) | def _remove_keyboard(self):
    method get_params (line 668) | def get_params(self, b):
  class ConfirmSeedDialog (line 672) | class ConfirmSeedDialog(RestoreSeedDialog):
    method get_params (line 673) | def get_params(self, b):
    method options_dialog (line 675) | def options_dialog(self):
  class ShowXpubDialog (line 679) | class ShowXpubDialog(WizardDialog):
    method __init__ (line 681) | def __init__(self, wizard, **kwargs):
    method do_copy (line 686) | def do_copy(self):
    method do_share (line 689) | def do_share(self):
    method do_qr (line 692) | def do_qr(self):
  class AddXpubDialog (line 698) | class AddXpubDialog(WizardDialog):
    method __init__ (line 700) | def __init__(self, wizard, **kwargs):
    method check_text (line 707) | def check_text(self, dt):
    method get_text (line 710) | def get_text(self):
    method get_params (line 714) | def get_params(self, button):
    method scan_xpub (line 717) | def scan_xpub(self):
    method do_paste (line 725) | def do_paste(self):
    method do_clear (line 728) | def do_clear(self):
  class InstallWizard (line 734) | class InstallWizard(BaseWizard, Widget):
    method on_wizard_complete (line 743) | def on_wizard_complete(self, wallet):
    method waiting_dialog (line 747) | def waiting_dialog(self, task, msg):
    method terminate (line 767) | def terminate(self, **kwargs):
    method choice_dialog (line 770) | def choice_dialog(self, **kwargs):
    method multisig_dialog (line 778) | def multisig_dialog(self, **kwargs): WizardMultisigDialog(self, **kwar...
    method show_seed_dialog (line 779) | def show_seed_dialog(self, **kwargs): ShowSeedDialog(self, **kwargs).o...
    method line_dialog (line 780) | def line_dialog(self, **kwargs): LineDialog(self, **kwargs).open()
    method confirm_seed_dialog (line 782) | def confirm_seed_dialog(self, **kwargs):
    method restore_seed_dialog (line 787) | def restore_seed_dialog(self, **kwargs):
    method add_xpub_dialog (line 790) | def add_xpub_dialog(self, **kwargs):
    method add_cosigner_dialog (line 794) | def add_cosigner_dialog(self, **kwargs):
    method show_xpub_dialog (line 799) | def show_xpub_dialog(self, **kwargs): ShowXpubDialog(self, **kwargs).o...
    method show_error (line 801) | def show_error(self, msg):
    method password_dialog (line 805) | def password_dialog(self, message, callback):
    method request_password (line 810) | def request_password(self, run_next):
    method confirm_password (line 818) | def confirm_password(self, pin, run_next):
    method action_dialog (line 827) | def action_dialog(self, action, run_next):

FILE: gui/kivy/uix/dialogs/label_dialog.py
  class LabelDialog (line 49) | class LabelDialog(Factory.Popup):
    method __init__ (line 51) | def __init__(self, title, text, callback):

FILE: gui/kivy/uix/dialogs/nfc_transaction.py
  class NFCTransactionDialog (line 1) | class NFCTransactionDialog(AnimatedPopup):
    method __init__ (line 7) | def __init__(self, **kwargs):
    method on_parent (line 18) | def on_parent(self, instance, value):

FILE: gui/kivy/uix/dialogs/password_dialog.py
  class PasswordDialog (line 77) | class PasswordDialog(Factory.Popup):
    method init (line 82) | def init(self, message, callback):
    method update_password (line 87) | def update_password(self, c):
    method on_password (line 98) | def on_password(self, pw):

FILE: gui/kivy/uix/dialogs/qr_dialog.py
  class QRDialog (line 38) | class QRDialog(Factory.Popup):
    method __init__ (line 39) | def __init__(self, title, data, show_text):
    method on_open (line 45) | def on_open(self):

FILE: gui/kivy/uix/dialogs/qr_scanner.py
  class QrScannerDialog (line 7) | class QrScannerDialog(Factory.AnimatedPopup):
    method on_symbols (line 11) | def on_symbols(self, instance, value):
    method on_complete (line 17) | def on_complete(self, x):

FILE: gui/kivy/uix/dialogs/question.py
  class Question (line 47) | class Question(Factory.Popup):
    method __init__ (line 49) | def __init__(self, msg, callback):

FILE: gui/kivy/uix/dialogs/seed_options.py
  class SeedOptionsDialog (line 47) | class SeedOptionsDialog(Factory.Popup):
    method __init__ (line 48) | def __init__(self, status, callback):

FILE: gui/kivy/uix/dialogs/settings.py
  class SettingsDialog (line 105) | class SettingsDialog(Factory.Popup):
    method __init__ (line 107) | def __init__(self, app):
    method update (line 122) | def update(self):
    method get_language_name (line 127) | def get_language_name(self):
    method change_password (line 130) | def change_password(self, item, dt):
    method language_dialog (line 133) | def language_dialog(self, item, dt):
    method unit_dialog (line 143) | def unit_dialog(self, item, dt):
    method coinselect_status (line 151) | def coinselect_status(self):
    method coinselect_dialog (line 154) | def coinselect_dialog(self, item, dt):
    method proxy_status (line 164) | def proxy_status(self):
    method proxy_dialog (line 168) | def proxy_dialog(self, item, dt):
    method plugin_dialog (line 194) | def plugin_dialog(self, name, label, dt):
    method fee_status (line 206) | def fee_status(self):
    method fee_dialog (line 212) | def fee_dialog(self, label, dt):
    method boolean_dialog (line 220) | def boolean_dialog(self, name, title, message, dt):
    method fx_status (line 224) | def fx_status(self):
    method fx_dialog (line 233) | def fx_dialog(self, label, dt):

FILE: gui/kivy/uix/dialogs/tx_dialog.py
  class TxDialog (line 97) | class TxDialog(Factory.Popup):
    method __init__ (line 99) | def __init__(self, app, tx):
    method on_open (line 105) | def on_open(self):
    method update (line 108) | def update(self):
    method do_rbf (line 131) | def do_rbf(self):
    method _do_rbf (line 138) | def _do_rbf(self, old_fee, new_fee, is_final):
    method do_sign (line 156) | def do_sign(self):
    method _do_sign (line 159) | def _do_sign(self, password):
    method __do_sign (line 163) | def __do_sign(self, password):
    method do_broadcast (line 170) | def do_broadcast(self):
    method show_qr (line 173) | def show_qr(self):

FILE: gui/kivy/uix/dialogs/wallets.py
  class WalletDialog (line 54) | class WalletDialog(Factory.Popup):
    method new_wallet (line 56) | def new_wallet(self, app, dirname):
    method open_wallet (line 63) | def open_wallet(self, app):

FILE: gui/kivy/uix/drawer.py
  class Drawer (line 20) | class Drawer(Factory.RelativeLayout):
    method __init__ (line 75) | def __init__(self, **kwargs):
    method toggle_drawer (line 80) | def toggle_drawer(self):
    method _re_enable_gc (line 90) | def _re_enable_gc(self, dt):
    method on_touch_down (line 94) | def on_touch_down(self, touch):
    method on_touch_move (line 136) | def on_touch_move(self, touch):
    method _change_touch_mode (line 165) | def _change_touch_mode(self, *args):
    method on_touch_up (line 176) | def on_touch_up(self, touch):
    method _complete_drawer_animation (line 211) | def _complete_drawer_animation(self, *args):
    method add_widget (line 214) | def add_widget(self, widget, index=1):
    method remove_widget (line 238) | def remove_widget(self, widget):
    method clear_widgets (line 246) | def clear_widgets(self):

FILE: gui/kivy/uix/gridview.py
  class GridView (line 57) | class GridView(BoxLayout):
    method _get_hd_adpt (line 61) | def _get_hd_adpt(self):
    method _get_cnt_adpt (line 68) | def _get_cnt_adpt(self):
    method __init__ (line 92) | def __init__(self, **kwargs):
    method on_widths (line 97) | def on_widths(self, instance, value):
    method on_headers (line 104) | def on_headers(self, instance, value):
  class HorizVertGrid (line 181) | class HorizVertGrid(GridView):
  class MainApp (line 187) | class MainApp(App):
    method build (line 189) | def build(self):

FILE: gui/kivy/uix/menus.py
  class ContextMenuItem (line 12) | class ContextMenuItem(Widget):
  class ContextButton (line 16) | class ContextButton(ContextMenuItem, BubbleButton):
  class ContextMenu (line 19) | class ContextMenu(Bubble):
    method __init__ (line 26) | def __init__(self, **kwargs):
    method on_touch_down (line 31) | def on_touch_down(self, touch):
    method on_buttons (line 37) | def on_buttons(self, _menu, value):
    method on_press (line 51) | def on_press(self, instance):
    method on_release (line 54) | def on_release(self, instance):
    method show (line 57) | def show(self, pos, duration=0):
    method _show (line 62) | def _show(self, pos, duration):
    method hide (line 82) | def hide(self, *dt):
    method add_widget (line 91) | def add_widget(self, widget, index=0):

FILE: gui/kivy/uix/qrcodewidget.py
  class QRCodeWidget (line 42) | class QRCodeWidget(FloatLayout):
    method __init__ (line 48) | def __init__(self, **kwargs):
    method on_data (line 54) | def on_data(self, instance, value):
    method set_data (line 59) | def set_data(self, data):
    method update_qr (line 67) | def update_qr(self):
    method setMinimumSize (line 82) | def setMinimumSize(self, size):
    method _create_texture (line 86) | def _create_texture(self, k):
    method update_texture (line 92) | def update_texture(self):
    method _upd_texture (line 111) | def _upd_texture(self, buff):

FILE: gui/kivy/uix/screens.py
  class EmptyLabel (line 30) | class EmptyLabel(Factory.Label):
  class CScreen (line 33) | class CScreen(Factory.Screen):
    method _change_action_view (line 42) | def _change_action_view(self):
    method on_enter (line 52) | def on_enter(self):
    method update (line 57) | def update(self):
    method load_screen (line 61) | def load_screen(self):
    method on_activate (line 68) | def on_activate(self):
    method on_leave (line 73) | def on_leave(self):
    method on_deactivate (line 76) | def on_deactivate(self):
    method hide_menu (line 79) | def hide_menu(self):
    method show_menu (line 84) | def show_menu(self, obj):
  class HistoryScreen (line 104) | class HistoryScreen(CScreen):
    method __init__ (line 110) | def __init__(self, **kwargs):
    method show_tx (line 115) | def show_tx(self, obj):
    method label_dialog (line 122) | def label_dialog(self, obj):
    method get_card (line 132) | def get_card(self, tx_hash, height, conf, timestamp, value, balance):
    method update (line 156) | def update(self, see_all=False):
  class SendScreen (line 173) | class SendScreen(CScreen):
    method set_URI (line 178) | def set_URI(self, text):
    method update (line 192) | def update(self):
    method do_clear (line 195) | def do_clear(self):
    method set_request (line 202) | def set_request(self, pr):
    method do_save (line 214) | def do_save(self):
    method do_paste (line 237) | def do_paste(self):
    method do_send (line 244) | def do_send(self):
    method _do_send (line 273) | def _do_send(self, amount, message, outputs, rbf):
    method send_tx (line 298) | def send_tx(self, tx, message, password):
  class ReceiveScreen (line 316) | class ReceiveScreen(CScreen):
    method update (line 320) | def update(self):
    method clear (line 327) | def clear(self):
    method get_new_address (line 332) | def get_new_address(self):
    method on_address (line 345) | def on_address(self, addr):
    method get_URI (line 356) | def get_URI(self):
    method update_qr (line 366) | def update_qr(self):
    method do_share (line 371) | def do_share(self):
    method do_copy (line 375) | def do_copy(self):
    method save_request (line 380) | def save_request(self):
    method on_amount_or_message (line 389) | def on_amount_or_message(self):
    method do_new (line 393) | def do_new(self):
  class InvoicesScreen (line 422) | class InvoicesScreen(CScreen):
    method get_card (line 426) | def get_card(self, pr):
    method update (line 450) | def update(self):
    method do_pay (line 462) | def do_pay(self, obj):
    method do_view (line 466) | def do_view(self, obj):
    method do_delete (line 471) | def do_delete(self, obj):
  class AddressScreen (line 486) | class AddressScreen(CScreen):
    method get_card (line 490) | def get_card(self, addr, balance, is_used, label):
    method update (line 521) | def update(self):
    method do_show (line 548) | def do_show(self, obj):
    method do_view (line 551) | def do_view(self, obj):
    method do_delete (line 578) | def do_delete(self, obj):
    method ext_search (line 587) | def ext_search(self, card, search):
  class TabbedCarousel (line 593) | class TabbedCarousel(Factory.TabbedPanel):
    method animate_tab_to_center (line 599) | def animate_tab_to_center(self, value):
    method on_current_tab (line 615) | def on_current_tab(self, instance, value):
    method on_index (line 618) | def on_index(self, instance, value):
    method switch_to (line 633) | def switch_to(self, header):
    method add_widget (line 660) | def add_widget(self, widget, index=0):

FILE: gui/qt/__init__.py
  class OpenFileEventFilter (line 65) | class OpenFileEventFilter(QObject):
    method __init__ (line 66) | def __init__(self, windows):
    method eventFilter (line 70) | def eventFilter(self, obj, event):
  class QElectrumApplication (line 78) | class QElectrumApplication(QApplication):
  class QNetworkUpdatedSignalObject (line 82) | class QNetworkUpdatedSignalObject(QObject):
  class ElectrumGui (line 86) | class ElectrumGui:
    method __init__ (line 88) | def __init__(self, config, daemon, plugins):
    method build_tray_menu (line 118) | def build_tray_menu(self):
    method tray_icon (line 134) | def tray_icon(self):
    method toggle_tray_icon (line 140) | def toggle_tray_icon(self):
    method tray_activated (line 145) | def tray_activated(self, reason):
    method close (line 154) | def close(self):
    method new_window (line 158) | def new_window(self, path, uri=None):
    method show_network_dialog (line 162) | def show_network_dialog(self, parent):
    method create_window_for_wallet (line 175) | def create_window_for_wallet(self, wallet):
    method start_new_window (line 183) | def start_new_window(self, path, uri):
    method close_window (line 221) | def close_window(self, window):
    method init_network (line 229) | def init_network(self):
    method main (line 237) | def main(self):

FILE: gui/qt/address_dialog.py
  class AddressDialog (line 37) | class AddressDialog(WindowModalDialog):
    method __init__ (line 39) | def __init__(self, parent, address):
    method get_domain (line 90) | def get_domain(self):
    method show_qr (line 93) | def show_qr(self):

FILE: gui/qt/address_list.py
  class AddressList (line 34) | class AddressList(MyTreeWidget):
    method __init__ (line 37) | def __init__(self, parent=None):
    method get_list_header (line 52) | def get_list_header(self):
    method refresh_headers (line 55) | def refresh_headers(self):
    method toggle_change (line 63) | def toggle_change(self, show):
    method toggle_used (line 70) | def toggle_used(self, state):
    method on_update (line 76) | def on_update(self):
    method create_menu (line 115) | def create_menu(self, position):
    method on_permit_edit (line 166) | def on_permit_edit(self, item, column):

FILE: gui/qt/amountedit.py
  class MyLineEdit (line 11) | class MyLineEdit(QLineEdit):
    method setFrozen (line 14) | def setFrozen(self, b):
  class AmountEdit (line 19) | class AmountEdit(MyLineEdit):
    method __init__ (line 22) | def __init__(self, base_unit, is_int = False, parent=None):
    method decimal_point (line 32) | def decimal_point(self):
    method numbify (line 35) | def numbify(self):
    method paintEvent (line 55) | def paintEvent(self, event):
    method get_amount (line 66) | def get_amount(self):
    method setAmount (line 72) | def setAmount(self, x):
  class BTCAmountEdit (line 76) | class BTCAmountEdit(AmountEdit):
    method __init__ (line 78) | def __init__(self, decimal_point, is_int = False, parent=None):
    method _base_unit (line 82) | def _base_unit(self):
    method get_amount (line 92) | def get_amount(self):
    method setAmount (line 100) | def setAmount(self, amount):
  class FeerateEdit (line 107) | class FeerateEdit(BTCAmountEdit):
    method _base_unit (line 108) | def _base_unit(self):
    method get_amount (line 116) | def get_amount(self):

FILE: gui/qt/console.py
  class Console (line 20) | class Console(QtWidgets.QPlainTextEdit):
    method __init__ (line 21) | def __init__(self, prompt='>> ', startup_message='', parent=None):
    method set_json (line 38) | def set_json(self, b):
    method run_script (line 41) | def run_script(self, filename):
    method updateNamespace (line 50) | def updateNamespace(self, namespace):
    method showMessage (line 53) | def showMessage(self, message):
    method clear (line 57) | def clear(self):
    method newPrompt (line 61) | def newPrompt(self):
    method getCommand (line 73) | def getCommand(self):
    method setCommand (line 80) | def setCommand(self, command):
    method show_completions (line 94) | def show_completions(self, completions):
    method hide_completions (line 111) | def hide_completions(self):
    method getConstruct (line 122) | def getConstruct(self, command):
    method getHistory (line 139) | def getHistory(self):
    method setHisory (line 142) | def setHisory(self, history):
    method addToHistory (line 145) | def addToHistory(self, command):
    method getPrevHistoryEntry (line 153) | def getPrevHistoryEntry(self):
    method getNextHistoryEntry (line 159) | def getNextHistoryEntry(self):
    method getCursorPosition (line 167) | def getCursorPosition(self):
    method setCursorPosition (line 171) | def setCursorPosition(self, position):
    method register_command (line 176) | def register_command(self, c, func):
    method runCommand (line 181) | def runCommand(self):
    method keyPressEvent (line 236) | def keyPressEvent(self, event):
    method completions (line 267) | def completions(self):

FILE: gui/qt/contact_list.py
  class ContactList (line 38) | class ContactList(MyTreeWidget):
    method __init__ (line 41) | def __init__(self, parent):
    method on_permit_edit (line 46) | def on_permit_edit(self, item, column):
    method on_edited (line 50) | def on_edited(self, item, column, prior):
    method import_contacts (line 55) | def import_contacts(self):
    method create_menu (line 63) | def create_menu(self, position):
    method on_update (line 88) | def on_update(self):

FILE: gui/qt/fee_slider.py
  class FeeSlider (line 10) | class FeeSlider(QSlider):
    method __init__ (line 12) | def __init__(self, window, config, callback):
    method moved (line 22) | def moved(self, pos):
    method get_tooltip (line 30) | def get_tooltip(self, pos, fee_rate):
    method update (line 42) | def update(self):
    method activate (line 58) | def activate(self):
    method deactivate (line 61) | def deactivate(self):

FILE: gui/qt/history_list.py
  class HistoryList (line 49) | class HistoryList(MyTreeWidget):
    method __init__ (line 52) | def __init__(self, parent=None):
    method refresh_headers (line 57) | def refresh_headers(self):
    method get_domain (line 64) | def get_domain(self):
    method on_update (line 69) | def on_update(self):
    method on_doubleclick (line 110) | def on_doubleclick(self, item, column):
    method update_labels (line 118) | def update_labels(self):
    method update_item (line 127) | def update_item(self, tx_hash, height, conf, timestamp):
    method create_menu (line 136) | def create_menu(self, position):

FILE: gui/qt/installwizard.py
  class GoBack (line 22) | class GoBack(Exception):
  class CosignWidget (line 38) | class CosignWidget(QWidget):
    method __init__ (line 41) | def __init__(self, m, n):
    method set_n (line 50) | def set_n(self, n):
    method set_m (line 54) | def set_m(self, m):
    method paintEvent (line 58) | def paintEvent(self, event):
  function wizard_dialog (line 75) | def wizard_dialog(func):
  class InstallWizard (line 97) | class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
    method __init__ (line 102) | def __init__(self, config, app, plugins, storage):
    method run_and_get_wallet (line 155) | def run_and_get_wallet(self):
    method finished (line 282) | def finished(self):
    method on_error (line 286) | def on_error(self, exc_info):
    method set_icon (line 291) | def set_icon(self, filename):
    method set_layout (line 296) | def set_layout(self, layout, title=None, next_enabled=True):
    method exec_layout (line 311) | def exec_layout(self, layout, title=None, raise_on_cancel=True,
    method refresh_gui (line 327) | def refresh_gui(self):
    method remove_from_recently_open (line 332) | def remove_from_recently_open(self, filename):
    method text_input (line 335) | def text_input(self, title, message, is_valid, allow_multi=False):
    method seed_input (line 341) | def seed_input(self, title, message, is_seed, options):
    method add_xpub_dialog (line 347) | def add_xpub_dialog(self, title, message, is_valid, run_next, allow_mu...
    method add_cosigner_dialog (line 351) | def add_cosigner_dialog(self, run_next, index, is_valid):
    method restore_seed_dialog (line 360) | def restore_seed_dialog(self, run_next, test):
    method confirm_seed_dialog (line 371) | def confirm_seed_dialog(self, run_next, test):
    method show_seed_dialog (line 383) | def show_seed_dialog(self, run_next, seed_text):
    method pw_layout (line 389) | def pw_layout(self, msg, kind):
    method request_password (line 396) | def request_password(self, run_next):
    method show_restore (line 401) | def show_restore(self, wallet, network):
    method confirm_dialog (line 423) | def confirm_dialog(self, title, message, run_next):
    method confirm (line 426) | def confirm(self, message, title):
    method action_dialog (line 433) | def action_dialog(self, action, run_next):
    method terminate (line 436) | def terminate(self):
    method waiting_dialog (line 439) | def waiting_dialog(self, task, msg):
    method choice_dialog (line 447) | def choice_dialog(self, title, message, choices, run_next):
    method query_choice (line 457) | def query_choice(self, msg, choices):
    method line_dialog (line 466) | def line_dialog(self, run_next, title, message, default, test, warning...
    method show_xpub_dialog (line 490) | def show_xpub_dialog(self, xpub, run_next):
    method init_network (line 501) | def init_network(self, network):
    method multisig_dialog (line 523) | def multisig_dialog(self, run_next):

FILE: gui/qt/invoice_list.py
  class InvoiceList (line 31) | class InvoiceList(MyTreeWidget):
    method __init__ (line 34) | def __init__(self, parent):
    method on_update (line 40) | def on_update(self):
    method import_invoices (line 59) | def import_invoices(self):
    method create_menu (line 67) | def create_menu(self, position):

FILE: gui/qt/main_window.py
  class StatusBarButton (line 66) | class StatusBarButton(QPushButton):
    method __init__ (line 67) | def __init__(self, icon, tooltip, func):
    method onPress (line 76) | def onPress(self, checked=False):
    method keyPressEvent (line 80) | def keyPressEvent(self, e):
  class ElectrumWindow (line 88) | class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
    method __init__ (line 100) | def __init__(self, gui_object, wallet):
    method on_history (line 203) | def on_history(self, b):
    method on_fx_history (line 206) | def on_fx_history(self):
    method on_quotes (line 211) | def on_quotes(self, b):
    method on_fx_quotes (line 214) | def on_fx_quotes(self):
    method toggle_tab (line 225) | def toggle_tab(self, tab):
    method push_top_level_window (line 245) | def push_top_level_window(self, window):
    method pop_top_level_window (line 251) | def pop_top_level_window(self, window):
    method top_level_window (line 254) | def top_level_window(self):
    method diagnostic_name (line 259) | def diagnostic_name(self):
    method is_hidden (line 263) | def is_hidden(self):
    method show_or_hide (line 266) | def show_or_hide(self):
    method bring_to_top (line 272) | def bring_to_top(self):
    method on_error (line 276) | def on_error(self, exc_info):
    method on_network (line 281) | def on_network(self, event, *args):
    method on_network_qt (line 296) | def on_network_qt(self, event, args=None):
    method fetch_alias (line 311) | def fetch_alias(self):
    method close_wallet (line 323) | def close_wallet(self):
    method load_wallet (line 328) | def load_wallet(self, wallet):
    method init_geometry (line 355) | def init_geometry(self):
    method watching_only_changed (line 365) | def watching_only_changed(self):
    method warn_if_watching_only (line 380) | def warn_if_watching_only(self):
    method open_wallet (line 389) | def open_wallet(self):
    method backup_wallet (line 397) | def backup_wallet(self):
    method update_recently_visited (line 412) | def update_recently_visited(self, filename):
    method get_wallet_folder (line 431) | def get_wallet_folder(self):
    method new_wallet (line 434) | def new_wallet(self):
    method init_menubar (line 446) | def init_menubar(self):
    method donate_to_server (line 528) | def donate_to_server(self):
    method show_about (line 536) | def show_about(self):
    method show_report_bug (line 542) | def show_report_bug(self):
    method notify_transactions (line 551) | def notify_transactions(self):
    method notify (line 575) | def notify(self, message):
    method getOpenFileName (line 586) | def getOpenFileName(self, title, filter = ""):
    method getSaveFileName (line 593) | def getSaveFileName(self, title, filename, filter = ""):
    method connect_slots (line 601) | def connect_slots(self, sender):
    method timer_actions (line 604) | def timer_actions(self):
    method format_amount (line 617) | def format_amount(self, x, is_diff=False, whitespaces=False):
    method format_amount_and_units (line 620) | def format_amount_and_units(self, amount):
    method format_fee_rate (line 627) | def format_fee_rate(self, fee_rate):
    method get_decimal_point (line 633) | def get_decimal_point(self):
    method base_unit (line 636) | def base_unit(self):
    method connect_fields (line 646) | def connect_fields(self, window, btc_e, fiat_e, fee_e):
    method update_status (line 683) | def update_status(self):
    method update_wallet (line 728) | def update_wallet(self):
    method update_tabs (line 733) | def update_tabs(self):
    method create_history_tab (line 742) | def create_history_tab(self):
    method show_address (line 748) | def show_address(self, addr):
    method show_transaction (line 753) | def show_transaction(self, tx, tx_desc = None):
    method create_receive_tab (line 757) | def create_receive_tab(self):
    method delete_payment_request (line 851) | def delete_payment_request(self, addr):
    method get_request_URI (line 856) | def get_request_URI(self, addr):
    method sign_payment_request (line 872) | def sign_payment_request(self, addr):
    method save_payment_request (line 892) | def save_payment_request(self):
    method view_and_paste (line 908) | def view_and_paste(self, title, msg, data):
    method export_payment_request (line 920) | def export_payment_request(self, addr):
    method new_payment_request (line 931) | def new_payment_request(self):
    method set_receive_address (line 951) | def set_receive_address(self, addr):
    method clear_receive_tab (line 956) | def clear_receive_tab(self):
    method toggle_qr_window (line 964) | def toggle_qr_window(self):
    method show_send_tab (line 979) | def show_send_tab(self):
    method show_receive_tab (line 982) | def show_receive_tab(self):
    method receive_at (line 985) | def receive_at(self, addr):
    method update_receive_qr (line 992) | def update_receive_qr(self):
    method create_send_tab (line 1002) | def create_send_tab(self):
    method spend_max (line 1213) | def spend_max(self):
    method update_fee (line 1217) | def update_fee(self):
    method get_payto_or_dummy (line 1220) | def get_payto_or_dummy(self):
    method do_update_fee (line 1226) | def do_update_fee(self):
    method from_list_delete (line 1284) | def from_list_delete(self, item):
    method from_list_menu (line 1290) | def from_list_menu(self, position):
    method set_pay_from (line 1296) | def set_pay_from(self, coins):
    method redraw_from_list (line 1300) | def redraw_from_list(self):
    method get_contact_payto (line 1312) | def get_contact_payto(self, key):
    method update_completions (line 1316) | def update_completions(self):
    method protected (line 1320) | def protected(func):
    method is_send_fee_frozen (line 1344) | def is_send_fee_frozen(self):
    method is_send_feerate_frozen (line 1348) | def is_send_feerate_frozen(self):
    method get_send_fee_estimator (line 1352) | def get_send_fee_estimator(self):
    method read_send_tab (line 1364) | def read_send_tab(self):
    method do_preview (line 1405) | def do_preview(self):
    method do_send (line 1408) | def do_send(self, preview = False):
    method sign_tx (line 1480) | def sign_tx(self, tx, callback, password):
    method sign_tx_with_password (line 1483) | def sign_tx_with_password(self, tx, callback, password):
    method broadcast_transaction (line 1504) | def broadcast_transaction(self, tx, tx_desc):
    method query_choice (line 1542) | def query_choice(self, msg, choices):
    method lock_amount (line 1553) | def lock_amount(self, b):
    method prepare_for_payment_request (line 1557) | def prepare_for_payment_request(self):
    method delete_invoice (line 1565) | def delete_invoice(self, key):
    method payment_request_ok (line 1569) | def payment_request_ok(self):
    method payment_request_error (line 1590) | def payment_request_error(self):
    method on_pr (line 1595) | def on_pr(self, request):
    method pay_to_URI (line 1602) | def pay_to_URI(self, URI):
    method do_clear (line 1633) | def do_clear(self):
    method set_frozen_state (line 1649) | def set_frozen_state(self, addrs, freeze):
    method create_list_tab (line 1655) | def create_list_tab(self, l, list_header=None):
    method create_addresses_tab (line 1671) | def create_addresses_tab(self):
    method create_utxo_tab (line 1676) | def create_utxo_tab(self):
    method create_contacts_tab (line 1681) | def create_contacts_tab(self):
    method remove_address (line 1686) | def remove_address(self, addr):
    method get_coins (line 1693) | def get_coins(self):
    method spend_coins (line 1699) | def spend_coins(self, coins):
    method paytomany (line 1704) | def paytomany(self):
    method payto_contacts (line 1715) | def payto_contacts(self, labels):
    method set_contact (line 1726) | def set_contact(self, label, address):
    method delete_contacts (line 1737) | def delete_contacts(self, labels):
    method show_invoice (line 1747) | def show_invoice(self, key):
    method show_pr_details (line 1752) | def show_pr_details(self, pr):
    method do_pay_invoice (line 1789) | def do_pay_invoice(self, key):
    method create_console_tab (line 1799) | def create_console_tab(self):
    method update_console (line 1804) | def update_console(self):
    method create_status_bar (line 1825) | def create_status_bar(self):
    method update_lock_icon (line 1853) | def update_lock_icon(self):
    method update_buttons_on_seed (line 1857) | def update_buttons_on_seed(self):
    method change_password_dialog (line 1862) | def change_password_dialog(self):
    method toggle_search (line 1881) | def toggle_search(self):
    method do_search (line 1888) | def do_search(self, t):
    method new_contact_dialog (line 1893) | def new_contact_dialog(self):
    method show_master_public_keys (line 1911) | def show_master_public_keys(self):
    method remove_wallet (line 1951) | def remove_wallet(self):
    method _delete_wallet (line 1959) | def _delete_wallet(self, password):
    method show_seed_dialog (line 1968) | def show_seed_dialog(self, password):
    method show_qrcode (line 1983) | def show_qrcode(self, data, title = _("QR code"), parent=None):
    method show_private_key (line 1990) | def show_private_key(self, address, password):
    method do_sign (line 2027) | def do_sign(self, address, message, signature, password):
    method do_verify (line 2047) | def do_verify(self, address, message, signature):
    method sign_verify_message (line 2064) | def sign_verify_message(self, address=''):
    method do_decrypt (line 2102) | def do_decrypt(self, message_e, pubkey_e, encrypted_e, password):
    method do_encrypt (line 2107) | def do_encrypt(self, message_e, pubkey_e, encrypted_e):
    method encrypt_message (line 2117) | def encrypt_message(self, address=''):
    method password_dialog (line 2156) | def password_dialog(self, msg=None, parent=None):
    method tx_from_text (line 2162) | def tx_from_text(self, txt):
    method read_tx_from_qrcode (line 2171) | def read_tx_from_qrcode(self):
    method read_tx_from_file (line 2191) | def read_tx_from_file(self):
    method do_process_from_text (line 2203) | def do_process_from_text(self):
    method do_process_from_file (line 2215) | def do_process_from_file(self):
    method do_process_from_txid (line 2224) | def do_process_from_txid(self):
    method export_privkeys_dialog (line 2238) | def export_privkeys_dialog(self, password):
    method do_export_privkeys (line 2329) | def do_export_privkeys(self, fileName, pklist, is_csv):
    method do_import_labels (line 2340) | def do_import_labels(self):
    method do_export_labels (line 2354) | def do_export_labels(self):
    method export_history_dialog (line 2365) | def export_history_dialog(self):
    method plot_history_dialog (line 2391) | def plot_history_dialog(self):
    method do_export_history (line 2400) | def do_export_history(self, wallet, fileName, is_csv):
    method sweep_key_dialog (line 2438) | def sweep_key_dialog(self):
    method _do_import (line 2494) | def _do_import(self, title, msg, func):
    method import_addresses (line 2515) | def import_addresses(self):
    method do_import_privkey (line 2522) | def do_import_privkey(self, password):
    method update_fiat (line 2528) | def update_fiat(self):
    method settings_dialog (line 2538) | def settings_dialog(self):
    method closeEvent (line 2902) | def closeEvent(self, event):
    method clean_up (line 2909) | def clean_up(self):
    method plugins_dialog (line 2925) | def plugins_dialog(self):
    method cpfp (line 2989) | def cpfp(self, parent_tx, new_tx):
    method bump_fee_dialog (line 3041) | def bump_fee_dialog(self, tx):

FILE: gui/qt/network_dialog.py
  class NetworkDialog (line 42) | class NetworkDialog(QDialog):
    method __init__ (line 43) | def __init__(self, network, config, network_updated_signal_obj):
    method on_network (line 56) | def on_network(self, event, *args):
    method on_update (line 59) | def on_update(self):
  class NodesListWidget (line 64) | class NodesListWidget(QTreeWidget):
    method __init__ (line 66) | def __init__(self, parent):
    method create_menu (line 73) | def create_menu(self, position):
    method keyPressEvent (line 87) | def keyPressEvent(self, event):
    method on_activated (line 93) | def on_activated(self, item, column):
    method update (line 99) | def update(self, network):
  class ServerListWidget (line 129) | class ServerListWidget(QTreeWidget):
    method __init__ (line 131) | def __init__(self, parent):
    method create_menu (line 138) | def create_menu(self, position):
    method set_server (line 147) | def set_server(self, s):
    method keyPressEvent (line 153) | def keyPressEvent(self, event):
    method on_activated (line 159) | def on_activated(self, item, column):
    method update (line 165) | def update(self, servers, protocol, use_tor):
  class NetworkChoiceLayout (line 183) | class NetworkChoiceLayout(object):
    method __init__ (line 185) | def __init__(self, network, config, wizard=False):
    method check_disable_proxy (line 320) | def check_disable_proxy(self, b):
    method enable_set_server (line 326) | def enable_set_server(self):
    method update (line 336) | def update(self):
    method fill_in_proxy_settings (line 368) | def fill_in_proxy_settings(self):
    method layout (line 385) | def layout(self):
    method set_protocol (line 388) | def set_protocol(self, protocol):
    method change_protocol (line 392) | def change_protocol(self, use_ssl):
    method follow_branch (line 404) | def follow_branch(self, index):
    method follow_server (line 408) | def follow_server(self, server):
    method server_changed (line 415) | def server_changed(self, x):
    method change_server (line 419) | def change_server(self, host, protocol):
    method accept (line 437) | def accept(self):
    method set_server (line 440) | def set_server(self):
    method set_proxy (line 448) | def set_proxy(self):
    method suggest_proxy (line 461) | def suggest_proxy(self, found_proxy):
    method use_tor_proxy (line 470) | def use_tor_proxy(self, use_it):
    method proxy_settings_changed (line 488) | def proxy_settings_changed(self):
  class TorDetector (line 492) | class TorDetector(QThread):
    method __init__ (line 495) | def __init__(self):
    method run (line 498) | def run(self):
    method is_tor_port (line 507) | def is_tor_port(port):

FILE: gui/qt/password_dialog.py
  function check_password_strength (line 36) | def check_password_strength(password):
  class PasswordLayout (line 56) | class PasswordLayout(object):
    method __init__ (line 60) | def __init__(self, wallet, msg, kind, OK_button):
    method title (line 135) | def title(self):
    method layout (line 138) | def layout(self):
    method pw_changed (line 141) | def pw_changed(self):
    method old_password (line 153) | def old_password(self):
    method new_password (line 158) | def new_password(self):
  class ChangePasswordDialog (line 166) | class ChangePasswordDialog(WindowModalDialog):
    method __init__ (line 168) | def __init__(self, parent, wallet):
    method run (line 189) | def run(self):
  class PasswordDialog (line 195) | class PasswordDialog(WindowModalDialog):
    method __init__ (line 197) | def __init__(self, parent=None, msg=None):
    method run (line 213) | def run(self):

FILE: gui/qt/paytoedit.py
  class PayToEdit (line 43) | class PayToEdit(ScanQRTextEdit):
    method __init__ (line 45) | def __init__(self, win):
    method setFrozen (line 64) | def setFrozen(self, b):
    method setGreen (line 70) | def setGreen(self):
    method setExpired (line 73) | def setExpired(self):
    method parse_address_and_amount (line 76) | def parse_address_and_amount(self, line):
    method parse_output (line 82) | def parse_output(self, x):
    method parse_script (line 90) | def parse_script(self, x):
    method parse_amount (line 101) | def parse_amount(self, x):
    method parse_address (line 107) | def parse_address(self, line):
    method check_text (line 114) | def check_text(self):
    method get_errors (line 160) | def get_errors(self):
    method get_recipient (line 163) | def get_recipient(self):
    method get_outputs (line 166) | def get_outputs(self, is_max):
    method lines (line 178) | def lines(self):
    method is_multiline (line 181) | def is_multiline(self):
    method paytomany (line 184) | def paytomany(self):
    method update_size (line 188) | def update_size(self):
    method setCompleter (line 198) | def setCompleter(self, completer):
    method insertCompletion (line 205) | def insertCompletion(self, completion):
    method textUnderCursor (line 216) | def textUnderCursor(self):
    method keyPressEvent (line 222) | def keyPressEvent(self, e):
    method qr_input (line 261) | def qr_input(self):
    method resolve (line 267) | def resolve(self):

FILE: gui/qt/qrcodewidget.py
  class QRCodeWidget (line 16) | class QRCodeWidget(QWidget):
    method __init__ (line 18) | def __init__(self, data = None, fixedSize=False):
    method setData (line 28) | def setData(self, data):
    method paintEvent (line 43) | def paintEvent(self, e):
  class QRDialog (line 88) | class QRDialog(WindowModalDialog):
    method __init__ (line 90) | def __init__(self, data, parent=None, title = "", show_text=False):

FILE: gui/qt/qrtextedit.py
  class ShowQRTextEdit (line 11) | class ShowQRTextEdit(ButtonsTextEdit):
    method __init__ (line 13) | def __init__(self, text=None):
    method qr_show (line 20) | def qr_show(self):
    method contextMenuEvent (line 28) | def contextMenuEvent(self, e):
  class ScanQRTextEdit (line 34) | class ScanQRTextEdit(ButtonsTextEdit, MessageBoxMixin):
    method __init__ (line 36) | def __init__(self, text="", allow_multi=False):
    method file_input (line 45) | def file_input(self):
    method qr_input (line 53) | def qr_input(self):
    method contextMenuEvent (line 69) | def contextMenuEvent(self, e):

FILE: gui/qt/qrwindow.py
  class QR_Window (line 44) | class QR_Window(QWidget):
    method __init__ (line 46) | def __init__(self, win):
    method set_content (line 78) | def set_content(self, address, amount, message, url):

FILE: gui/qt/request_list.py
  class RequestList (line 36) | class RequestList(MyTreeWidget):
    method __init__ (line 40) | def __init__(self, parent):
    method item_changed (line 48) | def item_changed(self, item):
    method on_update (line 66) | def on_update(self):
    method create_menu (line 108) | def create_menu(self, position):

FILE: gui/qt/seed_dialog.py
  function seed_warning_msg (line 35) | def seed_warning_msg(seed):
  class SeedLayout (line 51) | class SeedLayout(QVBoxLayout):
    method seed_options (line 56) | def seed_options(self):
    method __init__ (line 89) | def __init__(self, seed=None, title=None, icon=True, msg=None, options...
    method get_seed (line 134) | def get_seed(self):
    method on_edit (line 138) | def on_edit(self):
  class KeysLayout (line 154) | class KeysLayout(QVBoxLayout):
    method __init__ (line 155) | def __init__(self, parent=None, title=None, is_valid=None, allow_multi...
    method get_text (line 164) | def get_text(self):
    method on_edit (line 167) | def on_edit(self):
  class SeedDialog (line 172) | class SeedDialog(WindowModalDialog):
    method __init__ (line 174) | def __init__(self, parent, seed, passphrase):

FILE: gui/qt/transaction_dialog.py
  function show_transaction (line 42) | def show_transaction(tx, parent, desc=None, prompt_if_unsaved=False):
  class TxDialog (line 47) | class TxDialog(QDialog, MessageBoxMixin):
    method __init__ (line 49) | def __init__(self, tx, parent, desc, prompt_if_unsaved):
    method do_broadcast (line 128) | def do_broadcast(self):
    method closeEvent (line 137) | def closeEvent(self, event):
    method show_qr (line 145) | def show_qr(self):
    method sign (line 153) | def sign(self):
    method save (line 165) | def save(self):
    method update (line 174) | def update(self):
    method add_io (line 217) | def add_io(self, vbox):

FILE: gui/qt/util.py
  class Timer (line 46) | class Timer(QThread):
    method run (line 50) | def run(self):
    method stop (line 55) | def stop(self):
  class EnterButton (line 59) | class EnterButton(QPushButton):
    method __init__ (line 60) | def __init__(self, text, func):
    method keyPressEvent (line 65) | def keyPressEvent(self, e):
  class ThreadedButton (line 70) | class ThreadedButton(QPushButton):
    method __init__ (line 71) | def __init__(self, text, task, on_success=None, on_error=None):
    method run_task (line 78) | def run_task(self):
    method done (line 83) | def done(self):
  class WWLabel (line 88) | class WWLabel(QLabel):
    method __init__ (line 89) | def __init__ (self, text="", parent=None):
  class HelpLabel (line 94) | class HelpLabel(QLabel):
    method __init__ (line 96) | def __init__(self, text, help_text):
    method mouseReleaseEvent (line 102) | def mouseReleaseEvent(self, x):
    method enterEvent (line 105) | def enterEvent(self, event):
    method leaveEvent (line 111) | def leaveEvent(self, event):
  class HelpButton (line 118) | class HelpButton(QPushButton):
    method __init__ (line 119) | def __init__(self, text):
    method onclick (line 126) | def onclick(self):
  class Buttons (line 129) | class Buttons(QHBoxLayout):
    method __init__ (line 130) | def __init__(self, *buttons):
  class CloseButton (line 136) | class CloseButton(QPushButton):
    method __init__ (line 137) | def __init__(self, dialog):
  class CopyButton (line 142) | class CopyButton(QPushButton):
    method __init__ (line 143) | def __init__(self, text_getter, app):
  class CopyCloseButton (line 147) | class CopyCloseButton(QPushButton):
    method __init__ (line 148) | def __init__(self, text_getter, app, dialog):
  class OkButton (line 154) | class OkButton(QPushButton):
    method __init__ (line 155) | def __init__(self, dialog, label=None):
  class CancelButton (line 160) | class CancelButton(QPushButton):
    method __init__ (line 161) | def __init__(self, dialog, label=None):
  class MessageBoxMixin (line 165) | class MessageBoxMixin(object):
    method top_level_window_recurse (line 166) | def top_level_window_recurse(self, window=None):
    method top_level_window (line 175) | def top_level_window(self):
    method question (line 178) | def question(self, msg, parent=None, title=None, icon=None):
    method show_warning (line 184) | def show_warning(self, msg, parent=None, title=None):
    method show_error (line 188) | def show_error(self, msg, parent=None):
    method show_critical (line 192) | def show_critical(self, msg, parent=None, title=None):
    method show_message (line 196) | def show_message(self, msg, parent=None, title=None):
    method msg_box (line 200) | def msg_box(self, icon, parent, title, text, buttons=QMessageBox.Ok,
  class WindowModalDialog (line 208) | class WindowModalDialog(QDialog, MessageBoxMixin):
    method __init__ (line 211) | def __init__(self, parent, title=None):
  class WaitingDialog (line 218) | class WaitingDialog(WindowModalDialog):
    method __init__ (line 221) | def __init__(self, parent, message, task, on_success=None, on_error=No...
    method wait (line 233) | def wait(self):
    method on_accepted (line 236) | def on_accepted(self):
  function line_dialog (line 240) | def line_dialog(parent, title, label, ok_label, default=None):
  function text_dialog (line 254) | def text_dialog(parent, title, label, ok_label, default=None, allow_mult...
  class ChoicesLayout (line 269) | class ChoicesLayout(object):
    method __init__ (line 270) | def __init__(self, msg, choices, on_clicked=None, checked_index=0):
    method layout (line 296) | def layout(self):
    method selected_index (line 299) | def selected_index(self):
  function address_field (line 302) | def address_field(addresses):
  function filename_field (line 326) | def filename_field(parent, config, defaultname, select_msg):
  class ElectrumItemDelegate (line 369) | class ElectrumItemDelegate(QStyledItemDelegate):
    method createEditor (line 370) | def createEditor(self, parent, option, index):
  class MyTreeWidget (line 373) | class MyTreeWidget(QTreeWidget):
    method __init__ (line 375) | def __init__(self, parent, create_menu, headers, stretch_column=None,
    method update_headers (line 399) | def update_headers(self, headers):
    method editItem (line 407) | def editItem(self, item, column):
    method keyPressEvent (line 415) | def keyPressEvent(self, event):
    method permit_edit (line 421) | def permit_edit(self, item, column):
    method on_permit_edit (line 425) | def on_permit_edit(self, item, column):
    method on_doubleclick (line 428) | def on_doubleclick(self, item, column):
    method on_activated (line 432) | def on_activated(self, item, column):
    method createEditor (line 438) | def createEditor(self, parent, option, index):
    method editing_finished (line 444) | def editing_finished(self):
    method on_edited (line 467) | def on_edited(self, item, column, prior):
    method update (line 475) | def update(self):
    method on_update (line 486) | def on_update(self):
    method get_leaves (line 489) | def get_leaves(self, root):
    method filter (line 498) | def filter(self, p):
  class ButtonsWidget (line 507) | class ButtonsWidget(QWidget):
    method __init__ (line 509) | def __init__(self):
    method resizeButtons (line 513) | def resizeButtons(self):
    method addButton (line 522) | def addButton(self, icon_name, on_click, tooltip):
    method addCopyButton (line 532) | def addCopyButton(self, app):
    method on_copy (line 536) | def on_copy(self):
  class ButtonsLineEdit (line 540) | class ButtonsLineEdit(QLineEdit, ButtonsWidget):
    method __init__ (line 541) | def __init__(self, text=None):
    method resizeEvent (line 545) | def resizeEvent(self, e):
  class ButtonsTextEdit (line 550) | class ButtonsTextEdit(QPlainTextEdit, ButtonsWidget):
    method __init__ (line 551) | def __init__(self, text=None):
    method resizeEvent (line 557) | def resizeEvent(self, e):
  class TaskThread (line 563) | class TaskThread(QThread):
    method __init__ (line 570) | def __init__(self, parent, on_error=None):
    method add (line 577) | def add(self, task, on_success=None, on_done=None, on_error=None):
    method run (line 581) | def run(self):
    method on_done (line 592) | def on_done(self, result, cb_done, cb):
    method stop (line 599) | def stop(self):
  class ColorSchemeItem (line 603) | class ColorSchemeItem:
    method __init__ (line 604) | def __init__(self, fg_color, bg_color):
    method _get_color (line 607) | def _get_color(self, background):
    method as_stylesheet (line 610) | def as_stylesheet(self, background=False):
    method as_color (line 615) | def as_color(self, background=False):
  class ColorScheme (line 620) | class ColorScheme:
    method has_dark_background (line 629) | def has_dark_background(widget):
    method update_from_widget (line 634) | def update_from_widget(widget):

FILE: gui/qt/utxo_list.py
  class UTXOList (line 29) | class UTXOList(MyTreeWidget):
    method __init__ (line 32) | def __init__(self, parent=None):
    method get_name (line 36) | def get_name(self, x):
    method on_update (line 39) | def on_update(self):
    method create_menu (line 58) | def create_menu(self, position):
    method on_permit_edit (line 73) | def on_permit_edit(self, item, column):

FILE: gui/stdio.py
  class ElectrumGui (line 12) | class ElectrumGui:
    method __init__ (line 14) | def __init__(self, config, daemon, plugins):
    method on_network (line 51) | def on_network(self, event, *args):
    method main_command (line 57) | def main_command(self):
    method updated (line 73) | def updated(self):
    method print_commands (line 80) | def print_commands(self):
    method print_history (line 83) | def print_history(self):
    method print_balance (line 106) | def print_balance(self):
    method get_balance (line 109) | def get_balance(self):
    method print_contacts (line 126) | def print_contacts(self):
    method print_addresses (line 130) | def print_addresses(self):
    method print_order (line 134) | def print_order(self):
    method enter_order (line 138) | def enter_order(self):
    method send_order (line 144) | def send_order(self):
    method print_banner (line 147) | def print_banner(self):
    method print_list (line 151) | def print_list(self, lst, firstline):
    method main (line 161) | def main(self):
    method do_send (line 164) | def do_send(self):
    method network_dialog (line 210) | def network_dialog(self):
    method settings_dialog (line 215) | def settings_dialog(self):
    method password_dialog (line 219) | def password_dialog(self):
    method run_receive_tab (line 225) | def run_receive_tab(self, c):
    method run_contacts_tab (line 230) | def run_contacts_tab(self, c):

FILE: gui/text.py
  class ElectrumGui (line 15) | class ElectrumGui:
    method __init__ (line 17) | def __init__(self, config, daemon, plugins):
    method set_cursor (line 67) | def set_cursor(self, x):
    method restore_or_create (line 73) | def restore_or_create(self):
    method verify_seed (line 76) | def verify_seed(self):
    method get_string (line 79) | def get_string(self, y, x):
    method update (line 88) | def update(self, event):
    method print_history (line 94) | def print_history(self):
    method update_history (line 105) | def update_history(self):
    method print_balance (line 128) | def print_balance(self):
    method print_receive (line 151) | def print_receive(self):
    method print_contacts (line 156) | def print_contacts(self):
    method print_addresses (line 160) | def print_addresses(self):
    method print_edit_line (line 165) | def print_edit_line(self, y, label, text, index, size):
    method print_send_tab (line 170) | def print_send_tab(self):
    method print_banner (line 180) | def print_banner(self):
    method print_qr (line 184) | def print_qr(self, data):
    method print_list (line 201) | def print_list(self, lst, firstline = None):
    method refresh (line 215) | def refresh(self):
    method main_command (line 221) | def main_command(self):
    method run_tab (line 237) | def run_tab(self, i, print_func, exec_func):
    method run_history_tab (line 246) | def run_history_tab(self, c):
    method edit_str (line 251) | def edit_str(self, target, c, is_num=False):
    method run_send_tab (line 261) | def run_send_tab(self, c):
    method run_receive_tab (line 276) | def run_receive_tab(self, c):
    method run_contacts_tab (line 280) | def run_contacts_tab(self, c):
    method run_banner_tab (line 293) | def run_banner_tab(self, c):
    method main (line 297) | def main(self):
    method do_clear (line 315) | def do_clear(self):
    method do_send (line 321) | def do_send(self):
    method show_message (line 362) | def show_message(self, message, getchar = True):
    method run_popup (line 371) | def run_popup(self, title, items):
    method network_dialog (line 374) | def network_dialog(self):
    method settings_dialog (line 398) | def settings_dialog(self):
    method password_dialog (line 409) | def password_dialog(self):
    method run_dialog (line 416) | def run_dialog(self, title, items, interval=2, buttons=None, y_pos=3):

FILE: lib/base_wizard.py
  class ScriptTypeNotSupported (line 34) | class ScriptTypeNotSupported(Exception): pass
  class BaseWizard (line 37) | class BaseWizard(object):
    method __init__ (line 39) | def __init__(self, config, storage):
    method run (line 50) | def run(self, *args):
    method can_go_back (line 67) | def can_go_back(self):
    method go_back (line 70) | def go_back(self):
    method new (line 77) | def new(self):
    method load_2fa (line 91) | def load_2fa(self):
    method on_wallet_type (line 96) | def on_wallet_type(self, choice):
    method choose_multisig (line 109) | def choose_multisig(self):
    method choose_keystore (line 117) | def choose_keystore(self):
    method import_addresses_or_keys (line 141) | def import_addresses_or_keys(self):
    method on_import (line 148) | def on_import(self, text):
    method restore_from_key (line 161) | def restore_from_key(self):
    method on_restore_from_key (line 174) | def on_restore_from_key(self, text):
    method choose_hw_device (line 178) | def choose_hw_device(self):
    method on_device (line 220) | def on_device(self, name, device_info):
    method derivation_dialog (line 236) | def derivation_dialog(self, f):
    method on_hw_derivation (line 257) | def on_hw_derivation(self, name, device_info, derivation):
    method passphrase_dialog (line 277) | def passphrase_dialog(self, run_next):
    method restore_from_seed (line 289) | def restore_from_seed(self):
    method on_restore_seed (line 296) | def on_restore_seed(self, seed, is_bip39, is_ext):
    method on_restore_bip39 (line 316) | def on_restore_bip39(self, seed, passphrase):
    method create_keystore (line 320) | def create_keystore(self, seed, passphrase):
    method on_bip43 (line 324) | def on_bip43(self, seed, passphrase, derivation):
    method on_keystore (line 328) | def on_keystore(self, k):
    method create_wallet (line 366) | def create_wallet(self):
    method on_password (line 372) | def on_password(self, password, encrypt):
    method show_xpub_and_add_cosigners (line 390) | def show_xpub_and_add_cosigners(self, xpub):
    method on_cosigner (line 393) | def on_cosigner(self, text, password, i):
    method choose_seed_type (line 397) | def choose_seed_type(self):
    method create_segwit_seed (line 408) | def create_segwit_seed(self): self.create_seed('segwit')
    method create_standard_seed (line 409) | def create_standard_seed(self): self.create_seed('standard')
    method create_seed (line 411) | def create_seed(self, seed_type):
    method request_passphrase (line 419) | def request_passphrase(self, seed, opt_passphrase):
    method confirm_seed (line 426) | def confirm_seed(self, seed, passphrase):
    method confirm_passphrase (line 430) | def confirm_passphrase(self, seed, passphrase):
    method create_addresses (line 442) | def create_addresses(self):

FILE: lib/bitcoin.py
  function read_json (line 41) | def read_json(filename, default):
  class NetworkConstants (line 73) | class NetworkConstants:
    method set_mainnet (line 76) | def set_mainnet(cls):
    method set_testnet (line 94) | def set_testnet(cls):
  class InvalidPadding (line 136) | class InvalidPadding(Exception):
  function append_PKCS7_padding (line 140) | def append_PKCS7_padding(data):
  function strip_PKCS7_padding (line 146) | def strip_PKCS7_padding(data):
  function aes_encrypt_with_iv (line 159) | def aes_encrypt_with_iv(key, iv, data):
  function aes_decrypt_with_iv (line 171) | def aes_decrypt_with_iv(key, iv, data):
  function EncodeAES (line 186) | def EncodeAES(secret, s):
  function DecodeAES (line 193) | def DecodeAES(secret, e):
  function pw_encode (line 199) | def pw_encode(s, password):
  function pw_decode (line 206) | def pw_decode(s, password):
  function rev_hex (line 218) | def rev_hex(s):
  function int_to_hex (line 222) | def int_to_hex(i, length=1):
  function var_int (line 229) | def var_int(i):
  function op_push (line 241) | def op_push(i):
  function push_script (line 251) | def push_script(x):
  function read_vector_size (line 262) | def read_vector_size(f):
  function ser_char_vector (line 272) | def ser_char_vector(l):
  function deser_char_vector (line 287) | def deser_char_vector(f):
  function vector_from_bytes (line 301) | def vector_from_bytes(s):
  function deser_uint256 (line 305) | def deser_uint256(f):
  function uint256_from_bytes (line 313) | def uint256_from_bytes(s):
  function ser_uint256 (line 321) | def ser_uint256(u):
  function sha256 (line 332) | def sha256(x):
  function Hash (line 337) | def Hash(x):
  function is_new_seed (line 345) | def is_new_seed(x, prefix=version.SEED_PREFIX):
  function is_old_seed (line 352) | def is_old_seed(seed):
  function seed_type (line 370) | def seed_type(x):
  function i2o_ECPublicKey (line 385) | def i2o_ECPublicKey(pubkey, compressed=False):
  function hash_160 (line 405) | def hash_160(public_key):
  function hash160_to_b58_address (line 416) | def hash160_to_b58_address(h160, addrtype, witness_program_version=1):
  function b58_address_to_hash160 (line 423) | def b58_address_to_hash160(addr):
  function hash160_to_p2pkh (line 429) | def hash160_to_p2pkh(h160):
  function hash160_to_p2sh (line 432) | def hash160_to_p2sh(h160):
  function public_key_to_p2pkh (line 435) | def public_key_to_p2pkh(public_key):
  function hash_to_segwit_addr (line 438) | def hash_to_segwit_addr(h):
  function public_key_to_p2wpkh (line 441) | def public_key_to_p2wpkh(public_key):
  function script_to_p2wsh (line 444) | def script_to_p2wsh(script):
  function p2wpkh_nested_script (line 447) | def p2wpkh_nested_script(pubkey):
  function p2wsh_nested_script (line 451) | def p2wsh_nested_script(witness_script):
  function pubkey_to_address (line 455) | def pubkey_to_address(txin_type, pubkey):
  function redeem_script_to_address (line 466) | def redeem_script_to_address(txin_type, redeem_script):
  function script_to_address (line 478) | def script_to_address(script):
  function address_to_script (line 484) | def address_to_script(addr):
  function address_to_scripthash (line 505) | def address_to_scripthash(addr):
  function script_to_scripthash (line 509) | def script_to_scripthash(script):
  function public_key_to_p2pk_script (line 513) | def public_key_to_p2pk_script(pubkey):
  function base_encode (line 525) | def base_encode(v, base):
  function base_decode (line 554) | def base_decode(v, length, base):
  function EncodeBase58Check (line 584) | def EncodeBase58Check(vchIn):
  function DecodeBase58Check (line 589) | def DecodeBase58Check(psz):
  function serialize_privkey (line 614) | def serialize_privkey(secret, compressed, txin_type):
  function deserialize_privkey (line 621) | def deserialize_privkey(key):
  function regenerate_key (line 634) | def regenerate_key(pk):
  function GetPubKey (line 639) | def GetPubKey(pubkey, compressed=False):
  function GetSecret (line 643) | def GetSecret(pkey):
  function is_compressed (line 647) | def is_compressed(sec):
  function public_key_from_private_key (line 651) | def public_key_from_private_key(pk, compressed):
  function address_from_private_key (line 656) | def address_from_private_key(sec):
  function is_segwit_address (line 661) | def is_segwit_address(addr):
  function is_b58_address (line 668) | def is_b58_address(addr):
  function is_address (line 677) | def is_address(addr):
  function is_private_key (line 681) | def is_private_key(key):
  function is_minikey (line 691) | def is_minikey(text):
  function minikey_to_private_key (line 701) | def minikey_to_private_key(text):
  function msg_magic (line 710) | def msg_magic(message):
  function verify_message (line 715) | def verify_message(address, sig, message):
  function encrypt_message (line 736) | def encrypt_message(message, pubkey):
  function chunks (line 740) | def chunks(l, n):
  function ECC_YfromX (line 744) | def ECC_YfromX(x,curved=curve_secp256k1, odd=True):
  function negative_point (line 760) | def negative_point(P):
  function point_to_ser (line 764) | def point_to_ser(P, comp=True ):
  function ser_to_point (line 770) | def ser_to_point(Aser):
  class MyVerifyingKey (line 781) | class MyVerifyingKey(ecdsa.VerifyingKey):
    method from_signature (line 783) | def from_signature(klass, sig, recid, h, curve):
  function pubkey_from_signature (line 809) | def pubkey_from_signature(sig, h):
  class MySigningKey (line 824) | class MySigningKey(ecdsa.SigningKey):
    method sign_number (line 827) | def sign_number(self, number, entropy=None, k=None):
  class EC_KEY (line 837) | class EC_KEY(object):
    method __init__ (line 839) | def __init__( self, k ):
    method get_public_key (line 845) | def get_public_key(self, compressed=True):
    method sign (line 848) | def sign(self, msg_hash):
    method sign_message (line 855) | def sign_message(self, message, is_compressed):
    method verify_message (line 868) | def verify_message(self, sig, message):
    method encrypt_message (line 882) | def encrypt_message(self, message, pubkey):
    method decrypt_message (line 901) | def decrypt_message(self, encrypted):
  function get_pubkeys_from_secret (line 931) | def get_pubkeys_from_secret(secret):
  function CKD_priv (line 948) | def CKD_priv(k, c, n):
  function _CKD_priv (line 953) | def _CKD_priv(k, c, s, is_prime):
  function CKD_pub (line 969) | def CKD_pub(cK, c, n):
  function _CKD_pub (line 974) | def _CKD_pub(cK, c, s):
  function xprv_header (line 985) | def xprv_header(xtype):
  function xpub_header (line 989) | def xpub_header(xtype):
  function serialize_xprv (line 993) | def serialize_xprv(xtype, c, k, depth=0, fingerprint=b'\x00'*4, child_nu...
  function serialize_xpub (line 998) | def serialize_xpub(xtype, c, cK, depth=0, fingerprint=b'\x00'*4, child_n...
  function deserialize_xkey (line 1003) | def deserialize_xkey(xkey, prv):
  function deserialize_xpub (line 1021) | def deserialize_xpub(xkey):
  function deserialize_xprv (line 1024) | def deserialize_xprv(xkey):
  function xpub_type (line 1027) | def xpub_type(x):
  function is_xpub (line 1031) | def is_xpub(text):
  function is_xprv (line 1039) | def is_xprv(text):
  function xpub_from_xprv (line 1047) | def xpub_from_xprv(xprv):
  function bip32_root (line 1053) | def bip32_root(seed, xtype):
  function xpub_from_pubkey (line 1063) | def xpub_from_pubkey(xtype, cK):
  function bip32_derivation (line 1068) | def bip32_derivation(s):
  function is_bip32_derivation (line 1076) | def is_bip32_derivation(x):
  function bip32_private_derivation (line 1083) | def bip32_private_derivation(xprv, branch, sequence):
  function bip32_public_derivation (line 1104) | def bip32_public_derivation(xpub, branch, sequence):
  function bip32_private_key (line 1119) | def bip32_private_key(sequence, k, chain):

FILE: lib/blockchain.py
  function serialize_header (line 40) | def serialize_header(res):
  function deserialize_header (line 52) | def deserialize_header(f, height):
  function sha256_header (line 79) | def sha256_header(header):
  function hash_header (line 82) | def hash_header(header):
  function read_blockchains (line 92) | def read_blockchains(config):
  function check_header (line 110) | def check_header(header):
  function can_connect (line 118) | def can_connect(header):
  class Blockchain (line 125) | class Blockchain(util.PrintError):
    method __init__ (line 130) | def __init__(self, config, checkpoint, parent_id):
    method parent (line 140) | def parent(self):
    method get_max_child (line 143) | def get_max_child(self):
    method get_checkpoint (line 147) | def get_checkpoint(self):
    method get_branch_size (line 151) | def get_branch_size(self):
    method get_name (line 154) | def get_name(self):
    method check_header (line 157) | def check_header(self, header):
    method fork (line 162) | def fork(parent, header):
    method height (line 169) | def height(self):
    method size (line 172) | def size(self):
    method update_size (line 176) | def update_size(self):
    method verify_header (line 180) | def verify_header(self, header, prev_header):
    method verify_chunk (line 195) | def verify_chunk(self, index, data):
    method path (line 207) | def path(self):
    method save_chunk (line 212) | def save_chunk(self, index, chunk):
    method swap_with_parent (line 221) | def swap_with_parent(self):
    method write (line 256) | def write(self, data, offset):
    method save_header (line 269) | def save_header(self, header):
    method read_header (line 277) | def read_header(self, height):
    method get_hash (line 294) | def get_hash(self, height):
    method hash_header (line 297) | def hash_header(self, header):
    method bits_to_target (line 300) | def bits_to_target(self, bits):
    method target_to_bits (line 312) | def target_to_bits(self, target):
    method can_connect (line 322) | def can_connect(self, header, check_height=True):
    method connect_chunk (line 346) | def connect_chunk(self, idx, hexdata):

FILE: lib/coinchooser.py
  class PRNG (line 39) | class PRNG:
    method __init__ (line 40) | def __init__(self, seed):
    method get_bytes (line 44) | def get_bytes(self, n):
    method randint (line 51) | def randint(self, start, end):
    method choice (line 61) | def choice(self, seq):
    method shuffle (line 64) | def shuffle(self, x):
  function strip_unneeded (line 79) | def strip_unneeded(bkts, sufficient_funds):
  class CoinChooserBase (line 88) | class CoinChooserBase(PrintError):
    method keys (line 90) | def keys(self, coins):
    method bucketize_coins (line 93) | def bucketize_coins(self, coins):
    method penalty_func (line 111) | def penalty_func(self, tx):
    method change_amounts (line 116) | def change_amounts(self, tx, count, fee_estimator, dust_threshold):
    method change_outputs (line 162) | def change_outputs(self, tx, change_addrs, fee_estimator, dust_thresho...
    method make_tx (line 178) | def make_tx(self, coins, outputs, change_addrs, fee_estimator,
    method choose_buckets (line 244) | def choose_buckets(self, buckets, sufficient_funds, penalty_func):
  class CoinChooserRandom (line 248) | class CoinChooserRandom(CoinChooserBase):
    method bucket_candidates_any (line 250) | def bucket_candidates_any(self, buckets, sufficient_funds):
    method bucket_candidates_prefer_confirmed (line 281) | def bucket_candidates_prefer_confirmed(self, buckets, sufficient_funds):
    method choose_buckets (line 315) | def choose_buckets(self, buckets, sufficient_funds, penalty_func):
  class CoinChooserPrivacy (line 323) | class CoinChooserPrivacy(CoinChooserRandom):
    method keys (line 334) | def keys(self, coins):
    method penalty_func (line 337) | def penalty_func(self, tx):
  function get_name (line 363) | def get_name(config):
  function get_coin_chooser (line 369) | def get_coin_chooser(config):

FILE: lib/commands.py
  function satoshis (line 48) | def satoshis(amount):
  class Command (line 53) | class Command:
    method __init__ (line 54) | def __init__(self, func, s):
  function command (line 73) | def command(s):
  class Commands (line 92) | class Commands:
    method __init__ (line 94) | def __init__(self, config, wallet, network, callback = None):
    method _run (line 100) | def _run(self, method, args, password_getter):
    method commands (line 121) | def commands(self):
    method create (line 126) | def create(self, segwit=False):
    method restore (line 131) | def restore(self, text):
    method password (line 139) | def password(self, password=None, new_password=None):
    method getconfig (line 147) | def getconfig(self, key):
    method setconfig (line 152) | def setconfig(self, key, value):
    method make_seed (line 162) | def make_seed(self, nbits=132, entropy=1, language=None, segwit=False):
    method check_seed (line 170) | def check_seed(self, seed, entropy=1, language=None):
    method getaddresshistory (line 176) | def getaddresshistory(self, address):
    method listunspent (line 183) | def listunspent(self):
    method getaddressunspent (line 193) | def getaddressunspent(self, address):
    method serialize (line 200) | def serialize(self, jsontx):
    method signtransaction (line 230) | def signtransaction(self, tx, privkey=None, password=None):
    method deserialize (line 244) | def deserialize(self, tx):
    method broadcast (line 250) | def broadcast(self, tx, timeout=30):
    method createmultisig (line 256) | def createmultisig(self, num, pubkeys):
    method freeze (line 264) | def freeze(self, address):
    method unfreeze (line 269) | def unfreeze(self, address):
    method getprivatekeys (line 274) | def getprivatekeys(self, address, password=None):
    method ismine (line 284) | def ismine(self, address):
    method dumpprivkeys (line 289) | def dumpprivkeys(self):
    method validateaddress (line 294) | def validateaddress(self, address):
    method getpubkeys (line 299) | def getpubkeys(self, address):
    method getbalance (line 304) | def getbalance(self):
    method getaddressbalance (line 315) | def getaddressbalance(self, address):
    method getproof (line 325) | def getproof(self, address):
    method getmerkle (line 334) | def getmerkle(self, txid, height):
    method getservers (line 340) | def getservers(self):
    method version (line 345) | def version(self):
    method getmpk (line 351) | def getmpk(self):
    method getmasterprivate (line 356) | def getmasterprivate(self, password=None):
    method getseed (line 361) | def getseed(self, password=None):
    method importprivkey (line 367) | def importprivkey(self, privkey, password=None):
    method _resolver (line 378) | def _resolver(self, x):
    method sweep (line 387) | def sweep(self, privkey, destination, fee=None, nocheck=False, imax=100):
    method signmessage (line 400) | def signmessage(self, address, message, password=None):
    method verifymessage (line 407) | def verifymessage(self, address, signature, message):
    method _mktx (line 413) | def _mktx(self, outputs, fee, change_addr, domain, nocheck, unsigned, ...
    method payto (line 435) | def payto(self, destination, amount, fee=None, from_addr=None, change_...
    method paytomany (line 443) | def paytomany(self, outputs, fee=None, from_addr=None, change_addr=Non...
    method history (line 451) | def history(self):
    method setlabel (line 493) | def setlabel(self, key, label):
    method listcontacts (line 499) | def listcontacts(self):
    method getalias (line 504) | def getalias(self, key):
    method searchcontacts (line 509) | def searchcontacts(self, query):
    method listaddresses (line 518) | def listaddresses(self, receiving=False, change=False, labels=False, f...
    method gettransaction (line 543) | def gettransaction(self, txid):
    method encrypt (line 556) | def encrypt(self, pubkey, message):
    method decrypt (line 561) | def decrypt(self, pubkey, encrypted, password=None):
    method _format_request (line 565) | def _format_request(self, out):
    method getrequest (line 577) | def getrequest(self, key):
    method listrequests (line 590) | def listrequests(self, pending=False, expired=False, paid=False):
    method createnewaddress (line 606) | def createnewaddress(self):
    method getunusedaddress (line 611) | def getunusedaddress(self):
    method addrequest (line 617) | def addrequest(self, amount, memo='', expiration=None, force=False):
    method signrequest (line 635) | def signrequest(self, address, password=None):
    method rmrequest (line 644) | def rmrequest(self, address):
    method clearrequests (line 649) | def clearrequests(self):
    method notify (line 655) | def notify(self, address, URL):
    method is_synchronized (line 671) | def is_synchronized(self):
    method help (line 676) | def help(self):
  function set_default_subparser (line 764) | def set_default_subparser(self, name, args=None):
  function subparser_call (line 791) | def subparser_call(self, parser, namespace, values, option_string=None):
  function add_network_options (line 816) | def add_network_options(parser):
  function add_global_options (line 821) | def add_global_options(parser):
  function get_parser (line 830) | def get_parser():

FILE: lib/contacts.py
  class Contacts (line 31) | class Contacts(dict):
    method __init__ (line 33) | def __init__(self, storage):
    method save (line 47) | def save(self):
    method import_file (line 50) | def import_file(self, path):
    method __setitem__ (line 59) | def __setitem__(self, key, value):
    method pop (line 63) | def pop(self, key):
    method resolve (line 68) | def resolve(self, k):
    method resolve_openalias (line 92) | def resolve_openalias(self, url):
    method find_regex (line 108) | def find_regex(self, haystack, needle):
    method _validate (line 115) | def _validate(self, data):

FILE: lib/daemon.py
  function get_lockfile (line 44) | def get_lockfile(config):
  function remove_lockfile (line 48) | def remove_lockfile(lockfile):
  function get_fd_or_server (line 52) | def get_fd_or_server(config):
  function get_server (line 71) | def get_server(config):
  function get_rpc_credentials (line 97) | def get_rpc_credentials(config):
  class Daemon (line 117) | class Daemon(DaemonThread):
    method __init__ (line 119) | def __init__(self, config, fd, is_gui):
    method init_server (line 136) | def init_server(self, config, fd, is_gui):
    method ping (line 163) | def ping(self):
    method run_daemon (line 166) | def run_daemon(self, config_options):
    method run_gui (line 207) | def run_gui(self, config_options):
    method load_wallet (line 221) | def load_wallet(self, path, password):
    method add_wallet (line 244) | def add_wallet(self, wallet):
    method get_wallet (line 248) | def get_wallet(self, path):
    method stop_wallet (line 251) | def stop_wallet(self, path):
    method run_cmdline (line 255) | def run_cmdline(self, config_options):
    method run (line 282) | def run(self):
    method stop (line 293) | def stop(self):
    method init_gui (line 298) | def init_gui(self, config, plugins):

FILE: lib/dnssec.py
  function python_validate_rrsig (line 66) | def python_validate_rrsig(rrset, rrsig, keys, origin=None, now=None):
  function check_query (line 190) | def check_query(ns, sub, _type, keys):
  function get_and_validate (line 209) | def get_and_validate(ns, url, _type):
  function query (line 259) | def query(url, rtype):

FILE: lib/equihash.py
  function expand_array (line 15) | def expand_array(inp, out_len, bit_len, byte_pad=0):
  function compress_array (line 52) | def compress_array(inp, out_len, bit_len, byte_pad=0):
  function get_indices_from_minimal (line 87) | def get_indices_from_minimal(minimal, bit_len):
  function get_minimal_from_indices (line 96) | def get_minimal_from_indices(indices, bit_len):
  function hash_nonce (line 106) | def hash_nonce(digest, nonce):
  function hash_xi (line 110) | def hash_xi(digest, xi):
  function count_zeroes (line 115) | def count_zeroes(h):
  function has_collision (line 125) | def has_collision(ha, hb, i, l):
  function distinct_indices (line 130) | def distinct_indices(a, b):
  function xor (line 138) | def xor(ha, hb):
  function gbp_basic (line 142) | def gbp_basic(digest, n, k):
  function gbp_validate (line 243) | def gbp_validate(digest, minimal, n, k):
  function zcash_person (line 294) | def zcash_person(n, k):
  function print_hash (line 298) | def print_hash(h):
  function validate_params (line 305) | def validate_params(n, k):
  function is_gbp_valid (line 314) | def is_gbp_valid(header, nNonce, nSolution, n=48, k=5):

FILE: lib/exchange_rate.py
  class ExchangeBase (line 26) | class ExchangeBase(PrintError):
    method __init__ (line 28) | def __init__(self, on_quotes, on_history):
    method get_json (line 34) | def get_json(self, site, get_string):
    method get_csv (line 40) | def get_csv(self, site, get_string):
    method name (line 46) | def name(self):
    method update_safe (line 49) | def update_safe(self, ccy):
    method update (line 58) | def update(self, ccy):
    method get_historical_rates_safe (line 63) | def get_historical_rates_safe(self, ccy):
    method get_historical_rates (line 72) | def get_historical_rates(self, ccy):
    method history_ccys (line 80) | def history_ccys(self):
    method historical_rate (line 83) | def historical_rate(self, ccy, d_t):
    method get_currencies (line 86) | def get_currencies(self):
  class CoinMarketCap (line 91) | class CoinMarketCap(ExchangeBase):
    method get_rates (line 92) | def get_rates(self, ccy):
  function dictinvert (line 98) | def dictinvert(d):
  function get_exchanges_and_currencies (line 106) | def get_exchanges_and_currencies():
  function get_exchanges_by_ccy (line 133) | def get_exchanges_by_ccy(history=True):
  class FxThread (line 145) | class FxThread(ThreadJob):
    method __init__ (line 147) | def __init__(self, config, network):
    method get_currencies (line 156) | def get_currencies(self, h):
    method get_exchanges_by_ccy (line 160) | def get_exchanges_by_ccy(self, ccy, h):
    method ccy_amount_str (line 164) | def ccy_amount_str(self, amount, commas):
    method run (line 169) | def run(self):
    method is_enabled (line 178) | def is_enabled(self):
    method set_enabled (line 181) | def set_enabled(self, b):
    method get_history_config (line 184) | def get_history_config(self):
    method set_history_config (line 187) | def set_history_config(self, b):
    method get_fiat_address_config (line 190) | def get_fiat_address_config(self):
    method set_fiat_address_config (line 193) | def set_fiat_address_config(self, b):
    method get_currency (line 196) | def get_currency(self):
    method config_exchange (line 200) | def config_exchange(self):
    method show_history (line 203) | def show_history(self):
    method set_currency (line 206) | def set_currency(self, ccy):
    method set_exchange (line 212) | def set_exchange(self, name):
    method on_quotes (line 222) | def on_quotes(self):
    method on_history (line 225) | def on_history(self):
    method exchange_rate (line 228) | def exchange_rate(self):
    method format_amount_and_units (line 234) | def format_amount_and_units(self, btc_balance):
    method get_fiat_status_text (line 238) | def get_fiat_status_text(self, btc_balance, base_unit, decimal_point):
    method value_str (line 243) | def value_str(self, satoshis, rate):
    method history_rate (line 251) | def history_rate(self, d_t):
    method historical_value_str (line 260) | def historical_value_str(self, satoshis, d_t):

FILE: lib/i18n.py
  function _ (line 30) | def _(x):
  function set_language (line 34) | def set_language(x):

FILE: lib/interface.py
  function Connection (line 43) | def Connection(server, queue, config_path):
  class TcpConnection (line 59) | class TcpConnection(threading.Thread, util.PrintError):
    method __init__ (line 61) | def __init__(self, server, queue, config_path):
    method diagnostic_name (line 72) | def diagnostic_name(self):
    method check_host_name (line 75) | def check_host_name(self, peercert, name):
    method get_simple_socket (line 99) | def get_simple_socket(self):
    method get_ssl_context (line 121) | def get_ssl_context(cert_reqs, ca_certs):
    method get_socket (line 132) | def get_socket(self):
    method run (line 230) | def run(self):
  class Interface (line 237) | class Interface(util.PrintError):
    method __init__ (line 246) | def __init__(self, server, socket):
    method diagnostic_name (line 262) | def diagnostic_name(self):
    method fileno (line 265) | def fileno(self):
    method close (line 269) | def close(self):
    method queue_request (line 277) | def queue_request(self, *args):  # method, params, _id
    method num_requests (line 284) | def num_requests(self):
    method send_requests (line 289) | def send_requests(self):
    method ping_required (line 306) | def ping_required(self):
    method has_timed_out (line 316) | def has_timed_out(self):
    method get_responses (line 325) | def get_responses(self):
  function check_cert (line 363) | def check_cert(host, cert):
  function _match_hostname (line 383) | def _match_hostname(name, val):
  function test_certificates (line 390) | def test_certificates():

FILE: lib/jsonrpc.py
  class RPCAuthCredentialsInvalid (line 33) | class RPCAuthCredentialsInvalid(Exception):
    method __str__ (line 34) | def __str__(self):
  class RPCAuthCredentialsMissing (line 38) | class RPCAuthCredentialsMissing(Exception):
    method __str__ (line 39) | def __str__(self):
  class RPCAuthUnsupportedType (line 43) | class RPCAuthUnsupportedType(Exception):
    method __str__ (line 44) | def __str__(self):
  class VerifyingJSONRPCServer (line 49) | class VerifyingJSONRPCServer(SimpleJSONRPCServer):
    method __init__ (line 51) | def __init__(self, *args, rpc_user, rpc_password, **kargs):
    method authenticate (line 76) | def authenticate(self, headers):

FILE: lib/keystore.py
  class KeyStore (line 37) | class KeyStore(PrintError):
    method has_seed (line 39) | def has_seed(self):
    method is_watching_only (line 42) | def is_watching_only(self):
    method can_import (line 45) | def can_import(self):
    method get_tx_derivations (line 48) | def get_tx_derivations(self, tx):
    method can_sign (line 69) | def can_sign(self, tx):
  class Software_KeyStore (line 76) | class Software_KeyStore(KeyStore):
    method __init__ (line 78) | def __init__(self):
    method may_have_password (line 81) | def may_have_password(self):
    method sign_message (line 84) | def sign_message(self, sequence, message, password):
    method decrypt_message (line 89) | def decrypt_message(self, sequence, message, password):
    method sign_transaction (line 95) | def sign_transaction(self, tx, password):
  class Imported_KeyStore (line 109) | class Imported_KeyStore(Software_KeyStore):
    method __init__ (line 112) | def __init__(self, d):
    method is_deterministic (line 116) | def is_deterministic(self):
    method can_change_password (line 119) | def can_change_password(self):
    method get_master_public_key (line 122) | def get_master_public_key(self):
    method dump (line 125) | def dump(self):
    method can_import (line 131) | def can_import(self):
    method check_password (line 134) | def check_password(self, password):
    method import_privkey (line 138) | def import_privkey(self, sec, password):
    method delete_imported_key (line 144) | def delete_imported_key(self, key):
    method get_private_key (line 147) | def get_private_key(self, pubkey, password):
    method get_pubkey_derivation (line 155) | def get_pubkey_derivation(self, x_pubkey):
    method update_password (line 164) | def update_password(self, old_password, new_password):
  class Deterministic_KeyStore (line 175) | class Deterministic_KeyStore(Software_KeyStore):
    method __init__ (line 177) | def __init__(self, d):
    method is_deterministic (line 182) | def is_deterministic(self):
    method dump (line 185) | def dump(self):
    method has_seed (line 193) | def has_seed(self):
    method is_watching_only (line 196) | def is_watching_only(self):
    method can_change_password (line 199) | def can_change_password(self):
    method add_seed (line 202) | def add_seed(self, seed):
    method get_seed (line 207) | def get_seed(self, password):
    method get_passphrase (line 210) | def get_passphrase(self, password):
  class Xpub (line 214) | class Xpub:
    method __init__ (line 216) | def __init__(self):
    method get_master_public_key (line 221) | def get_master_public_key(self):
    method derive_pubkey (line 224) | def derive_pubkey(self, for_change, n):
    method get_pubkey_from_xpub (line 235) | def get_pubkey_from_xpub(self, xpub, sequence):
    method get_xpubkey (line 241) | def get_xpubkey(self, c, i):
    method parse_xpubkey (line 246) | def parse_xpubkey(self, pubkey):
    method get_pubkey_derivation (line 260) | def get_pubkey_derivation(self, x_pubkey):
  class BIP32_KeyStore (line 269) | class BIP32_KeyStore(Deterministic_KeyStore, Xpub):
    method __init__ (line 271) | def __init__(self, d):
    method format_seed (line 277) | def format_seed(self, seed):
    method dump (line 280) | def dump(self):
    method get_master_private_key (line 287) | def get_master_private_key(self, password):
    method check_password (line 290) | def check_password(self, password):
    method update_password (line 295) | def update_password(self, old_password, new_password):
    method is_watching_only (line 309) | def is_watching_only(self):
    method add_xprv (line 312) | def add_xprv(self, xprv):
    method add_xprv_from_seed (line 316) | def add_xprv_from_seed(self, bip32_seed, xtype, derivation):
    method get_private_key (line 321) | def get_private_key(self, sequence, password):
  class Old_KeyStore (line 329) | class Old_KeyStore(Deterministic_KeyStore):
    method __init__ (line 331) | def __init__(self, d):
    method get_hex_seed (line 335) | def get_hex_seed(self, password):
    method dump (line 338) | def dump(self):
    method add_seed (line 344) | def add_seed(self, seedphrase):
    method add_master_public_key (line 349) | def add_master_public_key(self, mpk):
    method format_seed (line 352) | def format_seed(self, seed):
    method get_seed (line 368) | def get_seed(self, password):
    method mpk_from_seed (line 374) | def mpk_from_seed(klass, seed):
    method stretch_key (line 381) | def stretch_key(self, seed):
    method get_sequence (line 388) | def get_sequence(self, mpk, for_change, n):
    method get_pubkey_from_mpk (line 392) | def get_pubkey_from_mpk(self, mpk, for_change, n):
    method derive_pubkey (line 399) | def derive_pubkey(self, for_change, n):
    method get_private_key_from_stretched_exponent (line 402) | def get_private_key_from_stretched_exponent(self, for_change, n, secexp):
    method get_private_key (line 408) | def get_private_key(self, sequence, password):
    method check_seed (line 416) | def check_seed(self, seed):
    method check_password (line 424) | def check_password(self, password):
    method get_master_public_key (line 428) | def get_master_public_key(self):
    method get_xpubkey (line 431) | def get_xpubkey(self, for_change, n):
    method parse_xpubkey (line 436) | def parse_xpubkey(self, x_pubkey):
    method get_pubkey_derivation (line 449) | def get_pubkey_derivation(self, x_pubkey):
    method update_password (line 457) | def update_password(self, old_password, new_password):
  class Hardware_KeyStore (line 467) | class Hardware_KeyStore(KeyStore, Xpub):
    method __init__ (line 476) | def __init__(self, d):
    method set_label (line 488) | def set_label(self, label):
    method may_have_password (line 491) | def may_have_password(self):
    method is_deterministic (line 494) | def is_deterministic(self):
    method dump (line 497) | def dump(self):
    method unpaired (line 506) | def unpaired(self):
    method paired (line 511) | def paired(self):
    method can_export (line 516) | def can_export(self):
    method is_watching_only (line 519) | def is_watching_only(self):
    method can_change_password (line 525) | def can_change_password(self):
  function bip39_normalize_passphrase (line 530) | def bip39_normalize_passphrase(passphrase):
  function bip39_to_seed (line 533) | def bip39_to_seed(mnemonic, passphrase):
  function bip39_is_checksum_valid (line 543) | def bip39_is_checksum_valid(mnemonic):
  function from_bip39_seed (line 571) | def from_bip39_seed(seed, passphrase, derivation):
  function xtype_from_derivation (line 579) | def xtype_from_derivation(derivation):
  function is_xpubkey (line 591) | def is_xpubkey(x_pubkey):
  function parse_xpubkey (line 595) | def parse_xpubkey(x_pubkey):
  function xpubkey_to_address (line 600) | def xpubkey_to_address(x_pubkey):
  function xpubkey_to_pubkey (line 618) | def xpubkey_to_pubkey(x_pubkey):
  function register_keystore (line 624) | def register_keystore(hw_type, constructor):
  function hardware_keystore (line 627) | def hardware_keystore(d):
  function load_keystore (line 634) | def load_keystore(storage, name):
  function is_old_mpk (line 653) | def is_old_mpk(mpk):
  function is_address_list (line 661) | def is_address_list(text):
  function get_private_keys (line 666) | def get_private_keys(text):
  function is_private_key_list (line 674) | def is_private_key_list(text):
  function bip44_derivation (line 685) | def bip44_derivation(account_id, bip43_purpose=44):
  function from_seed (line 689) | def from_seed(seed, passphrase, is_p2sh):
  function from_private_key_list (line 710) | def from_private_key_list(text):
  function from_old_mpk (line 716) | def from_old_mpk(mpk):
  function from_xpub (line 721) | def from_xpub(xpub):
  function from_xprv (line 726) | def from_xprv(xprv):
  function from_master_key (line 733) | def from_master_key(text):

FILE: lib/mnemonic.py
  function is_CJK (line 72) | def is_CJK(c):
  function normalize_text (line 79) | def normalize_text(seed):
  function load_wordlist (line 92) | def load_wordlist(filename):
  class Mnemonic (line 118) | class Mnemonic(object):
    method __init__ (line 122) | def __init__(self, lang=None):
    method mnemonic_to_seed (line 130) | def mnemonic_to_seed(self, mnemonic, passphrase):
    method mnemonic_encode (line 136) | def mnemonic_encode(self, i):
    method get_suggestions (line 145) | def get_suggestions(self, prefix):
    method mnemonic_decode (line 150) | def mnemonic_decode(self, seed):
    method check_seed (line 160) | def check_seed(self, seed, custom_entropy):
    method make_seed (line 165) | def make_seed(self, seed_type='standard', num_bits=132, custom_entropy...

FILE: lib/msqr.py
  function modular_sqrt (line 3) | def modular_sqrt(a, p):
  function legendre_symbol (line 84) | def legendre_symbol(a, p):

FILE: lib/network.py
  function parse_servers (line 49) | def parse_servers(result):
  function filter_version (line 75) | def filter_version(servers):
  function filter_protocol (line 84) | def filter_protocol(hostmap, protocol = 's'):
  function pick_random_server (line 94) | def pick_random_server(hostmap = None, protocol = 's', exclude_set = set...
  function serialize_proxy (line 105) | def serialize_proxy(p):
  function deserialize_proxy (line 112) | def deserialize_proxy(s):
  function deserialize_server (line 139) | def deserialize_server(server_str):
  function serialize_server (line 146) | def serialize_server(host, port, protocol):
  class Network (line 150) | class Network(util.DaemonThread):
    method __init__ (line 163) | def __init__(self, config=None):
    method register_callback (line 225) | def register_callback(self, callback, events):
    method unregister_callback (line 230) | def unregister_callback(self, callback):
    method trigger_callback (line 236) | def trigger_callback(self, event, *args):
    method read_recent_servers (line 241) | def read_recent_servers(self):
    method save_recent_servers (line 252) | def save_recent_servers(self):
    method get_server_height (line 263) | def get_server_height(self):
    method server_is_lagging (line 266) | def server_is_lagging(self):
    method set_status (line 277) | def set_status(self, status):
    method is_connected (line 281) | def is_connected(self):
    method is_connecting (line 284) | def is_connecting(self):
    method is_up_to_date (line 287) | def is_up_to_date(self):
    method queue_request (line 290) | def queue_request(self, method, params, interface=None):
    method send_subscriptions (line 302) | def send_subscriptions(self):
    method request_fee_estimates (line 322) | def request_fee_estimates(self):
    method get_status_value (line 327) | def get_status_value(self, key):
    method notify (line 342) | def notify(self, key):
    method get_parameters (line 348) | def get_parameters(self):
    method get_donation_address (line 352) | def get_donation_address(self):
    method get_interfaces (line 356) | def get_interfaces(self):
    method get_servers (line 360) | def get_servers(self):
    method start_interface (line 374) | def start_interface(self, server):
    method start_random_interface (line 382) | def start_random_interface(self):
    method start_interfaces (line 388) | def start_interfaces(self):
    method set_proxy (line 393) | def set_proxy(self, proxy):
    method start_network (line 415) | def start_network(self, protocol, proxy):
    method stop_network (line 424) | def stop_network(self):
    method set_parameters (line 436) | def set_parameters(self, host, port, protocol, proxy, auto_connect):
    method switch_to_random_interface (line 465) | def switch_to_random_interface(self):
    method switch_lagging_interface (line 473) | def switch_lagging_interface(self):
    method switch_to_interface (line 483) | def switch_to_interface(self, server):
    method close_interface (line 504) | def close_interface(self, interface):
    method add_recent_server (line 512) | def add_recent_server(self, server):
    method process_response (line 520) | def process_response(self, interface, response, callbacks):
    method get_index (line 564) | def get_index(self, method, params):
    method process_responses (line 568) | def process_responses(self, interface):
    method addr_to_scripthash (line 615) | def addr_to_scripthash(self, addr):
    method overload_cb (line 621) | def overload_cb(self, callback):
    method subscribe_to_addresses (line 630) | def subscribe_to_addresses(self, addresses, callback):
    method request_address_history (line 635) | def request_address_history(self, address, callback):
    method send (line 639) | def send(self, messages, callback):
    method process_pending_sends (line 645) | def process_pending_sends(self):
    method unsubscribe (line 674) | def unsubscribe(self, callback):
    method connection_down (line 684) | def connection_down(self, server):
    method new_interface (line 697) | def new_interface(self, server, socket):
    method maintain_sockets (line 712) | def maintain_sockets(self):
    method request_chunk (line 758) | def request_chunk(self, interface, index):
    method on_get_chunk (line 765) | def on_get_chunk(self, interface, response):
    method request_header (line 791) | def request_header(self, interface, height):
    method on_get_header (line 797) | def on_get_header(self, interface, response):
    method maintain_requests (line 921) | def maintain_requests(self):
    method wait_on_sockets (line 928) | def wait_on_sockets(self):
    method init_headers_file (line 950) | def init_headers_file(self):
    method run (line 978) | def run(self):
    method on_notify_header (line 991) | def on_notify_header(self, interface, header):
    method blockchain (line 1041) | def blockchain(self):
    method get_blockchains (line 1046) | def get_blockchains(self):
    method follow_chain (line 1054) | def follow_chain(self, index):
    method get_local_height (line 1072) | def get_local_height(self):
    method synchronous_get (line 1075) | def synchronous_get(self, request, timeout=30):
    method broadcast (line 1086) | def broadcast(self, tx, timeout=30):

FILE: lib/old_mnemonic.py
  function mn_encode (line 1665) | def mn_encode( message ):
  function mn_decode (line 1678) | def mn_decode( wlist ):

FILE: lib/paymentrequest.py
  function load_ca_list (line 56) | def load_ca_list():
  function get_payment_request (line 71) | def get_payment_request(url):
  class PaymentRequest (line 102) | class PaymentRequest:
    method __init__ (line 104) | def __init__(self, data, error=None):
    method __str__ (line 111) | def __str__(self):
    method parse (line 114) | def parse(self, r):
    method is_pr (line 133) | def is_pr(self):
    method verify (line 137) | def verify(self, contacts):
    method verify_x509 (line 161) | def verify_x509(self, paymntreq):
    method verify_dnssec (line 198) | def verify_dnssec(self, pr, contacts):
    method has_expired (line 220) | def has_expired(self):
    method get_expiration_date (line 223) | def get_expiration_date(self):
    method get_amount (line 226) | def get_amount(self):
    method get_address (line 229) | def get_address(self):
    method get_requestor (line 234) | def get_requestor(self):
    method get_verify_status (line 237) | def get_verify_status(self):
    method get_memo (line 240) | def get_memo(self):
    method get_dict (line 243) | def get_dict(self):
    method get_id (line 254) | def get_id(self):
    method get_outputs (line 257) | def get_outputs(self):
    method send_ack (line 260) | def send_ack(self, raw_tx, refund_addr):
  function make_unsigned_request (line 292) | def make_unsigned_request(req):
  function sign_request_with_alias (line 319) | def sign_request_with_alias(pr, alias, alias_privkey):
  function verify_cert_chain (line 329) | def verify_cert_chain(chain):
  function check_ssl_config (line 383) | def check_ssl_config(config):
  function sign_request_with_x509 (line 405) | def sign_request_with_x509(pr, key_path, cert_path):
  function serialize_request (line 423) | def serialize_request(req):
  function make_request (line 434) | def make_request(config, req):
  class InvoiceStore (line 444) | class InvoiceStore(object):
    method __init__ (line 446) | def __init__(self, storage):
    method set_paid (line 453) | def set_paid(self, pr, txid):
    method load (line 457) | def load(self, d):
    method import_file (line 469) | def import_file(self, path):
    method save (line 479) | def save(self):
    method get_status (line 489) | def get_status(self, key):
    method add (line 500) | def add(self, pr):
    method remove (line 506) | def remove(self, key):
    method get (line 510) | def get(self, k):
    method sorted_list (line 513) | def sorted_list(self):
    method unpaid_invoices (line 517) | def unpaid_invoices(self):

FILE: lib/pem.py
  function a2b_base64 (line 36) | def a2b_base64(s):
  function b2a_base64 (line 43) | def b2a_base64(b):
  function dePem (line 47) | def dePem(s, name):
  function dePemList (line 74) | def dePemList(s, name):
  function pem (line 112) | def pem(b, name):
  function pemSniff (line 133) | def pemSniff(inStr, name):
  function parse_private_key (line 138) | def parse_private_key(s):
  function _parsePKCS8 (line 150) | def _parsePKCS8(_bytes):
  function _parseSSLeay (line 167) | def _parseSSLeay(bytes):
  function bytesToNumber (line 171) | def bytesToNumber(s):
  function _parseASN1PrivateKey (line 175) | def _parseASN1PrivateKey(s):

FILE: lib/plot.py
  function plot_history (line 17) | def plot_history(wallet, history):

FILE: lib/plugins.py
  class Plugins (line 44) | class Plugins(DaemonThread):
    method __init__ (line 47) | def __init__(self, config, is_local, gui_name):
    method load_plugins (line 65) | def load_plugins(self):
    method get (line 89) | def get(self, name):
    method count (line 92) | def count(self):
    method load_plugin (line 95) | def load_plugin(self, name):
    method close_plugin (line 110) | def close_plugin(self, plugin):
    method enable (line 113) | def enable(self, name):
    method disable (line 120) | def disable(self, name):
    method toggle (line 129) | def toggle(self, name):
    method is_available (line 133) | def is_available(self, name, w):
    method get_hardware_support (line 146) | def get_hardware_support(self):
    method register_wallet_type (line 159) | def register_wallet_type(self, name, gui_good, wallet_type):
    method register_keystore (line 168) | def register_keystore(self, name, gui_good, details):
    method get_plugin (line 177) | def get_plugin(self, name):
    method run (line 182) | def run(self):
  function hook (line 189) | def hook(func):
  function run_hook (line 193) | def run_hook(name, *args):
  class BasePlugin (line 212) | class BasePlugin(PrintError):
    method __init__ (line 214) | def __init__(self, parent, config, name):
    method diagnostic_name (line 226) | def diagnostic_name(self):
    method __str__ (line 229) | def __str__(self):
    method close (line 232) | def close(self):
    method on_close (line 242) | def on_close(self):
    method requires_settings (line 245) | def requires_settings(self):
    method thread_jobs (line 248) | def thread_jobs(self):
    method is_enabled (line 251) | def is_enabled(self):
    method is_available (line 254) | def is_available(self):
    method can_user_disable (line 257) | def can_user_disable(self):
    method settings_dialog (line 260) | def settings_dialog(self):
  class DeviceNotFoundError (line 264) | class DeviceNotFoundError(Exception):
  class DeviceUnpairableError (line 267) | class DeviceUnpairableError(Exception):
  class DeviceMgr (line 273) | class DeviceMgr(ThreadJob, PrintError):
    method __init__ (line 304) | def __init__(self, config):
    method thread_jobs (line 320) | def thread_jobs(self):
    method run (line 324) | def run(self):
    method register_devices (line 333) | def register_devices(self, device_pairs):
    method create_client (line 337) | def create_client(self, device, handler, plugin):
    method xpub_id (line 349) | def xpub_id(self, xpub):
    method xpub_by_id (line 353) | def xpub_by_id(self, id_):
    method unpair_xpub (line 360) | def unpair_xpub(self, xpub):
    method unpair_id (line 370) | def unpair_id(self, id_):
    method pair_xpub (line 375) | def pair_xpub(self, xpub, id_):
    method client_lookup (line 379) | def client_lookup(self, id_):
    method client_by_id (line 386) | def client_by_id(self, id_):
    method client_for_keystore (line 393) | def client_for_keystore(self, plugin, handler, keystore, force_pair):
    method client_by_xpub (line 410) | def client_by_xpub(self, plugin, xpub, handler, devices):
    method force_pair_xpub (line 424) | def force_pair_xpub(self, plugin, handler, info, xpub, derivation, dev...
    method unpaired_device_infos (line 451) | def unpaired_device_infos(self, handler, plugin, devices=None):
    method select_device (line 468) | def select_device(self, plugin, handler, keystore, devices=None):
    method scan_devices (line 498) | def scan_devices(self):

FILE: lib/qrscanner.py
  function scan_barcode (line 43) | def scan_barcode(device='', timeout=-1, display=True, threaded=False):
  function _find_system_cameras (line 68) | def _find_system_cameras():

FILE: lib/ripemd.py
  class RIPEMD160 (line 44) | class RIPEMD160:
    method __init__ (line 49) | def __init__(self, arg=None):
    method update (line 55) | def update(self, arg):
    method digest (line 60) | def digest(self):
    method hexdigest (line 69) | def hexdigest(self):
    method copy (line 77) | def copy(self):
  function new (line 84) | def new(arg=None):
  class RMDContext (line 96) | class RMDContext:
    method __init__ (line 97) | def __init__(self):
    method copy (line 102) | def copy(self):
  function ROL (line 121) | def ROL(n, x):
  function F0 (line 124) | def F0(x, y, z):
  function F1 (line 127) | def F1(x, y, z):
  function F2 (line 130) | def F2(x, y, z):
  function F3 (line 133) | def F3(x, y, z):
  function F4 (line 136) | def F4(x, y, z):
  function R (line 139) | def R(a, b, c, d, e, Fj, Kj, sj, rj, X):
  function RMD160Transform (line 149) | def RMD160Transform(state, block): #uint32 state[5], uchar block[64]
  function RMD160Update (line 355) | def RMD160Update(ctx, inp, inplen):
  function RMD160Final (line 378) | def RMD160Final(ctx):

FILE: lib/rsakey.py
  function SHA1 (line 43) | def SHA1(x):
  function getRandomBytes (line 56) | def getRandomBytes(howMany):
  function bytesToNumber (line 68) | def bytesToNumber(b):
  function numberToByteArray (line 77) | def numberToByteArray(n, howManyBytes=None):
  function mpiToNumber (line 92) | def mpiToNumber(mpi): #mpi is an openssl-format bignum string
  function numberToMPI (line 98) | def numberToMPI(n):
  function numBits (line 118) | def numBits(n):
  function numBytes (line 130) | def numBytes(n):
  function getRandomNumber (line 140) | def getRandomNumber(low, high):
  function gcd (line 154) | def gcd(a,b):
  function lcm (line 160) | def lcm(a, b):
  function invMod (line 165) | def invMod(a, b):
  function powMod (line 177) | def powMod(base, power, modulus):
  function makeSieve (line 186) | def makeSieve(n):
  function isPrime (line 200) | def isPrime(n, iterations=5, display=False):
  function getRandomPrime (line 227) | def getRandomPrime(bits, display=False):
  function getRandomSafePrime (line 249) | def getRandomSafePrime(bits, display=False):
  class RSAKey (line 276) | class RSAKey(object):
    method __init__ (line 278) | def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0):
    method __len__ (line 292) | def __len__(self):
    method hasPrivateKey (line 299) | def hasPrivateKey(self):
    method hashAndSign (line 302) | def hashAndSign(self, bytes):
    method hashAndVerify (line 319) | def hashAndVerify(self, sigBytes, bytes):
    method sign (line 342) | def sign(self, bytes):
    method verify (line 364) | def verify(self, sigBytes, bytes):
    method encrypt (line 388) | def encrypt(self, bytes):
    method decrypt (line 407) | def decrypt(self, encBytes):
    method _addPKCS1SHA1Prefix (line 447) | def _addPKCS1SHA1Prefix(self, bytes, withNULL=True):
    method _addPKCS1Padding (line 466) | def _addPKCS1Padding(self, bytes, blockType):
    method _rawPrivateKeyOp (line 486) | def _rawPrivateKeyOp(self, m):
    method _rawPrivateKeyOpHelper (line 510) | def _rawPrivateKeyOpHelper(self, m):
    method _rawPublicKeyOp (line 521) | def _rawPublicKeyOp(self, c):
    method acceptsPassword (line 525) | def acceptsPassword(self):
    method generate (line 528) | def generate(bits):

FILE: lib/segwit_addr.py
  function bech32_polymod (line 27) | def bech32_polymod(values):
  function bech32_hrp_expand (line 39) | def bech32_hrp_expand(hrp):
  function bech32_verify_checksum (line 44) | def bech32_verify_checksum(hrp, data):
  function bech32_create_checksum (line 49) | def bech32_create_checksum(hrp, data):
  function bech32_encode (line 56) | def bech32_encode(hrp, data):
  function bech32_decode (line 62) | def bech32_decode(bech):
  function convertbits (line 80) | def convertbits(data, frombits, tobits, pad=True):
  function decode (line 103) | def decode(hrp, addr):
  function encode (line 118) | def encode(hrp, witver, witprog):

FILE: lib/simple_config.py
  function get_config (line 17) | def get_config():
  function set_config (line 22) | def set_config(c):
  class SimpleConfig (line 27) | class SimpleConfig(PrintError):
    method __init__ (line 41) | def __init__(self, options={}, read_system_config_function=None,
    method electrum_path (line 81) | def electrum_path(self):
    method fixup_config_keys (line 104) | def fixup_config_keys(self, config, keypairs):
    method fixup_keys (line 114) | def fixup_keys(self, keypairs):
    method set_key (line 121) | def set_key(self, key, value, save = True):
    method get (line 132) | def get(self, key, default=None):
    method is_modifiable (line 141) | def is_modifiable(self, key):
    method save_user_config (line 144) | def save_user_config(self):
    method get_wallet_path (line 153) | def get_wallet_path(self):
    method remove_from_recently_open (line 182) | def remove_from_recently_open(self, filename):
    method set_session_timeout (line 188) | def set_session_timeout(self, seconds):
    method get_session_timeout (line 192) | def get_session_timeout(self):
    method open_last_wallet (line 195) | def open_last_wallet(self):
    method save_last_wallet (line 201) | def save_last_wallet(self, wallet):
    method default_fee_rate (line 206) | def default_fee_rate(self):
    method max_fee_rate (line 212) | def max_fee_rate(self):
    method dynfee (line 218) | def dynfee(self, i):
    method reverse_dynfee (line 231) | def reverse_dynfee(self, fee_per_kb):
    method static_fee (line 240) | def static_fee(self, i):
    method static_fee_index (line 243) | def static_fee_index(self, value):
    method has_fee_estimates (line 247) | def has_fee_estimates(self):
    method is_dynfee (line 251) | def is_dynfee(self):
    method fee_per_kb (line 254) | def fee_per_kb(self):
    method estimate_fee (line 262) | def estimate_fee(self, size):
    method estimate_fee_for_feerate (line 266) | def estimate_fee_for_feerate(cls, fee_per_kb, size):
    method update_fee_estimates (line 269) | def update_fee_estimates(self, key, value):
    method is_fee_estimates_update_required (line 273) | def is_fee_estimates_update_required(self):
    method requested_fee_estimates (line 284) | def requested_fee_estimates(self):
    method get_video_device (line 287) | def get_video_device(self):
  function read_system_config (line 294) | def read_system_config(path=SYSTEM_CONFIG_PATH):
  function read_user_config (line 309) | def read_user_config(path):

FILE: lib/storage.py
  function multisig_type (line 51) | def multisig_type(wallet_type):
  class WalletStorage (line 60) | class WalletStorage(PrintError):
    method __init__ (line 62) | def __init__(self, path, manual_upgrades=False):
    method load_data (line 79) | def load_data(self, s):
    method is_encrypted (line 109) | def is_encrypted(self):
    method file_exists (line 115) | def file_exists(self):
    method get_key (line 118) | def get_key(self, password):
    method decrypt (line 123) | def decrypt(self, password):
    method set_password (line 130) | def set_password(self, password, encrypt):
    method get (line 138) | def get(self, key, default=None):
    method put (line 147) | def put(self, key, value):
    method write (line 164) | def write(self):
    method _write (line 168) | def _write(self):
    method requires_split (line 198) | def requires_split(self):
    method split_accounts (line 202) | def split_accounts(storage):
    method requires_upgrade (line 248) | def requires_upgrade(self):
    method upgrade (line 251) | def upgrade(self):
    method convert_wallet_type (line 265) | def convert_wallet_type(self):
    method convert_version_13_b (line 351) | def convert_version_13_b(self):
    method convert_version_14 (line 370) | def convert_version_14(self):
    method convert_version_15 (line 399) | def convert_version_15(self):
    method convert_version_16 (line 405) | def convert_version_16(self):
    method convert_imported (line 448) | def convert_imported(self):
    method convert_account (line 474) | def convert_account(self):
    method _is_upgrade_method_needed (line 477) | def _is_upgrade_method_needed(self, min_version, max_version):
    method get_action (line 488) | def get_action(self):
    method get_seed_version (line 495) | def get_seed_version(self):
    method raise_unsupported_version (line 509) | def raise_unsupported_version(self, seed_version):

FILE: lib/synchronizer.py
  class Synchronizer (line 33) | class Synchronizer(ThreadJob):
    method __init__ (line 44) | def __init__(self, wallet, network):
    method parse_response (line 55) | def parse_response(self, response):
    method is_up_to_date (line 61) | def is_up_to_date(self):
    method release (line 65) | def release(self):
    method add (line 68) | def add(self, address):
    method subscribe_to_addresses (line 73) | def subscribe_to_addresses(self, addresses):
    method get_status (line 78) | def get_status(self, h):
    method on_address_status (line 86) | def on_address_status(self, response):
    method on_address_history (line 100) | def on_address_history(self, response):
    method tx_response (line 129) | def tx_response(self, response):
    method request_missing_txs (line 151) | def request_missing_txs(self, hist):
    method initialize (line 164) | def initialize(self):
    method run (line 181) | def run(self):

FILE: lib/tests/test_bitcoin.py
  class Test_bitcoin (line 23) | class Test_bitcoin(unittest.TestCase):
    method test_crypto (line 25) | def test_crypto(self):
    method _do_test_crypto (line 29) | def _do_test_crypto(self, message):
    method test_msg_signing (line 56) | def test_msg_signing(self):
    method test_aes_homomorphic (line 84) | def test_aes_homomorphic(self):
    method test_aes_encode_without_password (line 92) | def test_aes_encode_without_password(self):
    method test_aes_deencode_without_password (line 98) | def test_aes_deencode_without_password(self):
    method test_aes_decode_with_invalid_password (line 104) | def test_aes_decode_with_invalid_password(self):
    method test_hash (line 112) | def test_hash(self):
    method test_var_int (line 120) | def test_var_int(self):
    method test_op_push (line 135) | def test_op_push(self):
    method test_address_to_script (line 149) | def test_address_to_script(self):
  class Test_bitcoin_testnet (line 166) | class Test_bitcoin_testnet(unittest.TestCase):
    method setUpClass (line 169) | def setUpClass(cls):
    method tearDownClass (line 174) | def tearDownClass(cls):
    method test_address_to_script (line 178) | def test_address_to_script(self):
  class Test_xprv_xpub (line 193) | class Test_xprv_xpub(unittest.TestCase):
    method _do_test_bip32 (line 208) | def _do_test_bip32(self, seed, sequence):
    method test_bip32 (line 224) | def test_bip32(self):
    method test_xpub_from_xprv (line 234) | def test_xpub_from_xprv(self):
    method test_is_xpub (line 240) | def test_is_xpub(self):
    method test_xpub_type (line 247) | def test_xpub_type(self):
    method test_is_xprv (line 252) | def test_is_xprv(self):
    method test_is_bip32_derivation (line 259) | def test_is_bip32_derivation(self):
  class Test_keyImport (line 270) | class Test_keyImport(unittest.TestCase):
    method test_public_key_from_private_key (line 316) | def test_public_key_from_private_key(self):
    method test_address_from_private_key (line 324) | def test_address_from_private_key(self):
    method test_is_valid_address (line 329) | def test_is_valid_address(self):
    method test_is_private_key (line 344) | def test_is_private_key(self):
    method test_serialize_privkey (line 351) | def test_serialize_privkey(self):
    method test_address_to_scripthash (line 358) | def test_address_to_scripthash(self):
    method test_is_minikey (line 363) | def test_is_minikey(self):
    method test_is_compressed (line 369) | def test_is_compressed(self):
  class Test_seeds (line 375) | class Test_seeds(unittest.TestCase):
    method test_new_seed (line 400) | def test_new_seed(self):
    method test_old_seed (line 407) | def test_old_seed(self):
    method test_seed_type (line 416) | def test_seed_type(self):

FILE: lib/tests/test_interface.py
  class TestInterface (line 6) | class TestInterface(unittest.TestCase):
    method test_match_host_name (line 8) | def test_match_host_name(self):
    method test_check_host_name (line 15) | def test_check_host_name(self):

FILE: lib/tests/test_mnemonic.py
  class Test_NewMnemonic (line 8) | class Test_NewMnemonic(unittest.TestCase):
    method test_to_seed (line 10) | def test_to_seed(self):
    method test_random_seeds (line 16) | def test_random_seeds(self):
  class Test_OldMnemonic (line 25) | class Test_OldMnemonic(unittest.TestCase):
    method test (line 27) | def test(self):
  class Test_BIP39Checksum (line 34) | class Test_BIP39Checksum(unittest.TestCase):
    method test (line 36) | def test(self):

FILE: lib/tests/test_simple_config.py
  class Test_SimpleConfig (line 13) | class Test_SimpleConfig(unittest.TestCase):
    method setUp (line 15) | def setUp(self):
    method tearDown (line 28) | def tearDown(self):
    method test_simple_config_key_rename (line 38) | def test_simple_config_key_rename(self):
    method test_simple_config_command_line_overrides_everything (line 57) | def test_simple_config_command_line_overrides_everything(self):
    method test_simple_config_user_config_overrides_system_config (line 70) | def test_simple_config_user_config_overrides_system_config(self):
    method test_simple_config_system_config_ignored_if_portable (line 81) | def test_simple_config_system_config_ignored_if_portable(self):
    method test_simple_config_user_config_is_used_if_others_arent_specified (line 93) | def test_simple_config_user_config_is_used_if_others_arent_specified(s...
    method test_cannot_set_options_passed_by_command_line (line 106) | def test_cannot_set_options_passed_by_command_line(self):
    method test_can_set_options_from_system_config (line 118) | def test_can_set_options_from_system_config(self):
    method test_can_set_options_set_in_user_config (line 129) | def test_can_set_options_set_in_user_config(self):
    method test_can_set_options_from_system_config_if_portable (line 141) | def test_can_set_options_from_system_config_if_portable(self):
    method test_user_config_is_not_written_with_read_only_config (line 155) | def test_user_config_is_not_written_with_read_only_config(self):
  class TestSystemConfig (line 174) | class TestSystemConfig(unittest.TestCase):
    method setUp (line 184) | def setUp(self):
    method tearDown (line 188) | def tearDown(self):
    method test_read_system_config_file_does_not_exist (line 192) | def test_read_system_config_file_does_not_exist(self):
    method test_read_system_config_file_returns_file_options (line 197) | def test_read_system_config_file_returns_file_options(self):
    method test_read_system_config_file_no_sections (line 204) | def test_read_system_config_file_no_sections(self):
  class TestUserConfig (line 213) | class TestUserConfig(unittest.TestCase):
    method setUp (line 215) | def setUp(self):
    method tearDown (line 223) | def tearDown(self):
    method test_no_path_means_no_result (line 228) | def test_no_path_means_no_result(self):
    method test_path_without_config_file (line 232) | def test_path_without_config_file(self):
    method test_path_with_reprd_object (line 237) | def test_path_with_reprd_object(self):

FILE: lib/tests/test_storage_upgrade.py
  class TestStorageUpgrade (line 12) | class TestStorageUpgrade(WalletTestCase):
    method test_upgrade_from_client_1_9_8_seeded (line 14) | def test_upgrade_from_client_1_9_8_seeded(self):
    method test_upgrade_from_client_2_0_4_seeded (line 23) | def test_upgrade_from_client_2_0_4_seeded(self):
    method test_upgrade_from_client_2_0_4_importedkeys (line 27) | def test_upgrade_from_client_2_0_4_importedkeys(self):
    method test_upgrade_from_client_2_0_4_watchaddresses (line 31) | def test_upgrade_from_client_2_0_4_watchaddresses(self):
    method test_upgrade_from_client_2_0_4_trezor_singleacc (line 35) | def test_upgrade_from_client_2_0_4_trezor_singleacc(self):
    method test_upgrade_from_client_2_0_4_trezor_multiacc (line 39) | def test_upgrade_from_client_2_0_4_trezor_multiacc(self):
    method test_upgrade_from_client_2_0_4_multisig (line 43) | def test_upgrade_from_client_2_0_4_multisig(self):
    method test_upgrade_from_client_2_1_1_seeded (line 47) | def test_upgrade_from_client_2_1_1_seeded(self):
    method test_upgrade_from_client_2_1_1_importedkeys (line 51) | def test_upgrade_from_client_2_1_1_importedkeys(self):
    method test_upgrade_from_client_2_1_1_watchaddresses (line 55) | def test_upgrade_from_client_2_1_1_watchaddresses(self):
    method test_upgrade_from_client_2_1_1_trezor_singleacc (line 59) | def test_upgrade_from_client_2_1_1_trezor_singleacc(self):
    method test_upgrade_from_client_2_1_1_trezor_multiacc (line 63) | def test_upgrade_from_client_2_1_1_trezor_multiacc(self):
    method test_upgrade_from_client_2_1_1_multisig (line 67) | def test_upgrade_from_client_2_1_1_multisig(self):
    method test_upgrade_from_client_2_2_0_seeded (line 71) | def test_upgrade_from_client_2_2_0_seeded(self):
    method test_upgrade_from_client_2_2_0_importedkeys (line 75) | def test_upgrade_from_client_2_2_0_importedkeys(self):
    method test_upgrade_from_client_2_2_0_watchaddresses (line 79) | def test_upgrade_from_client_2_2_0_watchaddresses(self):
    method test_upgrade_from_client_2_2_0_trezor_singleacc (line 83) | def test_upgrade_from_client_2_2_0_trezor_singleacc(self):
    method test_upgrade_from_client_2_2_0_trezor_multiacc (line 87) | def test_upgrade_from_client_2_2_0_trezor_multiacc(self):
    method test_upgrade_from_client_2_2_0_multisig (line 91) | def test_upgrade_from_client_2_2_0_multisig(self):
    method test_upgrade_from_client_2_3_2_seeded (line 95) | def test_upgrade_from_client_2_3_2_seeded(self):
    method test_upgrade_from_client_2_3_2_importedkeys (line 99) | def test_upgrade_from_client_2_3_2_importedkeys(self):
    method test_upgrade_from_client_2_3_2_watchaddresses (line 103) | def test_upgrade_from_client_2_3_2_watchaddresses(self):
    method test_upgrade_from_client_2_3_2_trezor_singleacc (line 107) | def test_upgrade_from_client_2_3_2_trezor_singleacc(self):
    method test_upgrade_from_client_2_3_2_trezor_multiacc (line 111) | def test_upgrade_from_client_2_3_2_trezor_multiacc(self):
    method test_upgrade_from_client_2_3_2_multisig (line 115) | def test_upgrade_from_client_2_3_2_multisig(self):
    method test_upgrade_from_client_2_4_3_seeded (line 119) | def test_upgrade_from_client_2_4_3_seeded(self):
    method test_upgrade_from_client_2_4_3_importedkeys (line 123) | def test_upgrade_from_client_2_4_3_importedkeys(self):
    method test_upgrade_from_client_2_4_3_watchaddresses (line 127) | def test_upgrade_from_client_2_4_3_watchaddresses(self):
    method test_upgrade_from_client_2_4_3_trezor_singleacc (line 131) | def test_upgrade_from_client_2_4_3_trezor_singleacc(self):
    method test_upgrade_from_client_2_4_3_trezor_multiacc (line 135) | def test_upgrade_from_client_2_4_3_trezor_multiacc(self):
    method test_upgrade_from_client_2_4_3_multisig (line 139) | def test_upgrade_from_client_2_4_3_multisig(self):
    method test_upgrade_from_client_2_5_4_seeded (line 143) | def test_upgrade_from_client_2_5_4_seeded(self):
    method test_upgrade_from_client_2_5_4_importedkeys (line 147) | def test_upgrade_from_client_2_5_4_importedkeys(self):
    method test_upgrade_from_client_2_5_4_watchaddresses (line 151) | def test_upgrade_from_client_2_5_4_watchaddresses(self):
    method test_upgrade_from_client_2_5_4_trezor_singleacc (line 155) | def test_upgrade_from_client_2_5_4_trezor_singleacc(self):
    method test_upgrade_from_client_2_5_4_trezor_multiacc (line 159) | def test_upgrade_from_client_2_5_4_trezor_multiacc(self):
    method test_upgrade_from_client_2_5_4_multisig (line 163) | def test_upgrade_from_client_2_5_4_multisig(self):
    method test_upgrade_from_client_2_6_4_seeded (line 167) | def test_upgrade_from_client_2_6_4_seeded(self):
    method test_upgrade_from_client_2_6_4_importedkeys (line 171) | def test_upgrade_from_client_2_6_4_importedkeys(self):
    method test_upgrade_from_client_2_6_4_watchaddresses (line 175) | def test_upgrade_from_client_2_6_4_watchaddresses(self):
    method test_upgrade_from_client_2_6_4_multisig (line 179) | def test_upgrade_from_client_2_6_4_multisig(self):
    method test_upgrade_from_client_2_7_18_seeded (line 183) | def test_upgrade_from_client_2_7_18_seeded(self):
    method test_upgrade_from_client_2_7_18_importedkeys (line 187) | def test_upgrade_from_client_2_7_18_importedkeys(self):
    method test_upgrade_from_client_2_7_18_watchaddresses (line 191) | def test_upgrade_from_client_2_7_18_watchaddresses(self):
    method test_upgrade_from_client_2_7_18_trezor_singleacc (line 195) | def test_upgrade_from_client_2_7_18_trezor_singleacc(self):
    method test_upgrade_from_client_2_7_18_multisig (line 199) | def test_upgrade_from_client_2_7_18_multisig(self):
    method test_upgrade_from_client_2_8_3_importedkeys_flawed_previous_upgrade_from_2_7_18 (line 210) | def test_upgrade_from_client_2_8_3_importedkeys_flawed_previous_upgrad...
    method test_upgrade_from_client_2_8_3_seeded (line 214) | def test_upgrade_from_client_2_8_3_seeded(self):
    method test_upgrade_from_client_2_8_3_importedkeys (line 218) | def test_upgrade_from_client_2_8_3_importedkeys(self):
    method test_upgrade_from_client_2_8_3_watchaddresses (line 222) | def test_upgrade_from_client_2_8_3_watchaddresses(self):
    method test_upgrade_from_client_2_8_3_trezor_singleacc (line 226) | def test_upgrade_from_client_2_8_3_trezor_singleacc(self):
    method test_upgrade_from_client_2_8_3_multisig (line 230) | def test_upgrade_from_client_2_8_3_multisig(self):
    method test_upgrade_from_client_2_9_3_seeded (line 234) | def test_upgrade_from_client_2_9_3_seeded(self):
    method test_upgrade_from_client_2_9_3_importedkeys (line 238) | def test_upgrade_from_client_2_9_3_importedkeys(self):
    method test_upgrade_from_client_2_9_3_watchaddresses (line 242) | def test_upgrade_from_client_2_9_3_watchaddresses(self):
    method test_upgrade_from_client_2_9_3_trezor_singleacc (line 246) | def test_upgrade_from_client_2_9_3_trezor_singleacc(self):
    method test_upgrade_from_client_2_9_3_multisig (line 250) | def test_upgrade_from_client_2_9_3_multisig(self):
    method setUpClass (line 257) | def setUpClass(cls):
    method tearDownClass (line 270) | def tearDownClass(cls):
    method _upgrade_storage (line 274) | def _upgrade_storage(self, wallet_json, accounts=1):
    method _sanity_check_upgraded_storage (line 290) | def _sanity_check_upgraded_storage(self, storage):
    method _load_storage_from_json_string (line 295) | def _load_storage_from_json_string(self, wallet_json, manual_upgrades=...

FILE: lib/tests/test_transaction.py
  class TestBCDataStream (line 14) | class TestBCDataStream(unittest.TestCase):
    method test_compact_size (line 16) | def test_compact_size(self):
    method test_string (line 33) | def test_string(self):
    method test_bytes (line 47) | def test_bytes(self):
  class TestTransaction (line 55) | class TestTransaction(unittest.TestCase):
    method test_tx_unsigned (line 57) | def test_tx_unsigned(self):
    method test_tx_signed (line 101) | def test_tx_signed(self):
    method test_estimated_output_size (line 138) | def test_estimated_output_size(self):
    method test_tx_signed_segwit (line 146) | def test_tx_signed_segwit(self):
    method test_errors (line 155) | def test_errors(self):
    method test_parse_xpub (line 162) | def test_parse_xpub(self):
    method test_version_field (line 166) | def test_version_field(self):
    method test_txid_coinbase_to_p2pk (line 170) | def test_txid_coinbase_to_p2pk(self):
    method test_txid_coinbase_to_p2pkh (line 174) | def test_txid_coinbase_to_p2pkh(self):
    method test_txid_segwit_coinbase_to_p2pk (line 178) | def test_txid_segwit_coinbase_to_p2pk(self):
    method test_txid_segwit_coinbase_to_p2pkh (line 182) | def test_txid_segwit_coinbase_to_p2pkh(self):
    method test_txid_p2pk_to_p2pkh (line 186) | def test_txid_p2pk_to_p2pkh(self):
    method test_txid_p2pk_to_p2sh (line 190) | def test_txid_p2pk_to_p2sh(self):
    method test_txid_p2pk_to_p2wpkh (line 194) | def test_txid_p2pk_to_p2wpkh(self):
    method test_txid_p2pkh_to_p2pkh (line 198) | def test_txid_p2pkh_to_p2pkh(self):
    method test_txid_p2pkh_to_p2sh (line 202) | def test_txid_p2pkh_to_p2sh(self):
    method test_txid_p2pkh_to_p2wpkh (line 206) | def test_txid_p2pkh_to_p2wpkh(self):
    method test_txid_p2sh_to_p2pkh (line 210) | def test_txid_p2sh_to_p2pkh(self):
    method test_txid_p2sh_to_p2sh (line 214) | def test_txid_p2sh_to_p2sh(self):
    method test_txid_p2sh_to_p2wpkh (line 218) | def test_txid_p2sh_to_p2wpkh(self):
    method test_txid_p2wpkh_to_p2pkh (line 222) | def test_txid_p2wpkh_to_p2pkh(self):
    method test_txid_p2wpkh_to_p2sh (line 226) | def test_txid_p2wpkh_to_p2sh(self):
    method test_txid_p2wpkh_to_p2wpkh (line 230) | def test_txid_p2wpkh_to_p2wpkh(self):
  class NetworkMock (line 235) | class NetworkMock(object):
    method __init__ (line 237) | def __init__(self, unspent):
    method synchronous_get (line 240) | def synchronous_get(self, arg):

FILE: lib/tests/test_util.py
  class TestUtil (line 4) | class TestUtil(unittest.TestCase):
    method test_format_satoshis (line 6) | def test_format_satoshis(self):
    method test_format_satoshis_diff_positive (line 11) | def test_format_satoshis_diff_positive(self):
    method test_format_satoshis_diff_negative (line 16) | def test_format_satoshis_diff_negative(self):
    method _do_test_parse_URI (line 21) | def _do_test_parse_URI(self, uri, expected):
    method test_parse_URI_address (line 25) | def test_parse_URI_address(self):
    method test_parse_URI_only_address (line 29) | def test_parse_URI_only_address(self):
    method test_parse_URI_address_label (line 34) | def test_parse_URI_address_label(self):
    method test_parse_URI_address_message (line 38) | def test_parse_URI_address_message(self):
    method test_parse_URI_address_amount (line 42) | def test_parse_URI_address_amount(self):
    method test_parse_URI_address_request_url (line 46) | def test_parse_URI_address_request_url(self):
    method test_parse_URI_ignore_args (line 50) | def test_parse_URI_ignore_args(self):
    method test_parse_URI_multiple_args (line 54) | def test_parse_URI_multiple_args(self):
    method test_parse_URI_no_address_request_url (line 58) | def test_parse_URI_no_address_request_url(self):
    method test_parse_URI_invalid_address (line 62) | def test_parse_URI_invalid_address(self):
    method test_parse_URI_invalid (line 65) | def test_parse_URI_invalid(self):
    method test_parse_URI_parameter_polution (line 68) | def test_parse_URI_parameter_polution(self):

FILE: lib/tests/test_wallet.py
  class FakeSynchronizer (line 12) | class FakeSynchronizer(object):
    method __init__ (line 14) | def __init__(self):
    method add (line 17) | def add(self, address):
  class WalletTestCase (line 21) | class WalletTestCase(unittest.TestCase):
    method setUp (line 23) | def setUp(self):
    method tearDown (line 33) | def tearDown(self):
  class TestWalletStorage (line 40) | class TestWalletStorage(WalletTestCase):
    method test_read_dictionary_from_file (line 42) | def test_read_dictionary_from_file(self):
    method test_write_dictionary_to_file (line 53) | def test_write_dictionary_to_file(self):

FILE: lib/tests/test_wallet_vertical.py
  class TestWalletKeystoreAddressIntegrity (line 13) | class TestWalletKeystoreAddressIntegrity(unittest.TestCase):
    method _check_seeded_keystore_sanity (line 17) | def _check_seeded_keystore_sanity(self, ks):
    method _check_xpub_keystore_sanity (line 23) | def _check_xpub_keystore_sanity(self, ks):
    method _create_standard_wallet (line 29) | def _create_standard_wallet(self, ks):
    method _create_multisig_wallet (line 37) | def _create_multisig_wallet(self, ks1, ks2, ks3=None):
    method test_electrum_seed_standard (line 54) | def test_electrum_seed_standard(self, mock_write):
    method test_electrum_seed_segwit (line 73) | def test_electrum_seed_segwit(self, mock_write):
    method test_electrum_seed_old (line 92) | def test_electrum_seed_old(self, mock_write):
    method test_electrum_seed_2fa (line 110) | def test_electrum_seed_2fa(self, mock_write):
    method test_bip39_seed_bip44_standard (line 143) | def test_bip39_seed_bip44_standard(self, mock_write):
    method test_bip39_seed_bip49_p2sh_segwit (line 161) | def test_bip39_seed_bip49_p2sh_segwit(self, mock_write):
    method test_bip39_seed_bip84_native_segwit (line 179) | def test_bip39_seed_bip84_native_segwit(self, mock_write):
    method test_electrum_multisig_seed_standard (line 198) | def test_electrum_multisig_seed_standard(self, mock_write):
    method test_electrum_multisig_seed_segwit (line 220) | def test_electrum_multisig_seed_segwit(self, mock_write):
    method test_bip39_multisig_seed_bip45_standard (line 242) | def test_bip39_multisig_seed_bip45_standard(self, mock_write):
    method test_bip39_multisig_seed_p2sh_segwit (line 264) | def test_bip39_multisig_seed_p2sh_segwit(self, mock_write):

FILE: lib/transaction.py
  class SerializationError (line 44) | class SerializationError(Exception):
  class BCDataStream (line 48) | class BCDataStream(object):
    method __init__ (line 49) | def __init__(self):
    method clear (line 53) | def clear(self):
    method write (line 57) | def write(self, _bytes):  # Initialize with string of _bytes
    method read_string (line 63) | def read_string(self, encoding='ascii'):
    method write_string (line 78) | def write_string(self, string, encoding='ascii'):
    method read_bytes (line 84) | def read_bytes(self, length):
    method read_boolean (line 94) | def read_boolean(self): return self.read_bytes(1)[0] != chr(0)
    method read_int16 (line 95) | def read_int16(self): return self._read_num('<h')
    method read_uint16 (line 96) | def read_uint16(self): return self._read_num('<H')
    method read_int32 (line 97) | def read_int32(self): return self._read_num('<i')
    method read_uint32 (line 98) | def read_uint32(self): return self._read_num('<I')
    method read_int64 (line 99) | def read_int64(self): return self._read_num('<q')
    method read_uint64 (line 100) | def read_uint64(self): return self._read_num('<Q')
    method write_boolean (line 102) | def write_boolean(self, val): return self.write(chr(1) if val else chr...
    method write_int16 (line 103) | def write_int16(self, val): return self._write_num('<h', val)
    method write_uint16 (line 104) | def write_uint16(self, val): return self._write_num('<H', val)
    method write_int32 (line 105) | def write_int32(self, val): return self._write_num('<i', val)
    method write_uint32 (line 106) | def write_uint32(self, val): return self._write_num('<I', val)
    method write_int64 (line 107) | def write_int64(self, val): return self._write_num('<q', val)
    method write_uint64 (line 108) | def write_uint64(self, val): return self._write_num('<Q', val)
    method read_compact_size (line 110) | def read_compact_size(self):
    method write_compact_size (line 124) | def write_compact_size(self, size):
    method _read_num (line 139) | def _read_num(self, format):
    method _write_num (line 147) | def _write_num(self, format, num):
  class EnumException (line 154) | class EnumException(Exception):
  class Enumeration (line 158) | class Enumeration:
    method __init__ (line 159) | def __init__(self, name, enumList):
    method __getattr__ (line 185) | def __getattr__(self, attr):
    method whatis (line 189) | def whatis(self, value):
  function long_hex (line 194) | def long_hex(bytes):
  function short_hex (line 198) | def short_hex(bytes):
  function script_GetOp (line 229) | def script_GetOp(_bytes):
  function script_GetOpName (line 257) | def script_GetOpName(opcode):
  function decode_script (line 261) | def decode_script(bytes):
  function match_decoded (line 273) | def match_decoded(decoded, to_match):
  function parse_sig (line 284) | def parse_sig(x_sig):
  function safe_parse_pubkey (line 287) | def safe_parse_pubkey(x):
  function parse_scriptSig (line 293) | def parse_scriptSig(d, _bytes):
  function parse_redeemScript (line 355) | def parse_redeemScript(s):
  function get_address_from_output_script (line 370) | def get_address_from_output_script(_bytes):
  function parse_input (line 398) | def parse_input(vds):
  function parse_witness (line 426) | def parse_witness(vds, txin):
  function parse_output (line 449) | def parse_output(vds, i):
  function deserialize (line 459) | def deserialize(raw):
  function multisig_script (line 477) | def multisig_script(public_keys, m):
  class Transaction (line 489) | class Transaction:
    method __str__ (line 491) | def __str__(self):
    method __init__ (line 496) | def __init__(self, raw):
    method update (line 510) | def update(self, raw):
    method inputs (line 515) | def inputs(self):
    method outputs (line 520) | def outputs(self):
    method get_sorted_pubkeys (line 526) | def get_sorted_pubkeys(self, txin):
    method update_signatures (line 537) | def update_signatures(self, raw):
    method deserialize (line 566) | def deserialize(self):
    method from_io (line 580) | def from_io(klass, inputs, outputs, locktime=0):
    method pay_script (line 588) | def pay_script(self, output_type, addr):
    method estimate_pubkey_size_from_x_pubkey (line 599) | def estimate_pubkey_size_from_x_pubkey(cls, x_pubkey):
    method estimate_pubkey_size_for_txin (line 614) | def estimate_pubkey_size_for_txin(cls, txin):
    method get_siglist (line 625) | def get_siglist(self, txin, estimate_size=False):
    method serialize_witness (line 648) | def serialize_witness(self, txin, estimate_size=False):
    method is_segwit_input (line 668) | def is_segwit_input(cls, txin):
    method is_segwit_inputtype (line 672) | def is_segwit_inputtype(cls, txin_type):
    method input_script (line 676) | def input_script(self, txin, estimate_size=False):
    method is_txin_complete (line 708) | def is_txin_complete(self, txin):
    method get_preimage_script (line 715) | def get_preimage_script(self, txin):
    method serialize_outpoint (line 733) | def serialize_outpoint(self, txin):
    method serialize_input (line 737) | def serialize_input(self, txin, script):
    method set_rbf (line 746) | def set_rbf(self, rbf):
    method BIP_LI01_sort (line 751) | def BIP_LI01_sort(self):
    method serialize_output (line 756) | def serialize_output(self, output):
    method serialize_preimage (line 764) | def serialize_preimage(self, i):
    method is_segwit (line 790) | def is_segwit(self):
    method serialize (line 793) | def serialize(self, estimate_size=False, witness=True):
    method hash (line 808) | def hash(self):
    method txid (line 812) | def txid(self):
    method wtxid (line 819) | def wtxid(self):
    method add_inputs (line 823) | def add_inputs(self, inputs):
    method add_outputs (line 827) | def add_outputs(self, outputs):
    method input_value (line 831) | def input_value(self):
    method output_value (line 834) | def output_value(self):
    method get_fee (line 837) | def get_fee(self):
    method is_final (line 840) | def is_final(self):
    method estimated_size (line 844) | def estimated_size(self):
    method estimated_input_weight (line 855) | def estimated_input_weight(cls, txin, is_segwit_tx):
    method estimated_output_size (line 869) | def estimated_output_size(cls, address):
    method virtual_size_from_weight (line 876) | def virtual_size_from_weight(cls, weight):
    method estimated_total_size (line 879) | def estimated_total_size(self):
    method estimated_witness_size (line 883) | def estimated_witness_size(self):
    method estimated_base_size (line 893) | def estimated_base_size(self):
    method estimated_weight (line 897) | def estimated_weight(self):
    method signature_count (line 903) | def signature_count(self):
    method is_complete (line 914) | def is_complete(self):
    method sign (line 918) | def sign(self, keypairs):
    method get_outputs (line 946) | def get_outputs(self):
    method get_output_addresses (line 959) | def get_output_addresses(self):
    method has_address (line 963) | def has_address(self, addr):
    method as_dict (line 966) | def as_dict(self):
  function tx_from_str (line 978) | def tx_from_str(txt):

FILE: lib/util.py
  function inv_dict (line 40) | def inv_dict(d):
  function normalize_version (line 50) | def normalize_version(v):
  class NotEnoughFunds (line 53) | class NotEnoughFunds(Exception): pass
  class NoDynamicFeeEstimates (line 56) | class NoDynamicFeeEstimates(Exception):
    method __str__ (line 57) | def __str__(self):
  class InvalidPassword (line 61) | class InvalidPassword(Exception):
    method __str__ (line 62) | def __str__(self):
  class UserCancelled (line 67) | class UserCancelled(Exception):
  class MyEncoder (line 71) | class MyEncoder(json.JSONEncoder):
    method default (line 72) | def default(self, obj):
  class PrintError (line 78) | class PrintError(object):
    method diagnostic_name (line 80) | def diagnostic_name(self):
    method print_error (line 83) | def print_error(self, *msg):
    method print_msg (line 86) | def print_msg(self, *msg):
  class ThreadJob (line 89) | class ThreadJob(PrintError):
    method run (line 94) | def run(self):
  class DebugMem (line 98) | class DebugMem(ThreadJob):
    method __init__ (line 100) | def __init__(self, classes, interval=30):
    method mem_stats (line 105) | def mem_stats(self):
    method run (line 118) | def run(self):
  class DaemonThread (line 123) | class DaemonThread(threading.Thread, PrintError):
    method __init__ (line 126) | def __init__(self):
    method add_jobs (line 134) | def add_jobs(self, jobs):
    method run_jobs (line 138) | def run_jobs(self):
    method remove_jobs (line 149) | def remove_jobs(self, jobs):
    method start (line 154) | def start(self):
    method is_running (line 159) | def is_running(self):
    method stop (line 163) | def stop(self):
    method on_stop (line 167) | def on_stop(self):
  function set_verbosity (line 177) | def set_verbosity(b):
  function print_error (line 182) | def print_error(*args):
  function print_stderr (line 186) | def print_stderr(*args):
  function print_msg (line 191) | def print_msg(*args):
  function json_encode (line 197) | def json_encode(obj):
  function json_decode (line 204) | def json_decode(x):
  function constant_time_compare (line 212) | def constant_time_compare(val1, val2):
  function profiler (line 218) | def profiler(func):
  function android_ext_dir (line 229) | def android_ext_dir():
  function android_data_dir (line 234) | def android_data_dir():
  function android_headers_dir (line 239) | def android_headers_dir():
  function android_check_data_dir (line 245) | def android_check_data_dir():
  function get_headers_dir (line 261) | def get_headers_dir(config):
  function assert_bytes (line 265) | def assert_bytes(*args):
  function assert_str (line 277) | def assert_str(*args):
  function to_string (line 286) | def to_string(x, enc):
  function to_bytes (line 294) | def to_bytes(something, encoding='utf8'):
  function bh2u (line 312) | def bh2u(x):
  function user_dir (line 326) | def user_dir():
  function format_satoshis_plain (line 340) | def format_satoshis_plain(x, decimal_point = 8):
  function format_satoshis (line 347) | def format_satoshis(x, is_diff=False, num_zeros = 0, decimal_point = 8, ...
  function timestamp_to_datetime (line 369) | def timestamp_to_datetime(timestamp):
  function format_time (line 375) | def format_time(timestamp):
  function age (line 381) | def age(from_date, since_date = None, target_tz=None, include_seconds=Fa...
  function time_difference (line 393) | def time_difference(distance_in_time, include_seconds):
  function block_explorer_info (line 449) | def block_explorer_info():
  function block_explorer (line 453) | def block_explorer(config):
  function block_explorer_tuple (line 456) | def block_explorer_tuple(config):
  function block_explorer_URL (line 459) | def block_explorer_URL(config, kind, item):
  function parse_URI (line 473) | def parse_URI(uri, on_pr=None):
  function create_URI (line 542) | def create_URI(addr, amount, message):
  function raw_input (line 558) | def raw_input(prompt=None):
  function parse_json (line 568) | def parse_json(message):
  class timeout (line 580) | class timeout(Exception):
  class SocketPipe (line 589) | class SocketPipe:
    method __init__ (line 590) | def __init__(self, socket):
    method set_timeout (line 596) | def set_timeout(self, t):
    method idle_time (line 599) | def idle_time(self):
    method get (line 602) | def get(self):
    method send (line 632) | def send(self, request):
    method send_all (line 637) | def send_all(self, requests):
    method _send (line 641) | def _send(self, out):
  class QueuePipe (line 656) | class QueuePipe:
    method __init__ (line 658) | def __init__(self, send_queue=None, get_queue=None):
    method get (line 663) | def get(self):
    method get_all (line 669) | def get_all(self):
    method set_timeout (line 679) | def set_timeout(self, t):
    method send (line 682) | def send(self, request):
    method send_all (line 685) | def send_all(self, requests):
  function get_cert_path (line 690) | def get_cert_path():

FILE: lib/verifier.py
  class SPV (line 27) | class SPV(ThreadJob):
    method __init__ (line 30) | def __init__(self, network, wallet):
    method run (line 38) | def run(self):
    method verify_merkle (line 60) | def verify_merkle(self, r):
    method hash_merkle_root (line 83) | def hash_merkle_root(self, merkle_s, target_hash, pos):
    method undo_verifications (line 90) | def undo_verifications(self):

FILE: lib/version.py
  function seed_prefix (line 12) | def seed_prefix(seed_type):

FILE: lib/wallet.py
  function relayfee (line 76) | def relayfee(network):
  function dust_threshold (line 82) | def dust_threshold(network):
  function append_utxos_to_inputs (line 87) | def append_utxos_to_inputs(inputs, network, pubkey, txin_type, imax):
  function sweep_preparations (line 109) | def sweep_preparations(privkeys, network, imax=100):
  function sweep (line 134) | def sweep(privkeys, network, config, recipient, fee=None, imax=100):
  class Abstract_Wallet (line 156) | class Abstract_Wallet(PrintError):
    method __init__ (line 164) | def __init__(self, storage):
    method diagnostic_name (line 213) | def diagnostic_name(self):
    method __str__ (line 216) | def __str__(self):
    method get_master_public_key (line 219) | def get_master_public_key(self):
    method load_transactions (line 223) | def load_transactions(self):
    method save_transactions (line 238) | def save_transactions(self, write=False):
    method clear_history (line 252) | def clear_history(self):
    method build_reverse_history (line 264) | def build_reverse_history(self):
    method check_history (line 273) | def check_history(self):
    method basename (line 291) | def basename(self):
    method save_addresses (line 294) | def save_addresses(self):
    method load_addresses (line 297) | def load_addresses(self):
    method synchronize (line 303) | def synchronize(self):
    method set_up_to_date (line 306) | def set_up_to_date(self, up_to_date):
    method is_up_to_date (line 312) | def is_up_to_date(self):
    method set_label (line 315) | def set_label(self, name, text = None):
    method is_mine (line 334) | def is_mine(self, address):
    method is_change (line 337) | def is_change(self, address):
    method get_address_index (line 342) | def get_address_index(self, address):
    method export_private_key (line 349) | def export_private_key(self, address, password):
    method get_public_keys (line 363) | def get_public_keys(self, address):
    method add_unverified_tx (line 367) | def add_unverified_tx(self, tx_hash, tx_height):
    method add_verified_tx (line 376) | def add_verified_tx(self, tx_hash, info):
    method get_unverified_txs (line 384) | def get_unverified_txs(self):
    method undo_verifications (line 388) | def undo_verifications(self, blockchain, height):
    method get_local_height (line 402) | def get_local_height(self):
    method get_tx_height (line 406) | def get_tx_height(self, tx_hash):
    method get_txpos (line 417) | def get_txpos(self, tx_hash):
    method is_found (line 430) | def is_found(self):
    method get_num_tx (line 433) | def get_num_tx(self, address):
    method get_tx_delta (line 437) | def get_tx_delta(self, tx_hash, address):
    method get_wallet_delta (line 453) | def get_wallet_delta(self, tx):
    method get_tx_info (line 506) | def get_tx_info(self, tx):
    method get_addr_io (line 552) | def get_addr_io(self, address):
    method get_addr_utxo (line 566) | def get_addr_utxo(self, address):
    method get_addr_received (line 586) | def get_addr_received(self, address):
    method get_addr_balance (line 591) | def get_addr_balance(self, address):
    method get_spendable_coins (line 608) | def get_spendable_coins(self, domain, config):
    method get_utxos (line 612) | def get_utxos(self, domain = None, exclude_frozen = False, mature = Fa...
    method dummy_address (line 629) | def dummy_address(self):
    method get_addresses (line 632) | def get_addresses(self):
    method get_frozen_balance (line 638) | def get_frozen_balance(self):
    method get_balance (line 641) | def get_balance(self, domain=None):
    method get_address_history (line 652) | def get_address_history(self, address):
    method find_pay_to_pubkey_address (line 656) | def find_pay_to_pubkey_address(self, prevout_hash, prevout_n):
    method add_transaction (line 664) | def add_transaction(self, tx_hash, tx):
    method remove_transaction (line 717) | def remove_transaction(self, tx_hash):
    method receive_tx_callback (line 744) | def receive_tx_callback(self, tx_hash, tx, tx_height):
    method receive_history_callback (line 748) | def receive_history_callback(self, addr, hist, tx_fees):
    method get_history (line 774) | def get_history(self, domain=None):
    method get_label (line 818) | def get_label(self, tx_hash):
    method get_default_label (line 824) | def get_default_label(self, tx_hash):
    method get_tx_status (line 835) | def get_tx_status(self, tx_hash, height, conf, timestamp):
    method relayfee (line 865) | def relayfee(self):
    method dust_threshold (line 868) | def dust_threshold(self):
    method make_unsigned_transaction (line 871) | def make_unsigned_transaction(self, inputs, outputs, config, fixed_fee...
    method mktx (line 944) | def mktx(self, outputs, password, config, fee=None, change_addr=None, ...
    method is_frozen (line 950) | def is_frozen(self, addr):
    method set_frozen_state (line 953) | def set_frozen_state(self, addrs, freeze):
    method prepare_for_verifier (line 964) | def prepare_for_verifier(self):
    method start_threads (line 979) | def start_threads(self, network):
    method stop_threads (line 990) | def stop_threads(self):
    method wait_until_synchronized (line 1003) | def wait_until_synchronized(self, callback=None):
    method can_export (line 1028) | def can_export(self):
    method is_used (line 1031) | def is_used(self, address):
    method is_empty (line 1036) | def is_empty(self, address):
    method address_is_old (line 1040) | def address_is_old(self, address, age_limit=2):
    method bump_fee (line 1052) | def bump_fee(self, tx, delta):
    method cpfp (line 1091) | def cpfp(self, tx, fee):
    method add_input_info (line 1110) | def add_input_info(self, txin):
    method can_sign (line 1122) | def can_sign(self, tx):
    method get_input_tx (line 1130) | def get_input_tx(self, tx_hash):
    method add_hw_info (line 1140) | def add_hw_info(self, tx):
    method sign_transaction (line 1158) | def sign_transaction(self, tx, password):
    method get_unused_addresses (line 1172) | def get_unused_addresses(self):
    method get_unused_address (line 1178) | def get_unused_address(self):
    method get_receiving_address (line 1183) | def get_receiving_address(self):
    method get_payment_status (line 1197) | def get_payment_status(self, address, amount):
    method get_payment_request (line 1218) | def get_payment_request(self, addr, config):
    method get_request_status (line 1253) | def get_request_status(self, key):
    method make_payment_request (line 1278) | def make_payment_request(self, addr, amount, message, expiration):
    method sign_payment_request (line 1284) | def sign_payment_request(self, key, alias, alias_addr, password):
    method add_payment_request (line 1294) | def add_payment_request(self, req, config):
    method remove_payment_request (line 1321) | def remove_payment_request(self, addr, config):
    method get_sorted_requests (line 1335) | def get_sorted_requests(self, config):
    method get_fingerprint (line 1344) | def get_fingerprint(self):
    method can_import_privkey (line 1347) | def can_import_privkey(self):
    method can_import_address (line 1350) | def can_import_address(self):
    method can_delete_address (line 1353) | def can_delete_address(self):
    method add_address (line 1356) | def add_address(self, address):
    method has_password (line 1362) | def has_password(self):
    method check_password (line 1365) | def check_password(self, password):
    method sign_message (line 1368) | def sign_message(self, address, message, password):
    method decrypt_message (line 1372) | def decrypt_message(self, pubkey, message, password):
  class Simple_Wallet (line 1378) | class Simple_Wallet(Abstract_Wallet):
    method get_keystore (line 1381) | def get_keystore(self):
    method get_keystores (line 1384) | def get_keystores(self):
    method is_watching_only (line 1387) | def is_watching_only(self):
    method can_change_password (line 1390) | def can_change_password(self):
    method update_password (line 1393) | def update_password(self, old_pw, new_pw, encrypt=False):
    method save_keystore (line 1401) | def save_keystore(self):
  class Imported_Wallet (line 1405) | class Imported_Wallet(Simple_Wallet):
    method __init__ (line 1411) | def __init__(self, storage):
    method is_watching_only (line 1414) | def is_watching_only(self):
    method get_keystores (line 1417) | def get_keystores(self):
    method can_import_privkey (line 1420) | def can_import_privkey(self):
    method load_keystore (line 1423) | def load_keystore(self):
    method save_keystore (line 1426) | def save_keystore(self):
    method load_addresses (line 1429) | def load_addresses(self):
    method save_addresses (line 1435) | def save_addresses(self):
    method can_change_password (line 1438) | def can_change_password(self):
    method can_import_address (line 1441) | def can_import_address(self):
    method can_delete_address (line 1444) | def can_delete_address(self):
    method has_seed (line 1447) | def has_seed(self):
    method is_deterministic (line 1450) | def is_deterministic(self):
    method is_change (line 1453) | def is_change(self, address):
    method get_master_public_keys (line 1456) | def get_master_public_keys(self):
    method is_beyond_limit (line 1459) | def is_beyond_limit(self, address, is_change):
    method get_fingerprint (line 1462) | def get_fingerprint(self):
    method get_addresses (line 1465) | def get_addresses(self, include_change=False):
    method get_receiving_addresses (line 1468) | def get_receiving_addresses(self):
    method get_change_addresses (line 1471) | def get_change_addresses(self):
    method import_address (line 1474) | def import_address(self, address):
    method delete_address (line 1485) | def delete_address(self, address):
    method get_address_index (line 1526) | def get_address_index(self, address):
    method get_public_key (line 1529) | def get_public_key(self, address):
    method import_private_key (line 1532) | def import_private_key(self, sec, pw, redeem_script=None):
    method export_private_key (line 1554) | def export_private_key(self, address, password):
    method get_txin_type (line 1561) | def get_txin_type(self, address):
    method add_input_sig_info (line 1564) | def add_input_sig_info(self, txin, address):
    method pubkeys_to_address (line 1583) | def pubkeys_to_address(self, pubkey):
  class Deterministic_Wallet (line 1588) | class Deterministic_Wallet(Abstract_Wallet):
    method __init__ (line 1590) | def __init__(self, storage):
    method has_seed (line 1594) | def has_seed(self):
    method is_deterministic (line 1597) | def is_deterministic(self):
    method get_receiving_addresses (line 1600) | def get_receiving_addresses(self):
    method get_change_addresses (line 1603) | def get_change_addresses(self):
    method get_seed (line 1606) | def get_seed(self, password):
    method add_seed (line 1609) | def add_seed(self, seed, pw):
    method change_gap_limit (line 1612) | def change_gap_limit(self, value):
    method num_unused_trailing_addresses (line 1630) | def num_unused_trailing_addresses(self, addresses):
    method min_acceptable_gap (line 1637) | def min_acceptable_gap(self):
    method create_new_address (line 1651) | def create_new_address(self, for_change=False):
    method synchronize_sequence (line 1662) | def synchronize_sequence(self, for_change):
    method synchronize (line 1674) | def synchronize(self):
    method is_beyond_limit (line 1687) | def is_beyond_limit(self, address, is_change):
    method get_master_public_keys (line 1700) | def get_master_public_keys(self):
    method get_fingerprint (line 1703) | def get_fingerprint(self):
    method get_txin_type (line 1706) | def get_txin_type(self, address):
  class Simple_Deterministic_Wallet (line 1710) | class Simple_Deterministic_Wallet(Simple_Wallet, Deterministic_Wallet):
    method __init__ (line 1714) | def __init__(self, storage):
    method get_public_key (line 1717) | def get_public_key(self, address):
    method load_keystore (line 1722) | def load_keystore(self):
    method get_pubkey (line 1730) | def get_pubkey(self, c, i):
    method get_public_keys (line 1733) | def get_public_keys(self, address):
    method add_input_sig_info (line 1736) | def add_input_sig_info(self, txin, address):
    method get_master_public_key (line 1743) | def get_master_public_key(self):
    method derive_pubkeys (line 1746) | def derive_pubkeys(self, c, i):
  class Standard_Wallet (line 1754) | class Standard_Wallet(Simple_Deterministic_Wallet):
    method pubkeys_to_address (line 1757) | def pubkeys_to_address(self, pubkey):
  class Multisig_Wallet (line 1761) | class Multisig_Wallet(Deterministic_Wallet):
    method __init__ (line 1765) | def __init__(self, storage):
    method get_pubkeys (line 1770) | def get_pubkeys(self, c, i):
    method pubkeys_to_address (line 1773) | def pubkeys_to_address(self, pubkeys):
    method pubkeys_to_redeem_script (line 1777) | def pubkeys_to_redeem_script(self, pubkeys):
    method derive_pubkeys (line 1780) | def derive_pubkeys(self, c, i):
    method load_keystore (line 1783) | def load_keystore(self):
    method save_keystore (line 1792) | def save_keystore(self):
    method get_keystore (line 1796) | def get_keystore(self):
    method get_keystores (line 1799) | def get_keystores(self):
    method update_password (line 1802) | def update_password(self, old_pw, new_pw, encrypt=False):
    method has_seed (line 1812) | def has_seed(self):
    method can_change_password (line 1815) | def can_change_password(self):
    method is_watching_only (line 1818) | def is_watching_only(self):
    method get_master_public_key (line 1821) | def get_master_public_key(self):
    method get_master_public_keys (line 1824) | def get_master_public_keys(self):
    method get_fingerprint (line 1827) | def get_fingerprint(self):
    method add_input_sig_info (line 1830) | def add_input_sig_info(self, txin, address):
  function register_wallet_type (line 1844) | def register_wallet_type(category):
  function register_constructor (line 1854) | def register_constructor(wallet_type, constructor):
  class Wallet (line 1858) | class Wallet(object):
    method __new__ (line 1863) | def __new__(self, storage):
    method wallet_class (line 1878) | def wallet_class(wallet_type):

FILE: lib/websockets.py
  class ElectrumWebSocket (line 38) | class ElectrumWebSocket(WebSocket):
    method handleMessage (line 40) | def handleMessage(self):
    method handleConnected (line 46) | def handleConnected(self):
    method handleClose (line 49) | def handleClose(self):
  class WsClientThread (line 54) | class WsClientThread(util.DaemonThread):
    method __init__ (line 56) | def __init__(self, config, network):
    method make_request (line 63) | def make_request(self, request_id):
    method reading_thread (line 74) | def reading_thread(self):
    method run (line 90) | def run(self):
  class WebSocketServer (line 115) | class WebSocketServer(threading.Thread):
    method __init__ (line 117) | def __init__(self, config, ns):
    method run (line 123) | def run(self):

FILE: lib/x509.py
  class CertificateError (line 64) | class CertificateError(Exception):
  function bitstr_to_bytestr (line 69) | def bitstr_to_bytestr(s):
  function bytestr_to_int (line 75) | def bytestr_to_int(s):
  function decode_OID (line 83) | def decode_OID(s):
  function encode_OID (line 97) | def encode_OID(oid):
  class ASN1_Node (line 109) | class ASN1_Node(bytes):
    method get_node (line 110) | def get_node(self, ix):
    method root (line 124) | def root(self):
    method next_node (line 127) | def next_node(self, node):
    method first_child (line 131) | def first_child(self, node):
    method is_child_of (line 137) | def is_child_of(node1, node2):
    method get_all (line 142) | def get_all(self, node):
    method get_value_of_type (line 147) | def get_value_of_type(self, node, asn1_type):
    method get_value (line 154) | def get_value(self, node):
    method get_children (line 158) | def get_children(self, node):
    method get_sequence (line 167) | def get_sequence(self):
    method get_dict (line 170) | def get_dict(self, node):
  class X509 (line 182) | class X509(object):
    method __init__ (line 183) | def __init__(self, b):
    method get_keyID (line 279) | def get_keyID(self):
    method get_issuer_keyID (line 283) | def get_issuer_keyID(self):
    method get_common_name (line 286) | def get_common_name(self):
    method get_signature (line 289) | def get_signature(self):
    method check_ca (line 292) | def check_ca(self):
    method check_date (line 295) | def check_date(self):
    method getFingerprint (line 306) | def getFingerprint(self):
  function load_certificates (line 311) | def load_certificates(ca_path):

FILE: plugins/audio_modem/qt.py
  class Plugin (line 29) | class Plugin(BasePlugin):
    method __init__ (line 31) | def __init__(self, parent, config, name):
    method is_available (line 39) | def is_available(self):
    method requires_settings (line 42) | def requires_settings(self):
    method settings_widget (line 45) | def settings_widget(self, window):
    method settings_dialog (line 48) | def settings_dialog(self, window):
    method transaction_dialog (line 72) | def transaction_dialog(self, dialog):
    method scan_text_edit (line 83) | def scan_text_edit(self, parent):
    method show_text_edit (line 88) | def show_text_edit(self, parent):
    method _audio_interface (line 94) | def _audio_interface(self):
    method _send (line 98) | def _send(self, parent, blob):
    method _recv (line 112) | def _recv(self, parent):

FILE: plugins/cosigner_pool/qt.py
  class Listener (line 51) | class Listener(util.DaemonThread):
    method __init__ (line 53) | def __init__(self, parent):
    method set_keyhashes (line 60) | def set_keyhashes(self, keyhashes):
    method clear (line 63) | def clear(self, keyhash):
    method run (line 67) | def run(self):
  class QReceiveSignalObject (line 90) | class QReceiveSignalObject(QObject):
  class Plugin (line 94) | class Plugin(BasePlugin):
    method __init__ (line 96) | def __init__(self, parent, config, name):
    method init_qt (line 105) | def init_qt(self, gui):
    method on_new_window (line 110) | def on_new_window(self, window):
    method on_close_window (line 114) | def on_close_window(self, window):
    method is_available (line 117) | def is_available(self):
    method update (line 120) | def update(self, window):
    method transaction_dialog (line 146) | def transaction_dialog(self, d):
    method transaction_dialog_update (line 153) | def transaction_dialog_update(self, d):
    method cosigner_can_sign (line 164) | def cosigner_can_sign(self, tx, cosigner_xpub):
    method do_send (line 174) | def do_send(self, tx):
    method on_receive (line 187) | def on_receive(self, keyhash, message):

FILE: plugins/digitalbitbox/cmdline.py
  class Plugin (line 5) | class Plugin(DigitalBitboxPlugin):
    method init_keystore (line 8) | def init_keystore(self, keystore):

FILE: plugins/digitalbitbox/digitalbitbox.py
  function to_hexstr (line 41) | def to_hexstr(s):
  class DigitalBitbox_Client (line 44) | class DigitalBitbox_Client():
    method __init__ (line 46) | def __init__(self, plugin, hidDevice):
    method close (line 56) | def close(self):
    method timeout (line 65) | def timeout(self, cutoff):
    method label (line 69) | def label(self):
    method is_pairable (line 73) | def is_pairable(self):
    method is_initialized (line 77) | def is_initialized(self):
    method is_paired (line 81) | def is_paired(self):
    method _get_xpub (line 84) | def _get_xpub(self, bip32_path):
    method get_xpub (line 89) | def get_xpub(self, bip32_path, xtype):
    method dbb_has_password (line 105) | def dbb_has_password(self):
    method stretch_key (line 114) | def stretch_key(self, key):
    method backup_password_dialog (line 119) | def backup_password_dialog(self):
    method password_dialog (line 133) | def password_dialog(self, msg):
    method check_device_dialog (line 147) | def check_device_dialog(self):
    method recover_or_erase_dialog (line 192) | def recover_or_erase_dialog(self):
    method seed_device_dialog (line 215) | def seed_device_dialog(self):
    method mobile_pairing_dialog (line 232) | def mobile_pairing_dialog(self):
    method dbb_generate_wallet (line 272) | def dbb_generate_wallet(self):
    method dbb_erase (line 281) | def dbb_erase(self):
    method dbb_load_backup (line 294) | def dbb_load_backup(self, show_msg=True):
    method hid_send_frame (line 318) | def hid_send_frame(self, data):
    method hid_read_frame (line 338) | def hid_read_frame(self):
    method hid_send_plain (line 354) | def hid_send_plain(self, msg):
    method hid_send_encrypt (line 376) | def hid_send_encrypt(self, msg):
  class DigitalBitbox_KeyStore (line 398) | class DigitalBitbox_KeyStore(Hardware_KeyStore):
    method __init__ (line 403) | def __init__(self, d):
    method get_derivation (line 409) | def get_derivation(self):
    method is_p2pkh (line 413) | def is_p2pkh(self):
    method give_error (line 417) | def give_error(self, message, clear_client = False):
    method decrypt_message (line 423) | def decrypt_message(self, pubkey, message, password):
    method sign_message (line 427) | def sign_message(self, sequence, message, password):
    method sign_transaction (line 485) | def sign_transaction(self, tx, password):
  class DigitalBitboxPlugin (line 639) | class DigitalBitboxPlugin(HW_PluginBase):
    method __init__ (line 648) | def __init__(self, parent, config, name):
    method get_dbb_device (line 656) | def get_dbb_device(self, device):
    method create_client (line 662) | def create_client(self, device, handler):
    method setup_device (line 673) | def setup_device(self, device_info, wizard):
    method is_mobile_paired (line 682) | def is_mobile_paired(self):
    method comserver_post_notification (line 686) | def comserver_post_notification(self, payload):
    method get_xpub (line 700) | def get_xpub(self, device_id, derivation, xtype, wizard):
    method get_client (line 711) | def get_client(self, keystore, force_pair=True):

FILE: plugins/digitalbitbox/qt.py
  class Plugin (line 9) | class Plugin(DigitalBitboxPlugin, QtPluginBase):
    method create_handler (line 13) | def create_handler(self, window):
    method receive_menu (line 17) | def receive_menu(self, menu, addrs, wallet):
  class DigitalBitbox_Handler (line 45) | class DigitalBitbox_Handler(QtHandlerBase):
    method __init__ (line 47) | def __init__(self, win):

FILE: plugins/email_requests/qt.py
  class Processor (line 50) | class Processor(threading.Thread):
    method __init__ (line 53) | def __init__(self, imap_server, username, password, callback):
    method poll (line 61) | def poll(self):
    method run (line 80) | def run(self):
    method send (line 89) | def send(self, recipient, message, payment_request):
  class QEmailSignalObject (line 105) | class QEmailSignalObject(QObject):
  class Plugin (line 109) | class Plugin(BasePlugin):
    method fullname (line 111) | def fullname(self):
    method description (line 114) | def description(self):
    method is_available (line 117) | def is_available(self):
    method __init__ (line 120) | def __init__(self, parent, config, name):
    method on_receive (line 131) | def on_receive(self, pr_str):
    method new_invoice (line 136) | def new_invoice(self):
    method receive_list_menu (line 141) | def receive_list_menu(self, menu, addr):
    method send (line 145) | def send(self, window, addr):
    method requires_settings (line 170) | def requires_settings(self):
    method settings_widget (line 173) | def settings_widget(self, window):
    method settings_dialog (line 176) | def settings_dialog(self, window):

FILE: plugins/greenaddress_instant/qt.py
  class Plugin (line 38) | class Plugin(BasePlugin):
    method transaction_dialog (line 43) | def transaction_dialog(self, d):
    method get_my_addr (line 49) | def get_my_addr(self, d):
    method transaction_dialog_update (line 58) | def transaction_dialog_update(self, d):
    method do_verify (line 64) | def do_verify(self, d):

FILE: plugins/hw_wallet/cmdline.py
  class CmdLineHandler (line 3) | class CmdLineHandler:
    method get_passphrase (line 5) | def get_passphrase(self, msg, confirm):
    method get_pin (line 10) | def get_pin(self, msg):
    method prompt_auth (line 17) | def prompt_auth(self, msg):
    method yes_no_question (line 25) | def yes_no_question(self, msg):
    method stop (line 29) | def stop(self):
    method show_message (line 32) | def show_message(self, msg, on_cancel=None):
    method update_status (line 35) | def update_status(self, b):
    method finished (line 38) | def finished(self):

FILE: plugins/hw_wallet/plugin.py
  class HW_PluginBase (line 31) | class HW_PluginBase(BasePlugin):
    method __init__ (line 38) | def __init__(self, parent, config, name):
    method is_enabled (line 43) | def is_enabled(self):
    method device_manager (line 46) | def device_manager(self):
    method close_wallet (line 50) | def close_wallet(self, wallet):

FILE: plugins/hw_wallet/qt.py
  class QtHandlerBase (line 38) | class QtHandlerBase(QObject, PrintError):
    method __init__ (line 51) | def __init__(self, win, device):
    method top_level_window (line 66) | def top_level_window(self):
    method update_status (line 69) | def update_status(self, paired):
    method _update_status (line 72) | def _update_status(self, paired):
    method query_choice (line 77) | def query_choice(self, msg, labels):
    method yes_no_question (line 83) | def yes_no_question(self, msg):
    method show_message (line 89) | def show_message(self, msg, on_cancel=None):
    method show_error (line 92) | def show_error(self, msg):
    method finished (line 95) | def finished(self):
    method get_word (line 98) | def get_word(self, msg):
    method get_passphrase (line 104) | def get_passphrase(self, msg, confirm):
    method passphrase_dialog (line 110) | def passphrase_dialog(self, msg, confirm):
    method word_dialog (line 130) | def word_dialog(self, msg):
    method message_dialog (line 143) | def message_dialog(self, msg, on_cancel):
    method error_dialog (line 156) | def error_dialog(self, msg):
    method clear_dialog (line 159) | def clear_dialog(self):
    method win_query_choice (line 164) | def win_query_choice(self, msg, labels):
    method win_yes_no_question (line 168) | def win_yes_no_question(self, msg):
  class QtPluginBase (line 178) | class QtPluginBase(object):
    method load_wallet (line 181) | def load_wallet(self, wallet, window):
    method choose_device (line 204) | def choose_device(self, window, keystore):
    method show_settings_dialog (line 216) | def show_settings_dialog(self, window, keystore):

FILE: plugins/keepkey/client.py
  class KeepKeyClient (line 4) | class KeepKeyClient(KeepKeyClientBase, ProtocolMixin, BaseClient):
    method __init__ (line 5) | def __init__(self, transport, handler, plugin):
    method recovery_device (line 10) | def recovery_device(self, *args):

FILE: plugins/keepkey/clientbase.py
  class GuiMixin (line 10) | class GuiMixin(object):
    method callback_Failure (line 25) | def callback_Failure(self, msg):
    method callback_ButtonRequest (line 37) | def callback_ButtonRequest(self, msg):
    method callback_PinMatrixRequest (line 44) | def callback_PinMatrixRequest(self, msg):
    method callback_PassphraseRequest (line 57) | def callback_PassphraseRequest(self, req):
    method callback_WordRequest (line 71) | def callback_WordRequest(self, msg):
    method callback_CharacterRequest (line 79) | def callback_CharacterRequest(self, msg):
  class KeepKeyClientBase (line 86) | class KeepKeyClientBase(GuiMixin, PrintError):
    method __init__ (line 88) | def __init__(self, handler, plugin, proto):
    method __str__ (line 99) | def __str__(self):
    method label (line 102) | def label(self):
    method is_initialized (line 106) | def is_initialized(self):
    method is_pairable (line 110) | def is_pairable(self):
    method used (line 113) | def used(self):
    method prevent_timeouts (line 116) | def prevent_timeouts(self):
    method timeout (line 119) | def timeout(self, cutoff):
    method expand_path (line 126) | def expand_path(n):
    method cancel (line 143) | def cancel(self):
    method i4b (line 147) | def i4b(self, x):
    method get_xpub (line 150) | def get_xpub(self, bip32_path, xtype):
    method toggle_passphrase (line 156) | def toggle_passphrase(self):
    method change_label (line 164) | def change_label(self, label):
    method change_homescreen (line 168) | def change_homescreen(self, homescreen):
    method set_pin (line 172) | def set_pin(self, remove):
    method clear_session (line 181) | def clear_session(self):
    method get_public_node (line 193) | def get_public_node(self, address_n, creating):
    method close (line 197) | def close(self):
    method firmware_version (line 204) | def firmware_version(self):
    method atleast_version (line 208) | def atleast_version(self, major, minor=0, patch=0):
    method wrapper (line 212) | def wrapper(func):
    method wrap_methods (line 228) | def wrap_methods(cls):

FILE: plugins/keepkey/cmdline.py
  class Plugin (line 5) | class Plugin(KeepKeyPlugin):
    method init_keystore (line 8) | def init_keystore(self, keystore):

FILE: plugins/keepkey/keepkey.py
  class KeepKey_KeyStore (line 4) | class KeepKey_KeyStore(KeepKeyCompatibleKeyStore):
  class KeepKeyPlugin (line 9) | class KeepKeyPlugin(KeepKeyCompatiblePlugin):
    method __init__ (line 15) | def __init__(self, *args):
    method hid_transport (line 30) | def hid_transport(self, pair):
    method bridge_transport (line 34) | def bridge_transport(self, d):

FILE: plugins/keepkey/plugin.py
  class KeepKeyCompatibleKeyStore (line 21) | class KeepKeyCompatibleKeyStore(Hardware_KeyStore):
    method get_derivation (line 23) | def get_derivation(self):
    method is_segwit (line 26) | def is_segwit(self):
    method get_client (line 29) | def get_client(self, force_pair=True):
    method decrypt_message (line 32) | def decrypt_message(self, sequence, message, password):
    method sign_message (line 35) | def sign_message(self, sequence, message, password):
    method sign_transaction (line 42) | def sign_transaction(self, tx, password):
  class KeepKeyCompatiblePlugin (line 63) | class KeepKeyCompatiblePlugin(HW_PluginBase):
    method __init__ (line 72) | def __init__(self, parent, config, name):
    method _try_hid (line 79) | def _try_hid(self, device):
    method _try_bridge (line 94) | def _try_bridge(self, device):
    method create_client (line 102) | def create_client(self, device, handler):
    method get_client (line 131) | def get_client(self, keystore, force_pair=True):
    method get_coin_name (line 141) | def get_coin_name(self):
    method initialize_device (line 144) | def initialize_device(self, device_id, wizard, handler):
    method _initialize_device (line 170) | def _initialize_device(self, settings, method, device_id, wizard, hand...
    method setup_device (line 197) | def setup_device(self, device_info, wizard):
    method get_xpub (line 211) | def get_xpub(self, device_id, derivation, xtype, wizard):
    method sign_transaction (line 221) | def sign_transaction(self, keystore, tx, prev_tx, xpub_path):
    method show_address (line 231) | def show_address(self, wallet, address):
    method tx_inputs (line 244) | def tx_inputs(self, tx, for_sig=False, segwit=False):
    method tx_outputs (line 307) | def tx_outputs(self, derivation, tx, segwit=False):
    method electrum_tx_to_txtype (line 362) | def electrum_tx_to_txtype(self, tx):
    method get_tx (line 376) | def get_tx(self, tx_hash):

FILE: plugins/keepkey/qt.py
  class Plugin (line 5) | class Plugin(KeepKeyPlugin, QtPlugin):
    method pin_matrix_widget_class (line 10) | def pin_matrix_widget_class(self):

FILE: plugins/keepkey/qt_generic.py
  class CharacterButton (line 41) | class CharacterButton(QPushButton):
    method __init__ (line 42) | def __init__(self, text=None):
    method keyPressEvent (line 45) | def keyPressEvent(self, event):
  class CharacterDialog (line 49) | class CharacterDialog(WindowModalDialog):
    method __init__ (line 51) | def __init__(self, parent):
    method refresh (line 87) | def refresh(self):
    method is_valid_alpha_space (line 97) | def is_valid_alpha_space(self, key):
    method process_key (line 107) | def process_key(self, key):
    method keyPressEvent (line 118) | def keyPressEvent(self, event):
    method get_char (line 123) | def get_char(self, word_pos, character_pos):
  class QtHandler (line 131) | class QtHandler(QtHandlerBase):
    method __init__ (line 136) | def __init__(self, win, pin_matrix_widget_class, device):
    method get_char (line 143) | def get_char(self, msg):
    method get_pin (line 153) | def get_pin(self, msg):
    method pin_dialog (line 159) | def pin_dialog(self, msg):
    method update_character_dialog (line 173) | def update_character_dialog(self, msg):
  class QtPlugin (line 181) | class QtPlugin(QtPluginBase):
    method create_handler (line 186) | def create_handler(self, window):
    method receive_menu (line 190) | def receive_menu(self, menu, addrs, wallet):
    method show_settings_dialog (line 199) | def show_settings_dialog(self, window, keystore):
    method request_trezor_init_settings (line 204) | def request_trezor_init_settings(self, wizard, method, device):
  class SettingsDialog (line 289) | class SettingsDialog(WindowModalDialog):
    method __init__ (line 294) | def __init__(self, window, plugin, keystore, device_id):

FILE: plugins/labels/kivy.py
  class Plugin (line 4) | class Plugin(LabelsPlugin):
    method load_wallet (line 7) | def load_wallet(self, wallet, window):
    method on_pulled (line 11) | def on_pulled(self, wallet):

FILE: plugins/labels/labels.py
  class LabelsPlugin (line 15) | class LabelsPlugin(BasePlugin):
    method __init__ (line 17) | def __init__(self, parent, config, name):
    method encode (line 22) | def encode(self, wallet, msg):
    method decode (line 28) | def decode(self, wallet, message):
    method get_nonce (line 34) | def get_nonce(self, wallet):
    method set_nonce (line 42) | def set_nonce(self, wallet, nonce):
    method set_label (line 47) | def set_label(self, wallet, item, label):
    method do_request (line 65) | def do_request(self, method, url = "/labels", is_batch=False, data=None):
    method push_thread (line 81) | def push_thread(self, wallet):
    method pull_thread (line 97) | def pull_thread(self, wallet, force):
    method start_wallet (line 135) | def start_wallet(self, wallet):
    method stop_wallet (line 151) | def stop_wallet(self, wallet):

FILE: plugins/labels/qt.py
  class QLabelsSignalObject (line 16) | class QLabelsSignalObject(QObject):
  class Plugin (line 20) | class Plugin(LabelsPlugin):
    method __init__ (line 22) | def __init__(self, *args):
    method requires_settings (line 26) | def requires_settings(self):
    method settings_widget (line 29) | def settings_widget(self, window):
    method settings_dialog (line 33) | def settings_dialog(self, window):
    method on_pulled (line 54) | def on_pulled(self, wallet):
    method done_processing (line 57) | def done_processing(self, dialog, result):
    method on_new_window (line 61) | def on_new_window(self, window):
    method on_close_window (line 66) | def on_close_window(self, window):

FILE: plugins/ledger/auth2fa.py
  class LedgerAuthDialog (line 31) | class LedgerAuthDialog(QDialog):
    method __init__ (line 32) | def __init__(self, handler, data):
    method populate_modes (line 158) | def populate_modes(self):
    method update_dlg (line 170) | def update_dlg(self):
    method do_pairing (line 184) | def do_pairing(self):
    method pairing_done (line 200) | def pairing_done(self, data):
    method req_validation (line 209) | def req_validation(self):
    method req_updated (line 217) | def req_updated(self, pin):
    method getDevice2FAMode (line 224) | def getDevice2FAMode(self):
    method closeEvent (line 233) | def closeEvent(self, evnt):
  class LedgerWebSocket (line 241) | class LedgerWebSocket(QThread):
    method __init__ (line 245) | def __init__(self, dlg, pairID, txdata=None):
    method run (line 260) | def run(self):
    method stop (line 263) | def stop(self):
    method on_message (line 268) | def on_message(self, ws, msg):
    method on_error (line 323) | def on_error(self, ws, error):
    method on_close (line 329) | def on_close(self, ws):
    method on_open (line 332) | def on_open(self, ws):
  function debug_msg (line 341) | def debug_msg(*args):

FILE: plugins/ledger/cmdline.py
  class Plugin (line 5) | class Plugin(LedgerPlugin):
    method init_keystore (line 8) | def init_keystore(self, keystore):

FILE: plugins/ledge
Condensed preview — 257 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,034K chars).
[
  {
    "path": ".gitignore",
    "chars": 320,
    "preview": "####-*.patch\n*.pyc\n*.swp\nbuild/\ndist/\n*.egg/\n/electrum.py\n.DS_Store\ncontrib/pyinstaller/\nElectrum_BTCP.egg-info/\ngui/qt/"
  },
  {
    "path": ".idea/electrum.iml",
    "chars": 599,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"PYTHON_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager"
  },
  {
    "path": ".idea/misc.xml",
    "chars": 196,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" project-"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 268,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": ".travis.yml",
    "chars": 275,
    "preview": "sudo: false\nlanguage: python\npython:\n    - 3.5\n    - 3.6\ninstall:\n  - pip install -r requirements_travis.txt\ncache:\n  - "
  },
  {
    "path": "AUTHORS",
    "chars": 496,
    "preview": "ThomasV - Creator and maintainer.\nAnimazing / Tachikoma - Styled the new GUI. Mac version.\nAzelphur - GUI stuff.\nCoblee "
  },
  {
    "path": "Dockerfile",
    "chars": 647,
    "preview": "FROM ubuntu:18.04\n\nENV VERSION 1.0.0\n\nRUN set -x \\\n    && apt-get update \\\n    && apt-get install -y curl \\\n    && curl "
  },
  {
    "path": "Info.plist",
    "chars": 549,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "LICENCE",
    "chars": 1046,
    "preview": "The MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and"
  },
  {
    "path": "MANIFEST.in",
    "chars": 385,
    "preview": "include LICENCE RELEASE-NOTES AUTHORS\ninclude README.rst\ninclude electrum.conf.sample\ninclude electrum.desktop\ninclude *"
  },
  {
    "path": "README.rst",
    "chars": 5543,
    "preview": "BTCP Electrum - Lightweight Bitcoin Private Wallet\n==========================================\n.. image:: https://opencol"
  },
  {
    "path": "RELEASE-NOTES",
    "chars": 33904,
    "preview": "# Release 3.0.5 : (Security update)\n\nThis is a follow-up to the 3.0.4 release, which did not completely fix\nissue #3374."
  },
  {
    "path": "app.fil",
    "chars": 748,
    "preview": "gui/qt/__init__.py\ngui/qt/main_window.py\ngui/qt/history_list.py\ngui/qt/contact_list.py\ngui/qt/invoice_list.py\ngui/qt/req"
  },
  {
    "path": "brewfile",
    "chars": 237,
    "preview": "tap \"caskroom/cask\"\nbrew \"python3\"\nbrew  \"protobuf\"\n# brew \"zbar\" -\nbrew \"gmp\"\n# required by gmpy\nbrew \"gettext\"\ntap \"br"
  },
  {
    "path": "build-docker.sh",
    "chars": 52,
    "preview": "#!/bin/bash\n\ndocker build -t electrum-btcp:latest .\n"
  },
  {
    "path": "clean.sh",
    "chars": 216,
    "preview": "#!/bin/bash\n\nsudo rm -rf build/\nsudo rm -rf dist/\nsudo rm -rf __pycache__\nsudo rm -rf Electrum_BTCP.egg-info\nsudo rm -rf"
  },
  {
    "path": "config",
    "chars": 43,
    "preview": "{\n    \"server\": \"35.224.186.7:50001:t\" \n }\n"
  },
  {
    "path": "contrib/build-wine/README.md",
    "chars": 705,
    "preview": "Windows Binary Builds\n=====================\n\nThese scripts can be used for cross-compilation of Windows Electrum executa"
  },
  {
    "path": "contrib/build-wine/build-electrum-git.sh",
    "chars": 1937,
    "preview": "#!/bin/bash\n\nNAME_ROOT=electrum\nPYTHON_VERSION=3.5.4\n\n# These settings probably don't need any change\nexport WINEPREFIX="
  },
  {
    "path": "contrib/build-wine/build.sh",
    "chars": 574,
    "preview": "#!/bin/bash\n# Lucky number\nexport PYTHONHASHSEED=22\n\nif [ ! -z \"$1\" ]; then\n    to_build=\"$1\"\nfi\n\nhere=$(dirname \"$0\")\n\n"
  },
  {
    "path": "contrib/build-wine/deterministic.spec",
    "chars": 3888,
    "preview": "# -*- mode: python -*-\r\n\r\nfrom PyInstaller.utils.hooks import collect_data_files, collect_submodules\r\n\r\nimport sys\r\nimpo"
  },
  {
    "path": "contrib/build-wine/electrum.nsi",
    "chars": 7323,
    "preview": ";--------------------------------\n;Include Modern UI\n  !include \"TextFunc.nsh\" ;Needed for the $GetSize fuction. I know,"
  },
  {
    "path": "contrib/build-wine/prepare-hw.sh",
    "chars": 668,
    "preview": "#!/bin/bash\n\nTREZOR_GIT_URL=https://github.com/trezor/python-trezor.git\nKEEPKEY_GIT_URL=https://github.com/keepkey/pytho"
  },
  {
    "path": "contrib/build-wine/prepare-pyinstaller.sh",
    "chars": 475,
    "preview": "#!/bin/bash\nPYTHON_VERSION=3.5.4\n\nPYINSTALLER_GIT_URL=https://github.com/ecdsa/pyinstaller.git\nBRANCH=fix_2952\n\nexport W"
  },
  {
    "path": "contrib/build-wine/prepare-wine.sh",
    "chars": 3557,
    "preview": "#!/bin/bash\n\n# Please update these carefully, some versions won't work under Wine\nNSIS_URL=https://prdownloads.sourcefor"
  },
  {
    "path": "contrib/freeze_packages.sh",
    "chars": 444,
    "preview": "#!/bin/bash\n# Run this after a new release to update dependencies\n\nvenv_dir=~/.electrum-venv\ncontrib=$(dirname \"$0\")\n\nwh"
  },
  {
    "path": "contrib/make_apk",
    "chars": 185,
    "preview": "#!/bin/bash\npushd lib\nVERSION=$(python -c \"import version; print version.ELECTRUM_VERSION\")\".0\"\npopd\necho $VERSION\necho "
  },
  {
    "path": "contrib/make_download",
    "chars": 1722,
    "preview": "#!/usr/bin/python2\nimport re\nimport os\n\nfrom versions import version, version_win, version_mac, version_android, version"
  },
  {
    "path": "contrib/make_locale",
    "chars": 2219,
    "preview": "#!/usr/bin/env python3\nimport os\nimport io\nimport zipfile\nimport requests\n\nos.chdir(os.path.dirname(os.path.realpath(__f"
  },
  {
    "path": "contrib/make_packages",
    "chars": 254,
    "preview": "#!/bin/bash\n\ncontrib=$(dirname \"$0\")\n\nwhereis pip3\nif [ $? -ne 0 ] ; then echo \"Install pip3\" ; exit ; fi\n\nrm $contrib/."
  },
  {
    "path": "contrib/requirements.txt",
    "chars": 217,
    "preview": "certifi==2017.11.5\nchardet==3.0.4\ndnspython==1.15.0\necdsa==0.13.3\nidna==2.6\njsonrpclib-pelix==0.3.1\npbkdf2==1.3\nprotobuf"
  },
  {
    "path": "contrib/sign_packages",
    "chars": 331,
    "preview": "#!/usr/bin/python2\n\nimport os\nimport getpass\n\nif __name__ == '__main__':\n\n    os.chdir(\"dist\")\n    password = getpass.ge"
  },
  {
    "path": "create-dmg.sh",
    "chars": 1097,
    "preview": "#!/bin/sh\n\necho \"Cleaning...\"\nsudo sh ./clean.sh\nVERSION=$(python3 -c \"from lib import version; print(version.ELECTRUM_V"
  },
  {
    "path": "docs/release-tests.md",
    "chars": 947,
    "preview": "## BTCP Electrum Wallet\n\n**Tests to perform before each release**\n\n### 1. Connection\n\t1. User can connect for the first "
  },
  {
    "path": "electrum-btcp",
    "chars": 16474,
    "preview": "#!/usr/bin/env python3\n# -*- mode: python -*-\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 thomasv@git"
  },
  {
    "path": "electrum-env",
    "chars": 710,
    "preview": "#!/bin/bash\n#\n# This script creates a virtualenv named 'env' and installs all\n# python dependencies before activating th"
  },
  {
    "path": "electrum.conf.sample",
    "chars": 395,
    "preview": "# Configuration file for the electrum client\n# Settings defined here are shared across wallets\n#\n# copy this file to /et"
  },
  {
    "path": "electrum.desktop",
    "chars": 511,
    "preview": "# If you want electrum to appear in a linux app launcher (\"start menu\"), install this by doing:\n# sudo desktop-file-inst"
  },
  {
    "path": "gui/__init__.py",
    "chars": 278,
    "preview": "# To create a new GUI, please add its code to this directory.\n# Three objects are passed to the ElectrumGui: config, dae"
  },
  {
    "path": "gui/kivy/Makefile",
    "chars": 837,
    "preview": "PYTHON = python3\n\n# needs kivy installed or in PYTHONPATH\n\n.PHONY: theming apk clean\n\ntheming:\n\t$(PYTHON) -m kivy.atlas "
  },
  {
    "path": "gui/kivy/Readme.txt",
    "chars": 762,
    "preview": "Before compiling, create packages: `contrib/make_packages`\n\nCommands::\n\n    `make theming` to make a atlas out of a list"
  },
  {
    "path": "gui/kivy/__init__.py",
    "chars": 2205,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/kivy/data/fonts/tron/License.txt",
    "chars": 333,
    "preview": "Copyright (c) 2010-2011, Jeff Bell [www.randombell.com] | [jeffbell@randombell.com].\nThis font may be distributed freely"
  },
  {
    "path": "gui/kivy/data/fonts/tron/Readme.txt",
    "chars": 1061,
    "preview": "TR2N v1.3\n\nABOUT THE FONT:\nA font based upon the poster text for TRON LEGACY.\n\nThe font is different from the pre-existi"
  },
  {
    "path": "gui/kivy/data/glsl/default.fs",
    "chars": 94,
    "preview": "$HEADER$\nvoid main (void){\n    gl_FragColor = frag_color * texture2D(texture0, tex_coord0);\n}\n"
  },
  {
    "path": "gui/kivy/data/glsl/default.vs",
    "chars": 190,
    "preview": "$HEADER$\nvoid main (void) {\n  frag_color = color * vec4(1.0, 1.0, 1.0, opacity);\n  tex_coord0 = vTexCoords0;\n  gl_Positi"
  },
  {
    "path": "gui/kivy/data/glsl/header.fs",
    "chars": 195,
    "preview": "#ifdef GL_ES\n    precision highp float;\n#endif\n\n/* Outputs from the vertex shader */\nvarying vec4 frag_color;\nvarying ve"
  },
  {
    "path": "gui/kivy/data/glsl/header.vs",
    "chars": 370,
    "preview": "#ifdef GL_ES\n    precision highp float;\n#endif\n\n/* Outputs to the fragment shader */\nvarying vec4 frag_color;\nvarying ve"
  },
  {
    "path": "gui/kivy/data/images/defaulttheme.atlas",
    "chars": 3526,
    "preview": "{\"defaulttheme-0.png\": {\"progressbar_background\": [391, 227, 24, 24], \"tab_btn_disabled\": [264, 137, 32, 32], \"tab_btn_p"
  },
  {
    "path": "gui/kivy/data/java-classes/org/electrum/qr/SimpleScannerActivity.java",
    "chars": 1574,
    "preview": "package org.electrum.qr;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android"
  },
  {
    "path": "gui/kivy/data/style.kv",
    "chars": 25295,
    "preview": "#:kivy 1.0\n\n<Label>:\n    canvas:\n        Color:\n            rgba: self.disabled_color if self.disabled else (self.color "
  },
  {
    "path": "gui/kivy/i18n.py",
    "chars": 1158,
    "preview": "import gettext\n\nclass _(str):\n\n    observers = set()\n    lang = None\n\n    def __new__(cls, s, *args, **kwargs):\n        "
  },
  {
    "path": "gui/kivy/main.kv",
    "chars": 11671,
    "preview": "#:import Clock kivy.clock.Clock\n#:import Window kivy.core.window.Window\n#:import Factory kivy.factory.Factory\n#:import _"
  },
  {
    "path": "gui/kivy/main_window.py",
    "chars": 35211,
    "preview": "import re\nimport os\nimport sys\nimport time\nimport datetime\nimport traceback\nfrom decimal import Decimal\nimport threading"
  },
  {
    "path": "gui/kivy/nfc_scanner/__init__.py",
    "chars": 1230,
    "preview": "__all__ = ('NFCBase', 'NFCScanner')\n\nclass NFCBase(Widget):\n    ''' This is the base Abstract definition class that the "
  },
  {
    "path": "gui/kivy/nfc_scanner/scanner_android.py",
    "chars": 8441,
    "preview": "'''This is the Android implementatoin of NFC Scanning using the\nbuilt in NFC adapter of some android phones.\n'''\n\nfrom k"
  },
  {
    "path": "gui/kivy/nfc_scanner/scanner_dummy.py",
    "chars": 1504,
    "preview": "''' Dummy NFC Provider to be used on desktops in case no other provider is found\n'''\nfrom electrum_gui.kivy.nfc_scanner "
  },
  {
    "path": "gui/kivy/tools/bitcoin_intent.xml",
    "chars": 313,
    "preview": "<intent-filter >\n  <action android:name=\"android.intent.action.VIEW\" />\n  <action android:name=\"android.nfc.action.NDEF_"
  },
  {
    "path": "gui/kivy/tools/blacklist.txt",
    "chars": 1820,
    "preview": "# eggs\n*.egg-info\n\n# unit test\nunittest/*\n\n# python config\nconfig/makesetup\n\n# unused pygame files\npygame/_camera_*\npyga"
  },
  {
    "path": "gui/kivy/tools/buildozer.spec",
    "chars": 5626,
    "preview": "[app]\n\n# (str) Title of your application\ntitle = Electrum\n\n# (str) Package name\npackage.name = Electrum\n\n# (str) Package"
  },
  {
    "path": "gui/kivy/uix/__init__.py",
    "chars": 2,
    "preview": " \n"
  },
  {
    "path": "gui/kivy/uix/combobox.py",
    "chars": 2490,
    "preview": "'''\nComboBox\n=======\n\nBased on Spinner\n'''\n\n__all__ = ('ComboBox', 'ComboBoxOption')\n\nfrom kivy.properties import ListPr"
  },
  {
    "path": "gui/kivy/uix/context_menu.py",
    "chars": 1362,
    "preview": "#!python\n#!/usr/bin/env python\nfrom kivy.app import App\nfrom kivy.uix.bubble import Bubble\nfrom kivy.animation import An"
  },
  {
    "path": "gui/kivy/uix/dialogs/__init__.py",
    "chars": 5902,
    "preview": "from kivy.app import App\nfrom kivy.clock import Clock\nfrom kivy.factory import Factory\nfrom kivy.properties import Numer"
  },
  {
    "path": "gui/kivy/uix/dialogs/amount_dialog.py",
    "chars": 4785,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/bump_fee_dialog.py",
    "chars": 3517,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/checkbox_dialog.py",
    "chars": 1447,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/choice_dialog.py",
    "chars": 2193,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/fee_dialog.py",
    "chars": 3507,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/fx_dialog.py",
    "chars": 3152,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/installwizard.py",
    "chars": 23682,
    "preview": "\nfrom functools import partial\nimport threading\n\nfrom kivy.app import App\nfrom kivy.clock import Clock\nfrom kivy.lang im"
  },
  {
    "path": "gui/kivy/uix/dialogs/label_dialog.py",
    "chars": 1599,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/nfc_transaction.py",
    "chars": 985,
    "preview": "class NFCTransactionDialog(AnimatedPopup):\n\n    mode = OptionProperty('send', options=('send','receive'))\n\n    scanner ="
  },
  {
    "path": "gui/kivy/uix/dialogs/password_dialog.py",
    "chars": 2564,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/qr_dialog.py",
    "chars": 1219,
    "preview": "from kivy.factory import Factory\nfrom kivy.lang import Builder\n\nBuilder.load_string('''\n<QRDialog@Popup>\n    id: popup\n "
  },
  {
    "path": "gui/kivy/uix/dialogs/qr_scanner.py",
    "chars": 1144,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.lang import Builder\n\nFactory.register('QRScanner', m"
  },
  {
    "path": "gui/kivy/uix/dialogs/question.py",
    "chars": 1357,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/seed_options.py",
    "chars": 1438,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/settings.py",
    "chars": 10464,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/tx_dialog.py",
    "chars": 6063,
    "preview": "from kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kivy.lang impo"
  },
  {
    "path": "gui/kivy/uix/dialogs/wallets.py",
    "chars": 1773,
    "preview": "import os\n\nfrom kivy.app import App\nfrom kivy.factory import Factory\nfrom kivy.properties import ObjectProperty\nfrom kiv"
  },
  {
    "path": "gui/kivy/uix/drawer.py",
    "chars": 8462,
    "preview": "'''Drawer Widget to hold the main window and the menu/hidden section that\ncan be swiped in from the left. This Menu woul"
  },
  {
    "path": "gui/kivy/uix/gridview.py",
    "chars": 6337,
    "preview": "from kivy.uix.boxlayout import BoxLayout\nfrom kivy.adapters.dictadapter import DictAdapter\nfrom kivy.adapters.listadapte"
  },
  {
    "path": "gui/kivy/uix/menus.py",
    "chars": 2778,
    "preview": "from functools import partial\n\nfrom kivy.animation import Animation\nfrom kivy.core.window import Window\nfrom kivy.clock "
  },
  {
    "path": "gui/kivy/uix/qrcodewidget.py",
    "chars": 3399,
    "preview": "''' Kivy Widget that accepts data and displays qrcode\n'''\n\nfrom threading import Thread\nfrom functools import partial\n\ni"
  },
  {
    "path": "gui/kivy/uix/screens.py",
    "chars": 22629,
    "preview": "from weakref import ref\nfrom decimal import Decimal\nimport re\nimport datetime\nimport traceback, sys\n\nfrom kivy.app impor"
  },
  {
    "path": "gui/kivy/uix/ui_screens/about.kv",
    "chars": 1719,
    "preview": "#:import VERSION electrum.version.ELECTRUM_VERSION\n\nPopup:\n    title: _(\"About Electrum\")\n    BoxLayout:\n        orienta"
  },
  {
    "path": "gui/kivy/uix/ui_screens/address.kv",
    "chars": 3249,
    "preview": "#:import _ electrum_gui.kivy.i18n._\n#:import Decimal decimal.Decimal\n#:set btc_symbol chr(171)\n#:set mbtc_symbol chr(187"
  },
  {
    "path": "gui/kivy/uix/ui_screens/history.kv",
    "chars": 1865,
    "preview": "#:import _ electrum_gui.kivy.i18n._\n#:import Factory kivy.factory.Factory\n#:set font_light 'gui/kivy/data/fonts/Roboto-C"
  },
  {
    "path": "gui/kivy/uix/ui_screens/invoice.kv",
    "chars": 3245,
    "preview": "#:import Decimal decimal.Decimal\n\n\n\nPopup:\n    id: popup\n    is_invoice: True\n    amount: 0\n    requestor: ''\n    exp: '"
  },
  {
    "path": "gui/kivy/uix/ui_screens/invoices.kv",
    "chars": 1558,
    "preview": "<InvoicesLabel@Label>\n    #color: .305, .309, .309, 1\n    text_size: self.width, None\n    halign: 'left'\n    valign: 'to"
  },
  {
    "path": "gui/kivy/uix/ui_screens/network.kv",
    "chars": 2463,
    "preview": "Popup:\n    id: nd\n    title: _('Network')\n    BoxLayout:\n        orientation: 'vertical'\n        ScrollView:\n           "
  },
  {
    "path": "gui/kivy/uix/ui_screens/proxy.kv",
    "chars": 2681,
    "preview": "Popup:\n    id: nd\n    title: _('Proxy')\n    BoxLayout:\n        orientation: 'vertical'\n        padding: '10dp'\n        s"
  },
  {
    "path": "gui/kivy/uix/ui_screens/receive.kv",
    "chars": 4452,
    "preview": "#:import _ electrum_gui.kivy.i18n._\n#:import Decimal decimal.Decimal\n#:set btc_symbol chr(171)\n#:set mbtc_symbol chr(187"
  },
  {
    "path": "gui/kivy/uix/ui_screens/requests.kv",
    "chars": 1522,
    "preview": "<RequestLabel@Label>\n    #color: .305, .309, .309, 1\n    text_size: self.width, None\n    halign: 'left'\n    valign: 'top"
  },
  {
    "path": "gui/kivy/uix/ui_screens/send.kv",
    "chars": 3870,
    "preview": "#:import _ electrum_gui.kivy.i18n._\n#:import Decimal decimal.Decimal\n#:set btc_symbol chr(171)\n#:set mbtc_symbol chr(187"
  },
  {
    "path": "gui/kivy/uix/ui_screens/server.kv",
    "chars": 2126,
    "preview": "Popup:\n    id: nd\n    title: _('Server')\n    BoxLayout:\n        orientation: 'vertical'\n        padding: '10dp'\n        "
  },
  {
    "path": "gui/kivy/uix/ui_screens/status.kv",
    "chars": 2998,
    "preview": "Popup:\n    title: \"Electrum\"\n    confirmed: 0\n    unconfirmed: 0\n    unmatured: 0\n    watching_only: app.wallet.is_watch"
  },
  {
    "path": "gui/qt/__init__.py",
    "chars": 10119,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/address_dialog.py",
    "chars": 3510,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/address_list.py",
    "chars": 7557,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/amountedit.py",
    "chars": 3652,
    "preview": "# -*- coding: utf-8 -*-\n\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtWidgets import (QLineEdit, QS"
  },
  {
    "path": "gui/qt/console.py",
    "chars": 10166,
    "preview": "\n# source: http://stackoverflow.com/questions/2758159/how-to-embed-a-python-interpreter-in-a-pyqt-widget\n\nimport sys, os"
  },
  {
    "path": "gui/qt/contact_list.py",
    "chars": 4375,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/fee_slider.py",
    "chars": 2792,
    "preview": "\nfrom electrum.i18n import _\n\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtWidgets import QSlider, "
  },
  {
    "path": "gui/qt/history_list.py",
    "chars": 7178,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/installwizard.py",
    "chars": 20899,
    "preview": "\nimport os\nimport sys\nimport threading\nimport traceback\n\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nfrom PyQt5"
  },
  {
    "path": "gui/qt/invoice_list.py",
    "chars": 3785,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/main_window.py",
    "chars": 126883,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/network_dialog.py",
    "chars": 20230,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/password_dialog.py",
    "chars": 7796,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2013 ecdsa@github\n#\n# Permission is here"
  },
  {
    "path": "gui/qt/paytoedit.py",
    "chars": 9797,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/qrcodewidget.py",
    "chars": 3676,
    "preview": "\nfrom PyQt5.QtCore import *\nfrom PyQt5.QtGui import *\nimport PyQt5.QtGui as QtGui\nfrom PyQt5.QtWidgets import (\n    QApp"
  },
  {
    "path": "gui/qt/qrtextedit.py",
    "chars": 2233,
    "preview": "\nfrom electrum.i18n import _\nfrom electrum.plugins import run_hook\nfrom PyQt5.QtGui import *\nfrom PyQt5.QtCore import *\n"
  },
  {
    "path": "gui/qt/qrwindow.py",
    "chars": 3122,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/request_list.py",
    "chars": 5392,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/qt/seed_dialog.py",
    "chars": 7110,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2013 ecdsa@github\n#\n# Permission is here"
  },
  {
    "path": "gui/qt/transaction_dialog.py",
    "chars": 10858,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "gui/qt/util.py",
    "chars": 21104,
    "preview": "import os.path\nimport time\nimport sys\nimport platform\nimport queue\nfrom collections import namedtuple\nfrom functools imp"
  },
  {
    "path": "gui/qt/utxo_list.py",
    "chars": 3211,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "gui/stdio.py",
    "chars": 7603,
    "preview": "from decimal import Decimal\n_ = lambda x:x\n#from i18n import _\nfrom electrum import WalletStorage, Wallet\nfrom electrum."
  },
  {
    "path": "gui/text.py",
    "chars": 18053,
    "preview": "import tty, sys\nimport curses, datetime, locale\nfrom decimal import Decimal\nimport getpass\n\nimport electrum\nfrom electru"
  },
  {
    "path": "icns-from-vector.sh",
    "chars": 792,
    "preview": "# Tool to generate a .iconset from a png\n# (used 400x400 input.png)\n\nmkdir output.iconset\nsips -z 16 16     input.png --"
  },
  {
    "path": "icons.qrc",
    "chars": 1959,
    "preview": "<RCC>\n  <qresource prefix=\"/\" >\n    <file>icons/electrum.png</file>\n    <file>icons/clock1.png</file>\n    <file>icons/cl"
  },
  {
    "path": "lib/__init__.py",
    "chars": 592,
    "preview": "from .version import ELECTRUM_VERSION\nfrom .util import format_satoshis, print_msg, print_error, set_verbosity\nfrom .wal"
  },
  {
    "path": "lib/base_wizard.py",
    "chars": 18725,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2016 Thomas Voegtlin\n#\n# Permission is"
  },
  {
    "path": "lib/bitcoin.py",
    "chars": 34493,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 thomasv@gitorious\n#\n# Permission "
  },
  {
    "path": "lib/blockchain.py",
    "chars": 13220,
    "preview": "# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@ecdsa.org\n#\n# Permission is hereby granted, free of"
  },
  {
    "path": "lib/checkpoints.json",
    "chars": 170,
    "preview": "[\n    [\n        \"000000065093005a1a46ee95d6d66c2b07008220ca64dd3b3a93bbd1945480c0\",\n 14134776517815698497336078495404605"
  },
  {
    "path": "lib/checkpoints_testnet.json",
    "chars": 85838,
    "preview": "[\n    [\n        \"00000000864b744c5025331036aa4a16e9ed1cbb362908c625272150fa059b29\",\n        [\n            0,\n           "
  },
  {
    "path": "lib/coinchooser.py",
    "chars": 15051,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 kyuupichan@gmail\n#\n# Permission is "
  },
  {
    "path": "lib/commands.py",
    "chars": 36015,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "lib/contacts.py",
    "chars": 4110,
    "preview": "# Electrum - Lightweight Bitcoin Client\n# Copyright (c) 2015 Thomas Voegtlin\n#\n# Permission is hereby granted, free of c"
  },
  {
    "path": "lib/currencies.json",
    "chars": 77,
    "preview": "{\n    \"CoinMarketCap\": [\n        \"USD\",\n        \"EUR\",\n        \"CNY\"\n    ]\n}\n"
  },
  {
    "path": "lib/daemon.py",
    "chars": 11374,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/dnssec.py",
    "chars": 10361,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/equihash.py",
    "chars": 10542,
    "preview": "# ZCASH implementation: https://github.com/zcash/zcash/blob/master/qa/rpc-tests/test_framework/equihash.py\nfrom pyblake2"
  },
  {
    "path": "lib/exchange_rate.py",
    "chars": 8668,
    "preview": "from datetime import datetime\nimport inspect\nimport requests\nimport sys\nfrom threading import Thread\nimport time\nimport "
  },
  {
    "path": "lib/i18n.py",
    "chars": 2320,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2012 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "lib/interface.py",
    "chars": 13952,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "lib/jsonrpc.py",
    "chars": 3726,
    "preview": "#!/usr/bin/env python3\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2018 Thomas Voegtlin\n#\n# Permission is "
  },
  {
    "path": "lib/keystore.py",
    "chars": 22844,
    "preview": "#!/usr/bin/env python2\n# -*- mode: python -*-\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2016  The Electr"
  },
  {
    "path": "lib/mnemonic.py",
    "chars": 6672,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/msqr.py",
    "chars": 2371,
    "preview": "# from http://eli.thegreenplace.net/2009/03/07/computing-modular-square-roots-in-python/\n\ndef modular_sqrt(a, p):\n    \"\""
  },
  {
    "path": "lib/network.py",
    "chars": 43504,
    "preview": "# Electrum - Lightweight Bitcoin Client\n# Copyright (c) 2011-2016 Thomas Voegtlin\n#\n# Permission is hereby granted, free"
  },
  {
    "path": "lib/old_mnemonic.py",
    "chars": 17747,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 thomasv@gitorious\n#\n# Permission is"
  },
  {
    "path": "lib/paymentrequest.proto",
    "chars": 2373,
    "preview": "//\n// Simple Bitcoin Payment Protocol messages\n//\n// Use fields 1000+ for extensions;\n// to avoid conflicts, register ex"
  },
  {
    "path": "lib/paymentrequest.py",
    "chars": 17576,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/paymentrequest_pb2.py",
    "chars": 13662,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: paymentrequest.proto\n\nimport sys\n_b=sys.version_inf"
  },
  {
    "path": "lib/pem.py",
    "chars": 6661,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/plot.py",
    "chars": 1759,
    "preview": "from PyQt5.QtGui import *\nfrom electrum.i18n import _\n\n\nimport datetime\nfrom collections import defaultdict\nfrom electru"
  },
  {
    "path": "lib/plugins.py",
    "chars": 19212,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/qrscanner.py",
    "chars": 3166,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/ripemd.py",
    "chars": 14679,
    "preview": "## ripemd.py - pure Python implementation of the RIPEMD-160 algorithm.\r\n## Bjorn Edstrom <be@bjrn.se> 16 december 2007.\r"
  },
  {
    "path": "lib/rsakey.py",
    "chars": 16921,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/segwit_addr.py",
    "chars": 4363,
    "preview": "# Copyright (c) 2017 Pieter Wuille\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of"
  },
  {
    "path": "lib/servers-orig.json",
    "chars": 4874,
    "preview": "{\n    \"E-X.not.fyi\": {\n        \"pruning\": \"-\",\n        \"s\": \"50002\",\n        \"t\": \"50001\",\n        \"version\": \"1.1\"\n    "
  },
  {
    "path": "lib/servers.json",
    "chars": 49,
    "preview": "{\n    \"electrum.btcprivate.org\": {\"s\":\"5222\"}\n}\n\n"
  },
  {
    "path": "lib/servers_testnet.json",
    "chars": 40,
    "preview": "{\n    \"35.190.188.161\": {\"t\":\"50001\"}\n}\n"
  },
  {
    "path": "lib/simple_config.py",
    "chars": 10837,
    "preview": "import json\nimport threading\nimport time\nimport os\nimport stat\n\nfrom copy import deepcopy\nfrom .util import user_dir, pr"
  },
  {
    "path": "lib/storage.py",
    "chars": 19299,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/synchronizer.py",
    "chars": 7974,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/tests/test_bitcoin.py",
    "chars": 20727,
    "preview": "import base64\nimport unittest\nimport sys\nfrom ecdsa.util import number_to_string\n\nfrom lib.bitcoin import (\n    generato"
  },
  {
    "path": "lib/tests/test_interface.py",
    "chars": 1082,
    "preview": "import unittest\n\nfrom lib import interface\n\n\nclass TestInterface(unittest.TestCase):\n\n    def test_match_host_name(self)"
  },
  {
    "path": "lib/tests/test_mnemonic.py",
    "chars": 1519,
    "preview": "import unittest\nfrom lib import keystore\nfrom lib import mnemonic\nfrom lib import old_mnemonic\nfrom lib.util import bh2u"
  },
  {
    "path": "lib/tests/test_simple_config.py",
    "chars": 10715,
    "preview": "import ast\nimport sys\nimport os\nimport unittest\nimport tempfile\nimport shutil\n\nfrom io import StringIO\nfrom lib.simple_c"
  },
  {
    "path": "lib/tests/test_storage_upgrade.py",
    "chars": 159475,
    "preview": "import shutil\nimport tempfile\n\nfrom lib.storage import WalletStorage\nfrom lib.wallet import Wallet\n\nfrom lib.tests.test_"
  },
  {
    "path": "lib/tests/test_transaction.py",
    "chars": 19156,
    "preview": "import unittest\nfrom lib import transaction\nfrom lib.bitcoin import TYPE_ADDRESS\n\nfrom lib.keystore import xpubkey_to_ad"
  },
  {
    "path": "lib/tests/test_util.py",
    "chars": 3553,
    "preview": "import unittest\nfrom lib.util import format_satoshis, parse_URI\n\nclass TestUtil(unittest.TestCase):\n\n    def test_format"
  },
  {
    "path": "lib/tests/test_wallet.py",
    "chars": 1750,
    "preview": "import shutil\nimport tempfile\nimport sys\nimport unittest\nimport os\nimport json\n\nfrom io import StringIO\nfrom lib.storage"
  },
  {
    "path": "lib/tests/test_wallet_vertical.py",
    "chars": 15382,
    "preview": "import unittest\nfrom unittest import mock\n\nimport lib.bitcoin as bitcoin\nimport lib.keystore as keystore\nimport lib.stor"
  },
  {
    "path": "lib/transaction.py",
    "chars": 36638,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/util.py",
    "chars": 21029,
    "preview": "# Electrum - lightweight Bitcoin client\n# Copyright (C) 2011 Thomas Voegtlin\n#\n# Permission is hereby granted, free of c"
  },
  {
    "path": "lib/verifier.py",
    "chars": 4381,
    "preview": "# Electrum - Lightweight Bitcoin Client\n# Copyright (c) 2012 Thomas Voegtlin\n#\n# Permission is hereby granted, free of c"
  },
  {
    "path": "lib/version.py",
    "chars": 530,
    "preview": " # version of the client package\nELECTRUM_VERSION = 'P!1.0.0'\n# protocol version requested\nPROTOCOL_VERSION = '1.1'\n\n# T"
  },
  {
    "path": "lib/wallet.py",
    "chars": 68939,
    "preview": "# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is hereby granted, free of c"
  },
  {
    "path": "lib/websockets.py",
    "chars": 4648,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "lib/wordlist/chinese_simplified.txt",
    "chars": 4096,
    "preview": "的\n一\n是\n在\n不\n了\n有\n和\n人\n这\n中\n大\n为\n上\n个\n国\n我\n以\n要\n他\n时\n来\n用\n们\n生\n到\n作\n地\n于\n出\n就\n分\n对\n成\n会\n可\n主\n发\n年\n动\n同\n工\n也\n能\n下\n过\n子\n说\n产\n种\n面\n而\n方\n后\n多\n定\n行\n学\n法\n所\n"
  },
  {
    "path": "lib/wordlist/english.txt",
    "chars": 13116,
    "preview": "abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacousti"
  },
  {
    "path": "lib/wordlist/japanese.txt",
    "chars": 9461,
    "preview": "あいこくしん\nあいさつ\nあいだ\nあおぞら\nあかちゃん\nあきる\nあけがた\nあける\nあこがれる\nあさい\nあさひ\nあしあと\nあじわう\nあずかる\nあずき\nあそぶ\nあたえる\nあたためる\nあたりまえ\nあたる\nあつい\nあつかう\nあっしゅく\nあつまり\nあつ"
  },
  {
    "path": "lib/wordlist/portuguese.txt",
    "chars": 16350,
    "preview": "# Copyright (c) 2014, The Monero Project\r\n# \r\n# All rights reserved.\r\n# \r\n# Redistribution and use in source and binary "
  },
  {
    "path": "lib/wordlist/spanish.txt",
    "chars": 13322,
    "preview": "ábaco\nabdomen\nabeja\nabierto\nabogado\nabono\naborto\nabrazo\nabrir\nabuelo\nabuso\nacabar\nacademia\nacceso\nacción\naceite\nacelga\na"
  },
  {
    "path": "lib/x509.py",
    "chars": 11418,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "packages.txt",
    "chars": 213,
    "preview": "python3-pip\npython3-setuptools\npython3-dev\npython3-pyqt5\npython3-dnspython\npyqt5-dev-tools\nprotobuf-compiler\npython-requ"
  },
  {
    "path": "plugins/README",
    "chars": 1525,
    "preview": "Plugin rules:\n\n * The plugin system of Electrum is designed to allow the development\n   of new features without increasi"
  },
  {
    "path": "plugins/__init__.py",
    "chars": 1164,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "plugins/audio_modem/__init__.py",
    "chars": 214,
    "preview": "from electrum.i18n import _\n\nfullname =  _('Audio MODEM')\ndescription = _('Provides support for air-gapped transaction s"
  },
  {
    "path": "plugins/audio_modem/qt.py",
    "chars": 4200,
    "preview": "from functools import partial\nimport zlib\nimport json\nfrom io import BytesIO\nimport sys\nimport platform\n\nfrom electrum.p"
  },
  {
    "path": "plugins/cosigner_pool/__init__.py",
    "chars": 380,
    "preview": "from electrum.i18n import _\nfullname = _('Cosigner Pool')\ndescription = ' '.join([\n    _(\"This plugin facilitates the us"
  },
  {
    "path": "plugins/cosigner_pool/qt.py",
    "chars": 7677,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "plugins/digitalbitbox/__init__.py",
    "chars": 241,
    "preview": "from electrum.i18n import _\n\nfullname = 'Digital Bitbox'\ndescription = _('Provides support for Digital Bitbox hardware w"
  },
  {
    "path": "plugins/digitalbitbox/cmdline.py",
    "chars": 353,
    "preview": "from electrum.plugins import hook\nfrom .digitalbitbox import DigitalBitboxPlugin\nfrom ..hw_wallet import CmdLineHandler\n"
  },
  {
    "path": "plugins/digitalbitbox/digitalbitbox.py",
    "chars": 28600,
    "preview": "# ----------------------------------------------------------------------------------\n# Electrum plugin for the Digital B"
  },
  {
    "path": "plugins/digitalbitbox/qt.py",
    "chars": 1516,
    "preview": "from ..hw_wallet.qt import QtHandlerBase, QtPluginBase\nfrom .digitalbitbox import DigitalBitboxPlugin\n\nfrom electrum.i18"
  },
  {
    "path": "plugins/email_requests/__init__.py",
    "chars": 148,
    "preview": "from electrum.i18n import _\n\nfullname = _('Email')\ndescription = _(\"Send and receive payment request with an email accou"
  },
  {
    "path": "plugins/email_requests/qt.py",
    "chars": 7305,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - Lightweight Bitcoin Client\n# Copyright (C) 2015 Thomas Voegtlin\n#\n# Permission is h"
  },
  {
    "path": "plugins/greenaddress_instant/__init__.py",
    "chars": 187,
    "preview": "from electrum.i18n import _\n\nfullname = 'GreenAddress instant'\ndescription = _(\"Allows validating if your transactions h"
  },
  {
    "path": "plugins/greenaddress_instant/qt.py",
    "chars": 4022,
    "preview": "#!/usr/bin/env python\n#\n# Electrum - lightweight Bitcoin client\n# Copyright (C) 2014 Thomas Voegtlin\n#\n# Permission is h"
  }
]

// ... and 57 more files (download for full content)

About this extraction

This page contains the full source code of the BTCPrivate/electrum-btcp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 257 files (1.8 MB), approximately 555.2k tokens, and a symbol index with 2958 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!