electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 73af7ac824fa0f95b9ff37f4c3a32d664ede1ab3
parent 4321950f631a607a782b21f875610ab9d18413ac
Author: ThomasV <thomasv@electrum.org>
Date:   Fri,  2 Mar 2018 09:46:22 +0100

Merge branch 'master' of github.com:spesmilo/electrum

Diffstat:
Mcontrib/build-wine/prepare-wine.sh | 41+++++++++++++++++++++++++----------------
Mgui/qt/history_list.py | 5+++--
Mgui/qt/main_window.py | 15+++++++++++++++
Mgui/qt/util.py | 1+
Mlib/exchange_rate.py | 6++++++
Mlib/wallet.py | 6+++---
Mplugins/trezor/clientbase.py | 6++++++
7 files changed, 59 insertions(+), 21 deletions(-)

diff --git a/contrib/build-wine/prepare-wine.sh b/contrib/build-wine/prepare-wine.sh @@ -1,13 +1,16 @@ #!/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_FILENAME=nsis-3.02.1-setup.exe +NSIS_URL=https://prdownloads.sourceforge.net/nsis/$NSIS_FILENAME?download NSIS_SHA256=736c9062a02e297e335f82252e648a883171c98e0d5120439f538c81d429552e -ZBAR_URL=https://sourceforge.net/projects/zbarw/files/zbarw-20121031-setup.exe/download +ZBAR_FILENAME=zbarw-20121031-setup.exe +ZBAR_URL=https://sourceforge.net/projects/zbarw/files/$ZBAR_FILENAME/download ZBAR_SHA256=177e32b272fa76528a3af486b74e9cb356707be1c5ace4ed3fcee9723e2c2c02 -LIBUSB_URL=https://prdownloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z?download +LIBUSB_FILENAME=libusb-1.0.21.7z +LIBUSB_URL=https://prdownloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/$LIBUSB_FILENAME?download LIBUSB_SHA256=acdde63a40b1477898aee6153f9d91d1a2e8a5d93f832ca8ab876498f3a6d2b8 PYTHON_VERSION=3.5.4 @@ -43,6 +46,13 @@ verify_hash() { fi } +download_if_not_exist() { + local file_name=$1 url=$2 + if [ ! -e $file_name ] ; then + wget -O $PWD/$file_name "$url" + fi +} + # Let's begin! cd `dirname $0` set -e @@ -55,7 +65,6 @@ echo "done" wine 'wineboot' echo "Cleaning tmp" -rm -rf tmp mkdir -p tmp echo "done" @@ -70,8 +79,8 @@ KEYSERVER_PYTHON_DEV="hkp://keys.gnupg.net" gpg --no-default-keyring --keyring $KEYRING_PYTHON_DEV --keyserver $KEYSERVER_PYTHON_DEV --recv-keys $KEYLIST_PYTHON_DEV 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" + wget -nc "https://www.python.org/ftp/python/$PYTHON_VERSION/win32/${msifile}.msi" + wget -nc "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 @@ -91,22 +100,22 @@ $PYTHON -m pip install -r ../../deterministic-build/requirements-binaries.txt $PYTHON -m pip install https://github.com/ecdsa/pyinstaller/archive/fix_2952.zip # Install ZBar -wget -q -O zbar.exe "$ZBAR_URL" -verify_hash zbar.exe $ZBAR_SHA256 -wine zbar.exe /S - +download_if_not_exist $ZBAR_FILENAME "$ZBAR_URL" +verify_hash $ZBAR_FILENAME "$ZBAR_SHA256" +wine "$PWD/$ZBAR_FILENAME" /S # 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 +download_if_not_exist $NSIS_FILENAME "$NSIS_URL" +verify_hash $NSIS_FILENAME "$NSIS_SHA256" +wine "$PWD/$NSIS_FILENAME" /S + +download_if_not_exist $LIBUSB_FILENAME "$LIBUSB_URL" +verify_hash $LIBUSB_FILENAME "$LIBUSB_SHA256" +7z x -olibusb $LIBUSB_FILENAME -aos -wget -q -O libusb.7z "$LIBUSB_URL" -verify_hash libusb.7z "$LIBUSB_SHA256" -7z x -olibusb libusb.7z cp libusb/MS32/dll/libusb-1.0.dll $WINEPREFIX/drive_c/python$PYTHON_VERSION/ # Install UPX diff --git a/gui/qt/history_list.py b/gui/qt/history_list.py @@ -72,9 +72,10 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop): fx = self.parent.fx if fx and fx.show_history(): headers.extend(['%s '%fx.ccy + _('Value')]) - headers.extend(['%s '%fx.ccy + _('Acquisition price')]) - headers.extend(['%s '%fx.ccy + _('Capital Gains')]) self.editable_columns |= {6} + if fx.get_history_capital_gains_config(): + headers.extend(['%s '%fx.ccy + _('Acquisition price')]) + headers.extend(['%s '%fx.ccy + _('Capital Gains')]) else: self.editable_columns -= {6} self.update_headers(headers) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py @@ -2846,6 +2846,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): # Fiat Currency hist_checkbox = QCheckBox() + hist_capgains_checkbox = QCheckBox() fiat_address_checkbox = QCheckBox() ccy_combo = QComboBox() ex_combo = QComboBox() @@ -2867,6 +2868,11 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if not self.fx: return fiat_address_checkbox.setChecked(self.fx.get_fiat_address_config()) + def update_history_capgains_cb(): + if not self.fx: return + hist_capgains_checkbox.setChecked(self.fx.get_history_capital_gains_config()) + hist_capgains_checkbox.setEnabled(hist_checkbox.isChecked()) + def update_exchanges(): if not self.fx: return b = self.fx.is_enabled() @@ -2905,6 +2911,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): if self.fx.is_enabled() and checked: # reset timeout to get historical rates self.fx.timeout = 0 + update_history_capgains_cb() + + def on_history_capgains(checked): + if not self.fx: return + self.fx.set_history_capital_gains_config(checked) + self.history_list.refresh_headers() def on_fiat_address(checked): if not self.fx: return @@ -2914,16 +2926,19 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError): update_currencies() update_history_cb() + update_history_capgains_cb() update_fiat_address_cb() update_exchanges() ccy_combo.currentIndexChanged.connect(on_currency) hist_checkbox.stateChanged.connect(on_history) + hist_capgains_checkbox.stateChanged.connect(on_history_capgains) fiat_address_checkbox.stateChanged.connect(on_fiat_address) ex_combo.currentIndexChanged.connect(on_exchange) fiat_widgets = [] fiat_widgets.append((QLabel(_('Fiat currency')), ccy_combo)) fiat_widgets.append((QLabel(_('Show history rates')), hist_checkbox)) + fiat_widgets.append((QLabel(_('Show capital gains in history')), hist_capgains_checkbox)) fiat_widgets.append((QLabel(_('Show Fiat balance for addresses')), fiat_address_checkbox)) fiat_widgets.append((QLabel(_('Source')), ex_combo)) diff --git a/gui/qt/util.py b/gui/qt/util.py @@ -209,6 +209,7 @@ class MessageBoxMixin(object): d = QMessageBox(icon, title, str(text), buttons, parent) d.setWindowModality(Qt.WindowModal) d.setDefaultButton(defaultButton) + d.setTextInteractionFlags(Qt.TextSelectableByMouse) return d.exec_() class WindowModalDialog(QDialog, MessageBoxMixin): diff --git a/lib/exchange_rate.py b/lib/exchange_rate.py @@ -451,6 +451,12 @@ class FxThread(ThreadJob): def set_history_config(self, b): self.config.set_key('history_rates', bool(b)) + def get_history_capital_gains_config(self): + return bool(self.config.get('history_rates_capital_gains', False)) + + def set_history_capital_gains_config(self, b): + self.config.set_key('history_rates_capital_gains', bool(b)) + def get_fiat_address_config(self): return bool(self.config.get('fiat_address')) diff --git a/lib/wallet.py b/lib/wallet.py @@ -830,16 +830,16 @@ class Abstract_Wallet(PrintError): prevout_hash = txi['prevout_hash'] prevout_n = txi['prevout_n'] ser = prevout_hash + ':%d'%prevout_n - # find value from prev output if addr and self.is_mine(addr): + # we only track is_mine spends + self.spent_outpoints[ser] = tx_hash + # find value from prev output dd = self.txo.get(prevout_hash, {}) for n, v, is_cb in dd.get(addr, []): if n == prevout_n: if d.get(addr) is None: d[addr] = [] d[addr].append((ser, v)) - # we only track is_mine spends - self.spent_outpoints[ser] = tx_hash break else: self.pruned_txo[ser] = tx_hash diff --git a/plugins/trezor/clientbase.py b/plugins/trezor/clientbase.py @@ -55,6 +55,9 @@ class GuiMixin(object): return self.proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, req): + if req and hasattr(req, 'on_device') and req.on_device is True: + return self.proto.PassphraseAck() + if self.creating_wallet: msg = _("Enter a passphrase to generate this wallet. Each time " "you use this wallet your {} will prompt you for the " @@ -68,6 +71,9 @@ class GuiMixin(object): passphrase = bip39_normalize_passphrase(passphrase) return self.proto.PassphraseAck(passphrase=passphrase) + def callback_PassphraseStateRequest(self, msg): + return self.proto.PassphraseStateAck() + def callback_WordRequest(self, msg): self.step += 1 msg = _("Step {}/24. Enter seed word as explained on "