Merge branch 'master' of github.com:spesmilo/electrum
This commit is contained in:
commit
73af7ac824
|
@ -1,13 +1,16 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Please update these carefully, some versions won't work under Wine
|
# 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
|
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
|
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
|
LIBUSB_SHA256=acdde63a40b1477898aee6153f9d91d1a2e8a5d93f832ca8ab876498f3a6d2b8
|
||||||
|
|
||||||
PYTHON_VERSION=3.5.4
|
PYTHON_VERSION=3.5.4
|
||||||
|
@ -43,6 +46,13 @@ verify_hash() {
|
||||||
fi
|
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!
|
# Let's begin!
|
||||||
cd `dirname $0`
|
cd `dirname $0`
|
||||||
set -e
|
set -e
|
||||||
|
@ -55,7 +65,6 @@ echo "done"
|
||||||
wine 'wineboot'
|
wine 'wineboot'
|
||||||
|
|
||||||
echo "Cleaning tmp"
|
echo "Cleaning tmp"
|
||||||
rm -rf tmp
|
|
||||||
mkdir -p tmp
|
mkdir -p tmp
|
||||||
echo "done"
|
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
|
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
|
for msifile in core dev exe lib pip tools; do
|
||||||
echo "Installing $msifile..."
|
echo "Installing $msifile..."
|
||||||
wget "https://www.python.org/ftp/python/$PYTHON_VERSION/win32/${msifile}.msi"
|
wget -nc "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.asc"
|
||||||
verify_signature "${msifile}.msi.asc" $KEYRING_PYTHON_DEV
|
verify_signature "${msifile}.msi.asc" $KEYRING_PYTHON_DEV
|
||||||
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/python$PYTHON_VERSION
|
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/python$PYTHON_VERSION
|
||||||
done
|
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
|
$PYTHON -m pip install https://github.com/ecdsa/pyinstaller/archive/fix_2952.zip
|
||||||
|
|
||||||
# Install ZBar
|
# Install ZBar
|
||||||
wget -q -O zbar.exe "$ZBAR_URL"
|
download_if_not_exist $ZBAR_FILENAME "$ZBAR_URL"
|
||||||
verify_hash zbar.exe $ZBAR_SHA256
|
verify_hash $ZBAR_FILENAME "$ZBAR_SHA256"
|
||||||
wine zbar.exe /S
|
wine "$PWD/$ZBAR_FILENAME" /S
|
||||||
|
|
||||||
|
|
||||||
# Upgrade setuptools (so Electrum can be installed later)
|
# Upgrade setuptools (so Electrum can be installed later)
|
||||||
$PYTHON -m pip install setuptools --upgrade
|
$PYTHON -m pip install setuptools --upgrade
|
||||||
|
|
||||||
# Install NSIS installer
|
# Install NSIS installer
|
||||||
wget -q -O nsis.exe "$NSIS_URL"
|
download_if_not_exist $NSIS_FILENAME "$NSIS_URL"
|
||||||
verify_hash nsis.exe $NSIS_SHA256
|
verify_hash $NSIS_FILENAME "$NSIS_SHA256"
|
||||||
wine nsis.exe /S
|
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/
|
cp libusb/MS32/dll/libusb-1.0.dll $WINEPREFIX/drive_c/python$PYTHON_VERSION/
|
||||||
|
|
||||||
# Install UPX
|
# Install UPX
|
||||||
|
|
|
@ -72,9 +72,10 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
|
||||||
fx = self.parent.fx
|
fx = self.parent.fx
|
||||||
if fx and fx.show_history():
|
if fx and fx.show_history():
|
||||||
headers.extend(['%s '%fx.ccy + _('Value')])
|
headers.extend(['%s '%fx.ccy + _('Value')])
|
||||||
|
self.editable_columns |= {6}
|
||||||
|
if fx.get_history_capital_gains_config():
|
||||||
headers.extend(['%s '%fx.ccy + _('Acquisition price')])
|
headers.extend(['%s '%fx.ccy + _('Acquisition price')])
|
||||||
headers.extend(['%s '%fx.ccy + _('Capital Gains')])
|
headers.extend(['%s '%fx.ccy + _('Capital Gains')])
|
||||||
self.editable_columns |= {6}
|
|
||||||
else:
|
else:
|
||||||
self.editable_columns -= {6}
|
self.editable_columns -= {6}
|
||||||
self.update_headers(headers)
|
self.update_headers(headers)
|
||||||
|
|
|
@ -2846,6 +2846,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
|
|
||||||
# Fiat Currency
|
# Fiat Currency
|
||||||
hist_checkbox = QCheckBox()
|
hist_checkbox = QCheckBox()
|
||||||
|
hist_capgains_checkbox = QCheckBox()
|
||||||
fiat_address_checkbox = QCheckBox()
|
fiat_address_checkbox = QCheckBox()
|
||||||
ccy_combo = QComboBox()
|
ccy_combo = QComboBox()
|
||||||
ex_combo = QComboBox()
|
ex_combo = QComboBox()
|
||||||
|
@ -2867,6 +2868,11 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
if not self.fx: return
|
if not self.fx: return
|
||||||
fiat_address_checkbox.setChecked(self.fx.get_fiat_address_config())
|
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():
|
def update_exchanges():
|
||||||
if not self.fx: return
|
if not self.fx: return
|
||||||
b = self.fx.is_enabled()
|
b = self.fx.is_enabled()
|
||||||
|
@ -2905,6 +2911,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
if self.fx.is_enabled() and checked:
|
if self.fx.is_enabled() and checked:
|
||||||
# reset timeout to get historical rates
|
# reset timeout to get historical rates
|
||||||
self.fx.timeout = 0
|
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):
|
def on_fiat_address(checked):
|
||||||
if not self.fx: return
|
if not self.fx: return
|
||||||
|
@ -2914,16 +2926,19 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
|
|
||||||
update_currencies()
|
update_currencies()
|
||||||
update_history_cb()
|
update_history_cb()
|
||||||
|
update_history_capgains_cb()
|
||||||
update_fiat_address_cb()
|
update_fiat_address_cb()
|
||||||
update_exchanges()
|
update_exchanges()
|
||||||
ccy_combo.currentIndexChanged.connect(on_currency)
|
ccy_combo.currentIndexChanged.connect(on_currency)
|
||||||
hist_checkbox.stateChanged.connect(on_history)
|
hist_checkbox.stateChanged.connect(on_history)
|
||||||
|
hist_capgains_checkbox.stateChanged.connect(on_history_capgains)
|
||||||
fiat_address_checkbox.stateChanged.connect(on_fiat_address)
|
fiat_address_checkbox.stateChanged.connect(on_fiat_address)
|
||||||
ex_combo.currentIndexChanged.connect(on_exchange)
|
ex_combo.currentIndexChanged.connect(on_exchange)
|
||||||
|
|
||||||
fiat_widgets = []
|
fiat_widgets = []
|
||||||
fiat_widgets.append((QLabel(_('Fiat currency')), ccy_combo))
|
fiat_widgets.append((QLabel(_('Fiat currency')), ccy_combo))
|
||||||
fiat_widgets.append((QLabel(_('Show history rates')), hist_checkbox))
|
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(_('Show Fiat balance for addresses')), fiat_address_checkbox))
|
||||||
fiat_widgets.append((QLabel(_('Source')), ex_combo))
|
fiat_widgets.append((QLabel(_('Source')), ex_combo))
|
||||||
|
|
||||||
|
|
|
@ -209,6 +209,7 @@ class MessageBoxMixin(object):
|
||||||
d = QMessageBox(icon, title, str(text), buttons, parent)
|
d = QMessageBox(icon, title, str(text), buttons, parent)
|
||||||
d.setWindowModality(Qt.WindowModal)
|
d.setWindowModality(Qt.WindowModal)
|
||||||
d.setDefaultButton(defaultButton)
|
d.setDefaultButton(defaultButton)
|
||||||
|
d.setTextInteractionFlags(Qt.TextSelectableByMouse)
|
||||||
return d.exec_()
|
return d.exec_()
|
||||||
|
|
||||||
class WindowModalDialog(QDialog, MessageBoxMixin):
|
class WindowModalDialog(QDialog, MessageBoxMixin):
|
||||||
|
|
|
@ -451,6 +451,12 @@ class FxThread(ThreadJob):
|
||||||
def set_history_config(self, b):
|
def set_history_config(self, b):
|
||||||
self.config.set_key('history_rates', bool(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):
|
def get_fiat_address_config(self):
|
||||||
return bool(self.config.get('fiat_address'))
|
return bool(self.config.get('fiat_address'))
|
||||||
|
|
||||||
|
|
|
@ -830,16 +830,16 @@ class Abstract_Wallet(PrintError):
|
||||||
prevout_hash = txi['prevout_hash']
|
prevout_hash = txi['prevout_hash']
|
||||||
prevout_n = txi['prevout_n']
|
prevout_n = txi['prevout_n']
|
||||||
ser = prevout_hash + ':%d'%prevout_n
|
ser = prevout_hash + ':%d'%prevout_n
|
||||||
# find value from prev output
|
|
||||||
if addr and self.is_mine(addr):
|
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, {})
|
dd = self.txo.get(prevout_hash, {})
|
||||||
for n, v, is_cb in dd.get(addr, []):
|
for n, v, is_cb in dd.get(addr, []):
|
||||||
if n == prevout_n:
|
if n == prevout_n:
|
||||||
if d.get(addr) is None:
|
if d.get(addr) is None:
|
||||||
d[addr] = []
|
d[addr] = []
|
||||||
d[addr].append((ser, v))
|
d[addr].append((ser, v))
|
||||||
# we only track is_mine spends
|
|
||||||
self.spent_outpoints[ser] = tx_hash
|
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
self.pruned_txo[ser] = tx_hash
|
self.pruned_txo[ser] = tx_hash
|
||||||
|
|
|
@ -55,6 +55,9 @@ class GuiMixin(object):
|
||||||
return self.proto.PinMatrixAck(pin=pin)
|
return self.proto.PinMatrixAck(pin=pin)
|
||||||
|
|
||||||
def callback_PassphraseRequest(self, req):
|
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:
|
if self.creating_wallet:
|
||||||
msg = _("Enter a passphrase to generate this wallet. Each time "
|
msg = _("Enter a passphrase to generate this wallet. Each time "
|
||||||
"you use this wallet your {} will prompt you for the "
|
"you use this wallet your {} will prompt you for the "
|
||||||
|
@ -68,6 +71,9 @@ class GuiMixin(object):
|
||||||
passphrase = bip39_normalize_passphrase(passphrase)
|
passphrase = bip39_normalize_passphrase(passphrase)
|
||||||
return self.proto.PassphraseAck(passphrase=passphrase)
|
return self.proto.PassphraseAck(passphrase=passphrase)
|
||||||
|
|
||||||
|
def callback_PassphraseStateRequest(self, msg):
|
||||||
|
return self.proto.PassphraseStateAck()
|
||||||
|
|
||||||
def callback_WordRequest(self, msg):
|
def callback_WordRequest(self, msg):
|
||||||
self.step += 1
|
self.step += 1
|
||||||
msg = _("Step {}/24. Enter seed word as explained on "
|
msg = _("Step {}/24. Enter seed word as explained on "
|
||||||
|
|
Loading…
Reference in New Issue